Eingebettete Systeme - Timer / Zähler
EIN timerist ein spezieller Uhrentyp, mit dem Zeitintervalle gemessen werden. Ein Timer, der zur Messung der verstrichenen Zeit von Null aufwärts zählt, wird häufig als a bezeichnetstopwatch. Es ist ein Gerät, das ab einem bestimmten Zeitintervall herunterzählt und zum Generieren einer Zeitverzögerung verwendet wird. Beispielsweise ist eine Sanduhr ein Timer.
EIN counterist ein Gerät, das speichert (und manchmal anzeigt), wie oft ein bestimmtes Ereignis oder ein bestimmter Prozess in Bezug auf ein Taktsignal aufgetreten ist. Es wird verwendet, um die Ereignisse außerhalb des Mikrocontrollers zu zählen. In der Elektronik können Zähler recht einfach unter Verwendung von Registerschaltungen wie einem Flip-Flop implementiert werden.
Unterschied zwischen einem Timer und einem Zähler
Die Punkte, die einen Timer von einem Zähler unterscheiden, sind wie folgt:
Timer | Zähler |
---|---|
Das Register wurde für jeden Maschinenzyklus erhöht. | Das Register wird unter Berücksichtigung des Übergangs von 1 zu 0 an seinem externen Eingangspin (T0, T1) inkrementiert. |
Die maximale Zählrate beträgt 1/12 der Oszillatorfrequenz. | Die maximale Zählrate beträgt 1/24 der Oszillatorfrequenz. |
Ein Timer verwendet die Frequenz der internen Uhr und erzeugt eine Verzögerung. | Ein Zähler verwendet ein externes Signal, um Impulse zu zählen. |
Timer von 8051 und ihre zugehörigen Register
Der 8051 verfügt über zwei Timer, Timer 0 und Timer 1. Sie können als Timer oder als Ereigniszähler verwendet werden. Sowohl Timer 0 als auch Timer 1 sind 16 Bit breit. Da der 8051 einer 8-Bit-Architektur folgt, wird auf jedes 16-Bit als zwei separate Register von Low-Byte und High-Byte zugegriffen.
Timer 0 Registrieren
Auf das 16-Bit-Register von Timer 0 wird als Low- und High-Byte zugegriffen. Das Low-Byte-Register heißt TL0 (Timer 0 Low Byte) und das High-Byte-Register heißt TH0 (Timer 0 High Byte). Auf diese Register kann wie auf jedes andere Register zugegriffen werden. Zum Beispiel die AnweisungMOV TL0, #4H verschiebt den Wert in das Low-Byte von Timer # 0.
Timer 1 Registrieren
Auf das 16-Bit-Register von Timer 1 wird als Low- und High-Byte zugegriffen. Das Low-Byte-Register heißt TL1 (Low-Byte von Timer 1) und das High-Byte-Register heißt TH1 (High-Byte von Timer 1). Auf diese Register kann wie auf jedes andere Register zugegriffen werden. Zum Beispiel die AnweisungMOV TL1, #4H verschiebt den Wert in das Low-Byte von Timer 1.
TMOD-Register (Timer Mode)
Sowohl Timer 0 als auch Timer 1 verwenden dasselbe Register, um die verschiedenen Timer-Betriebsmodi einzustellen. Es ist ein 8-Bit-Register, in dem die unteren 4 Bits für Timer 0 und die oberen vier Bits für Timer reserviert sind. In jedem Fall werden die unteren 2 Bits verwendet, um den Zeitgebermodus im Voraus einzustellen, und die oberen 2 Bits werden verwendet, um den Ort anzugeben.
Gate - Wenn eingestellt, läuft der Timer nur, während INT (0,1) hoch ist.
C/T - Zähler / Timer-Auswahlbit.
M1 - Modusbit 1.
M0 - Modusbit 0.
TOR
Jeder Timer kann gestartet und gestoppt werden. Einige Timer tun dies nach Software, andere nach Hardware, und einige verfügen sowohl über Software- als auch über Hardwaresteuerung. 8051-Timer verfügen sowohl über Software- als auch über Hardwaresteuerungen. Das Starten und Stoppen eines Timers wird von der Software unter Verwendung der Anweisung gesteuertSETB TR1 und CLR TR1 für Timer 1 und SETB TR0 und CLR TR0 für Timer 0.
Der SETB-Befehl wird zum Starten verwendet und durch den CLR-Befehl gestoppt. Diese Anweisungen starten und stoppen die Timer, solange GATE = 0 im TMOD-Register ist. Timer können von einer externen Quelle gestartet und gestoppt werden, indem GATE = 1 im TMOD-Register festgelegt wird.
C / T (UHR / TIMER)
Dieses Bit im TMOD-Register wird verwendet, um zu entscheiden, ob ein Timer als verwendet wird delay generator oder ein event manager. Wenn C / T = 0 ist, wird es als Zeitgeber für die Erzeugung der Zeitgeberverzögerung verwendet. Die Taktquelle zum Erzeugen der Zeitverzögerung ist die Kristallfrequenz des 8051. Wenn C / T = 0 ist, bestimmt die an den 8051 angeschlossene Kristallfrequenz auch die Geschwindigkeit, mit der der 8051-Timer in regelmäßigen Abständen tickt.
Die Timerfrequenz beträgt immer 1/12 der Frequenz des an den 8051 angeschlossenen Kristalls. Obwohl verschiedene 8051-basierte Systeme eine XTAL-Frequenz von 10 MHz bis 40 MHz haben, arbeiten wir normalerweise mit der XTAL-Frequenz von 11,0592 MHz. Dies liegt daran, dass die Baudrate für die serielle Kommunikation des 8051.XTAL = 11.0592 es dem 8051-System ermöglicht, fehlerfrei mit dem PC zu kommunizieren.
M1 / M2
M1 | M2 | Modus |
---|---|---|
0 | 0 | 13-Bit-Timer-Modus. |
0 | 1 | 16-Bit-Timer-Modus. |
1 | 0 | 8-Bit-Auto-Reload-Modus. |
1 | 1 | Verschütteter Modus. |
Verschiedene Arten von Timern
Modus 0 (13-Bit-Timer-Modus)
Sowohl Timer 1 als auch Timer 0 im Modus 0 arbeiten als 8-Bit-Zähler (mit einem durch 32 dividierten Prescaler). Das Zeitgeberregister ist als 13-Bit-Register konfiguriert, das aus allen 8 Bits von TH1 und den unteren 5 Bits von TL1 besteht. Die oberen 3 Bits von TL1 sind unbestimmt und sollten ignoriert werden. Durch Setzen des Run-Flags (TR1) wird das Register nicht gelöscht. Das Timer-Interrupt-Flag TF1 wird gesetzt, wenn der Zähler von allen Einsen auf alle Nullen wechselt. Der Betrieb von Modus 0 ist für Timer 0 der gleiche wie für Timer 1.
Modus 1 (16-Bit-Timer-Modus)
Der Timer-Modus "1" ist ein 16-Bit-Timer und wird häufig verwendet. Es funktioniert genauso wie der 13-Bit-Modus, außer dass alle 16 Bit verwendet werden. TLx wird von 0 bis maximal 255 inkrementiert. Sobald der Wert 255 erreicht ist, wird TLx auf 0 zurückgesetzt und THx wird um 1 erhöht. Als vollständiger 16-Bit-Timer kann der Timer bis zu 65536 verschiedene Werte enthalten läuft nach 65.536 Maschinenzyklen wieder auf 0 über.
Modus 2 (8 Bit Auto Reload)
Beide Timer-Register sind als 8-Bit-Zähler (TL1 und TL0) mit automatischem Neuladen konfiguriert. Der Überlauf von TL1 (TL0) setzt TF1 (TF0) und lädt TL1 (TL0) mit dem Inhalt von Th1 (TH0) neu, der von der Software voreingestellt wird. Das Nachladen lässt TH1 (TH0) unverändert.
Der Vorteil des Auto-Reload-Modus besteht darin, dass der Timer immer einen Wert zwischen 200 und 255 enthalten kann. Wenn Sie den Modus 0 oder 1 verwenden, müssen Sie den Code einchecken, um den Überlauf zu sehen, und in diesem Fall Setzen Sie den Timer auf 200 zurück. In diesem Fall überprüfen wertvolle Anweisungen den Wert und / oder werden neu geladen. Im Modus 2 kümmert sich der Mikrocontroller darum. Sobald Sie einen Timer in Modus 2 konfiguriert haben, müssen Sie sich nicht mehr darum kümmern, ob der Timer übergelaufen ist, und Sie müssen sich auch nicht um das Zurücksetzen des Werts kümmern, da die Mikrocontroller-Hardware alles für Sie erledigt. Der Auto-Reload-Modus wird zum Festlegen einer gemeinsamen Baudrate verwendet.
Modus 3 (Split-Timer-Modus)
Der Timer-Modus "3" ist bekannt als split-timer mode. Wenn Timer 0 in Modus 3 versetzt wird, werden zwei separate 8-Bit-Timer verwendet. Timer 0 ist TL0 und Timer 1 ist TH0. Beide Timer zählen von 0 bis 255 und werden im Falle eines Überlaufs auf 0 zurückgesetzt. Alle Bits von Timer 1 werden jetzt an TH0 gebunden.
Wenn sich Timer 0 im Split-Modus befindet, kann der echte Timer 1 (dh TH1 und TL1) in den Modi 0, 1 oder 2 eingestellt werden, er kann jedoch nicht gestartet / gestoppt werden, da die Bits, die dies tun, jetzt mit TH0 verbunden sind. Der Real-Timer 1 wird mit jedem Maschinenzyklus erhöht.
Timer initialisieren
Legen Sie den Timer-Modus fest. Stellen Sie sich einen 16-Bit-Timer vor, der kontinuierlich läuft und unabhängig von externen Pins ist.
Initialisieren Sie den TMOD SFR. Verwenden Sie die niedrigsten 4 Bits von TMOD und betrachten Sie Timer 0. Behalten Sie die beiden Bits GATE 0 und C / T 0 als 0 bei, da der Timer unabhängig von den externen Pins sein soll. Da der 16-Bit-Modus der Timer-Modus 1 ist, löschen Sie T0M1 und stellen Sie T0M0 ein. Tatsächlich ist das einzige Bit, das eingeschaltet werden muss, Bit 0 von TMOD. Führen Sie nun die folgende Anweisung aus:
MOV TMOD,#01h
Jetzt befindet sich Timer 0 im 16-Bit-Timer-Modus, aber der Timer läuft nicht. Um den Timer im laufenden Modus zu starten, setzen Sie das TR0-Bit, indem Sie die folgende Anweisung ausführen:
SETB TR0
Jetzt beginnt Timer 0 sofort mit dem Zählen und wird bei jedem Maschinenzyklus einmal erhöht.
Timer lesen
Ein 16-Bit-Timer kann auf zwei Arten gelesen werden. Lesen Sie entweder den tatsächlichen Wert des Timers als 16-Bit-Zahl oder Sie erkennen, wenn der Timer übergelaufen ist.
Timerüberlauf erkennen
Wenn ein Timer von seinem höchsten Wert auf 0 überläuft, setzt der Mikrocontroller automatisch das TFx-Bit im TCON-Register. Anstatt den genauen Wert des Timers zu überprüfen, kann das TFx-Bit überprüft werden. Wenn TF0 eingestellt ist, ist Timer 0 übergelaufen. Wenn TF1 eingestellt ist, ist Timer 1 übergelaufen.