Aufgaben: Impulse zählen (Zählerfunktion) Zeitintervalle erzeugen (Zeitgeberfunktion) Prinzipschaltbild: Die Programmierung erfolgt mit den Registern TMOD und TCON: timer.doc TSC Seite 1/8
timer.doc TSC Seite 2/8
timer.doc TSC Seite 3/8
Mit dem Register TMOD wird die Betriebsart der Timer T0 und T1 eingestellt. Das Register TCON enthält Steuerbits, mit denen der Betrieb angehalten und gestartet werden kann: TR0 und TR1 (Run-Bits) und Steuerbits, die einen Zählerüberlauf signalisieren: TF0 und TF1 (Overflow oder Interruptbits); Grundsätzlich zählen die Timer Zählimpulse, die entweder vom internen Quarzoszillator stammen oder am Anschlusspin T0/T1 (P3.4 / P3.5) angelegt werden. Das Bit C/T bestimmt die Signalquelle: 1 = Zählerbetrieb (Quelle ext. Anschluss) 0 = Zeitgeberbetrieb (Quelle fosz/12) Die Impulse werden in den 8-Bit-Zählregistern TH0/TH1 und TL0/TL1 gezählt. Die Zählregister werden auf einen Anfangswert initialisiert und dann mit jedem eintreffenden Impuls im Zählerstand um 1 erhöht. Bei Überlauf des Zählregisters über den maximalen Wert hinaus, wird das Overflowbit TF0/TF1 gesetzt. In diesem Kurs wollen wir die Timerbaugruppen in den Betriebsarten 1 und 2 als Zähler und Zeitgeber programmieren. Beispiel 1: Timer T0 soll als Zähler programmiert werden. Der Zählerstand soll am Port P1 binär ausgegeben werden: Assembler C Bemerkung anl TMOD,#0f0h TMOD=(TMOD&0xf0) 0x5; T0 Betriebsart 1(16-Bit) als orl TMOD,#5 Zähler mov TH0,#0 TH0=0; Anfangszählerstand =0 mov TL0,#0 TL0=0; setb TR0 TR0=1 T0 starten neu: mov P1,TL0 Do { P1=TL0; In einer Endlosschleife den jmp neu }while(1); Zählerstand an Port P1 ausgeben timer.doc TSC Seite 4/8
Beispiel 2: Es sollen auf 20 Zählimpulse gewartet werden: Assembler C Bemerkung anl TMOD,#0f0h TMOD=(TMOD&0xf0) 0x5; T0 Betriebsart 1(16-Bit) als orl TMOD,#5 Zähler mov TH0,#236 TH0= 236; Anfangszählerstand = mov TL0,#255 TL0= 255; 0xffff -19 setbtr0 TR0= 1 T0 starten warten: jnb TF0,warten while(!tf0); Nach 20 Zählimpulsen clr P1.0 P1.0=0; setze P1.0=0 timer.doc TSC Seite 5/8
Beispiel 3: Es soll die Frequenz eines Rechteckgenerators gemessen werden. Dabei wird ein 1 Hz-Rechtecksignal als Torzeit am Port P1.0 ausgewertet. Der Rechteckgenerator, dessen Frequenz gemessen werden soll ist am externen Eingang von T0 angeschlossen: Assembler C Bemerkung anl TMOD,#0f0h TMOD=(TMOD&0xf0) 0x5; T0 Betriebsart 1(16-Bit) als orl TMOD,#5 Zähler neu: do{ Anfangszählerstand = 0 mov TH0,#0 TH0=0; mov TL0,#0 TL0=0; w1: jnb P1.0,w1 while(!p1.0); Warten auf negative w2: jb P1.0,w2 while(p1.0); Flanke (Torzeit) setb TR0 TR0=1 T0 starten w3: jnb P1.0,w3 while(!p1.0); Warten auf negative w4: jb P1.0,w4 while(p1.0); Flanke (Torzeit) mov 30,TL0 frequenz=tl0; Frequenz auslesen und...... weiterverarbeiten jmp neu } while(1); Neue Messung timer.doc TSC Seite 6/8
Beispiel 4: Im nachfolgenden Beispiel wird der Timer T0 aus Zeitgeber programmiert. Bei einer Quarzfrequenz von 11.0592 MHz /12 ergeben sich 921 600 Takte pro Sekunde. Es soll eine Wartezeit von einer Sekunde programmiert werden. Der Timer T0 soll als Zeitgeber im Auto-Reload-Betrieb genutzt werden. Assembler C Bemerkung unsigned int var1; 16-Bit-Variablen anlegen mov r1,#0 var1=0 Variablen initialisieren mov r2,#0 anl TMOD,#0f0h TMOD=(TMOD&0xf0) 0x2; T0 Betriebsart 2(8-Bit) als orl TMOD,#5 Timer (AutoReload) mov TH0,#56 TH0=56; Anfangszählerstand = 0 mov TL0,#56 TL0=56; Soll 200 Takte zählen w0: setb TR0 TR0 = 1; T0 starten w1: jnb TF0,w1 do{ while(!tf0); clr TF0 TF0 = 0; inc r1 var1++; cjne r1,#64,w1 } while (var1 < 4608); 72*64=4608 mov r1,#0 Var1=0; Das Programm von w0 bis inc r2 TR0=0; w2 dauert 1 Sekunde cjne r2,#72,w1 72*64*200 = 921600 w2: mov r2,#0 timer.doc TSC Seite 7/8
timer.doc TSC Seite 8/8