ATmega48: Timer2 async + häufiger sleep-mode -> gerät ausser Takt?

OP #958046
Lesenswert?
• ▲
▼
Hi,

ich habe da ein merkwürdiges Problem. Bin grade dabei eine Binär-Uhr mit 
meinem ATmega48 zu bauen. Sobald der Akku leer ist soll das Ding in den 
Low-Bat Modus gehen. Das soll so aussehen, dass es nur noch sehr wenig 
Strom verbraucht und die 17 LEDs (6 für Sekunden, 6 für Minuten, 5 für 
Stunden) der Reihe nach kurz aufblitzen. Die LEDs sind per 
Charlieplexing angeschlossen, der Prozessor muss also die ganze Zeit 
währenddessen mit den internen 8Mhz laufen (selbst wenn ich nur eine 
einzelne LED an hab. Da diese viel zu hell werden würde, müsste ich sie 
per pwm dimmen). Am Timer2 ist asynchron ein Uhrenquarz angeschlossen 
und erzeugt 16 Interrupts die Sekunde.

Bei der sechzehnten bzw. nullten Timer2-OVF ISR in einer jeden Sekunde 
wird die aufblitzen zu lassende LED aktiviert, bei der nächsten, also 
der ersten OVF-ISR wird sie wieder abgeschaltet und das Flag gesetzt, 
das der Main-Function signalisiert dass sie jetzt in den Power-Save Mode 
gehen darf. D.h. der µC läuft jede Sekunde 1/16 dieser Zeit voll durch, 
die übrigen 15/16 schläft er (abgesehen von den übrigen Timer-OVFs die 
nur die Teilervariable um eins hochzählen).

Auf jeden Fall scheint mein µC das nicht mitzumachen. Er gerät ausser 
Takt. Eine normale Sekunde scheint dann nur noch 375ms zu dauern, der 
Timer2 muss offensichtlich wesentlich schneller schwingen, aber warum? 
Verkraftet der µC den ständigen Sprung in den Sleep-Mode nicht? Brauch 
ich einen externen Taktgenerator für den Uhrenquarz der unabhängig und 
stabil arbeitet?

Ich hab das Programm mal auf das wesentliche reduziert und angehängt. 
Wenn ich nicht in den Sleep-Modus geh läuft alles normal. Ansonsten 
zirka 3 mal so schnell.

lg PoWl
Angehängte Dateien:
OP #958097
Lesenswert?
• ▲
▼
Habe nochmal einen Nachtrag. Bei der Messung mit dem Oszi am X2 pin 
stellte sich raus, dass die Frequenz des Quarzes stabil bleibt. Jedoch 
ändert sich die Amplitude wenn ich im Power Save bin, sie wird etwas 
kleiner aber auch nicht sonderlich viel. Normalerweise beträgt sie 
ziemlich genau 1,1V, im Power Save Modus ungefär 0,8V. Die Frequenz 
bleibt absolut stabil. Ich habe keine Ahnung warum der Controller auf 
einmal 3..4 mal so schnell läuft
#958107
Lesenswert?
• ▲
▼
1) Ich habe mir das bei dir nicht genau angesehen, aber wenn der 
Sleep-Mode von irgendwas abhängig ist, das in einem Interrupt gesteuert 
wird, dann ist es meist ungünstig, wenn das Ereignis genau zwischen dem 
Test und der Aktivierung des Sleep-Modes auslöst.

Zu lösen ist das, indem man den Test bei abgeschalteten Interrupts macht 
und die Interrupts erst unmmitelbar vor dem Sleep freigibt. Sieht Doku 
von avr/sleep.h.

2) Nach einem Interrupt durch den asynchronen Timer darf man nicht 
sofort wieder einpennen, sondern muss irgendwas abwarten. Im Datasheet 
stehen 1,5 Seiten darüber was man wann wie tun oder nicht tun darf.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.