www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmel Mega644: Watchdog Prescaler


Autor: Tim Toady (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Wissende,

ich habe eine (gut getestete, elektronische Probleme schließe ich aus) 
Schaltung, in der ein auf 14,7456 MHz getakteter ATMega644 läuft. Nun 
möchte ich den Watchdog nutzen, und zwar mit einem Timeout von 2 
Sekunden. Dazu habe ich nach Studium des Datenblatts folgenden Code 
vorbereitet:
void initWatchdog(void) {
  uint8_t sregTmp;

  /* disable interrupts */
  sregTmp = SREG;
  CLI();
  WDR();
  
  MCUSR = 0x00; // Clear all reset flags previously set.
  
  //Step 1: Enable the Watchdog Enable Change Bit (WDCE)
  WDTCSR |= (1 << WDCE) | (1 << WDE);
  //Step 2: Enable Watchdog, set timeout to 2.0s
  WDTCSR |= (1 << WDE) | (1 << WDP2) | (1 << WDP1) | (1 << WDP0);
  
  SREG = sregTmp ; /* restore interrupts */
}

Der Watchdog funktioniert auch wunderbar, und ich kann ihn mit 
asm("wdr") zurücksetzen. Leider ignoriert er den Prescaler und resettet 
den µC nach einer sehr kurzen Zeit von wenigen Millisekunden. Andere 
Prescaler-Einstellungen führen zum selben Ergebnis. Was mach ich falsch?

Viele Grüße
Tim

Autor: RealBlazer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich denke das liegt daran, dass das Change Enable Bit nach 4 Taktzyklen 
automatisch wieder zurückgesetzt wird. Die Veroderung der vier Bits im 
Step 2 schaffst du/der Compiler wohl nicht in dieser Zeit.
Probier mal aus im Step 2 das WDTSCR-Register dirkt mit dem Hex-Wert zu 
laden.

Gruß
RealBlazer

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Optimierung einschalten, sonst wird der Code zu langsam.
2. Die zweite Zuweisung an WDTCSR ist eine reinrassige Zuweisung und 
kein 'verodernde' Zuweisung. Dauert sonst zu lang.

Die Bitschiebereien rechnet übrigens der Compiler aus, das ist kein 
Laufzeitproblem.

Autor: Tim Toady (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die schnellen Antworten. Interessante Idee, habe mal 
nachgeschaut, was der Compiler so produziert:
 000A           ;       WDTCSR |= (1 << WDCE) | (1 << WDE);
 000A 80916000          lds R24,96
 000E 8861              ori R24,24
 0010 80936000          sts 96,R24
 0014                   .dbline 20
 0014           ;       //Step 2: Enable Watchdog, set timeout to 8.0s
 0014           ;       WDTCSR |= (1 << WDE) | (1 << WDP3); // | (1 << WDP1) | (1 << WDP0);
 0014 80916000          lds R24,96
 0018 8862              ori R24,40
 001A 80936000          sts 96,R24

Das müsste eigentlich gerade noch passen. Werde morgen mal testweise das 
|= durch ein = ersetzen.

Gruß
Tim

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das müsste eigentlich gerade noch passen. Werde morgen mal testweise das
> |= durch ein = ersetzen.

..das dürfte nit langen:
> 0014           ;       WDTCSR |= (1 << WDE) | (1 << WDP3); // | (1 << WDP1) | (1 << WDP0);
> 0014 80916000          lds R24,96
> 0018 8862              ori R24,40
> 001A 80936000          sts 96,R24

lds   2 Takte
ori   1 Takte
sts   2 Takte

Macht 5, das ist einer zu viel.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..und noch was geht schief beim zweiten Mal: WDCE ∗muss∗ 0 geschrieben 
werden, das klappert mit der Veroderung nicht :-) </ingrid>

Autor: Tim Toady (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

genial - sobald man's richtig macht, klappt es auch. Hab das Beispiel 
aus dem Datenblatt zum Mega644 abgeschrieben, aber bei all der sonstigen 
Bit-Setzerei nicht beachtet, dass man ja direkt schreibt und nicht 
verodert.
Vielen Dank an alle für die schnelle Hilfe!

Gruß
Tim

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benutzt du avr-gcc mit avr-libc? Dann schau mal, was die <avr/wdt.h> 
alles an Funktionen zu bieten hat...
wdt_enable(WDTO_2S); und der WDT läuft los...

Autor: Tim Toady (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Uwe,

leider nein - ich bin gezwungen, den ICCAVR zu verwenden, und der hat 
eine eher überschaubare Ausstattung an Atmel-spezifischen 
Bibliotheksfunktionen.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.