Forum: Mikrocontroller und Digitale Elektronik ATmega48: Timer2 async + häufiger sleep-mode -> gerät ausser Takt?


von Paul H. (powl)


Angehängte Dateien:

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

von Paul H. (powl)


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

von Andreas K. (a-k)


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.

von Paul H. (powl)


Lesenswert?

Thx, hab die Seite nicht genaug genug gelesen.
1
    cli();
2
    sleep_enable();
3
    while(status.sleep)
4
    {
5
      sei();
6
      sleep_cpu();
7
      _delay_ms(1);
8
    }
9
    sleep_disable();
10
    sei();

das _delay_ms(1); hat Abhilfe geschafft. Danke!

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.