Forum: Mikrocontroller und Digitale Elektronik Uhr programmieren - Ein paar Fragen - Asynchrone Abläufe & Power-Save-Mode


von Marc B. (drakenfly)


Lesenswert?

Liebe Community,

Ich sitze derzeit an dem Quellcode für meine Uhr, und habe ein paar 
Fragen.
kurzer Hinweis am Rande: Ich habe die Hardware dazu noch nicht, aber ich 
bin im Moment schon drauf und dran, den Code dafür zu schreiben, damit 
ich die Uhr gleich nach dem Zusammenbauen in Betrieb nehmen kann.

Also, nun zu meinen Fragen:
Problemstellung:
Dank mehrerer Hinweise arbeite ich mit einem ATmega8820PA-20AU, und zwar 
läuft der AVR auf internem RC (1MHz), und an TOSC1 und TOSC2 hängt ein 
Uhrenquarz mit 32,768kHz.

Nun hängen auf dieser Uhr zwei Druckschalter, zum Einschalten der 
Anzeige der Uhr, und zum einstellen der Uhr.
Die Uhr soll angehen, wenn einer der beiden Schalter kurz gedrückt wird, 
und wieder ausgehen, wenn wieder einer gedrückt wird. Wird keiner mehr 
gedrückt, geht sie nach 60 Sekunden wieder von selbst aus.
Wird der obere Taster 3 Sekunden gedrückt, kann man die Uhr einstellen. 
Die Stundenanzeige beginnt zu blinken, und mit dem unteren Taster kann 
man die Stunden verstellen. Drückt man wieder den oberen, kann man die 
Minuten verstellen, usw.

Macht der ATmega gerade nichts, außer die Zeit zu zählen, geht er 
zwischendruch immer in den Power-Save-Mode.

Nun habe ich mich des Codes zur Entprellung und zum Repeaten von Tastern 
von Peter Danegger bedient, und habe folgenden Gedanken:
Wird ein Taster gedrückt (Pin Change Interrupt, aktivieren tu ich es so:
1
// PIN CHANGE INTERRUPT AN PIN PD5 (PCINT21) UND PD6 (PCINT22)
2
// AKTIVIEREN
3
//
4
PCICR |= (1<<PCIE2);
5
PCMSK2 |= (1<<PCINT22);
6
PCMSK2 |= (1<<PCINT21);
), wird der Timer0 aktiviert, um die Tasterabfrage zu starten.

Im Timer0 bei der Tastenabfrage wird dann registriert, wann das letze 
mal etwas gedrückt war, und ist die Differenz des letzten Tastendrucks 
und der aktuellen Zeit > 60s, dann wird Timer0 wieder deaktiviert (und 
die LEDs ausgeschalten, s.o.! sollte eine Taster nur kurz gedrückt 
werden, wird auch schon < 60 s ausgeschalten.).
Im Grunde ist Timer0 immer dann aktiv, wenn die LEDs zur Anzeige der 
Uhrzeit an sind. Also, nach dem aktivieren, und während dem einschalten.

Meine Frage: funktioniert das? Laut Datenblatt funktionieren 
Pin-Change-Interrupts ja noch, wenn der Power-Save-Mode an ist. Und, 
liegt ein Change-Interrupt vor, dann wird der Power-Save-Mode solange 
nicht aktiviert, solange Timer0 aktiv ist. Dann kann Timer0 neben Timer2 
doch einwandfrei laufen, oder?

Vielen Dank, falls ihr euch bei meinem Aufsatz bis hierher durchgekämpft 
habt.
Vielen Dank im Vorraus für alle Antworten!

Lg Marc

von Peter D. (peda)


Lesenswert?

Marc Brexner schrieb:
> Macht der ATmega gerade nichts, außer die Zeit zu zählen, geht er
> zwischendruch immer in den Power-Save-Mode.

Warum, ist das Gerät batteriebetrieben?

Man sollte auch bei der Programmierung in kleinen Schritten vorgehen.

Also erstmal alle Funktionen zum Laufen bringen.
Das Stromsparen kommt dann ganz zum Schluß, wenn alles schon läuft.


Peter

von Marc B. (drakenfly)


Lesenswert?

Peter Dannegger schrieb:
> Marc Brexner schrieb:
>> Macht der ATmega gerade nichts, außer die Zeit zu zählen, geht er
>> zwischendruch immer in den Power-Save-Mode.
>
> Warum, ist das Gerät batteriebetrieben?
>

Ja, ist es.


> Man sollte auch bei der Programmierung in kleinen Schritten vorgehen.
>
> Also erstmal alle Funktionen zum Laufen bringen.
> Das Stromsparen kommt dann ganz zum Schluß, wenn alles schon läuft.
>

Hm, da hast du vermutlich recht. Ich poste hier dann einfach nochmal, 
wenn ich so weit bin... ;)

Lg Marc

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Marc Brexner schrieb:
> Meine Frage: funktioniert das? Laut Datenblatt funktionieren
> Pin-Change-Interrupts ja noch, wenn der Power-Save-Mode an ist. Und,
> liegt ein Change-Interrupt vor, dann wird der Power-Save-Mode solange
> nicht aktiviert, solange Timer0 aktiv ist. Dann kann Timer0 neben Timer2
> doch einwandfrei laufen, oder?

Das funktioniert. PinChange wird asynchron, also ohne laufenden 
CPU-Takt, erkannt. Alle Timer funktionieren unabhängig voneinander. Alle 
Timer ausser Timer2 laufen nur mit CPU-Takt.

von Thomas E. (thomase)


Lesenswert?

Marc Brexner schrieb:
> Meine Frage: funktioniert das? Laut Datenblatt funktionieren
>
> Pin-Change-Interrupts ja noch, wenn der Power-Save-Mode an ist. Und,
>
> liegt ein Change-Interrupt vor, dann wird der Power-Save-Mode solange
>
> nicht aktiviert, solange Timer0 aktiv ist. Dann kann Timer0 neben Timer2
>
> doch einwandfrei laufen, oder?

Nein!

Poste mal deine main() in der sleep aufgerufen wird.

Den Sleepmode interessiert das nicht, ob irgendein Timer läuft. Der 
schaltet einfach den Takt ab und dann läuft nur noch Timer2 mit 
Uhrenquarz und sofern aktiviert der Watchdogtimer.

mfg.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Thomas Eckmann schrieb:
> Nein!

Doch!

Lies mal bitte genauer, was Marc geschrieben hat.

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.