Forum: Mikrocontroller und Digitale Elektronik Atmega328 Timer2/RTC Problem


von Dominik E. (Gast)


Lesenswert?

Hallo,

Ich habe Timer/Counter2 des Atmega328 als asynchronen Counter 
konfiguriert. Als Test toggle ich in der Overflow ISR einen Pin an dem 
eine LED hängt.
Da der Controller sonst nichts zu tun hat "schläft" er die meiste Zeit 
(SLEEP_MODE_PWR_SAVE). Um den Stromverbrauch zu minimieren habe ich 
alles abgeschaltet was nicht benötigt wird (BOD, ADC usw.).
Mit meinem Wald und Wiesen Multimeter kann ich den Stromverbrauch im 
Ruhezustand nicht mehr ordentlich messen (zeigt 1uV an bei 2mV 
Messbereich) und wenn die LED an ist mess ich ein paar Milliampere. Das 
scheint alles super zu funktionieren.
Jetzt zu meinem Problem. Den Prescaler von Timer/Counter2 habe ich auf 
128 eingestellt (TCCR2B = (1<<CS20)|(1<<CS22);). Die ISR scheint aber 
nur alle 2 Sekunden aufgerufen zu werden da die LED nur alle 2 Sekunden 
getoggled wird.
Probeweise hab ich den Prescaler auf 64 gestellt und siehe da ich die 
LED blinkt mit 0,5 Hz (wird jede Sekunde getoggled). Ich verstehe aber 
nicht warum das so ist. Eigentlich sollte bei einem 8bit Counter ein 
Prescaler von 128 eine Interruptfrequenz von 1Hz erzeugen.
Den 32,768kHz Takt habe ich von einem externen RTC (DS3232) mit 
Taktausgang einfach an den entsprechenden Oszillatoreingang des Atmega 
angehängt (X2). Die Frequenz dieses Signals habe ich mit dem Oszilloskop 
überprüft.
Wird ein solches Signal irgendwie anders gezählt als wenn ein Quarz 
zwischen X1 und X2 hängt? An X2 hängt wie gesagt der Takt und X1 ist 
offen.

Ich habe leider keinen Uhrenquarz hier sonst könnte ich mir die Frage 
wohl leicht selbst beantworten aber vielleicht hat das ja schonmal einer 
von euch so gemacht.

LG
Dominik

von spess53 (Gast)


Lesenswert?

Hi

>Jetzt zu meinem Problem. Den Prescaler von Timer/Counter2 habe ich auf
>128 eingestellt (TCCR2B = (1<<CS20)|(1<<CS22);). Die ISR scheint aber
>nur alle 2 Sekunden aufgerufen zu werden da die LED nur alle 2 Sekunden
>getoggled wird.

Zum Blinken werden zwei Interrupts pro Periode benötigt.

MfG Spess

von Dominik E. (Gast)


Lesenswert?

Hallo,
Mir ist bewusst, dass die periodendauer doppelt solang ist. Mit einem 
Prescaler von 128 ist die LED 2 Sek an und 2 Sek aus also blinkt sie mit 
1/4Hz. Ich würde mir aber 1/2Hz erwarten.

32768/128 = 256 => jede Sekunde ein overflow interrupt. Tatsächlich 
scheint der aber nur alle 2 Sek aufzutreten.

Lg
Dominik

von spess53 (Gast)


Lesenswert?

Hi

>32768/128 = 256 => jede Sekunde ein overflow interrupt.

Ist korrekt.

>Tatsächlich scheint der aber nur alle 2 Sek aufzutreten.

Dann zeig mal deine Timerinitialisierung, die du auf der ATMega geflasht 
hast.

MfG Spess

von m.n. (Gast)


Lesenswert?

Dominik E. schrieb:
> 32768/128 = 256 => jede Sekunde ein overflow interrupt. Tatsächlich
> scheint der aber nur alle 2 Sek aufzutreten.

Wenn ich mir Dein Programm ansehe, dann ist das mit den 2 s voll in 
Ordnung.

von Martin S. (led_martin)


Lesenswert?

Vermutlich ist die Einspeisung des Takts nicht richtig. Im ASSR – 
Asynchronous Status Register gibt es das Bit EXCLK, das zu setzen ist, 
wenn, statt Uhrenquarz, der Takt extern eingespeist wird, laut 
Datenblatt ist der Takt dann aber an TOSC1 anzuschließen:

• Bit 6 – EXCLK: Enable External Clock Input
When EXCLK is written to one, and asynchronous clock is selected, the 
external clock input buffer is enabled and
an external clock can be input on Timer Oscillator 1 (TOSC1) pin instead 
of a 32kHz crystal. Writing to EXCLK
should be done before asynchronous operation is selected. Note that the 
crystal Oscillator will only run when this
bit is zero.

Mit freundlichen Grüßen - Martin

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.