Servus,
Habe an meinem Arduino Due ein Can Shield und ein Ethernet Shield (wobei ich hier nur den SD-Slot verwende) montiert. zusätzlich noch ein Display 20x4 I2C,
Ich möchte die Can Nachrichten und Analogwerte regelmäßig und möglichst schnell auf die SD Karte speichern (zb alle 10ms).
Der Interrupt wird jedoch nicht alle 10ms ausgeführt, sondern manchmal auch schneller.
gibt es da Konflikte mit der SPI CLOCK?
Zuerst schreibe ich die Can-Daten in einen Array(Funktion: ReadCan) Diesen Array dann in einen String (Funktion WriteString) und diesen String dann in ein Textfile auf die SD Karte(Funktion : dataFile.println(DataALL); )
Wie kann ich es schaffen, dass er regelmäßig alle 10ms speichert?
Hier ein Teil meines Codes:
void setup()
{
Serial.begin(115200);
//init für alles....siehe unten
LCD_INIT();
SD_INIT();
CAN_INIT();
//Funktion die einen Ordner erstellt von 1 bis 10. je nachdem was es schon gibt.bei neustart wird die datei in einen neuen ordner gespeichert. so werden keine daten verloren.
//das Verzeichnis auswählt, je nachdem ob schon dateien in einem ordner sind
VerzeichnisWahl();
pinMode(23,INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(23), CLOSEFILE, FALLING);
datalogfilezahl++;
// Serial.println("looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooop");
datalogfile = "";//String in dem der name steht vom txt file. wird am anfang gelöscht und bei alle 10s neu gebildet
datalogfile+= String(StartVerzeichnis);
datalogfile += String("LOG_");
datalogfile += String(datalogfilezahl);
datalogfile += String(".txt");//ich muss jetz noch den string in die zeile sd open einfügen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//Sting kann nich länger als 9 zeichen sein, weil sd open braucht ein char und den gibts nur in 9 zeichen
dataFile = SD.open(datalogfile, FILE_WRITE);//Sd karte wird am anfang geöffnet und alle 10s gechlossen- mehr speed
Serial.print("opened");
if(ED==0)//einmal am anfang wird name und einheit ins file geschrieben
{
DataName = "Time;AccelerationPosition;FrontWheelPressure;GearPosition;RPM;RearWheelSpeed;FrontWheelSpeed;ActualTorque;Analog0;Analog1;Analog2;Analog3;Analog4;Analog5";
DataEinheit="[sec];[%];[BAR];[1];[U/sec];[km/h];[km/h];[Nm];[V];[V];[V];[V];[V];[V]";
dataFile.println(DataName);
dataFile.println(DataEinheit);
ED=1;
}
Timer5.attachInterrupt(SAVING).setFrequency(100).start();
}
void loop()
{
}
//-------------------------------------------------------------------------------------------------------------------END LOOP----------------------------------------------------------------------------------------------------------
void SAVING(void)
{
zahler++;
if(zahler<8)//7mal ausgeführt
{
ReadCAN();
//Serial.println("READcan");
}
else if(zahler<9)
{
WriteString();
//Serial.println("WriteString");
}
else if (zahler==10)
{
dataFile.println(DataALL);
//Serial.println("Write on SD");
zahler=0;
}
}
void CLOSEFILE(void)
{
//Timer3.stop();
dataFile.close();
Timer5.stop();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Verzeichnis:");
lcd.setCursor(0,2);
lcd.print(datalogfile);
}
//______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
void WriteString(void)
{
//Daten aus feld werden in einen String geschrieben,der widerum ins txt file geschrieben wird
DataInfo[0]=micros();//Zeit wird hier gespeichert, sie steht dann am anfang im txt file //vl auch falsche zeit!????????????????
DataALL="";
DataALL+= String(DataInfo[0]);
DataALL += String(";");
DataALL+= String(DataInfo[1]);
DataALL += String(";");
DataALL+= String(DataInfo[2]);
DataALL += String(";");
DataALL+= String(DataInfo[3]);
DataALL += String(";");
DataALL+= String(DataInfo[4]);
DataALL += String(";");
DataALL+= String(DataInfo[5]);
DataALL += String(";");
DataALL+= String(DataInfo[6]);
DataALL += String(";");
DataALL+= String(DataInfo[7]);
DataALL += String(";");
DataALL+= String(DataInfo[8]);
DataALL += String(";");
DataALL+= String(DataInfo[9]);
DataALL += String(";");
DataALL+= String(DataInfo[10]);
DataALL += String(";");
DataALL+= String(DataInfo[11]);
DataALL += String(";");
DataALL+= String(DataInfo[12]);
DataALL += String(";");
DataALL+= String(DataInfo[13]);
}
void ReadCAN(void)
{
if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming
{
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
int canId = CAN.getCanId();
//GEARPOSITION*******************************************************************************************
if(canId==0x540 && buf[0]==2)
{
GearPosition = buf[3] & 0x007;
DataInfo[3]=GearPosition;
//ENGINE-RPM**********************************************************************************************
RPM = buf[1]<<8 | buf[2];
DataInfo[4]=RPM;
}
//ACCELERATIONPOSITION*************************************************************************************
else if(canId==0x120)
{
AccelerationPosition=buf[2];
DataInfo[1]=AccelerationPosition;
}
//FRONTWHEELPREASSURE*************************************************************************************
else if(canId==0x290)
{
unsigned int FWPRead=(((buf[0]<<8 | buf[1])) & 0xFFF0)>>4;
double FWP=FWPRead*0.0625; //!!komma zahl
DataInfo[2]=FWP;
}
//ENG-ACTUAL-TORC*****************************************************************************************************
else if(canId==0x121)
{
unsigned int TorcRead=((buf[0]<<8 | buf[1]));
double Torc=TorcRead*0.2; //!!komma zahl
DataInfo[7]=Torc;
}
//REARWHEELSPEED*****************************************************************************************************
else if(canId==0x12B)
{
unsigned int RWSpeedRead=((buf[2]<<8 | buf[3]));
double RWSpeed=RWSpeedRead*0.05625; //!!komma zahl
unsigned int FWSpeedRead=((buf[0]<<8 | buf[1]));
double FWSpeed=FWSpeedRead*0.05625; //!!komma zahl
DataInfo[5]=RWSpeed;
//FRONTWHEELSPEED*****************************************************************************************************
DataInfo[6]=FWSpeed;
}
//reads analog value and savve it on sd//ANALOG*******************************************************************
}
int i=0;
for (int analogPin = 0; analogPin < 6; analogPin++)
{
int sensor = analogRead(analogPin);
DataInfo[i+8]=sensor;
i++;
}
/*
Analog0 = analogRead(0);
DataInfo[8]=Analog0;
Analog1 = analogRead(1);
DataInfo[9]=Analog1;
Analog2 = analogRead(2);
DataInfo[10]=Analog2;
Analog3 = analogRead(3);
DataInfo[11]=Analog3;
Analog4 = analogRead(4);
DataInfo[12]=Analog4;
Analog5 = analogRead(5);
DataInfo[13]=Analog5;*/
}
Code.txt (14.8 KB)