Hallo !
Habe folgendes Problem: Der Microcontroller soll einen Watchdogreset
auslösen, sobald Port C Pin 6 auf low liegt. Das klappt soweit auch,
doch leider nur das eine mal. Nach dem Reset kommt es mir vor, als ob
der uC irgendwie im Wald steht. An Pin 1 von Port B erkenne ich, ob der
Reset stattgefunden hat oder nicht. Alles variablen, die ich benutze
werden initialisiert. Fuses habe ich angehängt.
Habe leider keine Idee mehr, jemand von euch ?
Achso: Springen zu Adresse 0x0000 klappt ebenso wenig und führt auch zum
Absturz!
Funktionen:
void initWatchdog()
{
cli();
wdt_reset();
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = (1<<WDE) | (1<<WDP1);
sei();
}
void disableWatchdog()
{
cli();
wdt_reset();
MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 0x00;
}
------------------------------------------------------------------------
---
Endlosschleife:
...
disableWatchdog();
sbi(PORTB, 1);
while(1)
{
if(bit_is_clear(PINC, 6) !=0)
{
cbi(PORTB, 1);
initWatchdog();
while(bit_is_clear(PINC, 6) !=0)
{
wdt_reset();
}
while(1);
}
}
Falls jemdand einen funktionierenden Code mit Watchdog für den AtMega168 hat, wäre mir damit wahrscheinlich auch schon geholfen !
Das kenn ich, der WDT schlägt erneut zu. Er muß so früh wie möglich deaktiviert werden. Schau mal in der avr-libc Doku unter <avr/wdt.h> nach.
Gast
#1783530
Ok...werde ich morgen mal nachschauen, kann ich mir aber kaum vorstellen, da ich ihn ja als allererstes im Programm deaktiviere. Aber ein Ansatzpunkt ist es natürlich. Es würde allerdings nicht erklären, warum Sprung zu 0x0000 auch nicht funktioniert !
Gast
#1783536
Nutze jetzt auch die original Funktionen der wdt.h , leider auch ohne Besserung !
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
