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