Guten Abend, ich brauche mal wieder Eure Hilfe. Ich möchte mit dem XMC4500 von Infineon Daten zyklisch auf eine SD Card in einer txt-Datei ablegen. Das Dattenlogging soll nur aktiv sein, wenn ein Taster betätigt wurde, bei erneuter Betätigung soll das Datenlogging beendet werden. Das Ganze funktioniert auch schonmal ganz gut. Beende ich das Datenlogging und nehme die Karte raus und schiebe sie anschließend wieder in den Kartenslot. Starte ich das Datenlogging nun (Betätigung des Tasters) wieder gibt er einen Fehler (FR_DISK_ERR) bei dem Befehl f_open aus. (Während des gesamten Vorgangs ist der µC aktiv und arbeitet das Programm ab). Vielleicht hat jemand aus dem Forum eine Ahnung woran es liegt. Für Hilfe wäre ich sehr Dankbar. Der Quellcode: #include <DAVE.h> #include <stdio.h> FATFS fso; /* File system object (volume work area) */ FIL fil; /* File object */ int flag=0; int var=1; int main(void) { DAVE_STATUS_t status; status = DAVE_Init(); /* API result code */ FRESULT res; FRESULT resopen; FRESULT resclose; UINT bw; /* Bytes written */ char buffer [150]; float werte[10]={1.111,2.222,3.333,4.444,5.555,6.666,7.777,8.888,9.999,10.101} ; uint32_t pin_status; TIMER_STATUS_t timer_status; while(1U) { if(var == 0) { /* Register work area */ res = f_mount(&fso, "", 0); if (res == FR_OK) { /* Create a file as new */ resopen = f_open(&fil, "werte.txt", FA_OPEN_ALWAYS | FA_WRITE); if ((resopen == FR_OK) || (resopen == FR_EXIST)) { /*Starten des Timers*/ timer_status = TIMER_Start(&TIMER_0); while(var==0) { if(flag==1){ sprintf(buffer, "%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;\r\n", werte[0],werte[1],werte[2],werte[3],werte[4],werte[5],werte[6],werte[7], werte[8],werte[9]); res = f_write(&fil, buffer, strlen(buffer), &bw); //f_sync(&fil); flag=0; } } timer_status = TIMER_Stop(&TIMER_0); resclose=f_close(&fil); res = f_mount(NULL, "", 0); }//if .txt angelegt }// }// Ende if var==0 else { } }//Ende while }//Ende main void TimerIRQHandler(void)//Zyklisches Aufruf durch Timer { flag=1; } void UserIRQHandler1(void)//Aufruf bei Taster-Betätigung { var ^= 1;//toggeln if(var==0){ DIGITAL_IO_SetOutputHigh(&DIGITAL_IO_1); } else{ DIGITAL_IO_SetOutputLow(&DIGITAL_IO_1); } }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.