Am Ende der vergangen Folge, in der es um die Programmierung eines Timer Interrupts ging, hatte ich die Aufgabe gestellt, eine Interrupt Service Routine zu erstellen, die den Port P0 genau alle 10 Sekunden inkrementiert.
Die Aufgabe sollte so gelöst werden, dass die Interrupt Service Routine des Timers 0 alle 10 ms aufgerufen wird.
Bei jedem 1.000 Durchlauf der Interrupt Service Routine sollte dann der Port inkrementiert werden.
1000 x 10ms = 10s
Zunächst müssen also die SFR-Register TH0 und TL0 bestimmt werden, um eine Zeit von 10ms zu realisieren. Im Video rechne ich die Prozedur einmal vor.
Die Berechnung der Timer-Werte für TH0 und TL0
Damit Du die Werte besser mit Deinen Werten vergleichen kannst, gebe ich die Rechnung hier noch einmal kurz an.
Der Mikrocontroller wird mit 12 MHz getaktet. Durch den Teiler von 12 wird TL0 also jede µs inkrementiert.
10 ms entsprechen 10.000 Inkrementierungen, denn 10.000 x 1µs = 10 ms
Da die beiden Bytes bei 0xFF, dezimal also 65536 überlaufen, muss der Timerstand dezimal auf
65536-10000 =55536
gesetzt werden.
55536 dezimal entspricht D8F0 hexadezimal
Damit ergeben sich folgende Werte:
TH0 = 0xD8;
TL0 = 0xF0
Soweit zur Theorie 😉
Video zur Programmierung des Timers
Im Video zeige ich die Programmierung der Interrupt Service Routine. Wichtig hierbei ist, die Werte für TH0 und TL0 in der Interrupt Service Routine noch einmal zu setzen, weil die Zähler ansonsten beim aktuellen Stand, also TH0 = 0x00 und TL0=0x00 loslaufen würden, statt bei TH0 = 0xD8 und TL0 = 0xF0.
Zudem darf natürlich nicht vergessen werden mit
- EAL = 1; Interrupts generell freizugeben
- ET0 = 1; den Interrupt für den Timer 0 freizugeben
- TR0 = 1; den Timer zu starten
Viel Spaß beim Video und bis zum nächsten Mal. Dann geht es um das auto-reload, bei dem der Timerstartwert „automatisch“ gesetzt wird.
Dieser Artikel ist Teil des Mikrocontrollerkurs auf ET-Tutorials.de.
Hier geht es zurück zur Übersichtsseite des Mikrocontroller-Kurses .