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