Übung 9, Interrupts

Zum Abschluss dieses Tutorials wollen wir eine interruptgesteuerte Uhr realisieren, welche die aktuelle Stunde und Minute in binärer Form auf Leuchtdioden anzeigt.

Die Leuchtdioden für die Anzeige der Minute werden an Port B, Pin 0...5 angeschlossen.

Die Leuchtdioden für die Anzeige der Stunden werden an Port D, Pin 2...6 angeschlossen.

An Pin 7 von Port B soll ein Taster angeschlossen werden. Wenn dieser Taster gedrückt wird kann die Zeit eingestellt werden. Dabei wird bei einem kurzen Tastendruck die Minute einmal hochgezählt. Wenn der Taster gedrückt bleibt werden die Minuten im Schnelldurchlauf hochgezählt (ca. 2 bis 3 Impulse pro Sekunden).

Einige Tipps

Die globalen Variablen (z.B. zur Speicherung der Uhrzeit) sollten alle mit dem Schlüsselwort volatile deklariert werden da der Compiler dieselben sonst möglicherweise wegoptimiert.

Ich habe einen Quarz mit einer Frequenz von 386400 Hz eingesetzt. wenn nun der Timer 1 mit dem Vorzähler 1 gestartet wird so läuft dieser jede Minute genau 3375 mal durch. Wir brauchen also lediglich eine Interruptroutine in den Timer 1 Overflow einzubinden und bei jedem Aufruf einen Zähler zu inkrementieren. Erreicht dieser Zähler den Wert 3375 so ist eine Minute verstrichen.

Für die Tastaturabfrage kann der Zählerwert Modulo 25 genommen werden. Wenn diese Berechnung 0 ergibt kann der Tastenzustand überprüft werden. Damit haben wir automatisch eine Entprellung und auch die Dauerfunktion der Taste ist dann eigentlich schon dabei.
Ich persönlich würde allerdings innerhalb der Timerroutine lediglich ein globales Flag setzen und die eigentliche Auswertung der Taste in's Hauptprogramm verlegen (Ihr wisst schon: kurze Interruptroutine).

Genügend grosse Vorwiderstände für die LED's vorsehen, da wir ja keinen AVR verbraten wollen.

An den unbenutzten Pins können jetzt nach Lust und Laune etwelche Verbraucher zeitlich gesteuert werden und dies auf eine Minute genau.

Auch hier habe ich eine Musterlösung vorbereitet. Diesmal ist der Quellcode und das Makefile für WinAVR geschrieben. Es lässt sich aber mit dem bisherigen Wissen problemlos auf die ältere Compilerversion anpassen.