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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.