ATTiny25 Watchdog-Wakeup

Gast #906593
Lesenswert?

Hallo

Möchte gern eure Meinung zu meiner Idee hören ob das überhaupt möglich 
ist:

Ich mach ne Schaltung die später mit Batterie betrieben werden soll, 
insofern muss ich ja besonders auf den Stromverbrauch achten.

Der Programmablauf schaut folgendermaßen aus.

Programmstart - ADC-Messung - do something - 3 Stunden warten(Timer1) - 
ADC-Messung usw

Um nun die 3 Stunden nicht sinnlos in der while(1) Schleife zu 
verbringen möcht ich nun nach - do something - den µC in den Power-Down 
Modus schicken.

Das Problem besteht eben nun darin die 3 Stunden zu ermitteln (der 
Idle-Modus wär ja auch ne alternative, jedoch würde ichs echt gern mit 
dem Power-Down Modus schaffen), was bis jetzt eben durch den Timer 
geschah...ein weiteres Problem besteht darin das die Wartezeit variable 
ist (wird aus den Werten der ADC-Messung berechnet).

Da der Watchdog auch quasi als Timer verwendet werden kann, möcht ich 
nun versuchen das Problem so zu lösen:

Die maximale Timout-Zeit beim Tiny25 beträgt 8sec, der µC wird jetzt 
alle 8sec aufgeweckt und springt zur WD-ISR(dort muss ich im Grunde nur 
WDIE setzen damit beim nächsten Mal wieder der WD zur ISR springt) 
danach befindet sich der µC ja wieder im Active Mode und der Timer1 ist 
wieder aktiv.

(falls ich das jetzt alles richtig verstanden hab was ich bis jetzt 
gelesen hab)

Die ISR vom Timer1 schaut dann folgendermaßen aus

ISR-Timer1 (overflow)
{
   zaehler++;
   if(zaehler >= wartezeit)
   {
      do something;
   }
   else <Power-down-Modi>

}

danach falls die zeit noch nicht um ist eben wieder in den power-down 
und nach 8sec wieder das gleiche bis die zeit um ist..

die richtige berechnung mit der zeit macht mir noch kopfzerbrechen...und 
obs überhaupt möglich ist das ganze so zu realisieren oder obs ne 
bessere möglichkeit geben würde...

bin für jeden ratschlag dankbar :)

lg
#906611
Lesenswert?

Schau mal hier rein Beitrag "Glühwürmchen in Rotkohlglas gefangen"
Dort habe ich auch mit variablen WDT Zeiten gearbeitet. Die theoretische 
Auflösung beträgt +-16ms die praktische Gesamtgenauigkeit hängt aber vom 
WDT Oszillator ab und ist damit nicht sonderlich genau.
Es wird ebenfalls die WDT ISR benutzt. Du musst in WDTCR nur das WDIE 
Flag und nicht das WDE Flag setzen. Damit ist der WDT immer mit der 
WDT-ISR aktiv und innerhalb der ISR musst du das WDIE Flag nicht erneut 
setzen.

Wozu du noch den Timer1 benötigst ist mir nicht ganz klar, mit dem WDT 
alleine geht das.

Gruß Hagen
Gast #906658
Lesenswert?

hey

ja stimmt im grunde brauch ich den timer1 dann gar nicht mehr..

wegen dem WDIE...kann ichs trotzdem in der ISR nach meiner zeitabfrage 
setzen oder wirds dann trotzdem hardewarenäßig gelöscht nachdem die isr 
ausgeführt worden ist und ich muss es im hauptprogramm immer setzen nach 
der isr?

lg
#906812
Lesenswert?

Der WDT in neueren AVRs kann auf drei verschiedene Arten aktiviert 
werden.
1.) WDE
2.) WDIE
3.) WDE und WDIE

1.) AVR geht in RESET beim Auslösen des WDT
2.) AVR ruft permanent WDT-ISR auf, ISR muß WDIE nicht explizit neu 
setzen
3.) AVR ruft einmalig WDT-ISR auf. Dabei wird per Hardware das WDIE Flag 
in WDTCR gelöscht ! Setzt man das WDIE Flag in der ISR nicht von Hand 
neu so wird der nächste WDT einen RESET auslösen statt die WDT-ISR 
aufzurufen

Gruß hagen
Gast #907211
Lesenswert?

kk alles klar, nagut auf der einen Seite ist sicher die 2 Möglichkeit 
die bequemste auf der anderen Seite habe ich bei der 3ten noch 
zusätzlich eine Absicherung.

Nagut mal schauen aber du hast mir echt weitergeholfen danke

lg
Gast #907228
Lesenswert?

k ich brauch also nur WDIE setzen um den WD einzuschalten? richtig oder?

wie schauts jetzt aus wenn ich den WD wieder ausschalten möchte für die 
Dauer der Messung?
Einfach das Bit wieder löschen oder muss die Prozedur lt Datenblatt 
Safety Level 1 durchführen?

lg

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren