Hallo Leute,
ich habe da ein Problem mit einer Steuerung beim Dauertest (TÜV)
Die Steuerung wurde in ihrer Funktion über 200.000 x getestet ohne auch nur einen Fehler.
Jetzt habe ich wahrscheinlich ein Fehler gemacht und alle Kontakte und Meldungen wurden auf der SD-Card geloggt. Und wahrscheinlich habe ich damit die max. Anzahl der Schreibzyklen durch den Dauertest erreicht.
Danach wurde die Steuerung in die Klimakammer gesteckt -20 C bis +50 C und rlt. Luftfeuchte 95%.
Aus irgendeinen Grund ist die Steuerung dabei in den FirmwareFlash Modus gegangen, das erledige ich mit dieser Funktion
Mein Bootloader Ausschnitt:
procedure CheckError;
begin
if BootErr = bootNoErr then OutStr:= '00 no Error'; // Keine Fehler alles OK
elsif BootErr = bootInvCardType then OutStr:= '01 inv.Card Type'; // Falscher SD-Card Typ
elsif BootErr = bootInvBootType then OutStr:= '02 inv. Boot Type';
elsif BootErr = bootReadFail then OutStr:= '03 read Fail'; // Lesefehler
elsif BootErr = bootClusterNotfound then OutStr:= '04 Cluster not Found';// Cluster Fehler evtl. defekte Firmwaredatei oder SDCard
elsif BootErr = bootFalseID then OutStr:= '05 wrong ID'; // Falsche LoaderID
elsif BootErr = bootFalseCPU then OutStr:= '06 wrong CPU'; // Firmware nicht für diese CPU geeignet
elsif BootErr = bootAESerr then OutStr:= '07 AES Error'; // AES entschlüsselungsfehler
endif;
PrintString('ERR:'+OutStr,4,1); // LCD-Ausgabe Fehler
loop
// gehe in Wartestellung und mache nichts weiter
endloop;
end CheckError;
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
// Optional a port pin can be checked for a forced download
// If Pin.x = false then skip the EEprom checks
// ...
Debug_Break;
if EEprom[EEpromEnd] = $00 then
// If a Download failed or the app was never programmed then there is no $00
// If the main app forces a download then the last byte in the EEprom must be $FF
Application_Startup;
endif;
Debug_Break;
// Nur Init, wenn der Flash gemacht werden soll..
// InitPort
WDOff; // Schalte WD OFF !!!
//HxDispData
DDRE.2:= 1; // 0=EINGANG 1=Ausgang
I2CInit;
// Ziehe Pointer für CHARS
ptrLoadChars := @gLoadChars;
// LCD aktivieren
LCDInit;
//Start-Meldung
PrintString('Bootloader V1.01',1,1);
// mDelay(10000);
// at first check the Card detect switch, if present!
// if ...
// Initialize the MMC and check for a valid FAT16 file system
if not FATInit then
// big problem !!
CheckError;
endif;
{$IfDef FAT_bootModeAES}
AES_Init(@DecryptKey); // necessary if AES encryption is used
{$endif}
PrintString('Flash Firmware...',3,1); // Ausgabe LCD-Display
if not UpdateFirmware($xxxx) then // BootLoader ID
// es gab einen Fehler
CheckError;
endif;
loop
// Downloader does an exit to the main app if
// a valid main has been downloaded
// so normally it will not enter here
endloop;
In dem Code prüfe ich auf "EEprom[EEpromEnd] = $00" und wenn das 00 ist, startet er die MainApp.
Hier scheint es aber so zu sein, als ob aus irgendeinen Grund die Steuerung von alleine kein 00 mehr dort stehen hat. Denn nach einem Neustart hat er nicht mehr die "Application_Startup;" durchgeführt.
Er wollte nun ein Firmware-Flash durchführen, da aber die SD-Card wahrscheinlich den Geist aufgegeben hat,
wurde die Routine:
ausgeführt und es gab einen Initfehler. Nun hängt die Steuerung da fest, was nun leider sehr ärgerlich ist, die Steuerung muß nun erneut in die Klimakammer
Im Checkerror
Zeigt das Display nun "00 no Error" an,da es ja keinen BootErr gab, das werde ich nun etwas anpassen. Kurze Anzeige, das es einen InitFehler gab und dann automatisch "Application_Startup;" ausführen. Damit er dabei nicht mehr hängen bleibt.
Weiterhin werde ich das ganze ändern, es muss eine bestimmte Zahl im EEPROM stehen, damit der Flash Ausgeführt wird.
Hat Jemand von euch eine Idee, warum sich dieser EEPROM Bereich von alleine geändert hat?
Der Temperaturbereich kann es doch nicht sein oder?
Thorsten
ich habe da ein Problem mit einer Steuerung beim Dauertest (TÜV)
Die Steuerung wurde in ihrer Funktion über 200.000 x getestet ohne auch nur einen Fehler.
Jetzt habe ich wahrscheinlich ein Fehler gemacht und alle Kontakte und Meldungen wurden auf der SD-Card geloggt. Und wahrscheinlich habe ich damit die max. Anzahl der Schreibzyklen durch den Dauertest erreicht.
Danach wurde die Steuerung in die Klimakammer gesteckt -20 C bis +50 C und rlt. Luftfeuchte 95%.
Aus irgendeinen Grund ist die Steuerung dabei in den FirmwareFlash Modus gegangen, das erledige ich mit dieser Funktion
Code
//---------------------------------------------------------------
// Flash einleiten
procedure StartFlash;
begin
mDelay(300);
F16_FlushBufSec; // Sichere offene Dateien
//F16_SDIO_Idle; // Schalte die MicroSD auf IDLE
USB_Detach; // USB Abmelden
EEprom[EEpromEnd]:= $FF; // invalidate application for Boot usage
mDelay(800);
WDoff; // Watchdog abschalten
HardWareReset; // Reset ausführen und Sprung in den BOOTBEREICH
end StartFlash;
// Flash einleiten
procedure StartFlash;
begin
mDelay(300);
F16_FlushBufSec; // Sichere offene Dateien
//F16_SDIO_Idle; // Schalte die MicroSD auf IDLE
USB_Detach; // USB Abmelden
EEprom[EEpromEnd]:= $FF; // invalidate application for Boot usage
mDelay(800);
WDoff; // Watchdog abschalten
HardWareReset; // Reset ausführen und Sprung in den BOOTBEREICH
end StartFlash;
Mein Bootloader Ausschnitt:
Code
procedure CheckError;
begin
if BootErr = bootNoErr then OutStr:= '00 no Error'; // Keine Fehler alles OK
elsif BootErr = bootInvCardType then OutStr:= '01 inv.Card Type'; // Falscher SD-Card Typ
elsif BootErr = bootInvBootType then OutStr:= '02 inv. Boot Type';
elsif BootErr = bootReadFail then OutStr:= '03 read Fail'; // Lesefehler
elsif BootErr = bootClusterNotfound then OutStr:= '04 Cluster not Found';// Cluster Fehler evtl. defekte Firmwaredatei oder SDCard
elsif BootErr = bootFalseID then OutStr:= '05 wrong ID'; // Falsche LoaderID
elsif BootErr = bootFalseCPU then OutStr:= '06 wrong CPU'; // Firmware nicht für diese CPU geeignet
elsif BootErr = bootAESerr then OutStr:= '07 AES Error'; // AES entschlüsselungsfehler
endif;
PrintString('ERR:'+OutStr,4,1); // LCD-Ausgabe Fehler
loop
// gehe in Wartestellung und mache nichts weiter
endloop;
end CheckError;
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
// Optional a port pin can be checked for a forced download
// If Pin.x = false then skip the EEprom checks
// ...
Debug_Break;
if EEprom[EEpromEnd] = $00 then
// If a Download failed or the app was never programmed then there is no $00
// If the main app forces a download then the last byte in the EEprom must be $FF
Application_Startup;
endif;
Debug_Break;
// Nur Init, wenn der Flash gemacht werden soll..
// InitPort
WDOff; // Schalte WD OFF !!!
//HxDispData
DDRE.2:= 1; // 0=EINGANG 1=Ausgang
I2CInit;
// Ziehe Pointer für CHARS
ptrLoadChars := @gLoadChars;
// LCD aktivieren
LCDInit;
//Start-Meldung
PrintString('Bootloader V1.01',1,1);
// mDelay(10000);
// at first check the Card detect switch, if present!
// if ...
// Initialize the MMC and check for a valid FAT16 file system
if not FATInit then
// big problem !!
CheckError;
endif;
{$IfDef FAT_bootModeAES}
AES_Init(@DecryptKey); // necessary if AES encryption is used
{$endif}
PrintString('Flash Firmware...',3,1); // Ausgabe LCD-Display
if not UpdateFirmware($xxxx) then // BootLoader ID
// es gab einen Fehler
CheckError;
endif;
loop
// Downloader does an exit to the main app if
// a valid main has been downloaded
// so normally it will not enter here
endloop;
In dem Code prüfe ich auf "EEprom[EEpromEnd] = $00" und wenn das 00 ist, startet er die MainApp.
Hier scheint es aber so zu sein, als ob aus irgendeinen Grund die Steuerung von alleine kein 00 mehr dort stehen hat. Denn nach einem Neustart hat er nicht mehr die "Application_Startup;" durchgeführt.
Er wollte nun ein Firmware-Flash durchführen, da aber die SD-Card wahrscheinlich den Geist aufgegeben hat,
wurde die Routine:
Code
// Initialize the MMC and check for a valid FAT16 file system
if not FATInit then
// big problem !!
CheckError;
endif;
if not FATInit then
// big problem !!
CheckError;
endif;
ausgeführt und es gab einen Initfehler. Nun hängt die Steuerung da fest, was nun leider sehr ärgerlich ist, die Steuerung muß nun erneut in die Klimakammer
Im Checkerror
Code
procedure CheckError;
begin
if BootErr = bootNoErr then OutStr:= '00 no Error'; // Keine Fehler alles OK
elsif BootErr = bootInvCardType then OutStr:= '01 inv.Card Type'; // Falscher SD-Card Typ
elsif BootErr = bootInvBootType then OutStr:= '02 inv. Boot Type';
elsif BootErr = bootReadFail then OutStr:= '03 read Fail'; // Lesefehler
elsif BootErr = bootClusterNotfound then OutStr:= '04 Cluster not Found';// Cluster Fehler evtl. defekte Firmwaredatei oder SDCard
elsif BootErr = bootFalseID then OutStr:= '05 wrong ID'; // Falsche LoaderID
elsif BootErr = bootFalseCPU then OutStr:= '06 wrong CPU'; // Firmware nicht für diese CPU geeignet
elsif BootErr = bootAESerr then OutStr:= '07 AES Error'; // AES entschlüsselungsfehler
endif;
PrintString('ERR:'+OutStr,4,1); // LCD-Ausgabe Fehler
loop
// gehe in Wartestellung und mache nichts weiter
endloop;
end CheckError;
begin
if BootErr = bootNoErr then OutStr:= '00 no Error'; // Keine Fehler alles OK
elsif BootErr = bootInvCardType then OutStr:= '01 inv.Card Type'; // Falscher SD-Card Typ
elsif BootErr = bootInvBootType then OutStr:= '02 inv. Boot Type';
elsif BootErr = bootReadFail then OutStr:= '03 read Fail'; // Lesefehler
elsif BootErr = bootClusterNotfound then OutStr:= '04 Cluster not Found';// Cluster Fehler evtl. defekte Firmwaredatei oder SDCard
elsif BootErr = bootFalseID then OutStr:= '05 wrong ID'; // Falsche LoaderID
elsif BootErr = bootFalseCPU then OutStr:= '06 wrong CPU'; // Firmware nicht für diese CPU geeignet
elsif BootErr = bootAESerr then OutStr:= '07 AES Error'; // AES entschlüsselungsfehler
endif;
PrintString('ERR:'+OutStr,4,1); // LCD-Ausgabe Fehler
loop
// gehe in Wartestellung und mache nichts weiter
endloop;
end CheckError;
Zeigt das Display nun "00 no Error" an,da es ja keinen BootErr gab, das werde ich nun etwas anpassen. Kurze Anzeige, das es einen InitFehler gab und dann automatisch "Application_Startup;" ausführen. Damit er dabei nicht mehr hängen bleibt.
Weiterhin werde ich das ganze ändern, es muss eine bestimmte Zahl im EEPROM stehen, damit der Flash Ausgeführt wird.
Hat Jemand von euch eine Idee, warum sich dieser EEPROM Bereich von alleine geändert hat?
Der Temperaturbereich kann es doch nicht sein oder?
Thorsten