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.