Hallo,
ich möchte meine Atmega-Firmware per Software, d.h. mittels Watchdog
resetten. Im Prinzip funktioniert das auch, aber manchmal eben auch
nicht.
Hier mein abgespeckter Code:
1 | int main(void)
|
2 | {
|
3 | _delay_ms(100); //watchdog lock-up only if this delay is activated!!!!!!
|
4 | /////////////////////////////////////////////////////////////////////////////////////
|
5 | DDRC = DDRC | 0x3f; //LED outputs
|
6 | DDRB = DDRB & ~1; //PB0 key input
|
7 | long long int counter=-1; //LED counter
|
8 | wdt_enable(WDTO_1S); //set Watchdog Timer
|
9 | /////////////////////////////////////////////////////////////////////////////////////
|
10 | // main loop
|
11 | for(;;){ // main event loop
|
12 | wdt_reset(); //restart watchdog timer
|
13 | PORTC=(PORTC & ~0x3E) | ((counter >> 11) & 0x3E); //LED blinking action
|
14 | char key=PINB & 1;
|
15 | PORTC=(PORTC & ~1) | key; //output to LED, normally high
|
16 | counter--;
|
17 | if (key==0){
|
18 | counter=-1; //LEDs off
|
19 | for(;;){} //init watchdog reset
|
20 | }
|
21 | }
|
22 | }
|
Der Watchdog wird mit einer Taste auf PB0 ausgelöst.
Zur Kontrolle der Funktionalität der Firmware zählt PC1...PC5 runter, da
habe ich LEDs dran, die entsprechend blinken, solange die Firmware
läuft.
Das Verrückte ist, was
ganz am Anfang verursacht.
Ist der auskommentiert, tut der Watchdog genau das, was er soll. Das
Blinken geht nach Auslösen des Watchdog von vorne los.
Hab ich den Delay aktiviert, dann hängt der Watchdog die Firmware auf,
kein Blinken mehr nach Auslösen des Watchdog.
Hat hierfür irgend jemand eine Erklärung?
Ich benutze WinAVR und avr-gcc und flashe über ISP.
Gruß, Thomas