Computersysteme wie der MSP430 verarbeiten Maschinenbefehle schrittweise. Dazu benötigen sie so genannte Taktgeneratoren und Taktquellen, aus denen sich die Betriebsfrequenz des Mikroprozessors ableitet. Die Abarbeitung der Befehle erfolgt dabei nach dem Fließbandprinzip, wobei die einzelnen Arbeitsschritte eines Befehls immer innerhalb eines Taktes durchgeführt werden. Da der MSP430 auf der RISC-Technologie basiert, wurde beim Design des Mikroprozessors darauf geachtet, dass die meisten Befehle innerhalb weniger Takte komplett ausgeführt werden.
Fast alle MSP430-Varianten verfügen über zwei unabhängig von einander arbeitende Taktgeneratoren. Sie erzeugen die physikalischen Impulse, auf denen die Taktquellen basieren, die wir etwas später kennenlernen werden.
Die Betriebsfrequenz dieser Taktgeneratoren wird beim LFXT1 und beim XT2 durch die externe Beschaltung des Mikrochips mit einem Quarzoszillator an den Eingängen XIN und XOUT bzw. XT2IN und XT2OUT bestimmt. Das Frequenzspektrum des DCOs definiert sich entweder durch einen im Chip integrierten festen Widerstand oder durch einen externen Widerstand am Eingang P2.5/Rosc. Mittels Steuerbits lässt sich dann die gewünschte Frequenz einstellen. Bild 3.1 fasst die Taktgeneratoren des MSP430-Mikrocontrollers in einem Blockschaltbild zusammen.
Die Steuerung und Einstellung aller Optionen des Basic-Clock-Moduls erfolgt in den Registern BCSCTL1, BCSCTL2 und DCOCTL. Die folgenden Grafiken geben eine Übersicht über die Registerbelegung wieder. Die Funktion der einzelnen Bits wird in den anschließenden Unterkapiteln dann noch spezifisch diskutiert.
Als Erstes wollen wir uns nun mit dem bereits im Prozessor eingebauten Taktgenerator beschäftigen, dem DCO (Digital Controlled Oscillator). Dieser basiert auf einem RC-Ringoszillator und benötigt von sich aus keine externen Komponenten. Mit dem im Chip integrierten Widerstand (etwa 300kΩ groß) sind Taktfrequenzen im Bereich von etwa 80kHz bis 5MHz möglich. Zur temperaturstabilen Einstellung der Frequenz kann alternativ auch ein externer Widerstand an P2.5/Rosc angeschlossen werden.
Direkt nach dem Reset läuft der Prozessor erstmal mit dem eingebauten DCO bei einer mittleren Frequenz los. Das hat den Vorteil, dass immer und sicher ein Prozessortakt da ist, der eine Programmbearbeitung möglich macht. So kann dann die Prozessorinitialisierung durchlaufen werden, in deren Verlauf dann eine andere Frequenz oder gar ein anderer Taktgenerator ausgewählt werden kann.
Frequenzeinstellung mit dem internen Widerstand Mit dem internen Widerstand lassen sich wie schon gesagt Betriebsfrequenzen im Bereich von 80kHz bis etwa 5MHz erzeugen. Mit Hilfe der Steuerbits RSELx aus dem Basic- Clock-System-Control-Register 1 (BCSCTL1) lässt sich einer von ingesamt acht Frequenzbereichen auswählen. Es müssen also drei Bits gesetzt werden (23 = 8). Aus dem selektierten Frequenzbereich wählt man dann zur Feinabstimmung mit den DCOx-Steuerbits aus dem DCO-Control-Register (DCOCTL) eine von acht Frequenzen aus. Wie bei den RSELx-Bits werden daher auch bei den DCOx-Bits drei Bits benötigt. Der Anwender kann also ingesamt 64 verschiedene Frequenzen, ausgehend von der Grundfrequenz, wählen. Die Grundfrequenz wird durch den internen oder externen Widerstand bestimmt.
Die Standard-Einstellungen beim Reset des Mikroprozessors wählen mit RSELx = 4 und DCOx = 3 eine mittlere Betriebsfrequenz (etwa 800kHz) aus.
Initialisierung der Frequenz: Um die Betriebsfrequenz des DCOs festzulegen, muss zunächst ein Frequenzbereich mit Hilfe des Registers BCSCTL1 festgelegt werden. Die Programmierumgebung kennt dafür vordefinierte Konstanten RSEL0 = 0x01, RSEL1 = 0x02 und RSEL2 = 0x04. Danach legt man im DCO-Control-Register (DCOCTL) die gewünschte Betriebsfrequenz fest. Auch in diesem Fall sind im Programmiersystem wieder die Konstanten DCO0 = 0x20, DCO1 = 0x40 und DCO2 = 0x80 vordefiniert. Die Konstanten sind im Gegensatz zu RSELx anders definiert, weil sie an 6., 7. und 8. Stelle im Register liegen.
| Bild 3.5.: | Frequenzbereiche, die sich in Abhängigkeit von den Registereinstellungen ergeben [Tex06c]. |
Bild 3.5 skizziert die Frequenzbereiche in Abhängigkeit von den Registereinstellungen.
Zur exakten Feinjustierung lässt sich im DCOCTL-Register mit den MODx-Bits darüber hinaus noch eine von 32 Zwischenfrequenzen zwischen der nächstniedrigeren und der nächsthöheren (je nach Einstellung von DCOx) auswählen. Konkret wird mit diesen Bits ausgewählt, wie oft innerhalb von 32 DCO Taktzyklen die nächsthöhere DCO-Frequenz verwendet wird. Die resultierende mittlere Taktfrequenz berechnet sich aus Gleichung 3.1.
![]() | (3.1) |
Die Verwendung dieser Modulationsfunktion ist im Allgemeinen nur dann notwendig, wenn aus dem Systemtakt eine absolute Frequenz mit größerer Genauigkeit abgeleitet werden muss (z.B. für die Einstellung einer Baudrate der RS232-Schnittstelle oder eine Echtzeituhr). Eine Beispielsequenz für die Frequenzeinstellung veranschaulicht Listing 3.1.
| Listing 3.1: | Frequenzeinstellung des DCOs |
Frequenzeinstellung mit dem externen Widerstand Das Datenblatt des MSP430 gibt an, dass bei der Verwendung eines externen Widerstands mit dem Wert von 100kΩ eine Betriebsfrequenz von bis zu 10MHz eingestellt werden kann. Allerdings sollte man hierbei beachten, dass der Mikrocontroller nur bis zu einer, von der Versorgungsspannung abhängigen, maximalen Taktfrequenz sicher betrieben werden kann. Darüber hinaus können thermische aber auch so genannte „Timing-Probleme“ zu nicht vorhersagbaren Ausführungsfehlern führen. Einen Überblick über den zulässigen Bereich am Beispiel des MSP430F1612 gibt Bild 3.6. Diese Limitierung gilt im Übrigen auch für alle anderen Arten der Takterzeugung.
| Bild 3.6.: | Maximal zulässige Taktfrequenz in Abhängigkeit der Versorgungsspannung für die MSP430F16xx-Typen [Tex04]. |
Der Strom durch den externen Widerstand legt dabei die Grundfrequenz des MSP430 fest. Schaltung 3.7 veranschaulicht den Anschluss eines 100kΩ-Widerstands an den Controller. Nach dem Anschluss des externen Widerstands erfolgt die Initialisierung der Betriebsfrequenz auf die gleiche Weise wie beim internen Widerstand. Zusätzlich muss mit dem DCOR-Flag im BCSCTL2-Register (Bild 3.3) ausgewählt werden, ob der DCO auf der Basis des internen (DCOR = 0) oder des externen (DCOR = 1) Widerstands arbeiten soll.
DCO abschalten Die Steuerlogik zur Kontrolle des DCO umfasst auch einen Teil, der festlegt wie dieser abgeschaltet werden kann. Das zugehörige Blockschaltbild ist in Bild 3.8 dargestellt.
Wie schon in Kapitel 3.1.6 im Detail gezeigt, werden diese verschiedenartigen Abschaltfunktionen zur Aktivierung der verschiedenen Low-Power-Modes verwendet. Wird der DCO nicht benötigt, kann er durch Setzen des Bits SCG0 im Statusregister abgeschaltet werden.
| Listing 3.3: | DCO abschalten |
Dabei sollte man allerdings darauf achten, vorher auf einen anderen Oszillator umgeschaltet zu haben, denn sonst hält die Programmausführung an und der Prozessor ist nur durch einen Reset wiederzubeleben.
Temperaturabhängigkeit des DCOs Ein Nachteil des DCOs ist die hohe Temperaturabhängigkeit der Frequenz. Bei der Verwendung des internen Widerstands erhält man eine Genauigkeit von etwa 20%. Durch einen externen Widerstand kann die Genauigkeit dagegen auf 5% verbessert werden. Bild 3.9 skizziert die Temperaturabhängigkeit des Digitally- Controlled-Oscillators.
| Bild 3.9.: | Temperaturabhängigkeit des DCOs für den Betrieb mit einem internen (internal) Widerstand und einem externen (external) Widerstand [Tex06c]. |
Zusammenfassung Der DCO ist ein digital steuerbarer leistungsstarker Taktgenerator. Besonders sinnvoll ist er beim Einsatz in platzsparenden Anwendungen, wo kein Quarzoszillator verbaut werden kann. Der entscheidende Nachteil des DCOs ist das Problem, dass man aufgrund von Temperaturschwankungen und Fertigungstoleranzen mit instabilen Betriebsfrequenzen arbeitet. Mit einem externen Widerstand ist es möglich, diese Schwankungen zu verringern.
Quarzoszillatoren bestehen aus Siliziumdioxid (Si02), einem piezoelektrischen Werkstoff. Legt man an sie ein elektrisches Feld an, werden sie zu einer mechanischen Schwingung angeregt. Im Vergleich zu anderen Schwingkreisen zeichnet sich ein Quarzoszillator durch eine hohe Güte und Frequenzstabilität sowie eine geringe Temperaturabhängigkeit aus.
Das elektrische Ersatzschaltbild eines Quarzoszillators ist in Schaltung 3.10 dargestellt.
C und L sind durch die mechanischen Eigenschaften des Quarzes definiert. C0 ist eine parasitäre Kapazität, die abhängig von den Zuleitungen ist. Insbesondere Quarze mit einer niedrigen Frequenz, wie Uhrenquarze, benötigen bis zu einigen Millisekunden, bis sie eingeschwungen sind. Unnötig lange Zuleitungen vergrößern die Einschwingzeit sowie die kapazitive Last des Quarzoszillator-Treibers. Aus diesem Grund sollten Quarze immer in unmittelbarer Nähe zum Takteingang platziert werden.
Extern angeschlossene Quarze sind eine Alternative zum DCO. Diese werden am Anschluss LFXT1 betrieben. Einige MSP430-Varianten verfügen mit dem Pin XT2 über einen weiteren Taktgenerator zum Anschluss eines Quarzes. Der Anschluss von LFXT1 ist so ausgelegt, dass sowohl niederfrequent als auch hochfrequent schwingende Quarze direkt angeschlossen werden können. An XT2 können nur hochfrequent schwingende Quarze angeschlossen werden. Niederfrequent schwingende Quarze sind so genannte Uhrenquarze, die mit einer Frequenz von 32.768kHz arbeiten. Mit dieser Betriebsfrequenz arbeitet der Mikroprozessor sehr energiesparend. Als höherfrequente Quarze eigenen sich solche, die mit Frequenzen zwischen 450kHz bis 8MHz arbeiten.
Der Anschluss eines Quarzes ist beispielhaft für den Taktgenerator LFXT1 in Schaltung 3.11 dargestellt. Damit sich der Quarz stabil und sicher auf seiner Sollfrequenz einschwingt ist es günstig, beide Anschlüsse mit einem kleinen Kondensator (z.B. 15pF) an Masse anzubinden. Bei 32kHz-Uhrenquarzen wird zusätzlich empfohlen, den Pin XOUT mit einem 5,1MΩ Widerstand an V CC anzukoppeln.
Der Mikroprozessor ist allerdings nicht in der Lage selbstständig zu erkennen, ob ein niederfrequent oder hochfrequent schwingender Quarz angeschlossen wurde. Aus diesem Grund muss der Programmierer das Auswahlbit XTS im Register BCSCTL1 setzen oder löschen. 3.1
Wenn man den MSP430 mit einem externen Quarz betreiben will, muss man hierfür diesen zunächst aktivieren. Wie beim DCO gibt es auch für LFXT1 und XT2 eine komplexe Logik, die den Oszillator an- und abschaltet, Bild 3.12.
| XTS | Modus |
| 0 | LF-Modus (zum Betrieb eines 32.768kHz Uhrenquarzes) |
| 1 | HF-Modus (Quarz mit 450kHz bis 8MHz) |
| Tabelle 3.1.: | Das Auswahlbit XTS zur Wahl des Oszillator-Modus |
Zur Aktivierung muss für Oszillator LFXT1 das Bit OSCOFF im Statusregister gelöscht werden, für den Oszillator XT2 ist das Bit XT2OFF im BCSCTL1-Register zu löschen.
Alternativ kann der MSP430 auch aus externen Taktgeneratoren wie z.B. einem anderen Prozessor oder einem integrierten Oszillatorbaustein gespeist werden. Dazu muss dieser einfach nur an den Pin XIN oder XT2IN angeschlossen werden. Mit dieser Beschaltung verliert man aber auch die Option, den Prozessor in einen Low-Power-Mode zu versetzen (zumindest wenn man die internen Taktquellen nicht aus dem DCO speist). Die Pins XOUT und XT2OUT verbleiben bei dieser Option unbeschaltet.
Zur Überwachung des Zustandes der Quarzoszillatoren hat der MSP430 eine komplexe Fehlerüberwachung integriert. Quarzoszillatoren benötigen bis zu 10μs, bis sie eingeschwungen sind, niederfrequente Quarze sogar einige hundert Millisekunden. In dieser Zeit würde der Mikrocontroller in keinem stabilen Betriebszustand arbeiten. Bei der Verwendung von hochfrequenten Quarzen sollte man durch die Taktfehlererkennung mit der Abschaltung des DCOs so lange warten, bis sich ein stabiler Arbeitspunkt eingestellt hat. Diese Methode eignet sich jedoch nicht für niederfrequente Uhrenquarze.
Der Mikrocontroller ist in der Lage, zu jeder Zeit den Ausfall des LFXT1-Taktes oder des XT2-Taktes für 50μs festzustellen (dies funktioniert nicht für LFXT1 bei niederfrequenten Quarzen). Bei einer Taktfehlererkennung wird das Flag OFIFG im Interrupt-Register IFG1 gesetzt. Solange das OFIFG-Flag gesetzt ist, wird der Prozessortakt (MCLK, siehe Kapitel 3.2) aus dem DCO gespeist. Erst wenn der Controller keinen Taktfehler mehr erkennt, läuft der Oszillator und man kann dann die Taktquelle umschalten. Beispiel 3.4 verdeutlicht die Vorgehensweise bei der Taktfehlererkennung.
| Listing 3.4: | Anschalten des Quarzes mit Taktfehlererkennung |
Wir müssen nach der Initialisierung des Taktgebers (in diesem Fall LFXT1 im HF-Modus) eine Schleife programmieren, die so lange durchlaufen wird, bis kein Taktfehler mehr erkannt wird (also das Flag OFIFG gelöscht ist). In der Schleife löschen wir dazu zunächst das Flag OFIFG. Sollte der Quarz noch nicht eingeschwungen sein, wird der Controller innerhalb von 50μs OFIFG wieder setzen. Daher fügen wir eine 50μs-Pause durch die FOR-Schleife ein. Jetzt können wir das Interrupt-Register IFG1 erneut auf das Flag OFIFG abfragen. Wenn OFIFG gesetzt sein sollte, ist der Quarz noch nicht eingeschwungen. Wird OFIFG nicht mehr gesetzt, arbeitet der Controller mit einer stabilen Quarzfrequenz. Jetzt können wir den DCO ausschalten.
Eine der wesentlichen Eigenschaften der MSP430-Familie ist die hervorragende Energieeffizienz des
Prozessorkerns. So gibt Texas Instruments beispielsweise im Datenblatt zum MSP430F149 den
Energieverbrauch mit 280μA bei 1MHz und 2.2V an. Somit könnte ein so betriebener Prozessor
ohne weitere Maßnahmen ein Jahr aus zwei modernen NiMH-Mignon-Akkus versorgt
werden. Bei Ausnutzung der verschiedenen Stromsparfunktionen des Prozessors kann
dies weiter auf 1.1μA im Standby-Mode und 0.2μA im niedrigsten Stromsparmodus
reduziert werden. Dies kommt leicht in eine Größenordnung, in der normale Batterien ihre
Selbstentladung haben. Ein sinnvoller Entwurf von Low- Power-Systemen ist auf der
anderen Seite auch kein leichtes Unterfangen. Ein einziges schlecht dimensioniertes Bauteil
macht das ganze Design zunichte. Beispielsweise fließt bei einem Widerstand mit 4.7kΩ
bei 3V schon ein Strom von 600μA. Also doppelt so viel, wie der Prozessor bei voller
Rechenleistung benötigt! In Kapitel 9 werden wir zum Thema Low-Power-Design noch
einige weitere Design-Hilfen erläutern. Eine Bilanz der Stromaufnahme ist in Bild 3.13
skizziert.
Die Kontrolle des Betriebszustandes erfolgt durch Setzen entsprechender Bits im Statusregister. Abhängig von den Einstellungen werden verschiedene Elemente des Basic-Clock-Moduls aktiviert oder deaktiviert. Welche Konsequenzen dies auf die konkrete Funktion des Mikrocontrollers hat, ist abhängig davon, aus welchen Taktgeneratoren die internen Taktquellen (MCLK - Main-Clock, ACLK - Auxilliary-Clock, SMCLK - Sub-System-Clock) gespeist werden. Details dazu folgen in Kapitel 3.2.
Der Prozessor kennt insgesamt sechs Betriebszustände.
Mit diesem Hintergrund kann nun Tabelle 3.2 verstanden werden, die die verschiedenen Energiesparmodi und die zugehörige Registerstellung zeigt.
| Tabelle 3.2.: | Low-Power-Modi und Auswahl durch das Statusregister |
| SCG1 | SCG0 | OSCOFF | CPUOFF | Mode | Erklärung |
| 0 | 0 | 0 | 0 | Active | Alle System-Taktgeber sind in Funktion |
| 0 | 0 | 0 | 1 | LPM0 | CPU und MCLK aus, SMCLK und ACLK aktiv, DC-Generator an |
| 0 | 1 | 0 | 1 | LPM1 | CPU, MCLK und DCO aus, SMCLK und ACLK aktiv, DC-Generator aus, wenn DCO nicht für SMCLK oder MCLK genutzt wird |
| 1 | 0 | 0 | 1 | LPM2 | CPU, MCLK, SMCLK und DCO aus, ACLK aktiv, DC-Generator an |
| 1 | 1 | 0 | 1 | LPM3 | CPU, MCLK, SMCLK und DCO aus, ACLK aktiv, DC-Generator aus |
| 1 | 1 | 1 | 1 | LPM4 | alles aus |
Werden die entsprechenden Statusregister für einen Low-Power-Mode gesetzt, tritt die Wirkung sofort ein. Die Abarbeitung des Programms wird sofort unterbrochen und die CPU sowie die Main- Clock (MCLK) werden abgeschaltet. Der einzige Weg einen Energiesparmodus wieder zu verlassen, ist ein Power-On-Reset (POR), ein Reset durch den Watchdog-Timer (PUC), ein sogenannter NMI-Interrupt, sowie ein anderweitig ausgelöster interner oder externer Interrupt.
Mit Hilfe der Tabelle 3.2 können wir nun den Controller in einen entsprechenden Energiesparmodus versetzen. Im Listing 3.5 wird der besonders energiesparende Modus LPM4 ausgewählt.
| Listing 3.5: | Energiesparmodus LPM4 |
Im LPM4-Modus lässt sich der Controller nur durch die Interrupts der digitalen I/O-Ports in den Active-Mode zurücksetzen. Aus diesem Grund wurde im Beispiel 3.5 der Byteport P1 als Interrupt-Port definiert. Bei einer steigenden Flanke wird ein Interrupt ausgelöst und die Interrupt-Service-Routine Port_1() ausgeführt. An dieser Stelle wird der Controller dann wieder in den Active-Mode geschaltet. Nach getaner Arbeit geht der Prozessor bei der Beendigung der Interrupt-Routine wieder schlafen und erwartet den nächsten Interrupt. Möchte man den Low-Power-Mode explizit verlassen oder ändern (um z.B. Tasks in der Hauptschleife zu erledigen), so muss man dies in der Interrupt-Routine mit dem Macro LPM4_EXITveranlassen.