ATmega644: watchdog reset galen [Löst]

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

ATmega644: watchdog reset galen [Löst]

Inlägg av jesse »

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 :doubt:

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
eller

Kod: Markera allt

// I BOOTLOADER 0x7C00
// I INITSEKVENSEN
cli();
wdt_disable();
Senast redigerad av jesse 27 februari 2012, 01:18:53, redigerad totalt 1 gång.
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Re: ATmega644: watchdog + bootloader = tokfel!

Inlägg av thepirateboy »

Är ett tag sen jag labbade med detta men är inte huvudproblemet att du inte clearar "Watchdog Reset Flag"?

Jag har i alla fall denna rad allra först i mina program.

Kod: Markera allt

MCUSR &= ~(1 << WDRF);
Vet inte om det hjälper men går ju att testa.
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: ATmega644: watchdog + bootloader = tokfel!

Inlägg av bos »

jesse skrev: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).
Nu kan jag inget om Atmels processorer specifikt, men enligt sid 51 i databladet du länkar till:
the application software should always clear the Watchdog System Reset Flag
(WDRF) and the WDE control bit in the initialisation routine, even if the Watchdog is not in use.
Gör du detta?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: ATmega644: watchdog + bootloader = tokfel!

Inlägg av jesse »

Ni har båda rätt! Jag kollade databladet nu direkt när jag kom hem och det verkar vara det som är felet. Stämmer precis med hur min processor beter sig. Jag hade av någon anledning missat / missuppfattat det och trodde att WDRF enbart var en flagga för att indikera att en watchdog reset hade utförts, men inte att den påverkade timerns funktion.

Men tydligare än så här blir det ju inte:
WDE is overridden by WDRF in MCUSR. This means that WDE is always set when WDRF is
set. To clear WDE, WDRF must be cleared first.
Jag är mycket tacksam för svaren. Ibland stirrar man sig blind på ett problem utan att hitta lösningen, då är lite feedback utifrån guld värt! :tårta:

(Har inte testat det än, men känner mig övertygad. Ska testa alldeles snart :P )
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: ATmega644: watchdog + bootloader = tokfel!

Inlägg av jesse »

Hel**... :doubt:

Det var inte så enkelt.
Exakt samma fenomen fortfarande, trots att jag lade till MCUSR = 0; eller MCUSR &= ~(1<<WDTR); samt wdt_reset(); i början på bootloadern.

Tillbaks till ruta ett...

blir väl inget mer fixande med detta i kväll... :sleepy:

EDIT:
OK, det löste sig till slut, hade gjort ett skrivfel... nu verkar det fungera, äntligen!
Skriv svar