Forum: Mikrocontroller und Digitale Elektronik Watchdog Timer umschalten


von Ingo L. (Gast)


Lesenswert?

Hallo,

ich habe einen Tiny261, dieser läuft mit einem 3,6864MHz Quarz. Bei 
einem bestimmten Ereignis soll der Controller in den tiefsten Sleep Mode 
gehen und dann für 30s schlafen. Den WDT habe ich auf 60MS 
initialisiert, sodass er einen Reset auslöst, wenn ich ihn nicht 
rechtzeitig rücksetze. Jetzt möchte ich ihn aber dazu benutzten um 
während der Schlafphase die 30s zu realisieren. Was muss ich dafür tun, 
bzw. gibt es eine fertige Funktion dafür? Das was in der WDT.h steht 
verstehe ich nur oberflächlich.

Aus diesem DOXYGEN-Code(?) werde ich nicht schlau...

Kann mir jemand helfen?



Ingo

von Der D. (derdaniel)


Lesenswert?

Naja wenn du es hinbekommst den Watchdog auf 60ms zu setzen wirst du es 
wohl auch hinbekommen ihn auf den größt möglichen Wert zu stellen.
Da wirst du nur Probleme bekommen weil die meisten keine so langen 
Zeitspannen erlauben.
Nach dem Reset detektieren, dass kein Fehler vorlag sondern der WD 
Wecker spielen durfte und zum vorherigen Programmabschnitt springen. 
Register sollten natürlich irgend wo Resetresistent gesichert werden.

von Ingo L. (Gast)


Lesenswert?

Nein, leider kriege ich es noch nicht hin:

Im Hauptprogramm:
1
WDTCR |= (1<<WDIE);
2
/* set sleep mode */
3
set_sleep_mode(SLEEP_MODE_PWR_SAVE);
4
/* good night... */
5
sleep_mode();

dann:
1
ISR (WDT_vect)
2
{
3
  static unsigned int sleep_counter=0;
4
  sleep_counter++;
5
  if (sleep_counter==SLEEPTIME)
6
  {
7
    /*return from sleep mode */
8
  }
9
  else
10
  {
11
    PORTB ^= (1<<PB3);
12
    WDTCR |= (1<<WDIE);
13
    sleep_mode();
14
  }
15
}

Die LED an PB3 geht nur einmal an und bleibt dann an. Offensichtlich 
wacht er nur einmal auf.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.