Der Basic-Timer ist nicht auf allen MSP430-Varianten verfügbar. Zum Einsatz kommt er zum Beispiel auf dem MSP430F449. Er ist ein Relikt aus den ersten Modellen des MSP430 und im Vergleich zum Timer A/B auch längst nicht so leistungsfähig. Trotzdem ist auch er ein universeller Zeitgeber, mit dem man z.B. Kalender- und Uhr-Funktionen realisieren kann.
Mit Hilfe des Basic-Timer-Control-Registers (Bild 4.14), dem BTCTL, lässt sich der Basic-Timer konfigurieren.
Mit BTSSEL und BTDIV wird festgelegt, von welcher Taktquelle - Sub-Main- Clock (SMCLK) oder der Auxiliary-Clock (ACLK) - der Basic-Timer, genauer das Zählregister BTCNT2, gesteuert wird. Die Auflistung der jeweiligen Bit-Einstellungen ist Tabelle 4.12 zu entnehmen.
BTSSEL | BTDIV | Taktquelle |
0 | 0 | ACLK |
0 | 1 | ACLK / 256 |
1 | 0 | SMCLK |
1 | 1 | ACLK / 256 |
Der Basic-Timer verfügt über zwei mal acht Bit breite Zählerregister BTCNT1 und BTCNT2, die beim Interrupt-Aufruf des Timers inkrementiert werden. Mit Hilfe des BTHOLD-Flags im BTCTL-Register lässt sich der Timer stoppen. Ist das Flag gelöscht, zählt der Timer weiter. Ist das Flag gesetzt, wird das Register BTCNT2 nicht mehr verändert. Wenn BTDIV zudem noch gesetzt ist, wird darüber hinaus auch BTCNT1 nicht mehr verändert.
Mit den Bits BTIPx lässt sich die Interrupt-Frequenz des Timers steuern. Wenn alle Bits gelöscht sind, ist die Interrupt-Frequenz halb so groß wie die Frequenz der zugewiesenen Taktquelle. Sind dagegen alle Bits gesetzt, so ist die Interrupt-Frequenz 256 mal kleiner als die Frequenz der Taktquelle. Aus Tabelle 4.13 sind alle möglichen Interrupt-Frequenzen für den Betrieb des Basic-Timers mit SMCLK = 1,048MHz (DIV = 0, BTSSEL = 1) zu entnehmen.
Neben dem Betrieb mit der Sub-Main-Clock SMCLK, kann der Basic-Timer auch durch einen 32kHz Quarz, verknüpft mit der Auxiliary-Clock ACLK, betrieben werden. Dafür muss, wie aus Tabelle 4.12 zu entnehmen ist, BTSSEL = 0 gesetzt werden. Mit BTDIV wird der Takt durch eins (BTDIV = 0) oder 256 (BTDIV = 1) vorgeteilt. Die Interrupt-Frequenz kann wie beim Betrieb mit der Sub-Main-Clock durch die BTIPx-Bits eingestellt werden (Tabelle 4.14).
BTIP2 | BTIP1 | BTIP0 | Interrupt-Frequenz |
0 | 0 | 0 | 524.288kHz 1) |
0 | 0 | 1 | 262.144kHz 1) |
0 | 1 | 0 | 131.072kHz 1) |
0 | 1 | 1 | 65.536kHz 1) |
1 | 0 | 0 | 32.768kHz |
1 | 0 | 1 | 16.348kHz |
1 | 1 | 0 | 8192Hz |
1 | 1 | 1 | 4096Hz |
Der Basic-Timer eignet sich nicht nur zur Programmierung einer internen Echtzeituhr, sondern ist z.B. auch in der Lage die Wiederholrate (bzw. Aktualisierungsrate) eines LC-Displays zu steuern. Die LCD-Frequenz lässt sich mit Hilfe der Bits BTFRFQx, die einem Software-Teiler zwischen 32 und 256 entsprechen, einstellen.
BTIP2 | BTIP1 | BTIP0 | Interrupt-Frequenz, | Interrupt-Frequenz, DIV = 1 |
0 | 0 | 0 | 16.348kHz | 64Hz |
0 | 0 | 1 | 8192Hz | 32Hz |
0 | 1 | 0 | 4096Hz | 16Hz |
0 | 1 | 1 | 2048Hz | 8Hz |
1 | 0 | 0 | 1024Hz | 4Hz |
1 | 0 | 1 | 512Hz | 2Hz |
1 | 1 | 0 | 256Hz | 1Hz |
1 | 1 | 1 | 128Hz | 0.5Hz |
Der Timer verfügt über zwei jeweils acht Bit breite Zählerregister. Bild 4.15 verdeutlich deren Aufbau.
Das acht Bit breite Zählerregister BTCNT1 kann per Software vom Entwickler gelesen und beschrieben werden. Damit kann man zum Beispiel eine Zeitmessung entwickeln, indem zu Beginn der Messung der Timer mit 0 initialisiert wird und man am Ende der Messung den Wert von BTCNT1 auswertet. Das Zählerregister BTCNT1 wird unabhängig davon, aus welcher Taktquelle die Interrupt-Frequenz des Basic-Timers abgeleitet wird, immer mit der Auxiliary-Clock ACLK verknüpft. Das heißt, dass bei jedem Taktimpuls der Taktquelle ACLK BTCNT1 inkrementiert wird. Bei einer ACLK-Frequenz von 32.768kHz erhält man mit dem BTCNT1-Register eine Auflösung von etwa 31μs. Die Inkrementierung und damit der Zählvorgang kann gestoppt werden, indem man das Flag BTHOLD und BTDIV im Register BTCTL setzt.
Anders als BTCNT1 kann man das Zählerregister BTCNT2 neben der Auxiliary-Clock auch mit der Sub- Main-Clock verknüpfen. Auf das Register lässt sich wie beim BTCNT1-Register per Software lesend oder schreibend zugreifen. Um den Zählvorgang im Register zu stoppen, muss das BTHOLD-Flag im Register BTCTL gesetzt werden. Die gestoppte Inkrementierung von BTCNT2 eignet sich zur Reduzierung des Energieverbrauchs.
Ein Nachteil der Zeitmessung mit dem BTCNT1-Zählerregister ist die Tatsache, dass man bei einer Auxiliary-Clock-Frequenz von 32.768kHz als längste messbare Zeit gerade einmal 7.8ms erfassen kann. Eine Lösung bietet die Kombination der beiden Zählerregister BTCNT1 und BTCNT2. Dazu muss BTCNT2 so initialisiert werden, dass das Register bei jedem 256igsten Taktimpuls der Auxiliary-Clock inkrementiert wird, da BTCNT1 ja immer mit der Taktquelle ACLK verknüpft ist. Hierfür muss das Flag BTDIV im Register BTCTL gesetzt werden. Die Einstellung von BTSSEL ist optional, wie man aus Tabelle 4.12 entnehmen kann.
Bei einer Zeitmessung stehen dann die oberen acht Bits des Messwerts im Register BTCTN2. Die unteren acht Bits können aus Register BTCNT1 gelesen werden. Damit kann eine maximale Zeit von 2s mit einer Genauigkeit von etwa 31μs bei einer ACLK-Frequenz von 32.768kHz gemessen werden.