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