Beitragsseiten

Timer - Programmierbeispiele

Programmbeispiel Blinklicht aller LED's am Port 2

Die Zeitverzögerung wird mit dem Timer 1 realisiert.

Wenn Sie das Programm mit F10 in Keil uVision debuggen, sollten Sie darauf achten, das der Timer mit einem hohen Wert (kurz vor Überlauf z.B. mit FFF5) vorgeladen wird. Ansonsten würden Sie "ewig" mit F10 debuggen.
Beobachten Sie das Port 2 und insbesondere die einzelnen Schritte des Timers im Debugmodus.

Den Timer1 finden Sie unter Peripherals / Timer / Timer1.

 

Programmcode Blinklicht

Im 1.Schritt wird der Timer und Interrupt aktiviert, der Timer vorgeladen und anschließend gestartet. Das Programm springt in eine Endlosschleife und wartet auf den Timerinterrupt.
Das Überlauf-Flag löst bei Timerüberlauf (FFFF) den Timerinterrupt 1 an der Einsprungadresse 001Bh aus.
Da der Platz für die Interrupt-Service-Routine zu klein ist (Die nächste Interrupt-Einsprungadresse ist bereits auf 023h) wird dieser Adressbereich mit JMP übersprungen.

Die entsprechende Interrupt-Service-Routine wird ausgeführt, das Zählregister auf den gewünschten Wert inkrementiert und der Timer solange neu vorgeladen, bis der Zählwert des Zählregisters erfüllt ist.
Jetzt werden die Bits umgedreht, am Port 2 ausgegeben und das Zählregister gelöscht.
Mit RETI wird die Interrupt-Service-Routine wieder verlassen.

Programmcode Blinklicht

Bei einer Oszillatorfrequenz von 12MHz ergibt sich ein Systemtakt von 1MHz = eine Taktzeit von 1us.
Wenn die LED´s z.B. mit einer Blinkfrequenz von 1 Sekunde blinken sollen, muss der Zähler anders vorgeladen und das Zählregister entsprechend erhöht werden.

 

Beispiel - Zähler vorladen und Zählregister erhöhen

Um eine Zeit von 50ms zu generieren, muss der Timer auf die Dezimalzahl 15536 vorgeladen werden.
Das entspricht der HEX-Zahl 3CB0!

TH0 wird also mit 3C und TL0 mit B0 vorgeladen:

Assemblercode

MOV    TL0,#B0h      ;Vorladen des Timer 0 (Low Byte) mit B0
MOV    TH0,#3Ch     ;Vorladen des Timer 0 (High Byte) mit 3C

Da der Timer max. 65,636ms pro Durchlauf erzeugen kann, muss das Zählregister (R0,#20)  bei jedem Durchlauf um 1 inkrementiert werden, solange bis 20 Durchläufe (50ms x 20 = 1s) erreicht werden.