Forum: Mikrocontroller und Digitale Elektronik TIMER ATMEGA


von Daniel (Gast)


Lesenswert?

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?
1
TCCR1B |= (1<<CS10);    // Modus 0 CTC, Prescaler 1
2
TIMSK |= (1<<TOIE1);
3
TCNT1 =

von Michael H. (michael_h45)


Lesenswert?

Daniel schrieb:
> 1.000.000/3.600 = 277,777777
...

außerdem: AVR - Die genaue Sekunde / RTC

von Falk B. (falk)


Lesenswert?

@ 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.

von Daniel (Gast)


Lesenswert?

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?

von Eumel (Gast)


Lesenswert?

Wenn du richtig Strom sparen willst nimmst du den Watchdog zum wecken :)

von Stefan E. (sternst)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

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?

von Daniel (Gast)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

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?
1
    //Timer2 Asynchronmodus
2
    ASSR   = (1<< AS2); 
3
   
4
    //Mode 2 CTC
5
  TCCR2A |= (1<<WGM21);
6
7
    // Prescaler 1024
8
  TCCR2B |= ((1<<CS20) | (1<<CS21) | (1<<CS22));
9
10
       TIMSK |= (1<<OCIE2A);
11
12
       OCR2A = 57600;

von Spess53 (Gast)


Lesenswert?

Hi

>       OCR2A = 57600;

Timer2 ist ein 8-Bit-Timer. Und dessen OCR Register sind auch nur 8 
Bit groß.

MfG Spess

von Daniel (Gast)


Lesenswert?

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.

von Spess53 (Gast)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

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.