ATmega644: watchdog reset galen [Löst]
Postat: 26 februari 2012, 10:48:20
Jag försöker aktivera Watchdog Timern i ATmega644, men lyckas inte få det att fungera riktigt.
har suttit ett antal timmar och börjar tröttna nu
ATmega644 datablad
(9.4 Watchdog Timer : sidan 49)
Jag har provat både att skriva/läsa direkt till/från Watchdog-registren ( MCUSR, WDTCS) och att använda <avr/wdt.h> biblioteket med funktionerna wdt_enable(WDTO_4S); wdt_disable(); och wdt_reset(); men det blir fel hur jag än gör.
Jag kan aktivera wdt i början av programmet på normalt vis genom wdt_enable(WDTO_4S).
Detta fungerar bra och jag får en systemreset efter 4 sekunder om jag inte kör wdt_reset(); med jämna mellanrum.
Problemet uppstår efter reset!
Processorn startar då upp bootloadern, och efter ett reset så är wdt fortfarade aktiv men timeout sätts till till 16ms istället för 4 sek (precis som den skall enligt databladet).
Jag måste alltså inom 16 ms göra antingen:
a) göra wdt_reset(); oftare än 16 ms intervaller
b) programmera om wdt så att den resetar efter 4 sekunder
c) avaktivera wdt under tiden som bootloadern är aktiv.
Ingen av dessa tre alternativ har jag lyckats med. Jag kan konstatera att bootloadern hinner starta och köra hela initieringen innan 16 ms då det startas om igen. En gul LED ska tändas när bootloadern är redo, men den blinkar vilt. (har funderat på att mäta tiden med oscilloskop för att få en uppfattning om hur långt den hinner).
Det alternativ jag önskar använda är främst (b) - och låta bootloadern återställa wdt minst varje sekund.
I andra hand, om det skiter sig, vill jag kunna stänga av bootloadern helt (c)
Att göra wdt_reset oftare än 16 ms vill jag helst inte då det är en massa grejer både i bootloadern och senare även i applikationen som kräver längre tider.
Huvudproblemet är enkelt: hur sjutton får jag wdt att räkna till 4 sek istället för 16 ms. Av någon outgrundlig anledning verkar det som om den är helt opåverkbar.
När wdt väl börjat resetta så hjälper ingen hårdvarureset - det enda som återställer wdt så att programmet fungerar igen är en power off.
Jag har inte programmerat WDTON (en 'fuse' som gör det omöjligt att stänga av eller ändra i wdt).
(Ska iväg på släktträff idag, så hinner inte svara på ett tag, men uppskattar om jag har fått något att bita i när jag är tillbaks
)
EDIT: En sak jag ska testa när jag är tillbaks är att avaktivera bootloadern helt (dvs MCU resettar till 0x0000) för att se hur wdt fungerar med enbart applikationen.
EDIT: Vad jag gör är helt enkelt:
eller
har suttit ett antal timmar och börjar tröttna nu

ATmega644 datablad
(9.4 Watchdog Timer : sidan 49)
Jag har provat både att skriva/läsa direkt till/från Watchdog-registren ( MCUSR, WDTCS) och att använda <avr/wdt.h> biblioteket med funktionerna wdt_enable(WDTO_4S); wdt_disable(); och wdt_reset(); men det blir fel hur jag än gör.
Jag kan aktivera wdt i början av programmet på normalt vis genom wdt_enable(WDTO_4S).
Detta fungerar bra och jag får en systemreset efter 4 sekunder om jag inte kör wdt_reset(); med jämna mellanrum.
Problemet uppstår efter reset!
Processorn startar då upp bootloadern, och efter ett reset så är wdt fortfarade aktiv men timeout sätts till till 16ms istället för 4 sek (precis som den skall enligt databladet).
Jag måste alltså inom 16 ms göra antingen:
a) göra wdt_reset(); oftare än 16 ms intervaller
b) programmera om wdt så att den resetar efter 4 sekunder
c) avaktivera wdt under tiden som bootloadern är aktiv.
Ingen av dessa tre alternativ har jag lyckats med. Jag kan konstatera att bootloadern hinner starta och köra hela initieringen innan 16 ms då det startas om igen. En gul LED ska tändas när bootloadern är redo, men den blinkar vilt. (har funderat på att mäta tiden med oscilloskop för att få en uppfattning om hur långt den hinner).
Det alternativ jag önskar använda är främst (b) - och låta bootloadern återställa wdt minst varje sekund.
I andra hand, om det skiter sig, vill jag kunna stänga av bootloadern helt (c)
Att göra wdt_reset oftare än 16 ms vill jag helst inte då det är en massa grejer både i bootloadern och senare även i applikationen som kräver längre tider.
Huvudproblemet är enkelt: hur sjutton får jag wdt att räkna till 4 sek istället för 16 ms. Av någon outgrundlig anledning verkar det som om den är helt opåverkbar.
När wdt väl börjat resetta så hjälper ingen hårdvarureset - det enda som återställer wdt så att programmet fungerar igen är en power off.
Jag har inte programmerat WDTON (en 'fuse' som gör det omöjligt att stänga av eller ändra i wdt).
(Ska iväg på släktträff idag, så hinner inte svara på ett tag, men uppskattar om jag har fått något att bita i när jag är tillbaks

EDIT: En sak jag ska testa när jag är tillbaks är att avaktivera bootloadern helt (dvs MCU resettar till 0x0000) för att se hur wdt fungerar med enbart applikationen.
EDIT: Vad jag gör är helt enkelt:
Kod: Markera allt
// APPLIKATIONEN 0x0000
// I INITSEKVENSEN
wdt_enable(WDTO_4S); // starta wdt med 4 sek timeout
// I MAIN LOOP
wdt_reset(); // återställ wdt
// I BOOTLOADER 0x7C00
// I INITSEKVENSEN
cli();
wdt_enable(WDTO_4S);
// I MAIN LOOP
wdt_reset(); // återställ wdt
Kod: Markera allt
// I BOOTLOADER 0x7C00
// I INITSEKVENSEN
cli();
wdt_disable();