Hallo,
ich wollte gerne meinen Atmega 88 in einen Sparmodus schicken und den
dann mit einen der internen TIMER wecken.
Dazu habe ich folgende Frage. Angenommen er soll jede Stunde einmal
aufwachen.
1h = 3600sec
Die CPU läuft mit 1Mhz interner Oszillator.
Mit dem CTC Mode wollte ich zunächst das realisieren. Da ich allerdings
bei einen Prescaler von 1 und der CPU Freq. auf keinen glatten Wert bei
3600sec komme, ist das wohl eher ungünstig?
1.000.000/3.600 = 277,777777 Da würden sich bei dem CTC doch irgendwann
ein Fehler einschleichen und nicht aller 3600sec aufgewacht werden.
1
TCCR1B|=((1<<WGM12)|(1<<CS10));// Modus 4 CTC, Prescaler 1
2
TIMSK|=(1<<OCIE1A);
3
OCR1A=278;
Eine bessere Lösung wäre doch der normale Modus 0, in dem ständig
inkrementiert wird bis zum Overflow. Jetzt steh ich ein wenig auf dem
Schlauch und weiß grad nicht weiter. Wie muss ich jetzt TCNT1 vorladen?
@ Daniel (Gast)
>ich wollte gerne meinen Atmega 88 in einen Sparmodus schicken und den>dann mit einen der internen TIMER wecken.
Siehe Sleep Mode.
>Dazu habe ich folgende Frage. Angenommen er soll jede Stunde einmal>aufwachen.>1h = 3600sec
Jo.
>Die CPU läuft mit 1Mhz interner Oszillator.
Der ist nicht sonderlich genau, so um die 5-10%.
>Mit dem CTC Mode wollte ich zunächst das realisieren. Da ich allerdings>bei einen Prescaler von 1 und der CPU Freq. auf keinen glatten Wert bei>3600sec komme, ist das wohl eher ungünstig?
Nö, das passt schon.
>1.000.000/3.600 = 277,777777 Da würden sich bei dem CTC doch irgendwann>ein Fehler einschleichen und nicht aller 3600sec aufgewacht werden.
Siehe AVR - Die genaue Sekunde / RTC.
>Schlauch und weiß grad nicht weiter. Wie muss ich jetzt TCNT1 vorladen?
Gar nicht. Diese "Vorladen" ist ein Relikt aus alten Zeiten. CTC ist das
Zauberwort.
Danke erstmal. Schau mir dne Artikel gleich komplett an. Allerdings
steht am Anfang gleich etwas über RTC´s.
Das war auch mein Gedanke, allerdings war ich der Ansicht das sich dies
mit meiner Hardware nicht umsetzen lässt. Ich habe einen DS1307.
SQW/OUT (Square Wave/ Output Driver) - When enabled, the SQWE bit set to
1, the SQW/OUT pin
outputs one of four square wave frequencies (1 Hz, 4 kHz, 8 kHz, 32
kHz). The SQW/OUT pin is open
drain which requires an external pullup resistor. SQW/OUT will operate
with either Vcc or Vbat applied.
Das hilft mir ja nicht weiter. Da ich damit ja nicht meine gewünschte
Aufweckfrequenz realisieren kann oder?
Müsste ich mir dahingehend einen anderen RTC aussuchen?
Daniel schrieb:> 1.000.000/3.600 = 277,777777 Da würden sich bei dem CTC doch irgendwann> ein Fehler einschleichen und nicht aller 3600sec aufgewacht werden.
Ganz davon zu schweigen, dass die Rechnung an sich schon Banane ist.
Für ein Ereignis alle 3600 Sekunden bräuchtest du einen CTC-Wert von
"(1.000.000 MAL 3.600) - 1", was schwerlich in ein 16-Bit-Register
passt.
Was du da ausgerechnet hast, sind "3600 Ereignisse pro Sekunde".
Bei 1 MHz, einem 16-Bit-Timer, und einem maximalen Prescaler von 1024,
ist das größtmögliche Intervall etwas mehr als 67 Sekunden. Einmal pro
Stunde per Timer aufwachen geht also sowie nicht.
Daniel schrieb:> ich wollte gerne meinen Atmega 88 in einen Sparmodus schicken und den> dann mit einen der internen TIMER wecken.
Sowas macht man mit dem Timer2 im Asynchronmodus.
Eumel schrieb:> Wenn du richtig Strom sparen willst nimmst du den Watchdog zum wecken :)
Verbraucht viel zu viel Srom im Vergleich zum Asynchronmodus. Würde aber
mit dem Watchdog-Timer auch gehen.
Allerdings ist stündliches Wecken natürlich Quatsch. Man lässt den
Controller z.B. jede Sekunde aufwachen und dann in der Timer-ISR eine
Varable bis 3600 hochzählen. Oder 3634 wenn es nicht so genau sein muß.
Das läuft dann im Powersave mit 2 AAs ein paar Jahre.
mfg.
Stefan Ernst schrieb:> Ganz davon zu schweigen, dass die Rechnung an sich schon Banane ist.> Für ein Ereignis alle 3600 Sekunden bräuchtest du einen CTC-Wert von> "(1.000.000 MAL 3.600) - 1", was schwerlich in ein 16-Bit-Register> passt.
Ok das hab ich glaub ich verstanden. Ich hätte nicht durch die
Periodendauer T, sondern durch die Frequenz f teilen müssen. Oder halt
einfach mit T multiplizieren.
Allerdings welche Option habe ich denn wenn ich jetzt nur stündlich den
Controller aufwecken will?
Thomas Eckmann schrieb:> Sowas macht man mit dem Timer2 im Asynchronmodus.
Das sagt mir noch nix. Was macht der asynchronmodus? Das er nur
asynchron zum Takt durch externe Ereignisse (Taster) geweckt wird?
Wenn ich den Controller jede Sekunde aufwecke obwohl ich ihn eigentlich
nicht brauche, hab ich in Summe doch aber einen höheren Stromverbrauch.
Dann brauch ich ihn doch gar nicht schlafen schicken.
Daniel schrieb:> Das sagt mir noch nix. Was macht der asynchronmodus?
Im Asynchronmodus wird der Timer2 zur RTC. Der Rest des Controllers kann
dann im Powersafe-Sleepmode nahezu komplett abgeschaltet werden.
Daniel schrieb:> hab ich in Summe doch aber einen höheren Stromverbrauch.> Dann brauch ich ihn doch gar nicht schlafen schicken.
Der kommt pro Sekunde für ein paar Takte, sagen wir mal 100, hoch und
legt sich dann für die restlichen 999900 Takte, bei 1MHz, dieser Sekunde
wieder schlafen.
Die Selbstentladung der Batterie ist dabei höher als der Stromverbrauch
des Controllers.
mfg.
Thomas Eckmann schrieb:> Im Asynchronmodus wird der Timer2 zur RTC. Der Rest des Controllers kann> dann im Powersafe-Sleepmode nahezu komplett abgeschaltet werden.
Muss ich dann den Controller über einen externen Takt speisen? So wie
ich das jetzt gelesen habe, kann der CPU Takt wweiterhin 1Mhz interner
Takt bleiben, nur der Timer2 erhählt z.b. 32 Khz Uhrenquarz. Daher
spricht man wahrscheinlich auch von asynchron, da der Timer nicht
synchron zum CPU Takt läuft?
Aktivieren tue ich den Asynchronodus über das ASSR – Asynchronous Status
Register?
EXCLK auf 1
AS2 auf 1
So richtig sehe ich noch nicht wie ich den Asynchron Modus aktiviere.
Daniel schrieb:> So richtig sehe ich noch nicht wie ich den Asynchron Modus aktiviere.
Das ist ganz einfach.
Uhrenquarz an TOSC1 und TOSC2, AS2 im ASSR auf 1 und der Timer2 läuft
mit 32768Hz.
mfg.
Wenn ich das versuche so zulösen, dann hab ich doch aber das gleiche
Problem. Die 115200 bekomme ich auch nicht in einen 16bit Wert.
Prescaler 1024.
32768 / 1024 = 32 --> 32 / (1/3600) = 115200
Für eine halbe Stunde ergebe sich ein Wert der auch in 16bit ablegbar
wäre.
32768 / 1024 = 32 --> 32 / (1/1800) = 57600
Wäre das so richtig?
Spess53 schrieb:> Timer2 ist ein 8-Bit-Timer. Und dessen OCR Register sind auch nur 8> Bit groß.
Oh stimmt. Gut dann funktioniert das so anscheinend auch nicht. Danke
für den Hinweis.
Hi
>Oh stimmt. Gut dann funktioniert das so anscheinend auch nicht.
Die maximale Zeit fürs Aufwecken (Watchdog/Timer2 mit 32kHz) sind beim
ATMega88 8s. Also von 1h Schlafen solltest du dich ganz schnell
verabschieden.
MfG Spess
Daniel schrieb:> Oh stimmt. Gut dann funktioniert das so anscheinend auch nicht. Danke> für den Hinweis.
Warum denn auch?
Jetzt vergiss endlich deine verdammte Stunde. Das ist totaler Unsinn.
Angenommen dein Controller verbrät einmal pro Sekunde für die Zeit von
1ms 10mA. Ein Atmega88PA im Sleepmode braucht für die restlichen 999ms
dieser Sekunde 0,75µA.
Daraus ergibt sich ein Durchschnittsverbrauch von ca. 11µA.
Mit 2 AA-Batterien in Reihe mit 2000mAh läuft der Controller damit
gut 180000h. Das sind 7500 Tage. Also rund 20 Jahre.
Und das ist alles noch sehr großzügig gerechnet. Der Interrupt zum
Sekundenzählen braucht nie und nimmer 1ms, der Stromverbrauch liegt weit
unter den angenommen 10mA und eine AA hat wesentlich mehr als 2000mAh
Kapazität.
Allerdings solltest du einen Atmega88P, PA oder A nehmen. Der alte
88ohnewas verbraucht nämlich im Powersafe 15µA. Mit dem läuft das dann
nur noch 8 Jahre.
Zumindest im ersten Fall ist die Batterie allerdings vor Ablauf der Zeit
vergammelt. Das wäre sie aber auch wenn sie eingepackt in der Schublade
läge.
mfg.