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.

 


Kombiniertes Schalten von Kontakten

Es sind 2 Kontakte (z.B. Wasserpumpen, K1 = Pumpe im Erdgeschoss, K2 = Pumpe im Obergeschoss) nach untenstehender Vorgabe zu schalten.
Mit dem uC-Experimentierboard (Humerboard) oder mit Keil uVision soll die Funktion nachgewiesen werden.

Die Kontakte werden über das Port 7 eingelesen.

Der Kontakt K1 entspricht der linken Taste (P7 = 0000 0000) in der Tastenreihe; der Zustand des Kontakts K1 wird am Port 4.7 angezeigt.

Der Kontakt K2 wird mit der ganz rechten Taste (P7 = 0000 1111) in der Tastenreihe betätigt; am Ausgang Port 4.0 und Port 4.1 wird der Zustand des Kontakts K2 angezeigt.

 

Schalten der Kontakte nach folgender Spezifikation

a)    K2 einschalten:
- wenn K1 schon eingeschaltet ist, wird K2 sofort eingeschaltet.
- wenn K1 noch nicht eingeschaltet ist wird zuerst K1 eingeschaltet
  und nach 5 Sekunden auch K2 aktiviert.

b)    K2 ausschalten:
- K2 sofort ausschalten.
- K1 nur dann ausschalten, wenn K1 durch K2 aktiviert wurde (andernfalls nicht).

c)    K1 einschalten:
- kann immer erfolgen; K1 ist in diesem Fall unabhängig von K2.

d.)  K1 ausschalten:
- wird nur durchgeführt, wenn K2 ausgeschaltet ist.

 

Flussdiagramme

1. Hauptprogramm

Flussdiagramm

 


2. Externer Interrupt 0

externer interrupt

 

3. Timer 0 Interrupt

Timer interrupt

 

4. Programmcode in Assembler - Version Humerboard

Portbelegung - Humerboard 517A

 

Assembler Schalten von Kontakten