5
Vorwort
Das Buch entstand durch eine Anfrage des Franzis-Verlags an Texas Instruments/Deutschland. Ich habe es gerne geschrieben, da ich an der Entwicklung des MSP430 von der ersten Stunde an beteiligt war und auch heute noch gerne (Assembler)-Software für diese Rechnerfamilie schreibe. Der MSP430 ist eine Erinnerung an die legendäre Klarheit der PDP11-Architektur, eine Klarheit, die in den letzten Jahrzehnten immer mehr aus der Rechnerarchitektur verschwand. Mein Dank gebührt dabei besonders Herrn Stefan Schauer, der mir bei vielen Problemen erfolgreich half und den Herren Frank Forster, Horst Diewald (»der andere Vater des MSP430«) Eilhard Haseloff und Christian Speck, alle von Texas Instruments/Deutschland, ohne die es dieses Buch nicht gäbe. Erding, im August 2003
7
Inhaltsverzeichnis
1
Einleitung .................................................................................................15 1.1 1.2
2
Das MSP430-Konzept .........................................................................21 2.1 2.2 2.3 2.4 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.5 2.6 2.6.1 2.6.2 2.6.3 2.6.4
3 4
Verwendete Abkürzungen ..............................................................17 Verwendete Begriffe.......................................................................19
Warum MSP430? ...........................................................................21 Das Konzept des MSP430 .............................................................21 Von-Neumann-Architektur..............................................................24 Interrupt-Struktur ............................................................................25 Vektorisierung ................................................................................25 Unterbrechbarkeit...........................................................................26 Sicherung der Rückkehr.................................................................26 Flexibilität .......................................................................................27 Priorisierung ...................................................................................28 RISC-Architektur mit sieben Adressierungsarten...........................29 Vorteile des MSP430-Konzepts .....................................................30 Echtzeit-Fähigkeit...........................................................................30 Stabilität des System Clock Generators (FLL+) .............................31 Stack-Verarbeitung.........................................................................31 Weitere Eigenschaften ...................................................................32
Der MSP430F449 ...................................................................................33 Die Zentraleinheit .................................................................................35 4.1 4.2 4.2.1 4.2.2 4.2.3 4.2.4 4.2.5 4.3 4.4 4.4.1 4.4.2 4.4.3
Aufbau ............................................................................................35 Die Arbeitsregister..........................................................................36 Der Program Counter PC ...............................................................36 Der System Stack Pointer SP ........................................................37 Das Status Register SR .................................................................38 Der Constant Generator .................................................................40 Die Arbeitsregister R4..R15............................................................40 Wort- und Byteverarbeitung ...........................................................41 Die Adressierungsarten..................................................................43 Allgemeines zu den Adressierungsarten........................................44 Registeradressierung (Register Mode) ..........................................47 Indirekte Registeradressierung (Indirect Mode) .............................48
8
Inhaltsverzeichnis 4.4.4 4.4.5 4.4.6 4.4.7 4.4.8 4.5 4.5.1 4.5.2 4.5.3 4.5.4 4.6 4.7 4.8 4.8.1 4.8.2 4.8.3 4.8.4 4.9 4.9.1 4.9.2 4.9.3 4.9.4 4.9.5 4.10 4.10.1 4.10.2 4.11 4.11.1 4.11.2 4.11.3 4.11.4 4.11.5 4.11.6
5
Indirekte Registeradressierung mit Autoinkrement (Indirect Autoincrement Mode) .....................................................................50 Indizierte Adressierung (Indexed Mode) ........................................52 Symbolische Adressierung (Symbolic Mode).................................54 Unmittelbare Adressierung (Immediate Mode) ..............................56 Absolute Adressierung (Absolute Mode)........................................58 Die Befehlsformate.........................................................................60 Die Befehle mit zwei Operanden....................................................60 Die Befehle mit einem Operanden .................................................62 Die Sprungbefehle..........................................................................64 Die emulierten Befehle ...................................................................65 Der Befehlssatz ..............................................................................67 Der Adressraum ...........................................................................117 Die Betriebsarten für MSP430-Applikationen...............................118 Der Active Mode...........................................................................120 Der Low Power Mode 0................................................................121 Der Low Power Mode 3................................................................122 Der Low Power Mode 4................................................................125 Ausführungszeiten der Befehle ....................................................126 Schnelle Zeitabschätzung der Ausführungszeiten .......................126 Zwei-Operandenbefehle...............................................................126 Ein-Operandenbefehle .................................................................127 Sprungbefehle ..............................................................................128 Interrupt-Ausführungszeit .............................................................128 Interrupt ........................................................................................128 Ablauf eines Interrupts .................................................................128 Interrupt-Verschachtelung ............................................................130 Warum ist der MSP430 so wie er ist? ..........................................131 Was ist Orthogonalität? ................................................................131 Warum ist der MSP430 100 % orthogonal?.................................132 Warum ist die Behandlung des Status Registers nicht orthogonal? ..............................................134 Warum wird das obere Register-Byte bei Byte-Befehlen gelöscht? ..............................................................135 Warum eine RISC-Architektur mit sieben Adressierungsarten? ........................................................136 Sieben Adressierungsarten mit nur zwei Bits?.............................137
Die Peripherie-Module ......................................................................139 5.1 5.1.1 5.1.2 5.1.3 5.1.4
Der FLL+ System Clock Generator ..............................................139 Arbeitsweise der FLL+ .................................................................141 Vorteile der FLL+..........................................................................143 Die FLL+ Clock Module Control Register.....................................143 Die eingebauten Lastkapazitäten.................................................147
Inhaltsverzeichnis 5.1.5 5.1.6 5.2 5.3 5.4 5.5 5.5.1 5.5.2 5.5.3 5.5.4 5.5.5 5.6 5.6.1 5.6.2 5.6.3 5.6.4 5.7 5.7.1 5.7.2 5.8 5.8.1 5.8.2 5.8.3 5.9 5.9.1 5.9.2 5.10 5.10.1 5.10.2 5.10.3 5.11 5.11.1 5.11.2 5.11.3 5.12 5.12.1 5.12.2 5.12.3 5.13 5.13.1 5.13.2 5.13.3 5.13.4 5.14
9
Die Initialisierungs-Subroutine INITSR.........................................148 Kurzzeit-Genauigkeit des FLL+ System Clock Generator ...........149 Die FLASH-Speicher ....................................................................150 Die Information Memories A und B ..............................................151 Das RAM ......................................................................................152 Der Analog-Digital-Wandler ADC12.............................................153 Die ADC12-Hardware...................................................................153 Die Hardware-Module ..................................................................155 Beschreibung der ADC12-Hardware............................................160 Genauigkeit des 12-Bit-Analog-Digital-Wandlers.........................167 Betriebsarten des ADC12 und Anwendungsbeispiele .................168 Die digitalen Ein- und Ausgabeports............................................178 Die digitalen Ein- und Ausgabeports ohne Interrupt ....................178 Die digitalen Ein- und Ausgabeports mit Interrupt........................180 Zusatzfunktionen der Ein- und Ausgabeports ..............................182 Elektrische Eigenschaften der Ein- und Ausgabeports ................182 Die USARTs .................................................................................183 Die USART als UART ..................................................................184 Die USART als Serial Peripheral Interface (SPI) .........................186 Der Flüssigkristallanzeigen-Treiber (LCD) ...................................188 Das LCD Control Register............................................................189 Das LCD Memory.........................................................................190 Software für eine 4-fach-MUX Flüssigkristallanzeige...................191 Der Basic Timer1..........................................................................193 Der Basic Timer1 als Zeitbasis ....................................................194 Der Basic Timer1 als 16-Bit-Timer ...............................................194 Der Comparator_A .......................................................................195 Eigenschaften und Funktion des Comparator_A .........................196 Die Comparator_A Control Register ............................................197 Schnelle Datenerfassung .............................................................198 Das SVS-Modul, Reset und die Brownout-Erkennung.................200 Das Spannungsüberwachungs-Modul (SVS)...............................201 Die Reset-Funktion.......................................................................202 Die Brownout-Erkennung .............................................................203 Der Timer_A .................................................................................203 Die Timer_A-Hardware.................................................................203 Die Betriebsarten des Timer_A ....................................................211 Die Output Units ...........................................................................218 Der Timer_B .................................................................................221 Die Timer_B-Hardware.................................................................221 Vergleich von Timer_B und Timer_A ...........................................222 Arbeitsaufteilung für Timer_A und Timer_B .................................226 Modifizierung von Timer_A-Software für den Timer_B ................227 Der Watchdog Timer ....................................................................228
10
Inhaltsverzeichnis 5.15 5.15.1 5.15.2 5.15.3 5.15.4 5.15.5 5.15.6
6
ARBEITSSCHRITTE FÜR EIN MSP430-PROJEKT ...............241 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 6.11 6.12
7
Arbeitsdefinition............................................................................241 Auswahl des MSP430 ..................................................................242 Zeitbetrachtung unter »Worst Case«-Bedingungen.....................243 Zeichnen eines kompletten Schaltplans.......................................244 »Worst Case«-Entwurf aller externen Komponenten...................244 Organisation des RAM und des Information Memory ..................245 Zeichnen des Flussdiagramms für die komplette Software .........246 Codieren der Software mit einem Editor ......................................247 Assemblieren und Linken mit dem IAR-Assembler......................249 Berichtigung der gefundenen Fehler............................................249 Test der Software mit dem CSPY-Simulator................................249 Entwicklung der Hardware und der Platine ..................................250
Stromversorgung ...............................................................................251 7.1 7.2 7.3 7.3.1 7.3.2 7.4 7.5
8
Der Hardware-Multiplizierer..........................................................230 Funktion des Hardware-Multiplizierers.........................................231 Hardware und Register ................................................................231 Implementierte Multiplikationen....................................................234 Assembler-MACROs ....................................................................237 Benutzung des Interrupts .............................................................238 Geschwindigkeitsvergleiche .........................................................239
Batteriegespeiste MSP430-Systeme ...........................................251 Akkumulatorgespeiste MSP430-Systeme....................................252 Netzgespeiste MSP430-Systeme ................................................254 Transformatorspeisung ................................................................254 Kondensatornetzteile....................................................................256 Speisung aus anderen System-Gleichspannungen .....................259 Speisung über Glasfiberkabel ......................................................261
Software..................................................................................................263 8.1 8.2 8.3 8.3.1 8.3.2 8.3.3 8.3.4 8.4 8.4.1 8.4.2 8.4.3 8.5
Programmaufbau..........................................................................263 Verwendung von Status für den Programmablauf .......................264 Integer-Rechenroutinen................................................................265 Wurzelprogramm für 32-Bit-Integerzahlen ...................................265 Zufallszahlen-Generator...............................................................268 Multiplikationssubroutinen 16 x 16 Bit..........................................270 Schnelle Quadrierung...................................................................272 Gleitkommapaket FPP4 ...............................................................274 Beschreibung des FPP4...............................................................274 Installation des Gleitkommapaketes FPP4 ..................................279 Einsetzen des Gleitkommapaketes FPP4 in die Source..............280 Verwendung von Assembler-Software in C-Programmen ...........281
Inhaltsverzeichnis 8.5.1 8.5.2 8.5.3
9
11
Austausch von Variablen zwischen C und Assembler Code .......281 Aufruf von Assemblerroutinen von C-Programmen aus...............283 Softwarebeispiele .........................................................................284
APPLIKATIONEN ................................................................................291 9.1 9.2 9.3
Dreiphasen-Elektrizitätszähler .....................................................291 Gaszähler .....................................................................................294 Elektronische Sicherung...............................................................296
10 Das IAR-Entwicklungswerkzeug .................................................301 10.1 10.2 10.3 10.4 10.5 10.5.1 10.5.2 10.5.3 10.5.4 10.5.5 10.5.6 10.5.7 10.5.8 10.5.9 10.6 10.7 10.8
Anschluss der Hardware an den Personal Computer ..................301 Installation der IAR-Software .......................................................302 Inbetriebnahme ............................................................................306 Das erste Programm ....................................................................308 Kleine Einführung in die Praxis des IAR-Entwicklungswerkzeugs ........................................................310 Modifikation des CSPY-Debuggers für Assemblerprogrammierung ..........................................................310 Setzen eines Breakpoints.............................................................312 Editieren von Breakpoints ............................................................313 Lesen und Schreiben des Inhalts von Registern..........................313 Lesen und Schreiben des Inhalts von Adressen..........................314 Start/Restart eines Programms ....................................................315 Anhalten eines Programms ..........................................................315 Reset des FET-Moduls.................................................................315 Änderung der angezeigten Fenster..............................................315 Die Quick Start Software und das IAR-Entwicklungswerkzeug..........................................................316 Notwendige Modifikationen für existierende Version 1.x-Programme ...............................................................317 Wenn gar nichts geht ...................................................................317
11 Die MSP430F449 Quick Start Software ....................................323 11.1 11.2 11.2.1 11.2.2 11.2.3 11.2.4 11.2.5 11.2.6 11.2.7 11.3 11.3.1
Einleitung......................................................................................323 Struktur der Quick Start Software ................................................324 Definitionen ..................................................................................324 Macro-Definitionen .......................................................................325 Initialisierung ................................................................................325 Hauptprogramm ...........................................................................325 Subroutinen ..................................................................................325 Interrupt-Routinen ........................................................................325 Interrupt-Vektoren ........................................................................326 Änderung der Quick Start Software .............................................326 Änderung von Definitionen ...........................................................326
12
Inhaltsverzeichnis 11.3.2 11.3.3 11.4 11.5 11.6 11.6.1 11.6.2 11.6.3 11.6.4 11.6.5 11.6.6 11.6.7 11.6.8 11.6.9 11.6.10 11.6.11 11.6.12 11.6.13 11.6.14 11.6.15 11.6.16 11.6.17 11.6.18 11.7 11.7.1 11.7.2 11.7.3 11.7.4 11.7.5 11.7.6 11.7.7 11.8
Einfügen von Softwaremodulen ...................................................326 Entfernen von Softwaremodulen..................................................327 Blockschaltbild der MSP430x44x-Familie ....................................327 Schaltbild des Quick Start Software-Beispiels .............................328 Beschreibung der MSP430F449 Quick Start Software ................328 Demonstrationsprogramm............................................................329 System Clock Generator FLL+.....................................................330 Oscillator Fault Detection .............................................................331 RAM .............................................................................................331 Information Memory .....................................................................332 12-Bit-Analog-Digital-Wandler......................................................333 Digitale Ein- und Ausgabeports....................................................333 Flüssigkristallanzeigen-Treiber (LCD)..........................................334 Basic Timer1 ................................................................................335 Comparator_A ..............................................................................336 Brownout und Supply Voltage Supervision ..................................337 USART0 in SPI Mode...................................................................337 USART1 in UART Mode...............................................................338 Timer_A........................................................................................339 Timer_B........................................................................................341 Watchdog .....................................................................................343 Hardware Multiplier ......................................................................343 Low Power Mode..........................................................................344 Weitere Informationen ..................................................................345 Digital-Analog-Wandlung..............................................................345 Verbrauchsmessung ....................................................................345 Digitale Motorsteuerung ...............................................................345 Batterieüberwachung und Netzausfall-Erkennung.......................345 Gleitkommapaket .........................................................................346 Integerrechenroutinen ..................................................................346 I2C-Bus ........................................................................................346 Die Source der MSP430F44x Quick Start Software ....................346
12 Tipps und Empfehlungen ...............................................................377 12.1 12.2 12.2.1 12.2.2 12.3 12.3.1 12.3.2
Verbesserung der Lesbarkeit .......................................................377 Tipps und Empfehlungen .............................................................378 Häufigste Softwarefehler ..............................................................379 Häufigste Hardwarefehler.............................................................386 Prüflisten für Fehler ......................................................................389 Durch die Software bedingte Fehler.............................................389 Durch die Hardware bedingte Fehler ...........................................391
Inhaltsverzeichnis
13
13 Verbesserung der Störempfindlichkeit ....................................393 13.1 13.2 13.3 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.4.5 13.5
Erwägungen zum Bezugspotential Vss........................................394 Leitungsführung............................................................................395 Anschluss langer Sensorleitungen...............................................397 Signalmittelung und Störungsunterdrückung ...............................398 Aufsummierung ............................................................................398 Kontinuierliche Mittelung ..............................................................399 Gewichtete Aufsummierung .........................................................400 Unterdrückung von Extremwerten................................................402 Synchronisation der Messungen zur Netzfrequenz .....................403 Korrekter Abschluss unbenutzter MSP430-Pins ..........................406
14 Verringerung des Stromverbrauchs ..........................................409 14.1 14.2 14.2.1 14.2.2 14.2.3 14.2.4 14.2.5 14.2.6
Stromaufnahme-Profil eines MSP430F4xx ..................................409 Minimierung der Stromaufnahme eines MSP430-Systems .........411 Stromaufnahme des MSP430 ......................................................411 Selbstentladung der Batterie ........................................................413 Stromaufnahme des Quarzes ......................................................414 Stromaufnahme der Flüssigkristallanzeige (LCD)........................414 Stromaufnahme der externen Bauelemente ................................414 Berechnung der Lebensdauer der Batterie ..................................416
15 REFERENZEN und »Wo zu Finden« ..........................................419 15.1 15.1.1 15.1.2
Die Quellen für MSP430-Information ...........................................420 Internet .........................................................................................420 MSP430-CD .................................................................................421
Stichwortverzeichnis ........................................................................423
15
1
Einleitung
Dieses Buch versucht auf eine relativ schnelle Weise praktische und theoretische Kenntnisse über den 16-Bit-Mikrocontroller MSP430 von Texas Instruments zu vermitteln. Zu diesem Zwecke ist ein vorbereitetes Source-File enthalten, das für alle wichtigen internen Peripherie-Module – Timer_A, Timer_B, Ein- und Ausgabe-Ports, LCD-Anzeige, Analog-Digitalwandler usw. – den Initialisierungsteil, ein kleines Programm und – falls notwendig – eine Interrupt-Routine enthält. Dieses Source-File ist funktionsfähig und kann leicht auf die individuellen Bedürfnisse abgeändert werden. Dazu kommen Tipps und Empfehlungen, die manchmal – wenn gar nichts geht – ein langes Suchen und Rätseln ersparen. Es sind die Erfahrungen aus eigenen Fehlern und denjenigen anderer, die sich hier niederschlagen. Dieses Buch ist allerdings kein Lehrbuch für Anfänger in der Programmierung von Mikrocontrollern! Kenntnisse in den folgenden Sparten der Mikrocontrollertechnik werden vorausgesetzt: • Assemblerprogrammierung, wobei es relativ gleichgültig ist, ob diese Kenntnisse von einem 8-Bit-, 12-Bit- oder sogar 16-Bit-Rechner herstammen • Boolesche Algebra • Zweier-Komplementrechnung, also die Kenntnis, wie ein Rechner mit positiven und negativen Zahlen rechnet und wie diese dargestellt werden • Hexadezimale Zahlendarstellung Das Buch wendet sich an den Assemblerprogrammierer. Wer den MSP430 in der Hochsprache C programmieren will – was sehr gut geht – kann sich hier mit der Arbeitsweise der MSP430-CPU vertraut machen. Diese Kenntnis hat zwei Vorteile: • In vielen Anwendungsfällen muss ohnehin die Assemblersprache verwendet werden, da ein Hochsprachenprogramm zu langsam wäre. Beispiele hierfür sind elektronische Sicherungen, Elektrizitätszähler und Elektromotorsteuerungen (Digital Motor Control). Also Anwendungen, die vor einigen Jahren noch typische DSP-Applikationen waren. • In anderen, nicht ganz so schnellen Anwendungen, ist es notwendig, zumindest die zeitkritischen Programmteile optimiert in der Assemblersprache zu
16
Kapitel 1: Einleitung
schreiben und in das Hochsprachenprogramm einzubinden. Ein eigenes Kapitel behandelt dieses Thema. • Selbst wenn nur in C programmiert wird, ist es von Nutzen, wenn man weiß wie die CPU arbeitet und wenn man den vom Compiler generierten Assemblercode lesen und verstehen kann. Unerklärliches Verhalten oder lange Ausführungszeiten können so erklärt und die Ursachen beseitigt werden. Wer schon etwas länger im Fach ist, der wird schnell sehen, wo die Wurzeln des MSP430 sind: • Es ist hauptsächlich der Superrechner der frühen 70er-Jahre, der PDP11 der Digital Equipment Corporation (DEC) , der im MSP430 in einer stark vereinfachten Form Auferstehung feiert. Vom PDP11 stammen: • Die Arbeitsregister in der CPU – also kein Accumulator • Program Counter und Stack Pointer sind »normale« Arbeitsregister • Die Stack-Orientierung der CPU: Die Adressierungsarten orientieren sich an den Notwendigkeiten der Stack-Architektur • Die Orthogonalität der CPU, die allerdings beim PDP11 nicht 100 % erreichte • Aber auch der weltweit erste Ein-Chip-16-Bit-Mikrocontroller, der TMS9900 von Texas Instruments hat seine Spuren hinterlassen. Vom TMS9900 stammen: • Die sechzehn Arbeitsregister der CPU • Die Peripherie-Module auf dem Silizium: Der vollständige Mikrocontroller ist auf einem Chip untergebracht • Die vier implementierten Adressierungsarten (ein Subset der acht bzw. zwölf des PDP11) Die MSP430-Familie hat inzwischen eine nur noch schwer zu überschauende Anzahl von Mitgliedern, sodass eine gewisse Beschränkung notwendig wurde. In diesem Buch werden daher alle Beispiele auf das momentane »Schlachtschiff« der MSP430-Famile, nämlich den MSP430F449 bezogen. Soweit das die CPU betrifft, hat es keinerlei Konsequenzen, da vom kleinsten Familienmitglied (MSP430F110) bis zum größten (MSP430F449) alle die exakt gleiche CPU aufweisen. Das bedeutet, in der Programmierung besteht keinerlei Unterschied zwischen den verschiedenen Familienmitgliedern, nur die Ausstattung mit Peripherie-Modulen auf dem Chip ist stark unterschiedlich.
1.1 Verwendete Abkürzungen
17
Durch die lange Erfahrung mit der MSP430-Familie fand ein natürlicher Ausleseprozess statt: Nur die besten und bewährtesten Peripherie-Module sind in der MSP430F4xx-Famile noch vorhanden. Für die Arbeit mit dem MSP430-Entwicklungssystem wird das momentan neueste IAR Emulation Tool Version 2.20 verwendet. Die Änderungen gegenüber der Vorgängerversion werden erklärt. Bei den gezeigten Hardware-Beispielen wird die Lösung mit der einfachsten externen Hardware angestrebt. Das heißt, ohne Decoder, Encoder, UART-Bausteine, externe Analog-Digitalwandler usw. Jedes Bauelement, das nicht unbedingt notwendig ist, verteuert nur das fertige Produkt (Bauelementekosten, Bestückung, Prüfung, Platz auf der Platine, Stromverbrauch) und wird daher vermieden.
1.1
Verwendete Abkürzungen
Die folgenden Abkürzungen und Namen werden in diesem Buch verwendet. Es wurde darauf verzichtet, unter allen Umständen eine Übersetzung der englischen Fachausdrücke vorzunehmen. Stattdessen wurden die in der TI-Literatur verwendeten Ausdrücke mitverwendet, was eine Lektüre dieser Publikationen stark erleichtert. Die Bedeutung der verwendeten Abkürzungen ist: ACLK
Die Frequenz des 32-kHz-Oszillators (Auxiliary Clock)
ACTL.1 Das Bit 1 (Wert 21) des Registers ACTL ADC
Analog-Digitalwandler (Analog-to-Digital Converter)
AGND
Null-Volt-Anschluss für den analogen Teil (z.B. ADC12) Vss oder AVss
BCD
Zahlen von 0 bis 9, binär codiert mit 4 Bits (Binary Coded Decimal)
CISC
Computer mit komplexem Befehlssatz (Complex Instruction Set Computer)
CPU
Die MSP430-Zentraleinheit (Central Processing Unit)
DCO
Digital geregelter Oszillator (Digitally Controlled Oscillator)
DSP
Rechner für Signalverarbeitung (Digital Signal Processor)
dst
Destination (Adresse bzw. Arbeitsregister wohin die Daten geschrieben werden)
FLASH
Änderbarer Programmspeicher im MSP430
18
Kapitel 1: Einleitung
I/O
Ein- und Ausgang (Input and Output Line)
LCD
Flüssigkeitskristallanzeige (Liquid-Crystal Display)
LSB
Bit oder Byte mit der geringsten Wertigkeit (Least Significant Bit or Byte)
MCLK
Oszillatorausgangsfrequenz für die CPU (Main Clock)
MSB
Bit oder Byte mit der höchsten Wertigkeit (Most Significant Bit or Byte)
PC
Programmschrittzähler R0 (Program Counter)
PIC
Positionsunabhängiger Code, Code der ohne Änderung an jeder Adresse ausgeführt werden kann (Position Independent Code)
POR
Reset-Signal ausgelöst durch Einschalten von Vcc, negatives RST/ NMI-Signal, SVS-Signal, Brownout-Signal. (Power-On Reset)
PUC
Reset-Signal ausgelöst durch POR, Watchdog-Signal (2 Quellen), Flash-Sicherheitsschlüsselverletzung. (Power-Up Clear)
R1||R2
Widerstand R1 ist parallel geschaltet zum Widerstand R2
R4|R3
Zahl mit 32-Bit . MSBs in Arbeitsregister R4, LSBs in R3
RAM
Datenspeicher im MSP430. (Random Access Memory)
RISC
Computer mit reduziertem Befehlssatz (Reduced Instruction Set Computer)
ROM
Programmspeicher im MSP430 (Read Only Memory)
SMCLK Oszillatorausgangsfrequenz für die Peripherie-Module (System Clock) SP
Stapelzeiger R1 (Stack Pointer)
SPI
Betriebsart des USART-Peripherie-Moduls (Serial Peripheral Interface)
SR
Status Register R2
src
Source (Adresse bzw. Arbeitsregister woher die Daten gelesen werden)
TOS
Adresse auf die der Stack Pointer zeigt (Top of Stack)
UART
Betriebsart des USART-Peripherie-Moduls (Universal Asynchronous Receive/Transmit Interface)
USART Peripherie-Modul, das als UART und als SPI arbeiten kann (Universal Synchronous/Asynchronous Receive/Transmit Interface)
1.2 Verwendete Begriffe
.and.
Logische UND-Funktion
.not.
Logische Inversion
.or.
Logische ODER-Funktion
.xor.
Logische EXCLUSIVE ODER-Funktion
[ns]
Verwendete physikalische Einheit (hier z.B. Nanosekunden)
rw-(0)
Les- und schreibbares Bit, gelöscht durch POR
rw-0
Les- und schreibbares Bit, gelöscht durch POR oder PUC
r-1
Nur lesbares Bit, gesetzt durch POR oder PUC
r
Nur lesbares Bit, kein definierter Anfangszustand
w
Nur schreibbares Bit, kein definierter Anfangszustand
100h
Hexadezimale Zahlendarstellung (100h entspricht 256 dezimal)
100b
Binäre Zahlendarstellung (100b entspricht 4 dezimal)
100
Dezimale Zahlendarstellung (100 entspricht dezimal hundert)
19
Anmerkung: Falls keine Einheit für eine Gleichung angegeben ist, wird die Standardeinheit benutzt. Das bedeutet Volt, Ampere, Farad, Sekunden und Ohm und nicht Millivolt, Mikroampere, Nanofarad, Kiloohm usw.
1.2
Verwendete Begriffe
Die Bedeutung der verwendeten Begriffe – die meist der Computersprache entnommen sind – ist: Adresse
Die eindeutige Position innerhalb des Adressraums von 0000h bis FFFFh. Die Angabe ist beim MSP430 in Bytes (8 Bit)
Background
Das normale Programm (Hauptschleife, Subroutinen)
Destination
Ziel einer Operation, also wohin das Ergebnis geschrieben wird (Adresse, Operand)
Foreground
Die Interrupt-Software (Interrupt-Routinen)
Gleitkomma
Zahlendarstellung mit Exponent, Vorzeichen und Mantisse (Floating Point)
Housekeeping
Bezeichnet die unbedingte Notwendigkeit, den Stack eines Stack-orientierten Mikrocontrollers, wie dem MSP430, immer auf dem richtigen Stand zu halten, da sonst die Software ab-
20
Kapitel 1: Einleitung
stürzt. Housekeeping ist nur notwendig, wenn das Programm den Stack Pointer aktiv verändert (z.B. durch POP, PUSH usw.). Interrupt
Die Möglichkeit ein Programm durch ein Ereignis zu unterbrechen
Label
Zuordnung eines Namens zu einer Adresse
Oberes Byte
Die Bits 8 bis 15 einer Speicherstelle (RAM, PeripherieModul, Arbeitsregister usw.). Das Vorzeichen des oberen Bytes ist in Bit 15
Operand
8-Bit- oder 16-Bit-Grösse, die für Berechnungen verwendet wird
Overhead
Notwendige Rechneraktivität, die aber nichts zur eigentlichen Rechenleistung beiträgt. Z.B. die notwendigen 6 MCLKZyklen, die jeder Interrupt benötigt, um an den Start der Interrupt-Routine zu gelangen und die 5 Zyklen, um sie mit dem RETI-Befehl wieder zu verlassen
Peripherie
Zusatzfunktionen des Mikrocomputers wie Timer, ADC, Anzeigentreiber, Ein-/Ausgabe usw. die mit auf dem Chip angeordnet sind: Peripherie-Module
Source
Quelle einer Operation, also woher ein Operand gelesen wird (Adresse, Operand)
Überlauf
(Overflow) Das Ergebnis eines Befehls ist außerhalb des Zahlenbereichs für vorzeichenbehaftete Zahlen (bei 16-Bit-Zahlen: –32768 bis +32767, bei 8-Bit-Zahlen: –128 bis +127). Beispiel: Die Addition zweier positiver Zahlen ergibt ein negatives Ergebnis. Überlauf wird durch das Overflow Bit V im Status Register SR angezeigt.
Übertrag
(Carry) Das Ergebnis eines Befehls ist zu groß. Übertrag wird normalerweise durch das Carry Bit C im Status Register SR angezeigt.
Unteres Byte
Die Bits 0 bis 7 eines Speicherstelle (RAM, Peripherie-Modul, Arbeitsregister usw.). Das Vorzeichen des unteren Bytes ist in Bit 7
Worst Case
Der schlechteste mögliche Fall. Es wird vom Zusammentreffen der ungünstigsten Umstände ausgegangen (Bauelemente-Toleranzen, Zahl der gleichzeitig zusammentreffenden Interrupts, höchstmögliche Verschachtelung von Subroutinen, Grenztemperatur usw.). Ein System, das unter diesen Umständen immer noch funktioniert, ist sicher.
21
2
Das MSP430-Konzept
2.1
Warum MSP430?
Der Vorgänger des 16-Bit-Mikrocontrollers MSP430 war der TSS400, ein 4-Bit Mikrocomputer mit einer extrem geringen Stromaufnahme, die ihn für Batterieanwendungen tauglich machte. Der TSS400 war ein erfolgreiches Produkt und wurde in viele batteriebetriebene Anwendungen wie Heizkostenverteiler, Gasund Wasserzähler eingebaut. Mit dem beginnenden Kommunikationszeitalter am Anfang der 90er Jahre des vorigen Jahrhunderts wurde aber offenbar, dass der interruptlose TSS400 die neuen Anforderungen nicht mehr erfüllen konnte. Innerhalb kurzer Zeit wurde entschieden, dass ein Nachfolger entwickelt werden musste, und dass dieser eine 16-Bit-Struktur haben sollte. Die Hauptanforderungen an den MSP430 (damals noch TSS430 genannt) waren: • Extrem niedriger Stromverbrauch wie beim TSS400 um in Batterieanwendungen einsetzbar zu sein. • Die Chipfläche der CPU musste gleich oder kleiner als die der TSS400-CPU sein • Die CPU musste Reserven für viele Jahre aufweisen (Rechenleistung, Interrupt-Struktur, Speichergröße) Die zweite Forderung ließ nur eine orthogonale RISC-Architektur zu: Nur diese Architektur, bei der alle Befehle – ausgenommen natürlich die eigentliche Funktion – den gleichen Aufbau haben, erlaubt eine so kleine Fläche.
2.2
Das Konzept des MSP430
Viele Mikrocomputer-Anwendungen müssen von Batterien gespeist werden. Für diese Anwendungen ist es sehr wichtig, so lange als möglich mit einer kleinen Batterie auszukommen. Um eine Batterielebensdauer von länger als 5 Jahren zu erreichen, wird oft die in Abbildung 2.1 gezeigte Schaltung verwendet. Sie zeigt einen in England viel verwendeten Haushaltszähler: • Ein Quarz-Oszillator mit niedriger Frequenz speist einen Vorteiler, der jede Sekunde einen Impuls, der ein Flip-Flop setzt, abgibt. Dieser Impuls stellt die Zeitbasis des Systems dar. Die Genauigkeit der Zeitbasis ist die des Quarzes.
22
Kapitel 2: Das MSP430-Konzept
• Das Flip-Flop schaltet die Speisespannung des Mikrocomputers ein. Dieser misst die notwendigen Systemwerte mit einem externen Analog-Digitalwandler – der notwendig ist, wenn die Genauigkeit 8 Bit überschreitet – und berechnet die Messresultate danach. • Die Resultate werden in einem externen RAM aufsummiert und mit einem externen LCD-Treiber angezeigt. • Wenn alle notwendigen Aktivitäten vorbei sind, setzt der Mikrocomputer das Flip-Flop zurück und schaltet sich dadurch selbst aus. Der Stromverbrauch des Systems geht dadurch auf den Wert zurück, der durch den Oszillator, das RAM und den LCD-Treiber gegeben ist. Das System braucht wegen der großen Anzahl von externen Komponenten eine relativ große und teure Batterie (>5 Ah).
Abb. 2.1: Konventionelle Lösung für ein batteriegespeistes System
Die MSP430-Familie gestattet es, das oben beschriebene System als eine EinChip-Lösung zu realisieren: Alle externen Komponenten sind auf dem MSP430Chip integriert. Abb. 2.2 zeigt die MSP430- Lösung.
2.2 Das Konzept des MSP430
23
Abb. 2.2: Batteriegespeistes System mit MSP430
Immer aktiv sind nur der 32-kHz-Oszillator, der interne Basic Timer, der die CPU in regelmäßigen Zeitintervallen aufweckt, das RAM, der LCD-Treiber und die Interrupts des MSP430. Die CPU, der Analog-Digitalwandler und andere Peripherie-Module werden nur eingeschaltet, wenn sie benötigt werden. Die Vorteile dieses Konzepts sind offensichtlich: • Kleinere Platinenabmessungen durch die geringere Anzahl externer Komponenten • Niedrigere Herstellungskosten aus dem selben Grunde • Einfachheit des Designs • Geringere Stromaufnahme (kleinere Batterie mit 0,5...1 Ah oder kleineres Netzteil möglich) • Schnellere Systementwicklung • Höhere Zuverlässigkeit durch die geringere Anzahl externer Komponenten
24
Kapitel 2: Das MSP430-Konzept
2.3
Von-Neumann-Architektur
Für die MSP430-CPU wurde die »von-Neumann-Architektur« gewählt. Im Gegensatz zur »Harvard-Architektur« hat sie den Programmspeicher, das DatenRAM, die Peripherie-Register und den Stack in einem einzigen Adressraum. Die nächste Abbildung zeigt die Struktur dieser Architektur bei der MSP430-Familie:
Abb. 2.3: Architektur des MSP430
Die »von-Neumann-Architektur« hat einige Vorteile: • Hohe Rechenleistung: • Ein-Zyklus-Befehle wenn die Register/Register-Adressierung gewählt wird, also der Register Mode sowohl für den Source- als auch für den Destination-Operanden verwendet wird. • Direkter Speicherzugriff ist möglich, ohne ein Register mit der Operanden-Adresse laden zu müssen (Symbolic Mode, Absolute Mode) • Einfachheit: Die Programmierung des MSP430 ist sehr leicht zu verstehen. Dies ist ein Gegensatz zu vielen anderen Rechner-Architekturen, die immer schwerer zu verstehen sind. Es gibt inzwischen sogar DSPs, die man aufgrund der zu beachtenden gegenseitigen Abhängigkeiten gar nicht mehr in Assemblersprache programmieren kann.
2.4 Interrupt-Struktur
25
• Verwendbarkeit der Befehle: Die vorhandenen 27 Befehle können für alle Module des MSP430 verwendet werden (CPU, Arbeitsregister, RAM, Peripherie-Module). Es sind also keine jeweils speziellen Befehle für diese Module notwendig.
2.4
Interrupt-Struktur
Interrupts spielen eine große Rolle im MSP430-Konzept: Sie wecken die CPU aus den Low Power Modes und ermöglichen eine schnelle Abarbeitung von notwendigen Aktivitäten. Die Haupteigenschaften der MSP430-Interrupt-Struktur sind: • Vektorisierung: kein Abfragen (Polling) nötig • Unterbrechbarkeit: Interrupt-Verschachtelung möglich • Sicherung der Rückkehr • Hohe Flexibilität • Einfache Priorisierung Mehr Information im Kapitel »Interrupt«.
2.4.1
Vektorisierung
Die Entscheidung welches Peripherie-Modul den Interrupt auslöste, geschieht nicht durch das Abfragen von Interrupt-Flags (Polling) sondern automatisch: Die CPU liest die Startadresse der Interrupt-Routine aus einer Vektortabelle und startet dort. Die maximal sechzehn Startadressen sind in den Adressen FFE0h bis FFFEh angeordnet. Für die MSP430F44x-Familie sieht diese Vektortabelle so aus: RSEG
INTVEC
DW DW DW DW DW DW DW DW DW DW DW
BT1_HAN P2_HAN TX1_HAN RC1_HAN P1_HAN TA3_HAN TA0_HAN ADC_HAN TX0_HAN RC0_HAN WD_HAN
; ;
; Startadresse der Interrupt-Vektoren Niedrigste Prioritaet ; FFE0h: Basic Timer1 ; FFE2h: Port2 P2.0..P2.7 ; FFE4h: USART1 transmit (44x) ; FFE6h: USART1 receive (44x) ; FFE8h: Port1 P1.0 bis P1.7 ; FFEAh: Timer_A3 Module 1 und 2 ; FFECh: Timer_A3 Modul 0 ; FFEEh: ADC12 ; FFF0h: USART0 transmit ; FFF2h: USART0 receive ; FFF4h: Watchdog im Timer Mode
26
Kapitel 2: Das MSP430-Konzept DW DW DW DW DW
CA_HAN TB7_HAN TB0_HAN NMI_HAN INIT
; ; ; ; ; ;
FFF6h: Comparator_A FFF8h: Timer_B7 Module 1 bis 6 FFFAh: Timer_B7 Modul 0 FFFCh: NMI, Osz.-Fehler, Flash FFFEh: Reset, WD im WD Mode Hoechste Prioritaet
END
Anmerkung: Die Vektortabelle ist für jede MSP430-Familie individuell! Sie muss angepasst werden. Siehe die jeweilige MSP430-Spezifikation.
2.4.2
Unterbrechbarkeit
Normalerweise ist in einer Interrupt-Routine das GIE-Bit im Status Register gelöscht, d.h. es kann kein weiterer Interrupt das Programm unterbrechen. Durch das Setzen des GIE-Bits (mit dem Befehl EINT) innerhalb einer Interrupt-Routine kann aber der Interrupt wieder eingeschaltet werden und ein anderer Interrupt kann die momentane Interrupt-Routine unterbrechen (Interrupt Nesting). Abbildung 2.4 zeigt die Stack-Belegung danach. Dies kann bis zu jedem beliebigen Grade gemacht werden, solange das RAM für die Speicherung von Program Counter und Status Register ausreicht. Mehr im Kapitel »Interrupt«.
Abb. 2.4: Stack-Belegung einer unterbrochenen Interrupt-Routine
2.4.3
Sicherung der Rückkehr
Der Befehl RETI stellt einen Sonderfall dar, da er die beiden für die Rückkehr vom Interrupt notwendigen Befehle MOV MOV
@SP+,SR @SP+,PC
; Restauriere das Status Reg. ; Restauriere den Progr. Cntr
durch eine in der CPU fest verdrahtete, nicht unterbrechbare Befehlsfolge ersetzt. Dadurch wird vermieden, dass das restaurierte Status Register – in dem das GIE-
2.4 Interrupt-Struktur
27
Bit wieder gesetzt ist – sofort die nächsten aktiven Interrupts zulässt, was bei kleinen RAM-Größen zum Stack-Überlauf und damit zum Programmabsturz führen kann. Bevor ein weiterer Interrupt zugelassen wird, wird also durch den RETI-Befehl der Stack Pointer SP um vier erhöht.
2.4.4
Flexibilität
Ein zugelassener Interrupt speichert den Program Counter und das Status Register automatisch, wie in folgendem Bild gezeigt ist, auf dem Stack:
Abb. 2.5: Stack-Belegung einer Interrupt-Routine
Die freie Zugänglichkeit der Stack-Information erlaubt es der Interrupt-Routine, die Rückkehr-Information auf dem Stack zu verändern: z.B. Bits im gespeicherten Status Register oder die Rückkehradresse. Beispiel: In einer Interrupt-Routine wird festgestellt, dass das Programm nicht in den LPM3 zurückkehren soll, sondern Aktivitäten, die beim Label TASK beginnen, notwendig sind. Das Programm soll an der Adresse TASK – die direkt nach dem Aufruf des LPM3 stehen muss – fortfahren. ; Low Power Mode 3 einschalten, Interrupts einschalten. ; LPM3ein BIS #CPUOFF+GIE+SCG1+SCG0,SR ; Enter LPM3 TASK ... ; Hier weiter falls COUNT = 100 JMP LPM3ein ; Fertig: Zurueck in LPM3 ; ; Interrupt-Routine: ; INT_HAN ... ; Interrupt-Aktivitaeten CMP #100,COUNT ; COUNT = 100? JLO NRET ; COUNT < 100: Normaler RETI ; ; COUNT = 100: Zum Label TASK. LPM3-Bits loeschen ; BIC #CPUOFF+SCG1+SCG0,0(SP) ; Weiter an TASK NRET RETI
28
Kapitel 2: Das MSP430-Konzept
Beispiel: In einer Interrupt-Routine wird festgestellt, dass das Programm im Active Mode an einer Adresse TASK0 – die irgendwo im Programmspeicher sein kann – fortfahren soll. Die Interrupt-Routine ändert die auf dem Stack gespeicherten Werte des Program Counters und des Status Registers entsprechend. ; Interrupt-Routine: ; INT_HAN ... ; Interrupt-Aktivitaeten ; ; Keine normale Rueckkehr: Active Mode ab Label TASK0 ; Gespeicherte SR und PC-Werte auf dem Stack aendern. ; SR: LPM3-Bits loeschen ; BIC #CPUOFF+SCG1+SCG0,0(SP) ; SR aendern MOV #TASK0,2(SP) ; PC: Rueckkehradresse TASK0 RETI ; Zum TASK0 im Active Mode
2.4.5
Priorisierung
Die Interrupts der MSP430-CPU sind sehr einfach priorisiert: Wenn mehr als ein Interrupt im Ablauf eines Befehls auftritt, dann wird – nach der Fertigstellung des Befehls – derjenige zuerst ausgeführt, der die höchste Priorität hat. Die geringer priorisierten Interrupts werden gespeichert und nach dem Ablauf der momentanen Interrupt-Routine in der Reihenfolge ihrer Priorität abgearbeitet. Die Reihenfolge der Priorität ist durch die Vektortabelle festgelegt (siehe Kapitel »Vektorisierung«): • Der Vektor mit der Adresse FFE0h hat die geringste Priorität 0 (Basic Timer 1 beim MSP430F44x) • Der Vektor mit der Adresse FFFEh hat die höchste Priorität 15 (RESET bei allen MSP430) Zwischen diesen beiden Vektoren nimmt die Priorität linear zu. Abbildung 2.6 zeigt den Beginn der Interrupt-Verarbeitung für drei innerhalb eines Befehls auftretende Interrupts. Nach der Timer_B7-Behandlung (höchste Priorität 12) wird der Interrupt der USART1 (zweithöchste Priorität 3) behandelt und dann noch der Interrupt des Basic Timer1 (niedrigste Priorität 0).
2.5 RISC-Architektur mit sieben Adressierungsarten
29
Abb. 2.6: Interrupt-Priorität
2.5
RISC-Architektur mit sieben Adressierungsarten
Die MSP430-CPU hat die Vorteile einer RISC-Architektur, ohne ihre Nachteile zu besitzen. Normale RISC-Architekturen zeigen ihre Eigenschaften am besten, wenn sie in einer Umgebung mit vielen Berechnungen arbeiten: Die (zahlreichen) Arbeitsregister werden zu Beginn mit den Eingangsdaten geladen, die Berechnungen werden mit den Arbeitsregistern durchgeführt und das Ergebnis wird am Schluss in das RAM abgespeichert. Dieses Konzept benötigt Speicherzugriffe – und damit Adressierungsarten – nur für die beiden Befehle LOAD und STORE. Der MSP430 kann in dieser RISC-Weise programmiert werden, ein Beispiel dafür ist das Gleitkommapaket FPP4, welches nur Berechnungen ohne jeden I/O-Zugriff ausführt. Die reine RISC-Architektur zeigt allerdings Nachteile, wenn sie in Echtzeitanwendungen arbeitet: Hier ist es eine Verschwendung von Zeit, wenn die Operanden zuerst geladen werden müssen, dann verarbeitet und schließlich zurückgeschrieben werden müssen. Daher benutzt die MSP430-Architektur das Beste zweier Welten: • Das RISC-Konzept mit seinen wenigen, starken Befehlen, den zahlreichen Arbeitsregistern und den Ein-Zyklus-Befehlen (Register/Register-Adressierung) • Das CISC-Konzept mit seiner Adressierungsmöglichkeit, die für alle Befehle vorhanden ist und nicht nur für die beiden Befehle LOAD und STORE. Dieses Konzept ist durch die verwendete 100 %-ige Orthogonalität des MSP430 auf die Spitze gebracht, was bedeutet, dass alle sieben Adressierungsarten mit allen Befehlen verwendet werden können.
30
Kapitel 2: Das MSP430-Konzept
2.6
Vorteile des MSP430-Konzepts
Das MSP430-Konzept unterscheidet sich relativ stark von den Konzepten, die für andere Mikrocontroller-Familien verwendet werden. Der Hauptunterschied ist wohl, wie zwei sich eigentlich widersprechende Eigenschaften erfolgreich verbunden wurden: • Niedrigstmöglicher Stromverbrauch um lange Batteriestandzeiten – länger als zehn Jahre – zu erhalten • Höchstmögliche Rechenleistungen um die Berechnungszeiten – mit ihrem erhöhten Stromverbrauch – so kurz als möglich zu halten Die beiden genannten Eigenschaften sind aber auch bei netzbetriebenen Anwendungen kein Nachteil: • Niedrigstmöglicher Stromverbrauch: Selbst Steuerungen für Waschmaschinen und Elektrizitätszähler haben heute strenge Vorgaben bezüglich des Stromverbrauchs der Elektronik. Die Gründe dafür sind: • Geringe Erwärmung und dadurch hohe Zuverlässigkeit • Kostengünstigeres, da kleineres Netzteil • Betrieb während eines Netzausfalls mit einer Back-up-Batterie oder einem Kondensator möglich • Höchstmögliche Rechenleistung. Diese Eigenschaft des MSP430 macht netzbetriebene Anwendungen möglich, die vor einigen Jahren noch reine DSPDomänen waren: • Elektronische Sicherungen, die Einschaltströme – z.B. von Elektromotoren – sicher von Kurzschlüssen unterscheiden können • Elektronische Elektrizitätszähler mit minimalem Stromverbrauch • Steuerungen von Elektromotoren mittels Pulsweiten-Modulation (Digital Motor Control DMC), die hohe Motorwirkungsgrade erlauben
2.6.1
Echtzeit-Fähigkeit
Das Konzept der MSP430-Familie wurde so entwickelt, dass zusätzlich zu ihrer »Ultra Low Power«-Fähigkeit auch noch Echtzeit-Fähigkeit möglich ist. Der Hauptgrund für diese Echtzeit-Fähigkeit ist die Weise, wie die Erzeugung des System Clocks realisiert ist: • Kein zweiter Quarz (mit hoher Frequenz) wird benutzt. Damit entfällt die Einschwingzeit (20 bis 200 ms) dieses Quarzes nach dem Verlassen eines Low Power Modes, bis die Frequenz und die Amplitude stabil sind.
2.6 Vorteile des MSP430-Konzepts
31
• Stattdessen wird ein hochentwickelter, frequenz-verriegelter System Clock Generator verwendet (Frequency Locked Loop FLL+), dessen Ausgangsfrequenz innerhalb von 6 ms (worst case, typisch 2 ms) plus sechs MCLKZyklen stabil ist, wenn die CPU aus dem Low Power Mode 3 (LPM3) aufgeweckt wird. Die Referenz für den System Clock Generator ist dabei ein 32,768-kHz-Quarz, der auch im LPM3 als Zeitbasis weiter arbeitet. Dieses Konzept erlaubt Echtzeit-Fähigkeit auch in den Low Power Modes. Es zeigt sich nach außen hin, als ob die CPU immer arbeiten würde.
2.6.2
Stabilität des System Clock Generators (FLL+)
Der im System Clock Generator verwendete digital geregelte Oszillator (Digitally Controlled Oscillator DCO) ist abhängig von der Speisespannung und der Temperatur, dies bedeutet aber nicht, dass seine Frequenz nicht stabil wäre. Bei Verwendung eines 32-kHz-Quarzes (215 Hz) wird während des Active Mode alle 30,5 ms (2-15 s) der integrale Fehler des Oszillators auf Null hin ausgeregelt. Dies wird durch ein der Abweichung entsprechendes Umschalten zwischen zwei verschiedenen DCO-Frequenzen erreicht: Die eine Frequenz ist höher als die programmierte Systemfrequenz und die andere ist niedriger. Der sich ergebende Fehler ist dadurch fast Null. Die beiden DCO-Frequenzen sind so ineinander verschachtelt, dass sich der kleinstmögliche Zeitfehler zu jeder Zeit ergibt. Mehr Information ist im Kapitel »System Clock Generator« enthalten.
2.6.3
Stack-Verarbeitung
Der MSP430 ist ein echter Stack-Prozessor: die meisten seiner sieben Adressierungsarten waren eigentlich für den Stack Pointer SP gedacht. Es zeigte sich später, dass diese Adressierungsarten auch für alle anderen Arbeitsregister sehr nützlich sind (PC, R4 bis R15). Die Möglichkeiten der gewählten Stack-Adressierung sind unter anderem: • Freier Zugriff auf alle Werte auf dem Stack und nicht nur auf den Wert, auf den der Stack Pointer SP momentan zeigt (top of the stack TOS) • Möglichkeit, die Rückkehradressen von Subroutinen und Interrupt-Routinen zu ändern: Sie befinden sich auf dem Stack. • Möglichkeit, das auf dem Stack gespeicherte Status Register SR zu ändern: Dadurch kann zum Beispiel eine Interrupt-Routine das Status Register auf dem Stack so verändern, dass nach der Rückkehr der Low Power Mode verlassen wird. • Keine speziellen Stack-Befehle: Alle implementierten Befehle können auch für den Stack und den Stack Pointer verwendet werden
32
Kapitel 2: Das MSP430-Konzept
• Byte- und Wort-Verarbeitung sind auch für den Stack möglich • Freie Mischung von Subroutinen und Interrupts: Solange keine Stack-Veränderung durch die Software (PUSH, POP usw.) gemacht wird – und solange genügend RAM vorhanden ist – können keine Fehler passieren.
2.6.4
Weitere Eigenschaften
• Les-und Schreibbarkeit aller Peripherie-Register: Dies erlaubt es, diese Register wie RAM zu behandeln, d.h. alle Befehle können auch auf die Peripherie-Module angewendet werden. • Wort- und Byte-Verarbeitung mit allen Befehlen, bei denen es Sinn hat. • Durch die sieben Adressierungsarten ist es relativ einfach möglich, positionsunabhängigen Code (position independent code PIC) zu schreiben. PIC ist eine Programmierung, die es erlaubt, ein Objekt ohne jede Änderung an eine beliebige Stelle des Adressraums zu laden und dort auszuführen, also z.B. im RAM oder in einem der beiden Information Memories.
33
3
Der MSP430F449
Für die Hardware- und Softwarebeispiele wird das Target Socket Module MSPTS430PZ100 verwendet, in dem der momentan leistungsfähigste MSP430 im Sockel steckt: Der MSP430F449. Abbildung 3.1 zeigt sein Blockschaltbild.
Abb. 3.1: Der MSP430F44x mit seinen Peripherie-Modulen
Die Haupteigenschaften des MSP430F449 sind: • Niedrige Versorgungsspannung: 1,8 V bis 3,6 V • Extrem niedrige Leistungsaufnahme: • Active Mode: 280 mA bei 1 MHz und 2,2 V • Low Power Mode 3 (Standby): 1,1 mA • Low Power Mode 4 (RAM-Erhaltung): 0,1 mA • Fünf Low Power Modes • Aufwachen aus dem Low Power Mode 3 innerhalb von max. 6 ms plus 6 MCLK-Zyklen mit korrekter Frequenz • 16-Bit-RISC-Architektur mit sieben Adressierungsarten für den Source-Operanden und vieren für den Destination-Operanden
34
Kapitel 3: Der MSP430F449
• Memory-to-Memory-Architektur: Beide Operanden eines Befehls können im Speicher angesprochen werden, können also an beliebiger Stelle im Adressraum stehen • 60 K Byte Flash-Programmspeicher • 2 K Byte RAM Datenspeicher • 2 128 Byte Information Memory (Flash) für Daten die während des Programmablaufs geändert werden müssen • 125 ns minimale Befehlsausführungszeit (die max. MCLK-Frequenz ist 8 MHz) • 12-Bit-Analog-Digitalwandler mit interner Referenzspannung, Sample-andHold, automatischem, programmierbarem Messablauf und zehn Analog-Eingängen • 16-Bit-Timer_A mit drei Capture/Compare-Registern • 16-Bit-Timer_B mit sieben Capture/Compare-Registern • Comparator_A für Spannungsvergleiche und -messungen • Zwei USARTs, verwendbar als RS232-Schnittstelle oder SPI • Speisespannungsüberwachung (Brownout und einstellbare Spannungspegel) • LCD-Treiber für bis zu 160 Segmente (4 MUX-Arten) • 48 Ein-/Ausgangs-Ports umschaltbar für andere Verwendungen. Sechzehn davon mit Interrupt-Möglichkeit für beide Signalrichtungen • Basic Timer1 für präzise Uhrenfunktion auch während LPM3 • Watchdog Timer: Schaltbar als Watchdog oder als einfacher Timer mit Interrupt • Hardware-Multiplizierer: Multiplikation mit und ohne Vorzeichen, MACFunktion mit und ohne Vorzeichen, 16 16 Bit, 8 8 Bit, 16 8 Bit, 8 16 Bit.
35
4
Die Zentraleinheit
Alle Familienmitglieder der MSP430-Familie haben die genau gleiche Zentraleinheit (CPU). Es gibt keinerlei Unterschiede zwischen der CPU des MSP430F110 (des kleinsten Familienmitglieds) und der des MSP430F449 (des momentan leistungsfähigsten Mitglieds der Familie).
4.1
Aufbau
Abb. 4.1: Die Zentraleinheit des MSP430
36
Kapitel 4: Die Zentraleinheit
Die Abbildung 4.1 zeigt den Aufbau der MSP430-Zentraleinheit (CPU) in vereinfachter Form.
4.2
Die Arbeitsregister
Alle 16 MSP430-Arbeitsregister können mit allen Befehlen und allen Adressierungsarten verwendet werden. Mit Ausnahme des Status Registers SR und des Arbeitsregisters R3 (Constant Generator) können alle Arbeitsregister als Speicher, Status, Zeiger und als Index-Register verwendet werden.
4.2.1
Der Program Counter PC
Der Program Counter PC definiert, welchen Befehl das Programm gerade ausführt. Sofort nach dem Lesen eines Befehls aus dem Speicher wird der PC um zwei erhöht und zeigt damit auf den nächsten Befehl oder ein weiteres Wort, das zum momentanen Befehl gehört (Index, Operand, Adresse). Einer der Hauptunterschiede des MSP430 zu anderen Mikrocontroller-Architekturen betrifft den Program Counter PC, der als »normales« Arbeitsregister R0 angesprochen werden kann. Das bedeutet, dass alle Befehle und Adressierungsarten auch mit dem Program Counter verwendet werden können (allerdings ergeben nicht alle Kombinationen sinnvolle Anwendungen). Ein Sprung zu einer beliebigen Adresse kann z.B. durch das Schreiben einer Konstante in den PC geschehen (dies ist auch die Emulation des Befehls BR): MOV MOV MOV
#LABEL,PC ; Springe zur Addresse LABEL LABEL,PC ; Zur Adresse in Adresse LABEL @R14,PC ; Springe indirekt, indirekt R14
Der Program Counter zeigt immer auf Worte und enthält daher immer eine gerade Adresse: Das bedeutet, dass das LSB immer Null enthält. Siehe Abbildung 4.2. Die Software muss sicherstellen, dass keine ungeraden Adressen mit dem Program Counter benutzt werden. Ungerade Adressen im Program Counter führen zu unvorhersehbarem Verhalten: Das Programm stürzt höchstwahrscheinlich ab.
Abb. 4.2: Der Program Counter PC
4.2 Die Arbeitsregister
37
Nach dem Einschalten der Speisespannung oder einem Reset wird die Adresse, die in dem Interrupt-Vektor FFFEh steht, in den PC geschrieben: Das Programm startet an dieser Adresse.
4.2.2
Der System Stack Pointer SP
Der System Stack Pointer SP ist ein »normales« Arbeitsregister wie die anderen 15 auch: Er ist das Arbeitsregister R1. Das bedeutet, dass alle Adressierungsarten zusammen mit dem Stack Pointer verwendet werden können (fast alle Adressierungen wurden ursprünglich für den Stack Pointer entwickelt). Dies erlaubt den Zugriff auf alle Werte, die auf dem Stack gespeichert sind und nicht nur den Zugriff auf den Wert, auf den der Stack Pointer momentan zeigt (top of the stack TOS).
Abb. 4.3: Der System Stack Pointer SP
Der Stack Pointer hat nach dem Einschalten der Speisespannung keinen definierten Zustand: Er muss immer initialisiert werden: Normalerweise auf das erste Wort oberhalb des RAMs. MOV
#0300h,SP ; SP init. fuer 256 Bytes RAM
Der System Stack Pointer SP wird für die Speicherung der folgenden Werte benutzt: • Interrupt: Rückkehradresse und gespeichertes Status Register SR • Subroutinen: Rückkehradresse • Zwischenergebnisse von Berechnungen • Variablen für Subroutinen • Ergebnisse und Zwischenergebnisse des Gleitkommapaketes FPP4 Einige Beispiele, wie man mit dem Stack und dem Stack Pointer arbeiten kann: MOV MOV MOV MOV MOV PUSH PUSH.B POP MOV ADD
#0A00h,SP SP,R4 @SP,R5 R7,0(SP) R8,2(SP) R12 R12 R12 2(SP),R6 #2,SP
; ; ; ; ; ; ; ; ; ;
SP initialisieren (MSP430F449) Stack Pointer in R4 kopieren TOS in R5 kopieren TOS mit R7 ueberschreiben Wort oberhalb TOS ueberschreiben R12 auf dem Stack speichern Unteres Byte R12 speichern R12 mit TOS ueberschreiben, SP+2 Wort oberhalb TOS in R6 kopieren Stack korrigieren (neuer TOS)
38
Kapitel 4: Die Zentraleinheit
Wenn man den Stack Pointer benutzt, sollte man immer daran denken, dass die CPU den Stack ebenfalls für Interrupts und Subroutinen verwendet. Um fehlerfreies Arbeiten des Programms sicherzustellen, ist es notwendig, exaktes »housekeeping« für den System-Stack zu machen. Der Stack Pointer zeigt immer auf Worte und enthält dadurch immer eine gerade Adresse: Das bedeutet, dass das LSB immer Null enthält. Siehe Abbildung 4.3. Die Software muss sicherstellen, dass keine ungeraden Adressen mit dem Stack Pointer benutzt werden. Ungerade Adressen im Stack Pointer führen zu unvorhersehbarem Verhalten: Das Programm stürzt wahrscheinlich ab. Falls Bytes auf den System-Stack geschrieben werden, wird nur das untere Byte benutzt, das obere Byte wird nicht verändert: PUSH #05h PUSH.B #05h
; SP – 2, ; SP – 2,
0005h -> TOS xx05h -> TOS
Trotz der reinen Wortorientierung des Stack Pointer ist der Zugriff auf Worte und auf Bytes die auf dem Stack stehen möglich. Der folgende Befehl kopiert das Wort, das nach dem TOS auf dem Stack gespeichert ist in R5: MOV
2(SP),R5
; Wort an Adresse TOS+2 -> R5
Der folgende Befehl kopiert das obere Byte des Wortes, das oberhalb des TOS auf dem Stack gespeichert ist in R5 (und löscht das obere Byte von R5): MOV.B
4.2.3
3(SP),R5
; Byte an Adresse TOS+3 -> R5
Das Status Register SR
Das Status Register SR ist in der CPU als R2 implementiert. Es kann nur im Register Mode angesprochen werden, die anderen drei Adressierungsarten – die bei dem Status Register keinen Sinn haben – werden für andere Zwecke verwendet: • Indexed Mode: Der Absolute Mode wird generiert, das Status Register wird mit dem Wert Null verwendet, der Index im nachfolgenden Wort stellt die absolute Adresse dar • Indirect Mode: Die Konstante 4 des Constant Generators wird generiert • Indirect Autoincrement Mode: Die Konstante 8 des Constant Generators wird generiert
Abb. 4.4: Das Status Register SR
4.2 Die Arbeitsregister
39
Die Bits des Status Registers werden nicht bei jedem Befehl gleich behandelt: Die Beeinflussung – falls überhaupt – der Status Bits erfolgt nach der wahrscheinlichsten Verwendung des Befehls. Die genaue Verwendung der Bits des Status Registers ist bei jedem Befehl im Kapitel »Der Befehlssatz« aufgeführt. Die Bits im Status Register haben folgende Verwendung: • Carry Bit C: Normalerweise das Übertragsbit vom MSB des DestinationOperanden her. Bei einigen Befehlen ist es auch das invertierte Zero Bit Z (C = .not. Z) zur schnellen Bitverarbeitung • Zero Bit Z: Zeigt an, ob das Resultat gleich Null ist (Z = 1) oder nicht (Z = 0) • Negativ Bit N: Zeigt an, ob das Resultat negativ ist (N = 1) oder nicht (N = 0). Die Information kommt vom MSB des Resultats (Bit 7 bei ByteBefehlen, Bit 15 bei Wortbefehlen) • General Interrupt Enable Bit GIE: Schaltet den Haupt-Interrupt ein (GIE = 1) oder aber aus (GIE = 0) ohne die Interrupt-Enable-Bits der Peripherie-Module zu beeinflussen. • CPUoff: Schaltet die CPU aus (CPUoff = 1) oder aber ein (CPUoff = 0) • OSCoff: Schaltet den 32-kHz-Oszillator aus (OSCoff = 1) oder aber ein (OSCoff = 0) • SCG-Bits: Schalten zwischen Active Mode und Low Power Modes um. Eine genaue Beschreibung ist im Kapitel »Die Low Power Modes« enthalten. • Overflow Bit V: Zeigt an, ob das Resultat richtig ist (V = 0). Das V-Bit ist z.B. gesetzt, wenn das Ergebnis der Addition zweier positiver Zahlen negativ ist. • Bits 9..15: Diese Bits sind für kommende Adresserweiterungen reserviert Anmerkung: Operationen die auf das Status Register SR zugreifen, überschreiben dieses Register mit dem Resultat der Operation und nicht mit der Auswirkung nach der Befehlsausführung.
Beispiel: Der folgende Befehl schreibt 0 in das Status Register. Das Zero Bit Z ist nach der Ausführung des Befehls NICHT gesetzt! CLR
SR
; 0 -> SR
40
Kapitel 4: Die Zentraleinheit
4.2.4
Der Constant Generator
Wenn man die in einem Programm verwendeten unmittelbaren Operanden untersucht, so sieht man, dass normalerweise die kleinen Zahlen mit Abstand am häufigsten vorkommen. Aus diesem Grunde wurde ein Konstantengenerator in die MSP430-CPU eingebaut: Ein Arbeitsregister (R3) und zwei nicht benutzbare Adressierungsarten des Status Registers werden für diesen Zweck verwendet: Es wird jeweils ein Wort im Programmspeicher und ein MCLK-Zyklus eingespart. Tabelle 4.1 zeigt die sechs Konstanten mit den verwendeten Arbeitsregistern Rs und den Adressierungsarten As. Die sechs Konstanten können auch für ByteBefehle verwendet werden: Es ist dann nur das untere Byte in Benutzung. Der Assembler prüft jede vorkommende Konstante des Immediate Mode und verwendet automatisch den Constant Generator, falls sie einer seiner sechs Konstanten entspricht. Konstante
Hexzahl
Rs
As
Verwendung
-1 0 +1 +2 +4 +8
FFFFh 0000h 0001h 0002h 0004h 0008h
R3 R3 R3 R3 R2 R2
11b 00b 01b 10b 10b 11b
Alle Bits sind 1 Alle Bits sind 0 Inkrement für Byte-Adressierung Inkrement für Wort-Adressierung Wert für Bit-Tests Wert für Bit-Tests
Tabelle 4.1: Konstanten im Constant Generator
4.2.5
Die Arbeitsregister R4..R15
Die zwölf Arbeitsregister R4 bis R15 sind völlig gleich im Aufbau und in der Verwendung. Es sind 16-Bit-Register, die auch als Register für 8-Bit-Operanden verwendet werden können. Abbildung 4.5 zeigt die Struktur der 12 Arbeitsregister:
Abb. 4.5: Die Arbeitsregister R4 bis R15
Beim Schreiben von Byte-Operanden in ein Arbeitsregister wird dessen oberes Byte gelöscht.
4.3 Wort- und Byteverarbeitung
4.3
41
Wort- und Byteverarbeitung
Mit allen Befehlen, bei denen es Sinn hat, ist eine Adressierung von Worten (16 Bits Breite) und von Bytes (8 Bits Breite) möglich. Dabei wird jedes 16-BitWort von drei Adressen adressiert: • Der geraden Wort-Adresse 2n • Der geraden Byte-Adresse 2n des unteren Bytes (Bits 0…7) • Der ungeraden Byte-Adresse 2n+1 des oberen Bytes (Bits 8…15)
Abb. 4.6: Wort- und Byte-Adressen im MSP430
Die 16 Arbeitsregister R0 bis R15 haben keine Adresse, das obere Byte kann bei ihnen nicht explizit angesprochen werden, nur das untere. Im Gesamtadressraum, der von der Adresse 0000h bis zu FFFFh reicht, werden drei leicht differierende Bereiche unterschieden: • Byte-Bereich: In diesem von der Adresse 0000h bis 00FFh reichenden Adressbereich ist nur die Adressierung mit Byte-Befehlen möglich. Hier sind die Special Function Register und die Steuer-Bytes der 8 Bit breiten Peripherie-Module (UART, LCD usw.) untergebracht. • Wort-Bereich: In diesem von der Adresse 0100h bis 01FFh reichenden Adressbereich ist nur die Adressierung mit Wort-Befehlen möglich. Hier sind die Steuerworte der 16 Bit breiten Peripherie-Module (ADC12, Timer_A, Timer_B usw.) untergebracht. • Wort/Byte-Bereich: Dieser mit Abstand größte Adressbereich – er umfasst immerhin 99,2 % des Adressbereiches – kann mit Wort- und Byte-Befehlen angesprochen werden. In ihm sind das RAM, das Information Memory, der Programmspeicher und die Interrupt-Vektoren untergebracht. Abbildung 4.7 zeigt den Adressraum des MSP430.
42
Kapitel 4: Die Zentraleinheit
Abb. 4.7 Der Adressraum der MSP430-Familie
Bei der Verarbeitung von Bytes nehmen die 16 Arbeitsregister R0 bis R15 eine Sonderstellung ein: Wird ein Arbeitsregister im Register Mode als Destination verwendet und schreibt der Befehl das Resultat in das Register, dann wird das 8Bit-Ergebnis in das untere Byte geschrieben und das obere Byte des Arbeitsregisters wird gelöscht. Steht also beispielsweise in R5 der Wert 4567h und wird der Befehl ADD.B
#20h,R5
; Unteres Byte von R5 + 20h
ausgeführt, dann steht nach dem Befehl 0087h in R5: Das obere Byte wurde durch den Byte-Befehl gelöscht, im unteren Byte steht die Summe von 67h + 20h. Im Gegensatz dazu ändert der Befehl CMP.B
#10h,R5
; Vergl. unteres Byte R5 mit 10h
nichts in R5, denn das Ergebnis des Vergleichs wird nicht in das Register geschrieben, sondern modifiziert nur das Status Register SR. Dasselbe gilt für die Befehle BIT.B, PUSH.B und TST.B.
4.4 Die Adressierungsarten
4.4
43
Die Adressierungsarten
Die MSP430-Familie hat sieben Adressierungsarten, wobei alle sieben für den Source-Operanden und vier für den Destination-Operanden zur Verfügung stehen. In der CPU sind vier Adressierungsarten implementiert: • Registeradressierung (Register Mode) • Indirekte Registeradressierung (Indirect Mode) • Indirekte Registeradressierung mit Autoinkrement (Indirect Autoincrement Mode) • Indizierte Adressierung (Indexed Mode) Diese vier Adressierungsarten können für den Source-Operanden mit den beiden As-Bits definiert werden. Für den Destination-Operanden kann mit dem Ad-Bit zwischen dem Register Mode und dem Indexed Mode gewählt werden, siehe Abbildung 4.8. Man wird sich fragen, wie man mit zwei Bits – den zwei As-Bits im Befehlswort des Zwei-Operandenbefehls oder den zwei Ad-Bits des Ein-Operandenbefehls– sieben Adressierungsarten und mit einem Bit – dem Ad-Bit des Zwei-Operandenbefehls – vier Adressierungsarten definieren kann. Die zusätzlichen drei Adressierungsarten werden durch die Verwendung des Program Counters PC und des Status Registers SR als Arbeitsregister gewonnen: • Immediate Mode: Der Indirect Autoincrement Mode wird zusammen mit dem Program Counter PC verwendet. Das Wort nach dem Befehlswort wird dadurch als Konstante im Befehl verwendet. Siehe auch die Beschreibungen des Indirect Autoincrement Mode und des Immediate Mode • Symbolic Mode: Der Indexed Mode wird zusammen mit dem Program Counter PC verwendet. Das Wort nach dem Befehlswort – der Index – wird dadurch als Abstand des PCs zum Operanden verwendet. Siehe auch die Beschreibungen des Indexed Mode und des Symbolic Mode • Absolute Mode: Der Indexed Mode wird zusammen mit dem Status Register SR verwendet. Der Inhalt des Status Registers wird während der Befehlsausführung von der CPU auf Null gehalten. Das Wort nach dem Befehlswort – der Index – wird dadurch als absolute Adresse des Operanden verwendet. Siehe auch die Beschreibungen des Indexed Mode und des Absolute Mode Anmerkung: Der Immediate Mode und der Symbolic Mode ergeben sich aus der ganz normalen Anwendung des Indirect Autoincrement Mode und des Indexed Mode mit dem Program Counter PC. Es sind keinerlei weitere Schaltungen in der CPU vorhanden, um diese beiden Adressierungsarten zu ermöglichen!
44
Kapitel 4: Die Zentraleinheit
Beim Absolute Mode ist nur eine Torschaltung in der CPU vorhanden, die den Inhalt Null des Status Registers SR während der Befehlsausführung sicherstellt. Abbildung 4.8 zeigt den Aufbau der Ein- und Zwei-Operandenbefehle: 15
7 2SFRGH[[[[[E
15
12 11 2SFRGH
5
%:
8 5V
6
7
6
$G %:
4 3 $G
5
0 5G
4 3 $V
0 5G
Abb. 4.8: Aufbau der Ein- und Zwei-Operandenbefehle
4.4.1
Allgemeines zu den Adressierungsarten
Die MSP430-Architektur hat sieben Möglichkeiten um ihre Operanden zu adressieren. Vier davon sind in der CPU implementiert, zwei weitere resultieren aus der Benutzung des Program Counters PC als ein normales Arbeitsregister und eine weitere Adressierungsart wird aus der Indizierung des Status Registers SR gewonnen, das bei dieser Adressierungsart vorübergehend Null enthält. Die folgende Tabelle gibt eine kurze Übersicht über die sieben Adressierungsarten des MSP430: Address-Bits src dst
SourceAdressierung
DestinationAdressierung
Beispiel
00 01 01 01 10 11 11
Register Indexed Symbolic Absolute Indirect Indirect autoincrement Immediate
Register Indexed Symbolic Absolute -
R5 TAB(R5) TABLE &BTCTL @R5 @R5+ #TABLE
0 1 1 1 -
Tabelle 4.2: Addressierungsarten
Die Ein-Operandenbefehle können alle sieben Adressierungsarten verwenden. Die nächste Abbildung zeigt den Zusammenhang bei den Ein- und ZweiOperandenbefehlen:
4.4 Die Adressierungsarten
45
Abb. 4.9: Addressierungsarten
Obwohl für den Destination-Operanden drei der sieben Addressierungsarten fehlen, ist dies nicht von großer Bedeutung für die Programmierung. Die Gründe dafür sind: Immediate Mode: Nicht notwendig für den Destination-Operanden; unmittelbare Operanden können immer mit dem Source-Operanden adressiert werden, da zwei unmittelbare Operanden nicht vorkommen können. Indirect Mode: Falls notwendig, kann der Index Mode mit einem Index von Null verwendet werden (was der indirekten Adressierung entspricht). Zum Beispiel: ADD CMP
#16,0(R6) ; @R6 + 16 -> @R6 R5,0(SP) ; R5 gleich dem TOS? (@SP–R5)
Das zweite Beispiel oben kann auch wie folgt geschrieben werden, was 2 Bytes Programmspeicher spart: CMP
@SP,R5
; R5 = TOS? (R5-@SP)
Indirect Autoincrement Mode: Mit Tabellenverarbeitung kann eine Methode verwendet werden, die Programmplatz, Arbeitszyklen und Zahl der verwendeten Register reduziert: Beispiel: Der Inhalt einer Byte-Tabelle TAB1 soll in eine Tabelle TAB2 geschrieben werden. TAB1 endet mit dem Wort vor dem Label TAB1END. LOOP
MOV MOV.B CMP JLO ...
#TAB1,R5 ; Init. Zeiger auf TAB1 @R5+,TAB2-TAB1-1(R5) ; Inhalt TAB1 in TAB2 #TAB1END,R5 ; Ende von TAB1 erreicht? LOOP ; Nein, weitermachen ; Ja, fertig
46
Kapitel 4: Die Zentraleinheit
Das obige Beispiel verwendet nur ein Arbeitsregister anstatt der normalen zwei und spart drei Worte ein, wegen des kürzeren Initialisierungsteils. Das normale Programm würde wie folgt aussehen:
LOOP
MOV MOV MOV.B INC CMP JLO ...
#TAB1,R5 #TAB2,R6 @R5+,0(R6) R6 #TAB1END,R5 LOOP
; ; ; ; ; ; ;
Init. Source-Zeiger auf TAB1 Init. Dest.-Zeiger auf TAB2 Inhalt von TAB1 in TAB2 Dest.-Zeiger erhoehen Ende von TAB1 erreicht? Nein, weitermachen Ja, fertig
In anderen Fällen kann es möglich sein, den Source- und den DestinationOperanden zu tauschen, um die drei zusätzlichen Adressierungsarten zur Verfügung zu haben. Jede der sieben Adressierungsarten hat ihre speziellen Eigenschaften und Vorteile: Register Mode: Schnellste Adressierungsart, geringste Programmlänge Indexed Mode: Beliebiger Zugriff auf Tabellen oder Stack Symbolic Mode: Zugriff zu allen Adressen ohne den Nachteil, vorher Zeiger laden zu müssen. Durch die Benutzung des Symbolic Mode kann eine InterruptRoutine so kurz als möglich sein. Beispiel: Eine Interrupt-Routine wird gezeigt, die ein RAM-Wort COUNTER um eins erhöhen soll. Danach soll kontrolliert werden, ob ein Status-Byte STATUS den Wert fünf erreicht hat. Falls ja, soll das Byte gelöscht werden. Danach endet die Interrupt-Routine: INTRPT
INTRET
INC CMP.B JNE CLR.B RETI
COUNTER #5,STATUS INTRET STATUS
; ; ; ; ;
Inkrementiere COUNTER STATUS = 5? Nein, beenden STATUS = 5: Zu Null setzen Rueckkehr vom Interrupt
Kein umständliches Laden von Zeigern oder Retten und Wiederherstellen von Arbeitsregistern ist notwendig. Was getan werden muss, kann unmittelbar gemacht werden. Absolute Mode: Zugriff auf absolute Adressen unabhängig von der momentanen Programmadresse Indirect Mode: Tabellenadressierung über Arbeitsregister; Programmeinsparung bei Zugriff auf häufig angesprochene Adressen Indirect Autoincrement Mode: Tabellenadressierung mit programmsparender, automatischer Erhöhung des Zeigers; ideal für Transferroutinen und sequentiellen Tabellenzugriff
4.4 Die Adressierungsarten
47
Immediate Mode: Laden von Zeigern, Adressen oder Konstanten. Die Größe ist im Befehl enthalten Die nächsten vier Adressierungsarten sind in der CPU-Hardware implementiert, werden also nicht emuliert.
4.4.2
Registeradressierung (Register Mode)
Der Operand ist in einem der Arbeitsregister R0 bis R15 enthalten. Dies ist die schnellste Adressierungsart und diejenige, die am wenigsten Speicherplatz benötigt: Die Arbeitsregisternummer 0 bis 15 hat im Befehlswort Platz. Bei der Byte-Verarbeitung mit dem Register Mode wird das Destination-Register – falls es durch den Befehl verändert werden kann – speziell behandelt: • Das obere Byte des Arbeitsregisters wird immer zu Null gesetzt Dies gilt für alle Byte-Befehle, außer BIT.B, TST.B, PUSH.B und CMP.B, die das Destination-Register nur lesen und nicht verändern. Beispiel für Wortadressierung: Zwei Operanden, die beide den Register Mode verwenden. R6 enthält den Wert 1000h, R7 enthält 0200h. Das Befehlswort steht an der Adresse 2000h. ADD
R6,R7
; R6 + R7 -> R7
Die Abbildung 4.10 zeigt die Anordnung des einen Wortes des obigen Befehls:
Abb. 4.10: Register Mode (Wortadressierung) im Speicher
Adresse Vor dem Befehl Nach dem Befehl
src-Register
dst-Register
src-Operand
dst-Operand
R6 1000h 1000h
R7 0200h 1200h
R6 1000h 1000h
R7 0200h 1000h + 0200h = (0) 1200h
Tabelle 4.3: Wort-Beispiel für den Register Mode
Als Ergebnis steht in R7 der Wert 1200h, der Carry ist gelöscht, da kein Übertrag vom MSB (Bit 15) her erfolgte.
48
Kapitel 4: Die Zentraleinheit
Beispiel für Byte-Adressierung: Zwei Operanden, die beide den Register Mode verwenden. R6 enthält den Wert 1234h, R7 enthält 3210h. Das Befehlswort steht an der Adresse 2000h. ADD.B
R6,R7
; R6 + R7 -> R7
Die Abbildung 4.11 zeigt die Anordnung des einen Wortes des obigen Befehls:
Abb. 4.11: Register Mode (Byte-Adressierung) im Speicher
Adresse Vor dem Befehl Nach dem Befehl
src-Register
dst-Register
Src-Operand
dst-Operand
R6 1234h 1234h
R7 3210h 0044h
R6 1234h 1234h
R7 3210h 34h + 10h = (0) 0044h
Tabelle 4.4: Byte-Beispiel für den Register Mode
Als Ergebnis steht in R7 der Wert 0044h, der Carry ist gelöscht, da kein Übertrag vom MSB (Bit 7) des unteren Bytes von R7 her erfolgte. Das obere Byte des R7 ist zu Null gesetzt (Byte-Befehl im Register Mode, der die Destination verändert).
4.4.3
Indirekte Registeradressierung (Indirect Mode)
Das verwendete Arbeitsregister enthält die Adresse des Source-Operanden (nur für die Source möglich). Der Operand kann im gesamten Adressraum (64K Bytes) gespeichert sein. Beispiel: ; Addiere das von R8 adressierte Byte auf den Inhalt von R9 ; ADD.B @R8,R9 ; @R8 + R9 R9
Der Indirect Mode kann nur für den Source-Operanden verwendet werden. Mit dem Indexed Mode und einem Index von Null kann auch der Destination-Operand indirekt adressiert werden. ; Addiere das von R8 adressierte Wort auf das von R9 ; adressierte Wort ; ADD @R8,0(R9) ; @R8 + @R9 @R9
4.4 Die Adressierungsarten
49
Beispiel für Wortadressierung: Zwei Operanden, von denen der Source-Operand den Indirect Mode und der Destination-Operand den Register Mode verwenden. R14 enthält den Wert 3000h (Programmspeicheradresse, enthält FFFEh = -2), R15 enthält 0220h. Das Befehlswort steht an der Adresse 2000h. ADD
@R14,R15
; @R14 + R15 -> R15
Die Abbildung 4.12 zeigt die Anordnung des einen Wortes des obigen Befehls:
Abb. 4.12: Indirect Mode (Wortadressierung) im Speicher
Adresse Vor dem Befehl Nach dem Befehl
src-Register
dst-Register
src-Operand
dst-Operand
R14 3000h 3000h
R15 0220h 021Eh
3000h FFFEh FFFEh
R15 0220h FFFEh + 0220h = (1) 021Eh
Tabelle 4.5: Wort-Beispiel für den Indirect Mode
Als Ergebnis steht in R15 der Wert 021Eh, der Carry ist gesetzt, da ein Übertrag vom MSB (Bit 15) des R15 her erfolgte. Beispiel für Byte-Adressierung: Zwei Operanden, von denen der Source-Operand den Indirect Mode und der Destination-Operand den Register Mode verwenden. R14 enthält den Wert 3001h (Programmspeicheradresse, enthält FFh = -1), R15 enthält 0220h. Das Befehlswort steht an der Adresse 2000h. ADD.B
@R14,R15
; @R14 + R15 -> R15
Die Abbildung 4.13 zeigt die Anordnung des einen Wortes des obigen Befehls:
Abb. 4.13: Indirect Mode (Byte-Adressierung) im Speicher
50
Kapitel 4: Die Zentraleinheit
Adresse Vor dem Befehl Nach dem Befehl
src-Register
dst-Register
src-Operand
dst-Operand
R14 3001h 3001h
R15 0220h 001Fh
3001h FFh FFh
R15 0220h FFh + 20h = (1) 001Fh
Tabelle 4.6: Byte-Beispiel für den Indirect Mode
Als Ergebnis steht in R15 der Wert 001Fh, der Carry ist gesetzt, da ein Übertrag vom MSB (Bit 7) des unteren Bytes von R15 her erfolgte. Das obere Byte von R15 ist gelöscht.
4.4.4
Indirekte Registeradressierung mit Autoinkrement (Indirect Autoincrement Mode)
Das verwendete Arbeitsregister enthält die Adresse des Source-Operanden (nur für die Source möglich). Der Operand kann im gesamten Adressraum (64 K Bytes) gespeichert sein. Sofort nach dem Zugriff auf den Source-Operanden wird das benutzte Arbeitsregister um zwei (Wort-Befehl) bzw. eins (Byte-Befehl) erhöht: Das Register zeigt also auf den nächsten Operanden in einer Tabelle. Falls der Destination-Operand das gleiche Arbeitsregister wie der Source-Operand verwendet, hat das Destination-Register beim Zugriff bereits den erhöhten Wert. Beispiel für Wortadressierung: Zwei Operanden, von denen der Source-Operand den Indirect Autoincrement Mode und der Destination-Operand den Indexed Mode verwenden. R14 enthält den Wert 3000h (Programmspeicheradresse, enthält FFFEh = -2), R15 enthält 0220h (RAM-Adresse). Das Befehlswort steht an der Adresse 2000h. ; @R14 + (10h + R15) -> (10h + R15), R14+2 -> R14 ; ADD @R14+,10h(R15)
Die Abbildung 4.14 zeigt die Anordnung der zwei Worte des obigen Befehls:
Abb. 4.14: Indirect Autoincrement Mode (Wortadressierung) im Speicher
4.4 Die Adressierungsarten
Adresse Vor dem Befehl Nach dem Befehl
51
src-Register
dst-Register
src-Operand
dst-Operand
R14 3000h 3002h
R15 0220h 0220h
3000h FFFEh FFFEh
0230h 1234h FFFEh + 1234h = (1) 1232h
Tabelle 4.7: Wort-Beispiel für den Indirect Autoincrement Mode
Als Ergebnis steht in der RAM-Adresse 0230h (0220h + 0010h = 0230h) der Wert 1232h, der Carry ist gesetzt, da ein Übertrag vom MSB (Bit 15) des RAMWortes her erfolgte. Das Source-Register R14 ist um 2 erhöht, da Wortadressierung vorliegt. Beispiel für Byte-Adressierung: Zwei Operanden, von denen der Source-Operand den Indirect Autoincrement Mode und der Destination-Operand den Register Mode verwenden. R14 enthält den Wert 3000h (Programmspeicheradresse, enthält FFh = -1), R15 enthält 0220h. Das Befehlswort steht an der Adresse 2000h. ADD.B
@R14+,R15
; @R14 + R15 -> R15, R14+1
Die Abbildung 4.15 zeigt die Anordnung des einen Wortes des obigen Befehls:
Abb. 4.15: Indirect Autoincrement Mode (Byte-Adressierung) im Speicher
Adresse Vor dem Befehl Nach dem Befehl
src-Register
dst-Register
src-Operand
dst-Operand
R14 3000h 3001h
R15 0220h 001Fh
3000h FFh FFh
R15 0220h FFh + 20h = (1) 001Fh
Tabelle 4.8: Byte-Beispiel für den Indirect Autoincrement Mode
Als Ergebnis steht in R15 der Wert 001Fh, der Carry ist gesetzt, da ein Übertrag vom MSB (Bit 7) des unteren Bytes von R15 her erfolgte. Das Source-Register R14 ist um 1 erhöht, da Byte-Adressierung vorliegt.
52
Kapitel 4: Die Zentraleinheit
4.4.5
Indizierte Adressierung (Indexed Mode)
Die Adresse des Operanden ist die Summe von Index und dem Inhalt des verwendeten Arbeitsregisters. Der Index ist in einem zusätzlichen Wort, das hinter dem Befehlswort kommt, enthalten. Es sind auch zwei Index-Worte in einem Befehl möglich: Das 1. Wort nach dem Befehlswort enthält den Source-Index, das 2. Wort nach dem Befehlswort enthält den Destination-Index. Siehe Abbildung 4.16 Beispiel für Wortadressierung: Zwei Operanden, die beide den Indexed Mode verwenden. R4 enthält den Wert 1000h (Beginn des Information Memory Segment B), R5 enthält 0200h (Beginn des RAM). Das Befehlswort steht an der Adresse 2000h. ; (10h + R4) + (20h + R5) -> (20h + R5) ; ADD 10h(R4),20h(R5)
Die Abbildung 4.16 zeigt die Anordnung der drei Worte des obigen Befehls:
Abb. 4.16: Indexed Mode (Wortadressierung) im Speicher
Adresse Vor dem Befehl Nach dem Befehl
src-Register
dst-Register
src-Operand
dst-Operand
R4 1000h 1000h
R5 0200h 0200h
1010h 8765h 8765h
0220h FEDCh 8765h + FEDCh = (1) 8641h
Tabelle 4.9: Wort-Beispiel für den Indexed Mode
Als Ergebnis steht im RAM-Wort an der Adresse 0220h (0200h + 0020h = 0220h) der Wert 8641h, der Carry ist durch den Übertrag vom MSB (Bit 15) des RAM-Wortes her gesetzt. Beispiel für Byte-Adressierung: Zwei Operanden, die beide den Indexed Mode verwenden. R4 enthält den Wert 1000h (Beginn des Information Memory Segment B), R5 enthält 0200h (Beginn des RAM).
4.4 Die Adressierungsarten
53
Das Befehlswort steht an der Adresse 2000h. ; (10h + R4) + (21h + R5) -> (21h + R5) ; ADD.B 10h(R4),21h(R5)
Die Abbildung 4.17 zeigt die Anordnung der drei Worte des obigen ByteBefehls:
Abb. 4.17: Indexed Mode (Byte-Adressierung) im Speicher
Adresse Vor dem Befehl Nach dem Befehl
src-Register
dst-Register
src-Operand
dst-Operand
R4 1000h 1000h
R5 200h 200h
1010h 65h 65h
221h FEh 65h + FEh = (1) 63h
Tabelle 4.10: Byte-Beispiel für den Indexed Mode
Als Ergebnis steht im RAM-Byte an der Adresse 0221h (0200h + 0021h = 0221h) der Wert 63h, der Carry ist durch den Übertrag vom MSB (Bit 7) des RAM-Bytes her gesetzt. Wenn das benutzte Arbeitsregister der Program Counter PC ist – der ja als ein »normales« Arbeitsregister angesprochen werden kann – dann sind zwei weitere, sehr wichtige Adressierungsarten möglich: • Der Symbolic Mode: Indexed Mode mit dem PC • Der Immediate Mode: Indirect Autoincrement Mode mit dem PC Mit diesen beiden Adressierungsarten haben die meisten anderen Mikrocontroller-Architekturen Schwierigkeiten: Beim MSP430 erlauben sie den direkten Zugriff auf Daten bzw. die Verwendung von Konstanten ohne das vorherige Laden von Arbeitsregistern. Die Adresse bzw. die Konstante ist mit im Befehl enthalten.
54
Kapitel 4: Die Zentraleinheit
4.4.6
Symbolische Adressierung (Symbolic Mode)
Dies ist die normale Adressierungsart für den Zugriff auf beliebige Adressen im gesamten 64-K-Byte-Adressraum. Das Wort nach dem Befehlswort enthält die Differenz zwischen der Destination-Adresse und dem momentanen Program Counter PC in Bytes. Diese Differenz kann als Index zum PC gesehen werden: Es wird auch tatsächlich der Indexed Mode mit dem PC als Arbeitsregister verwendet. Anmerkung: Der Programmierer braucht sich um diese Feinheiten nicht zu kümmern. Der Assembler errechnet die Differenzen zu den adressierten Worten oder Bytes und setzt diese automatisch richtig in den Befehl ein.
Jede Adresse im gesamten 64-K-Byte Adressraum kann adressiert werden und zwar sowohl als Source als auch als Destination. Es sind nämlich auch zwei symbolische Adressierungen in einem Befehl möglich: Das 1. Wort nach dem Befehlswort enthält den Source-Index, das 2. Wort nach dem Befehlswort enthält den Destination-Index. Beispiel: $ = Adresse auf die der Program Counter PC momentan zeigt ; Subtrahiere den Inhalt des Wortes EDE vom Inhalt ; des RAM-Wortes TONI ; SUB EDE,TONI ; TONI – EDE TONI ; ; Der Assembler setzt fuer den obigen Befehl die ; folgende Sequenz ein: ; SUB X(PC),Y(PC) ; Befehlswort: Befehl, Rx, Ax dw X ; Index X = EDE-$ dw Y ; Index Y = TONI-$ ... ; Naechstes Befehlswort
Bei der Index-Berechnung ist zu beachten, dass der Program Counter PC immer auf das nächste Wort zeigt. D.h. beim obigen Befehl: • Wenn er das Befehlswort gelesen hat, zeigt er bereits auf das Index-Wort mit dem Inhalt X • Wenn er den Index X gelesen hat, zeigt er bereits auf das Index-Wort mit dem Inhalt Y • Wenn er den Index Y gelesen hat, zeigt er bereits auf das nächste Befehlswort Beispiel für Wortadressierung: Zwei Operanden, wobei der Source-Operand den Symbolic Mode und der Destination-Operand den Indexed Mode verwenden. Das Label EDE hat die Adresse 1080h (Beginn des Information Memory Seg-
4.4 Die Adressierungsarten
55
ment A), R5 enthält 0200h (Beginn des RAM). Das Befehlswort steht an der Adresse 2000h. ADD
EDE,20h(R5)
; EDE + (20h+R5) -> (20h+R5)
Die Abbildung 4.18 zeigt die Anordnung der drei Worte des obigen Befehls:
Abb. 4.18: Symbolic Mode (Wort-Adressierung) im Speicher
Adresse Vor dem Befehl Nach dem Befehl
src-Register
dst-Register
src-Operand
dst-Operand
PC 2000h 2006h
R5 0200h 0200h
1080h 3130h 3130h
0220h 1234h 3130h + 1234h = (0) 4364h
Tabelle 4.11: Wort-Beispiel für den Symbolic Mode
Als Ergebnis steht im RAM-Wort an der Adresse 0220h (0200h + 0020h = 0220h) der Wert 4364h, der Carry ist durch den fehlenden Übertrag vom MSB des RAM-Wortes her zurückgesetzt. Beispiel für Byte-Adressierung: Zwei Operanden, die beide den Symbolic Mode verwenden. Das Byte EDE hat die Adresse 1080h (Beginn des Information Memory Segment A), das RAM-Byte TONI hat die Adresse 0220h. Das Befehlswort steht an der Adresse 2000h. ADD.B
EDE+1,TONI
; EDE+1 + TONI -> TONI
Die Abbildung 4.19 zeigt die Anordnung der drei Worte des obigen Befehls:
Abb. 4.19: Symbolic Mode (Byte-Adressierung) im Speicher
56
Kapitel 4: Die Zentraleinheit
Adresse Vor dem Befehl Nach dem Befehl
src-Register
dst-Register
src-Operand
dst-Operand
PC 2000h 2006h
PC 2000h 2006h
1081h 31h 31h
0220h 34h 31h + 34h = (0) 65h
Tabelle 4.12: Byte-Beispiel für den Symbolic Mode
Als Ergebnis steht im RAM-Byte an der Adresse TONI (0220h) der Wert 65h, der Carry ist durch den fehlenden Übertrag vom MSB des RAM-Bytes her zurückgesetzt.
4.4.7
Unmittelbare Adressierung (Immediate Mode)
Jede 8- oder 16-Bit-Konstante kann in einem Befehl verwendet werden. Nach dem Lesen eines Befehlswortes zeigt der Program Counter PC sofort auf das Wort nach dem Befehlswort. Durch die Benutzung des Indirect Autoincrement Mode mit dem PC kann dieses Wort gelesen und als Operand verwendet werden. Durch die gewählte Adressierungsart wird der PC danach um zwei erhöht und zeigt dadurch auf das nächste Wort (Index oder nächstes Befehlswort). Das Wort nach dem Befehlswort wird dadurch als eine 8- oder 16-Bit-Konstante behandelt. Anmerkung: Der Program Counter PC wird – wie auch der Stack Pointer SP – immer um zwei erhöht, auch bei Byte-Adressierung! Der PC und der SP müssen immer auf Worte zeigen. Anmerkung: Der Immediate Mode für die sechs Konstanten des Constant Generators (-1, 0, 1, 2, 4, 8) hat kein nachfolgendes Wort, in dem die Konstante steht. Die Konstante kommt aus der CPU und wird durch die Adressierungsarten für das Arbeitsregister R3 (-1, 0, 1, 2) bzw. das Status Register SR (4, 8) gebildet.
Beispiel: ; Teste Bit 8 im 3. Wort einer ; Startadresse der Tabelle ist ; also die Adresse 4(R10) ; BIT #0100h,4(R10) ; ; ; Der Assembler setzt fuer den ; folgende Sequenz ein: ; BIT @PC+,4(R10) ; dw 0100h ; dw 0004h ;
Tabelle auf die R10 zeigt. 0(R10), das 3. Wort hat
Bit 8 = 1? obigen Befehl die
Befehlswort: Befehl, Rx, Ax Src-Konst. 0100h fuer Bit 8 Index 4 fuer dst-Operanden
4.4 Die Adressierungsarten
57
Beispiel für Wortadressierung: Zwei Operanden, wobei der Source-Operand den Immediate Mode und der Destination-Operand den Register Mode verwenden. R5 enthält 0200h. Das Befehlswort steht an der Adresse 2000h. ADD
#100h,R5
; 100h + R5 -> R5
Die Abbildung 4.20 zeigt die Anordnung der zwei Worte des obigen Befehls:
Abb. 4.20: Immediate Mode (Wortadressierung) im Speicher
Adresse Vor dem Befehl Nach dem Befehl
src-Register
dst-Register
src-Operand
dst-Operand
PC 2000h 2004h
R5 0200h 0300h
2002h 0100h 0100h
R5 0200h 0100h + 0200h = (0) 0300h
Tabelle 4.13: Wort-Beispiel für den Immediate Mode
Als Ergebnis steht in R5 der Wert 0300h, der Carry ist durch den fehlenden Übertrag vom MSB des RAM-Wortes her zurückgesetzt. Beispiel für Byte-Adressierung: Zwei Operanden, wobei der Source-Operand den Immediate Mode und der Destination-Operand den Absolute Mode verwenden. Das Befehlswort steht an der Adresse 2000h. ADD.B
#10h,&0200h
; 10h + &200h -> &200h
Die Abbildung 4.21 zeigt die Anordnung der drei Worte des obigen Befehls:
Abb. 4.21: Immediate Mode (Byte-Adressierung) im Speicher
58
Kapitel 4: Die Zentraleinheit
Adresse Vor dem Befehl Nach dem Befehl
src-Register
dst-Register
src-Operand
dst-Operand
PC 2000h 2006h
SR xxxx NZC = 100
2002h 10h 10h
0200h ABh 10h + ABh = (0) BBh
Tabelle 4.14: Byte-Beispiel für den Immediate Mode
Als Ergebnis steht im RAM-Byte der Wert BBh, der Carry C ist durch den fehlenden Übertrag vom MSB des RAM-Bytes her zurückgesetzt, das Negativ Bit N ist gesetzt, da das Ergebnis BBh eine negative Zahl ist.
4.4.8
Absolute Adressierung (Absolute Mode)
Feste Adressen (z.B. die Hardware-Adressen der Peripherie-Module des MSP430 wie ADC12, USART, Timer_A usw.) können – und sollten – absolut adressiert werden. Der Absolute Mode ist ein Spezialfall des Indexed Modes: Das benutzte Arbeitsregister ist das Status Register SR. Wenn es mit dem Indexed Mode verwendet wird, ist sein Inhalt automatisch Null (ohne die vorherige Information zu verlieren!). Diese Art der Verwendung des SR wurde gewählt, da eine andere Adressierungsart als der Register Mode keinen Sinn beim Status Register hätte: Es enthält nur voneinander unabhängige Status Bits, die niemals eine sinnvolle Adresse darstellen. Das Status Register enthält nach dem Befehl die Statusinformation des Ergebnisses des Befehls. Beispiel: ; Starte Timer_A im Continuous ; BIS #MC1,&TACTL ; ; ; Der Assembler setzt fuer den ; folgende Sequenz ein: ; BIS @PC+,X(SR) ; dw 00020h ; dw 00160h ;
Mode Continuous Mode R5
4.4 Die Adressierungsarten
59
Die Abbildung 4.22 zeigt die Anordnung der zwei Worte des obigen Befehls:
Abb. 4.22: Absolute Mode (Wortadressierung) im Speicher
Adresse Vor dem Befehl Nach dem Befehl
src-Register
dst-Register
src-Operand
dst-Operand
SR xxxxh NZC = 000
R5 0005h 0804h
0140h 07FFh 07FFh
R5 0005h 07FFh + 0005h = (0) 0804h
Tabelle 4.15: Wort-Beispiel für den Absolute Mode
Als Ergebnis steht in R5 der Wert 0804h, der Carry ist durch den fehlenden Übertrag vom MSB des RAM-Wortes her zurückgesetzt. Beispiel für Byte-Adressierung: Zwei Operanden, wobei der Source-Operand den Absolute Mode und der Destination-Operand den Register Mode verwenden. R5 enthält 0000h. Das Befehlswort steht an der Adresse 2000h. Das empfangene Byte 60h im Receive-Register URXBUF0 (Adresse 0076h) wird auf R5 addiert. ADD.B
@URXBUF0,R5 ; &076h + R5 -> R5
Die Abbildung 4.23 zeigt die Anordnung der zwei Worte des obigen Befehls:
Abb. 4.23: Absolute Mode (Byte-Adressierung) im Speicher
Adresse Vor dem Befehl Nach dem Befehl
src-Register
dst-Register
src-Operand
dst-Operand
SR xxxxh NZC = 000
R5 0000h 0060h
0076h 60h 60h
R5 0000h 0000h + 60h = (0)0060h
Tabelle 4.16: Byte-Beispiel für den Absolute Mode
60
Kapitel 4: Die Zentraleinheit
Als Ergebnis steht in R5 das empfangene Zeichen 0060h, der Carry ist durch den fehlenden Übertrag vom MSB des RAM-Wortes her zurückgesetzt.
4.5
Die Befehlsformate
Die RISC-Struktur der MSP430-Familie ist am deutlichsten sichtbar, wenn man die Zahl der Befehlsformate betrachtet: Nur drei Formate existieren, bei anderen 16-Bit-Rechnern sind hier schnell zehn und noch mehr Befehlsformate beisammen. Es gibt keine Ausnahmen, selbst der Befehl RETI, der im ersten Moment zu keinem der drei Befehlsformate zu passen scheint, hat die normale Struktur: Er besteht aus zwei POP-Befehlen. Diese beiden Befehle sind allerdings in der CPU zusammengefasst, um ohne Unterbrechung durch weitere Interrupts ausgeführt werden zu können: Dadurch kann ein Überlauf des Stacks durch weitere, anstehende Interrupts vermieden werden. Die verwendeten Zeichen bei der Behandlung der Status Bits haben folgende Bedeutungen: *
Das Bit wird beeinflusst
1
Das Bit wird gesetzt
0
Das Bit wird zurückgesetzt
@Z
Das Bit ist das negierte Zero Bit C = .not.Z
-
Das Bit wird nicht beeinflusst: Es behält die vorherige Information
4.5.1
Die Befehle mit zwei Operanden
Die zwölf implementierten Befehle mit zwei Operanden (Double Operand Instructions) sind aus den folgenden sechs Feldern des Befehlswortes aufgebaut (Abbildung 4.24): • Opcode: Das 4-Bit-Feld definiert den auszuführenden Befehl • Rs:
Das 4-Bit-Feld definiert das Arbeitsregister (R0...R15) der Source
• Ad:
Das Bit definiert die vier Adressierungsarten der Destination
• B/W:
Das Bit definiert ob Wort-Befehl (0) oder Byte-Befehl (1)
• As:
Das 2-Bit-Feld definiert die sieben Adressierungsarten der Source
• Rd
Das 4-Bit-Feld definiert das Arbeitsregister (R0...R15) der Destination
61
4.5 Die Befehlsformate
Die in den Befehlsbeschreibungen verwendeten Begriffe »src« und »dst« sind Kombinationen von Arbeitsregistern mit einer Adressierungsart: • src:
Source-Operand. Arbeitsregister Rs zusammen mit der Adressierungsart definiert in As
• dst:
Destination-Operand. Arbeitsregister Rd zusammen mit der Adressierungsart definiert in Ad
Wieso bei der Destination mit einem Bit Ad vier und bei der Source mit zwei Bits As sieben Adressierungsarten definiert werden können, wird im Kapitel »Die Adressierungsarten« genau erklärt: Dadurch, dass der Program Counter PC ein normales Arbeitsregister – nämlich das Register R0 – ist, ergeben sich weitere Adressierungsarten. 15
12 2SFRGH
11
8 5V
7
6
$G %:
5
4
3
0
$V
5G
Abb. 4.24: Aufbau der Zwei-Operandenbefehle
Die zwölf implementierten Zwei-Operandenbefehle sind: Status Bits V
N
Z
C
ADD
src,dst
Addiere src zu dst
*
*
*
*
ADDC
src,dst
Addiere src + Carry zu dst *
*
*
*
AND
src,dst
src .and. dst dst
0
*
*
@Z
BIC
src,dst
.not. src .and. dst dst
-
-
-
-
BIS
src,dst
src .or. dst dst
-
-
-
-
BIT
src,dst
src .and. dst SR
0
*
*
@Z
CMP
src,dst
Vergleiche src and dst (dst – src) SR
*
*
*
*
Addiere src + Carry dezimal zur dst
*
*
*
*
DADD
src,dst
MOV
src,dst
Kopiere src nach dst
-
-
-
-
SUB
src,dst
Subtrahiere src von dst (dst – src dst)
*
*
*
*
*
*
*
*
SUBC
src,dst
Subtrahiere src mit Carry von dst
62
Kapitel 4: Die Zentraleinheit
(dst + .not. src + C dst) XOR
src,dst
src .xor. dst dst
*
*
*
@Z
Die zwölf implementierten Zwei-Operandenbefehle sind alle auch als ByteBefehle vorhanden. Als Operand wird das adressierte Byte verwendet, bei den Arbeitsregistern R0…R15 das untere Byte. Status Bits V
N
Z
C
*
*
*
*
ADDC.B src,dst
Addiere src + Carry zu dst *
*
*
*
AND.B
src,dst
src .and. dst dst
0
*
*
@Z
BIC.B
src,dst
.not. src .and. dst dst
-
-
-
-
BIS.B
src,dst
src .or. dst dst
-
-
-
-
BIT.B
src,dst
src .and. dst SR
0
*
*
@Z
CMP.B
src,dst
Vergleiche src and dst (dst – src) SR
*
*
*
*
Addiere src + Carry dezimal zur dst
*
*
*
*
ADD.B
src,dst
DADD.B src,dst
Addiere src zu dst
MOV.B
src,dst
Kopiere src nach dst
-
-
-
-
SUB.B
src,dst
Subtrahiere src von dst (dst – src dst)
*
*
*
*
Subtrahiere src mit Carry von dst * (dst + .not. src + C dst)
*
*
*
src .xor. dst dst
*
*
@Z
SUBC.B src,dst
XOR.B
4.5.2
src,dst
*
Die Befehle mit einem Operanden
Die sieben implementierten Befehle mit einem Operanden (Single Operand Instructions) sind aus den folgenden vier Feldern des Befehlswortes aufgebaut (Abbildung 4.25): • Opcode: Das 9-Bit-Feld definiert den auszuführenden Befehl • B/W:
Das Bit definiert ob Wort-Befehl (0) oder Byte-Befehl (1)
• Ad:
Das 2-Bit-Feld definiert die 7 Adressierungsarten der Destination
63
4.5 Die Befehlsformate
• Rd
Das 4-Bit-Feld definiert das Arbeitsregister (R0...R15) der Destination
Wieso bei der Destination mit zwei Bits sieben Adressierungsarten definiert werden können, wird im Kapitel »Die Adressierungsarten« genau erklärt: Dadurch, dass der Program Counter PC ein normales Arbeitsregister – nämlich das Register R0 – ist, ergeben sich weitere Adressierungsarten. 15
7 2SFRGH[[[[[E
6
5
%:
4 3
0
$G
5G
Abb. 4.25: Aufbau der Ein-Operandenbefehle
Der Destination-Operand kann mit allen sieben Adressierungsarten adressiert werden. Die sieben implementierten Ein-Operandenbefehle für Worte sind (@ @ .not.): Status Bits V
N
Z
C
CALL
dst
Subroutinen-Aufruf
-
-
-
-
PUSH
dst
Operand auf Stack speichern
-
-
-
-
Rückkehr vom Interrupt
*
*
*
*
RETI RRA
dst
Arithm. Rechtsschieben
0
*
*
*
RRC
dst
Logisches Rechtsschieben durch Carry
*
*
*
*
Auswechseln der beiden Bytes eines Wortes
-
-
-
-
Vorzeichen in oberes Byte erweitern
0
*
*
@Z
SWPB SXT
dst dst
Die drei implementierten Ein-Operandenbefehle für Bytes sind: Status Bits V
N
Z
C
PUSH.B src
Kopiere src auf Stack
-
-
-
-
RRA.B
dst
Arithm. Rechtsschieben
0
*
*
*
RRC.B
dst
Logisches Rechtsschieben durch Carry
*
*
*
*
64
Kapitel 4: Die Zentraleinheit
Von den sieben Ein-Operandenbefehlen sind also nur drei auch als Byte-Befehle implementiert. Die Gründe, warum das bei den anderen vier Befehlen nicht so ist, sind: • CALL
Die Destination-Adresse in dst ist immer eine 16-Bit-Adresse
• RETI
Es ist kein Operand vorhanden
• SWPB
Der Befehl arbeitet mit einem Wort und seinen zwei Bytes
• SXT
Der Befehl ist ein »Interface« zwischen Bytes und Worten
4.5.3
Die Sprungbefehle
Die acht implementierten Sprungbefehle (Conditional Jumps) sind aus drei Feldern aufgebaut (Abbildung 4.26): • Opcode:
Das 3-Bit-Feld definiert einen Sprungbefehl
• Bedingung:
Das 3-Bit-Feld definiert die Bedingung des auszuführenden Sprungs
• Offset:
Das 10-Bit-Feld definiert den Wort-Offset im Zweierkomplement (Bit 9 ist dabei das Vorzeichen)
Der Offset ist der Wert (in Worten) der zum Program Counter PC addiert wird, falls die Bedingung erfüllt ist. Es sind also Sprünge von –511 Worten bis zu +512 Worten möglich. Das Bit 9 ist das Vorzeichen des Offsets: Er ist im Zweierkomplement angegeben. 15
13
12
10
2SFRGHE %HGLQJXQJ
9
0 2IIVHW
Abb. 4.26: Aufbau der Sprungbefehle (Conditional Jumps)
Die Bits im Status Register SR werden durch die Sprungbefehle nicht beeinflusst, d.h. es sind unterschiedlich bedingte Sprünge hintereinander möglich. Bei den vorzeichenbehafteten Sprüngen (JGE, JL) wird das Overflow Bit V im Status Register SR mitberücksichtigt, sodass die Sprünge immer richtig ausgeführt werden, auch wenn die Kalkulation einen Überlauf verursachte (und das Ergebnis im Destination-Operanden damit falsch ist). Einige Sprünge sind von der Bedingung her gleich, obwohl sie unterschiedliche Namen haben (JC/JHS, JZ/JEQ, JNC/JLO, JNE/JNZ). Die beiden Namen für den gleichen Befehl wurden eingeführt, um das Programm leichter lesen und verstehen zu können.
4.5 Die Befehlsformate
65
Beispiel: Im Falle eines vorzeichenlosen Vergleichs ist der Befehl JHS (Jump if Higher or Same) wesentlich leichter zu verstehen, als der eigentlich ausgeführte Befehl JC (Jump if Carry).
Die Sprungbefehle sind: JC
Label
Springe falls Carry = 1 (C = 1)
JNC
Label
Springe falls Carry = 0 (C = 0)
JLO
Label
Springe falls dst kleiner src ist (C = 0) ohne Vorzeichen
JHS
Label
Springe falls dst größer oder gleich src ist (C = 1) ohne Vorzeichen
JEQ
Label
Springe falls dst gleich src ist (Z = 1)
JZ
Label
Springe falls Zero Bit = 1 (Z = 1)
JGE
Label
Springe falls dst größer oder gleich src ist (N .xor. V = 0) mit Vorzeichen
JL
Label
Springe falls dst kleiner src ist (N .xor. V = 1) mit Vorzeichen
JMP
Label
Springe immer
JN
Label
Springe falls Negativ Bit = 1 (N = 1)
JNE
Label
Springe falls dst ungleich src ist (Z = 0)
JNZ
Label
Springe falls Zero Bit = 0 (Z = 0)
4.5.4
Die emulierten Befehle
Die emulierten Befehle sind nicht in der MSP430-Hardware implementiert. Sie werden durch die Verwendung des Constant Generators zusammen mit den implementierten Befehlen gebildet. Die Emulation der Befehle ist im Kapitel »Der Befehlssatz« in der Beschreibung des Befehls angegeben. So wird beispielsweise der emulierte Befehl INV
dst
; Invertiere den dst-Operand
durch den implementierten Befehl XOR
#0FFFFh,dst ; Invertiere den dst-Operand
emuliert. Die Konstante 0FFFFh (-1) ist im Constant Generator vorhanden. Der Assembler kennt alle folgenden emulierten Befehle und setzt die entsprechenden implementierten Befehle ein.
66
Kapitel 4: Die Zentraleinheit
Der Destination-Operand kann mit den vier Adressierungsarten für die Destination adressiert werden. Die 24 emulierten Befehle für Wort-Operanden sind (@ @ .not.): Status Bits V
N
Z
C
ADC
dst
Addiere Carry zu dst
*
*
*
*
BR
dst
Springe indirekt dst
-
-
-
-
CLR
dst
Setze dst zu Null
-
-
-
-
CLRC
Lösche Carry Bit
-
-
-
0
CLRN
Lösche Negativ Bit
-
0
-
-
CLRZ
Lösche Zero Bit
-
-
0
-
DADC
dst
Addiere Carry zu dst (dez.)
*
*
*
*
DEC
dst
Dekrementiere dst mit 1
*
*
*
*
DECD
dst
dst – 2 dst
*
*
*
*
DINT
Interrupts ausschalten
-
-
-
-
EINT
Interrupts einschalten
-
-
-
-
INC
dst
Inkrementiere dst mit 1
*
*
*
*
INCD
dst
dst + 2 dst
*
*
*
*
INV
dst
NOP POP
dst
RET
Invertiere dst
*
*
*
@Z
Keine Aktivität (No operation)
-
-
-
-
Hole Wort vom Stack in dst
-
-
-
-
Subroutinenrückkehr
-
-
-
-
RLA
dst
Arithm. Linksschieben dst
*
*
*
*
RLC
dst
Logisches Linksschieben dst durch Carry
*
*
*
*
Subtrahiere Carry-Info von dst
*
*
*
*
Setze Carry Bit
-
-
-
1
SBC
dst
SETC SETN
Setze Negativ Bit
-
1
-
-
SETZ
Setze Zero Bit
-
-
1
-
Teste dst
0
*
*
1
TST
dst
Die 13 emulierten Befehle für Byte-Operanden sind (@ @ .not.): Status Bits V
N
Z
C
ADC.B
dst
Addiere Carry zu dst
*
*
*
*
CLR.B
dst
Setze dst zu Null
-
-
-
-
67
4.6 Der Befehlssatz
DADC.B dst
Addiere Carry zu dst (dez.)
*
*
*
*
DEC.B
Dekrementiere dst mit 1
*
*
*
*
DECD.B dst
dst – 2 dst
*
*
*
*
INC.B
dst
Inkrementiere dst mit 1
*
*
*
*
INCD.B dst
dst
dst + 2 dst
*
*
*
*
INV.B
dst
Invertiere dst
*
*
*
@Z
POP.B
dst
Hole Wort vom Stack in dst
-
-
-
-
RLA.B
dst
Arithm. Linksschieben dst
*
*
*
*
RLC.B
dst
Logisches Linksschieben dst durch Carry
*
*
*
*
SBC.B
dst
Subtrahiere Carry-Infovon dst
*
*
*
*
TST.B
dst
Teste dst
0
*
*
1
4.6
Der Befehlssatz
Die im vorigen Kapitel kurz vorgestellten Befehle werden jetzt detailliert erklärt. Anmerkung: Alle Wortbefehle können auch mit der Kennung ».W« versehen werden. So kann der Befehl ADD
R4,R5
; Addiere 16-Bit-Daten in R4 auf R5
R4,R5
; Addiere 16-Bit-Daten in R4 auf R5
also auch als ADD.W
geschrieben werden. In der folgenden Beschreibung des Befehlssatzes – und auch in den Beispielen – wird allerdings nur die Form ohne die Kennung ».W« in den Beispielen verwendet. Im Folgenden wird die Bedeutung der einzelnen Punkte in den Befehlsbeschreibungen erklärt:
;;; ;;;%
Funktion des Wort-Befehls. XXX ist der Assembler-Name des Wort-Befehls. Funktion des Byte-Befehls. XXX.B ist der Assembler-Name des Byte-Befehls.
Name
Bedeutung des englischen Originalnamens XXX des Befehls.
Syntax
XXX
src,dst
XXX.B src,dst Wie der vollständige Befehl zu schreiben ist. Falls ein ByteBefehl existiert, ist dieser auch angegeben. Die beiden ange-
68
Kapitel 4: Die Zentraleinheit
gebenen Formate bedeuten, dass der Befehl einen SourceOperanden mit sieben und einen Destination-Operanden mit vier Adressierungsarten braucht und dass eine Wort- und eine Byte-Version des Befehls existieren. Operation
Was der Befehl macht: Beschreibung mit logischen und arithmetischen Symbolen. Die Bedeutung der Symbole ist im Kapitel »Verwendete Abkürzungen« erklärt.
Emulation
Falls dieses Feld fehlt, ist der Befehl einer der 27 in der CPUHardware tatsächlich implementierten Befehle. Falls dieses Feld vorhanden ist, wird der Befehl emuliert: Der implementierte Befehl, der die Emulation ausführt ist aufgeführt.
Beschreibung
Die vollständige Beschreibung des Befehls und seiner Wirkung wird angegeben.
Status Bits
N
Die Wirkung des Befehls auf das Negativ Bit N im Status Register SR wird beschrieben. Falls notwendig, getrennt für Wort-und Byte-Befehle. Wortbefehl: MSB = Bit 15 Byte-Befehl: MSB = Bit 7
Z
Die Wirkung des Befehls auf das Zero Bit Z im Status Register SR wird beschrieben. Falls notwendig, getrennt für Wort-und Byte-Befehle. Wortbefehl: Bits 0…15 sind beteiligt Byte-Befehl: Bits 0…7 sind beteiligt
C
Die Wirkung des Befehls auf das Carry Bit C im Status Register SR wird beschrieben. Falls notwendig, getrennt für Wort-und Byte-Befehle. Wortbefehl: Bits 0…15 sind beteiligt Byte-Befehl: Bits 0…7 sind beteiligt
V
Die Wirkung des Befehls auf das Overflow Bit V im Status Register SR wird beschrieben. Falls notwendig, getrennt für Wort-und Byte-Befehle. Wortbefehl: Bits 0…15 sind beteiligt Byte-Befehl: Bits 0…7 sind beteiligt
Beispiel
Hier wird ein kommentiertes Beispiel für den beschriebenen Befehl gegeben. Falls der Befehl eine Wort- und Byte-Version hat, werden Beispiele für beide Versionen angegeben.
4.6 Der Befehlssatz
$'& $'&%
69
Addiere Carry Bit auf das Destination-Wort Addiere Carry Bit auf das Destination-Byte
Name
Add Carry to destination
Syntax
ADC
dst
oder
ADC.W dst
ADC.B dst Operation
dst + C dst
Emulation
ADDC
#0,dst
ADDC.B
#0,dst
Beschreibung
Das Carry Bit wird auf den Destination-Operanden (vier Adressierungsarten) addiert. Der vorherige Inhalt des Destination-Operanden wird mit dem Ergebnis überschrieben.
Status Bits
N
Wird gesetzt, falls das Ergebnis negativ ist (MSB = 1), wird zurückgesetzt, falls das Ergebnis positiv ist (MSB = 0).
Z
Wird gesetzt, falls das Ergebnis Null ist, wird zurückgesetzt, falls das Ergebnis nicht Null ist.
C
Wortbefehl: Wird gesetzt, wenn das Ergebnis von 0FFFFh auf 0000h wechselt, wird andernfalls zurückgesetzt. Byte-Befehl: Wird gesetzt, wenn das Ergebnis von 0FFh auf 00h wechselt, wird andernfalls zurückgesetzt.
V
Wortbefehl: Wird gesetzt, wenn das Ergebnis von 07FFFh auf 08000h wechselt, wird andernfalls zurückgesetzt. Byte-Befehl: Wird gesetzt, wenn das Ergebnis von 07Fh auf 080h wechselt, wird andernfalls zurückgesetzt.
Beispiel
Der 16-Bit-Zähler, auf den R13 zeigt, wird auf einen 32-BitZähler addiert, auf den R12 zeigt: ADD ADC
Beispiel
@R13,0(R12) 2(R12)
; Addiere LSBs ; Addiere Carry auf MSBs
Der 8-Bit-Zähler, auf den R13 zeigt, wird auf einen 24-BitZähler addiert, auf den R12 zeigt: ADD.B ADC.B ADC.B
@R13,0(R12) 1(R12) 2(R12)
; Addiere Zaehler auf LSBs ; Addiere C auf mittl. Byte ; Addiere C auf MSBs
70
Kapitel 4: Die Zentraleinheit
$'' $''%
Addiere Source-Wort auf das Destination-Wort Addiere Source-Byte auf das Destination-Byte
Name
Add source to destination
Syntax
ADD
src,dst
oder
ADD.W src,dst
ADD.B src,dst Operation
src + dst dst
Beschreibung
Der Source-Operand wird auf den Destination-Operanden addiert. Der vorherige Inhalt des Destination-Operanden wird mit dem Ergebnis überschrieben. Der Source-Operand bleibt unverändert.
Status Bits
N
Wird gesetzt, falls das Ergebnis negativ ist (MSB = 1), wird zurückgesetzt, falls das Ergebnis positiv ist (MSB = 0).
Z
Wird gesetzt, falls das Ergebnis Null ist, wird zurückgesetzt, falls das Ergebnis nicht Null ist.
C
Wird gesetzt, wenn bei der Operation ein Übertrag entsteht, wird zurückgesetzt, falls nicht.
V
Wird gesetzt, wenn das Ergebnis zweier positiver Zahlen. negativ ist, oder falls das Ergebnis zweier negativer Zahlen positiv ist. Wird andernfalls zurückgesetzt.
Beispiel
R5 wird um 10 erhöht. Falls dabei ein Carry auftritt, wird zum Label TONI gesprungen. ADD JC ...
Beispiel
; Addiere 10 zu R5 ; Carry = 1: Weiter bei TONI ; Carry = 0
R5 wird um 10 erhöht. Falls kein Carry auftritt, wird zum Label TONI gesprungen. Das obere Byte des R5 wird gelöscht, da Byte-Befehl! ADD.B JNC ...
$''& $''&%
#10,R5 TONI
#10,R5 TONI
; 10 zu unterem Byte R5: 00xxh ; Carry = 0: R5 war < 246 ; Carry = 1: R5 war > 245
Addiere Source-Wort und Carry auf das Destination-Wort Addiere Source-Byte und Carry auf das Destination-Byte
Name
Add source and Carry to destination
Syntax
ADDC
src,dst
ADDC.B src,dst Operation
src + dst + C dst
oder
ADDC.W src,dst
4.6 Der Befehlssatz
71
Beschreibung
Der Source-Operand und das Carry Bit werden auf den Destination-Operanden addiert. Der vorherige Inhalt des Destination-Operanden wird mit dem Ergebnis überschrieben. Der Source-Operand bleibt unverändert.
Status Bits
N
Wird gesetzt, falls das Ergebnis negativ ist (MSB = 1), wird zurückgesetzt, falls das Ergebnis positiv ist (MSB = 0).
Z
Wird gesetzt, falls das Ergebnis Null ist, wird zurückgesetzt, falls das Ergebnis nicht Null ist.
C
Wird gesetzt, wenn bei der Operation ein Übertrag entsteht, wird zurückgesetzt, falls nicht.
V
Wird gesetzt, wenn das Ergebnis zweier positiver Zahlen negativ ist, oder falls das Ergebnis zweier negativer Zahlen positiv ist. Wird andernfalls zurückgesetzt.
Beispiel
Der 32-Bit-Zähler, auf den R13 zeigt, wird auf einen 48- BitZähler addiert, dessen Adresse um 22 Bytes größer ist als die des Source-Operanden. R13 wird jeweils um 2 erhöht. ADD ADDC ADC
Beispiel
$1'%
; Addiere LSBs ohne C, R13+2 ; Addiere mit C von LSBs ; Addiere MSBs mit C
Der 24-Bit-Zähler, auf den R13 zeigt, wird auf einen 24- BitZähler addiert, dessen Adresse um 11 Bytes größer ist als die des Source-Operanden. R13 wird jeweils um 1 erhöht ADD.B ADDC.B ADDC.B
$1'
@R13+,20(R13) @R13+,20(R13) 20(R13)
@R13+,10(R13) ; Addiere LSBs ohne C, R13+1 @R13+,10(R13) ; Addiere mit C von LSBs @R13+,10(R13) ; Addiere MSBs mit C
Logische UND-Verknüpfung von Source- und DestinationWorten Logische UND-Verknüpfung von Source- und DestinationBytes
Name
AND Source with destination
Syntax
AND
src,dst
oder
AND.W src,dst
AND.B src,dst Operation
src .and. dst dst
Beschreibung
Der Source-Operand und der Destination-Operand werden bitweise mit der logischen UND-Funktion verbunden. Der vorherige Inhalt des Destination-Operanden wird mit dem
72
Kapitel 4: Die Zentraleinheit
Ergebnis überschrieben. Der Source-Operand bleibt unverändert. Die logische UND-Funktion:
Status Bits
Beispiel
src-Bit
dst-Bit
Resultat-Bit
0
0
0
0
1
0
1
0
0
1
1
1
N
Wird gesetzt, falls das Ergebnis negativ ist (MSB = 1), wird zurückgesetzt, falls das Ergebnis positiv ist (MSB = 0).
Z
Wird gesetzt, falls das Ergebnis Null ist, wird zurückgesetzt, falls das Ergebnis nicht Null ist.
C
Wird gesetzt, wenn das Ergebnis nicht Null ist, wird zurückgesetzt, falls das Ergebnis Null ist. Das Carry Bit entspricht damit dem invertierten Zero Bit! C = .not. Z.
V
Wird immer zurückgesetzt.
Die Bits, die in R5 gesetzt sind, werden als Maske für das Wort TOM verwendet. Falls das Resultat Null ist, wird zum Label TONI gesprungen. AND JZ ...
Beispiel
; TOM .and. R5 -> TOM ; Resultat = 0 ; Result ist nicht Null
Die Bits die im unteren Byte von R5 gesetzt sind, werden als Maske für das Byte TOM verwendet. Falls das Resultat nicht Null ist, wird zum Label TONI gesprungen. AND.B JNZ ...
%,& %,&%
R5,TOM TONI
R5,TOM TONI
; Bytes TOM .and. R5 -> TOM ; Resultat ist nicht Null ; Result = 0
Bits im Destination-Wort zurücksetzen Bits im Destination-Byte zurücksetzen
Name
Clear Bits in destination
Syntax
BIC
src,dst
BIC.B
src,dst
Operation
oder
.not. src .and. dst dst
BIC.W
src,dst
4.6 Der Befehlssatz
Beschreibung
Status Bits
Beispiel
Der invertierte Source-Operand und der Destination-Operand werden mit der logischen UND-Funktion verbunden, d.h. Bits, die im Source-Operanden gesetzt sind (1), löschen die entsprechenden Bits im Destination-Operanden. Bits die nicht gesetzt sind (0) haben keine Wirkung. Der vorherige Inhalt des Destination-Operanden wird mit dem Ergebnis überschrieben. Der Source-Operand bleibt unverändert. Die Funktion des BIC-Befehls: src-Bit
dst-Bit
Resultat-Bit
0
0
0
0
1
1
1
0
0
1
1
0
N
Wird nicht verändert.
Z
Wird nicht verändert.
C
Wird nicht verändert.
V
Wird nicht verändert.
Die sechs MSBs des RAM-Wortes LEO werden zurückgesetzt. BIC
Beispiel
; Loesche 6 MSBs in Wort LEO
#01Fh,LEO
; Loesche 5 LSBs in Byte LEO
Die Portpins P1.0 und P1.1 werden zurückgesetzt und als Ausgänge geschaltet. BIC.B BIS.B
%,6 %,6%
#0FC00h,LEO
Die fünf LSBs des RAM-Bytes LEO werden zurückgesetzt. BIC.B
Beispiel
73
#2+1,&P1OUT #2+1,&P1DIR
; P1.0 und P1.1 Info = 0 ; P1.0 und P1.1 Ausgaenge
Bits in Destination-Wort setzen Bits in Destination-Byte setzen
Name
Set Bits in destination
Syntax
BIS
src,dst
BIS.B
src,dst
oder
BIS.W
src,dst
Operation
src .or. dst dst
Beschreibung
Der Source-Operand und der Destination-Operand werden mit der logischen ODER-Funktion verbunden, d.h. Bits die im
74
Kapitel 4: Die Zentraleinheit
Source-Operanden gesetzt sind (1), setzen die zugehörigen Bits im Destination-Operanden. Bits die nicht gesetzt sind (0) haben keine Wirkung. Der vorherige Inhalt des DestinationOperanden wird mit dem Ergebnis überschrieben. Der SourceOperand bleibt unverändert. Die logische ODER-Funktion:
Status Bits
Beispiel
src-Bit
dst-Bit
Resultat-Bit
0
0
0
0
1
1
1
0
1
1
1
1
N
Wird nicht verändert.
Z
Wird nicht verändert.
C
Wird nicht verändert.
V
Wird nicht verändert.
Die sechs LSBs des RAM-Wortes TOM werden gesetzt. BIS
Beispiel
; Starte Timer_A
#0E0h,TOM
; 3 MSBs im Byte TOM = 1
Die Ports P2.3 and P2.5 werden als Ausgänge geschaltet und gesetzt. BIS.B BIS.B
%,7 %,7%
#MC1,&TACTL
Die drei MSBs des RAM-Bytes TOM werden gesetzt. BIS.B
Beispiel
; 6 LSBs im Wort TOM = 1
Starte den Timer_A in Continuous Mode (MC1 = 20h). BIS
Beispiel
#003Fh,TOM
#20h+8,&P2DIR #20h+8,&P2OUT
; P2.5 und P2.3 Ausgaenge ; P2.5 und P2.3 setzen
Teste Bits im Destination-Wort Teste Bits im Destination-Byte
Name
Test Bits in destination
Syntax
BIT
src,dst
BIT.B
src,dst
oder
BIT.W
src,dst
Operation
src .and. dst SR
Beschreibung
Der Source-Operand und der Destination-Operand werden mit der logischen UND-Funktion verbunden, d.h. nur Bits die im
4.6 Der Befehlssatz
75
Source- und Destination-Operanden gesetzt (1) sind, werden auch im Ergebnis gesetzt. Das Ergebnis beeinflusst nur die Bits im Status Register SR. Die Inhalte der beiden Operanden bleiben erhalten. Anmerkung: Der Befehl BIT.B löscht das obere Byte eines als Destination verwendeten Arbeitsregisters NICHT, da kein Schreibbefehl auf das Arbeitsregister erfolgt (es wird nur gelesen). Status Bits
Beispiel
N
Wird gesetzt, falls das MSB des Ergebnisses gesetzt ist, wird zurückgesetzt, falls das MSB nicht gesetzt ist.
Z
Wird gesetzt, falls das Ergebnis Null ist, wird zurückgesetzt, falls das Ergebnis nicht Null ist.
C
Wird gesetzt, wenn das Ergebnis nicht Null ist, wird zurückgesetzt, falls das Ergebnis Null ist. Das Carry Bit entspricht damit dem invertierten Zero Bit! C = .not. Z.
V
Wird immer zurückgesetzt.
Falls Bit 9 in R8 gesetzt ist, soll zum Label TOM gesprungen werden. BIT JNZ ...
Beispiel
; Bit 9 in R8 gesetzt? ; Ja, springe zum Label TOM ; Nein, hier weitermachen
Die Information des Ports P1.0 wird nach links in das LSB des R5 geschoben. Die Bit-Info ist im Carry enthalten, da C = .not.Z ist. BIT.B RLC
%5 %5$1&+
#0200h,R8 TOM
#1h,&P1IN R5
; Bit 0 in P1.0 gesetzt? ; Bit-Info in LSB schieben
Programmfortsetzung bei Inhalt des Destination-Wortes Programmfortsetzung bei Inhalt des Destination-Wortes (alternative Form)
Name
Branch to destination
Syntax
BR
dst
BRANCH
dst
Operation
dst PC
Emulation
MOV
Beschreibung
Ein unbedingter Sprung zu einer Adresse, die an beliebiger Stelle des 64-K-Adressraums liegen kann, wird durchgeführt. Alle sieben Adressierungsarten können verwendet werden.
dst,PC
76
Kapitel 4: Die Zentraleinheit
Anmerkung: Es wird nicht zu der Adresse dst gesprungen, sondern zu der Adresse, die in dem Wort dst steht! Diese – zum Teil indirekt, indirekte Adressierung führt oft zu Programmfehlern. Status Bits
Die Status Bits werden nicht verändert.
Beispiele
Beispiele für alle sieben Adressierungsarten werden angeführt.
Immediate Mode: Die häufigste Adressierungsart für den BR-Befehl: Das Label zu dem gesprungen werden soll, wird damit adressiert. Auch die direkte Angabe einer Adresse z.B. #0AA00h ist möglich. Die Emulation geschieht durch MOV @PC+,PC BR BR
#EXEC #0AA00h
; Branch zum Label EXEC ; Branch zur Adresse 0AA00h
Register Mode: Die Adresse zu der gesprungen werden soll, steht in dem verwendeten Arbeitsregister Rx. Durch die Verwendung eines Arbeitsregisters kann eine berechnete Sprungadresse verwendet werden, d.h. diese kann sich den Umständen entsprechend ändern! Die Emulation geschieht durch MOV Rx,PC BR
R5
; Branch zur Adresse in R5
Indirect Mode: Die Adresse zu der gesprungen werden soll, steht in dem Wort, auf das das verwendete Arbeitsregister Rx zeigt. Es handelt sich also um eine indirekt, indirekte Adressierung! Durch die Verwendung eines Arbeitsregisters kann eine berechnete Sprungadresse in einer Tabelle verwendet werden, d.h. diese kann sich den Umständen entsprechend ändern! Die Emulation geschieht durch MOV @Rx,PC BR
@R7
; Branch indirekt, indirekt R7
Indirect Autoincrement Mode: Die Adresse zu der gesprungen werden soll, steht in dem Wort, auf welches das verwendete Arbeitsregister Rx zeigt. Es handelt sich also um eine indirekt, indirekte Adressierung! Durch die Verwendung eines Arbeitsregisters kann eine berechnete Sprungadresse in einer Tabelle verwendet werden, d.h. diese kann sich den Umständen entsprechend ändern! Durch die automatische Erhöhung des Arbeitsregisters um 2 kann eine Tabelle mit Sprungadressen abgearbeitet werden (siehe Beispiel unten). Die Emulation geschieht durch MOV @Rx+,PC MOV .... BR ....
#TAB,R5 @R5+
; ; ; ;
R5 zeigt auf 1. Wert in Tabelle Programm geht weiter Branch ind., ind. R5. Dann R5+2 Naechster TAB-Wert aktuell
4.6 Der Befehlssatz TAB
dw dw .... dw
LABEL0 LABEL1
; 1. Durchlauf: Sprung zu LABEL0 ; 2. Durchlauf: Sprung zu LABEL1
LABELn
; (n+1). Durchlauf: LABELn
77
Indexed Mode: Die Adresse zu der gesprungen werden soll, steht in dem Wort, das durch die Summe von Arbeitsregisterinhalt in Rx und dem Index X adressiert wird. Es handelt sich also um eine indirekt, indirekte Adressierung! Durch die Verwendung eines Arbeitsregisters kann eine berechnete Sprungadresse in einer Tabelle verwendet werden, d.h. diese kann sich den Umständen entsprechend ändern (siehe Beispiel unten)! Die Emulation geschieht durch MOV X(Rx),PC
TAB
CLR .... BR .... dw dw .... dw
R5 TAB(R5)
; Relativen Tabellenanfang laden ; Programm geht weiter ; Branch abhaengig von R5
LABEL0 LABEL1
; Falls R5 = 0: Sprung zu LABEL0 ; Falls R5 = 2: Sprung zu LABEL1
LABELn
; Falls R5 = 2n: Sprung zu LABELn
Symbolic Mode: Die Adresse zu der gesprungen werden soll, steht in dem adressierten Wort. Es handelt sich also um eine indirekte Adressierung! Die Emulation geschieht durch MOV X(PC),PC BR
EXEC
; Branch zur Adresse im Wort EXEC
Absolute Mode: Die Adresse zu der gesprungen werden soll, steht in dem absolut adressierten Wort. Es handelt sich also um eine indirekte Adressierung! Die Emulation geschieht durch MOV X(SR),PC d.h. MOV X,PC, da hier SR = 0 ist BR
&EXEC
; Branch zur Adresse im Wort EXEC
&$//
Subroutinenaufruf
Name
Call Subroutine
Syntax
CALL
Operation
dst tmp
dst Destination wird berechnet und gespeichert.
SP – 2 SP Der Stack Pointer wird dekrementiert. PC @SP
Die Rückkehradresse wird auf den Stack geschrieben: Der PC zeigt auf den Befehl nach dem CALL.
78
Kapitel 4: Die Zentraleinheit
tmp PC
Beschreibung
Destination wird in den PC geschrieben: Das Programm fährt an der Startadresse der Subroutine fort.
Ein Subroutinenaufruf zu einer Adresse, die an beliebiger Stelle des 64-K-Adressraums liegen kann, wird durchgeführt. Alle sieben Source-Adressierungsarten können verwendet werden. Die berechnete Rückkehradresse (die Adresse des Befehls, der auf den CALL-Befehl folgt) wird auf dem Stack gespeichert. Der RET-Befehl verwendet diese Adresse zur Rückkehr aus der Subroutine. Anmerkung: Es wird nicht zu der Adresse dst gesprungen, sondern zu der Adresse, die in dem Wort dst steht! Diese – zum Teil indirekt, indirekte Adressierung führt oft zu Programmfehlern.
Status Bits
Die Status Bits werden nicht verändert: Die Subroutine kann also den Status verwenden.
Beispiele
Beispiele für alle sieben Adressierungsarten werden angeführt. Beim Ablauf ist zu beachten, dass der Program Counter PC sofort nach dem Lesen eines Befehlswortes (nämlich des CALLs) um 2 erhöht wird: Er zeigt also bereits auf das nächste Wort, in dem der Befehl nach der Subroutinenrückkehr steht (Register Mode, Indirect Mode, Indirect Autoincrement Mode) oder aber auf das 2. Wort des Subroutinenaufrufs (Immediate Mode, Symbolic Mode, Absolute Mode, Indexed Mode). In den letzten vier Fällen wird der Program Counter PC vor dem Speichern nochmals um 2 – insgesamt also um 4 – erhöht, um das 2. Wort des Befehls zu überspringen.
Immediate Mode: Die häufigste Adressierungsart für den CALL-Befehl: Das Label an dem die Subroutine startet, wird damit adressiert. Auch die absolute Angabe einer Startadresse, wie z.B. #0AA00h, ist möglich. Ablauf: PC+2 PC, @PC+ tmp, SP-2 SP, PC @SP, tmp PC CALL CALL
#EXEC #0AA00h
; Sprung zur Subroutine EXEC ; Sprung zur Adresse 0AA00h
Register Mode: Die Adresse an der die Subroutine startet, steht in dem verwendeten Arbeitsregister Rx. Durch die Verwendung eines Arbeitsregisters kann eine berechnete Adresse verwendet werden, d.h. diese kann sich den Umständen entsprechend ändern! Ablauf: PC+2 PC, Rx tmp, SP-2 SP, PC @SP, tmp PC CALL
R5
; Sprung zur Adresse in R5
4.6 Der Befehlssatz
79
Indirect Mode: Die Adresse an der die Subroutine startet, steht in dem Wort, auf welches das verwendete Arbeitsregister Rx zeigt. Es handelt sich also um eine indirekt, indirekte Adressierung! Durch die Verwendung eines Arbeitsregisters kann eine berechnete Subroutinenadresse in einer Tabelle verwendet werden, d.h. diese kann sich den Umständen entsprechend ändern! Ablauf: PC+2 PC, @Rx tmp, SP-2 SP, PC @SP, tmp PC CALL
@R7
; Springe indirekt, indirekt R7
Indirect Autoincrement Mode: Die Adresse an der die Subroutine startet, steht in dem Wort, auf welches das verwendete Arbeitsregister Rx zeigt. Es handelt sich also um eine indirekt, indirekte Adressierung! Durch die Verwendung eines Arbeitsregisters kann eine berechnete Subroutinenadresse in einer Tabelle verwendet werden, d.h. diese kann sich den Umständen entsprechend ändern! Durch die automatische Erhöhung des Arbeitsregisters um 2 kann eine Tabelle mit Sprungadressen abgearbeitet werden (siehe Beispiel unten). Ablauf: PC+2 PC, @Rx+ tmp, SP-2 SP, PC @SP, tmp PC
TAB
MOV .... CALL .... dw dw .... dw
#TAB,R5 @R5+ SUBR0 SUBR1 SUBRn
; ; ; ; ; ; ; ;
R5 zeigt auf 1. Tab.Wert Programm geht weiter Ind., ind. R5. Dann R5+2 Naechster Tab.Wert aktuell 1. Durchlauf: Subroutine SUBR0 2. Durchlauf: Subroutine SUBR1 Durchlaeufe 3 bis n (n+1): Subroutine SUBRn
Indexed Mode: Die Adresse an der die Subroutine startet, steht in dem Wort, das durch die Summe von Arbeitsregisterinhalt in Rx und dem Index X adressiert wird. Es handelt sich also um eine indirekt, indirekte Adressierung! Durch die Verwendung eines Arbeitsregisters kann eine berechnete Sprungadresse in einer Tabelle verwendet werden, d.h. diese kann sich den Umständen entsprechend ändern (siehe Beispiel unten)! Ablauf: PC+2 PC, X(Rx) tmp, SP-2 SP, PC+2 @SP, tmp PC
TAB
CLR .... CALL .... dw dw .... dw
R5 TAB(R5)
; Relativen Tabellenanfang laden ; Programm geht weiter ; Aufruf abhaengig von R5
SUBR0 SUBR1
; R5 = 0: Subroutine SUBR0 ; R5 = 2: Subroutine SUBR1
SUBRn
; R5 = 2n: Subroutine SUBRn
Symbolic Mode: Die Adresse an der die Subroutine startet, steht in dem adressierten Wort. Es handelt sich also um eine indirekte Adressierung!
80
Kapitel 4: Die Zentraleinheit
Ablauf: PC+2 PC, X(PC) tmp, PC+2 PC, SP-2 SP, PC @SP, tmp PC CALL
EXEC
; Sprung zur Adresse in EXEC
Absolute Mode: Die Adresse an der die Subroutine startet, steht in dem absolut adressierten Wort. Es handelt sich also um eine indirekte Adressierung! Ablauf: PC+2 PC, X(SR) tmp, PC+2 PC, SP-2 SP, PC @SP, tmp PC CALL
&/5 &/5%
&EXEC
; Sprung zur Adresse in EXEC
Destination-Wort zu Null setzen Destination-Byte zu Null setzen
Name
Clear destination
Syntax
CLR
dst
oder
CLR.W
dst
CLR.B dst Operation
0 dst
Emulation
MOV
#0,dst
MOV.B #0,dst Beschreibung
Das Destination-Wort bzw. –Byte wird zu Null gesetzt.
Status Bits
Die Status Bits werden nicht verändert.
Beispiel
Das RAM-Wort TONI wird gelöscht. CLR
Beispiel
; 0000h -> TONI
Register R5 wird gelöscht. CLR
Beispiel
TONI
R5
; 0000h -> R5
Das RAM-Byte TONI wird gelöscht. CLR.B
TONI
; 00h -> TONI
&/5&
Carry Bit löschen
Name
Clear Carry bit
Syntax
CLRC
Operation
0 C intern:
Emulation
BIC
Beschreibung
Das Carry Bit im Status Register SR wird gelöscht. CLRC ist ein Wortbefehl.
Status Bits
N
Wird nicht verändert.
Z
Wird nicht verändert.
(.not. #1 .and. SR SR)
#1,SR
4.6 Der Befehlssatz
Beispiel
C
Wird zu Null gesetzt.
V
Wird nicht verändert.
81
Der dezimale 16-Bit-Zähler (4 Stellen) auf den R13 zeigt, wird zu einem dezimalen 32-Bit-Zähler (8 Stellen) addiert, auf den R12 zeigt. CLRC DADD DADC
@R13,0(R12) 2(R12)
; C 79h).
84
Kapitel 4: Die Zentraleinheit
Wird zurückgesetzt, falls das MSB des Ergebnisses 0 ist (Wort < 8000h, Byte < 80h). Z
Wird gesetzt, falls das Ergebnis Null ist, sonst zurückgesetzt.
C
Wort-Befehl: Wird gesetzt, falls das DestinationWort von 9999 auf 0000 überläuft, sonst zurückgesetzt. Byte-Befehl: Wird gesetzt, falls das DestinationByte von 99 auf 00 überläuft, sonst zurückgesetzt.
V Beispiel
Die 4-stellige Dezimalzahl in R5 wird zu einer 8-stelligen Dezimalzahl, auf die R8 zeigt, addiert. CLRC DADD DADC
Beispiel
; Reset Carry ; Addiere 4 LSDs + (C = 0) ; Addiere C zu den 4 MSDs
R5,0(R8) 2(R8)
Die 2-stellige Dezimalzahl im unteren Byte von R5 wird zu einer 4-stelligen Dezimalzahl, auf die R8 zeigt, addiert. R8 kann auch ungeraden Inhalt haben! CLRC DADD.B DADC.B
'$'' '$''%
Undefiniert.
; Reset Carry ; Addiere 2 LSDs + (C = 0) ; Addiere C zu den 2 MSDs
R5,0(R8) 1(R8)
Addiere Source und Carry dezimal zum Destination-Wort Addiere Source und Carry dezimal zum Destination-Byte
Name
Source and Carry Added Decimally to destination
Syntax
DADD
src,dst
oder
DADD.W src,dst
DADD.B src,dst Operation
src + dst + C dst (dezimal)
Beschreibung
Der Source-Operand und der Destination-Operand werden als je vier bzw. zwei binär codierte, positive Dezimalzahlen (BCD) betrachtet. Der Source-Operand und der Carry C werden dezimal zum Destination-Operand addiert. Der SourceOperand bleibt unverändert, der Destination-Operand wird mit dem Ergebnis überschrieben. Das Ergebnis ist undefiniert für Ausgangsziffern außerhalb des Dezimalbereichs (0..9). Anmerkung: Eine Subroutine DSUB für die im MSP430 nicht implementierte dezimale Subtraktion ist beim Befehl SETC gezeigt.
4.6 Der Befehlssatz
Status Bits
N
85
Wird gesetzt, falls das MSB des Ergebnisses 1 ist (Wort > 7999h, Byte >79h). Wird zurückgesetzt, falls das MSB des Ergebnisses 0 ist (Wort < 8000h, Byte < 80h).
Z
Wird gesetzt, falls das Ergebnis Null ist, sonst zurückgesetzt.
C
Wort-Befehl: Wird gesetzt, falls das DestinationWort über 9999 überläuft, sonst zurückgesetzt. Byte-Befehl: Wird gesetzt, falls das DestinationByte über 99 überläuft, sonst zurückgesetzt.
V Beispiel
Die 8-stellige Dezimalzahl, auf die R5 zeigt, wird zu einer 8stelligen Dezimalzahl, die in R4 und R3 enthalten ist, addiert. (R4 enthält die MSDs). CLRC DADD DADD JC ...
Beispiel
Undefiniert.
; ; ; ; ;
@R5+,R3 @R5+,R4 Overflow
Carry loeschen Addiere 4 LSDs + (C = 0) Addiere 4 MSDs + C Falls C = 1: > 99999999 Kein Ueberlauf
Der 2-stellige, dezimale Zähler in RAM-Byte CNT wird um 1 erhöht. CLRC DADD.B
#1,CNT
; Carry loeschen ; Dezimalzaehler + 1
#0,CNT
; Carry setzen ; entspricht DADC.B
oder SETC DADD.B
'(& '(&%
CNT
Dekrementiere Destination-Wort Dekrementiere Destination-Byte
Name
Decrement destination
Syntax
DEC
dst
oder
DEC.W
dst
DEC.B dst Operation Emulation
Wort: dst – 1 dst
intern: dst + FFFEh + 1 dst
Byte: dst – 1 dst
intern: dst + FEh + 1 dst
SUB
#1,dst
SUB.B #1,dst Beschreibung
Der Destination-Operand wird um Eins erniedrigt und mit diesem Wert überschrieben.
86
Kapitel 4: Die Zentraleinheit
Status Bits
N
Wird gesetzt, falls das Ergebnis negativ ist (MSB = 1). Wird zurückgesetzt, falls das Ergebnis positiv ist (MSB = 0).
Z
Wird gesetzt, falls das Ergebnis Null ist (dst war 1), sonst zurückgesetzt.
C
Wort-Befehl: Wird zurückgesetzt, falls das Destination-Wort von 0000 auf FFFFh wechselte, sonst gesetzt. Byte-Befehl: Wird zurückgesetzt, falls das Destination-Byte von 00 auf FFh wechselte, sonst gesetzt.
V
Wort-Befehl: Wird gesetzt, falls das DestinationWort 08000h enthielt (jetzt 07FFFh), sonst zurückgesetzt. Byte-Befehl: Wird gesetzt, falls das DestinationByte 080h enthielt (jetzt 07Fh), sonst zurückgesetzt.
Beispiel
Das RAM-Wort LEO wird um 1 erniedrigt. Falls es dann Null enthält, wird nach LABELx gesprungen. DEC JZ ...
Beispiel
LEO LABELx
; LEO – 1 -> LEO ; LEO enthaelt 0 ; LEO enthaelt nicht 0
Transferiere einen Block von 255 Bytes von der Adresse EDE zum RAM, Startadresse TONI. Es wird nur ein Arbeitsregister R6 für die beiden Adressen verwendet!
L$1
'(&' '(&'%
MOV MOV.B MOV.B DEC.B JNZ ...
#EDE,R6 ; Source-Adresse in R6 laden #255,LEO ; Anzahl Bytes in LEO @R6+,TONI-EDE-1(R6) ; Transfer nur mit R6! LEO ; Zaehler fuer Bytes dekr. L$1 ; Weitermachen: LEO > 0 ; Fertig: LEO = 0
Dekrementiere Destination-Wort mit Zwei Dekrementiere Destination-Byte mit Zwei
Name
Double-Decrement destination
Syntax
DECD
dst
oder
DECD.W dst
DECD.B dst Operation Emulation
Wort: dst – 2 dst
intern: dst + FFFDh + 1 dst
Byte: dst – 2 dst
intern: dst + FDh + 1 dst
SUB
#2,dst
SUB.B #2,dst
4.6 Der Befehlssatz
87
Beschreibung
Der Destination-Operand wird um Zwei erniedrigt und mit dem Resultat überschrieben.
Status Bits
N
Wird gesetzt, falls das Ergebnis negativ ist (MSB = 1). Wird zurückgesetzt, falls das Ergebnis positiv ist (MSB = 0).
Z
Wird gesetzt, falls das Ergebnis Null ist (dst war 2), sonst zurückgesetzt.
C
Wort-Befehl: Wird zurückgesetzt, falls das Destination-Wort 0000h oder 0001h enthielt, sonst gesetzt. Byte-Befehl: Wird zurückgesetzt, falls das Destination-Byte 00h oder 01h enthielt, sonst gesetzt.
V
Wort-Befehl: Wird gesetzt, falls das DestinationWort 08000h oder 8001h enthielt, sonst zurückgesetzt. Byte-Befehl: Wird gesetzt, falls das DestinationByte 080h oder 81h enthielt, sonst zurückgesetzt.
Beispiel
Das RAM-Wort LEO wird um 2 erniedrigt. Falls es dann nicht Null enthält, wird nach LABELx gesprungen. DECD JNZ ...
Beispiel
LEO LABELx
; LEO – 2 -> LEO ; LEO enthaelt nicht 0 ; LEO enthaelt 0
Transferiere einen Block von 200 Worten von der Adresse EDE rückwärts zum RAM, startend an Adresse TONI. Es wird nur ein Arbeitsregister R6 für die beiden Adressen verwendet! ;
L$1
Beispiel
MOV MOV.B MOV DECD DEC.B JNZ ...
#EDE,R6 ; Source-Adresse in R6 laden #200,R5 ; Anzahl Worte in R5 @R6,TONI-EDE(R6) ; Transfer nur mit R6! R6 ; Zeiger um 2 dekrementieren R5 ; Zaehler dekrementieren L$1 ; Weitermachen: R5 > 0 ; Fertig: R5 = 0
Das RAM-Byte LEO wird um 2 dekrementiert. DECD.B
LEO
',17
Interrupt ausschalten
Name
Disable Interrupts
Syntax
DINT
; Dekrementiere LEO um 2
88
Kapitel 4: Die Zentraleinheit
Operation
0 GIE intern:
.not. #8 .and. SR SR
Emulation
BIC
Beschreibung
Alle Interrupts werden abgeschaltet (disabled). Dazu wird das GIE-Bit im Status Register SR gelöscht.
#8,SR
Anmerkung: Der Befehl der dem DINT-Befehl folgt, wird noch ausgeführt. Das bedeutet, wenn eine Befehlssequenz nicht durch einen Interrupt unterbrochen werden darf, muss mindestens ein Befehl – z.B. ein NOP – zwischen dem DINT und der Befehlssequenz stehen. Siehe Beispiel unten. Status Bits
Beispiel
N
Wird nicht verändert.
Z
Wird nicht verändert.
C
Wird nicht verändert.
V
Wird nicht verändert.
GIE
Wird gelöscht.
Ein 32-Bit-Zähler der durch Interrupt weitergezählt wird, muss sicher in R6 und R5 ausgelesen werden können, ohne dass ein weiterer Interrupt einen der beiden Zählerteile verändert. Dies wird durch Ausschalten des GIE-Bits mit DINT erreicht. Für den NOP ist Interrupt noch möglich! DINT NOP MOV MOV EINT ... ...
COUNTHI,R6 COUNTLO,R5
; ; ; ; ; ; ;
Interrupts aus, ausser NMI Interrupt noch moeglich Zaehler sicher kopieren ohne Unterbrechung! Interrupts wieder ein Noch kein Intrpt moeglich Interrupt wieder moeglich
(,17
Interrupt einschalten
Name
Enable Interrupts
Syntax
EINT
Operation
1 GIE intern:
Emulation
BIS
Beschreibung
Alle Interrupts die aktiv geschaltet sind, werden eingeschaltet. Dazu wird das GIE-Bit im Status Register SR auf 1 gesetzt.
#8 .or. SR SR
#8,SR
Anmerkung: Der Befehl der dem EINT-Befehl folgt, wird noch nicht durch einen anstehenden Interrupt unterbrochen: Der Befehl wird noch ohne Unterbrechung ausgeführt. Status Bits
N
Wird nicht verändert.
Z
Wird nicht verändert.
C
Wird nicht verändert.
4.6 Der Befehlssatz
Beispiel
V
Wird nicht verändert.
GIE
Wird gesetzt.
89
Der Beginn einer Initialisierung wird gezeigt. INIT
MOV CALL ... EINT MainLoop equ ...
,1& ,1&%
#RAMEND+2,SP #CLRRAM
$
; ; ; ; ;
SP initialisieren RAM loeschen Weiter initialisieren Interrupt ein Beginn Hauptprogramm
Inkrementiere Destination-Wort Inkrementiere Destination-Byte
Name
Increment destination
Syntax
INC
dst
INC.B
dst
Operation
dst + 1 dst
Emulation
ADD
oder
INC.W
dst
#1,dst
ADD.B #1,dst Beschreibung
Der Destination-Operand wird um Eins erhöht und mit dem Resultat überschrieben.
Status Bits
N
Wird gesetzt, falls das Ergebnis negativ ist (MSB = 1). Wird zurückgesetzt, falls das Ergebnis positiv ist (MSB = 0).
Z
Wird gesetzt, falls das Ergebnis Null ist (dst war -1), sonst zurückgesetzt.
C
Wort-Befehl: Wird gesetzt, falls das DestinationWort von FFFFh auf 0000h wechselte, sonst zurückgesetzt. Byte-Befehl: Wird gesetzt, falls das DestinationByte von FFh auf 00h wechselte, sonst zurückgesetzt.
V
Wort-Befehl: Wird gesetzt, falls das DestinationWort 07FFFh enthielt (jetzt 8000h), sonst zurückgesetzt. Byte-Befehl: Wird gesetzt, falls das DestinationByte 07Fh enthielt (jetzt 80h), sonst zurückgesetzt.
90
Kapitel 4: Die Zentraleinheit
Beispiel
Der Wert auf den der byte-orientierte Software-SP in R4 (nicht der System Stack Pointer SP) zeigt, soll ohne Speicherung beseitigt werden. INC
Beispiel
; "Top of SW Stack" weg
Das Status-Byte STATUS eines Programms wird um Eins erhöht. Falls es dann 11 erreicht, wird zu einem Label OVFL gesprungen. INC.B CMP.B JEQ ...
,1&' ,1&'%
R4
STATUS #11,STATUS OVFL
; ; ; ;
Status in STATUS + 1 Ist Status = 11 erreicht? Ja, Sprung zu Label OVFL Nein, normal weiter
Inkrementiere Destination-Wort mit Zwei Inkrementiere Destination-Byte mit Zwei
Name
Double Increment destination
Syntax
INCD
dst
oder
INCD.W dst
INCD.B dst Operation
dst + 2 dst
Emulation
ADD
#2,dst
ADD.B #2,dst Beschreibung
Der Destination-Operand wird um Zwei erhöht und mit dem Resultat überschrieben.
Status Bits
N
Wird gesetzt, falls das Ergebnis negativ ist (MSB = 1). Wird zurückgesetzt, falls das Ergebnis positiv ist (MSB = 0).
Z
Wird gesetzt, falls das Ergebnis Null ist (dst war -2), sonst zurückgesetzt.
C
Wort-Befehl: Wird gesetzt, falls das DestinationWort FFFEh oder FFFFh enthielt, sonst zurückgesetzt. Byte-Befehl: Wird gesetzt, falls das DestinationByte FEh oder FFh enthielt, sonst zurückgesetzt.
V
Wort-Befehl: Wird gesetzt, falls das DestinationWort 07FFEh oder 7FFFh enthielt, sonst zurückgesetzt. Byte-Befehl: Wird gesetzt, falls das DestinationByte 07Eh oder 07Fh enthielt, sonst zurückgesetzt.
4.6 Der Befehlssatz
Beispiel
91
Das Resultat einer Berechnung in R5 wird auf dem SystemStack gespeichert. Vor dem Ende der Subroutine soll es ohne Benutzung eines Arbeitsregisters vom Stack entfernt werden. PUSH ... INCD RET
Beispiel
R5 SP
; ; ; ;
Resultat auf Stack Weiter in der Subroutine Stack berichtigen Korrekte Rueckkehr
Das Byte auf das der Stack Pointer SP zeigt, soll um 2 erhöht werden. INCD.B
Beispiel
0(SP)
; Byte um 2 erhoehen (TOS)
Eine Wort-Tabelle, auf die R13 zeigt, soll in einen RAM-Teil, auf den R14 zeigt, kopiert werden.
LOOP
,19 ,19%
MOV MOV MOV INCD CMP JLO ...
#BEGINN,R13 #RAMT,R14 @R13+,0(R14) R14 #END,R13 LOOP
; ; ; ; ; ; ;
Beginn Source-Tabelle Beginn RAM (dst) Naechstes Wort kopieren Dest.-Zeiger erhoehen Ende Source erreicht? Nein, weiter kopieren Ja, fertig
Invertiere Destination-Wort Invertiere Destination-Byte
Name
Invert destination
Syntax
INV
dst
INV.B
dst
Operation
.not. dst dst
Emulation
XOR
#0FFFFh,dst
XOR.B #0FFh,dst Beschreibung
Der Destination-Operand wird bitweise invertiert (0 1 und 1 0) und mit dem Resultat überschrieben. Der INV-Befehl generiert das Einerkomplement des Destination-Operanden. Anmerkung: Auch die Konstante FFh kommt aus dem Constant Generator. Es wird das untere Byte des Wertes FFFFh verwendet.
Status Bits
N
Wird gesetzt, falls das MSB des Ergebnisses 1 ist. Wird zurückgesetzt, falls das MSB des Ergebnisses 0 ist.
Z
Wird gesetzt, falls das Ergebnis Null ist (dst war -1), sonst zurückgesetzt.
92
Kapitel 4: Die Zentraleinheit
Beispiel
C
Wird gesetzt, falls das Resultat nicht Null ist, sonst zurückgesetzt (C = .not. Z).
V
Wird gesetzt, falls der Destination-Operand negativ war, sonst zurückgesetzt.
Der Inhalt von R5 soll negiert werden (Zweierkomplement der Zahl). R5 enthält als Beispiel 1234h. INV INC
Beispiel
Name
; R5 invertieren: EDCBh ; 2er-Kompl.:-1234h = EDCCh
Der Inhalt des RAM-Bytes LEO soll negiert werden. LEO enthält als Beispiel F1h. INV.B INC.B
-& -+6
R5 R5
LEO LEO
; LEO invertieren: 0Eh ; 2er-Kompl.: -F1h = 0Fh
Springe falls Carry Bit gesetzt Springe falls größer oder gleich (vorzeichenlos) Jump if Carry set Jump if Higher or Same
Syntax Operation
JC
label
JHS
label
falls C = 1: PC + 2 Offset PC falls C = 0: Den folgenden Befehl ausführen
Beschreibung
Das Carry Bit C des Status Registers SR wird getestet. Falls es gesetzt ist, wird der vorzeichenbehaftete 10-Bit-Offset, der in den LSBs des Befehls enthalten ist, mit Zwei multipliziert und zum Program Counter PC addiert. Falls C nicht gesetzt ist, wird der Befehl nach dem JC/JHS ausgeführt. JC wird für die Abfrage des Carry Bits verwendet. JHS wird für den Vergleich von vorzeichenlosen Zahlen verwendet: Wort-Operand: 0000h ist die kleinste, FFFFh die größte Zahl. Byte-Operand: 00h ist die kleinste, FFh die größte Zahl.
Status Bits
Die Status Bits werden nicht verändert. Es können also noch weitere bedingte Sprünge nachfolgen.
Beispiel
Falls der Inhalt von R5 größer oder gleich 15 ist, soll zum Label LABEL verzweigt werden. CMP JHS ...
#15,R5 LABEL
; R5 – 15 -> SR ; 14 < R5 FFFFh: Zu LABEL ; R5 < 15: Normal weiter
4.6 Der Befehlssatz
Beispiel
Das Signal am Eingangsport P1.1 wird für die Kontrolle des Programmablaufs verwendet. Falls es 1 ist, soll zum Label PROGA verzweigt werden. BIT.B JC ...
-= -(4 Name
93
#2,&P1IN PROGA
; Info an P1.1 in C lesen ; P1.1 = 1: Zu PROGA ; P1.1 = 0: Normal weiter
Springe falls Zero Bit gesetzt Springe falls gleich Jump if Zero Jump if Equal
Syntax Operation
JZ
label
JEQ
label
falls Z = 1: PC + 2 Offset PC falls Z = 0: Den folgenden Befehl ausführen
Beschreibung
Das Zero Bit Z des Status Registers SR wird getestet. Falls es gesetzt ist, wird der vorzeichenbehaftete 10-Bit-Offset, der in den LSBs des Befehls enthalten ist, mit Zwei multipliziert und zum Program Counter PC addiert. Falls Z nicht gesetzt ist, wird der Befehl nach dem JZ/JEQ ausgeführt. JZ wird für den Vergleich mit Null verwendet, z.B. nach dem Befehl TST. JEQ wird für den Vergleich zweier Operanden verwendet, z.B. nach dem Befehl CMP.
Status Bits
Die Status Bits werden nicht verändert. Es können also noch weitere bedingte Sprünge nachfolgen.
Beispiel
Falls R7 Null enthält, soll zum Label LABEL gesprungen werden. TST JZ ...
Beispiel
R7 LABEL
; R7 mit 0 vergleichen ; R7 = 0: Zu LABEL springen ; R7 0: Normal weiter
Falls R6 den gleichen Inhalt wie das adressierte Tabellenwort hat, soll zum Label LABEL gesprungen werden. CMP JEQ ...
R6,TAB(R5) LABEL
; R6 und Tabelle gleich? ; Ja: Zu LABEL springen ; Nein: Normal weiter
94
Kapitel 4: Die Zentraleinheit
Beispiel
Falls das untere Byte von R5 Null enthält, soll zum Label LABEL gesprungen werden. Achtung: R5 wird trotz ByteAdressierung NICHT verändert. TST.B JZ ...
R5 LABEL
; Unteres Byte von R5 testen ; Falls 0: Zu LABEL springen ; Nicht 0: Normal weiter
-*(
Springe falls größer oder gleich (vorzeichenbehaftet)
Name
Jump if Greater or Equal
Syntax
JGE
Operation
falls (N .xor. V) = 0: PC + 2 Offset PC
label
falls (N .xor. V) = 1: Den folgenden Befehl ausführen Beschreibung
Vergleich vorzeichenbehafteter Zahlen: Das Negativ Bit N und das Overflow Bit V im Status Register SR werden getestet. Falls sowohl N als auch V gesetzt oder beide zurückgesetzt sind, wird der vorzeichenbehaftete 10-Bit-Offset, der in den LSBs des Befehls enthalten ist, mit Zwei multipliziert und zum Program Counter PC addiert: Der Sprung wird ausgeführt. Falls nur eines der beiden Bits gesetzt ist, wird der Befehl nach dem JGE ausgeführt. Durch die Korrektur mit dem Overflow Bit V werden alle Vergleiche richtig bewertet, obwohl die Resultate der vorausgegangenen CMP- oder SUB-Befehle durch Überlauf falsch sein können! JGE wird für den Vergleich von vorzeichenbehafteten Zahlen verwendet: Wort-Operand: 8000h ist die kleinste, 7FFFh die größte Zahl. Byte-Operand: 80h ist die kleinste, 7Fh die größte Zahl. JGE kann nach den Befehlen AND, RRA, BIT und TST als JP (Jump if Positive, Springe falls positiv) verwendet werden: Diese vier Befehle löschen das Overflow Bit und lassen daher nur das Negativ Bit wirken.
Status Bits
Die Status Bits werden nicht verändert. Es können also noch weitere bedingte Sprünge nachfolgen.
Beispiel
Falls der Inhalt von R6 größer oder gleich dem Inhalt des von R7 adressierten Wortes ist, soll zum Label LABEL gesprungen werden. Zahlen mit Vorzeichen! CMP JGE ...
@R7,R6 LABEL
; Ist R6 @R7 ; Ja: Zu LABEL springen ; Nein: Normal weiter
4.6 Der Befehlssatz
Beispiel
95
Falls der Inhalt von Byte EDE positiv ist, d.h. 0 bis 7Fh, soll zum Label LABEL gesprungen werden. Zahlen mit Vorzeichen! TST.B JGE ...
EDE LABEL
; Ist EDE positiv? (V R6 ; R6 < R7: Zu LABEL springen ; R6 R7: Normal weiter
-03
Springe unbedingt
Name
Jump unconditionally
Syntax
JMP
Operation
PC + 2 Offset PC
Beschreibung
Der vorzeichenbehaftete 10-Bit-Offset, der in den LSBs des Befehls enthalten ist, wird mit Zwei multipliziert und zum Program Counter PC addiert. Der Befehl JMP – der nur ein Wort benötigt – kann den Befehl BR in allen Fällen ersetzen, in denen das Sprungziel in einem Bereich von –511 bis +512 Worten (!) liegt. Dieser Bereich ist das Achtfache des Sprungbereichs von 8-Bit-Rechnern (128 Bytes).
Status Bits
Die Status Bits werden nicht verändert.
Beispiel
Der JMP wird als kurzer BRANCH-Befehl verwendet: Der Status STATUS wird auf 10 gesetzt und dann zur Hauptschleife zurückgekehrt. MOV.B JMP
label
#10,STATUS MainLoop
; Status auf 10 setzen ; Zurueck zur Hauptschleife
-1
Springe falls negativ
Name
Jump if Negative
Syntax
JN
Operation
falls N = 1: PC + 2 Offset PC
label
falls N = 0: Den folgenden Befehl ausführen Beschreibung
Das Negativ Bit N im Status Register SR wird getestet. Falls es gesetzt ist, wird der vorzeichenbehaftete 10-Bit-Offset, der in den LSBs des Befehls enthalten ist, mit Zwei multipliziert und zum Program Counter PC addiert. Falls es nicht gesetzt ist, wird der Befehl nach dem JN ausgeführt. Anmerkung: Eine Möglichkeit für den – nicht implementierten – JP-Befehl (Springe falls positiv) ist in der Beschreibung des JGE-Befehls enthalten.
4.6 Der Befehlssatz
97
Status Bits
Die Status Bits werden nicht verändert. Es können also noch weitere bedingte Sprünge nachfolgen.
Beispiel
Das Resultat einer Berechnung in R5 soll von dem RAMWort COUNT subtrahiert werden. Falls das Resultat in COUNT negativ ist, soll COUNT gelöscht werden und an einer anderen Programmstelle fortgefahren werden.
L$1
Beispiel
SUB JN ... CLR ...
Name
COUNT
; ; ; ; ;
COUNT – R5 -> COUNT Falls negativ zu L$1 COUNT 0: hier weiter COUNT negativ (R5 > COUNT) Mit COUNT = 0 weiter
Das Byte COUNT soll getestet werden, ob es negativ ist. Falls ja, soll zum Label LABEL gesprungen werden. TST.B JN ...
-1& -/2
R5,COUNT L$1
COUNT LABEL
; COUNT – 0 -> SR ; COUNT negativ: 80h bis FFh ; COUNT positiv: 00h bis 7Fh
Springe falls Carry Bit nicht gesetzt Springe falls kleiner (vorzeichenlos) Jump if No Carry Jump if Lower
Syntax Operation
JNC
label
JLO
label
falls C = 0: PC + 2 Offset PC falls C = 1: Den folgenden Befehl ausführen
Beschreibung
Das Carry Bit C des Status Registers SR wird getestet. Falls es nicht gesetzt ist, wird der vorzeichenbehaftete 10-Bit-Offset, der in den LSBs des Befehls enthalten ist, mit Zwei multipliziert und zum Program Counter PC addiert. Falls C gesetzt ist, wird der Befehl nach dem JNC/JLO ausgeführt. JNC wird für die Abfrage des Carry Bits verwendet. JLO wird für den Vergleich von vorzeichenlosen Zahlen verwendet: Wort-Operand: 0000h ist die kleinste, FFFFh die größte Zahl. Byte-Operand: 00h ist die kleinste, FFh die größte Zahl.
Status Bits
Die Status Bits werden nicht verändert. Es können also noch weitere bedingte Sprünge nachfolgen.
98
Kapitel 4: Die Zentraleinheit
Beispiel
Das Resultat einer Berechnung in R6 wird auf das RAM-Wort BUFFER addiert. Falls ein Übertrag (Carry) auftritt, soll mit einer Fehlerroutine ERROR fortgefahren werden.
ERROR CONT
Beispiel
ADD JNC ... ... ...
Name
; BUFFER + R6 -> BUFFER ; C = 0: weiter bei CONT ; Start Fehlerroutine ; C = 0: Normal weiter
Falls das Byte STATUS entweder 1 oder 0 enthält, soll zum Label LABEL verzweigt werden. CMP.B JLO ...
-1= -1(
R6,BUFFER CONT
#2,STATUS LABEL
; STATUS – 2 -> SR ; STATUS < 2: Zu LABEL ; STATUS 2: Weiter hier
Springe falls Zero Bit nicht gesetzt Springe falls nicht gleich Jump if Not Zero Jump if Not Equal
Syntax Operation
JNZ
label
JNE
label
falls Z = 0: PC + 2 Offset PC falls Z = 1: Den folgenden Befehl ausführen
Beschreibung
Das Zero Bit Z des Status Registers SR wird getestet. Falls es nicht gesetzt ist, wird der vorzeichenbehaftete 10-Bit-Offset, der in den LSBs des Befehls enthalten ist, mit Zwei multipliziert und zum Program Counter PC addiert. Falls Z gesetzt ist, wird der Befehl nach dem JNZ/JNE ausgeführt. JNZ wird für den Vergleich mit Null verwendet, z.B. nach dem Befehl TST. JNE wird für den Vergleich zweier Operanden verwendet, z.B. nach dem Befehl CMP.
Status Bits
Die Status Bits werden nicht verändert. Es können also noch weitere bedingte Sprünge nachfolgen.
Beispiel
Falls R7 und R8 unterschiedliche Inhalte haben, soll zum Label LABEL verzweigt werden. CMP JNE ...
R7,R8 LABEL
; R8 – R7 -> SR ; R7 R8: Weiter bei LABEL ; R7 = R8: Weiter im Programm
4.6 Der Befehlssatz
Beispiel
99
Falls das untere Byte von R7 Null enthält, wird zum Label LABEL gesprungen. Das obere Byte von R7 wird nicht gelöscht! TST.B JZ ...
029 029%
R7 LABEL
; R7 – 0 -> SR ; R7 = 0: Weiter bei LABEL ; R7 ungleich 0: Weiter hier
Kopiere Source-Wort in Destination-Wort Kopiere Source-Byte in Destination-Byte
Name
Move source to destination
Syntax
MOV
src,dst
oder
MOV.W src,dst
MOV.B src,dst Operation
src dst
Beschreibung
Der Source-Operand wird in den Destination-Operanden geschrieben. Der Source-Operand wird nicht verändert.
Status Bits
Die Status Bits werden nicht verändert.
Beispiel
Eine Wort-Tabelle, auf die R13 zeigt, soll in einen RAM-Teil beginnend bei Label RAMT kopiert werden. Es sollen 20h Worte übertragen werden. R14 zählt Bytes!
LOOP
Beispiel
#BEGINN,R13 ; #0,R14 ; @R13+,RAMT(R14) R14 ; #2*20h,R14 ; LOOP ; ;
Beginn der Source-Tabelle 0 -> R14 (Tabellenoffset) ; Naechstes Wort kopieren Dest.-Zeiger +2 20h Worte kopiert? Nein, weiter kopieren Ja, fertig
Eine Byte-Tabelle, auf die R15 zeigt, soll in einen RAM-Teil beginnend bei Label RAMT kopiert werden. Es sollen 20h Bytes übertragen werden.
LOOP
Beispiel
MOV MOV MOV INCD CMP JLO ...
MOV MOV MOV.B INC CMP JLO ...
#BEGINN,R15 ; #0,R14 ; @R15+,RAMT(R14) R14 ; #20h,R14 ; LOOP ; ;
Beginn Source-Byte-Tabelle 0 -> R14 (Byte-Offset) ; Naechstes Byte kopieren Dest.-Zeiger +1 20h Bytes kopiert? Nein, weiter kopieren Ja, fertig
Ein RAM-Byte LEO soll in ein vorzeichenloses Wort umgewandelt werden. MOV.B
LEO,R15
; Byte xxh -> Wort 00xxh
100
Kapitel 4: Die Zentraleinheit
Beispiel
Ein RAM-Byte TONI soll in ein vorzeichenbehaftetes Wort zur Weiterrechnung umgewandelt werden. D.h. aus 00h bis 7Fh in TONI sollen 0000h bis 007Fh werden, und aus 80h bis FFh sollen FF80h bis FFFFh werden. MOV.B SXT
TONI,R15 R15
; Byte xxh -> Wort 00xxh ; Vorzeichen in Bits 8..15
123
Keine Operation ausführen
Name
No Operation
Syntax
NOP
Operation
1 MCLK-Zyklus lang nichts tun
Emulation
MOV
Beschreibung
Es wird keine Operation ausgeführt. Der Befehl kann für Verzögerungen von genau einem MCLK-Zyklus Länge verwendet werden.
R3,R3
entspricht MOV
#0,#0
Der NOP-Befehl kann für das Ausfüllen von Programmspeicher während des Tests oder für das Einfügen definierter Verzögerungen im Programmablauf verwendet werden. Status Bits
Die Status Bits werden nicht verändert.
Beispiel
Das Setzen und Rücksetzen des Ausgangsports P2.0 soll definiert um 2 MCLK-Zyklen verzögert werden. BIS.B NOP NOP BIC.B
Beispiel
#1,P2OUT
; ; ; ;
#1,P2OUT
P2.0 setzen 1 MCLK-Zyklus Verzoegerung 1 MCLK-Zyklus Verzoegerung P2.0 zuruecksetzen
Befehle für die Emulation anderer Verzögerungen als ein MCLK-Zyklus: JMP BIC MOV MOV
$+2 #0,0(R4) @R4,0(R4) 0(R4),0(R4)
; ; ; ;
2 4 5 6
Zyklen, Zyklen, Zyklen, Zyklen,
1 2 2 3
Wort Laenge Worte Worte Worte
Anmerkung: Bei den letzten drei Emulationen muss R4 eine gültige RAM-Adresse enthalten (Bereich 200h bis RAMEND)!
323 323% Name
Hole Wort vom Stack Hole Byte vom Stack Pop word from stack to destination Pop byte from stack to destination
Syntax
POP
dst
oder
POP.W
dst
4.6 Der Befehlssatz
POP.B Operation
101
dst
@SP dst SP + 2 SP
Emulation
MOV
Beschreibung
Der Inhalt des Wortes – oder des Bytes – auf das der Stack Pointer SP zeigt, wird in den Destination-Operanden geschrieben.
@SP+,dst
Der Stack Pointer wird nach dem Transfer immer (auch beim POP.B!) um Zwei erhöht. Das Stack-Wort in dem sich der Operand befand, wird vom nächsten Interrupt oder PUSHBefehl überschrieben: Der Inhalt ist also verloren! Status Bits
Die Status Bits werden nicht verändert.
Beispiel
Eine Subroutine SUBR rettet am Beginn das Status Register SR und R7. Vor der Rückkehr werden die beiden Register wieder vom Stack restauriert. Zu beachten ist die umgekehrte Reihenfolge beim PUSH und beim POP! SUBR
Beispiel
PUSH PUSH ... POP POP RET
Name
R7 SR
SR auf Stack retten R7 auf Stack retten Mit R7 arbeiten R7 restaurieren SR restaurieren Subroutinen-Rueckkehr
LEO
; Bits 0..7 in LEO, SP+2 (!)
Der Inhalt von R7 wird vom Stack her überschrieben. Das obere Byte von R7 wird gelöscht. POP.B
386+ 386+%
; ; ; ; ; ;
Der Inhalt von RAM-Byte LEO wird vom Stack her überschrieben. POP.B
Beispiel
SR R7
R7
; 00xxh -> R7, SP+2 (!)
Kopiere Source-Wort auf den Stack Kopiere Source-Byte auf den Stack Push word on stack Push byte on stack
Syntax
PUSH
src
PUSH.B src Operation
SP – 2 SP src @SP
oder
PUSH.W src
102
Kapitel 4: Die Zentraleinheit
Beschreibung
Wort-Befehl: Der Stack Pointer SP wird um Zwei erniedrigt. Der Inhalt des Source-Wortes wird in das RAM-Wort geschrieben, auf das der Stack Pointer zeigt. Der Source-Operand bleibt unverändert. Byte-Befehl: Der Stack Pointer SP wird um Zwei (!) erniedrigt, da er immer auf Worte zeigt. Der Inhalt des Source-Bytes wird in das untere Byte des RAM-Wortes geschrieben, auf das der Stack Pointer zeigt. Das obere Byte bleibt unverändert. Der Source-Operand bleibt unverändert.
Status Bits
Die Status Bits werden nicht verändert.
Beispiel
Die Inhalte von Status Register und R8 werden auf dem Stack gespeichert. PUSH PUSH
Beispiel
SR R8
; SR auf Stack retten ; R8 auf Stack retten
Der UART-Empfangsbuffer U0RXBUF wird gelesen und auf dem Stack gespeichert. Das obere Byte des TOS wird nicht verändert! PUSH.B ...
&U0RXBUF
5(7
Subroutinen-Rückkehr
Name
Return from subroutine
Syntax
RET
Operation
@SP PC
; Empfangene Daten auf Stack ; Oberes Byte TOS gleich!
SP + 2 SP Emulation
MOV
Beschreibung
Die Subroutinen-Rückkehradresse, die von einem CALLBefehl auf dem Stack gespeichert wurde, wird in den Program Counter PC geschrieben. Das Programm fährt an dieser Adresse weiter. Der Stack Pointer SP wird um Zwei erhöht, die Rückkehradresse wird vom nächsten Interrupt-, CALLoder PUSH-Befehl überschrieben.
Status Bits
Die Status Bits werden nicht verändert.
Beispiel
Eine Subroutine SUBR rettet am Beginn die Arbeitsregister R6 und R7. Vor der Rückkehr werden die beiden Register wieder vom Stack restauriert. Zu beachten ist die umgekehrte Reihenfolge beim PUSH und beim POP! SUBR
PUSH PUSH ...
@SP+,PC
R6 R7
; R6 auf Stack retten ; R7 auf Stack retten ; Mit R6 und R7 arbeiten
4.6 Der Befehlssatz POP POP RET
R7 R6
; R7 restaurieren ; R6 restaurieren ; Subroutinen-Rueckkehr
5(7,
Rückkehr vom Interrupt
Name
Return from Interrupt
Syntax
RETI
Operation
@SP+2 SR SP+2
SP
@SP+2 PC SP+2
103
Status Register wird restauriert SP auf nächstes Wort Program Counter wird restauriert
SP
Die Operation besteht aus zwei POP-Befehlen, die in der CPU im Ablauf zusammengefasst sind. Dadurch kann ein anstehender Interrupt nicht zwischen den beiden Befehlen aktiv werden, was ein schnelles Anwachsen der zu speichernden Interrupt-Daten auf dem Stack zur Folge hätte. Beschreibung
Das Status Register SR wird auf den Wert gebracht, den es bei der Unterbrechung durch den Interrupt hatte. Dazu wird es mit dem Wort überschrieben, auf das der Stack Pointer zeigt. Der Stack Pointer SP wird danach um Zwei erhöht (und zeigt nun auf den gespeicherten PC). Der Program Counter PC wird auf den Wert gebracht, den er bei der Unterbrechung durch den Interrupt hatte: Es ist die Adresse nach dem letzten noch ausgeführten Befehl vor der Zulassung des Interrupts. Dazu wird der PC mit dem Wort überschrieben, auf das der Stack Pointer zeigt. Der Stack Pointer SP wird danach um Zwei erhöht (und zeigt nun wieder auf das Wort, auf das er bei der Zulassung des Interrupts zeigte). Der Befehl RETI benötigt immer fünf MCLK-Zyklen.
Status Bits
Werden vom Stack aus auf den Stand vor dem Interrupt gebracht.
Beispiel
Eine Interrupt-Routine INTR rettet am Beginn die Arbeitsregister R8 und R7. Vor der Rückkehr werden die beiden Register wieder vom Stack restauriert. Achtung: umgekehrte Reihenfolge beim PUSH und POP! INTR
PUSH PUSH ... POP POP RETI
R8 R7 R7 R8
; ; ; ; ; ;
R8 auf Stack retten R7 auf Stack retten Mit R7 und R8 arbeiten R7 restaurieren R8 restaurieren Rueckkehr: SR und PC rest.
104
Kapitel 4: Die Zentraleinheit
5/$ 5/$%
Schiebe Destination-Wort arithmetisch nach links Schiebe Destination-Byte arithmetisch nach links
Name
Rotate Left Arithmetically
Syntax
RLA
dst
oder
RLA.W
dst
RLA.B dst Operation
C MSB MSB-1 .... LSB+1 LSB 0
Emulation
ADD
dst,dst
ADD.B dst,dst Die zwei Adressierungsarten, die für die dst nicht im Assembler implementiert sind, können folgendermaßen emuliert werden (der Immediate Mode ist unsinnig und daher nicht empfehlenswert): ADD
@Rx,0(Rx)
Emuliert RLA
ADD.B @Rx,0(Rx) ADD
@Rx+,-2(Rx)
ADD.B @Rx+,-1(Rx) Beschreibung
:RUW
RLA.B
Status Bits
@Rx
RLA
@Rx+
RLA.B
@Rx+
Der Destination-Operand wird um eine Bit-Position nach links geschoben. Das MSB – das Vorzeichen – wird in den Carry C geschoben, das LSB wird mit einer Null überschrieben. Der RLA-Befehl stellt eine vorzeichenbehaftete Multiplikation mit Zwei dar.
& %\WH
@Rx
N
Wird gesetzt, falls das Ergebnis negativ ist (MSB = 1). Wird zurückgesetzt, falls das Ergebnis positiv ist (MSB = 0).
Z
Wird gesetzt, falls das Ergebnis Null ist, zurückgesetzt, falls nicht.
C
Wird vom MSB geladen.
V
Wort-Befehl: Wird gesetzt, falls Bit 15 Bit 14 vor der Befehlsausführung ist: Das Ergebnis wechselte dann das Vorzeichen.
4.6 Der Befehlssatz
105
Byte-Befehl: Wird gesetzt, falls Bit 7 Bit 6 vor der Befehlsausführung ist: Das Ergebnis wechselte dann das Vorzeichen. Beispiel
Das Register R7 wird vorzeichenbehaftet mit 4 multipliziert. RLA RLA
Beispiel
R7 R7
; R7 = R7 x 2 ; R7 = R7 x 4
Das untere Byte des Registers R7 wird vorzeichenbehaftet mit 4 multipliziert. RLA.B RLA.B
Beispiel
R7 R7
; R7 = R7 x 2 ; R7 x 4 Ergebnis: 00xxh
Die Subroutine SHFTL2 multipliziert einen 32-Bit-Wert in R8|R7 mit Vier. Die Routine kann für vorzeichenbehaftete und vorzeichenlose Werte verwendet werden. Mit der Subroutine SHIFTL1 kann mit Zwei multipliziert werden. SHIFTL2 RLA RLC SHIFTL1 RLA RLC RET
5/& 5/&%
R7 R8 R7 R8
; ; ; ;
LSbs MSBs LSBs MSBs
x x x x
2 2 4 4
Aufruf fuer x4 Aufruf fuer x2
Schiebe Destination-Wort logisch nach links Schiebe Destination-Byte logisch nach links
Name
Rotate Left through Carry
Syntax
RLC
dst
oder
RLC.W
dst
RLC.B dst Operation
C MSB MSB-1 .... LSB+1 LSB Calt
Emulation
ADDC
dst,dst
ADDC.B dst,dst Die zwei Adressierungsarten, die für die dst nicht im Assembler implementiert sind, können folgendermaßen emuliert werden (die »unmittelbare« Adressierungsart ist unsinnig und daher nicht möglich): ADDC
@Rx,0(Rx)
@Rx
ADDC.B @Rx,0(Rx)
RLC.B
@Rx
ADDC
RLC
@Rx+
RLC.B
@Rx+
@Rx+,-2(Rx)
ADDC.B @Rx+,-1(Rx) Beschreibung
Emuliert RLC
Der Destination-Operand wird um eine Bit-Position nach links geschoben. Der alte Carry C wird in das LSB geschoben, das MSB überschreibt dann den Carry. Der RLC-Befehl stellt ein
106
Kapitel 4: Die Zentraleinheit
logisches Linksschieben (Rotieren) des (17-Bit-) Operanden dst dar. :RUW
& %\WH
Status Bits
N
Wird gesetzt, falls das MSB des Ergebnisses gesetzt ist, wird zurückgesetzt, falls nicht.
Z
Wird gesetzt, falls das Ergebnis Null ist, zurückgesetzt, falls nicht.
C
Wird vom MSB geladen.
V
Wort-Befehl: Wird gesetzt, falls Bit 15 Bit 14 vor der Befehlsausführung ist: Das Ergebnis wechselte dann das Vorzeichen. Byte-Befehl: Wird gesetzt, falls Bit 7 Bit 6 vor der Befehlsausführung ist: Das Ergebnis wechselte dann das Vorzeichen.
Beispiel
R5 wird um eine Position nach links geschoben RLC
Beispiel
; (R5 x 2) + C -> R5
Die Information am Eingang P1.1 wird ins untere Byte (LSB) von R5 geschoben. BIT.B RLC.B
55$ 55$%
R5
#2,&P1IN R5
; Information P1.1 -> Carry ; Carry -> LSB von R5. 00xxh
Schiebe Destination-Wort arithmetisch nach rechts Schiebe Destination-Byte arithmetisch nach rechts
Name
Rotate Right Arithmetically
Syntax
RRA
dst
oder
RRA.W
dst
RRA.B dst Operation
MSB MSB MSB-1 .... LSB+1 LSB C
Beschreibung
Der Destination-Operand wird um eine Bit-Position nach rechts geschoben. Das MSB wird in das MSB kopiert und in das MSB-1 geschoben, das Vorzeichen bleibt dadurch erhalten. Das LSB wird in den Carry C geschoben. Der RRABefehl stellt eine vorzeichenbehaftete Division durch Zwei dar. Es sind alle Adressierungsarten – mit Ausnahme des (hier unsinnigen) Immediate Mode – möglich.
4.6 Der Befehlssatz
:RUW
107
& %\WH
Status Bits
Beispiel
N
Wird gesetzt, falls das MSB des Ergebnisses gesetzt ist, wird zurückgesetzt, falls nicht.
Z
Wird gesetzt, falls das Ergebnis Null ist, zurückgesetzt, falls nicht.
C
Wird vom LSB geladen.
V
Wird zurückgesetzt.
R5 wird vorzeichenbehaftet um ein Bit nach rechts geschoben. Das MSB behält die ursprüngliche Information: Der RRA bedeutet eine arithmetische Division durch 2. RRA
Beispiel
COUNT0
; COUNT0/2 (mit Vorzeichen)
Der 32-Bit-Wert in Counthi|Countlo wird vorzeichenbehaftet mit 0,5 multipliziert. RRA RRC
55& 55&%
; R5/2 -> R5 mit Vorzeichen
Das Byte COUNT0 wird vorzeichenbehaftet um ein Bit nach rechts geschoben. Das MSB in Bit 7 behält die ursprüngliche Information. RRA.B
Beispiel
R5
Counthi Countlo
; MSBs/2, LSB -> Carry ; LSBs/2, Carry -> MSB
Schiebe Destination-Wort logisch nach rechts Schiebe Destination-Byte logisch nach rechts
Name
Rotate Right through Carry
Syntax
RRC
dst
oder
RRC.W
dst
RRC.B dst Operation
Calt MSB MSB-1 .... LSB+1 LSB C
Beschreibung
Der Destination-Operand wird um eine Bit-Position nach rechts geschoben. Der alte Carry C wird in das MSB kopiert, das LSB wird danach in den Carry C geschoben. Der RRCBefehl stellt ein logisches Rechtsschieben des (17-Bit-) Destination-Operanden dar. Es sind alle Adressierungsarten – mit Ausnahme des (hier unsinnigen) Immediate Mode – möglich.
108
Kapitel 4: Die Zentraleinheit
:RUW
& %\WH
Status Bits
Beispiel
N
Wird gesetzt, falls das MSB des Ergebnisses gesetzt ist (Carry war gesetzt), wird zurückgesetzt, falls nicht.
Z
Wird gesetzt, falls das Ergebnis Null ist, zurückgesetzt, falls nicht.
C
Wird vom LSB geladen.
V
Wird gesetzt, falls das MSB von Null auf Eins wechselt. Wird andernfalls zurückgesetzt.
Das RAM-Wort, auf das R5 zeigt, wird eine Stelle nach rechts geschoben. Das MSB (Bit 15) soll mit 1 geladen werden. SETC RRC
Beispiel
Der Inhalt des unteren Bytes von R5 wird eine Stelle nach rechts geschoben. Das MSB (Bit 7) soll mit 0 geladen werden. CLRC RRC.B
6%& 6%&%
; Setze C auf 1 (MSB Info) ; @R5/2 + 8000h -> @R5
@R5
; Setze C auf 0 (MSB Info) ; R5/2 -> R5 (00xxh)
R5
Subtrahiere Carry-Info vom Destination-Wort Subtrahiere Carry-Info vom Destination-Byte
Name
Subtract Carry info from destination
Syntax
SBC
dst
SBC.B
dst
Operation
oder
SBC.W
dst
Wort-Befehl: dst + 0FFFFh + C dst Byte-Befehl: dst + 0FFh + C dst
Emulation Beschreibung
SUBC
#0,dst
SUBC.B
#0,dst
Der Carry C wird zum Destination-Operanden minus Eins addiert. Der vorherige Inhalt des Destination-Operanden wird überschrieben. Für Operanden die länger als 16 Bit sind, kann die Übertragsinformation bei Subtraktionen schnell bearbeitet werden.
4.6 Der Befehlssatz
Status Bits
N
109
Wird gesetzt, falls das Ergebnis negativ ist (MSB = 1). Wird zurückgesetzt, falls das Ergebnis positiv ist (MSB = 0).
Z
Wird gesetzt, falls das Ergebnis Null ist, zurückgesetzt, falls nicht.
C
Wort-Befehl: Wird zurückgesetzt, falls der Destination-Operand von 0000h auf FFFFh dekrementiert wurde, andernfalls gesetzt. Byte-Befehl: Wird zurückgesetzt, falls der Destination-Operand von 00h auf FFh dekrementiert wurde, andernfalls gesetzt.
V
Wort-Befehl: Wird gesetzt, falls der DestinationOperand von 8000h auf 7FFFh dekrementiert wurde, andernfalls gesetzt (C war 0). Byte-Befehl: Wird zurückgesetzt, falls der Destination-Operand von 80h auf 7Fh dekrementiert wurde, andernfalls gesetzt (C war 0).
Beispiel
Der 32-Bit-Zähler, auf den R13 zeigt, wird von dem 48-BitZähler subtrahiert, auf den R12 zeigt. SUB SUBC SBC
Beispiel
@R13+,0(R12) @R13+,2(R12) 4(R12)
; Subtrahiere LSBs ; Subtrahiere mittlere Bits ; Subtrahiere Carry von MSBs
Der 8-Bit-Zähler, auf den R13 zeigt, wird von dem 16-BitZähler subtrahiert, auf den R12 zeigt. SUB.B SBC.B
@R13,0(R12) 1(R12)
; Subtrahiere LSBs ; Subtrahiere Carry von MSBs
6(7&
Carry Bit setzen
Name
Set Carry bit
Syntax
SETC
Operation
1C
intern:
Emulation
BIS
#1,SR
Beschreibung
Das Carry Bit im Status Register SR wird gesetzt. SETC ist ein Wortbefehl.
Status Bits
N
Wird nicht verändert.
Z
Wird nicht verändert.
C
Wird gesetzt.
V
Wird nicht verändert.
#1 .or. SR SR
110
Kapitel 4: Die Zentraleinheit
Beispiel
Emulation der nicht implementierten dezimalen Subtraktion in der Subroutine DSUB: Der Inhalt von R5 soll von R6 subtrahiert werden. Als Beispiel: R5 = 3987 und R6 = 4137 mit dem Resultat 150. Der Carry bei der Rückkehr kann für die Subtraktion der nächsten vier BCD-Stellen verwendet werden. DSUB
ADD
#6666h,R5
INV
R5
SETC DADD
R5,R6
RET
; ; ; ; ; ; ; ; ;
Zahlen von 0-9 -> 6-Fh R5 = 3987 + 6666 = 9FEDh Resultat zurueck nach 0-9 R5 = 6012h = 9999 – 3987 C = 1 fuer 10er-Komplement Subtr. durch dez. Addition (9999–3987+1)+4137 = 10150 Resultat (R6–R5) = (1)0150 also 150
6(71
Negativ Bit setzen
Name
Set Negative bit
Syntax
SETN
Operation
1N
intern:
Emulation
BIS
#4,SR
Beschreibung
Das Negativ Bit N im Status Register SR wird gesetzt. SETN ist ein Wortbefehl. N Wird gesetzt. Z Wird nicht verändert. C Wird nicht verändert. V Wird nicht verändert.
Status Bits
Beispiel
#4 .or. SR SR
Die Subroutine SUBR hat bei der Rückkehr im Negativ Bit N die Fehlerinformation: N = 0: Kein Fehler N = 1: Fehler bei der Bearbeitung SUBR
... ... SETN RET
; Subroutinenbeginn
CLRN RET
; Kein Fehler: N 1, 1 -> 0 ; P2.3-Status -> C ; Volle Perioden zaehlen
Der Adressraum
Die 64 KBytes des Adressraumes des MSP430 lassen sich in mehrere getrennte Bereiche unterteilen. Abbildung 4.27 zeigt diese Bereiche und ihre Funktion. Auf die einzelnen Bereiche kann nur mit der unter »Zugriff« angegebenen Weise zugegriffen werden. Das bedeutet, dass z.B. die Special Function Registers nur mit Byte-Befehlen adressiert werden können. Ein Zugriff mit Wort-Befehlen ergibt unsinnige Ergebnisse. Allerdings sind nur 0,78 % des Adressraums in dieser Weise beschränkt: Auf 99,2 % kann mit Wort- und Byte-Befehlen zugegriffen werden!
118
Kapitel 4: Die Zentraleinheit
Abb. 4.27 Der Adressraum der MSP430-Familie
Der in Abbildung 4.27 mit »Frei« bezeichnete Adressraum ist je nach MSP430Typ unterschiedlich groß. Beim MSP430F449 ist er fast nicht vorhanden: Die 2 KByte RAM reichen bis zur Adresse 09FFh, die 60 KBytes Programmspeicher beginnen bereits bei der Adresse 1000h, d.h. es sind nur 600h Bytes (1536) unbenutzt.
4.8
Die Betriebsarten für MSP430-Applikationen
Von einer Batterie gespeiste MSP430-Anwendungen wie Gas- und Wasserzähler sind auf extrem niedrigen Stromverbrauch angewiesen, damit die Batterien mehr als 10 Jahre den Betrieb ermöglichen. Der Stromverbrauch des MSP430-Systems muss dabei in der Größenordnung der Selbstentladung der Batterie liegen, was 1,6 bis 3 mA Verbrauch bedeutet. Aber auch für netzgespeiste Anwendungen wie Elektrizitätszähler spielt der Stromverbrauch eine große Rolle: Je geringer er ist, desto kleiner und kostengünstiger kann das Netzgerät sein und desto geringer ist die Erwärmung.
4.8 Die Betriebsarten für MSP430-Applikationen
119
Die MSP430F4xx-Familie hat sechs Betriebsarten, von denen vier wichtig für Applikationen sind: • Der Active Mode mit der arbeitenden CPU. • Der Low Power Mode 0 (LPM0): Die CPU ist ausgeschaltet, die PeripherieModule sind noch aktiv. • Der Low Power Mode 3 (LPM3): Die normale Betriebsart für alle Batterieanwendungen zwischen 99,9 % und 99.999 % der Zeit. Die CPU ist ausgeschaltet, nur die Peripherie-Module, die mit dem ACLK arbeiten, sind noch aktiv. • Der Low Power Mode 4 (LPM4): Die Betriebsart für Lagerzwecke. Alles ist ausgeschaltet, nur die externen Interrupts sind noch verwendbar.
Abb. 4.28: Die vier wichtigen Betriebsarten des MSP430
Abbildung 4.29 zeigt die Stromaufnahme des MSP430F44x in allen vier wichtigen Betriebsarten. Die logarithmische Skala erlaubt ein besseres Ablesen der verschiedenen Stromwerte.
120
Kapitel 4: Die Zentraleinheit
Abb. 4.29: Die Stromaufnahme des MSP430F449. Logarithmischer Massstab
Abbildung 4.30 zeigt dieselbe Stromaufnahme in linearem Maßstab, was einen besseren Überblick über die stark unterschiedlichen Stromaufnahmen gibt.
Abb. 4.30: Die Stromaufnahme des MSP430F449 in mA. Linearer Maßstab
4.8.1
Der Active Mode
Diese Betriebsart wird für Berechnungen, Entscheidungen, Ein- und Ausgabefunktionen und andere Aktivitäten verwendet, die eine arbeitende CPU voraussetzen. Alle Peripherie-Module können benutzt werden, vorausgesetzt, sie sind
4.8 Die Betriebsarten für MSP430-Applikationen
121
eingeschaltet und initialisiert. Alle Beispiele in diesem Buch verwenden den Active Mode. Nach dem Einschalten der Speisespannung des MSP430 (Powerup Clear PUC) oder Reset (Power-on Reset POR) arbeitet die CPU immer im Active Mode.
4.8.2
Der Low Power Mode 0
Diese Betriebsart wird verwendet, wenn: • Die CPU nicht benötigt wird. • Der Stromverbrauch des Systems gesenkt werden soll, der Peripherie-Clock SCMLK aber weiter benötigt wird. • Ein möglichst störungsfreier Betrieb eines Peripherie-Moduls z.B. des ADC12 ermöglicht werden soll. Die Stromspitzen, welche die aktive CPU auf der DVcc-Stromversorgung verursacht, werden damit vermieden. Die CPU ist ausgeschaltet, aber die eingeschalteten Peripherie-Module bleiben aktiv: Basic Timer1, Timer_A, Timer_B, I/O-Ports, USART, ADC12, Comparator_A usw. Basic Timer1 sowie Timer_A und Timer_B erlauben eine präzise Zeitbasis. Eingeschaltete Interrupts wecken die CPU auf, schalten den MCLK ein und starten den normalen Betrieb (Active Mode) innerhalb weniger MCLK-Zyklen. Tabelle 4.17 zeigt den Status des MSP430F44x-Systems im Low Power Mode 0 (LPM0): Aktiv
Nicht Aktiv
RAM ACLK, SMCLK 32-kHz-Oszillator Basic Timer1 Eingeschaltete Peripherie-Module Eingeschaltete Interrupts I/O-Ports RESET-Logik
CPU MCLK Ausgeschaltete Peripherie-Module Ausgeschaltete Interrupts
Tabelle 4.17: MSP430F44x im Low Power Mode 0
Anmerkung: Bei der MSP430F41x-Familie ist der MCLK – der hier mit dem SMCLK identisch ist – auch im LPM0 aktiv.
122
Kapitel 4: Die Zentraleinheit
Um den LPM0 einzuschalten, ist der folgende Code notwendig (SCG0 und SCG1 sind beide 0): ; Low Power Mode 0, Interrupts ein. ; BIS #CPUOFF+GIE,SR ; LPM0 ein, GIE ein
Beispiel: Das kleine Software-Programm das im Kapitel »Das erste Programm« beschrieben ist, verwendet den LPM0 um den SMCLK für den Timer_A zur Verfügung zu haben.
4.8.3
Der Low Power Mode 3
Der LPM3 ist die wichtigste Betriebsart für alle batteriebetriebenen MSP430Anwendungen. Die CPU ist ausgeschaltet, aber die eingeschalteten PeripherieModule, die den ACLK verwenden, bleiben aktiv: Basic Timer1, Timer_A, Timer_B, I/O-ports, USART, ADC12, Comparator_A. Der Basic Timer1 sorgt für eine genaue Zeitbasis, aber auch die beiden Timer_A und Timer_B können für diesen Zweck verwendet werden. Eingeschaltete Interrupts die aktiv werden, wecken die CPU auf, schalten den MCLK und den SMCLK ein und starten den normalen Betrieb (Active Mode). Tabelle 4.18 zeigt den Status des MSP430F44x-Systems im Low Power Mode 3: Aktiv
Nicht Aktiv
RAM ACLK 32-kHz-Oszillator Basic Timer1 Eingeschaltete Peripherie-Module Eingeschaltete Interrupts I/O-Ports RESET-Logik
CPU SMCLK MCLK Ausgeschaltete Peripherie-Module Ausgeschaltete Interrupts
Tabelle 4.18: MSP430F44x im Low Power Mode 3
Um den LPM3 einzuschalten, ist der folgende Code notwendig: ; Low Power Mode 3 einschalten, Interrupts einschalten. ; Der Watchdog muss gestoppt werden, falls er den ; ACLK verwendet ; MOV #05A00h+WDTHOLD+WDTCNTCL,&WDTCTL ; WD aus BIS #CPUOFF+GIE+SCG1+SCG0,SR ; LPM3 + GIE ein
4.8 Die Betriebsarten für MSP430-Applikationen
123
Nach der Abarbeitung einer Interrupt-Routine kehrt die CPU zu dem Befehl zurück, der das CPUoff-Bit im Status Register SR setzte. Das normale Aufwachen aus dem LPM3 kommt vom Basic Timer1, der mit dem ACLK mit 32 kHz gespeist wird: Der Basic Timer1 wird so programmiert, dass er die CPU in regelmäßigen Zeitintervallen aufweckt (programmierbar von 0,5 Hz bis 64 Hz und höher) und dabei einen Software-Timer erhöht. Dieser Software-Timer steuert alle notwendigen Systemaktivitäten. Beispiel: Das MSP430F44x-System läuft normalerweise im LPM3. Der eingeschaltete Interrupt des Basic Timer1 weckt die CPU jede Sekunde einmal auf. Wenn eine Minute vorbei ist, werden Messungen und Berechnungen durchgeführt, dann kehrt das System in den LPM3 zurück. Das Label TASK kann an beliebiger Stelle im Speicher stehen. #include "msp430x44x.h" ; Definitionen fuer MSP430F449 ; ; Interrupt-Routine für den Basic Timer1: Aufwachen mit 1Hz ; BT1_HAN MOV #05A00h+WDTCNTCL,&WDTCTL ; Reset watchdog INC.B SECCNT ; Sekundenzaehler erhoehen CMP.B #60,SECCNT ; Eine Minute vorbei? JHS MIN1 ; Ja, Arbeiten machen RETI ; Nein, zurueck in den LPM3 ; ; Eine Minute verging: Die Interrupt-Rueckkehr (SR, PC) ; wird vom Stack genommen und ein Sprung zum Label TASK ; gemacht. Dort wird entschieden, was zu tun ist ; MIN1 INC MINCNT ; Minutenzaehler erhoehen CLR.B SECCNT ; 0 -> SECCNT ADD #4,SP ; House keeping: SR, PC weg BR #TASK ; Zur notwendigen Arbeit ;------TASK ... ; Start der notw. Arbeiten ; ; Alle Messungen und Berechnungen sind gemacht: ; Rueckkehr zum LPM3. Watchdog anhalten ; MOV #05A00h+WDTHOLD+WDTCNTCL,&WDTCTL ; WD aus BIS #CPUOFF+GIE+SCG0+SCG1,SR ; LPM3 + GIE ein
Der Low Power Mode 3 ist die Betriebsart mit der niedrigsten Stromaufnahme, die noch die Verwendung eines Clocks erlaubt: Der Basic Timer1 kann die CPU in relativ langen Zeitintervallen aufwecken (bis zu 2 s) und eine Echtzeituhr auf den neuesten Stand bringen. Wenn das Status Register SR während der InterruptRoutine nicht geändert worden ist, kehrt der RETI-Befehl zu dem Befehl zurück, der das CPUoff-Bit setzte (und damit die CPU in den LPM3 brachte). Der Program Counter PC zeigt auf den nächsten Befehl, dieser wird aber nicht
124
Kapitel 4: Die Zentraleinheit
ausgeführt, bis eine Interrupt-Routine die – auf dem Stack gespeicherten – Status Register-Bits CPUoff, SCG0 und SCG1 zurücksetzt. Beispiel: Das MSP430F44x-System läuft normalerweise im LPM3. Der eingeschaltete Interrupt des Basic Timer1 weckt die CPU jede Sekunde einmal auf. Wenn eine Minute vorbei ist, werden Messungen und Berechnungen durchgeführt, dann kehrt das System in den LPM3 zurück. Der Sprung zu dem Label TASK (jede Minute) wird durch das Löschen der Status Register-Bits CPUoff, SCG1 und SCG0 innerhalb der Interrupt-Routine erreicht. Das Label TASK muss hier direkt hinter dem Befehl stehen, der den LPM3 einschaltet. ; Interrupt-Routine für den Basic Timer1: Aufwachen mit 1Hz ; BT1_HAN MOV #05A00h+WDTCNTCL,&WDTCTL ; Reset watchdog INC.B SECCNT ; Sekundenzaehler erhoehen CMP.B #60,SECCNT ; Eine Minute vorbei? JHS MIN1 ; Ja, notw. Arbeit machen RETI ; Nein, zurueck in LPM3 ; ; Eine Minute verging: Die SR Bits werden geloescht, ; dadurch verzweigt das Programm nach dem RETI ; zum Label TASK ; MIN1 INC MINCNT ; Minutenzaehler erhoehen CLR.B SECCNT ; 0 -> SECCNT BIC #CPUOFF+SCG1+SCG0,0(SP) ; LPM3 beenden RETI ; Rueckkehr zum Label TASK ;------; Alle Messungen und Berechnungen sind gemacht: ; Rueckkehr zum LPM3 ; DONE MOV #05A00h+WDTHOLD+WDTCNTCL,&WDTCTL ; WD aus BIS #CPUOFF+GIE+SCG0+SCG1,SR ; LPM3 ein ; TASK ... ; Aufwach-Adresse jede Minute JMP DONE ; Zurueck zum LPM3
Wenn ein Interrupt die CPU aus dem LPM3 aufweckt, dann sind insgesamt acht (statt sechs) MCLK-Zyklen notwendig, bis der erste Befehl der Interrupt-Routine ausgeführt wird. Anmerkung: Die beiden Timer Timer_A und Timer_B können auch während des LPM3 zusammen mit dem ACLK verwendet werden. Ebenso ist das Zählen externer Impulse möglich. Wenn der entsprechende Interrupt eingeschaltet ist, wacht die CPU auf, wenn die programmierte Interrupt-Bedingung erfüllt ist.
4.8 Die Betriebsarten für MSP430-Applikationen
4.8.4
125
Der Low Power Mode 4
Der Low Power Mode 4 (LPM4) wird benutzt, wenn der geringstmögliche Versorgungsstrom Bedingung ist und keine Zeitmessung notwendig oder gewünscht ist. Das RAM bleibt im LPM4 erhalten. Dies ist normalerweise für Lagerzeiten, z.B. vor oder nach der Kalibrierung, der Fall. Tabelle 4.19 zeigt den Status des MSP430F44x-Systems im Low Power Mode 4: Aktiv
Nicht Aktiv
RAM I/O-Ports Eingeschaltete Interrupts RESET Logik
CPU MCLK SMCLK ACLK Basic Timer1 Ausgeschaltete Peripherie-Module Ausgeschaltete Interrupts Watchdog
Tabelle 4.19: MSP430F44x im Low Power Mode 4
Wenn der MSP430 aus dem LPM4 aufgeweckt wird, muss die Software entscheiden, ob es notwendig ist, wieder in den LPM4 zurückzukehren (z.B. wenn eine Störung den MSP430 weckte) oder ob eine andere Betriebsart eingeschaltet werden muss. Die Frequenz des System Clock Generator nach dem Aufwachen aus dem LPM4 ist relativ niedrig (ungefähr 1 MHz) und es kann bis zu vier Sekunden dauern, bis eine stabile ACLK-Frequenz erreicht ist. Um den LPM4 einzuschalten, ist der folgende Code notwendig: ; LPM4 einschalten, GIE ein ; BIS #CPUOFF+OSCOFF+GIE+SCG1+SCG0,SR LPM4ret ... ; Hier faehrt Programm fort ...
Der Weg um den LPM4 zu verlassen, ist prinzipiell der gleiche, wie beim LPM3 gezeigt wurde. Der Code in einer Interrupt-Routine, um den LPM4 nach dem RETI-Befehl zu verlassen, folgt. Das Programm macht dann am obigen Label LPM4ret weiter. ; LPM4 verlassen. Rueckkehr zum Befehl nach dem ; Einschalten des LPM4 ; BIC #CPUOFF+OSCOFF+SCG1+SCG0,0(SP) RETI
126
Kapitel 4: Die Zentraleinheit
Anmerkung: Die beiden Timer Timer_A und Timer_B können auch während des LPM4 für das Zählen externer Impulse verwendet werden. Wenn der entsprechende Interrupt eingeschaltet ist, wacht die CPU auf, wenn die programmierte InterruptBedingung erfüllt ist.
4.9
Ausführungszeiten der Befehle
Oft ist es sehr wichtig zu wissen, wie lange ein bestimmter Programmteil für die Ausführung braucht. Sich die Ausführungszeiten allein für alle 28 möglichen Kombinationen der Zwei-Operandenbefehle zu merken ist natürlich nicht möglich. Die folgenden fünf Kapitel versuchen eine einfache Hilfe zu geben: Es werden eine schnelle und eine genaue Zeitabschätzung gezeigt.
4.9.1
Schnelle Zeitabschätzung der Ausführungszeiten
Um eine schnelle Übersicht über die zu erwartende Ausführungszeit eines bestimmten Programmteiles zu bekommen, kann die folgende Abschätzung verwendet werden: • Wenn die Software alle Adressierungsarten enthält, dann ist die benötigte Ausführungszeit trun für ein Byte der Software: trun 0,75 Zyklen/Byte
Wenn die Software nur oder aber vorwiegend den Register Mode verwendet, dann ist die benötigte Ausführungszeit trun für ein Byte der Software: WUXQ =\NOHQ %\WH
Die Anzahl der Bytes kann einfach aus dem Assembler-Listing entnommen werden: Es ist die Differenz zwischen der letzten und der ersten Adresse des Programmteils +2. Anmerkung: Programmschleifen müssen natürlich berücksichtigt werden!
4.9.2
Zwei-Operandenbefehle
Mit dem folgenden Schema ist es sehr leicht, sich zu merken, wie viele MCLKZyklen ein Zwei-Operandenbefehl für die Ausführung benötigt. Abbildung 4.31 zeigt die Anzahl der Zyklen für alle 28 möglichen Kombinationen der Source-
4.9 Ausführungszeiten der Befehle
127
und Destination-Adressierungen. Alle gleichartigen Adressierungsarten sind zusammengefasst.
Abb. 4.31: Befehlsausführungszeiten für Zwei-Operandenbefehle
Anmerkung: Konstanten aus dem Constant Generator (-1, 0, 1, 2, 4, 8) haben die gleichen Ausführungszeiten wie der Register Mode (Rsrc in Abbildung 4.31).
Beispiel: Der Befehl ADD
#500h,16(R5)
; Addiere 500 auf das Wort
benötigt 5 MCLK-Zyklen für seine Ausführung (#N, X(Rdst)).
4.9.3
Ein-Operandenbefehle
Das einfache und klare Schema der Zwei-Operandenbefehle lässt sich leider nicht auf die fünf Ein-Operandenbefehle anwenden: Diese unterscheiden sich zu stark voneinander. Abbildung 4.32 gibt eine Übersicht.
Abb. 4.32: Befehlsausführungszeiten für Ein-Operandenbefehle
Beispiel: Der Befehl PUSH
#500h
; Schreibe 500 auf den Stack
benötigt 4 MCLK-Zyklen für seine Ausführung (#N).
128
Kapitel 4: Die Zentraleinheit
4.9.4
Sprungbefehle
Alle acht Sprungbefehle benötigen zwei MCLK-Zyklen für die Ausführung, unabhängig davon, ob der Sprung ausgeführt wird oder nicht (also die Sprungbedingung erfüllt ist oder nicht).
4.9.5
Interrupt-Ausführungszeit
Ein ausgeführter Interrupt benötigt elf MCLK-Zyklen »Overhead«: • Sechs Zyklen sind notwendig, um den Program Counter PC und das Status Register SR auf den Stack zu laden. Erst dann wird der erste Befehl der Interrupt-Routine ausgeführt. • Fünf Zyklen sind für die Rückkehr von der Interrupt-Routine nötig: Das Status Register und der Program Counter werden durch den Befehl RETI vom Stack geholt und überschrieben. Erst dann wird mit dem nächsten Befehl des durch den Interrupt unterbrochenen Programms fortgefahren. Wenn der Interrupt während der Low Power Modes 3 oder 4 stattfindet, dann sind noch zwei zusätzliche MCLK-Zyklen notwendig.
4.10
Interrupt
4.10.1 Ablauf eines Interrupts Abbildung 4.33 zeigt den normalen Verlauf einer Interrupt-Routine:
Abb. 4.33: Interrupt-Ablauf
4.10 Interrupt
129
Die CPU befindet sich im Active Mode oder in einem der fünf Low Power Modes. Das GIE-Bit im Status Register SR ist gesetzt. Das Interrupt Enable Bit eines Peripherie-Moduls ebenfalls. Ein Interrupt wird durch das PeripherieModul ausgelöst: • CPU im Active Mode: Der momentan abgearbeitete Befehl wird zu Ende ausgeführt. Dies kann bis zu sechs MCLK-Zyklen dauern (Indexed Mode für src und dst). Der Program Counter PC, der jetzt auf die Adresse des nächsten Befehls zeigt, wird auf den Stack gespeichert: An diese Adresse kehrt das Programm nach dem RETI-Befehl zurück. • CPU in Low Power Mode: Der Low Power Mode wird beendet. Der Program Counter PC – der während des Low Power Modes auf die Adresse des Befehls nach dem LPM-Aufruf zeigt – wird auf den Stack gespeichert. Das Programm kehrt nach dem RETI-Befehl hierher zurück, allerdings mit den gesetzten Low Power Mode Bits des restaurierten Status Registers: Die CPU befindet sich wieder im Low Power Mode, wie vor dem Interrupt. • Das Status Register SR wird auf dem Stack gespeichert. Anordnung auf dem Stack siehe Abbildung 4.35. • Der Interrupt mit der höchsten Priorität – falls mehrere Interrupts anstehen – wird automatisch ausgewählt. Die Priorität der Interrupts reicht von der niedrigsten (Vektor FFE0h: Basic Timer1 beim MSP430F44x) bis zur höchsten (Vektor FFFEh: Reset). Dazwischen steigt sie linear an. • Interrupts mit einer Interrupt-Quelle (z.B. Comparator_A): Der Interrupt-Flag wird automatisch zurückgesetzt. • Interrupts mit mehreren Interrupt-Quellen (z.B. der Port1 mit seinen acht Quellen P1.0 bis P1.7): Die Interrupt-Flags müssen von der Interrupt-Routine zurückgesetzt werden. • Im Status Register SR werden die Bits GIE, CPUoff, OSCoff, SCG1, V, N, Z und C gelöscht. Das Bit SCG0 bleibt unverändert: Die Regelung der FLL+ bleibt im vorherigen Zustand. Kein neuer Interrupt ist möglich. • Der Wert des zugehörigen Interrupt-Vektors wird in den Program Counter geladen: Das Programm fährt an dem ersten Befehl der Interrupt-Routine fort. Falls der Interrupt während des Active Modes erfolgte: Von der Fertigstellung des unterbrochenen Befehls bis zum ersten Befehl der Interrupt-Routine sind nur sechs MCLK-Zyklen vergangen (Interrupt Latency Time). Die Frequenz des System Clock Generator hat auch bei einem Aufwachen aus dem LPM3 beim ersten Befehl der Interrupt-Routine bereits wieder die korrekte
130
Kapitel 4: Die Zentraleinheit
Frequenz erreicht: Ein 10-Bit-Register in der FLL+ speichert die Frequenz-Info des letzten Active Mode. Die Rückkehr aus dem Interrupt geschieht mit dem Befehl RETI: • Das Status Register SR wird vom Stack her zurückgeschrieben (POP SR): Wurde an dem gespeicherten SR in der Interrupt-Routine nichts verändert, dann hat es wieder genau den Inhalt, den es bei der Unterbrechung durch den Interrupt hatte. Der nächste Befehl kann also auf die richtige Information darin zurückgreifen, bzw. die CPU befindet sich wieder in einem Low Power Mode. • Der Program Counter PC wird vom Stack her zurückgeschrieben (POP PC): Das Programm fährt an dem Befehl fort, der auf den letzten ausgeführten Befehl folgt. Der Stack Pointer SP ist um vier Bytes nach oben gerückt und zeigt wieder auf das Wort, auf das er vor dem Interrupt zeigte.
4.10.2 Interrupt-Verschachtelung Durch das Setzen des GIE-Bits innerhalb einer Interrupt-Routine kann der Interrupt wieder eingeschaltet werden und ein anderer Interrupt kann die momentane Interrupt-Routine unterbrechen (Interrupt Nesting). Dies ist wichtig bei relativ langen Interrupt-Routinen, die man allerdings vermeiden sollte. Der Befehl nach dem EINT-Befehl wird auf jeden Fall noch ohne Unterbrechung ausgeführt. Abbildung 4.34 zeigt eine unterbrechbare Interrupt-Routine:
Abb. 4.34: Interrupt-Verschachtelung (Interrupt Nesting)
4.11 Warum ist der MSP430 so wie er ist?
131
Abbildung 4.35 zeigt die Stackbelegung während der Ausführung der InterruptRoutine 2:
Abb. 4.35: Stackbelegung einer einmal unterbrochenen Interrupt-Routine
Beispiel: Die Interrupt-Routine des Basic Timer1 ist relativ lang und muss daher unterbrechbar sein. Das Erhöhen des Zählers COUNT darf aber nicht unterbrochen werden. Dies kann wie folgt aussehen: ; Die Basic Timer1 Interrupt-Routine muss einen ; Zaehler COUNT ohne Unterbrechung sofort erhoehen ; und dann unterbrechbar sein. ; BT1_HAN INC COUNT ; Zaehler +1 (ohne Unterbrechung!) EINT ; Interrupt wieder einschalten ... ; Aktivitaeten unterbrechbar! RETI
4.11
Warum ist der MSP430 so wie er ist?
Es wird oft gefragt, warum die MSP430-Architektur so weit von anderen Rechnerkonzepten abweicht und es sind immer wieder die gleichen Fragen, die dabei gestellt werden. Das folgende Kapitel beantwortet die am häufigsten gestellten Fragen.
4.11.1 Was ist Orthogonalität? Dieser Begriff aus der Computerwissenschaft bedeutet nichts anderes, als dass jeder Ein-Operandenbefehl jede Adressierungsart verwenden kann, und, dass jeder Zwei-Operandenbefehl jede Kombination aus Source- und DestinationAdressierung verwenden kann. Abbildung 4.36 zeigt diesen Sachverhalt grafisch: Die existierenden Kombinationen aus Befehlen und Adressierungsarten füllen den gesamten möglichen Raum, da alle möglich sind.
132
Kapitel 4: Die Zentraleinheit
Abb. 4.36: Orthogonale Architektur (Zwei-Operandenbefehle)
Das Gegenteil zur in Abbildung 4.36 gezeigten 100 %igen Orthogonalität ist in Abbildung 4.37 gezeigt: Eine weitgehend nichtorthogonale Architektur. Jeder Befehl kann nur einen Teil der existierenden Kombinationen der Adressierungsarten verwenden. Normalerweise kann nur der MOVE-Befehl alle anwenden. Die existierenden Kombinationen aus Befehlen und Adressierungsarten sind wie kleine Blocks in dem möglichen Raum verteilt.
Abb. 4.37: Nichtorthogonale Architektur (Zwei-Operandenbefehle)
4.11.2 Warum ist der MSP430 100 % orthogonal? Es hat mehr als einen Grund, warum die MSP430-Architektur 100 %ig orthogonal ist. Die wichtigsten sind in diesem Kapitel aufgeführt. Sie entstammen der Argumentation während der Entscheidungsfindung, die der Entwicklung des MSP430 vorausging. Geringere Programmlänge Der direkte Zugriff auf jede Adresse im Adressraum, ohne vorher ein Arbeitsregister laden zu müssen, resultiert in Programmlängen, die zwischen 55 % und 90 % derjenigen von anderen Mikrocontrollern liegen. Das bedeutet, dass normalerweise eine 4-KByte-Version des MSP430 ausreicht, wo ein anderer Mikrocontroller 6 KByte oder sogar 8 KByte benötigt.
4.11 Warum ist der MSP430 so wie er ist?
133
Kürzere Programme Jede notwendige Programmzeile ist eine Fehlerquelle. Je weniger Programmzeilen für eine bestimmte Aufgabe notwendig sind, desto einfacher ist ein Programm zu lesen, zu verstehen und eventuell zu ändern. Der MSP430 braucht zwischen 33 % und 55 % der Programmzeilen, verglichen mit seinen Konkurrenzprodukten. Der Grund ist der gleiche wie zuvor gezeigt: Jede Adresse kann direkt angesprochen werden und das sowohl für den Source-Operanden als auch für den Destination-Operanden. Es ist nicht notwendig, erst einmal umständlich eine 16-Bit-Source-Adresse zu kreieren, dann den Operanden byte-weise zu verändern und schließlich das Endresultat über eine zusammengestellte DestinationAdresse abzuspeichern: All dies geschieht mit einem einzigen MSP430-Befehl. Dazu kommt die leichte Lesbarkeit dieses Einzelbefehls, verglichen mit den vielen Programmzeilen, die bei anderen Architekturen zur Zusammenstellung der Source- und Destination-Adressen notwendig sind. Kleinere Chipfläche Die 100 %ige Orthogonalität führt zu geringem Dekodieraufwand, da dieselbe Hardware für alle Befehle verwendet werden kann. Dies führt zu geringerer Größe auf dem Silizium, was sich im geringeren Preis für den Gesamtchip ausdrückt. Die CPU-Fläche des MSP430 ist kleiner als die von Texas Instruments 4Bit- und 8-Bit-Rechnern. Optimaler C Code Der C-Compiler eines Mikrocontrollers kann nur diejenigen Befehle verwenden, die eine reguläre (sprich orthogonale) Struktur haben. Typische CISC-Befehle (Complex Instruction Set Computer) eines normalen Mikrocontrollers, die normalerweise starke Einschränkungen bei der Adressierung haben, werden vom CCompiler nicht verwendet. Anstatt dessen, emuliert der Compiler diese komplexen Befehle durch die Anwendung vieler einfacher Befehle. Das bedeutet, dass ein typischer Compiler nur ungefähr 30 % (!) der implementierten Befehle verwendet. Ganz anders sieht es beim MSP430 aus: Da die Befehle – von der ausgeführten Funktion abgesehen – vollkommen gleich sind, werden sie zu 100 % vom CCompiler verwendet und nicht nur zu 30%. Da logische und arithmetische Operationen direkt ausgeführt werden und nicht durch andere Befehle emuliert werden müssen, ist die Ausführungszeit des compilierten Codes kürzer und weniger Programmplatz im Speicher wird dafür benötigt. Daher sind die Vorteile der MSP430-Architektur, die für Assemblerprogrammierung gelten, auch für Hochsprachenprogrammierung gültig. Dies ist umso wichtiger, als Hochsprachen wie C einen immer größeren Anteil an der Softwareentwicklung bekommen.
134
Kapitel 4: Die Zentraleinheit
Verringerte Entwicklungszeit Die kürzere Programmlänge und der einfache Zugriff auf Programmspeicher, RAM und Peripherie-Module verringern die Entwicklungszeit. Zusätzlich zu diesem Vorteil entfallen ein Großteil der Erwägungen, wie ein Problem überhaupt mit einer gegebenen Architektur gelöst werden kann, ein Zeitanteil, der bei anderen Architekturen leicht ein Drittel der Entwicklungszeit ausmachen kann. Wer jemals mit 4-Bit-Mikrocontrollern entwickelt hat, weiß was gemeint ist. Effektiver Code von Anfang an Die klare Assemblersprache des MSP430 erlaubt es, von Beginn einer Entwicklung an dichten und gut lesbaren Code zu schreiben. Wenn das zu schreibende Programm gut vorbereitet ist und klar kodiert wird, dann ist es sehr schwierig, die Programmlänge nachträglich noch zu reduzieren. Das ist kein Nachteil! Es bedeutet vielmehr, dass von Anfang an fast optimaler Code geschrieben worden ist. Dies geht bis zur Sucht: Wer einmal mit der MSP430-Assemblersprache Software entwickelt hat, will für keinen anderen Mikrocomputer mehr Software schreiben (Angabe zahlreicher Kunden).
4.11.3 Warum ist die Behandlung des Status Registers nicht orthogonal? Es ist im ersten Moment nicht ganz verständlich, warum die Beeinflussung des Status Registers SR nicht ebenso orthogonal – also für alle Befehle gleich – erfolgt, wie der Aufbau der 27 implementierten Befehle. Der Grund ist ein einfacher: • Je besser ein Befehl an seine wahrscheinlichsten Anwendungen angepasst ist, desto kürzer sind die Programme (Speicherplatz) und desto schneller können sie abgearbeitet werden (niedriger Stromverbrauch und hohe erreichbare Rechengeschwindigkeit). Dies bedeutet z.B. für die beiden logischen Befehle BIC (Bit clear) und BIS (Bit set), dass sie am besten die Status Bits überhaupt nicht beeinflussen, da sie nur Hilfsfunktionen ausführen wie z.B. das Setzen von Ausgangsbits, wobei es normalerweise nicht interessiert, welchen Zustand die anderen Bits des Ports haben. Andererseits können zeitkritische Schleifen mit diesen beiden Befehlen schneller abgearbeitet werden, da die Statusinformation der wichtigen Befehle erhalten bleibt. Für diese beiden Befehle ist es also am besten, wenn sie die Status Bits im SR überhaupt nicht beeinflussen. Aus einem ähnlichen Grunde wurde für einige Befehle (AND, BIT, XOR, SXT, INV) die Beeinflussung des Carry Bits als Nicht-Zero Bit implementiert. Bei all
4.11 Warum ist der MSP430 so wie er ist?
135
diesen Befehlen kann kein Carry auftreten, d.h. er wäre immer Null und enthielte daher auch keine Information (eine immer gleiche Information ist keine!). Durch das Verwenden des Carry Bits als Nicht-Zero Bit (C = .not. Z) wird bei diesen vier Befehlen eine wichtige Information – nämlich ob das Ergebnis des Befehls Null erzeugte oder nicht – invertiert in das Carry Bit geschrieben. Das Carry Bit kann dann mit dem nächsten Befehl in einen Operand geschoben werden, oder aber zu einem Operanden addiert bzw. von ihm subtrahiert werden. Keine bedingten Sprünge sind dafür notwendig. (Wir verdanken diese Idee einem an der CPU-Entwicklung beteiligten Paderborner Universitätsprofessor). Der Vorteil dieser Methode kann an dem nächsten Beispiel gesehen werden. Das Bit P1. 0 des Eingangsports P1 soll gelesen werden und die Bit-Information nach links in ein Arbeitsregister geschoben werden. Ohne die (C = .not. Z)-Funktion würde das Programm so aussehen (5 Worte, 8 MCLK-Zyklen):
L$1
RLA BIT.B JZ BIS ...
R5 #1,&P1IN L$1 #1,R5
; ; ; ; ;
LSB Zero Bit Zero Bit = 1, Info = 0 Info 1 in LSB von R5 Bit-Info ist im LSB von R5
Durch die (C = .not. Z)-Funktion sieht das Programm so aus (3 Worte, 5 MCLKZyklen). Es ist also in den beiden wichtigsten Werten (Platzverbrauch und Geschwindigkeit) fast doppelt so leistungsfähig wie es ohne die (C = .not. Z)Funktion wäre. Dazu kommt die bessere Lesbarkeit (Verständlichkeit) des kürzeren Codes. BIT.B RLC ...
#1,&P1IN R5
; P1.0-Info -> C. C = .not.Z ; C-Info in R5 einschieben ; Bit-Info ist im LSB von R5
4.11.4 Warum wird das obere Register-Byte bei ByteBefehlen gelöscht? Der Grund, warum diese und keine andere Behandlung eines Destination-Registers im Register Mode gewählt wurde, ist die optimale Verwendbarkeit des Register Mode. Steht in Arbeitsregister R5 der Wert 4567h und wird der Befehl ADD.B
#20h,R5
; Erhoehe R5 um 20h
ausgeführt, dann steht nach dem Befehl 0087h in R5: Das obere Byte wird durch den Byte-Befehl gelöscht, im unteren Byte steht die Summe von 67h + 20h = 87h.
136
Kapitel 4: Die Zentraleinheit
Prinzipiell sind drei Möglichkeiten vorhanden, das obere Byte eines Arbeitsregisters bei Byte-Befehlen zu behandeln: • Automatische Erweiterung des Byte-Vorzeichens – in Bit 7 – in das obere Byte des Registers: In diesem Falle stünde FF87h nach dem Befehl in R5. • Belassen des oberen Bytes in seinem Zustand: R5 enthielte 4587h nach dem Befehl. • Löschen des oberen Bytes: R5 enthielte 0087h nach dem Befehl. Eine angestellte Untersuchung von verschiedenen Programmbeispielen ergab, dass beim weitaus größten Teil aller Anwendungen die letzte Möglichkeit sich als die vorteilhafteste erwies: • Die meisten Byte-Daten sind vorzeichenlos, d.h. nach den meisten ByteBefehlen wäre bei den beiden ersten Lösungen ein umständliches Löschen des oberen Bytes notwendig, um brauchbare 8-Bit-Werte zu erhalten (2 Worte, 2 MCLK-Zyklen): BIC
#0FF00h,R5
; Oberes Byte von R5 loeschen
• In den – relativ seltenen – Fällen, in denen in dem Destination-Register vorzeichenbehaftete Werte stehen, kann mit dem SXT-Befehl das Vorzeichen des unteren Bytes in das gesamte Arbeitsregister übernommen werden (1 Wort, 1 MCLK-Zyklus): ADD.B SXT
#20h,R5 R5
; Erhoehe R5 um 20h ; Byte in Wort mit Vorzeichen
4.11.5 Warum eine RISC-Architektur mit sieben Adressierungsarten? Eine RISC-Architektur ist am besten ausgenutzt, wenn das Programm viele Berechnungen durchzuführen hat und nur wenige Ein- und Ausgaben und Interrupts. Das Prinzip des Ladens der Register am Beginn einer Berechnung und des Abspeicherns des Ergebnisses am Ende einer Berechnung benötigt Speicherzugriffe – und damit Adressierungsmöglichkeit – nur für die beiden Befehle LOAD und STORE. Dieses Konzept zeigt Nachteile, wenn es in Echtzeitanwendungen arbeitet und dadurch Ein-und Ausgaben sowie Interrupts verarbeiten muss: Hier ist es ein Nachteil, wenn die Operanden zuerst geladen werden müssen, dann verarbeitet und schließlich zurückgeschrieben werden müssen. Daher benutzt die MSP430-Architektur die Vorteile beider Architekturen: • Das RISC-Konzept mit wenigen, starken Befehlen, zahlreichen Arbeitsregistern und Ein-Zyklus-Befehlen
4.11 Warum ist der MSP430 so wie er ist?
137
• Das CISC-Konzept mit seiner Adressierungsmöglichkeit, die für alle Befehle vorhanden ist und nicht nur für die beiden Befehle LOAD und STORE. Den Vorteil der MSP430-Architektur gegenüber dem reinen RISC-Konzept zeigt eine Interrupt-Routine, die einen Zähler COUNT erhöhen soll: Statt der sechs Befehle, bei der reinen RISC-Architektur, sind beim MSP430 nur zwei notwendig; der Overhead ist minimal. RISC_INT equ $ ; RISC-Interrupt-Routine PUSH R5 ; Arbeitsregister retten LOAD R5,COUNT ; Zaehler in R5 schreiben INC R5 ; Zaehler COUNT erhoehen STORE R5,COUNT ; Zaehler zurueckschreiben POP R5 ; R5 restaurieren RETI ; Rueckkehr vom Interrupt ; ; Interrupt-Routine fuer den MSP430 ; 430_INT INC COUNT ; Zaehler COUNT erhoehen RETI ; Rueckkehr vom Interrupt
4.11.6 Sieben Adressierungsarten mit nur zwei Bits? Selbstverständlich können mit zwei Adressierungsbits nur vier Adressierungsarten dekodiert werden. Durch die Anordnung des Program Counters PC als Arbeitsregister sind aber zwei weitere Adressierungsarten möglich: • Symbolic Mode: Indexed Mode mit dem Program Counter. Ein zusätzliches Wort nach dem Befehlswort enthält den Abstand der Operanden-Adresse zum Inhalt des Program Counters. • Immediate Mode: Indirect Autoincrement Mode mit dem Program Counter. Ein zusätzliches Wort nach dem Befehlswort enthält den unmittelbaren Operanden. Durch die Verwendung des Indexed Mode mit dem Status Register SR wird der Absolute Mode ermöglicht: • Ein zusätzliches Wort nach dem Befehlswort enthält die absolute Adresse des Operanden. Der Wert des Status Registers ist bei der Adressberechnung vorübergehend Null. Mehr darüber im Kapitel »Die Adressierungsarten«.
139
5
Die Peripherie-Module
Die Peripherie-Module des MSP430F4xx wurden nach ähnlichen Gesichtspunkten wie die CPU selbst entwickelt. Die Haupteigenschaften der MSP430-Peripherie-Module sind: • Höchstmögliche Orthogonalität (soweit das bei einem Peripherie-Modul möglich ist). Am besten sichtbar ist dies bei den beiden Timern A und B. • Anordnung der am häufigsten verwendeten Steuerbits in denjenigen Bits, die durch den Constant Generator adressiert werden können (Bits 0, 1, 2, 3). Dadurch ist minimaler Speicherplatzbedarf und höchstmögliche Geschwindigkeit gesichert. • Alle Steuerbits sind les- und schreibbar (außer einigen wenigen »read only«Bits, bei denen diese Eigenschaft aber nicht stört), sodass alle vorhandenen Befehle auch zum Steuern der Peripherie-Module verwendet werden können. • Die Möglichkeit zur Abschaltung, sodass während der Low Power Modes die niedrigstmögliche Stromaufnahme erreicht wird. • Wählbare Betriebsfrequenz: Sowohl mit dem ACLK als auch mit dem SMCLK. Die Möglichkeit, den ACLK verwenden zu können, macht den Betrieb auch während des LPM3 möglich. Mehr Information: [1] Kapitel On-Chip Peripherals [2] Kapitel On-Chip Peripherals [5] Kapitel 6…17
5.1
Der FLL+ System Clock Generator
Der FLL+ System Clock Generator erzeugt die Arbeitsfrequenzen für die CPU und die Peripherie-Module und enthält dafür drei verschiedene Oszillatoren: • LFXT1 Oscillator: Die Frequenz fcrystal (ACLK) wird mit ihm erzeugt. Quarze mit einer Frequenz von 32,768 kHz oder einer solchen zwischen 455 kHz und 8 MHz können verwendet werden. Auch eine externe Eingangs-
140
Kapitel 5: Die Peripherie-Module
frequenz ist möglich. Ein gepufferter Ausgang mit den wählbaren Frequenzen ACLK, ACLK/2, ACLK/4 oder ACLK/8 ist ebenfalls vorhanden. • Digitally Controlled Oscillator (DCO): Die Ausgangsfrequenz fcrystal des LFXT1 Oscillator wird mit (N+1) – wobei 2 N 128 – und einem Faktor, der von den D-Bits (1 bis 8) definiert wird, multipliziert. Eine geschlossene Regelschleife ermöglicht eine genaue Ausgangsfrequenz fDCOCLK. • XT2 Oscillator: (nur in MSP430x43x und MSP430x44x vorhanden) Quarze mit Frequenzen zwischen 455 kHz und 8 MHz können verwendet werden. Die Ausgangsfrequenz fXT2CLK kann für den MCLK und den SMCLK verwendet werden. Die Arbeitsfrequenzen aller drei Oszillatoren können als gepufferte, externe Signale verfügbar sein. • Auxiliary Clock ACLK: Clock Signal für Peripherie-Module, das direkt vom LFXT1 Oscillator kommt. Der ACLK ist auch während des Low Power Mode 3 aktiv. • Main Clock MCLK: Der Clock für die CPU kann der ACLK, die Frequenz des DCO oder diejenige des XT2 Oscillator sein. • Sub-Main Clock SMCLK: Dieser Clock für die Peripherie-Module kann vom DCO oder vom XT2 Oscillator herstammen.
Abb. 5.1: Der FLL+ System Clock Generator
Anmerkung: Der DCO kann Ausgangsfrequenzen bis zu 56 MHz (mindestens 38 MHz bei Vcc = 3 V) liefern. Das sichert seine Verwendbarkeit auch für die kommenden Jahre, aber diese Frequenz ist weit über der momentanen maximalen MCLK-Frequenz fMCLKmax = 8 MHz.
5.1 Der FLL+ System Clock Generator
141
Es ist daher empfohlen, die Steuerbits des DCO vorsichtig zu verändern, oder aber, noch besser, die Subroutine INITSR der MSP430F449 Quick Start Software zu verwenden.
5.1.1
Arbeitsweise der FLL+
Die Ausgangsfrequenz fDCOCLK des FLL+ System Clock Generator wird in einem Digitally Controlled Oscillator (DCO), der 32 Stufen (taps) hat, generiert. Diese 32 Stufen werden von den fünf MSBs NDCO des Frequenzintegrators gesteuert. Neunundzwanzig dieser Stufen – zusammen mit den FN_x-Schaltern – erzeugen einen Bereich der Ausgangsfrequenz, der von typisch 700 kHz bis 46,5 MHz reicht (die Stufen 28 bis 31 sind identisch). Die Frequenzen der Stufen hängen von der Temperatur und von der Speisespannung ab: Es ist daher eine Quarzreferenz notwendig. Die Frequenzen zweier benachbarter Stufen differieren um ungefähr 10 %. Die genaue Ausgangsfrequenz wird durch das geregelte Umschalten zwischen zwei benachbarten Stufen erreicht: Die eine hat eine zu hohe Frequenz fN+1, die andere eine zu niedrige fN. Die Differenz zwischen der Referenzfrequenz fcrystal und der heruntergeteilten DCO-Frequenz fDCOCLK wird in einem 10-Bit-Vorwärts-/Rückwärtszähler (dem Frequenzintegrator) summiert: Die Frequenz fcrystal inkrementiert ihn, die andere dekrementiert ihn. Je höher der Inhalt des Frequenzintegrators ist, desto höher ist die erzeugte Frequenz fDCOCLK. Im Gleichgewichtszustand wird die korrekte Ausgangsfrequenz erzeugt, die mit jedem ACLK-Zyklus nachgeregelt wird. Die Modulation – gesteuert von den fünf LSBs NDCOmod des Frequenzintegrators – reduziert die Schrittweite DfN der Stufen ( 10 %) auf ungefähr 10 % 2-5 = 0,1 0,03125 = 0,003125. Der noch verbleibende, minimale Fehler wird mit jedem ACLK-Zyklus korrigiert: Die Modulation wird angepasst, falls notwendig. Abbildung 5.2 zeigt dies für eine DCO-Ausgangsfrequenz fDCOCLK 1.04 fN. Dies bedeutet, dass die höhere Frequenz fN+1 während ungefähr 40 % und die niedrigere Frequenz fN während ungefähr 60 % der Zeit verwendet wird. Die Modulation des DCO schaltet zwischen NDCOmod = 12 und NDCOmod = 13 hin und her, um den korrekten Wert zu erreichen: 40 % 25 = 0.4 32 = 12,8. Siehe Abbildung 5.3.
142
Kapitel 5: Die Peripherie-Module
Abb. 5.2: Die FLL+ Taps
Abbildung 5.3 zeigt die Modulation – der DCO schaltet zwischen der niedrigen (fN) und der hohen (fN+1) DCO-Stufe hin und her – für einige Werte von NDCOmod. Die Modulation wird für zwei verschiedene MCLK/ACLK-Kombinationen gezeigt: • MCLK = 32 ACLKs: z.B. 1,048 MHz und 32.768 Hz • MCLK = 16 ACLKs: z.B. 7,28 MHz und 455 kHz Für jede der 32 Modulationsstufen 0 bis 31 ist die am besten verteilte Sequenz der beiden Frequenzen fN und fN+1 realisiert. Das minimiert die verbleibende Frequenzschwankung (Jitter) der DCO-Ausgangsfrequenz.
Abb. 5.3: Verschachtelung der DCO-Stufen in Abhängigkeit von NDCOmod
5.1 Der FLL+ System Clock Generator
5.1.2
143
Vorteile der FLL+
Das Konzept der FLL+ erlaubt zwei widersprüchliche Arten des Betriebs: • Extrem niedrige Stromaufnahme während des Low Power Mode 3 (LPM3). Nur die Frequenz fcrystal ist aktiv, die CPU ist abgeschaltet. Diese Betriebsart ermöglicht eine Lebensdauer der Batterie von mehr als 10 Jahren. • Sehr schnelles Aufwachen und Erreichen der vollen Arbeitsgeschwindigkeit durch einen Interrupt. Die gespeicherte 10-Bit-FLL+ Information (in NDCO und NDCOmod) erlaubt den Neustart innerhalb von nur max. sechs Mikrosekunden und sechs MCLK-Zyklen: Schon der erste Befehl der InterruptRoutine wird mit der korrekten, gespeicherten MCLK-Frequenz ausgeführt. Ein Quarz würde zwischen 20 und 200 ms bis zum korrekten Schwingen benötigen.
5.1.3
Die FLL+ Clock Module Control Register
Die fünf Control Register SCFI0, SCFI1, SCFQCTL, FLL+CTL0 und FLL+CTL1 enthalten alle Steuerbits, die für die Benutzung des FLL+ System Clock Generator notwendig sind. Lässt man die Bits der Control Register auf dem Wert, der sich durch das Einschalten der Speisespannung ergibt, dann stellt sich eine DCO-Frequenz fSystem ein: fSystem =
fDCOCLK 2.097,152KHz = =1.048,576 KHz D 1 2 2
Falls fSystem = 1.048 MHz die gewünschte Arbeitsfrequenz ist, braucht nichts Weiteres getan zu werden (allerdings sollten die von der Subroutine INITSR ausgerechneten Zyklen abgewartet werden, bis der Low Power Mode 3 aufgerufen wird).
Abb. 5.4: Das SCFI0 Control Register
144
Kapitel 5: Die Peripherie-Module
NDCOmod 20...21
2 LSBs der 5 NDCOmod-Bits: LSBs des Frequenz-integrators
FN_2 FN_3 FN_4 FN_8 D
Schalten die DCO-Stromquelle
Teiler für die DCO-Ausgangsfrequenz fDCOCLK. Zusammen mit dem SCFQCTL Register sind Multiplikations-faktoren von 2 bis 1024 für fcrystal möglich
Die 5 NDCOmod-Bits steuern die Anzahl der fN+1 Stufen in einer Sequenz. Siehe Abbildung 5.3. Die 4 Bits bestimmen den Frequenzbereich von 700 kHz bis 46,5 MHz (typ.)
0: 1: 2: 3:
Teilung durch 20 = 1 Teilung durch 21 = 20 Teilung durch 22 = 4 Teilung durch 23 = 8
Tabelle 5.1: Die Funktion der SCFI0-Bits
Abb. 5.5: Das SCFI1 Control Register
NDCOmod 22...24
Die drei MSBs der fünf NDCOmod-Bits
NDCO 25...29
Die fünf NDCO-Bits
Die fünf NDCOmod-Bits steuern die Modulation des DCO: Sie geben die Anzahl von fN+1 Stufen innerhalb einer Sequenz von 32 Schritten an. Diese fünf Bits definieren – zusammen mit den FN_x Schaltern und den D Bits – die untere Frequenz fN der beiden benutzten Frequenzen fN and fN+1. Die Frequenz fN ist während (32 – NDCOmod) Zyklen, die Frequenz fN+1 ist während NDCOmod Zyklen activ.
Tabelle 5.2: Funktion der SCFI1 Bits (MSBs des Frequenzintegrators)
Abb. 5.6: Das SCFQCTL Control Register
5.1 Der FLL+ System Clock Generator
N 20…26
145
Multiplikationsfaktor N Die ACLK-Frequenz fcrystal wird mit dem des DCO Wert (N+1) × 2D multipliziert, um die Frequenz fDCOCLK zu erhalten. Der gültige Bereich für N ist: 0 < N 127 Modulations-Steuerbit Das M-Bit schaltet die Modulation – das Umschalten zwischen fN und fN+1 – des DCO: 0: Modulation ist ein 1: Modulation ist aus
M
Tabelle 5.3: Die Funktion der SCQCTL-Bits
Das SCFQCTL Register erlaubt es, die DCO-Ausgangsfrequenz fDCOCLK in Schritten derACLK-Frequenz fcrystal zu verändern. Die Formel für den eingeschwungenen Zustand ist: I'&2&/. = IFU\VWDO
Wobei fDCOCLK
'
Ë Q = ÌÌ + Ê 1 Q Í Q =
Q
Û ÜÜ Ý
Ausgangsfrequenz des DCO
[Hz]
fcrystal
Eingangsfrequenz des DCO (Referenz)
[Hz]
D
Wert (0 bis 3) der D Bits im Register SCFI0
Nn
Wert (0 oder 1) von Bit n (0 bis 6) im Register SCFQCTL
Die möglichen Multiplikationsfaktoren für die Frequenz fcrystal reichen dabei von ' PLQ
1 PLQ + ELV
' PD[
1 PD[ +
was bedeutet, von:
+ = ELV
+ =
Die beiden Register FLL+CTL0 und FLL+CTL1 steuern die neuen Funktionen der FLL+, die in der FLL der MSP430x3xx-Familie noch nicht enthalten waren.
Abb. 5.7: Das FLL+CTL0 Control Register
146
Kapitel 5: Die Peripherie-Module
DCOF
Fehlerflag des DCO
LFOF
XT1OF
XT2OF
OscCap
XTS_FLL
DCO+
DCOF = 1, wenn der DCO den gültigen Bereich verlässt, also die Stufen 0, 28, 29, 30 oder 31 benutzt. Das bedeutet einen nicht schwingenden Quarz (Stufe 0) oder einen falsch gesetzten FN_x Schalter (ein höherer oder niedrigerer ist notwendig, um die richtige Frequenz zu erreichen). Das OFIFG-Bit (IFG.1) ist auch gesetzt. Fehlerflag des LFXT1 Oscilla- LFOF = 1, wenn der LFXT1 Oscillator tor, wenn er im LF Mode nicht richtig arbeitet. Das zeigt z.B. einen arbeitet (XTS_FLL = 0). nicht schwingenden Quarz an (z.B. durch gebrochene Anschlüsse). Das OFIFG-Bit (IFG.1) ist auch gesetzt. Fehlerflag des LFXT1 Oscilla- XT1OF = 1, wenn der LFXT1 Oscillator nicht richtig arbeitet. Das zeigt z.B. einen tor, wenn er im HF Mode nicht schwingenden Quarz an. Das arbeitet (XTS_FLL = 1). OFIFG-Bit (IFG.1) ist auch gesetzt. Fehlerflag des XT2 Oscillator XT2OF = 1, wenn der XT2 Oscillator nicht richtig arbeitet. Das zeigt z.B. einen nicht schwingenden Quarz an. Das OFIFG-Bit (IFG.1) ist auch gesetzt. Das Bit ist nur vorhanden, wenn der XT2 Oscillator implementiert ist. Sonst wird es als 0 gelesen. Einstellung der internen Quarz- 0: 0pF CL = 1 pF Lastkapazitäten Cint. Siehe 1: 10pF CL = 6 pF auch »Die eingebauten Last2: 14pF CL = 8 pF kapazitäten«. Die resultierenden 3: 18pF CL = 10 pF Werte für CL sind gezeigt. Auswahl des Modus für den Der Oszillator wird an den verwendeten LFXT1 Oscillator: LF Mode Quarz angepasst. (niedrige Frequenz) oder HF 0: LF Mode (32,768 kHz) Mode (hohe Frequenz) 1: HF Mode (455 kHz bis 8 MHz) Direkt/indirekt-Schalter für Bestimmung ob die Frequenz für den die DCO-Ausgangsfrequenz MCLK und SMCLK direkt vom DCO genommen wird (hohe Frequenz) oder erst durch einen Faktor – definiert durch die DBits – geteilt werden soll (der DCO hat eine höhere Frequenz als MCLK und SMCLK). 0: DCO dividiert durch 2D
I6\VWHP = I'&2&/.
-'
1: DCO wird nicht untersetzt
I6\VWHP = I'&2&/. Tabelle 5.4: Die Funktion der FLL+CTL0 Bits
5.1 Der FLL+ System Clock Generator
147
Abb. 5.8: Das FLL+CTL1 Control Register
FLL_DIV
Festlegung des Untersetzungsfaktors für die gepufferte ACLK-Ausgangsfrequenz
SELS
Festlegung des Clocks für den Sub Main Clock SMCLK Festlegung des Clocks für den Main Clock MCLK (CPU)
SELM
XT2OFF
Schalter für den XT2 Oscillator
SMCLKOFF
Schalter für die SMCLK-Frequenz
0: 1: 2: 3: 0: 1: 0: 1: 2: 3: 0: 1: 0: 1:
fcrystal 20 fcrystal 2-1 fcrystal 2-2 fcrystal 2-3 DCOCLK XT2CLK DCOCLK DCOCLK XT2CLK ACLK XT2CLK ein XT2CLK aus SMCLK ein SMCLK aus
Tabelle 5.5: Die Funktion der FLL+CTL1-Bits
5.1.4
Die eingebauten Lastkapazitäten
Der LFXT1 Oscillator erlaubt es, vier unterschiedliche, interne Paare von Lastkapazitäten an die Pins XIN und XOUT zu schalten, um die im Datenblatt des Quarzes definierte Lastkapazität CL zu erzielen. Der Kapazitätswert wird mit den beiden OscCap-Bits im Register FLL+CTL0 eingestellt. Die vier nominalen Werte sind: 0 pF, 10 pF, 14 pF und 18 pF. Der Quarz sieht die beiden ausgewählten Kapazitäten an den Pins XIN und XOUT als in Reihe geschaltet. Das bedeutet, die effektive Lastkapazität Ceff ist: &HII =
Wobei CL
(&LQW + &SDU + &H[W ) (&LQW + &SDU + &H[W ) = &LQW + &SDU + &H[W (&LQW + &SDU + &H[W ) + (&LQW + &SDU + &H[W ) Spezifizierte Lastkapazität für den Quarz
[pF]
Cint
Ausgewählte interne Lastkapazitäten (OscCap Bits)
[pF]
Cpar
Parasitäre Kapazitäten des Gehäuses ( 2 pF/Pin)
[pF]
Cext
Kapazität jedes der zwei externen Kondensatoren
[pF]
148
Kapitel 5: Die Peripherie-Module
Die Kapazität Ceff sollte gleich oder aber nahe an der spezifizierten Lastkapazität CL sein. Der Wert der beiden eventuell notwendigen Kondensatoren Cext ist: &H[W = &/ - (&LQW + &SDU )
Beispiel: Für einen 32,768-kHz-Quarz ist eine Lastkapazität CL = 6 pF definiert. Wählt man die internen 10-pF-Kondensatoren (OscCap = 1) dann ergibt sich (mit Cpar = 2 pF) für den Wert der notwendigen externen Kondensatoren Cext: &H[W = &/ - (& LQW + &SDU ) = S) - ( S) + S) ) = S)
Das bedeutet, für eine spezifizierte Lastkapazität von CL = 6 pF sind keine externen Kondensatoren an den Pins XIN und XOUT notwendig.
5.1.5
Die Initialisierungs-Subroutine INITSR
Die Initialisierungs-Subroutine INITSR – die in der MSP430F449 Quick Start Software enthalten ist – wird für normale Anwendungen benutzt. Sie macht Folgendes: • Berechnung und Programmierung der Bits FN_x, D, DCO+ und N aus den Definitionen für fsystem, fcrystal und dem gewünschten kleinsten Untersetzungsfaktor FLLDw für fDCOCLK. Dadurch ist die MCLK-Frequenz fMCLK festgelegt. Die Definitionen sollten am Beginn der Source stehen. Siehe Beispiel unten. • Der korrekte DCO-Schalter FN_x für die berechnete Frequenz fDCOCLK wird gesetzt. Dadurch arbeitet der DCO immer ungefähr in der Mitte des eingestellten Frequenzbereiches. • Eine berechnete Wartezeit wird abgewartet, um der FLL+ Zeit zu geben, die richtige Arbeitsfrequenz zu erreichen. Diese Wartezeit ist nur notwendig, wenn der LPM3 benutzt wird. • Die internen Lastkapazitäten werden berechnet und programmiert. • Die geringst mögliche Stromaufnahme wird angestrebt, d.h., der kleinste mögliche Wert für D wird ausgewählt. Beispiel: Eine FLL+ soll wie folgt arbeiten: fSystem = 3,276800 MHz, fcrystal = 32,768 kHz, der DCOCLK soll durch Zwei geteilt werden, die spezifizierte Lastkapazität des Quarzes ist 8 pF.
5.1 Der FLL+ System Clock Generator
149
Die Definition in der Source sieht dann so aus: ; Definitionen fuer den ; SMCLK equ 3276800 fsystem equ SMCLK fcrystal equ 32768 FLLDw equ 2 CL equ 8 ... CALL #INITSR ...
FLL+ System Clock Generator ;[] SMCLK: 100x32768Hz = 3,2768MHz ;[] Def. MCLK: 3,2768MHz [Hz] ;[] Def. ACLK fcrystal [Hz] ;[] Division von fDCOCLK durch 2 ;[] Quarz-Lastkapazitaet 8pF ; Weiter in der Initialiserung ; Programmierung der FLL+ ; FLL+ Frequenz ist bereits stabil
Anmerkung: Die Subroutine INITSR erlaubt auch höhere Ausgangsfrequenzen als die aktuelle maximale Frequenz fMCLKmax = 8 MHz!
5.1.6
Kurzzeit-Genauigkeit des FLL+ System Clock Generator
Der Frequenzfehler des FLL+ System Clock Generator ist Null für lange Zeitintervalle (lang, verglichen mit der Periode der DCO-Frequenz fDCOCLK). Für kurze Zeitintervalle ist durch das Schalten der beiden Frequenzen eine kleine Zeitabweichung der Flanken des Clocks vorhanden. In [1], Kapitel »Short Time Accuracy of the System Clock Generator«, ist eine »worst case«-Berechnung für diese Zeitabweichung für die FLL der MSP430C3xx-Familie durchgeführt. Diese Berechnung ist auch für die FLL+ gültig, und zwar für die folgenden, schlechtesten Bedingungen: • D = 0: Keine Untersetzung für den DCOCLK, dadurch die maximale zeitliche Abweichung der Flanken der Ausgangsfrequenz. • DCO+ = 0: Der DCOCLK ist die Ausgangsfrequenz. • fDCOCLK = fSystem = 1 MHz. • fcrystal = 32,768 kHz: Es wird ein Uhrenquarz verwendet. Die im oben erwähnten Kapitel damit berechneten, maximalen Zeitabweichungen der FLL+-Ausgangsfrequenz zeigen den geringen Fehler, der durch die Modulation des DCO verursacht wird. Die »worst case«-Zeitabweichung terrmax innerhalb einer Periode des ACLK ist: terrmax = 177 ns Dieser Wert ist relativ klein, gegenüber der digitalen Unsicherheit, welche ein DCO-Zyklus ist (1 ms bei 1 MHz).
150
Kapitel 5: Die Peripherie-Module
Falls der Fehler terrmax für andere Systembedingungen gebraucht wird, kann die folgende Näherungsformel verwendet werden: WHUU PD[
0+] I'&2&/.
QV
Die Zeitabweichungen des FLL+ System Clock Generator akkumulieren nicht, sondern werden mit der nächsten Periode des ACLK kleiner. Der Gesamtfehler tendiert für längere Zeitintervalle zu Null hin. Der FLL+ System Clock Generator ist daher für präzise Zeitmessungen ebenso geeignet, wie ein normaler Quarzoszillator. Anmerkung: Die obige Berechnung zeigt die »worst case«-Frequenzschwankung (jitter) des DCOCLK. Mit einem zurückgesetzten DCO+-Bit und einem Wert für die D-Bits > 0, kann eine noch kleinere Frequenzschwankung erreicht werden.
Mit D = 3 (Untersetzung durch 8) reduziert sich die relative Frequenzschwankung um den Faktor 8. Weitere Information: [1] Kapitel The System Clock Generator [10] The Frequency Locked Loop System Clock Generator (FLL+) Weitere Anwendungen und Softwarebeispiele sowie Low Power Modes.
5.2
Die FLASH-Speicher
Auch der Programmspeicher kann ähnlich wie die beiden Information Memories A und B für die Speicherung von sich langsam ändernden Werten verwendet werden. Da ein Sektor aber 512 Bytes groß ist, kommt die Lösung mit der Zwischenspeicherung im RAM, die im Kapitel »Die Information Memories« gezeigt wird, nur für die MSP430-Typen in Frage, die ein sehr großes RAM besitzen (MSP430F44x). Es ist allerdings möglich, ein zweites, unbenutztes Segment für die Speicherung der Daten zu verwenden. Die Schritte hierfür sind: • Löschen des Segmentes mit der älteren Information. Welches Segment die aktuelle Information enthält, ist in einem Statusbyte im RAM oder in einem der Information Memories enthalten. • Kopieren des aktuellen Segmentes in das gelöschte Segment. An den Adressen, an denen sich die Daten ändern, wird die Information aus dem RAM genommen. • Aktualisieren des Statusbytes.
5.3 Die Information Memories A und B
151
Die Subroutine »Write_Flash« in der »MSP430F449 Quick Start Software« kann recht einfach auf diese Anwendung umgeändert werden. Anmerkungen: Das Segment 0 (Adressen FE00h bis FFFFh) sollte für solche Zwecke nicht verwendet werden, da die sechzehn Interrupt-Vektoren in ihm enthalten sind. Bei einem Fehler während des Schreibens (z.B. Netzausfall) könnten diese Vektoren gelöscht werden und das Programm kann nicht mehr gestartet werden.
Während des Löschens und Schreibens in das Flash wird kein Programm ausgeführt. Weitere Information: [5] Anhang Flash Memory
5.3
Die Information Memories A und B
Die beiden 128-Byte-Flash-Speicher Information Memory A und B sind wie in Abbildung 5.9 gezeigt angeordnet. Sie können mit Wort- und mit Byte-Befehlen adressiert werden. Da sie nur jeweils 128 Bytes groß sind, ist normalerweise eine Zwischenspeicherung im RAM möglich. Dies ist nötig, weil eine Änderung eines Flash-Speichers das vorherige Löschen notwendig macht. Die Subroutine »Write_Flash« in der »MSP430F449 Quick Start Software« enthält ein Programm, das folgende Schritte enthält: • Löschen der 128 Bytes des adressierten Information Memory • Kopieren der 128 Bytes aus dem RAM, Beginn der Daten beim Label IM_Buffer (die Daten wurden vor dem Kopieren auf den gewünschten Stand gebracht) • Vergleich der Daten im RAM mit den Daten im Information Memory: Falls sie identisch sind, wird das N-Bit im Status Register gelöscht, falls nicht, wird es gesetzt. Anmerkung: Während des Löschens und Schreibens in die Information Memories wird kein Programm ausgeführt. Dies dauert ungefähr 20 ms.
152
Kapitel 5: Die Peripherie-Module
Der Aufruf für eine Änderung des Information Memory B sieht so aus: ... ; IM_Buffer aktualisieren ; ; Aktualisierten RAM-Buffer ins Information Memory B ; schreiben. Dann RAM-Buffer und Information Memory B ; vergleichen. N-Bit enthaelt Info ob Daten gleich ; CALL #Write_Flash ; IM_Buffer in Info Memory dw 01000h ; Adresse des Info Memory B JN Error ; N = 1: Info nicht gleich ... ; N = 0: RAM und IM gleich
Abb. 5.9: Die Information Memories A und B (gezeigt für den MSP430F449)
Weitere Information: [5] Anhang Flash Memory [5] Kapitel Memory
5.4
Das RAM
Das RAM der MSP430-Familie beginnt immer an der Adresse 200h. Das Ende des RAMs ist von der Größe des RAMs abhängig. Das letzte Byte befindet sich beim kleinsten RAM mit 128 Bytes (MSP430F11xx) an der Adresse 27Fh, beim – momentan – größten RAM mit 2 KByte (MSP430F449) an der Adresse 9FFh.
5.5 Der Analog-Digital-Wandler ADC12
153
Alle RAM-Adressen können als Bytes und als Worte adressiert werden. Die nächste Abbildung zeigt die Organisation der 2 KByte des MSP430F449. Der Stack Pointer SP wird normalerweise mit der Adresse des ersten Wortes oberhalb des RAMs initialisiert. Beim MSP430F449 also mit dem Wert A00h. MOV
#0A00h,SP
; Init. SP (2Kbyte RAM)
Abb. 5.10: Organisation des RAMs (gezeigt für den MSP430F449)
Weitere Information: [5] Kapitel Memory
5.5
Der Analog-Digital-Wandler ADC12
5.5.1
Die ADC12-Hardware
Die Abbildung 5.11 zeigt die Hardware-Module des 12-Bit-Analog-DigitalWandlers ADC12.
154
Kapitel 5: Die Peripherie-Module
Abb. 5.11: Der 12-Bit-Analog-Digital-Wandler ADC12
Eigenschaften des 12-Bit-Analog-Digital-Wandlers ADC12 • Monoton über den gesamten Wandlungsbereich 0…FFFh (0 …4095) • Acht (zehn) externe analoge Eingänge und zwei interne Eingänge (Vcc/2 und Temperaturdiode) • Relative (ratiometrische) oder absolute Messung möglich • Zwei interne Spannungsreferenzen: 1,5 V und 2,5 V • »Sample-and-Hold«-Funktion mit definierten Erfassungszeiten • Mit und ohne Interrupt verwendbar • Geringe Stromaufnahme und Abschaltmöglichkeit • Automatische Messfolgen ohne CPU möglich
5.5 Der Analog-Digital-Wandler ADC12
155
• Vektorisierter Interrupt erlaubt sehr schnelle Dekodierung der 18 ADC Interrupts • 12-Bit-Auflösung • Schnelle Wandelzeit (< 10 ms) • Vier ADC Clocks möglich: SMCLK, ACLK, MCLK, interner Oszillator • Interne und externe Referenz möglich • Großer Spannungsbereich
5.5.2
Die Hardware-Module
Das Analog-Digital-Wandler-Modul Das Analog-Digital-Wandler-Modul (ADC Core) misst die Eingangsspannung, die vom Eingangsmultiplexer ausgewählt ist. Die Fomel für den ADC12-Wert ist: 1$'& =
9LQ - 95 95 + - 9 5 -
1$'& <
VR+ und VR- sind die Referenzspannungen, die von der Referenz-Hardware kommen. Eingangsspannungen die außerhalb des Bereichs von VR+ und VRliegen, liefern das Ergebnis FFFh bzw. 000h.
Abb. 5.12: Das Analog-Digital-Wandler-Modul
156
Kapitel 5: Die Peripherie-Module
• Wenn die Temperaturdiode mit A10 gemessen werden soll, dann muss eine der beiden Referenzspannungen (1,5 V oder 2,5 V) zur Speisung eingeschaltet werden. • Wenn AVcc/2 mit A11 gemessen werden soll, wird der Spannungsteiler für AVcc automatisch eingeschaltet. Dieser Schalter ist sonst offen, um Strom zu sparen. Tabelle 5.6 zeigt die zwölf implementierten ADC12-Eingänge. Der zu messende analoge Eingang wird durch den Wert in den INCH-Bits in den Registern ADC12MCTLx bestimmt. Siehe Abbildung 5.16. Anmerkung: Die beiden Eingänge für die Referenzspannungen VeREF+ und VREF/VeREF- können als Analogeingänge A8 und A9 verwendet werden. Als Referenzspannungen VR+ und VR- können dann aber nur noch VREF+, AVcc und AVss verwendet werden.
Ax
Eingang
Kommentar/Applikation
A0 bis A7 A8
Externe Spannung VeREF+
A9
VREF-/VeREF-
Acht externe analoge Eingänge: P6.0 bis P6.7 - Eingang für externe positive Referenzspannung - Messung der externen positiven Referenzspannung mit AVcc und AVss. - Analogeingang A8 - Eingang für externe negative Referenzspannung - Messung der externen negativen Referenzspannung mit AVcc und AVss. - Analogeingang A9 Messung der internen Temperaturdiode Messung der halben, analogen Versorgungsspannung Nicht vorhanden
A10 Temperatur-diode A11 AVcc/2 A12 bis A15 NA
Tabelle 5.6: Eingänge des Analog-Digital-Wandlers
Das Analog-Digital-Wandler-Modul wird von zwei Control Registern gesteuert: ADC12CTL0 und ADC12CTL1. Die Funktion der Steuerbits in den beiden Registern ist in den Applikationsbeispielen erklärt. Mit wenigen Ausnahmen (ADC12SC, ENC, ADC12TOVIE, ADC12OVIE, CONSEQ) können die Steuerbits der beiden Register nur verändert werden, wenn das Bit ENC = 0 ist.
Abb. 5.13: Das ADC12 Control Register 0
5.5 Der Analog-Digital-Wandler ADC12
157
Abb. 5.14: Das ADC12 Control Register 1
Das Conversion Memory Das Conversion Memory steuert die Messungen für alle vier Umwandlungsmodi (Conversion Modes). Die vier CSTARTADD-Bits im Control Register ADC12CTL1 definieren das Steuerbyte ADC12MCTLx, welches angibt, wo die erste Messung beginnen soll. Abhängig vom gewählten Umwandlungsmodus definiert dieses Byte den zu messenden Analogeingang (Single Channel Mode, Repeat Single Channel Mode) oder die erste Messung einer Sequenz (Sequence of Channels Mode, Repeat Sequence of Channels Mode). Wenn ein sequentieller Modus benutzt wird, wird ein Zeiger, der auf die Steuerbytes ADC12MCTLx zeigt, automatisch erhöht, und das nächste Steuerbyte wird gelesen und ausgeführt. Dies wird durchgeführt, bis das EOS-Bit (ADC12MCTLx.7) in einem Steuerbyte gesetzt ist: Dieses Steuerbyte ist das letzte, das ausgeführt wird. Das Ergebnis einer Messung, die von ADC12MCTLx gesteuert wird, wird in das zugehörige ADC Memory Register ADC12MEMx geschrieben.
Abb. 5.15: Das Conversion Memory
Abbildung 5.16 zeigt die Steuerbits in einem ADC Memory Control Byte. Das EOS-Bit definiert das Ende einer Messsequenz, die INCH-Bits definieren den analogen Eingang Ax, der gemessen werden soll (siehe Tabelle 5.6) und die SREF-Bits definieren die dabei zu verwendende Referenzspannung (siehe Tabelle 5.6).
158
Kapitel 5: Die Peripherie-Module
Abb. 5.16: Das ADC Memory Control Byte
Abbildung 5.17 zeigt ein Conversion Memory Register, in welches das 12-BitMessergebnis nach einer Messung geschrieben wird.
Abb. 5.17: Das ADC Memory Register
Das Reference Modul Das Reference Module erzeugt die beiden Referenzspannungen VR+ und VR-, die vom Analog-Digital-Wandler-Modul verwendet werden. Die sechs möglichen Kombinationen der Referenzspannungen werden durch die SREF-Bits (Bits 4 bis 6) des aktiven ADC12MCTLx-Byte definiert. Tabelle 5.7 zeigt diese Kombinationen. Externe Referenzen müssen imstande sein, bis zu 200 mA zu liefern.
Abb. 5.18: Das Reference Module
SREF
VR+
VR-
Kommentar
0
AVcc
AVss
1 2,3
VREF+ VeREF+
AVss AVss
Messung mit der analogen Speisespannung als Referenz Interne 1,5 V oder 2,5 V als Referenz Externe positive Referenzspannung
5.5 Der Analog-Digital-Wandler ADC12
159
SREF
VR+
VR-
Kommentar
4 5
AVcc VREF+
VREF-/VeREFVREF-/VeREF-
6,7
VeREF+
VREF-/VeREF-
Externe negative Referenzspannung Externe negative und interne positive Referenzspannung Externe negative und positive Referenzspannung
Tabelle 5.7: Kombinationen der Referenzspannungen
Abbildung 5.19 zeigt die möglichen Kombinationen der Spannungsreferenzen in Tabelle 5.6. Jeder Pfeil zeigt einen vollen 12-Bit-ADC-Bereich an: Die negative Referenzspannung entspricht dabei dem Messwert 000h, die positive dem Messwert FFFh. Der Wert SREF entspricht den SREF-Bits in den Registern ADC12MCTLx, der Wert REF2_5V ist das Bit ADC12CTL0.6.
Abb. 5.19: Die Kombinationen der Spannungsreferenzen
Einige Hinweise zur Spannungsreferenz: • Die internen Referenzspannungen 1,5 V oder 2,5 V müssen nur eingeschaltet werden, wenn SREF = 1 oder SREF = 5 ist. Bei den anderen vier Kombinationen sollte REFON = 0 sein, um Strom zu sparen. • Die externe, positive Referenzspannung VeREF+ kann mit den analogen Versorgungsspannungen AVcc und AVss gemessen werden, wobei SREF = 0 und INCH = 8 (VeREF+) sind. Dies erlaubt es, die momentane AVcc zu berechnen. • Die externe, negative Referenzspannung VeREF- kann mit den analogen Versorgungsspannungen AVcc und AVss gemessen werden, wobei SREF = 0 und INCH = 9 (VeREF-) sind.
160
Kapitel 5: Die Peripherie-Module
• Wenn eine der internen Referenzspannungen verwendet wird, muss eine Wartezeit zwischen dem Einschalten und der Messung abgewartet werden: Diese Zeit ist maximal 17 ms bei 10 mF externer Kapazität. • Wenn andere Referenzspannungen als AVss und AVcc verwendet werden (VeREF+ oder VREF+, VeREF-/VREF-), dann müssen zwei Kondensatoren mit 10 mF und 100 nF an die benutzten Referenzeingänge angeschlossen werden.
Abb. 5.20: Spannungsversorgung für den ADC12
5.5.3
Beschreibung der ADC12-Hardware
Die Analog-Digital-Wandler-Eingänge
Die Analog-Digital-Wandler-Eingänge A0 bis A7 Wenn einer der acht Analogeingänge Ax verwendet werden soll, dann muss der zugehörige Ein- und Ausgabeport (P6.x) für diesen Zweck initialisiert werden. Das Beispiel initialisiert P6.1 und P6.0 für A1 und A0: BIS.B ...
#3h,&P6SEL ; P6.1 und P6.0 -> A1 und A0 ; Weiter mit der Initialisierung
Diese Initialisierung ist nicht notwendig für die internen ADC12-Eingänge A8 bis A11 (VeRef+, VeRef-, Temperatursensor und AVcc/2).
5.5 Der Analog-Digital-Wandler ADC12
161
Der Temperaturdioden-Eingang A10 Wenn die interne Temperaturdiode gemessen werden soll, dann muss eine der beiden Referenzspannungen (1,5 V oder 2,5 V) zur Speisung eingeschaltet werden. Die Ausgangsspannung UTD der Temperaturdiode ist: 87' = 77' P9 &+ P9
Die Temperatur TTD [C] der Diode ist dann:
77'
87' - P9 = P9 &
1 (95+ - 95- )
=
- P9
P9 &
Mit der Referenzspannung VR+ = 1,5 V und VR- = AVss ergibt das: 1 77' =
9
- P9
P9 &
= 1 -
Der Eingang für die halbe Speisespannung A11 Wenn AVcc/2 (A11) gemessen werden soll, dann wird der Spannungsteiler für AVcc automatisch eingeschaltet. Dieser Schalter ist sonst offen, um Strom zu sparen. Wenn AVcc und DVcc die gleiche Quelle haben, kann die Spannung AVcc/2 für die Messung der Speisespannung benutzt werden. Die Formel für DVcc und AVcc ist (VR- = AVss, VR+ = VREF+ (1,5 V oder 2,5 V) oder VeREF+): '9FF = $9FF = 95+
1
Die Bedingungen für korrekte Ergebnisse sind $9FF < 95() + und $9FF > 95() + Weitere Information: [2] Kapitel »The 12-Bit ADC12«, »Supply Voltage Measurement« Speisespannungsmessungen unter allen Bedingungen werden gezeigt.
Interrupts Der ADC12 hat 18 implementierte Interrupts. Das ADC12 Interrupt Vector Register ADC12IV enthält die Information des anstehenden Interrupts mit der
162
Kapitel 5: Die Peripherie-Module
höchsten Priorität. Ein Zugriff auf das Register ADC12IV setzt die beiden Überlauf-Flags ADC12OVIFG und ADC12TOVIFG zurück. Die 16 Interrupt-Flags ADC12IFG.x im Register ADC12IFG werden durch einen Zugriff auf das zugehörige Ergebnisregister ADC12MEMx zurückgesetzt. Das bedeutet, dass diese 16 Interrupt-Flags den Worten im Conversion Memory zugeordnet sind, nicht den ADC12-Eingängen A0 bis A11! Die 16 Interrupts, die zu den Ergebnisregistern ADC12MEMx gehen, können durch die 16 Enable Bits ADCIE.x im Register ADC12IE eingeschaltet werden. Die Priorität der ADC12-Interrupts geht von Vektor 2 (ADC-Überlauf) mit der höchsten Priorität bis zum Vektor 36 (ADC12MEM15) mit der niedrigsten. Der »Overhead« des ADC12-Interrupts ist 16 MCLK-Zyklen bei der Verwendung des Interrupt Vector Registers. Beispiel: Die Verwendung des ADC12 Interrupt Vector Registers wird gezeigt. INT_ADC12
; ADM15
; ADC12OV ; ADC12TOV
equ ADD RETI JMP JMP JMP JMP ... JMP MOV ... JMP
$ &ADC12IV,PC
; 6 Zyklen bis hier her ; Addiere Vektor Register ; 0: Kein anstehender Intr. ADC12OV ; 2: ADC Ueberlauf ADC12TOV ; 4: ADC Timing Ueberlauf ADM0 ; 6: ADC12MEM0 mit Resultat ADM1 ; 8: ADC12MEM1 mit Resultat ; Vectoren 10 bis 32 ADM14 ; 34: ADC12MEM14 mit Resultat ; 36: ADC12MEM15 mit Resultat &ADC12MEM15,xxx ; ADC12MEM15: Speichern ; ADC12IFG.15: 0 durch MOV INT_ADC12 ; Weiterer Interrupt?
... RETI
; ADC overflow handler ; ADC12OVIFG ( NW + NW) S) = mV
Die Erfassungszeit tsample wird von der Output Unit 1 des Timer_A erzeugt: fTimer_A = 3 MHz, Up Mode, Eingangsuntersetzung des Timer_A: kTA = 2. Welcher Wert nCCR1 ist für das Capture Compare Register TACCR1 notwendig? Q&&5 >
Wobei: nCCR1
WVDPSOH I7LPHU B $ = N7$
mV 0+]
=
Wert im Capture/Compare Register 1
[1]
fTimer_A Frequenz am Eingangsteiler des Timer_A
[Hz]
kTA
[1]
Eingangsuntersetzung des Timer_A
Der Wert nCCR1 muss als mindestens 10 sein, um die Erfassungszeit tsamplemin zu erhalten.
Pulse Sample Mode Diese Erfassungsart wird durch Bit SHP = 1 definiert. Das verwendete Erfassungssignal – vom Bit ADC12SC, dem Timer_A oder dem Timer_B – startet nur die Erfassung und Messung:
Abb. 5.23: Pulse Sample Mode
166
Kapitel 5: Die Peripherie-Module
Die Erfassungszeit tsample wird durch die Steuerbits SHTx im Register ADC12CTL0 bestimmt. Die Erfassungszeit tsample ist: WVDPSOH =
N I$'&LQ
Q
Die Erfassungszeit tsample ausgedrückt durch den Wert n der SHTx-Bits ist: Q > (5V PD[ + 5L PD[) &L PD[
Wobei:
I$'&&/. = (5V PD[ + 5L PD[) &L PD[
I$'&LQ N
fADC12CLK Frequenz für Erfassung und Umwandlung [Hz] fADCin
ADC12-Eingangsfrequenz (ACLK, MCLK, SMCLK, interner Oszillator)
[Hz]
n
ADC12CLK Zyklen definiert durch SHTx (Tabelle 5.8)
k
Eingangsuntersetzung für fADCin (1,2,3,4,5,6,7,8)
Beispiel: Die Eingangsspannung Vin wird durch einen Widerstandsteiler mit 220 kW und 15 kW (5 % Toleranz) geteilt. Der ADC12 arbeitet mit fSMCLK = 3 MHz, die Eingangsuntersetzung des ADC12-Clock k = 5. Minimales n für ½ LSB Genauigkeit für Vin? Q > (5V PD[ + 5L PD[ ) &L PD[ Q > ((
N)
N
+ N)
I$'&LQ N
S
0
=
Aus Tabelle 5.8: Das nächst größere n ist 32 (SHTx = 3). Die Erfassungszeit tsample ist durch den ADC12CLK und die SHT0- und SHT1-Bits im Control Register ADC12CTL0 definiert. SHT0 definiert dabei die Erfassungszeit für die Memory Control Bytes 0 bis 7, SHT1 für die Memory Control Bytes 8 bis 15. Tabelle 5.8 zeigt die Werte für n ausgedrückt in ADC12CLKs in Abhängigkeit von den SHTx-Bits.
SHT n
0 4
1 8
2 16
3 32
4 64
5 96
6 128
7 192
8 256
9 384
10 512
Tabelle 5.8: Erfassungszeit ausgedrückt in ADC12CLK-Zyklen
11 768
12-15 1024
5.5 Der Analog-Digital-Wandler ADC12
167
Messzeiten Die Messzeit tmeas für eine einzelne Analog-Digitalwandlung ist die Summe von Erfassungszeit (sampling time) tsample und Umwandlungszeit (conversion time) tconv: WPHDV = WVDPSOH + WFRQY = WVDPSOH +
N I$'&LQ
Die Berechnung der Erfassungszeit tsample wurde im letzten Kapitel gezeigt. Für eine Sequenz von m Messungen ist die Messzeit tmeas : WPHDV =
[=P
Ê (WVDPSOH [ =
[
Û N Ë [=P P + WFRQY[ ) = ÌÌ Ê WVDPSOH[ ÜÜ + Ý I$'&LQ Í [ =
Messfehler des ADC12 Die kleinen Messfehler des ADC12 benötigen normalerweise keine Korrektur. Wenn eine solche doch notwendig ist, können die Methoden in [1] für die Korrektur des 14-Bit-ADCs verwendet werden (additive, lineare und nichtlineare Korrektur).
5.5.4
Genauigkeit des 12-Bit-Analog-Digital-Wandlers
Die Abbildungen 5.24 und 5.25 zeigen die integrale und die differentielle Nichtlinearität des ADC12. Ein MSP430-Chip, der eine typische Charakteristik zeigte, war für die Messungen benutzt worden. Messung mit: Vcc = 2,2 V, VR+ = AVcc, VeREF- = 0,0 V, fADC12CLK = 4,74 MHz. ,QWHJUDO1RQ/LQHDULW\(UURU
Abb. 5.24: Integrale Nichtlinearität des ADC12
168
Kapitel 5: Die Peripherie-Module
Abbildung 5.25 zeigt die differentielle Nichtlinearität des ADC12. Alle Werte sind zwischen +1 und -1, was bedeutet, dass der ADC12 monoton ist und dass keine Schritte fehlen. 'LIIHUHQWLDO1RQ/LQHDULW\(UURU
Abb. 5.25: Differentielle Nichtlinearität des ADC12
5.5.5
Betriebsarten des ADC12 und Anwendungsbeispiele
Der Analog-Digital-Wandler kann in vier Betriebsarten verwendet werden: • Single Channel, Single Conversion Mode: Eine Umwandlung für einen Analogeingang • Repeat Single Channel Mode: Mehrfache Umwandlung für einen Analogeingang • Sequence of Channels Mode: Je eine Umwandlung für mehrere Analogeingänge • Repeat Sequence of Channels Mode: Mehrfache Umwandlung für mehrere Analogeingänge Die vier Betriebsarten werden durch die beiden CONSEQ-Bits im Control Register ADC12CTL1 definiert.
Einmalige Umwandlung (Single Channel, Single Conversion Mode). Ein einzelner Analogeingang Ax (A0 bis A11) wird einmal erfasst und umgewandelt. Das Resultat wird in das selektierte ADC Memory ADC12MEMx geschrieben. Beispiel: Das Beispiel liest den Analogeingang A0 (P6.0) einmal und speichert das Resultat in Arbeitsregister R4. Interrupt wird nicht verwendet, das Ende der Umwandlung wird durch eine Softwareschleife festgestellt.
5.5 Der Analog-Digital-Wandler ADC12
169
Das ADC12SC-Bit startet die Messung, der Sample Timer steuert die Erfassung: 4 ADC12CLKs. Die Steuerbits des ADC12 sind wie folgt gesetzt: • REFON = 0:
Interne Referenz wird nicht benutzt: Referenzen sind aus
• REF2_5V = 0:
Irrelevant, AVcc und AVss werden als Referenz verwendet
• MSC = 0:
Einfache Erfassung und Speicherung (single sample and hold)
• SHT0 = 0:
4 ADC-Clockzyklen für die Erfassung von A0
• SHT1 = 0:
Irrelevant, ADC12MCTL8…15 sind unbenutzt
• CONSEQ = 0:
Single Channel, Single Conversion Mode
• ADC12SSEL = 2:
MCLK wird als ADC12CLK verwendet
• ADC12DIV = 0:
Division des MCLK durch 1
• ISSH = 0:
Erfassungssignal nicht invertiert (ADC12SC-Bit)
• SHP = 1:
Der Sampling Timer wird für das SAMPCON-Signal benutzt
• SHS = 0:
Start durch das ADC12SC-Bit
• CSTARTADD = 0: Steuerung durch ADC12MEM0
ADC12MCTL0,
• SREF = 0:
VR+ = AVcc VR- = AVss
• INCH = 0:
Analogeingang A0 soll gemessen werden
Ergebnis
; Beschreibung: Das Programm liest einen einzelnen ; ADC12 Eingang (A0) einmal und speichert das ; Ergebnis in R4. ; rseg CODE ; ; Initialisierung des ADC12: ; Sampling Timer: 4 Zyklen, ADC12 arbeitet mit MLCK ; Single Channel Mode, ; VR+ = AVcc, VR- = AVss, Analogeingang A0 ; Messtart durch steigende Flanke des ADC12SC Bits ; SetupADC12 equ $ BIC #ENC,&ADC12CTL0 ; Aendern von Registern MOV #SHS_0+SHP+ADC12SSEL_2+CONSEQ_0,&ADC12CTL1 MOV.B #SREF_0+INCH_0,&ADC12MCTL0 ; Ref, A0 BIS.B #1,&P6SEL ; Port6.0: ADC input A0 ; ; Hauptschleife ;
in
170
Kapitel 5: Die Peripherie-Module
Mainloop MOV ... ; BIS TestEOC BIT
#WDTPW+WDTCNTCL,&WDTCTL ; Reset Watchdog ; Programm abarbeiten #ENC+ADC12SC+ADC12ON,&ADC12CTL0 ; A0 messen #1,&ADC12IFG ; Messung fertig? ; (ADC12IFG.0 = 1?) TestEOC ; Nein, warten &ADC12MEM0,R4 ; Ja, Resultat in R4 Mainloop ; ADC12IFG.0 ist 0
JZ MOV JMP end
Mehrmalige Umwandlung (Repeat Single Channel Mode). Ein einzelner Analogeingang Ax (A0 bis A11) wird ständig erfasst und umgewandelt. Das Resultat wird in das selektierte ADC Memory ADC12MEMx geschrieben. Es ist notwendig, das Messergebnis nach der Umwandlung zu lesen, da immer dasselbe ADC Memory benutzt wird. Beispiel: Das Softwarebeispiel zeigt eine Messsequenz, die denselben Analogeingang A2 fortlaufend misst. Die gemessenen Resultate werden für einen »gleitenden Mittelwert« verwendet (weighted summation). Der gleitende Mittelwert WS ist: :6 =
Q =
Ê 1
Q =
Wobei: N0 N-1
-
+ 1 -
-
1 -Q
-( Q +)
Der momentane ADC-Messwert Der letzte ADC-Messwert
• Timer_A: fSMCLK = 8 MHz, Continuous Mode, TACCR1 wird für das ADC12-Timing verwendet • Output Unit OUT1: Verändert sich (toggled) mit einer Wiederholungsrate von 20 kHz. Startet die Erfassung/Umwandlung • Zeitintervall zwischen zwei Umwandlungen: 100 ms Die Steuerbits des ADC12 sind wie folgt gesetzt: • REFON = 1:
die interne 2,5-V-Referenz wird eingeschaltet
• REF2_5V = 1:
die 2,5-V-Referenzspannung wird benutzt
• MSC = 0:
Sample-and-Hold vom OUT1-Signal
• SHT0 = 0:
Irrelevant, Timing vom OUT1-Signal
• SHT1 = 0:
Irrelevant, Timing vom OUT1-Signal
5.5 Der Analog-Digital-Wandler ADC12
• CONSEQ = 2:
Repeat Single Channel Mode
• ADC12SSEL = 3:
SMCLK ist ADC12CLK
• ADC12DIV = 7:
SMCLK/8 wird für ADC12CLK benutzt
• ISSH = 0:
Signal OUT1 nicht invertierend
• SHP = 0:
der Sampling Timer wird nicht benutzt
• SHS = 1:
Sample-and-Hold vom Timer_A OUT1-Bit
• CSTARTADD = 0: Steuerung durch ADC12MEM0
ADC12MCTL0,
• SREF = 1:
VR+ = Vref+ VR- = AVss
• INCH = 2:
Analogeingang A2 wird gemessen
Resultate
Abb. 5.26: Repeat Single Channel Mode SP_ORIG equ
WSSUM ;
START
0A00h
; Stack Start
rseg
DATA16_Z
; Beginn RAM
ds
2
; Gleitender Mittelwert
rseg
CODE
MOV CALL
#SP_ORIG,SP #INIT_SR
; Initialisiere SP ; Initialisiere Clocks
; ; Initialisiere ADC12: Repeat Single Channel Mode mit A2 ; VR+ = Vref+ (2,5V), VR- = AVss ; BIC #ENC,&ADC12CTL0 ; Aendern Control Bits BIS.B #04h,&P6SEL ; P6.2 wird A2 ; ; Sample time 50us, Referenz ein, Vref = 2.5V, ADC12 ein ; tsample = 50us, Multiple S&H aus ;
171
in
172
Kapitel 5: Die Peripherie-Module
MOV #REF2_5V+REFON+ADC12ON,&ADC12CTL0 ; ; ADC arbeitet mit SMCLK/8, Timer_A.Out1 steuert S&H ; Messung von A2, Resultat in ADC12MEM0 ; C1 equ CSTARTADD_0+SHS_1+ADC12DIV_7 ; Zu lang C2 equ ADC12SSEL_3+CONSEQ_2 MOV #C1+C2,&ADC12CTL1 ; ; Definition der Messsequenz VR+ = Vref+, VR- = AVss, A2 ; Interrupt fuer ADC12MCTL0, ADC12 ein, Start Umwandlung ; MOV.B #SREF_1+INCH_2,&ADC12MCTL0 BIS #1,&ADC12IE BIS #ENC+ADC12SC,&ADC12CTL0 ;------; Timer_A: SMCLK, Cont. Mode, SMCLK/1, TAR = 0, ; Interrupt ein ; Periode: 100us Inhalt TACCR1: 50us/125ns = 400 ; Timer_A Module 1: Interrupt ein, OUT1: Toggle Mode, ; Compare Mode ; MOV #TASSEL1+MC1+TACLR+TAIE,&TACTL MOV #50*1000/125,&TACCR1 MOV #OUTMOD_4+CCIE,&TACCTL1 ... ; Initialisierung weiter ; MAIN EINT ; GIE = 1 MOV #WDTPW+WDTCNTCL,&WDTCTL ; Reset Watchdog ... ; Hauptschleife BR #MAIN ;------------------------------------------------------; Timer_A Interrupt-Routine. TACCR1 steuert S&H von ADC12 ; INT_T_A3 equ $ ; Timer_A Interrupt ADD &TAIV,PC ; Intrpt Vector Reg. zu PC RETI ; 0: Kein anstehender Intrpt JMP TAC1 ; 2: TACCR1 RETI ; 4: TACCR2 RETI ; 6: TACCR3 (NA) RETI ; 8: TACCR4 (NA) RETI ; 10: TAIFG interrupt ; ; Timer_A Module 1 Interrupt: Der naechste Interrupt; zeitpunkt wird programmiert ; TAC1 ADD #50*1000/125,&TACCR1 ... ; Tasks jede 50us RETI
5.5 Der Analog-Digital-Wandler ADC12
173
;------------------------------------------------------; ADC12 Interrupt: Gleitender Mittelwert in WSSUM ; INT_ADC12 equ $ ADD &ADC12MEM0,WSSUM ; Addiere ADC Resultat RRA WSSUM ; auf WSSUM. Dann /2 RETI ; ;------------------------------------------------------INT_UNUSED RETI ; org 0FFEAh ; Interrupt Vektoren dw INT_T_A3 ; TIMER_A3 TACCRx, TAIFG dw INT_UNUSED ; TIMER_A3 TACCR0 dw INT_ADC12 ; ADC12 org 0FFFEh dw START ; PUC/WDT end
Umwandlungssequenz (Sequence of Channels Mode). Eine beliebige Folge von Analogeingängen (A0 bis A11) wird erfasst und umgewandelt. Die gemessenen Resultate werden in die programmierten ADC Memories ADC12MEMx geschrieben. Das erste Resultat wird in das ADC Memory, das in den CSTARTADD-Bits definiert ist, geschrieben. Die Sequenz stoppt, wenn bei einem der Steuerbytes ADC12MCTLx das EOS-Bit gesetzt ist. Normalerweise wird diese letzte Messung so programmiert, dass sie einen Interrupt auslöst (Bit ADC12IE.x im Register ADC12IE) und dadurch das Auslesen der Ergebnisse ermöglicht. Die Sequenz wird durch Software neu gestartet. Beispiel: Die MSP430F449 Quick Start Software enthält eine Subroutine MEAS_ADC12 die diesen Mode verwendet. Sie initialisert sich selbst und misst die Analogeingänge A0 bis A7 relativ zu AVcc. Die Ergebnisse stehen in den Registern ADC12MCTL0 bis ADC12MCTL7. Siehe dort.
Wiederholte Umwandlungssequenz (Repeat Sequence of Channels Mode). Eine beliebige Folge von Analogeingängen (A0 bis A11) wird erfasst und umgewandelt. Die gemessenen Resultate werden in die programmierten ADC Memories ADC12MEMx geschrieben. Das erste Resultat wird in das ADC Memory, das in den CSTARTADD-Bits definiert ist, geschrieben. Die Sequenz stoppt, wenn bei einem der Steuerbytes ADC12MCTLx das EOS-Bit gesetzt ist. Normalerweise wird diese letzte Messung so programmiert, dass sie einen Interrupt auslöst (Bit ADC12IE.x im Register ADC12IE) und dadurch das Auslesen der Ergebnisse ermöglicht. Das nächste Triggersignal startet die Sequenz automatisch aufs Neue.
174
Kapitel 5: Die Peripherie-Module
Beispiel: Fünf Eingangsspannungen des ADC12 werden gemessen. Zwei von ihnen benötigen nur eine kurze Erfassungszeit (8 ADC12CLKs), drei benötigen eine längere Erfassungszeit (128 ADC12CLKs). Die Einstellungen sind: • A0 gesteuert durch ADC12MCTL6. SHT0 (8 Zyklen). 1,5 V Referenz • A1 gesteuert durch ADC12MCTL7. SHT0 (8 Zyklen). 1,5 V Referenz • A2 gesteuert durch ADC12MCTL8. SHT1 (128 Zyklen). AVcc/AVss • A3 gesteuert durch ADC12MCTL9. SHT1 (128 Zyklen). AVcc/AVss • A4 gesteuert durch ADC12MCTL10. SHT1 (128 Zyklen). AVcc/AVss • Timer_A: fSMCLK = 3,0 MHz, Continuous Mode, TACCR1 wird für die Steuerung des ADC12 verwendet. • Output Unit OUT1: Wird mit einer Wiederholungsrate von 1 kHz gesetzt. Startet die Erfassung/Umwandlung mit dieser Frequenz. • Zeitintervall zwischen zwei Umwandlungen: 8 + 13 bzw. 128 + 13 MCLKZyklen. • Länge einer Sequenz: 2 (2 8 + 3 128 + 5 13) = 930 MCLK-Zyklen @ 310 ms. • Zeitintervall zwischen zwei Messsequenzen ist 1 ms (definiert durch Timer_A). Die Steuerbits des ADC12 sind wie folgt gesetzt: • REFON = 1:
die interne Referenz wird eingeschaltet
• REF2_5V = 0:
die interne 1,5-V-Referenzspannung wird benutzt
• MSC = 1:
Mehrfaches Sample-and-Hold (5 Messungen A0 bis A4)
• SHT0 = 1:
8 ADC12CLKs für Erfassung von A0 und A1
• SHT1 = 6:
128 ADC12CLKs für Erfassung von A2, A3 und A4
• CONSEQ = 3:
ADC12 Mode: Wiederholte Umwandlungssequenz
• ADC12SSEL = 2:
MCLK wird für den ADC12 Clock benutzt
• ADC12DIV = 1:
Division durch 2 für den ADC12 Clock (MCLK/2)
• ISSH = 1:
invertiertes Erfassungssignal (vom Timer_A.Out1)
• SHP = 1:
der Sampling Timer wird benutzt (8 bzw. 128 Zyklen)
• SHS = 1:
Sample-and-Hold Triggersignal kommt vom Timer_ A.Out1
• CSTARTADD = 6: Steuerung ab ADC12MEM6
ADC12MCTL6,
Ergebnisse
ab
• SREF = 1:
VR+ = Vref+ VR- = AVss für A0 und A1. Vref+ = 1,5 V
• SREF = 0:
VR+ = AVcc VR- = AVss für A2, A3 und A4
• INCH = 0…4:
Analogeingänge A0 bis A4 werden gemessen
5.5 Der Analog-Digital-Wandler ADC12 SP_ORIG equ
; RAMA0 RAMA1 RAMA2 RAMA3 RAMA4 ; ; START
0A00h
; Stack Start
rseg
DATA16_Z
; RAM
ds ds ds ds ds
2 2 2 2 2
; ADC Resultat A0 ; A1 ; A2 ; A3 ; A4
rseg
CODE
; Beginn Programm
MOV CALL
#SP_ORIG,SP #INIT_SR
; Initialisiere SP ; Initialisiere Clocks
; ; Initialisierung des ADC12 ; BIC #ENC,&ADC12CTL0 ; Aenderung ermoeglichen BIS.B #01Fh,&P6SEL ; ADC12 Eingaenge (A0…A4) ; ; Sample Time x1, Multiple Samples, int. Referenz ein ; ADC12 ein, Vref = 1,5 V und AVcc, tsample0 = 8 ADC12CLKs, ; tsample1 = 128 ADC12CLKs ; Multiple S&H, Overflow interrupts ein ; C1 equ SHT1_6+SHT0_1+MSC+REFON C2 equ ADC12ON+ADC12OVIE+ADC12TOVIE ; MOV #C1+C2,&ADC12CTL0 ; ; Sample Timer verwenden, ADC12 benutzt MCLK/2 ; Wiederholte Umwandlungssequenz fuer A0…A4, ; Start mit Steuerbyte ADC12MCTL6 ; Timer_A.Out1 triggert Messsequenz. ; C3 equ CSTARTADD_6+SHS_1+SHP+ISSH C4 equ ADC12DIV_1+ADC12SSEL_2+CONSEQ_3 ; MOV #C3+C4,&ADC12CTL1 ; ; Definition der Umwandlungssequenz ; MOV.B #SREF_1+INCH_0,&ADC12MCTL6 ; A0, 1.5V Vref MOV.B #SREF_1+INCH_1,&ADC12MCTL7 ; A1, 1.5V Vref MOV.B #SREF_0+INCH_2,&ADC12MCTL8 ; A2, AVcc/AVss MOV.B #SREF_0+INCH_3,&ADC12MCTL9 ; A3, AVcc/AVss MOV.B #EOS+SREF_0+INCH_4,&ADC12MCTL10 ; A4, " MOV #400h,&ADC12IE ; Interrupt bei ADC12MEM10 ; ; 17 ms warten, bis Referenzspannung Vref stabil ist
175
176
Kapitel 5: Die Peripherie-Module
; CALL BIS
#DELAY17ms #ENC,&ADC12CTL0 ; Umwandlung ermoeglichen
; ; Timer_A: SMCLK, Cont. Mode, SMCLK/2, TAR = 0 ; Interrupt aus, Periode: 1 ms, SMCLK = 3 MHz ; SMCLK/2, Output Unit 1: Ausgang TA1 zuruecksetzen ; MOV #TASSEL1+MC1+ID0+TACLR,&TACTL MOV #OUTMOD_5+CCIE,&TACCTL1 ; Reset Mode MOV #3000*1000/(2*1000),&TACCR1 ; Out1: 1ms BIS.B #4,&P1SEL ; TA1 an P1.2 BIS.B #4,&P1DIR ; P1.2 wird Ausgang ; ... ; Weitere Initialisierung ; MAIN EINT ; GIE = 1: Interrupts ein MOV #WDTPW+WDTCNTCL,&WDTCTL ; Reset Watchdog ... ; Hauptschleife BR #MAIN ; ;------------------------------------------------------; Timer_A Interrupt-Routine ; INT_T_A3 equ $ ; Timer_A Interrupt 1ms ADD &TAIV,PC ; Addiere TAIV auf PC RETI ; 0: Kein Interrupt anst. JMP TAC1 ; 2: TACCR1 RETI ; 4: TACCR2 RETI ; 6: (NA) RETI ; 8: (NA) RETI ; 10: TAIFG Interrupt ; ; TACCR1 Interrupt-Routine: TA1 setzen und Reset Mode ; Die nächste fallende Flanke an TA1 triggert ADC12 ; TAC1 ADD #3000*1000/(2*1000),&TACCR1 ; +1ms MOV #OUT,&TACCTL1 ; TA1 setzen MOV #OUTMOD_5+CCIE,&TACCTL1 ; Reset Mode ... ; Weiteres RETI ;-----------------------------------------------------; ADC12 Interrupt-Routine. Nur die Interrupts von ADC12OV, ; ADC12TOV und ADC12MEM10 sind aktiv ; INT_ADC12 equ $ ADD &ADC12IV,PC ; Addiere Vektor auf PC RETI ; 0: Kein Interrupt anst. JMP ADC12OV ; 2: Overflow Interrupt JMP ADC12TOV ; 4: Timing Overflow Intrpt
5.5 Der Analog-Digital-Wandler ADC12 RETI RETI RETI RETI RETI RETI RETI RETI RETI RETI
; ; ; ; ; ; ; ; ; ;
177
6: ADC12MEM0 Interrupt 8: ADC12MEM1 Interrupt 10: ADC12MEM2 Interrupt 12: ADC12MEM3 Interrupt 14: ADC12MEM4 Interrupt 16: ADC12MEM5 Interrupt 18: ADC12MEM6 Interrupt 20: ADC12MEM7 Interrupt 22: ADC12MEM8 Interrupt 24: ADC12MEM9 Interrupt
; ; ADC12MEM10 Interrupt: Fertig, Resultate speichern ; AMEM10 MOV &ADC12MEM6,RAMA0 ; 26: A0 Resultat MOV &ADC12MEM7,RAMA1 ; A1 Resultat MOV &ADC12MEM8,RAMA2 ; A2 Resultat MOV &ADC12MEM9,RAMA3 ; A3 Resultat MOV &ADC12MEM10,RAMA ; A4 Resultat RETI ; ADC12OV ... ; Overflow Interrupt RETI ; ADC12TOV ... ; Timing Overflow Intrpt RETI ; INT_UNUSED RETI ; org 0FFEAh ; Interrupt Vektoren dw INT_T_A3 ; TIMER_A3 TACCR1/TACCR2 dw INT_UNUSED ; TIMER_A3 TACCR0 dw INT_ADC12 ; ADC12 org 0FFFEh ; Reset Vektor dw START ; PUC/WDT end
Weitere Information: [1] Kapitel Analog-to-Digital Conversion Allgemeines zur Analog-Digitalwandlung, Rechenverfahren, Korrekturmethoden [2] Kapitel The 12-Bit ADC Unterschiede des 14-Bit ADC (MSP430C32x) zum ADC12, Korrektur, Erhöhung der Auflösung, Messmethoden, Softwarebeispiele [5] Kapitel ADC12
178
Kapitel 5: Die Peripherie-Module
5.6
Die digitalen Ein- und Ausgabeports
Die MSP430-Mikrocontroller haben bis zu 48 Ein- und Ausgabeports (MSP430F44x und MSP430F14x), die als digitale Ein- und Ausgänge oder aber für eine zweite – teilweise sogar dritte – Funktion, z.B. als Analog-DigitalWandlereingang, verwendet werden können. Die Umschaltung zwischen der Ein- und Ausgabe und der zweiten Funktion geschieht für den Port Pn.x mit dem zugehörigen Select Bit PnSEL.x. Zwei der vorhandenen Ein- und Ausgabeports – nämlich die Ports 1 und 2 – haben die Interrupt-Fähigkeit, d.h. bis zu 16 interruptfähige Eingänge sind möglich. Gemeinsam ist den Ein-/Ausgabeports: • Jedes Bit eines Ein- und Ausgabeports kann unabhängig von den anderen als Eingang, Ausgang, Interrupt-Eingang (Ports 1 und 2) oder für die Zweitfunktion verwendet werden. • Die Interrupt-Flags der Ports 1 und 2 müssen von der Interrupt-Routine zurückgesetzt werden: Sie werden nicht von der Interrupt-Hardware zurückgesetzt. • Ein- und Ausgabeports, die durch das PnSEL.x-Bit = 1 auf die Zusatzfunktion umgeschaltet sind, lösen für den zugehörigen Eingang keinen Interrupt mehr aus. • Ein-/Ausgabeports, die durch das PnSEL.x-Bit = 1 auf die Zusatzfunktion umgeschaltet sind und dabei als Ausgang arbeiten sollen, müssen das zugehörige PnDIR.x-Bit gesetzt haben (Ausnahme SPI). Dies ist besonders wichtig beim Timer_A, da dies bei der MSP430C33x-Familie nicht notwendig war: Das CAP-Bit des zugehörigen Timer_A Blocks schaltete die Richtung des Ein-/Ausgabeports automatisch um. • Das Ausgangsregister PnOUT behält seine Information, auch wenn der Port auf Eingang umgeschaltet wird. • Das Eingangsregister PnIN enthält immer die Information, die am zugehörigen Port anliegt; unabhängig von der Programmierung des PnDIR- oder PnSEL-Registers.
5.6.1
Die digitalen Ein- und Ausgabeports ohne Interrupt
Die Ports 3 bis 6 haben keine Interrupt-Fähigkeit: Sie können nur als Eingang, Ausgang oder für die Zusatzfunktion verwendet werden. Die folgende Abbildung zeigt den vereinfachten Aufbau eines Einzelbits eines solchen Ports.
5.6 Die digitalen Ein- und Ausgabeports
179
Abb. 5.27: Digitaler Ein- und Ausgabepin ohne Interrupt
Tabelle 5.9 zeigt die wichtigsten Eigenschaften der vier Hardware-Register. Die Konstante n hat die Werte: 3 n 6. Name
Funktion
Typ
Init. Status
Kommentar
PnIN
0: Pin hat 0-Info 1: Pin hat 1-Info
Nur lesbar
--
PnOUT
0: Ausgangsinfo 0 1: Ausgangsinfo 1 0: Eingang 1: Ausgang
Les- und schreibbar Les- und schreibbar
Unverändert
Zeigt den Stand des I/O-Pins, auch bei Schaltung als Ausgang Enthält Ausgangsinfo
0: I/O-Port 1: Zweitfunktion
Les- und schreibbar
Reset
PnDIR
PnSEL
Reset
Definiert Signalrichtung, auch bei Zweitfunktion Definiert Verwendung des Pins
Tabelle 5.9: Ein- und Ausgabeport-Register ohne Interrupt
Die nächste Abbildung zeigt die implementierten Register eines solchen Ports mit den Adressen.
180
Kapitel 5: Die Peripherie-Module
Abb. 5.28: Digitale Ein-/Ausgabeports ohne Interrupt
5.6.2
Die digitalen Ein- und Ausgabeports mit Interrupt
Die Ports 1 und 2 haben Interrupt-Fähigkeit: Sie können daher als Eingang (mit und ohne Interrupt), Ausgang oder für die Zusatzfunktion verwendet werden. Die folgende Abbildung zeigt den vereinfachten Aufbau eines Einzelbits des Ports 1.
Abb. 5.29: Digitaler Ein- und Ausgabeport mit Interrupt-Fähigkeit (P1.x)
5.6 Die digitalen Ein- und Ausgabeports
181
Tabelle 5.10 zeigt die wichtigsten Eigenschaften der sieben Hardware-Register. Die Konstante n hat die Werte: 1 n 2. Die einzelnen Bits sind völlig unabhängig voneinander. Name
Funktion
Typ
Init. Status Kommentar
PnIN
0: Pin hat 0-Info 1: Pin hat 1-Info
Nur lesbar
--
Les- und schreibbar Les- und schreibbar Les- und schreibbar Les- und schreibbar Les- und schreibbar Les- und schreibbar
Unverändert Änderungsrichtung, die Interrupt auslöst Reset Interrupt Enable Bit: Schaltet Interrupt ein/aus Reset Definiert Verwendung des Pins
PnOUT 0: Ausgangsinfo 0 1: Ausgangsinfo 1 PnDIR 0: Eingang 1: Ausgang PnIFG 0: Kein Interrupt 1: Interrupt anstehend PnIES 0: 0 1 1: 1 0 PnIE 0: Interrupt aus 1: Interrupt ein PnSEL 0: Port 1: Zweitfunktion
Zeigt den Stand des I/OPins, bei Schaltung als Ausgang von PnOUT Unverändert Ausgangsregister: Enthält Ausgangsinfo Reset Definiert Signalrichtung, auch bei Zweitfunktion Reset Interrupt Flags
Tabelle 5.10: Ein- und Ausgabeport-Register mit Interrupt
Die nächste Abbildung zeigt die implementierten Register eines solchen Ports mit den Adressen. Die jeweils sieben 8-Bit-Register haben folgende Bedeutung:
Abb. 5.30: Digitaler Ein-und Ausgabeport mit Interrupt
182
Kapitel 5: Die Peripherie-Module
5.6.3
Zusatzfunktionen der Ein- und Ausgabeports
Fast alle Ein- und Ausgabeports des MSP430 haben eine Zusatzfunktion, die mit dem zugehörigen PnSEL.x-Bit eingeschaltet wird. Die genaue Zuordnung – die stark vom MSP430-Typen abhängt – kann aus der Pinbelegung im Datenblatt ersehen werden. So bedeutet z.B. die Angabe beim MSP430F44x für den Pin 67 »P3.4/TB3«: P3SEL.4
P3DIR.4
Pin 67-Funktion
0 0
0 1
1
0
1
1
Eingabeport: Info am Pin 67 (Eingang) in Bit P3IN.4 lesbar Ausgabeport: Info in Bit P3OUT.4 am Pin 67 (Ausgang) und in Bit P3IN.4 lesbar Moduleingang: Info am Pin 67 (Eingang) am Eingang TBCCI3A des Timer_B Modulausgang: Info in Bit OUT des Registers TBCCTL3 am Pin 67 (Ausgang der Output Unit) und in Bit P3IN.4 lesbar
Tabelle 5.11: Funktion des MSP430F449-Pins 67 P3.4/TB3
Die Zusatzfunktion eines Pins kann aus dem Datenblatt ersehen werden. Für jeden Ein- und Ausgabeport ist eine Tabelle am Schluss des Datenblattes angegeben, das die obige Information enthält. Eine Ausnahme bildet die Flüssigkristallanzeige: Wird ein Ein- und Ausgabeport für die Anzeige selektiert (im LCDCTL-Register), dann schaltet diese Selektion alle anderen Funktionen dieses Pins ab.
5.6.4
Elektrische Eigenschaften der Ein- und Ausgabeports
Die nächste Abbildung zeigt die stark nichtlineare Ausgangscharakteristik der MSP430F44x-Ausgangsports. Sie wird für Vcc = 2,2 V und für Vcc = 3,0 V gezeigt. Es ist leicht zu ersehen, wie die Ausgangsimpedanz von ungefähr 50 W bei 5 mA Strom auf ungefähr 500 W bei 25 mA ansteigt.
5.7 Die USARTs
183
Abb. 5.31: Ausgangscharakteristik eines digitalen Ports
Weitere Information: [1] Kapitel I/O Port Usage [5] Kapitel Digital I/O Configuration Kapitel MSP430F449 Quick Start Software Initialisierung und Interrupt-Beispiele werden gezeigt
5.7
Die USARTs
Die MSP430F44x-Familie hat zwei identische USARTs (Universal Synchronous/Asynchronous Receive/Transmit) auf dem Chip: USART0 und USART1. Beide können – unabhängig voneinander – in zwei völlig verschiedenen Betriebsarten verwendet werden: • Als UART (Universal Asynchronous Receive/Transmit), also als ein serielles, asynchrones Interface für das RS232-Protokoll. • Als SPI (Serial Peripheral Interface), das ein synchrones Interface darstellt. Die USART-Peripherie-Module haben je sechs (!) Kontroll-Bytes und je ein Empfangs- und ein Senderegister. Die Möglichkeiten, die sich dadurch bieten sind unübersehbar: Es empfiehlt sich, die Softwareroutinen, die in der MSP430F449 Quick Start Software enthalten sind, zu verwenden und sie nur den Anforderungen entsprechend abzuändern (Baudrate, Parity, Datenlänge, Protokoll, Anzahl Stoppbits). Dies umso mehr, als bei der USART sogar die Reihenfolge der Befehle bei der Initialisierung eine große Rolle spielt.
184
Kapitel 5: Die Peripherie-Module
5.7.1
Die USART als UART
Abbildung 5.32 zeigt die USART als RS232-Interface. Das Bit SYNC im Control Register UCTLx muss dabei 0 sein.
Abb. 5.32: USART als UART (RS232)
Beim Betrieb als UART kann auch der ACLK als Clock-Frequenz verwendet werden: Das bedeutet, dass die UART auch im LPM3 weiterarbeiten kann. Dies ist durch den speziellen Baudraten-Generator möglich: Er besitzt einen Modulator, der die einzelnen Datenbits so ausgibt, dass der Zeitfehler minimal bleibt. Das Macro CALC_UART in der MSP430F449 Quick Start Software berechnet die optimalen Werte für das Modulator-Register UMCTLx und die beiden
5.7 Die USARTs
185
Baudraten-Register UBR1x und UBR0x (diese bilden zusammen ein 16-BitRegister). Der Modulator benutzt die 8 Bits (Beginn beim LSB für das Startbit) für die Korrektur der Bitlänge: • Modulator-Bit = 0: Die Clock-Frequenz wird durch den Wert in den Baudraten-Registern UBR1x und UBR0x geteilt. • Modulator-Bit = 1: Die Clock-Frequenz wird durch den um Eins erhöhten Wert in den Baudraten-Registern UBR1x und UBR0x geteilt. Durch die richtige Auswahl der Korrekturbits wird der sich ergebende BitlängenFehler minimiert. Beispiel: USART1 arbeitet als UART mit 2400 Baud, ACLK = 32.768 Hz, acht Datenbits, Parity, keinem Adressbit, zwei Stoppbits. Der theoretische Teilerwert ist 32.768/2400 = 13,65333, was natürlich nicht eingestellt werden kann. Das Macro CALC_UART errechnet einen Teilerwert 13 und 6Dh für den Modulator. Die beiden Werte werden in die Register UMCTL1, UBR11 und UBR01 geschrieben. Das Macro wird dazu wie folgt aufgerufen: CALC_UART
32768,2400,&UMCTL1,&UBR11,&UBR01
Abbildung 5.33 zeigt drei verschiedene Lösungen: • Das obere Signal ist das korrekte, mit einer Bitlänge von 13,65333 ACLKZyklen. • Das mittlere Signal ist eine grobe Näherung mit 14 ACLK-Zyklen Bitlänge: Der Fehler ist 1/3 der Länge eines Bits. • Das untere Signal ist das durch den Modulator korrigierte Signal. Fünf der 8 Modulator-Bits sind »1« (durch 6Dh), d.h. die mittlere Bitlänge ist 13 + 5/8 = 13,625 was eine sehr gute Näherung an den richtigen Wert ergibt. Der Fehler ist nur noch –0,2 %.
186
Kapitel 5: Die Peripherie-Module
Abb. 5.33: Funktion des Modulators
5.7.2
Die USART als Serial Peripheral Interface (SPI)
Abbildung 5.34 zeigt die USART als Serial Peripheral Interface. Das Bit SYNC im Control Register UCTLx muss dabei 1 sein. Die Haupteigenschaften der SPI sind: • Dreileiter- und Vierleiterbetrieb möglich • Master und Slave Mode programmierbar • Separate Schieberegister für Senden und Empfang • Doppelte Pufferung für Senden und Empfang • Sieben und acht Bit Datenlänge möglich • Clock-Polarität und Clock-Phase programmierbar
5.7 Die USARTs
187
Abb. 5.34: USART als SPI (Master Mode)
In der MSP430F449 Quick Start Software sind eine Empfangs- und eine Senderoutine für den SPI-Betrieb enthalten. Die durch die Initialisierung festgelegten Eigenschaften sind (sie können einfach verändert werden): • Dreileiterbetrieb: Das Signal STE wird nicht verwendet • Baudrate: 200 kBaud • SMCLK als Clock-Signal • Master Mode • Datenlänge 8 Bit • Betrieb ohne Interrupt
188
Kapitel 5: Die Peripherie-Module
Auch hier kann das Macro CALC_UART für die Initialisierung der Register verwendet werden. Es sind Beispiele für den Aufruf der beiden Routinen vorhanden. Weitere Information: [1] Kapitel The USART Module RS232-Programmbeispiele für Active Mode und LPM3, mit ACLK und MCLK als Clock-Frequenzen [5] Kapitel USART Peripheral Interface, UART Mode Detaillierte Hardware-Beschreibung [5] Kapitel USART Peripheral Interface, SPI Mode Detaillierte Hardware-Beschreibung Kapitel Beschreibung der Quick Start Software, USART0 in SPI Mode, USART1 in UART Mode Erklärung der Initialisierung und des Programmablaufs
5.8
Der Flüssigkristallanzeigen-Treiber (LCD)
Der Flüssigkristallanzeigen-Treiber der MSP430F4xx-Familie kann statische, 2fach-MUX, 3fach-MUX und 4fach-MUX Flüssigkristall-Anzeigen (LCDs) treiben. Für die – dank wesentlich verbesserter Flüssigkeiten – inzwischen häufigsten 4fach-MUX LCDs wird eine Softwareroutine gezeigt. Die LCD-Hardware des MSP430 kann jede Kombination von Common/SelectLeitungen für ein gegebenes Segment treiben. Es ist nicht nötig, die im Beispiel gezeigte Anordnung zu verwenden.
5.8 Der Flüssigkristallanzeigen-Treiber (LCD)
189
Abb. 5.35: Blockschaltbild des Flüssigkristallanzeigen-Treibers
5.8.1
Das LCD Control Register
Das LCD Control Register LCDCTL enthält alle Kontrollbits, die für die Steuerung des Flüssigkristallanzeigen-Treibers notwendig sind. Die Funktion der Bits ist in der Tabelle 5.12 erklärt.
Abb. 5.36: Das LCD Control Register
190
Kapitel 5: Die Peripherie-Module
LCDON
Enable Bit für den LCD-Treiber 0: 1: Nicht verwendet Blink Bit. Das ganze LCD kann 0: (ohne Änderung des LCD-Spei- 1: chers) ein- und ausgeschaltet werden Auswahl der LCD-Multiplex0: Methode 1: 2: 3: Auswahl der aktiven Segment- 0: leitungen. Nicht ausgewählte 1: Ports behalten ihre Funktion als 2: Ein- und Ausgabeport bzw. die 3: Zweitfunktion 4: 5: 6: 7:
-LCDSON
LCDMUX0 LCDMUX1
LCDP0 LCDP1 LCDP2
LCD und Rx-Speisung aus LCD-Treiber aktiv LCD-Segmente aus LCD-Segmente ein
Statisch 2fach-MUX 3fach-MUX 4fach-MUX Nur Ein- und Ausgabeports S0…S15 aktiv S0…S19 S0…S23 S0…S27 S0…S31 S0…S35 S0…S39 alle aktiv
Tabelle 5.12: Funktion der Bits im LCD Control Register
Beispiel: Ein 12-stelliges LCD (4fach-MUX) soll angeschlossen werden. Die Initialisierung sieht dann so aus: LCDINI ;
5.8.2
equ
LCDP1+LCDP0+LCDMX1+LCDMX0+LCDSON+LCDON
MOV.B
#LCDINI,&LCDCTL
; 12 Stellen, 4MUX, ein
Das LCD Memory
Das LCD Memory besteht aus zwanzig Bytes an den Adressen 091h bis 0A4h. Die Bits des LCD Memory haben keinen definierten Zustand nach POR oder PUC: Sie müssen initialisiert werden. Anmerkung: Diese zwanzig Bytes sind unabhängig vom normalen RAM und können, falls keine Anzeige verwendet wird, als RAM-Erweiterung verwendet werden. Jedes Bit des LCD-Memory steuert eine definierte Common/Select-Kombination. Zum Beispiel steuern die beiden Adressen 091h und 092h die sechzehn Common/Select-Kombinationen, die in Abbildung 5.37 gezeigt sind. Die grauen Felder sind die jeweils verwendeten Bits für die Segmente der Stelle 0.
5.8 Der Flüssigkristallanzeigen-Treiber (LCD)
191
Abb. 5.37: LCD Memory in Abhängigkeit von der Multiplexmethode
Beispiel: In die Stelle 0 des LCD (4fach-MUX) soll die Zahl »1« geschrieben werden. MOV.B
5.8.3
#b+c,&091h
; Segmente c und b ein ("1")
Software für eine 4-fach-MUX Flüssigkristallanzeige
Ein Beispiel für einen einfachen 4fach-MUX-LCD-Treiber ist in der MSP430F449 Quick Start Software enthalten: Die Subroutine LCDOUT. Sie schreibt die BCD-Information des sechs Byte großen RAM-Buffers RES in das LCD. Abb. 5.38 zeigt die verwendete LCD-Hardware mit den zugehörigen Select-Leitungen, den LCD-Buffer-Adressen und dem RAM-Buffer. Der Dezimalpunkt und das Minuszeichen werden vom Hauptprogramm eingesetzt.
Abb. 5.38: LCD-Anzeige für den LCD-Anzeigentreiber
Abbildung 5.39 zeigt die verwendete LCD-Konfiguration. Für eine andere Common/Select-Konfiguration werden die Definitionen in der MSP430F449
192
Kapitel 5: Die Peripherie-Module
Quick Start Software geändert. Soll Segment »a« an COM3/ungerade angeschlossen sein, dann wird: a
equ
Com3*Sn1
;[] Common3/ungerade
Abb. 5.39: Common- und Select-Konfiguration des Beispiels
Abbildung 5.40 zeigt die externen Bauelemente für die verschiedenen Multiplexarten. Die Werte für die Widerstände Rx sind normalerweise 1 MW. Für große Anzeigen mit hoher Segmentkapazität muss dieser Wert reduziert werden, bis saubere Signalformen an den Select- und Common-Leitungen vorhanden sind.
Abb. 5.40: Externe Beschaltung
5.9 Der Basic Timer1
193
Mehr Information: [5] Kapitel Liquid Crystal Display Drive [11] The MSP430 Liquid Crystal Display Module Softwarebeispiele für alle Multiplexmethoden (x-fach-MUX)
5.9
Der Basic Timer1
Der Basic Timer1 wird normalerweise als Zeitbasis für den MSP430 verwendet: Er wird so programmiert, dass er das Background-Programm oder den gewählten Low Power Mode in regelmäßigen Zeitintervallen unterbricht. Durch das Zählen der Interrupts können eine Uhr und ein Kalender realisiert werden.
Abb. 5.41: Der Basic Timer1
Die Funktion der Steuerbits im Basic Timer1 Control Register kann aus der Abbildung 5.42 ersehen werden.
Abb. 5.42: Das Basic Timer1 Control Register
194
Kapitel 5: Die Peripherie-Module
Die folgende Tabelle zeigt alle möglichen Interrupt-Frequenzen in Abhängigkeit von den Kontrollbits im Byte BTCTL (Adresse 040h). Die Frequenzen für SSEL1 = 1, DIV = 0 sind für MCLK = 1,048 MHz gezeigt, alle anderen für ACLK = 32,768 kHz: IP2
IP1
IP0
SSEL = 0 DIV = 0
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
16348 Hz 8192 Hz 4096 Hz 2048 Hz 1024 Hz 512 Hz 256 Hz 128 Hz
SSEL = 1
DIV = 1 64 Hz 32 Hz 16 Hz 8 Hz 4 Hz 2 Hz 1 Hz 0,5 Hz
DIV = 0 (524288 Hz) (262144 Hz) (131072 Hz) 65536 Hz) 32768 Hz 16348 Hz 8192 Hz 4096 Hz
DIV = 1 64 Hz 32 Hz 16 Hz 8 Hz 4 Hz 2 Hz 1 Hz 0,5 Hz
Tabelle 5.13: Basic Timer1 Interrupt-Frequenzen
Die Interrupt-Frequenzen in Klammern können nicht für Interrupt-Routinen verwendet werden, die Frequenzen sind zu hoch.
5.9.1
Der Basic Timer1 als Zeitbasis
Die normale Anwendung des Basic Timer1: Er läuft kontinuierlich mit der in der Initialisierung programmierten Interrupt-Frequenz und weckt damit die CPU regelmäßig aus dem LPM3. Diese Anwendung ist in der MSP430F449 Quick Start Software gezeigt. Siehe dort bei »Interrupt Handler«.
5.9.2
Der Basic Timer1 als 16-Bit-Timer
Die beiden 8-Bit-Register BTCNT1 und BTCNT2 können zu einem einfachen 16-Bit-Timer, der den ACLK zählt, zusammengeschaltet werden. Dieser 16-BitWert kann für Zeitmessungen verwendet werden: Die Differenz zweier Auslesungen wird verwendet. Das folgende Softwarebeispiel liefert immer einen richtigen Wert, da es die LSBs zweimal liest und vergleicht. Sind die Werte unterschiedlich, dann wird noch einmal gelesen.
BT10
MOV.B ... MOV.B MOV.B CMP.B
#BTDIV+xx,&BTCTL ; Init. BT: 16-Bit Laenge &BTCNT1,R5 &BTCNT2,R6 &BTCNT1,R5
; Basic Timer1 LSBs 00yy ; MSBs 00xx ; LSBs noch 00yy?
5.10 Der Comparator_A JNE SWPB ADD
BT10 R6 R5,R6
195
; Nein, nochmal lesen ; MSBs in oberes Byte xx00 ; Ergebnis in R6: xxyy
Falls der Zeitpunkt des ersten Auslesens wichtig ist, kann die folgende Routine verwendet werden. Der 16-Bit-Wert wird gelesen und korrigiert, falls ein Überlauf des unteren Bytes zwischen den beiden Auslesungen stattfand. ; Auslesen von Basic Timer1 als 16-Bit Timer ; MOV.B &BTCNT1,R5 ; LSBs lesen 00yy MOV.B &BTCNT2,R6 ; MSBs lesen 00xx CMP.B R5,&BTCNT1 ; BTCNT1 noch >= R5? JHS BT10 ; Ja, kein Ueberlauf ; ; Ueberlauf der LSBs von 0FFh auf 0 waehrend des Lesens ; MSBs sind jetzt um 1 zu gross ; MOV.B &BTCNT2,R6 ; MSBs nochmal lesen 00xx DEC.B R6 ; MSB – 1 ist richtig BT10 SWPB R6 ; MSBs in oberes Byte xx00 ADD R5,R6 ; 16-bit Wert in R6: xxyy
Die »MSP430F449 Quick Start Software« enthält Subroutinen für die Uhrzeit und das Datum, sowie eine Interrupt-Routine, welche die Zeitbasis dafür liefert. Mehr Information: [1] Kapitel The Basic Timer Wechsel der Frequenz, Kompensation des Temperaturkoeffizienten des Quarzes [5] Kapitel Basic Timer1
5.10
Der Comparator_A
Der Comparator_A ist für präzise Vergleiche und Messungen von analogen Signalen gedacht. Abbildung 5.43 zeigt die vielseitige Hardware des Moduls.
196
Kapitel 5: Die Peripherie-Module
Abb. 5.43: Die Hardware des Comparator_A
5.10.1 Eigenschaften und Funktion des Comparator_A Die Hardware erlaubt alle Kombinationen für Vergleiche von Spannungen. Das Bit CAOUT (CACTL2.0) enthält das Resultat des Vergleichs: • Vergleich zweier externer Eingänge CA0 und CA1 • Vergleich eines externen Eingangs mit 0,25 Vcc oder 0,5 Vcc • Vergleich eines externen Eingangs mit einer externen Referenzspannung Weitere Eigenschaften des Comparator_A sind: • Sehr geringe Eingangsströme an den Eingängen CA0 and CA1 • Der Comparator_A kann abgeschaltet werden, um minimalen Stromverbrauch zu erreichen. (CAON = 0) • Die interne Referenzspannung kann an die Eingänge CA0 und CA1 geschaltet werden: Die externe Hardware kann sie benützen. • Das Register CAPD erlaubt es, die digitalen Eingangsschaltungen des Port1 abzuschalten: Dies verhindert Eingangsströme, die von Eingangsspannungen, abweichend von Vcc oder Vss, verursacht werden. • Der Eingangsumschalter CAEX erlaubt offset-freie Messungen. Durch die Umschaltung des Comparator-Ausgangs CAOUT kann dieselbe Software für beide Stellungen des Umschalters verwendet werden.
5.10 Der Comparator_A
197
• Ein analoges Filter kann an den Ausgang CAOUT geschaltet werden, um auch bei sich langsam ändernden Eingangsspannungen Stabilität zu erreichen. • Interrupt ist möglich für die steigende und die fallende Flanke von CAOUT. Die genannten Eigenschaften erlauben einfache Spannungs-, Strom-, Widerstands- und Kapazitätsmessungen. Die Hauptfunktion des Comparator_A ist die Feststellung, welche von zwei Spannungen, UCA0 und UCA1 die größere ist. Das Bit CAOUT zeigt dies an: )DOOV8&$ ! 8&$GDQQ &$287
VRQVW &$287
Die beiden Spannungen UCA0 und UCA1 können externe oder interne Spannungen sein, jede Kombination ist möglich. Siehe Abbildung 5.43.
5.10.2 Die Comparator_A Control Register Die drei Control Register CACTL1, CACTL2 und CAPD enthalten alle Kontrollbits, die für die Steuerung des Comparator_A notwendig sind.
Abb. 5.44: Die Comparator_A Control Register
CAIFG
Interrupt Flag
CAIE
Interrupt Enable Flag
0: 1: 0: 1:
Kein Interrupt anstehend Interrupt anstehend Interrupt ausgeschaltet Interrupt eingeschaltet
198
Kapitel 5: Die Peripherie-Module
CAIES
Interrupt Edge Select Bit
CAON CAREF0 CAREF1
Ein-/Ausschalter des Moduls Auswahl der Referenzspannung
CARSEL
Referenzumschalter
CAEX
Eingangsumschalter
0: Steigende Flanke von CAOUT setzt CAIFG 1: Fallende Flanke von CAOUT setzt CAIFG 0: Comparator_A aus (minimaler Strom) 1: Comparator_A ein 0: Interne Referenz aus (externe möglich) 1: Uref = 0,25 Vcc ein 2: Uref = 0,5 Vcc ein 3: Uref = Spannung der Referenzdiode 0: Uref an CA0-Eingang 1: Uref an CA1-Eingang 0: CA0 an + Eingang, CA1 an – Eingang 1: CA1 an + Eingang, CA0 an – Eingang
Tabelle 5.14: Steuerbits CACTL1 des Comparator_A
CAOUT
Comparator-Ausgang
CAF
Schalter für Ausgangsfilter
P2CA0
Eingangsschalter CA0
P2CA1
Eingangsschalter CA1
CACTL2x
0: UCA0 < UCA1 1: UCA0 > UCA1 0: Filter ausgeschaltet 1: Filter eingeschaltet 0: Externes Signal CA0 durchgeschaltet 1: Externes Signal CA0 abgeschaltet 0: Externes Signal CA1 durchgeschaltet 1: Externes Signal CA1 abgeschaltet Keine Funktion, Bits können als Flags verwendet werden
Tabelle 5.15: Steuerbits CACTL2 des Comparator_A
CAPDx CAPD6 CAPD7
Eingangsbuffer-Schalter P1.x Eingangsbuffer-Schalter CA0 Eingangsbuffer-Schalter CA1
0: 1: 0: 1: 0: 1:
Eingangsbuffer P1.x ein Eingangsbuffer P1.x aus (min. Eingangsstrom) Eingangsbuffer P1.6 ein Eingangsbuffer P1.6 aus (min. Eingangsstrom) Eingangsbuffer P1.7 ein Eingangsbuffer P1.7 aus (min. Eingangsstrom)
Tabelle 5.16: Steuerbits CAPD des Comparator_A (MSP430F449)
5.10.3 Schnelle Datenerfassung Oft ist eine sehr schnelle analoge Messung von sequenziellen Eingangsspannungen notwendig. Die folgende Messsequenz ist die schnellste, die mit dem Com-
5.10 Der Comparator_A
199
parator_A möglich ist. Nach n Vergleichen kann ein Majoritätstest für eine Entscheidung gemacht werden. Abbildung 5.45 zeigt die verwendete Hardware. Die Software vergleicht die vom Strom Imeas erzeugte Spannung an Rm mit 0,25 Vcc: Spannungsabfälle die größer sind, setzen CAOUT, kleinere setzen CAOUT zurück. Nach n Vergleichen wird die Anzahl von »1« überprüft.
Abb. 5.45: Schaltung für die schnelle Datenerfassung ; Schneller Test fuer den Eingang des Comparator_A ; MOV.B #CARSEL+CAREF1+CAON,&CACTL1 ; Mode def. MOV.B #P2CA0,&CACTL2 ; CA0 an nichtinv. Eingang BIS.B #CAPD7+CAPD6,&CAPD ; Eingangsbuffer aus MOV #CACTL2,R15 ; Pointer auf Reg. CACTL2 ... MOV.B @R15,R5 ; CAOUT (CACTL2.0) in R5 ADD.B @R15,R5 ; Naechstes Sample addieren ... ; Naechstes Sample addieren ADD.B @R15,R5 ; Sample n addieren ; ; Test ob CAOUT mehr als n/2 mal "1" war ; SUB #n*P2CA0,R5 ; Resultat korrigieren CMP.B #(n/2+1),R5 ; R5 – (n/2+1) JGE POS ; Mehr Samples waren 1 ... ; Mehr Samples waren 0
oder eine noch schnellere Entscheidung:
200
Kapitel 5: Die Peripherie-Module
; Test ob CAOUT mehr als n/2 mal "1" war ; CMP.B #n*P2CA0+(n/2+1),R5 ;P2CA0 = 1 JHS POS ; Mehr Samples waren 1 ... ; Mehr Samples waren 0
Mit einer MCLK-Frequenz von 8 MHz, erlaubt diese Methode 20 Vergleiche innerhalb von 5 µs. 1/8 MHz × 2 Zyklen × 20 Vergleiche = 5,0 µs Mehr Information: [1] Kapitel The Comparator_A [2] Kapitel The Comparator_A Weitere Anwendungen des Comparator_A, wie schnelle Datenerfassung, Widerstands-, Kapazitäts- und Spannungsmessung, digitale Motorsteuerung (DMC), Messbrücken und externe Verwendung der Referenzspannung [5] Comparator_A Weitere Anwendungen wie Offsetkompensation, Temperatur-, und Spannungsmessung
5.11
Das SVS-Modul, Reset und die Brownout-Erkennung
Diese drei zusammenwirkenden Module überwachen die Speisespannung Vcc und steuern die Rücksetzung des Programms. Die nächste Abbildung zeigt eine vereinfachte Darstellung.
Abb. 5.46: SVS-Modul, Reset und Brownout-Erkennung
5.11 Das SVS-Modul, Reset und die Brownout-Erkennung
201
5.11.1 Das Spannungsüberwachungs-Modul (SVS) Das Supply Voltage Supervisor Modul zeigt an, ob die Speisespannung Vcc kleiner als eine programmierbare Spannung V(SVS_IT-) ist oder nicht. Es kann dann auch ein Reset (POR) ausgelöst werden (PORON = 1). Die BrownoutFunktion schaltet das SVS-Modul aus.
Abb. 5.47: Das SVS-Modul
Die Steuerung des SVS-Moduls geschieht mit dem Supply Voltage Supervisor Control Register.
Abb. 5.48: Supply Voltage Supervisor Control Register
202
Kapitel 5: Die Peripherie-Module
SVSFG SVSOP SVSON PORON VLD
SVS Flag (speichernd)
0: Vcc > V(SVS_IT-) 1: Vcc < V(SVS_IT-) Ausgang des Comparators 0: Vcc > V(SVS_IT-) oder SVS-Modul aus 1: Vcc < V(SVS_IT-) Statusanzeige des Moduls 0: SVS-Modul aus 1: SVS-Modul ein POR Enable Bit 0: Kein POR falls Vcc < V(SVS_IT-) 1: POR falls Vcc < V(SVS_IT-) Auswahl der Referenzspan- 0: SVS-Modul aus nung V(SVS_IT-) mit vier Bits 1: V(SVS_IT-) = 1,9 V 2 – 13: V(SVS_IT-) = 2,1…3,5 V (DV 0,1 V) 14: V(SVS_IT-) = 3,7 V 15: Externe Referenz an P6.7/A7 (nom. 1,2 V)
Tabelle 5.17: Steuerbits des SVS-Moduls
In der MSP430F449 Quick Start Software ist ein Beispiel für die Verwendung enthalten. Es wird überprüft, ob die Speisespannung Vcc oberhalb von 1,8 V ist oder nicht. Abhängig vom verwendeten Low Power Mode ist das SVS-Modul immer ein oder nicht: • LPM3: Das SVS-Modul wird für die Messung eingeschaltet und dann 160 ms (Zeit td(SVSon) aus Spec) gewartet, um eine sichere Funktion zu gewährleisten. • Sonst: Das SVS-Modul ist immer eingeschaltet, es kann sofort gemessen werden.
5.11.2 Die Reset-Funktion Zwei verschiedene Signale sind vorhanden, die einen Reset auslösen: • Power-On-Reset (POR). Dieses Signal wird ausgelöst wenn: • Die Speisespannung Vcc eingeschaltet wird • Ein »0«-Signal am RST/NMI-Pin anliegt und der Reset Mode gewählt ist • Die Speisespannung unter die im eingeschalteten SVS-Modul eingestellte Referenzspannung fällt • Die Brownout-Erkennung anspricht. • Power-Up-Clear (PUC) . Dieses Signal wird ausgelöst wenn: • Ein POR-Signal ausgelöst wird • Der Watchdog im Watchdog Mode überläuft
5.12 Der Timer_A
203
• Das Watchdog Control Register mit dem falschen Passwort beschrieben wird • Ein Flash Control Register mit dem falschen Passwort beschrieben wird.
5.11.3 Die Brownout-Erkennung Die Brownout-Erkennung setzt den MSP430 durch ein POR-Signal zurück, wenn die Speisespannung Vcc unter einen Mindestwert V(B_IT-) absinkt, bzw. ein- oder ausgeschaltet wird. Erreicht Vcc die Mindestspannung V(B_IT-) wieder, dann wird noch eine Verzögerungszeit td(BOR) abgewartet, die – abhängig von der Anstiegszeit dVcc/dt – zwischen 5 ms und 2 ms liegen kann. Es ist keine Beeinflussung der Funktion möglich. Mehr Information: [5] Kapitel System Resets, Interrupts and Operating Modes [6] Tabelle POR/brownout reset (BOR),SVS
5.12
Der Timer_A
Der 16-Bit-Timer_A (Timer_A3) ist ein komplexer, orthogonaler Timer, der aus dem 16-Bit-Timer Register und drei Capture/Compare Registern besteht. Die drei Capture/Compare Register sind identisch aufgebaut, aber eines davon, TACCR0 wird noch für zusätzliche Funktionen verwendet. Anwendungen des Timer_A3 können sein: • Erzeugen von Zeitrastern, Frequenzen, Hochfrequenzmodulation und Ausgangssignalen • Ansteuerung von TRIACs für Elektromotoren • Zeit-, Perioden-, Frequenz- und Pulsweitenmessung • Erzeugen von DTMF- und Biphase-Signalen • Erzeugen von pulsweitenmodulierten Signalen (PWM) mit den Output Units
5.12.1 Die Timer_A-Hardware Der Timer_A besitzt eine modulare Struktur. Jedes Capture/Compare Register TACCRx hat ein eigenes Control Register TACCTLx und auch das Timer Register TAR wird von einem eigenen Control Register TACTL gesteuert.
204
Kapitel 5: Die Peripherie-Module
Abb. 5.49: Der 16-Bit-Timer_A3
Alle Timer_A Register haben zwei gemeinsame Eigenschaften: • Alle Register – mit Ausnahme des Interrupt Vector Register TAIV – können gelesen und geschrieben werden. • Alle Register haben eine Wortstruktur und sollten nur mit Wortbefehlen angesprochen werden.
Der Timer Block Der Timer Block besteht aus folgenden Teilen (siehe Abbildung 5.50): • Eingangs-Multiplexer: Auswahl des Timer-Clocks (TACLK, ACLK, SMCLK, INCLK = .not.TACLK ) • Input Divider: Auswahl des Untersetzungsfaktors für den Timer-Clock (1, 2, 4, 8)
5.12 Der Timer_A
205
• Timer Register TAR: Ein 16-Bit-Zähler • Count Mode: Auswahl der Betriebsart des Timer_A (Stop, Continuous, Up, Up/Down) • Timer Control Register TACTL: Enthält alle Steuerbits des Timer Blocks • Timer Vector Register TAIV: Enthält einen Vektor, der den Interrupt mit der höchsten Priorität anzeigt • Interrupt Logic: Steuerung der vier Timer_A Interrupts
Abb. 5.50: Der Timer Block
Das Timer Register TAR Das Timer Register TAR (Adresse 170h) ist das Hauptregister des Timer_A. Der Timer-Clock – ausgewählt aus vier verschiedenen Quellen – wird durch den Input Divider geteilt (Faktoren sind 1, 2, 4 oder 8) und mit diesem 16-BitRegister gezählt. Der Inhalt des Timer Register wird über den 16-Bit-Timer Bus an alle Capture/Compare Blocks gegeben (CCRx in Abbildung 5.49). Siehe Abbildung 5.50. Das Timer Register wird mit der positiven Flanke des Timer Clock inkrementiert. Die CCIFG-Flags und der TAIFG-Flag werden ebenfalls mit der positiven Flanke gesetzt, wenn die programmierte Bedingung erfüllt ist. Die maximale Auflösung des Timer_A ist 1/fMCLKmax. Das bedeutet für die momentane maximale Frequenz von 8 MHz: 125 ns Auflösung. Die 16 Bits des Timer Register können auf zwei Arten gelöscht werden: CLR BIS
&TAR #CLR,&TACTL
; Nur 0 -> TAR ; 0 -> TAR, Inp. Div. + Dir.
206
Kapitel 5: Die Peripherie-Module
Die zweite Art löscht nicht nur das Timer Register, sondern auch den Input Divider und setzt die Zählrichtung des Timer Register auf vorwärts.
Das Timer_A Control Register TACTL Das Timer Control Register TACTL enthält alle Steuerbits, die das Timer Register TAR und seine Funktion steuern. Die Steuerbits werden mit dem PORSignal zurückgesetzt, das PUC-Signal beeinflusst sie nicht. Das bedeutet, dass ihre Information erhalten bleibt, wenn der Watchdog überläuft.
Abb. 5.51: Das Timer Control Register
Die Namen in Klammern geben die vom IAR-Assembler verwendeten Symbole an.
TAIFG TAIE CLR (TACLR) -Mode Control (MC_x)
Input Divider (ID_x)
Input Select (TASSEL_x)
--
Interrupt Flag Interrupt Enable Bit
1: TAR erreichte Inhalt 0 0: TAIFG Interrupt ist aus 1: TAIFG Interrupt ist ein Timer Clear Bit (autom. 1: TAR und Input Divider löschen, ZählRücksetzen) richtung auf vorwärts Unbenutzt Auswahl der Betriebsart 0: Stop Mode des Timer_A 1: Up Mode 2: Continuous Mode 3: Up/Down Mode Auswahl der Clock0: Clock ungeteilt Untersetzung 1: Clock/2 2: Clock/4 3: Clock/8 Auswahl des Clocks 0: TACLK (extern P1.5/TACLK/ACLK) 1: ACLK 2: SMCLK 3: TACLK invertiert (.not.TACLK) Unbenutzt
Tabelle 5.18: Steuerbits des Timer Control Register TACTL
5.12 Der Timer_A
207
Das Timer Vector Register TAIV Dieses 16-Bit-Register enthält einen geradzahligen Vektor, der von 0 (kein Interrupt anstehend) über 2 (TACCR1 Interrupt) bis 10 (Timer-Überlauf-Interrupt TAIFG) reicht.
Abb. 5.52: Das Timer Vector Register
Falls mehr als ein Interrupt ansteht, wird der Vektor des Interrupts mit der höchsten Priorität in das TAIV Register geladen (TACCR1 mit höchster, TAIFG mit niedrigster Priorität). Das Timer Vector Register erlaubt eine sehr schnelle Reaktion auf einen Interrupt und wird wie folgt verwendet: TA3_HAN
HTIMOV
ADD RETI JMP JMP RETI RETI ... org dw dw
&TAIV,PC HCCR1 HCCR2
0FFEAh TA3_HAN TA0_HAN
; ; ; ; ; ; ;
INTRPT mit max. Prioritaet 0: Kein INTRPT anstehend 2: CCIFG1 Interrupt 4: CCIFG2 Interrupt 6: Nicht vorhanden 8: Nicht vorhanden 10: TAIFG Interrupt
; Interrupt-Vektor ; Interrupt-Routine Block 1,2 ; Interrupt-Routine Block 0
Durch das Addieren des TAIV Registers wird der Interrupt-Flag, der zum Inhalt des TAIV Registers gehört, automatisch zurückgesetzt. Danach definiert der Interrupt-Flag mit der nächstniedrigeren Priorität den Inhalt des TAIV Registers. Anmerkung: Der Capture/Compare Block 0 hat einen eigenen Interrupt-Vektor (Adresse 0FFECh).
Die Capture/Compare Blocks Abbildung 5.53 zeigt einen Capture/Compare Register Block (Erfassungs- und Vergleichs-Register) ohne die dazugehörige Output Unit. Die anderen – mit Ausnahme des Capture/Compare Register Block 0 – sind gleich aufgebaut: Der TACCR0 Block hat noch zusätzliche Funktionen. Siehe Kapitel »Das PeriodenRegister TACCR0«.
208
Kapitel 5: Die Peripherie-Module
Abb. 5.53: Capture/Compare Register Block ohne Output Unit
Die Capture/Compare Register TACCRx Diese Register können als Compare Register oder als Capture Register verwendet werden.
Abb. 5.54: Das Capture/Compare Register
Compare Mode im Continuous Mode: Das Register TACCRx enthält die Zeitinformation für den nächsten Interrupt, also den Inhalt den das TAR Register dann hat. In der Interrupt-Routine wird die Zeitinformation für den nächsten Interrupt vorbereitet: Der Wert Dn – der dem Zeitintervall Dt vom letzten Interrupt zum nächsten entspricht – wird auf TACCRx addiert. Siehe das Beispiel im Kapitel »Der Continuous Mode«. Die Output Unit kann verwendet werden, um zeitgenaue Ausgangssignale an TAx zu generieren, bei denen die Interrupt-Latenzzeit keine Rolle spielt. Compare Mode mit dem Up Mode oder Up/Down Mode: Das Capture/ Compare Register 0 wird bei diesen beiden Betriebsarten als Periodenregister verwendet. Das Register TACCRx enthält die Pulsweite des Ausgangssignals an TAx. Wenn keine Änderung des Registers TACCRx notwendig ist, wird das Signal ohne Einwirkung der CPU automatisch wiederholt.
5.12 Der Timer_A
209
Capture Mode im Continuous Mode: Ein Register TACCRx, das im Capture Mode verwendet wird, kopiert das Timer Register TAR exakt zu der Zeit, zu der die Erfassungsbedingung erfüllt war. Das erlaubt sehr genaue Zeitmessungen, unabhängig von Interrupt-Latenzzeiten. Capture Mode im Up Mode: Die Methode ist die gleiche wie für den Continuous Mode beschrieben. Der Up Mode benutzt allerdings nur einen Teil des Registers TAR. Falls das zu messende Zeitintervall länger als der Inhalt des Periodenregisters TACCR0 ist, muss eine RAM-Erweiterung verwendet werden, die mit dem TAIFG-Interrupt inkrementiert wird. Capture Mode with Up/Down Mode: Die Methode ist die gleiche wie für den Continuous Mode beschrieben. Der Up/Down Mode benutzt allerdings nur einen Teil des Registers TAR und dieser Teil zählt vorwärts und rückwärts. Die Richtung der Zählung muss also auch noch berücksichtigt werden. Falls das zu messende Zeitintervall länger als der doppelte Inhalt des Perioden-Registers TACCR0 ist, muss eine RAM-Erweiterung verwendet werden, die mit dem TAIFG- und dem CCIFG0-Interrupt inkrementiert wird. Das LSB der RAMErweiterung zeigt die Zählrichtung an.
Die Capture/Compare Control Register TACCTLx Jeder Capture/Compare Block hat ein eigenes Control Register TACCTLx. Abbildung 5.55 zeigt ein solches Control Register: Es ist für alle gleich. Das Bit CAP (TACCTLx.8) entscheidet, ob der Capture/Compare Block im Capture Mode oder im Compare Mode arbeitet.
Abb. 5.55: Das Capture/Compare Control Register
Die Namen in Klammern geben die vom IAR-Assembler verwendeten Symbole an.
CCIFG
Interrupt Flag Compare Mode: (wird automatisch zurück- 1: TAR war gleich TACCRx gesetzt) Capture Mode: 1: Bedingung in Capture Mode Bits war erfüllt: TAR in TACCRx
210
Kapitel 5: Die Peripherie-Module
COV
Capture Overflow Flag
TAx Information im Output Mode 0 CCI Capture/Compare Input Signal CCIE Interrupt Enable Bit für CCIFG OUTMOD Auswahl der Betriebsart (OUTMOD_x) der Output Unit EQUx/EQU0 Funktion Siehe Kapitel »Die Output Units«
Compare Mode: Immer 0 Capture Mode: 1: Bedingung zum 2. Mal erfüllt (Überlauf)
OUT
CAP
Auswahl der Betriebsart
-SCCI
Unbenutzt Selected Capture/ Compare Input
SCS
Synchronisation des Capture Signals durch Timer Clock Auswahl des Eingangssignals im Capture Mode
Input Select (CCIS_x)
Capture Mode Auswahl der Erfassungs(CM_x) bedingung im Capture Mode
Das selektierte Eingangssignal (CCIxA, CCIxB, Vcc oder GND) kann gelesen werden 0: Interrupt aus 1: Interrupt ein (falls GIE = 1) 0: Das OUT-Bit wird verwendet 1: Set 2: Toggle/Reset 3: Set/Reset 4: Toggle 5: Reset 6: Toggle/Set 7: Reset/Set 0: Compare Mode (Vergleich) 1: Capture Mode (Erfassung) Wird als 0 gelesen Das selektierte Eingangssignal (CCIxA, CCIxB, Vcc oder GND) wird mit dem positiven EQUx-Signal gespeichert und kann gelesen werden 0: Asynchrone Erfassung 1: Synchrone Erfassung 0: Eingang CCIxA 1: Eingang CCIxB 2: GND 3: Vcc 0: Ausgeschaltet 1: Positive Flanke speichert TAR in TACCRx 2: Negative Flanke speichert TAR in TACCRx 3: Beide Flanken speichern TAR in TACCRx
Tabelle 5.19: Steuerbits des Capture/Compare Control Register TACCTLx
Das Perioden-Register TACCR0 Die Verwendung des Registers TACCR0 hängt von der verwendeten Betriebsart ab.
5.12 Der Timer_A
211
Continuous Mode: Hier ist das TACCR0 ein Capture/Compare Register wie die anderen beiden TACCR1 und TACCR2. Up Mode oder Up/Down Mode: In diesen beiden Betriebsarten arbeitet das TACCR0 als Perioden-Register: Es definiert die Länge der Periode des Timers. Wenn das Timer Register TAR den Wert des TACCR0 erreicht (EQU0 = 1), dann geschieht Folgendes: • Up Mode: Das Timer Register TAR wird mit dem nächsten Timer Clock gelöscht und beginnt die Zählung vom Wert 0 an. Diese Folge wiederholt sich automatisch, ohne dass die CPU etwas tun muss. Siehe Kapitel »Die Betriebsarten des Timer_A«. • Up/Down Mode: Das Timer Register TAR wechselt die Zählrichtung und beginnt mit dem nächsten Timer Clock mit der Abwärtszählung. Wenn der Wert 0 erreicht wird, zählt das Timer Register wieder aufwärts bis der Wert in TACCR0 wieder erreicht ist. Diese Folge wiederholt sich automatisch. Siehe Kapitel »Die Betriebsarten des Timer_A«. Anmerkungen: Im Up Mode oder im Up/Down Mode ist das EQU0-Signal »1«, falls das Timer Register TAR gleich oder größer als das Perioden-Register TACCR0 ist. Letzteres ist bei den anderen TACCRx nicht der Fall.
Der Wert 0 ist kein gültiger Wert für das Perioden-Register: Der Timer_A blockiert.
5.12.2 Die Betriebsarten des Timer_A Der Timer_A hat vier unterschiedliche Betriebsarten: • Continuous Mode: Die normale Betriebsart, ausgenommen schnelle PWMErzeugung ist notwendig. • Up Mode: Wird für schnelle, asymmetrische PWM-Erzeugung verwendet. • Up/Down Mode: Wird für schnelle, symmetrische PWM-Erzeugung verwendet. • Stop Mode: Der Timer_A ist angehalten, alle Steuerungsbits behalten ihre Information. Einer der Vorteile des Timer_A ist die absolute Synchronität aller Vorgänge und Ausgangssignale. Dies kommt durch das eine Timer Register TAR, das alle Zeiten steuert. Diese Synchronität ist in vielen Anwendungen sehr wichtig, am meisten wohl bei der Steuerung von Elektromotoren mit DMC.
212
Kapitel 5: Die Peripherie-Module
Die Gleichungen auf den nächsten Seiten benutzen folgende Abkürzungen: Dt
Zeitintervall zwischen zwei gleichen Interrupts
[s]
t
Zeit, z.B. die Periode eines PWM-Signals
[s]
tpw
Pulsweite eines PWM-Signals
[s]
Dn
Wert, der zu einem TACCRx Register addiert wird
[1]
n
Zahl, z.B. Inhalt eines TACCRx Registers
[1]
k
Vorteilerkonstante im Input Divider (1, 2, 4 oder 8)
[1]
fCLK
Eingangsfrequenz des Input Divider
[Hz]
nCCR0
Inhalt des Perioden-Registers TACCR0
[1]
Der Continuous Mode Dies ist die normale Betriebsart des Timer_A, da für die Erzeugung von PWMSignalen der Timer_B besser geeignet ist. Diese Betriebsart erlaubt bis zu drei voneinander unabhängige, synchrone Zeitintervalle. Das Capture/Compare Register TACCR0 arbeitet dabei genauso wie die beiden anderen TACCRx Register. Anmerkung: Das EQU0-Signal hat denselben Einfluss auf die Steuerlogik (Mode Control Logic) wie bei den anderen Betriebsarten. Das bedeutet, dass nur die Modes »Set« (OUTMOD_1), »Reset« (OUTMOD_5) und »Toggle« (OUTMOD_4) verwendet werden können, wenn TACCR1 und TACCR2 von TACCR0 unabhängige Zeiten generieren sollen. Abbildung 5.56 zeigt zwei unabhängige Zeiten, die von den Capture/Compare Registern TACCR0 und TACCR1 erzeugt werden. Der Inhalt der TACCRx Register wird durch Software in den Interrupt-Routinen verändert. Das geschieht durch Addieren des berechneten Wertes Dn. Der Wert Dn repräsentiert das Zeitintervall Dt ausgedrückt durch Timer-Clock-Zyklen. Die Software wird in dem Beispiel weiter unten gezeigt. Die Formeln für ein gegebenes Zeitintervall Dt beziehungsweise die dazugehörige Anzahl Timer-Zyklen Dn sind: DW =
DW I&/. DQ N DQ = I&/. N
Die Grenze für die Größe Dn (ohne RAM-Erweiterung) ist: DQ
= MIN? JLO RET2 ; Ja, ok ;
5.12 Der Timer_A COV2 RET2
MOV.B BIC RETI
#1,ERR ; Nein, Error-Byte 16 Bit, Synchronisation)
5.12 Der Timer_A
217
Der Up/Down Mode Der Up/Down Mode wird für die Erzeugung von symmetrischen PWM-Signalen benutzt. Der Vorteil dieser Methode ist, dass ein Minimum an Harmonischen durch das Schalten erzeugt wird. Diese PWM-Signale sind absolut synchron, da für alle dasselbe Timer Register TAR benutzt wird. Die halbe Periode der PWMFrequenz wird in das Perioden-Register TACCR0 geladen und die halbe Pulsweite für die beiden Ausgänge TA1 und TA2 wird in die Capture/Compare Register TACCR1 und TACCR2 geladen. Die Formeln für eine gegebene Periode t bzw. den entsprechenden Wert in Zyklen nCCR0 sind (nCCR0 < 65.536): W =
W I&/. Q&&5 N Q&&5 = I&/. N
Die Formeln für eine gegebene Pulsweite tpw und den entsprechenden Wert in Zyklen n sind (n < 65.536): WSZ =
WSZ I&/. QN Q = I&/. N
Solange keine Änderungen am Perioden-Register oder den Capture/Compare Registern gemacht werden, wiederholen sich die PWM-Signale ohne dass die CPU etwas tun muss. Die Anzahl Timer Clocks zwischen zwei gleichen Inhalten (bei gleicher Zählrichtung) des Timer Registers TAR ist (2 nCCR0).
Abb. 5.58: Up/Down Mode: Erzeugung von zwei Zeitintervallen
Compare Mode: Wenn das Register TAR den Inhalt des Capture/Compare Register TACCRx erreicht (EQUx = 1), dann wird die Output Unit x modifiziert: Abhängig vom gewählten Output Mode, der im Control Register TACCTLx (Bits OUTMOD) definiert ist, wird sie geändert (toggled), gesetzt, zurückgesetzt
218
Kapitel 5: Die Peripherie-Module
oder nicht geändert. Dies gilt für das Erreichen des Inhalts von TACCRx bei beiden Zählrichtungen! Falls der Interrupt für den Capture/Compare Block x eingeschaltet ist (CCIE = 1), wird auch noch ein Interrupt ausgelöst (falls GIE = 1). Wenn das Register TAR den Inhalt des Perioden-Register TACCR0 erreicht (EQU0 = 1), ändert es seine Zählrichtung auf abwärts und die Output Unit x wird wieder modifiziert: Abhängig vom gewählten Output Mode, wird sie gesetzt, zurückgesetzt oder nicht geändert. Falls der Interrupt für das Erreichen des Capture/Compare Block 0 eingeschaltet ist (CCIE = 1), wird auch noch ein Interrupt ausgelöst (falls GIE = 1). Wenn das Timer Register beim Abwärtszählen wieder den Wert 0 erreicht, beginnt mit dem nächsten Timer Clock wieder das Aufwärtszählen. Falls der Interrupt für das Erreichen von 0 eingeschaltet ist (Bit TAIE = 1), wird auch noch ein Interrupt ausgelöst (falls GIE = 1). Siehe Abbildung 5.58. Softwarebeispiele für den Up/Down Mode sind in [1] Kapitel »The Timer_A«, »Software Examples for the Up/Down Mode« enthalten (Motorsteuerung DMC, TRIAC-Ansteuerung, Verwendung des Capture Mode, Synchronisation).
Der Stop Mode Der Stop Mode stoppt den Timer_A ohne eines seiner Control Register zu ändern. Dadurch kann der Timer genau dort weiterarbeiten, wo er angehalten wurde. Beispiel: Der Timer_A, der im Up/Down Mode arbeitet wird gestoppt. Nach einer gewissen Zeit soll er genau dort weiterarbeiten, wo er angehalten wurde (einschließlich der Zählrichtung). BIC ... BIS
#MC_3,&TACTL #MC_3,&TACTL
; Timer_A anhalten ; Weiter ohne Timer_A ; Im Up/Down Mode weiter
5.12.3 Die Output Units Jeder Capture/Compare Block des Timer_A besitzt eine Output Unit, die den zugehörigen Pulsausgang TAx steuert. Acht Output Modes sind implementiert, sie werden unabhängig für jeden Capture/Compare Block durch die drei Output Mode Bits (OUTMOD) im Register TACCTLx ausgewählt. Tabelle 5.20 zeigt die acht Output Modes und ihre Wirkung auf den Pulsausgang TAx, wobei die rechte Spalte das Verhalten des Ausgangs TAx beim gleichzeitigen Auftreten der Signale EQUx und EQU0 zeigt.
5.12 Der Timer_A
Output Mode
Name
0
Output only
1 2 3 4 5 6 7
Set Toggle/Reset Set/Reset Toggle Reset Toggle/Set Reset/Set
Verhalten bei EQUx = 1
Bit OUTx (TACCTLx.2) steuert TAx Setzt TAx Ändert TAx Setzt TAx Ändert TAx Setzt TAx zurück Ändert TAx Setzt TAx zurück
Verhalten bei EQU0 = 1 Kein Einfluss
219
Verhalten bei EQUx .and. EQU0 = 1 Kein Einfluss
-Setzt TAx Setzt TAx zurück Setzt TAx Setzt TAx zurück Setzt TAx -Ändert TAx -Setzt TAx zurück Setzt TAx Setzt TAx zurück Setzt TAx Setzt TAx zurück
Tabelle 5.20: Die Output Modes der Output Units
Anmerkung: Die Abhängigkeit der Output Units vom EQU0-Signal beschränkt die Output Unit 0 beim Up Mode und beim Up/Down Mode auf die Output Modes Set, Toggle, Reset und Output.
Abb. 5.59: Hardware der Output Units
;IRRHIV3YXTYX1SHI[ÆLVIRHHIW4VSKVEQQEFPEYJWKIÆRHIVX[IVHIRQYWWr ^&ZSR7IXEYJ6IWIXrHERRMWXHEWSLRIJÆPWGLPMGLIâRHIVYRKHIW%YWKERKW 8%\Q¶KPMGL[IRR[IRMKWXIRWIMRIWHIVHVIM39813(&MXWHIR>YWXERH{m FIMFILÆPX ;IRR HEW RMGLX HIV *EPP MWX OERR 8%\ J°V IMRI OYV^I >IMX IMRIR JEP WGLIR>YWXERHLEFIR%FFMPHYRK^IMKXHMIYRWMGLIVIR;IGLWIPHIW3YXTYX 1SHI%PPI;IGLWIP°FIVHIR3YXTYX1SHIWMRHWMGLIV
220
Kapitel 5: Die Peripherie-Module
Abb. 5.60: Unsichere Änderungen des Output Mode
9QWMGLIVIâRHIVYRKIR^YLEFIR ; Ein sicherer Wechsel des Output Mode ueber Output ; Mode 7. Beispiel: Output Mode x nach 4 aendern ; BIS #OUTMOD_7,&TACCTL1 ; Output Mode 7 BIC #OUTMOD_3,&TACCTL1 ; Output Mode 4 bleibt
;IRRMRHIV-RMXMEPMWMIVYRKIMRFIWXMQQXIV>YWXERHHIW%YWKERKW8%\RSX[IR HMKMWXOERRHEWQMXHIQ3YXTYX1SHIKIQEGLX[IVHIR Beispiel: TA1 (P1.2/TA1) soll mit dem Output Mode 4 (Toggle) betrieben werden. Am Programmbeginn soll TA1 gesetzt sein. ; P1.2 als Ausgang und TA1 initialisieren. TA1 setzen ; MOV #OUT,&TACCTL1 ; Output Mode = 0, TA1 = 1 BIS.B #4,&P1OUT ; P1.2/TA1 wird Ausgang BIS.B #4,&P1SEL ; P1.2/TA1 wird TA1 BIS #OUTMOD_4,&TACCTL1 ; Start toggle mode
Mehr Information: [1] Kapitel The Timer_A [5] Timer_A Um die zahlreichen Beispiele, die in [1] enthalten sind, auch für die MSP430F4xx- und die MSP430F1xx-Familie verwenden zu können, werden die folgenden Schritte empfohlen: • Ersatz der Assembleranweisungen des TI-ASM430-Assemblers durch diejenigen des IAR-Assemblers. Eine Anleitung dazu ist in [8] MSPFET430P140 Flash Emulation Tool User’s Guide enthalten. • Ersatz der verwendeten Namen der Hardware Register des Timer_A durch die Namen des IAR-Assemblers. Diese Namen sind in den Dateien »msp430x43x.h« und »msp430x44x.h« enthalten. Diese Dateien befinden sich im Ordner C:\Program Files\IAR Systems\….
5.13 Der Timer_B
221
• Die vom Timer_A verwendeten Ein- und Ausgänge (CCIxA, CCIxB, TAx) müssen von den bei der MSP430C3xx-Familie verwendeten Ports auf die bei der MSP430F4xx-Familie verwendeten Ports umgeändert werden. • Wenn eine Output Unit verwendet wird, muss der zugehörige Port ^& 48% als Ausgang geschaltet werden (das ist bei der MSP430C3xxFamilie nicht notwendig). ; P1.1, P1.2, P2.0 als TA0, TA1, TA2 Ausgaenge schalten ; BIS.B #6,&P1OUT ; P1.1/TA0 P1.2/TA1 Ausgang BIS.B #1,&P2OUT ; P2.0/TA2 wird TA2
5.13
Der Timer_B
Der Timer_B ist ein erweiterter Timer_A. Er verhält sich wie der Timer_A, wenn seine zusätzlichen Funktionen nicht verwendet werden. Dieses Kapitel zeigt daher in erster Linie die Unterschiede der beiden Timer. Es ist als eine Ergänzung des Kapitels »Der Timer_A« gedacht, die neuen Funktionen werden erklärt. Die vielen Softwarebeispiele in [1] können auch mit dem Timer_B verwendet werden. Die neuen Buffer Register (Capture Latches) des Timer_B erlauben ein wesentlich einfacheres Ändern der Capture/Compare Register, da die Synchronisierung mit der Pulserzeugung – wie beim Timer_A notwendig – nicht mehr nötig ist.
5.13.1 Die Timer_B-Hardware Den Timer_B gibt es momentan in zwei Versionen: • Timer_B3 mit drei Capture/Compare Blocks (MSP430F43x) • Timer_B7 mit sieben Capture/Compare Blocks (MSP430F44x). Siehe Abb. 5.61.
222
Kapitel 5: Die Peripherie-Module
Abb. 5.61: Der 16-Bit-Timer_B7
5.13.2 Vergleich von Timer_B und Timer_A Verwendet man die erweiterten Möglichkeiten des Timer_B nicht, so verhält er sich wie ein Timer_A.
5.13 Der Timer_B
223
• Capture Mode: Kein Unterschied zum Timer_A. Die Softwarebeispiele in [1] können ohne Programmänderungen – außer denjenigen, die wegen des IARAssemblers notwendig sind – verwendet werden. Siehe Kapitel »Modifizierung von Timer_A Software für den Timer_B«. • Compare Mode: Die Capture Latches des Timer_B machen die Synchronisierung bei der Änderung der Capture/Compare Register überflüssig. • Das Bit SCCI im Register TACCTLx ist nicht mehr vorhanden. Die Formeln für die Größen Dt, t, tpw, Dn, n, k, fCLK und nCCR0 sind die gleichen, wie die beim Timer_A verwendeten. Siehe dort.
Vergrössertes Interrupt Vector Register TBIV Das Interrupt Vector Register TBIV ist vergrößert, um die sieben Vektoren (statt der fünf beim Timer_A) aufnehmen zu können. Dadurch ändert sich der Vektor des TBIFG-Interrupts von 10 (beim TAIFG) auf 14. Die Interrupt-Routine des Timer_B7 folgt. Sie ist auch für den Timer_B3 gültig: Die JMP-Befehle für die Vektoren 6 bis 12 werden beim TimerB3 durch RETI ersetzt. ; Interrupt-Routine Timer_B Capture/Compare Block 0. ; TB0_HND ... ; Software einfuegen RETI ; ; Interrupt-Routinen Timer_B C/C Blocks 1 bis 6. ; TB7_HND ADD &TBIV,PC ; TBIV zum PC addieren RETI ; Kein Interrupt anstehend JMP TIMMOD1 ; C/C Block 1: Vektor 2 JMP TIMMOD2 ; C/C Block 2: Vektor 4 JMP TIMMOD3 ; C/C Block 3: Vektor 6 JMP TIMMOD4 ; C/C Block 4: Vektor 8 JMP TIMMOD5 ; C/C Block 5: Vektor 10 JMP TIMMOD6 ; C/C Block 6: Vektor 12 ; TIMOV equ $ ; Timer Overflow: Vektor 14 ... ; Software einfuegen RETI org dw dw
0FFF8h TB7_HND TB0_HND
; Interrupt-Vektoren ; C/C Blocks 1 bis 6 ; C/C Block 0
224
Kapitel 5: Die Peripherie-Module
Die Capture Latches TBCLx Der Timer_B besitzt für jeden Capture/Compare Block ein Capture Latch, das die Modifizierung der Capture/Compare Register TBCCR0 bis TBCCR6 zu jeder Zeit erlaubt: Die geänderten Werte werden in die zugehörigen Capture Latches zum nächsten geeigneten Zeitpunkt übernommen. Dies geschieht voll synchronisiert zum Timer_B. Diese Eigenschaft spart Zeit und Programmplatz in PWM-Applikationen, da kein Interrupt für die Synchronisierung mit der Pulserzeugung notwendig ist. Die Steuerung der Capture Latches geschieht über die CLLD- und die TBCLGRP-Bits. Die Capture Latches können nicht von der Software angesprochen werden.
Gruppierung der Capture/Compare Blocks Die Capture Latches können einzeln, oder in Gruppen von zwei, drei oder sechs Capture Latches modifiziert werden. Die gemeinsame Übernahme einer Gruppe in die Capture Latches findet erst statt, wenn alle Capture/Compare Register einer Gruppe verändert sind. Wenn eine Gruppierung verwendet wird, dann bestimmen die CLLD-Bits des TBCCRx-Registers mit dem niedrigsten x die Übernahmebedingung der ganzen Gruppe. Siehe Tabelle 5.21. Diese Eigenschaft erlaubt den gleichzeitigen Wechsel der zusammengehörigen Capture/Compare Registers, obwohl sie nur nacheinander verändert werden können. Abbildung 5.62 zeigt das Timer_B Control Register TBCTL mit den neuen Funktionen in den Bits TBCTL.11 bis 14.
Abb. 5.62: Timer_B Control Register TBCTL
Die Namen in Klammern sind die vom IAR-Assembler verwendeten. Group TBCL
Gruppierung
Register mit gültigen CLLD-Bits
0: Individuell (TBCLGRP_0)
Keine Gruppierung. Individuelles TBCCR1 + TBCCR2 +TBCCR3 Laden der Capture/Compare + TBCCR4 + TBCCR5 + Register TBCCR6
5.13 Der Timer_B
225
Group TBCL
Gruppierung
Register mit gültigen CLLD-Bits
1: Drei Gruppen (TBCLGRP_1)
TBCL1 + TBCL2, TBCL3 + TBCL4, TBCL5 + TBCL6, TBCL1 + TBCL2 + TBCL3, TBCL4 + TBCL5 + TBCL6, TBCL1 + TBCL2 + TBCL3 + + TBCL4 + TBCL5 + TBCL6
TBCCR1 TBCCR3 TBCCR5 TBCCR1 TBCCR4 TBCCR1
2: Zwei Gruppen (TBCLGRP_2) 3: Eine Gruppe (TBCLGRP_3)
Tabelle 5.21: Funktion der Gruppierungsbits Group TBCL
Anmerkung: Bei Verwendung der Gruppierung können verschiedene Arten des Ladens der Capture Latches verwendet werden. Bei drei Gruppen (TBCLGRP_1) können z.B. TBCCR1 + TBCCR2 den Wert CLLD_ 1 verwenden (Übernahme wenn TBR auf 0 zählt, Festlegung durch die CLLD-Bits in Register TBCCTL1) und TBCCR3 + TBCCR4 können CLLD_3 verwenden (Übernahme wenn TBR den Wert in TBCL3 respektive TBCL4 erreicht, Festlegung durch die CLLD-Bits in Register TBCCTL3).
Programmierbare Länge des Timer Registers TBR Die Länge des TBR-Registers kann mit den Counter Length Bits eingestellt werden. Dadurch kann man dem durch den TAIFG-Flag ausgelösten Interrupt ein besser angepasstes Zeitintervall geben. Es sind die Längen 16 Bit, 12 Bit, 10 und 8 Bit möglich, die Definition erfolgt durch die Bits Counter Length in TBCTL. Siehe Abbildung 5.62.
Verschiedene Update Modes für die Capture Latches Das Verändern der Capture/Compare Register kann zu jeder Zeit gemacht werden. Die Übernahme in die Capture Latches erfolgt immer synchronisiert mit dem Timer_B. Vier verschiedene Update Modes sind möglich. Siehe Tabelle 5.22. Dadurch sind keine Zwischenspeicher im RAM, wie beim Timer_A, notwendig. Der neue Wert wird direkt in das Capture/Compare Register geschrieben und in das Capture Latch TBCLx übernommen, wie es in den CLLD-Bits definiert ist.
226
Kapitel 5: Die Peripherie-Module
Abb. 5.63: Das Capture/Compare Control Register TBCCTLx
Anmerkung: Die Übernahme in die Capture Latches wird nur gemacht, wenn das TBR-Register durch Zählen den angegebenen Wert erreicht: Ein Laden des TBRRegisters führt NICHT zu einer Übernahme in die Capture Latches.
CLLD Bits
Update Mode
0: Sofort (CLLD_0)
Sofortige Übernahme in das TBCLx-Register.
1 (CLLD_1) 2 (CLLD_2)
3 (CLLD_3)
Kommentar
Das Capture/Compare Register TBCCRx wird sofort in das Capture Latch TBCLx übernommen. Keine Synchronisation! Übernahme, wenn TBR den Das Capture/Compare Register TBCCRx Stand 0 (durch Zählen) wird in das Capture Latch TBCLx übererreicht. nommen, wenn TBR auf Null zählt. Up/Down Mode: Das Capture/Compare Register TBCCRx Übernahme, wenn TBR TBCL0 wird in das Capture Latch TBCLx überoder 0 (durch Zählen) erreicht. nommen, wenn TBR den Wert in TBCL0 oder Null erreicht. Zwei Übernahmen in einer vollen TBR-Periode! Continuous Mode oder Up Wie bei CLLD = 1 Mode: Wie bei CLLD = 1. Übernahme, wenn TBR TBCLx Das Capture/Compare Register TBCCRx (durch Zählen) erreicht. wird in das Capture Latch TBCLx übernommen, wenn TBR den Wert in TBCLx erreicht.
Tabelle 5.22: Funktion der Update Mode Bits CLLD
5.13.3 Arbeitsaufteilung für Timer_A und Timer_B Für die MSP430, die beide Timer auf dem Chip haben, ist die wohl beste Arbeitsaufteilung: • Der Timer_A, der im Continuous Mode arbeitet, wird für die Zeiten des Systems programmiert: Zeit und Datum, Tastaturabfrage, Zeitmessungen, Ein- und Ausgabe, Erfassen von Eingangssignalen usw.
5.13 Der Timer_B
227
• Der Timer_B, der im Up Mode oder Up/Down Mode arbeitet, wird für PWM-Anwendungen verwendet (DMC, DACs usw.).
5.13.4 Modifizierung von Timer_A-Software für den Timer_B Um die zahlreichen Beispiele die in [1] enthalten sind, auf den Timer_B abzuändern, werden die folgenden Schritte empfohlen: • Ersatz der Assembleranweisungen des TI-ASM430-Assemblers durch diejenigen des IAR-Assemblers. Eine Anleitung dazu ist in [8] MSPFET430P140 Flash Emulation Tool User’s Guide enthalten. • Ersatz der Namen der Hardware Register des Timer_A durch die entsprechenden Namen des Timer_B (z.B. TAR durch TBR, CCR0 und TACCR0 durch TBCCR0). Die Namen sind in den Dateien »msp430x43x.h« und »msp430x44x.h« enthalten. Diese Dateien befinden sich im Ordner C:\Program Files\IAR Systems\…. • Festlegung welche Synchronisierung für die Änderung der Capture/Compare Register verwendet werden soll. Dies wird mit den CLLD- und TBCLGRPBits in den Registern TBCCTLx und TBCTL festgelegt. Dazu werden die Befehle, die diese Register initialisieren, ergänzt. • Entfernen aller Befehle, die beim Timer_A für die Synchronisation notwendig sind. • Die vom Timer_A verwendeten Ein- und Ausgänge (CCIxA, CCIxB, TAx) müssen von den bei der MSP430C3xx-Familie verwendeten Ports (Port3) auf die vom Timer_B verwendeten Ports umgeändert werden (Port2 und Port3). • Wenn eine Output Unit verwendet wird, muss der zugehörige Port als Ausgang geschaltet werden (das ist bei der MSP430C3xx-Familie nicht notwendig). BIS.B BIS.B
#0Eh,&P2DIR #0F0h,&P3DIR
; TB2, TB1, TB0: Ausgaenge ; TB6 bis TB3: Ausgaenge
Ein Beispiel für eine PWM-Anwendung des Timer_B ist in der MSP430F449 Quickstart Software enthalten. Zwei PWM-Ausgänge werden gesteuert. Es werden der OUTMOD_7 (Reset/Set) und CLLD_1 (Übernahme, wenn TBR den Stand 0 erreicht) für die Datenübernahme in die Capture Latches verwendet. Mehr Information: [2] Kapitel The Timer_B [1] Kapitel The Timer_A
228
Kapitel 5: Die Peripherie-Module
Alle Beispiele für den Timer_A können mit dem Timer_B verwendet werden. Es sind nur die Änderungen notwendig, die im Kapitel »Modifizierung von Timer_A-Software für den Timer_B« aufgeführt sind. [5] Timer_B
5.14
Der Watchdog Timer
Der Watchdog der MSP430-Familie kann als einfacher Timer oder aber als Watchdog, der die Systemfunktion überwacht, eingesetzt werden. Im Gegensatz zu den meisten anderen Mikrocontrollern ist die Watchdog-Funktion nach einem Reset oder POR/PUC eingeschaltet: Das bedeutet, dass bei Schwierigkeiten nach dem Einschalten der Speisespannung der Watchdog den MSP430 so lange zurücksetzt, bis der Start erfolgreich ist.
Abb. 5.64: Der Watchdog Timer
5.14 Der Watchdog Timer
229
Abbildung 5.65 zeigt das Control Register des Watchdogs, in dem auch noch die Steuerbits des »Non-Maskable Interrupts« NMI enthalten sind.
Abb. 5.65: Das Watchdog Control Register
WDTIS0 WDTIS1 WDTSSEL
Auswahl des Zeitintervalls, nach dessen Ablauf der Watchdog aktiv wird
WDTSSEL
Auswahl der Clock-Frequenz des Watchdog Löschbit für den Watchdog Auswahl der Funktion des Watchdogs Auswahl der Funktion des RST/NMI-Pins Auswahl der Signalrichtung am RST/NMI-Eingang, die Interrupt auslöst (nur falls Bit WDTNMI = 1) Das Bit steuert die Funktion des Watchdog Sicherheitscode: Wird er verletzt, wird ein PUC ausgelöst
WDTCNTCL WDTTMSEL WDTNMI WDTNMIES
WDTHOLD Passwort
WDT WDT WDT Zeitintervall SSEL IS1 IS0 0 0 0 tSMCLK 215 0 0 1 tSMCLK 213 0 1 0 tSMCLK 29 0 1 1 tSMCLK 26 1 0 0 tACLK 215 1 0 1 tACLK 213 1 1 0 tACLK 29 1 1 1 tACLK 26 0: SMCLK wird verwendet 1: ACLK wird verwendet Setzen des Bits löscht den Zähler. Das Bit wird automatisch gelöscht. 0: Funktion als Watchdog 1: Funktion als Timer 0: Funktion als Reset-Eingang 1: Funktion als NMI-Eingang 0: Steigende Flanke 1: Fallende Flanke
0: Watchdog ist aktiv 1: Watchdog wird angehalten 069h: Code der gelesen wird 05Ah: Code beim Schreiben
Tabelle 5.23: Funktion der Bits im Watchdog Control Register
230
Kapitel 5: Die Peripherie-Module
Beispiel: Der Watchdog soll zurückgesetzt werden. MOV
#05A00h+WDTCNTL,&WDTCTL ; Watchdog reset
Die MSP430F449 Quick Start Software enthält eine Subroutine WDCheck, die die Funktion des Timer_A und des Basic Timer1 überwacht. Nur wenn beide aktiv sind, wird der Watchdog zurückgesetzt. Mehr Information: [1] Kapitel The Watchdog Timer Ein Softwarebeispiel wird gezeigt und erklärt, bei dem der Watchdog drei voneinander unabhängige Funktionen überwacht. [5] Watchdog Timer
5.15
Der Hardware-Multiplizierer
Abbildung 5.66 zeigt die Hardware des 16 16-Bit-Multiplizierers, die viele Anwendungen des MSP430 erst möglich macht (z.B. DMC). Die Abbildung zeigt nicht die wirkliche Realisierung im Silizium, sondern wie der Programmierer den Multiplizierer sieht.
Abb. 5.66: Hardware des Multiplizierers
5.15 Der Hardware-Multiplizierer
231
5.15.1 Funktion des Hardware-Multiplizierers Der Hardware-Multiplizierer erlaubt vier verschiedene Multiplikationen: • Die Multiplikation von vorzeichenlosen 16- und 8-Bit-Operanden MPY • Die Multiplikation von vorzeichenbehafteten 16- und 8-Bit-Operanden MPYS • Die Multiplikation und Addition (Multiply-and-Accumulate) von vorzeichenlosen 16- und 8-Bit-Operanden MAC • Die Multiplikation und Addition von vorzeichenbehafteten 16- und 8-BitOperanden MACS Jede Kombination der Operandenlänge (16 und 8 Bits) ist möglich.
5.15.2 Hardware und Register Der Hardware-Multiplizierer ist nicht Teil der CPU: Er ist ein Peripherie-Modul wie der Timer_A. Das bedeutet, dass seine Aktivität nicht in Konflikt mit jener der CPU kommt.
Abb. 5.67: Die interne Verbindung des Multiplizierers zur CPU
232
Kapitel 5: Die Peripherie-Module
Die Register des Hardware-Multiplizierers werden nicht von POR bzw. PUC beeinflusst. Mit Ausnahme des SUMEXT-Registers sind alle anderen Register des Multiplizierers les- und schreibbar. Für vorzeichenbehaftete Multiplikationen wird das Zweierkomplement für die Eingabe und das Resultat verwendet.
Die Operanden-Register OP1 und OP2 Die auszuführende Art der Multiplikation wird durch die Adresse bestimmt, in die der Operand OP1 geschrieben wird: Adresse 130h: Die vorzeichenlose Multiplikation MPY wird ausgeführt. Adresse 132h: Die vorzeichenbehaftete Multiplikation MPYS wird ausgeführt. Adresse 134h: Die vorzeichenlose MAC-Funktion wird ausgeführt. Adresse 136h: Die vorzeichenbehaftete MACS-Funktion wird ausgeführt. Erst wenn der zweite Operand in das Register OP2 (Adresse 138h) geschrieben wird, beginnt die Multiplikation. Beispiel: Eine vorzeichenlose Multiplikation MPY soll für die Inhalte der Arbeitsregister R15 und R14 ausgeführt werden. MOV MOV ...
R15,&130h R14,&138h
; Definiere MPY Funktion ; Starte MPY mit Operand OP2 ; Produkt in RESHI|RESLO
Das Register für den Operanden OP2 (Adresse 138h) ist für alle vier Multiplikationen gemeinsam. Seine Modifikation – normalerweise durch einen MOVBefehl – startet die Multiplikation der beiden Operanden in den Registern OP1 und OP2. Das Ergebnis wird sofort in die drei Hardware-Register SUMEXT, RESHI und RESLO geschrieben.
Das RESLO-Register Dieses 16-Bit-Register enthält die 16 LSBs des Resultats. Das obere Byte kann nicht durch Byte-Befehle adressiert werden.
Das RESHI-Register Dieses 16-Bit-Register enthält die 16 MSBs des Resultats. Das obere Byte kann nicht durch Byte-Befehle adressiert werden. Es enthält folgende Information: MPY: Die MSBs des berechneten Produkts
5.15 Der Hardware-Multiplizierer
233
MPYS: Die MSBs des berechneten Produkts mit dem Vorzeichen im Bit 31 MAC: Die MSBs der berechneten Summe MACS: Die MSBs der berechneten Summe mit dem Vorzeichen im Bit 31
Das SUMEXT-Register Das SUMEXT-Register (Sum Extension) erleichtert die Benutzung der Ergebnisse für Berechnungen mit mehr als 32 Bit Länge. Dieses »read only«-Register enthält die Information für die MSBs, also für die Bits 32 und noch größer. Der Inhalt des SUMEXT-Register ist verschieden für die vier Multiplikationen: MPY: SUMEXT enthält immer Null. Ein Carry ist nicht möglich, das größte Ergebnis ist: 0FFFFh 0FFFFh = 0FFFE,0001h. MPYS: SUMEXT enthält das erweiterte Vorzeichen des 32-Bit-Resultats aus Bit 31. Das bedeutet, falls das Ergebnis negativ ist (Bit 31 = 1), enthält SUMEXT 0FFFFh, falls das Ergebnis positiv ist (Bit 31 = 0), enthält SUMEXT 0000h. MAC: SUMEXT enthält den Carry der Aufsummierung. SUMEXT enthält 0001h, falls ein Carry während der Aufsummierung auftrat und es enthält 0000h, falls nicht. MACS: SUMEXT enthält das erweiterte Vorzeichen der 32-Bit-Summe aus Bit 31. Das bedeutet, falls die Summe negativ ist (Bit 31 = 1), enthält SUMEXT 0FFFFh, falls sie positiv ist (Bit 31 = 0), enthält SUMEXT 0000h. Das SUMEXT-Register erleichtert Operationen mit langen Operanden (> 32 Bit): Keine Zeit und Programmplatz verbrauchenden bedingten Sprünge sind notwendig, sondern einfache Additionen werden benutzt. Beispiel: Das Produkt einer MPYS-Operation (Multiplikanden in R14 und R15) wird auf ein vorzeichenbehaftetes 64-Bit-Resultat, das in den RAM-Worten RESULT bis RESULT+6 steht, addiert: MOV MOV ADD ADDC ADDC ADDC
R15,&MPYS R14,&OP2 SumLo,RESULT SumHi,RESULT+2 SumExt,RESULT+4 SumExt,RESULT+6
; ; ; ; ; ;
MPY mit Vorzeichen Start MPYS LSBs des Resultats MSBs Resultat Bits 32...47 Resultat Bits 48...63
Mit der gezeigten Software sind keine Überprüfungen und bedingten Sprünge notwendig: Das Ergebnis enthält immer die richtige Summe.
234
Kapitel 5: Die Peripherie-Module
Regeln für den Hardware-Multiplizierer • Der Hardware-Multiplizierer ist ein Wort-Modul: Die Hardware-Register können als Worte und als Byte adressiert werden, der Byte-Mode kann aber nur das untere Byte adressieren, das obere Byte nicht. • Die Operanden-Register des Hardware-Multiplizierers (Adressen 0130h, 0132h, 0134h, 0136h und 0138h) verhalten sich bei Byte-Operationen wie die Arbeitsregister der CPU: Das obere Byte wird dabei gelöscht. Das erlaubt 8-Bit- und 16-Bit-Multiplikationen in jeder Mischung. • Das Gleitkommapaket FPP4 benützt den Hardware-Multiplizierer, falls die Variable HW_MPY mit 1 definiert wird: HW_MPY
equ
1
• Wenn ein Ergebnis des Hardware-Multiplizierers mit dem Indirect Mode oder dem Indirect Autoincrement Mode adressiert wird, muss ein NOPBefehl hinter der Mutiplikation stehen, um sicherzustellen, dass sie vollständig ausgeführt werden kann.
5.15.3 Implementierte Multiplikationen Vier verschiedene Multiplikationen sind verfügbar. Sie werden einzeln behandelt.
Multiplikation ohne Vorzeichen Die beiden Operanden, die in die Operanden-Register 130h und 138h geschrieben werden, werden als vorzeichenlose Zahlen behandelt. Wobei: 00000h die kleinste Zahl ist und 0FFFFh die größte Zahl ist. Das größte mögliche Ergebnis ist: 0FFFFh 0FFFFh = 0FFFE,0001h Ein Carry ist nicht möglich, das SUMEXT-Register enthält immer Null. Die Tabelle 5.24 zeigt die Produkte für einige spezielle Multiplikanden. Operanden
SUMEXT
SUMHI
SUMLO
0000 × 0000 0001 × 0001 7FFF × 7FFF
0000 0000 0000
0000 0000 3FFF
0000 0001 0001
5.15 Der Hardware-Multiplizierer
Operanden
SUMEXT
SUMHI
SUMLO
FFFF × FFFF 7FFF × FFFF 8000 × 7FFF 8000 × FFFF 8000 × 8000
0000 0000 0000 0000 0000
FFFE 7FFE 3FFF 7FFF 4000
0001 8001 8000 8000 0000
235
Tabelle 5.24: Ergebnisse für die Multiplikation ohne Vorzeichen
Multiplikation mit Vorzeichen Die beiden Operanden, die in die Operanden-Register 132h und 138h geschrieben werden, werden als vorzeichenbehaftete Zahlen behandelt (Darstellung im Zweierkomplement). Wobei: 08000h die kleinste Zahl (größte negative Zahl) ist (–32.768) und 07FFFh die größte Zahl ist (+32.767). Das SUMEXT-Register enthält das Vorzeichen des errechneten Ergebnisses: SUMEXT = 00000h:
Das Ergebnis ist positiv.
SUMEXT = 0FFFFh:
Das Ergebnis ist negativ.
Operanden
SUMEXT
SUMHI
SUMLO
0000 × 0000 0001 × 0001 7FFF × 7FFF FFFF × FFFF 7FFF × FFFF 8000 × 7FFF 8000 × FFFF 8000 × 8000
0000 0000 0000 0000 FFFF FFFF 0000 0000
0000 0000 3FFF 0000 FFFF C000 0000 4000
0000 0001 0001 0001 8001 8000 8000 0000
Tabelle 5.25: Ergebnisse für die Multiplikation mit Vorzeichen
Multiplikation und Addition (MAC) ohne Vorzeichen Die beiden Operanden, die in die Operanden-Register 134h und 138h geschrieben werden, werden als vorzeichenlose Zahlen (0h to 0FFFFh) behandelt.
236
Kapitel 5: Die Peripherie-Module
Das Ergebnis der Multiplikation wird zu dem vorherigen Inhalt der beiden Register SUMLO und SUMHI addiert. SUMEXT = 00000h:
Kein Carry bei der Aufsummierung.
SUMEXT = 00001h:
Ein Carry trat bei der Aufsummierung auf.
Bei den Ergebnissen der Tabelle 5.26 wird angenommen, dass die Register SUMHI und SUMLO vor jeder Operation bereits den Inhalt C000,0000h haben (keine Aufsummierung von Beispiel zu Beispiel). Operanden
SUMEXT
SUMHI
SUMLO
0000 × 0000 0001 × 0001 7FFF × 7FFF FFFF × FFFF 7FFF × FFFF 8000 × 7FFF 8000 × FFFF 8000 × 8000
0000 0000 0000 0001 0001 0000 0001 0001
C000 C000 FFFF BFFE 3FFE FFFF 3FFF 0000
0000 0001 0001 0001 8001 8000 8000 0000
Tabelle 5.26: Ergebnisse für die Multiplikation und Addition ohne Vorzeichen
Multiplikation und Addition (MACS) mit Vorzeichen Die beiden Operanden, die in die Operanden-Register 136h und 138h geschrieben werden, werden als vorzeichenbehaftete Zahlen (8000h bis 7FFFh) behandelt (Darstellung im Zweierkomplement). Das SUMEXT-Register enthält das Vorzeichen der errechneten Summe: SUMEXT = 00000h:
Die Summe ist positiv.
SUMEXT = 0FFFFh:
Die Summe ist negativ.
Anmerkung: Es gibt keinen Hinweis auf einen Überlauf der akkumulierten Summe, also für den Überlauf von 7FFF,FFFFh auf 8000,0000h oder aber umgekehrt.
Zwei Fälle existieren, die in jedem Falle gültige Ergebnisse aufweisen: • Eine »worst case«-Untersuchung zeigt, dass dieser Überlauf nicht vorkommen kann, z.B. weil der ADC nur eine limitierte Eingabe zu einem Algorithmus liefern kann (0 bis 4095 beim ADC12). • Eine »worst case«-Untersuchung zeigt, dass das Endresultat immer 7FFF,FFFFh und 8000,0000h ist. Falls dies der Fall ist, kann der Überlauf stattfinden, das Endresultat ist wieder richtig. Siehe Abbildung 5.68:
5.15 Der Hardware-Multiplizierer
237
Abb. 5.68: Überlauf bei MACS-Operationen
Bei den Ergebnissen der Tabelle 5.27 wird angenommen, dass die Register SUMHI und SUMLO vor jeder Operation bereits den Inhalt E000,0000h haben (keine Aufsummierung von Beispiel zu Beispiel). Operanden
SUMEXT
SUMHI
SUMLO
0000 × 0000 0001 × 0001 7FFF × 7FFF FFFF × FFFF 7FFF × FFFF 8000 × 7FFF 8000 × FFFF 8000 × 8000
FFFF FFFF 0000 FFFF FFFF FFFF FFFF 0000
E000 E000 1FFF E000 DFFF A000 E000 2000
0000 0001 0001 0001 8001 8000 8000 0000
Tabelle 5.27: Ergebnisse fur die Multiplikation und Addition mit Vorzeichen
5.15.4 Assembler-MACROs Die MSP430F449 Quick Start Software enthält acht MACROs für die vier möglichen Multiplikationsarten und zwar für 16-Bit- und für 8-Bit-Operanden. Siehe dort bei »MACROs«. Die Aufrufe sind: MPYU16 MPYS16 MACU16 MACS16 MPYU8
arg1,arg2 arg1,arg2 arg1,arg2 arg1,arg2 arg1,arg2
; ; ; ; ;
MPY 16x16 Bit ohne Vz MPYS 16x16 Bit mit Vz MAC 16x16 Bit ohne Vz MACS 16x16 Bit mit Vz MPY 8x8 Bit ohne Vz
238
Kapitel 5: Die Peripherie-Module MPYS8 MACU8 MACS8
arg1,arg2 arg1,arg2 arg1,arg2
; MPYS 8x8 Bit mit Vz ; MAC 8x8 Bit ohne Vz ; MACS 8x8 Bit mit Vz
Es ist dabei jede Adressierungsart für src und dst zulässig. Also auch: MPYU16
@R4,@R5+
; MPY indirekt src und dst
5.15.5 Benutzung des Interrupts Falls der Hardware-Multiplizierer nur in Interrupt-Routinen oder nur im Hauptprogramm verwendet wird, ist keine Vorsicht nötig. Das ändert sich aber, wenn der Hardware-Multiplizierer in beiden Modi, oder aber in verschachtelten Interrupts verwendet werden soll. Der Hardware-Multiplizierer kann in Interrupt-Routinen und im Background verwendet werden, wenn drei Regeln beachtet werden: • Das Laden des Registers OP1 (MPY, MPYS, MAC und MACS) und des Registers OP2 darf nicht durch einen Interrupt unterbrochen werden, der den Multiplizierer benutzt: Die Information für den Operanden OP1 kann nicht wieder hergestellt werden, da vier Eingaberegister möglich waren. Siehe das folgende Beispiel. • Die Register OP1 und OP2 können nicht von der Background-Software zurückgelesen werden, da sie von der Interrupt-Routine überschrieben sein können. • Die Information im Operanden OP1 kann nicht für mehr als eine Multiplikation verwendet werden, also so, dass nur der Operand OP2 für die nächste Multiplikation verändert wird. Das Gleitkommapaket FPP4 verwendet diese Methode in der Multiplikation, um schneller zu sein: Es muss daher leicht verändert werden (die Stelle ist in der Source des FPP4 angezeichnet). Das nächste Beispiel zeigt eine Lösung, um den Multiplizierer im Hauptprogramm und in einer Interrupt-Routine verwenden zu konnen: ; ; ; ; ; ;
Der Multiplizierer wird vom Hauptprogramm und von einer Interrupt-Routine benutzt. Die Interrupt-Latenzzeit wird um 8 Zyklen erhoeht. Der NOP ist notwendig: Ein Befehl kann auch noch nach dem DINT-Befehl ausgefuehrt werden. DINT NOP MACU16 MOV EINT ...
R4,R6 &SUMEXT,R5
; ; ; ; ; ;
Sicheres Laden der MPYerRegister: Interrupt aus R4 x R6 + Sum -> Sum Rette Carry in SUMEXT Interrupts wieder ein Weiter: SUMEXT in R5
; ; Die Interrupt-Routine, die den MPYer benutzt, ; muss dessen Register retten und wieder restaurieren.
5.15 Der Hardware-Multiplizierer ; INTRPT_H
PUSH PUSH MPYS16 .... POP POP RETI
&SUMLO &SUMHI #X,C1 &SUMHI &SUMLO
; ; ; ; ; ; ;
239
SUMLO-Register retten SUMHI-Register retten #X x C1 errechnen MPYer-Ergebnis verwenden SUMHI-Register restaurieren SUMLO-Register restaurieren Zum Background zurueck
5.15.6 Geschwindigkeitsvergleiche Tabelle 5.28 zeigt die Geschwindigkeitsverbesserung, die der HardwareMultiplizierer gegenüber einer Softwaremultiplikation aufweist. Es wird die schnelle Multiplikationsroutine aus dem Kapitel »Integer-Rechenroutinen« zum Vergleich verwendet. Operation
Softwareschleife
HardwareMultiplizierer
Verbesserungsfaktor
MAC ohne Vorzeichen MPY ohne Vorzeichen MAC mit Vorzeichen MPY mit Vorzeichen
12…164 14…166 18…176 20…178
8 8 8 8
1,5…20,50 1,75…20,75 2,25…22,00 2,5…22,25
Tabelle 5.28: CPU-Zyklen für die vier Multiplikationen
Beim Gleitkommapaket wird der Hardware-Multiplizierer nur bei der Multiplikation verwendet (Subroutine FLT_MUL). Die Verbesserung wird in der nächsten Tabelle gezeigt. Operation
.float
.double
Kommentar
Multiplikation X Y Multiplikation X Y Verbesserungsfaktor
395 153 2,58
692 213 3,25
Softwareschleife Hardware-Multiplizierer SW-Zyklen/HW-Zyklen
Tabelle 5.29: CPU-Zyklen für eine FPP4-Multiplikation (FLT_MUL)
Mehr Information: [1] Kapitel The Hardware Multiplier Weitere Softwarebeispiele wie 32-Bit-Multiplikation, schnelle Polynomberechnung, FIR Digitales Filter und Fast Fourier Transformation [5] Kapitel Hardware Multiplier
241
6
ARBEITSSCHRITTE FÜR EIN MSP430-PROJEKT
Verschiedene Projektschritte sind notwendig, um ein System, bestehend aus einem MSP430 (CPU und interne Peripherie-Module) und der externen Hardware, mit der gegebenen Systemspezifikation in Übereinstimmung zu bringen. Typische und empfohlene Entwicklungsschritte – die alle bei mehreren Projekten erfolgreich praktiziert wurden – sind nachfolgend aufgeführt. Alle dort genannten Arbeitsschritte sollten sorgfältig durchgeführt werden, um späteren Ärger zu vermeiden (»Do it right the first time« ist keine schlechte Empfehlung). Anmerkung: Die nachfolgend genannten Arbeitsschritte sind unter Umständen nicht in einem linearen Entscheidungsprozess möglich, sondern es ist eventuell ein iterativer Prozess mit mehreren Durchgängen nötig, um die beste Lösung zu erzielen.
6.1
Arbeitsdefinition
Der erste Projektschritt legt die eigentliche Aufgabe des neu zu entwickelnden MSP430-Systems fest. • Was soll das MSP430-System tun? Detaillierte Beschreibung alles Auszuführenden. • Was kann die MSP430-CPU tun? Reicht die Rechengeschwindigkeit für alle Arbeiten? Ist ein Multiplizierer notwendig? • Was können die internen Peripherie-Module tun? Ist externe Peripherie notwendig? • Ist ein Analog-Digital-Wandler notwendig? Falls ja, reicht ein »Single Slope«-Wandler mit dem Comparator_A oder ist der 12-Bit-Analog-DigitalWandler ADC12 notwendig? Oder sogar ein noch höher auflösender, externer ADC? • Sind Treiberstufen z.B. für Relais oder Leistungs-FETs notwendig?
242
Kapitel 6: ARBEITSSCHRITTE FÜR EIN MSP430-PROJEKT
• Welche Speisungsart und Speisespannung soll verwendet werden? Batterie? Netzteil? Spannungswert der zur Verfügung stehenden Spannung? • Wieviele Status und Substatus sind für die Organisation des Programmablaufes notwendig? Näheres im Kapitel »Verwendung von Status für den Programmablauf«.
6.2
Auswahl des MSP430
Mit der vorstehenden Arbeitsdefinition kann der MSP430-Typ bestimmt werden, der die Anforderungen (Preis, Leistung) am besten erfüllt. Wichtige Fragen zur Auswahl sind: • Welche Programmspeichergröße braucht das System? • Wieviel Datenspeicher (RAM und Information Memory) braucht das System? • Welche Peripherie-Module müssen auf dem MSP430 vorhanden sein? Beim Preis ist darauf zu achten, dass nicht der Preis des MSP430 am wichtigsten ist, sondern der sich am Ende ergebende Systempreis! Die preisgünstigste Peripherie ist immer diejenige, die auf dem MSP430-Chip vorhanden ist, auch wenn der MSP430-Preis dadurch etwas höher ist. Die Gründe dafür sind: • Externe Peripherie braucht normalerweise mehr Strom: Eine größere Batterie bzw. ein größeres Netzteil sind notwendig oder aber die Lebenszeit der Batterie ist kürzer. • Externe Peripherie braucht zusätzlichen Platz auf der Platine: Eine größere Platine bzw. ein größeres – und damit teureres – Gehäuse sind notwendig. Dazu kommen Test, Bestückungskosten und Lagerhaltung der Teile. • Die Systemzuverlässigkeit ist am höchsten bei interner Peripherie. Jedes zusätzliche externe Bauelement verringert die Systemzuverlässigkeit. • Interne Peripherie-Module benötigen keine Steuerausgänge: Ein kleineres MSP430-Gehäuse ist eventuell möglich oder aber mehr Ausgänge stehen zu anderweitiger Verfügung. • Die Steuerung interner Peripherie kann mit höchster Geschwindigkeit erfolgen, da nicht Ausgänge gesetzt und zurückgesetzt werden müssen, sondern ein direkter Zugriff auf die Steuerbits möglich ist: Die dadurch mögliche, niedrigere Arbeitsfrequenz der CPU spart Strom.
6.3 Zeitbetrachtung unter »Worst Case«-Bedingungen
6.3
243
Zeitbetrachtung unter »Worst Case«-Bedingungen
• Können die regelmäßig notwendigen Berechnungen auch unter »worst case«Bedingungen in dem zur Verfügung stehenden Zeitintervall durchgeführt werden? Falls nicht, muss die MCLK-Frequenz für die CPU erhöht werden, bzw. es müssen Hilfsmittel wie ein Multiplizierer verwendet werden. • Können die auftretenden Interrupts alle notwendigen Berechnungen in der Interrupt-Routine durchführen, oder ist eine Aufteilung notwendig? Der Interrupt setzt nur ein Statusbyte, dessen Information vom Background abgearbeitet wird. Dadurch sind extrem kurze Interrupt-Routinen – und damit sehr kleine Verzögerungen anderer Interrupts – möglich. • Kann das Gleitkommapaket FPP4 eingesetzt werden d.h. reichen der zur Verfügung stehende Programmplatz (< 1 KByte für die vier Grundrechenarten und Konversionen) und das Zeitintervall (200 (Addition) bis 400 MCLKZyklen (Division)) aus, um dieses Werkzeug einsetzen zu können? Der Vorteil, falls es verwendet werden kann, ist sehr groß: • Das Problem der Rechengenauigkeit bei den Integer-Routinen ist praktisch nicht vorhanden: Das 32-Bit-Gleitkommapaket rechnet auf ungefähr 60 10-9 genau. Das ebenfalls verwendbare 48-Bit- Gleitkommapaket rechnet auf ungefähr 1 10-12 genau. • Das – oft mühsame – Problem der Maßschneiderung des Rechenalgorithmus ist ebenfalls nicht vorhanden: Der jeweilige Rechenalgorithmus wird einfach der Reihe nach niedergeschrieben. Um alles andere kümmert sich das Gleitkommapaket. Ein Beispiel ist im Kapitel »Gleitkommapaket FPP4« vorhanden. • Muss in den Interrupt-Routinen der – automatisch abgeschaltete – Interrupt wieder eingeschaltet werden? Dies ist bei längeren Interrupt-Routinen – die man möglichst vermeiden sollte – notwendig, um andere Interrupts zuzulassen. • Reicht die Geschwindigkeit der durch Befehle gesteuerten Ausgänge oder muss auf das automatische Setzen und Rücksetzen durch die »Output Units« der Timer_A bzw. Timer_B zurückgegriffen werden? Die Steuerung durch einen Timer ist auch bei hohen zeitlichen Genauigkeitsanforderungen an das Setzen und Rücksetzen eines Ausgangs notwendig. • Reicht das Abfrage-Zeitintervall für die Eingänge oder muss ihr Interrupt benutzt werden? Falls ja, müssen der Port1 oder Port2 dafür verwendet werden.
244 6.4
Kapitel 6: ARBEITSSCHRITTE FÜR EIN MSP430-PROJEKT
Zeichnen eines kompletten Schaltplans
Wenn die vorstehend aufgeführten Entscheidungen gemacht sind, kann ein Prinzipschaltplan mit allen Systemkomponenten gezeichnet werden. Mehrere Beispiele für Prinzipschaltpläne sind im Kapitel »Applikationen« zu sehen. • Festlegen, welche Aus- und Eingänge von den internen Peripherie-Modulen benötigt werden, z.B. die PWM-Ausgänge des Timer_B, die sich an bestimmten Ports befinden. • Festlegen, welche Eingänge Interrupt-Fähigkeit haben müssen: Diese Eingänge müssen an die Ports 1 und 2 angeschlossen werden, da »nur« diese 16 Ports Interrupt-Fähigkeit aufweisen. • Externe Beschaltung der Eingänge: Welche Eingänge liegen nicht an einem festen Potential und benötigen daher Pull-up- oder Pull-down-Widerstände? • Auswahl der Oszillatorbeschaltung: DCO mit RC-Glied, 32-kHz-Quarz, hochfrequenter Quarz oder Kombination von zwei Oszillatoren? Sind die internen Kapazitäten am 32-kHz-Quarz ausreichend oder sind externe Kondensatoren notwendig? • RST/NMI-Beschaltung: RC-Glied, externer Reset-Baustein? • Externe Beschaltung des Comparator_A: Wird er als Analog-Digital-Wandler oder als Komparator verwendet? • Externe Beschaltung der beiden USARTs: Betrieb als UART oder als SPI? Sind externe Treiber notwendig? • Externe Beschaltung des Analog-Digital-Wandlers: Externe oder interne Referenz? Abblockkondensatoren an den Eingängen und Speisespannungen? Sind Spannungsteiler notwendig, da die maximale Eingangsspannung größer als AVcc ist? Dieser Prinzipschaltplan dient als Grundlage für den eigentlichen Schaltplan, der auch die Abblockkondensatoren an den Speisespannungen, die Pinbelegungen der Stecker und alle anderen für die Herstellung der Bestückungsplatine wichtigen Einzelheiten enthält.
6.5
»Worst Case«-Entwurf aller externen Komponenten
»Worst Case«-Entwurf bedeutet das Einbeziehen des schlechtesten möglichen Falles in einen Entwurf.
6.6 Organisation des RAM und des Information Memory
245
Also gemeinsames Auftreten – in der jeweilig ungünstigsten Richtung – von: • Maximalen Bauelementetoleranzen (z.B. 5 %) • Maximaler Abweichung 3 V 0,2 V)
der
Speisespannung
vom
Nennwert
(z.B.
• Maximaler Temperaturabweichung vom Nennwert (z.B. –40 C +85 C)
bzw.
• Höchster Signal-Eingangsfrequenz an den Ports (z.B. 8 kHz) • Minimaler MCLK-Frequenz (z.B. 1 MHz) Anmerkung: Ein vollständig durchgerechnetes »Worst Case«-Beispiel ist in [2] im Kapitel »Self-corrective Voltage Measurement without Analog-to-Digital Converter« enthalten.
6.6
Organisation des RAM und des Information Memory
Die bei der »Auswahl des MSP430« gefundene Datenmenge wird nun aufgeteilt: Die beiden Speicherbereiche für sich ändernde Information sind das RAM und die beiden Information Memories A und B. Das RAM wird für sich laufend ändernde Information verwendet, das Information Memory für sich selten ändernde, wie z.B. die Kalibrierungsdaten oder die Verbrauchswerte für längere Zeiträume. In der folgenden Abbildung ist eine mögliche Aufteilung der beiden Speicherbereiche in Wort- und Byte-Bereiche gezeigt. Sie hat den Vorteil der Übersichtlichkeit und des Fehlens von Byte-Lücken durch abwechselnde Wort- und ByteWerte. Im Wort-Bereich stehen 16-Bit-Werte, 32-Bit-Werte und noch längere Zahlen, sowie Gleitkommazahlen mit 32 bzw. 48 Bit Länge. Im Byte-Bereich stehen 8-Bit-Werte, ASCII-Zeichen, Bit-Anordnungen und Status für den Programmablauf. Der Stack sollte immer an der höchsten RAM-Adresse beginnen, d.h. in der Initialisierungs-Routine sollte die erste Adresse außerhalb des RAM-Bereichs in den Stack Pointer SP geladen werden (0A00h beim MSP430F449).
246
Kapitel 6: ARBEITSSCHRITTE FÜR EIN MSP430-PROJEKT
Abb. 6.1: Organisation der Datenspeicher (gezeigt für den MSP430F449)
In der gleichen Weise wie in Abbildung 6.1 gezeigt ist, wird auch ein eventuell vorhandenes, externes EEPROM organisiert.
6.7
Zeichnen des Flussdiagramms für die komplette Software
Für die Softwareteile Initialisierung, Hauptprogramm, Subroutinen und Interrupt-Routinen sollten getrennte Flussdiagramme gezeichnet werden. Diese Art der Software-Darstellung ist zwar nicht mehr das Neueste oder Modernste, hat aber den grossen Vorteil, sehr leicht verständlich – und auch änderbar – zu sein. Die folgende Abbildung zeigt ein Flussdiagramm eines Systems, das zwischen dem RESET und der Initialisierung noch eine Abfrage enthält, ob die Kalibrierung des Systems durchgeführt werden soll.
6.8 Codieren der Software mit einem Editor
247
Abb. 6.2: Beispiel für ein Flussdiagramm
6.8
Codieren der Software mit einem Editor
Die Software wird am besten mit dem im IAR-Entwicklungssystem vorhandenen Editor codiert. Es ist allerdings auch möglich, einen anderen Editor zu verwenden. Es muss nur sicher sein, dass er rein ASCII-orientiert ist (WORD kann also nur im »Text Mode« verwendet werden). Im Kapitel »Die MSP430F449 Quick Start Software« ist ein Rahmenprogramm enthalten, das eine gute Grundlage für die Softwareentwicklung bietet. Alle wichtigen Programmteile wie • Definitionen • Macros
248
Kapitel 6: ARBEITSSCHRITTE FÜR EIN MSP430-PROJEKT
• Initialisierung • Hauptprogramm (MainLoop) • Subroutinen • Interrupt-Routinen • Interrupt-Vektoren sind bereits vorhanden und müssen nur noch auf die individuellen Anforderungen abgeändert und durch das eigentliche Hauptprogramm ergänzt werden. Für die Anpassung an die gegebenen Anforderungen empfehlen sich die im »MSP430 Family Application Reports« enthaltenen Subroutinen. Es handelt sich dabei um getestete, zeit- und speicherplatzoptimierte Subroutinen, die viel Entwicklungszeit und Ärger ersparen können. Es ist unbedingt zu empfehlen, die im IAR-Entwicklungssystem vorhandenen Definitionsdateien zu verwenden. Das bedeutet, dass man in der eigentlichen Software die in diesen Definitionsdateien definierten Namen für die MSP430Register und -Steuerbits verwendet. Sowohl »Das erste Programm«, als auch die »Quick Start Software« sind auf diese Weise geschrieben worden. Der Befehl zur Einbindung der Definitionsdatei für die MSP430x44x-Familie ist (das »x« steht für die spezifische Typennummer des verwendeten MSP430, welche die Speichergrösse angibt): #include "msp430x44x.h"
; MSP430x44x Definitionen
oder, für andere MSP430-Familienmitglieder: #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include
"msp430x11x.h" "msp430x11x1.h" "msp430x11x2.h" "msp430x12x.h" "msp430x12x2.h" "msp430x13x.h" "msp430x13x1.h" "msp430x14x.h" "msp430x15x.h" "msp430x16x.h" "msp430x31x.h" "msp430x32x.h" "msp430x33x.h" "msp430x41x.h" "msp430xe42x.h" "msp430x43x.h"
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
MSP430x11x Definitionen MSP430x11x1 Definitionen MSP430x11x2 Definitionen MSP430x12x Definitionen MSP430x12x2 Definitionen MSP430x13x Definitionen MSP430x13x1 Definitionen MSP430x14x Definitionen MSP430x15x Definitionen MSP430x16x Definitionen MSP430x31x Definitionen MSP430x32x Definitionen MSP430x33x Definitionen MSP430x41x Definitionen MSP430xe42x Definitionen MSP430x43x Definitionen
Die angegebenen Definitionsdateien sind in dem IAR-Ordner »IAR Systems\ Embedded Workbench 3.2\430\inc\« enthalten, der sich bei normaler Installation auf der Hauptspeicherplatte im Ordner »Program Files« befindet.
6.9 Assemblieren und Linken mit dem IAR-Assembler
6.9
249
Assemblieren und Linken mit dem IAR-Assembler
Dieser Vorgang ist im Kapitel »Das IAR-Entwicklungswerkzeug« ausführlich beschrieben. Wenn das IAR-Entwicklungswerkzeug so installiert wurde, wie es im Kapitel »Installation der IAR-Software« beschrieben ist, dann sind die Listings von Assembler und Linker in dem Ordner: C:\TEST\Debug\List gespeichert. Anmerkung: Im Listing des Assemblers sind die beiden Daten-Bytes eines Wortes vertauscht! Statt des Wertes 0001h steht also 0100 im Listing.
Der Assembler ist in den Handbüchern, die sich im IAR-Ordner auf der Hauptspeicherplatte befinden, detailliert beschrieben. Das Handbuch kann mit dem »Acrobat Reader« angesehen und auch ausgedruckt werden. Der Dateiname des Assembler/Linker-Handbuches ist (C steht für den Hauptspeicherplattennamen): C:\Program Files\IAR Systems\Embedded Workbench 3.2\430\doc\a430.pdf Anmerkung: Der »Acrobat Reader« ist auch auf der MSP430-CD vorhanden.
6.10
Berichtigung der gefundenen Fehler
Die vom Assembler und Linker gefundenen Fehler werden mit dem Editor berichtigt und ein neuer Lauf gestartet, bis das Programm formal fehlerfrei ist. Wo das Assembler-Listing, die Linker-Map-Datei und das Objekt zu finden sind, ist im Kapitel »Das IAR-Entwicklungswerkzeug« erklärt. Anmerkung: Erst wenn keine Fehler mehr gefunden werden, lässt das IAR-Entwicklungssystem einen CSPY-Test mit dem FET-Modul oder Simulator zu.
6.11
Test der Software mit dem CSPY-Simulator
Während der Zeit, in der die Test-Hardware noch nicht zur Verfügung steht, kann der Test der Programmteile, die keine externe Hardware verwenden, durchgeführt werden (z.B. Algorithmen, Gleitkommarechnungen, Messungen an PWM-Ausgängen usw.). Es empfiehlt sich dabei der Einbau eines »Test-Modus«, der es erlaubt, externe Signale auf bestimmte Werte zu bringen und für die Weiterverarbeitung zu ver-
250
Kapitel 6: ARBEITSSCHRITTE FÜR EIN MSP430-PROJEKT
wenden. Die Möglichkeit des »Bedingten Assemblierens« (conditional assembly) im Assembler kann dafür verwendet werden. Die Größe TEST kann dabei relativ viele Werte (0, 1, 2…5) haben, um mit verschiedenen Test-Abläufen arbeiten zu können. Beispiel: Im Test-Modus (TEST = 1) soll ein analoges Eingangssignal nicht mit dem ADC12 gemessen werden, sondern ein am Beginn des Programms definierter Wert ADC_VAL (0 bis FFFh) soll als ADC-Messergebnis verwendet werden. Damit können definierte Eingangswerte in Algorithmen eingehen. TEST equ 1 ; 0: normal 1: Test-Modus ADC_VAL equ 07FFh ; Testwert fuer ADC12-Wert ; ... ; Programm ; ; Fuer die Berechnungen wird ein Eingang mit dem ; ADC12 gemessen. ; Das Ergebnis steht im ADC-Register ADC12MEM0 ;(TEST = 0) oder wird mit ADC_VAL definiert (TEST = 1) ; if TEST = 1 ; Falls Test-Mode: MOV #ADC_VAL,R5 ; Testwert fuer ADC-Ergebnis ; else ; TEST = 0: ADC12-Messwert CALL #MEAS_ADC12 ; Messwert -> &ADC12MEM0 MOV &ADC12MEM0,R5 ; ADC-Messwert in R5 kopieren endif ; Ende des Test-Modes ... ; Weiter mit ADC-Messwert in R5
Der Test mit dem FET-Modul ist im Kapitel »Das IAR-Entwicklungswerkzeug« ausführlich beschrieben. Die Schritte 6.8 bis 6.11 werden so lange wiederholt, bis das Programm die Spezifikation erfüllt.
6.12
Entwicklung der Hardware und der Platine
Parallel zu der Softwareentwicklung kann mit der im Kapitel »Worst Case-Entwurf aller externen Komponenten« gefundenen Schaltung die Entwicklung einer Test-Hardware (mit gut zugänglichen Messpunkten) und die der eigentlichen Platine durchgeführt werden. Weitere Information: [2] Kapitel »Self-corrective Voltage Measurement without Analog-to-Digital Converter« Kapitel »Das IAR-Entwicklungswerkzeug«
251
7
Stromversorgung
Bedingt durch den extrem niedrigen Stromverbrauch des MSP430 sind mehrere Methoden der Spannungsversorgung möglich (nicht nur eine – die Netzspeisung – wie bei denjenigen Mikrocontrollern, die bis zu 40 mA Strom benötigen). Als Möglichkeiten seien genannt: • • • • •
Batterien (die Speisung, für die der MSP430 entwickelt wurde) Akkumulatoren M-Bus Netz Glas-Fiber-Leitungen
Jede dieser Methoden benutzt eine vollständig andere Hardware. Jeweils ein Beispiel ist für jede Speisung angegeben (mit Ausnahme der M-Bus-Speisung). Eine umfassende Beschreibung aller Speisungsmöglichkeiten ist in [1] Kapitel »Power Supplies for MSP430 Systems« gegeben (»worst case«-Design, Formeln, Schaltungen).
7.1
Batteriegespeiste MSP430-Systeme
Dies ist die häufigste Speisung für den MSP430. Durch den extrem niedrigen Stromverbrauch des MSP430 ist es möglich, ein MSP430-System mit einer 0,5Ah-Batterie mehr als 10 Jahre zu betreiben. Dies erlaubt Anwendungen, die bisher nicht möglich waren. Im Kapitel »Verringerung des Stromverbrauchs« sind die Regeln aufgeführt, die für solche Anwendungen beachtet werden müssen. Die wichtigste ist dabei, immer den LPM3 zu verwenden, wenn die CPU nicht gebraucht wird: Das reduziert den ohnehin geringen, aktiven Stromverbrauch von 420 mA auf nur noch 1,6 mA. Falls die benutzte Batterie einen hohen Innenwiderstand Ri aufweist (wie viele Batterien mit langer Lebensdauer), dann muss der Parallel-Kondensator Cb eine Mindestkapazität Cbmin haben: Der Strom für den Analog-Digital-Wandler – der nicht von der Batterie geliefert werden kann – muss dann während der Messung von dem Kondensator geliefert werden. &EPLQ WPHDV
,$0$' D8E
252
Kapitel 7: Stromversorgung
Zwischen zwei Messungen benötigt der Kondensator Cb eine Mindestzeit tchmin, um wieder auf die Spannung Vcc aufgeladen zu werden. Während dieser Zeit muss der MSP430 im LPM3 laufen, um die niedrigst mögliche Stromaufnahme zu haben. Die Aufladezeit tchmin um auf 99 % der Batteriespannung Vcc zu kommen ist: WFKPLQ OQ &EPD[ 5LPD[ &EPD[ 5LPD[
Wobei: IAMAD Stromaufnahme des MSP430 mit aktivem ADC12
[A]
tmeas
Messzeit mit eingeschaltetem ADC12
[s]
DUb
Maximale Entladung von Cb während der Messzeit tmeas [V]
Ri
Innenwiderstand der Batterie
[W]
Abb. 7.1: Batteriebetriebenes MSP430F4xx-System
7.2
Akkumulatorgespeiste MSP430-Systeme
Der MSP430 kann auch von einem Akkumulator gespeist werden. Ein Vorteil dieser Lösung ist es, dass der MSP430 das Batterie-Management mit übernehmen kann: • Strommessung: Aufsummierung der mit unterschiedlichen Konstanten multiplizierten Lade- und Entladeströme. Dies gibt eine relativ genaue Kenntnis des momentanen Ladezustands. Der Strom wird vorzeichenrichtig mit einem Shunt gemessen. Die beiden Widerstände R3 bringen den Messwert für 0 A in die Mitte des ADC12-Bereiches.
7.2 Akkumulatorgespeiste MSP430-Systeme
253
• Temperaturmessung: Alle Eigenschaften eines Akkumulators sind stark temperaturabhängig (z.B. maximale Ladung, Selbstentladung, Ladungsende). Daher wird die Temperatur mit einem Sensor gemessen und für die Berechnungen verwendet. • Spannungsmessung: Die Spannung eines Akkumulators ist ein Anzeichen für die volle Ladung und für die totale Entladung. • Ladungskontrolle: Abhängig vom Resultat der Ladungsberechnungen kann der MSP430 entscheiden, ob der Ladetransistor ein- oder ausgeschaltet wird. Dies kann mit PWM (Pulsweiten-Modulation durch Timer_B oder Timer_A) gemacht werden. • Ruhebetrieb: Während der Zeit in der das MSP430-System nicht verwendet wird, erlaubt der LPM3 die Überwachung des Ruhebetriebs. Der MSP430 wacht durch den Basic Timer1 in regelmäßigen Zeitintervallen auf und berechnet im Abstand von z.B. einer Stunde die Selbstentladung des Akkumulators. Abbildung 7.2 zeigt ein von einem Akkumulator gespeistes MSP430-System. Das Batterie-Management wird ebenfalls vom MSP430 gemacht. Der Ladezustand des Akkus wird in der LCD-Anzeige mit einem Balken angezeigt, der von »Leer« bis »Voll« reicht.
Abb. 7.2: Akkumulatorgespeistes MSP430-System mit Batterie-Management
254
Kapitel 7: Stromversorgung
Alle notwendigen Konstanten und eine Sicherheitskopie des momentanen Ladezustands sind in den Information Memories A bzw. B gespeichert.
7.3
Netzgespeiste MSP430-Systeme
Die Stromaufnahme von Mikrocontrollern wird auch für netzgespeiste Systeme immer wichtiger: • Umso geringer die Stromaufnahme ist, desto einfacher und kostengünstiger kann das Netzteil sein. • Durch Vorschriften werden die Grenzen der Stromaufnahme eines Mikrocontrollers immer enger. Die früher üblichen 40 mA Stromaufnahme werden schon seit vielen Jahren nicht mehr toleriert.
7.3.1
Transformatorspeisung
Transformatoren haben zwei wichtige Vorteile: • Völlige Isolation vom Netz: Ein wichtiger Sicherheitsaspekt in den meisten Anwendungen. • Sehr gute Anpassung an die benötigten Spannungen und dadurch sehr gute Leistungseffizienz. Abbildung 7.3 zeigt das einfachste Netzteil: Die positive Halbwelle des Transformators lädt den Ladekondensator Cch. Die Spannung des Kondensators wird mit einer Zenerdiode stabilisiert, die eine Zenerspannung gleich der notwendigen Speisespannung Vcc des MSP430 hat.
Abb. 7.3: Halbwellen-Gleichrichtung mit einer Zenerdiode
7.3 Netzgespeiste MSP430-Systeme
255
Abbildung 7.4 zeigt ein einfaches Netzteil, das einen Spannungsregler verwendet. Wie in Abbildung 7.3 muss der Ladekondensator Cch eine Mindestkapazität besitzen: &FKPLQ
,$0$' WGLV D8FK
Die Brummspannung der Ausgangsspannung hängt vom verwendeten Regler ab. Die notwendige Sekundärspannung Usec des Transformators unter voller Last ist: 8VHFPLQ
,$0$' Û Ë Ì8UHJ 8U + 8G + WGLV Ü &FKPLQ Ý Í
Die Entladezeit tdis des Ladekondensators Cch ist dabei: • Bei 10 % Entladung von Cch während tdis
tdis = 0,93 T
• Bei 30 % Entladung von Cch während tdis
tdis = 0,88 T
Wobei: tdis
Entladezeit von Cch zwischen zwei positiven Halbwellen
[s]
Ud
Spannungsabfall an einer Gleichrichterdiode
[V]
Ur
Mindest-Spannungsdifferenz zwischen Eingang und Ausgang des Spannungsreglers
[V]
Ureg Nenn-Ausgangsspannung des Spannungsreglers
[V]
T
[s]
Netzperiode
Abb. 7.4: Halbwellen-Gleichrichtung mit Spannungsregler
256
Kapitel 7: Stromversorgung
Abbildung 7.5 zeigt zwei Schaltungen mit Vollweggleichrichtung. Für die obere Schaltung mit vier Dioden ist die notwendige Sekundärspannung Usec des Transformators unter voller Last: 8VHFPLQ
,$0$' Û Ë Ì8UHJ 8U + 8G + WGLV Ü &FKPLQ Ý Í
Für die untere Schaltung mit dem mittelangezapften Transformator wird Ud in der Gleichung nur mit 1 multipliziert (1 Ud). Die Entladezeit tdis des Ladekondensators Cch ist dabei: • Bei 10 % Entladung von Cch während tdis
tdis = 0,43 T
• Bei 30 % Entladung von Cch während tdis
tdis = 0,38 T
Abb. 7.5: Vollwellengleichrichtung mit einem Spannungsregler
Die Schaltung für zwei Ausgangsspannungen wie z.B. in Abbildung 7.8 kann selbstverständlich auch mit einem Netztrafo verwendet werden.
7.3.2
Kondensatornetzteile
Applikationen die keine Isolation vom Netz benötigen – wie z.B. Elektrizitätszähler – können ein Kondensatornetzteil verwenden: Der teure Netztransformator wird nicht benötigt, der Serienkondensator Cm muss allerdings eine hohe Nennspannung haben, da er für die möglichen Spannungsspitzen auf dem Netz ausgelegt sein muss. Die Impedanz des Serienkondensators Cm wird als Vorwiderstand verwendet. Das bedeutet relativ geringe Verluste, die Wirkleistungsverluste sind auf den Schutzwiderstand Rm beschränkt, der in Reihe mit dem Kondensator Cm liegt.
7.3 Netzgespeiste MSP430-Systeme
257
Dieser Schutzwiderstand ist notwendig, um die Stromspitzen, verursacht durch Spannungsspitzen und hochfrequente Netzspannungsanteile, zu begrenzen.
Abb. 7.6: Prinzipschaltbild eines Kondensatornetzteiles
Der Strom Imains durch den Kondensator Cm ist: ,PDLQV =
8PDLQV + 5P Mw &P
8PDLQV + 5P w &P
Wobei: Umains
Netzspannung
[V]
fmains
Netzfrequenz = 1/T
[Hz]
w
Kreisfrequenz der Netzfrequenz w = 2pf
[1/s]
Cm
Serienkondensator
[F]
Rm
Serienwiderstand
[W]
Die obige Näherungsformel ist für geringe Ausgangsspannungen gedacht (< 5 % der Netzspannung Umains). Für einen Gleichstrom IAM ist der notwendige Strom Imains:
,PDLQV ,$0
p
= ,$0
Der Kondensator Cm hat die Mindestgröße: &PPLQ
p IPDLQVPLQ Ë 8PDLQVPLQ Û Ì Ü - 5PPD[ Ì p ,$0$' Ü Í Ý
Die obigen Formeln sind für alle nachfolgend gezeigten Kondensatornetzteile gültig.
258
Kapitel 7: Stromversorgung
Der Schutzwiderstand Rm für einen maximalen Strom Imax , der durch eine Spannungsspitze Uspike verursacht wird, ist: 8VSLNH ,PD[
5P
Der Ladekondensator Cch muss eine Mindestkapazität haben: &FKPLQ
,$0$' 7 D8FK
Abbildung 7.7 zeigt das einfachste Kondensatornetzteil: Die Zenerdiode die für die Begrenzung der Spannung des Ladekondensators verwendet wird, wird auch für die Spannungsregelung verwendet. Der Spitzen-Spitzenwert der Brummspannung Unpp auf der Spannung Vcc ist: 8QSS ,$0$'
7 &FK
Die Spannung UZ der Zenerdiode Dz ist: 8= 9FF + 8G
Der Ladekondensator Cch wird wie weiter oben angegeben berechnet.
Abb. 7.7: Einfaches Kondensatornetzteil für eine Spannung
Auch Applikationen, die zwei Ausgangsspannungen benötigen, können Kondensatornetzteile verwenden. Abbildung 7.8 zeigt ein solches Netzteil für +1,5 V und -1,5 V, das in einer ganz anderen Weise realisiert ist. Es kann durch die beiden Transistoren relativ hohe Ströme liefern. Braucht man die hohen Ströme nicht, lässt man die Transistoren weg und schließt die Lasten direkt an die Opamp-Ausgänge an. Die Referenz für beide Spannungen ist eine Referenzdiode LMx85: Die hochstabilen 1,25 V
259
7.4 Speisung aus anderen System-Gleichspannungen
dieser Diode werden für die 1,5 V mit 1,2 multipliziert und mit -2,2 für die negative Spannung –1,5 V. Die notwendige Zenerspannung UZ der beiden Dioden Dz ist: 8=
Wobei UBE Uom
9FF
+ 8%( + (9FF - 8RP ) + 7
,$0$' &FKPLQ
Basis-Emitter-Spannung eines Transistors
[V]
Spitzenausgangsspannung des Opamp bei UC
[V]
Die beiden Ladekondensatoren Cch müssen eine Mindestkapazität haben: &FKPLQ
,$0 7 D8FK
Abb. 7.8: Kondensatornetzteil für zwei Ausgangsspannungen
Das Netzteil in Abbildung 7.8 erlaubt symmetrischen Anschluss von Eingangsspannungen für den Analog-Digital-Wandler. Der Analogeingang A0 misst die Mittelspannung 0 V, die für die Offsetkompensation der anderen Analogeingänge verwendet wird.
7.4
Speisung aus anderen System-Gleichspannungen
Gleichspannungen wie z.B. +5 V, +12 V oder +24 V, die im gesteuerten System ohnehin vorhanden sind, können auch für die Versorgung des MSP430 verwen-
260
Kapitel 7: Stromversorgung
det werden. Durch seine niedrige Stromaufnahme wird nur eine sehr geringe Leistung in der Spannungsversorgung für Vcc verbraucht. Falls Relais und andere leistungsverbrauchende Peripherie versorgt werden müssen, dann kann das aus der System-Gleichspannung USYS erfolgen. Das hat zwei Vorteile: • Die Schaltspitzen werden außerhalb der MSP430-Speisung erzeugt. • Die Leistung der geschalteten Peripherie erhöht nicht die Leistung der Spannungsregelung für den MSP430. Abbildung 7.9 zeigt drei verschiedene Möglichkeiten, um ein MSP430-System von existierenden +12 V (oder +5 V bzw. +24 V) zu speisen.
Abb. 7.9: Speisung aus der vorhandenen Systemspeisung USYS
Anmerkung: Alle Schaltungen können natürlich auch für Vcc = 2,2 V – oder eine andere Spannung – ausgelegt werden.
Zenerdiode Eine einfache Schaltung eines Serienwiderstandes Rv mit einer Zenerdiode Dz liefert eine Ausgangsspannung von +3 V oder +2,2 V. Der Widerstand Rv ist: 5YPD[
IRACM|IRACL ; MPYV CLR IRACL ; 0 -> LSBs des Resultats CLR IRACM ; 0 -> MSBs des Resultats ; ; "Multiply and accumulate"-Subroutine mit Vorzeichen: ; (IROP1 x IROP2L) + IRACM|IRACL -> IRACM|IRACL ; MACV TST IROP1 ; Multiplikator negativ? JGE L$001 SUB IROP2L,IRACM ; Ja, Resultat korrigieren L$001 TST IROP2L ; Multiplikand negativ? JGE MACU SUB IROP1,IRACM ; Ja, Resultat korrigieren JMP MACU ; Zur MAC-SR ohne Vorzeichen ; ; Multiplikation ohne Vorzeichen MPYU
CLR CLR
IRACL IRACM
; 0 -> LSBs Resultat ; 0 -> MSBs Resultat
; ; "Multiply and accumulate"-Subroutine ohne Vorzeichen: ; (IROP1 x IROP2L) + IRACM|IRACL -> IRACM|IRACL ; MACU CLR IROP2M ; MSBs Multiplikand L$002 BIT #1,IROP1 ; Teste akt. Bit (im LSB) JZ L$01 ; Falls 0: Nichts tun ADD IROP2L,IRACL ; 1: Multiplikand addieren ADDC IROP2M,IRACM L$01 RLA IROP2L ; Multiplikand IROP2 x 2 RLC IROP2M ; RRC IROP1 ; Naechstes IROP1-Bit ins LSB JNZ L$002 ; IROP1 = 0: Ende Multipl. RET
Beispiele: Die Aufrufe für die vier Multiplikationssubroutinen sind gleich. MOV MOV CALL ...
Op1,IROP1 Op2,IROP2L #Mxxx
; ; ; ;
Multiplikator mit Op1 laden Multiplikand mit Op2 laden MPYV, MPYU, MACV oder MACU IRACM|IRACL
272
Kapitel 8: Software
Auch 8-Bit-Multiplikationen lassen sich mit der Subroutine ausführen: MPYU8
; MACU8
; MPYV8
MACV8
MOV.B MOV.B CALL ...
Op1,IROP1 Op2,IROP2L #MPYU
; ; ; ;
Multiplikator laden 00xx Multiplikand laden 00yy Aufruf 16x16-Bit-Subroutine 16-Bit-Resultat in IRACL
MOV.B MOV.B CALL ...
Op1,IROP1 Op2,IROP2L #MACU
; ; ; ;
Multiplikator laden 00xx Multiplikand laden 00yy Aufruf 16x16-Bit-Subroutine Resultat in IRACM|IRACL
MOV.B SXT MOV.B SXT CALL ...
Op1,IROP1 IROP1 Op2,IROP2L IROP2L #MPYV
; ; ; ; ; ;
Multiplikator laden 00xx Vorz. Bit 7 -> Bits 8..15 Multiplikand laden 00yy Vorz. Bit 7 -> Bits 8..15 Aufruf 16x16-Bit-Subroutine IRACM|IRACL
MOV.B SXT MOV.B SXT CALL ...
Op1,IROP1 IROP1 Op2,IROP2L IROP2L #MACV
; ; ; ; ; ;
Multiplikator laden 00xx Vorz. Bit 7 -> Bits 8..15 Multiplikand laden 00yy Vorz. Bit 7 -> Bits 8..15 Aufruf 16x16-Bit-Subroutine IRACM|IRACL
Auch Mischformen sind möglich. Der nächste Subroutinenaufruf multipliziert einen 8-Bit-Wert Op1 mit einem 16-Bit-Wert Op2 (beide vorzeichenbehaftet). MPYSM
8.3.4
MOV.B SXT MOV CALL ...
Op1,IROP1 IROP1 Op2,IROP2L #MPYV
; ; ; ; ;
Multiplikator laden 00xx Vorz. Bit 7 -> Bits 8..15 Multiplikand laden yyyy Aufruf 16x16-Bit-Subroutine IRACM|IRACL
Schnelle Quadrierung
Für manche Berechnungen – wie z.B. für die Ermittlung des Effektivwertes einer Größe – ist die schnelle Quadrierung eines gemessenen Wertes notwendig. Die Rechenzeit der MSP430-CPU ist normalerweise ausreichend, um diesen Wert zu berechnen, falls aber nicht, sind zwei Lösungen möglich: • Der Hardware-Multiplizierer der großen MSP430-Familienmitglieder wird benutzt. Die Multiplikation dauert nur noch sechs MCLK-Zyklen (die Zeit, um die beiden Multiplizierer-Register zu laden). • Es wird eine Tabelle benutzt, die das Resultat von quadrierten 7-Bit-Zahlen enthält. Die Software nimmt die sieben MSBs eines gemessenen 12-BitADC12-Resultats und benutzt diesen Wert als Offset zu einer Worttabelle mit den quadrierten Werten.
8.3 Integer-Rechenroutinen
273
Die Software für die zweite Lösung wird gezeigt. Die angegebenen Zyklen beinhalten das Schreiben des ADC12-Resultats in R5. Der errechnete 16-Bit-Wert ist gegenüber dem korrekten 32-Bit-Wert um den Faktor 256 zu klein. Nimmt man nur den Wert der 16 MSBs, dann ist das Ergebnis um den Faktor 256 zu groß. Die Auflösung ist also wesentlich verbessert. ; Quadrierung der 7 MSBs fuer einen vorzeichenlosen ; 12-Bit-Wert 0 bis FFFh ; MOV &ADC12MEMx,R5 ; ADC12-Resultat in R5 ; ; Schnelle, vorzeichenlose Quadrierung einer 12-Bit-Zahl ; RLA R5 ; 12-Bits in 15-Bit wandeln RLA R5 RLA R5 ; 0...FFFh in 0...7FF8h SWPB R5 ; MSBs in LSBs RLA.B R5 ; Zahl x 2 (Worttabelle) ; ; R5 enthaelt jetzt den Offset zur Tabelle SQTAB. ; Erste Moeglichkeit: Quadrierten Wert in R6 schreiben. ; 11 MCLK-Zyklen ; MOV SQTAB(R5),R6 ; Quadrat in R6 ; ; Zweite Moeglichkeit: Quadrierten Wert in SQSUM ; (32 Bit) aufsummieren. Falls Arbeitsregister fuer ; SQSUM verwendet werden: insgesamt 15 Zyklen. ; ADD SQTAB(R5),SQSUM ;Addiere MSBs^2 zu LSBs ADC SQSUM+2 ; Add. C zu MSBs von SQSUM ... ; Weiter im Programm ;--------; Tabelle mit quadrierten Werten. 128 Worte werden benutzt. ; Jedes Wort repraesentiert den Bereich von xxx.xxxx.0000b ; bis xxx.xxxx.xxxxb. Der Wert der Mitte des Bereiches ; (xxx.xxxx.1000b) wird berechnet. ; SQTAB dw ($-SQTAB+1)*($-SQTAB+1) ; 0.5 x 0.5 dw ($-SQTAB+1)*($-SQTAB+1) ; 1.5 x 1.5 dw ($-SQTAB+1)*($-SQTAB+1) ; 2.5 x 2.5 ... ; 3.5^2..07D.8^2 dw ($-SQTAB+1)*($-SQTAB+1) ; 07E.8h x 07E.8h dw ($-SQTAB+1)*($-SQTAB+1) ; 07F.8h x 07F.8h
Die Fehler für eine einzelne Quadrierung sind im Bereich von ungefähr 1 %, falls aber mehrere Quadrierungen aufsummiert werden, wird der Fehler viel kleiner, da in der Tabelle Rundung benutzt wird. Wenn z.B. eine sinusförmige Eingangsspannung in Abständen von 15 gemessen wird, dann entsteht ein Summenfehler von weniger als 0,24 %.
274
Kapitel 8: Software
Weitere Information: Das Kapitel »Integer Calculation Subroutines« in [1] enthält weitere IntegerRoutinen insbesondere: • Multiplikationsroutinen für 8 Bit (mit und ohne Vorzeichen) • Divisionsroutinen (mit und ohne Vorzeichen, 32 Bit geteilt durch 16 Bit) • Vergleichsroutinen (mit und ohne Vorzeichen, 32 Bit und 16 Bit)
8.4
Gleitkommapaket FPP4
Für die MSP430-Familie gibt es ein Gleitkommapaket, das für komplexe Berechnungen ideal geeignet ist. Es ist nicht nach den IEEE-Richtlinien geschrieben, da es für schnelle Echtzeit-Anwendungen gedacht ist: Das IEEE-Format ist zuviel mit den zahlreichen Ausnahmen (Not a Number, Denormalized, Infinity) beschäftigt, als dass es schnell sein könnte.
8.4.1
Beschreibung des FPP4
Das Gleitkommapaket besteht aus vier Dateien, die alle sowohl das 32-Bit-Format (.float) als auch das 48-Bit-Format (.double) unterstützen: FPPDEF4.s43:
Die Definitionen für das Gleitkommapaket.
FPP04.s43:
Die Grundrechenarten Addition, Subtraktion, Multiplikation, Division und Vergleich.
CNV04.s43:
Die Umwandlungsroutinen in das binäre Format und in das BCD-Format. Beide Umwandlungsrichtungen werden unterstützt.
FPPFNC4.s43:
Die Winkelfunktionen und die logarithmischen, hyperbolischen und exponentiellen Funktionen. Dazu die jeweiligen Umkehrfunktionen.
Drei Variablen definieren, wie das Gleitkommapaket arbeiten soll: • Die Variable DOUBLE definiert, welches Format benutzt werden soll: DOUBLE = 0:
32-Bit-Format .float mit 24-Bit-Mantisse
DOUBLE = 1:
48-Bit-Format .double mit 40-Bit-Mantisse
• Die Variable SW_UFLOW definiert das Verhalten bei Ergebnissen, die kleiner sind als die kleinste darstellbare Zahl 2,938736 10-39 (software underflow):
8.4 Gleitkommapaket FPP4
275
SW_UFLOW = 0:
Software underflow (das Resultat ist Null) wird nicht als Fehler behandelt (das Bit N im Status Register wird nicht gesetzt)
SW_UFLOW = 1:
Software underflow wird als Fehler behandelt (das Bit N wird gesetzt)
• DieVariable HW_MPY definiert, ob der Hardware-Multiplizierer in der Multiplikationssubroutine verwendet wird oder nicht: HW_MPY = 0:
Keine Verwendung. Die Multiplikation wird mit einer Softwareschleife durchgeführt
HW_MPY = 1:
Der 16 16-Bit-Hardware-Multiplizierer wird verwendet
Die beiden Gleitkommaformate bestehen aus folgenden Teilen: • Die 8 MSBs repräsentieren den Exponenten • Die 24 bzw. 40 LSBs enthalten das Vorzeichen und die Mantisse
Abb. 8.2: Die beiden Gleitkommaformate des FPP4
Der Wert N einer Gleitkommazahl ist: N = ( -1) Sm M 2 E Anmerkung: Die einzige Ausnahme zu der letzten Gleichung ist die Zahl Null: Sie wird durch 32 bzw. 48 Nullbits dargestellt. Es existiert keine negative Null, die ihr entsprechende Zahl 0080h,0000h ist eine gültige von Null abweichende Zahl: Die kleinste negative Zahl (-2,938736 10-39).
Der Zahlenbereich des Gleitkommapakets ist 3.402823 1038.
2.938736 10-39
bis
276
Kapitel 8: Software
Die Auflösung (Zahlenwert des LSBs der Mantisse) in Abhängigkeit vom Exponenten E ist: .float
2-23 2E = 119,2093 10-9 2E
.double 2-39 2E = 1,818989 10-12 2E Es wird oft gefragt, warum das FPP4-Gleitkommaformat nicht konform zu dem bekannten IEEE-Format ist. Drei Gründe sind dafür verantwortlich: • Der MSP430 wird häufig in Echtzeit-Anwendungen benutzt, in denen die Berechnungen für die letzten Daten abgeschlossen sein müssen, wenn die nächsten Daten präsent sind. • Batteriegespeiste Applikationen benötigen kurze Rechenzeiten, um eine Batterielebensdauer von 10 Jahren und länger zu erreichen. • In vielen Anwendungen ist der Programmspeicherplatz begrenzt (2 Kbyte, 4 Kbyte): Das Gleitkommapaket darf dann keinen großen Umfang haben. Diese drei Hauptgründe machen ein Laufzeit- und Speicherplatz-optimiertes Gleitkommapaket notwendig. Das Format der Zahlendarstellung spielt dabei eine wichtige Rolle, um dieses Ziel zu erreichen: • Beim MSP430-Format stellt jede der 232 bzw. 248 Bitkombinationen eine gültige Gleitkommazahl dar. Es existieren keine ungültigen Kombinationen wie »Not a Number«, »Denormalized Number« oder »Infinity«. Dadurch hat das MSP430-Format einen größeren Zahlenbereich als das IEEE-Format und eine höhere Verarbeitungsgeschwindigkeit bei kleinerem Speicherbereich. All dies hauptsächlich durch die unnötigen Prüfungen, ob eine Zahl gültig ist. • Der Exponent des IEEE-Formats ist auf zwei Bytes verteilt, da das Vorzeichen der Gleitkommazahl im MSB des oberen Bytes enthalten ist. Beim MSP430-Format ist der Exponent vollständig im oberen Byte des ersten Wortes enthalten. Dadurch können die Vorteile der Byte-orientierten Architektur des MSP430 voll ausgenutzt werden: Es sind keine Schiebe- oder Bitoperationen notwendig, um den Exponenten zu manipulieren. Die beiden Arbeitsregister, welche die Zeiger auf die Operanden enthalten, heißen: RPRES
Zeiger auf den Operanden 1 und das Resultat
RPARG
Zeiger auf den Operanden 2 und das Resultat.
Das Gleitkommapaket unterstützt die folgenden Funktionen: Funktionen in FPP04.s43 (Operand 1 und Operand 2 adressieren die Operanden): FLT_ADD
Addition
FLT_SUB
Subtraktion (Operand 1 – Operand 2)
FLT_MUL
Multiplikation
8.4 Gleitkommapaket FPP4
277
FLT_DIV
Division
(Operand 1/Operand 2)
FLT_CMP
Vergleich von FPP4-Zahlen (Operand 1 – Operand 2)
FLT_SAV
Retten der verwendeten Arbeitsregister auf dem Stack
FLT_REC
Restaurieren der verwendeten Arbeitsregister vom Stack
Umwandlungsfunktionen in CNV04.s43 (Operand 2 adressiert den Operanden): CNV_BINxxx
Binärzahl in Gleitkommaformat (mehrere Subroutinen)
CNV_BCD_FP BCD-Zahl in Gleitkommaformat CNV_FP_BIN
Gleitkommaformat in binäre Zahl
CNV_FP_BCD Gleitkommaformat in BCD-Zahl Funktionen in FPPFNC4.s43: (Operand 2 adressiert den Operanden) FLT_SIN
Sinus
FLT_SINH
Hyperbolischer Sinus
FLT_COS
Cosinus
FLT_COSH
Hyperbolischer Cosinus
FLT_TAN
Tangens
FLT_TANH
Hyperbolischer Tangens
FLT_COT
Cotangens
FLT_COTH
Hyperbolischer Cotangens
FLT_LN
Natürlicher Logarithmus
FLT_EXP
Exponentialfunktion
FLT_POWR
AB-Funktion (Operand 1)Operand 2
FLT_SQRT
Quadratwurzel
FLT_CBRT
Kubikwurzel
FLT_RNG
Reduktion eines Winkels in den Bereich p
FLT_INTG
Integer-Teil einer Zahl
FLT_FRCT
Fraktionsteil (hinter dem Dezimalpunkt) einer Zahl
(MIWIR7YFVSYXMRIRMWX*SPKIRHIWKIQIMRWEQ • Die Zeiger RPARG und RPRES zeigen auf die Adressen der MSBs der Operanden. • Die Operanden werden nicht verändert, außer, das Resultat der letzten Operation (auf dem Stack) wird als Operand benutzt. • Das Resultat steht auf dem Stack (TOS), der Stack Pointer SP, RPARG und RPRES zeigen auf die MSBs des Resultats. • Jede Gleitkommaoperation ergibt eine gültige Gleitkommazahl, die unmittelbar von der nächsten Operation verwendet werden kann.
278
Kapitel 8: Software
• Falls ein Resultat zu groß ist – also den Zahlenbereich überschreitet – wird die größte darstellbare Zahl mit dem richtigen Vorzeichen ausgegeben. Auch eine Fehleranzeige wird gemacht: Das N-Bit im Status Register ist gesetzt. • Die Arbeitsregister der CPU werden benutzt und verändert, sie enthalten nach der Rückkehr aber keine notwendige Information für die nächste Operation. Das bedeutet, dass die Arbeitsregister zwischen den Gleitkommaoperationen für andere Zwecke benutzt werden können. • Bei allen Gleitkommaoperationen sind zwei Bits (Guard Bits) vorhanden, die bei der abschließenden Normalisierung der Gleitkommazahl bei Bedarf in die Mantisse eingeschoben werden. Diese Bits werden auch für die Rundung der Mantisse verwendet. Es wird also immer mit der höchstmöglichen Genauigkeit gearbeitet und nicht einfach Nullbits eingeschoben. • Die Berechnungen der trigonometrischen Funktionen erfolgen in Radians [rad]. Beispiel für das FPP4-Programm Das Beispiel zeigt folgende Programmschritte für eine Berechnung im .floatFormat: 1. Die benutzten Arbeitsregister R5 bis R12 werden auf dem Stack gespeichert. 2. Vier Bytes auf dem Stack werden für die Resultate der Berechnungen reserviert. 3. Die Adresse eines 12-stelligen BCD-Buffers wird in den Zeiger RPARG geladen und die BCD-in-Gleitkommaformat-Umwandlung wird gerufen. Die resultierende Gleitkommazahl wird auf den Stack geschrieben. 4. Das Resultat wird mit einer Gleitkommazahl in der Adresse VAL3 multipliziert. RPARG zeigt auf diese Adresse. 5. Zum Resultat der Multiplikation wird eine Zahl in der Adresse VAL4 addiert. 6. Das Resultat wird in BCD-Format zurückgewandelt (sechs Bytes mit 12 BCD-Zahlen), das in der LCD-Anzeige dargestellt werden kann. 7. Das Endresultat wird in den RAM-Adressen BCDMSD, BCDMID und BCDLSB gespeichert. Die drei notwendigen POP-Befehle korrigieren den Stack Pointer auf den Wert nach den anfangs gespeicherten Arbeitsregistern. Die benutzten Arbeitsregister werden vom Stack her restauriert. Sie enthalten danach die gleichen Werte wie vor den Gleitkommaoperationen. DOUBLE ;
equ
0
; 32-Bit-Format: .float
... CALL SUB
#FLT_SAV #FPL,SP
; Normales Programm ; Register R5 bis R12 retten ; Stack-Platz fuer Resultat
8.4 Gleitkommapaket FPP4 MOV CALL ; ; Berechnung: ; MOV CALL MOV CALL CALL JN POP POP POP CALL ... VAL3 VAL4 ; CNVERR
8.4.2
#BCDB,RPARG #CNV_BCD_FP
279
; Adresse MSDs BCD-Buffer ; BCD-Zahl in FPP convert.
(BCD-Zahl x VAL3) + VAL4 #VAL3,RPARG #FLT_MUL #VAL4,RPARG #FLT_ADD #CNV_FP_BCD CNVERR BCDMSD BCDMID BCDLSD #FLT_REC
; ; ; ; ; ; ; ; ; ; ; ;
Adresse des Slope laden VAL3 x BCD-Zahl Adresse des Offset laden (VAL3 x BCD-Zahl) + VAL4 FPP-Resultat in BCD Resultat zu gross BCD-Zahl MSDs und Vorz. BCD-Zahl MSD-4 bis LSD+4 BCD-Zahl LSD+3 bis LSD Stack korr. durch POPs R5 bis R12 restaurieren Weiter im Programm
.float -1.2345 .float 14.4567
; Slope ; Offset
...
; Start Fehlerbehandlung
Installation des Gleitkommapaketes FPP4
Die Installation des Gleitkommapaketes FPP4 von der MSP430-CD in die Datei C:\TEST besteht aus folgenden Schritten: • Die MSP430-CD (SLAC001) in das CD-Laufwerk einlegen und das Laufwerk schließen • Der »Internet Browser« startet. • Die Titelseite der MSP430-CD erscheint. • Die Schaltfläche »Tools Software« am linken Rand anklicken: Die Seite mit den vorhandenen Softwarewerkzeugen erscheint. • »MSP-FPP430V413« im Feld »Additional Software« 2x anklicken. • Warten, bis das Dialogfeld »Save As« erscheint: In das Feld »File« die Eingabe C:\TEST machen. »Save« anklicken. »Saving Location« erscheint: Die Datei FPP413.exe wird in den Ordner C:\TEST kopiert. • Falls der Ordner C:\TEST noch nicht existiert: Die Erstellung ist im Kapitel »Das IAR-Entwicklungswerkzeug, Inbetriebnahme« beschrieben. • Den »Internet Browser« mit »File« »Exit« verlassen. • »Start« »Run« eingeben. C:\TEST\FPP413.exe in das Feld »Open« eingeben. Die Schaltfläche »Ok« anklicken.
280
Kapitel 8: Software
• Warten, bis das Dialogfenster »WinZipSelf-Extractor – FPP413.exe« erscheint. • C:\TEST in das Feld »Unzip to folder« eingeben. Die Schaltfläche »Unzip« anklicken. • Eine Meldung über erfolgreichen Abschluss erscheint: »Ok« anklicken, dann»Close« anklicken. • Die vier Gleitkommadateien sind jetzt im Ordner C:\TEST\IAR\FPP413 enthalten. Die Datei FPP413.exe kann gelöscht werden. In dem Ordner C:\TEST\TI\FPP413 sind die Gleitkommaprogramme im (alten) TI-Format enthalten, zusammen mit vielen Beispielen.
8.4.3
Einsetzen des Gleitkommapaketes FPP4 in die Source
Die Definitionen des Gleitkommapaketes FPP4, die in der Datei FPPDEF4.s43 enthalten sind, müssen ganz am Beginn der Source stehen. Die drei Variablen HW_MPY, SW_UFLOW und SW_RND müssen immer definiert werden. Der Aufruf ist folgendermaßen (die Definitionen sollen nicht gedruckt werden): HW_MPY equ SW_UFLOW equ ; SW_RND equ
1 0 1
; HW-MPYer verwenden ; Kein Fehler falls das |Ergebnis| < 2,938736E-39 ist ; Runden bei den Konversionen
lstout; FPP4 Definitionen nicht drucken #include "C:\TEST\IAR\FPP413\FPPDEF4.s43" /* FPP4 Def. */ lstout+ ; Drucken wieder einschalten
Die drei anderen FPP4-Dateien können an beliebiger Stelle hinter den FPP4Definitionen stehen. Ein Beispiel ist in der MSP430F449 Quick Start Software gegeben: ; Die Subroutinen des Gleitkommapaketes FPP4 ; Die Definitionen sind am Beginn der Source ; lstout; FPP4-Routinen nicht drucken #include "C:\TEST\IAR\FPP413\FPP04.s43" /* Basisprogr. */ #include "C:\TEST\IAR\FPP413\CNV04.s43" /* Konversionen */ #include "C:\TEST\IAR\FPP413\FPPFNC4.s43" /* Funktionen */ lstout+ ; Drucken wieder einschalten
Selbstverständlich kann man die Sources des Gleitkommapaketes auch mit dem Editor in das Programm einsetzen. Aber auch hier müssen die Definitionen am Beginn der Source stehen.
8.5 Verwendung von Assembler-Software in C-Programmen
281
Anmerkung: Die beiden Dateien CNV04.s43 und FPPFNC4.s43 können in Anwendungen, in denen sie nicht benötigt werden, weggelassen werden. Die Minimalkonfiguration sind die beiden Dateien FPPDEF4.s43 und FPP04.s43.
Weitere Information: Das Kapitel »The Floating Point Package« in [1] enthält weitere Informationen insbesondere: • Ausführungszeiten der einzelnen Routinen • Benötigter Speicherplatz des Paketes in Abhängigkeit von den Variablen • Einbindung in die Benutzersoftware • Beispiele für die Anwendung • Genauigkeitsbetrachtungen für alle Routinen • Alle Routinen die in FPPFNC4.s43 enthalten sind Die Sources für die Grundrechnungsarten und die Umwandlungsroutinen sind in [2] Kapitel »The Floating Point Package« enthalten.
8.5
Verwendung von Assembler-Software in CProgrammen
Software in Assemblersprache hat den großen Vorteil, dass genau bekannt ist, was getan wird und dass sie dadurch mit der höchstmöglichen Geschwindigkeit arbeiten kann. Dies ist besonders von Vorteil, wenn schnelle Interrupt-Routinen notwendig sind. In diesem Kapitel wird beschrieben, wie man in Assemblersprache geschriebene Programme in C-Programme einbinden kann. Es handelt sich dabei um die Übersetzung einer Applikationsnotiz von Stefan Schauer/TID.
8.5.1
Austausch von Variablen zwischen C und Assembler Code
Register-Benutzung durch den IAR C-Compiler Der Compiler benutzt zwei Gruppen von Arbeitsregistern. • Die »Scratch Register« R12 bis R15 werden für die Übergabe von Parametern benutzt und werden daher normalerweise nicht gerettet. • Die anderen Arbeitsregister, R4 bis R11, werden hauptsächlich für RegisterVariable und Zwischenresultate benutzt und müssen daher gerettet werden. Dies wird von C automatisch durchgeführt.
282
Kapitel 8: Software
Anmerkung: Die –ur-Option verhindert das Retten der beiden Arbeitsregister R4 und R5.
Stack-Anordnung und Parameterübergabe
Abb. 8.3: Parameterübergabe in der C-Sprache
Parameter werden an eine Assemblerroutine von rechts nach links übergeben. Die beiden am weitesten links stehenden Parameter werden in Arbeitsregistern übergeben, außer sie haben eine »struct«- oder »union«-Struktur; in diesem Falle werden auch sie auf dem Stack übergeben. Die anderen Parameter werden immer auf dem Stack übergeben. Beispiel: Der folgende Aufruf übergibt vier Parameter an eine Assemblerroutine. f(w,x,y,z)
Da die Argumente von rechts nach links behandelt werden, wird das Argument z als erstes auf den Stack geladen, dann das Argument y. Das Argument x wird, abhängig von seinem Typ, entweder in R14, R15|R14, oder auf dem Stack übergeben. Ebenso Argument w. Das Resultat wird entweder in R12 (oder R13|R12 für einen 32-Bit-Typ, die MSBs sind in R13 enthalten) übergeben, bzw. in einer »Special Area« gespeichert, auf die R12 zeigt, wenn es eine »struct/union«-Struktur hat. Argument
< 32-Bit Typ
32-Bit Typ
struct/union
4. (z) 3. (y) 2. (x) 1. (w) Resultat
Auf dem Stack Auf dem Stack R14 R12 R12
Auf dem Stack Auf dem Stack R15|R14 R13|R12 R13|R12
Auf dem Stack Auf dem Stack Auf dem Stack Auf dem Stack Special Area
Tabelle 8.1: Anordnung von übergebenen Parametern:
8.5 Verwendung von Assembler-Software in C-Programmen
283
Interrupt-Funktionen Interrupt-Funktionen die in C geschrieben sind, retten die »Scratch Register« automatisch. Ebenso die Arbeitsregister R4 bis R11. Das Status Register SR wird durch den Interrupt-Aufruf gerettet. Die von der Interrupt-Routine benutzten Arbeitsregister werden dann durch »PUSH Rx«-Befehle gerettet. Bei der Rückkehr vom Interrupt werden diese Register durch »POP Rx«-Befehle restauriert und der RETI-Befehl wird benutzt, um das Status Register zu restaurieren und vom Interrupt zurückzukehren. Funktionen die in Assemblersprache geschrieben sind, müssen dies beachten.
8.5.2
Aufruf von Assemblerroutinen von C-Programmen aus
Eine Assemblerroutine, die von einem C-Programm aufgerufen werden kann, muss folgende Eigenschaften haben: • Übereinstimmung mit den zuvor genannten Aufrufbedingungen. • Ein PUBLIC-Label muss vorhanden sein. • Sie muss vor einem Aufruf als »external« erklärt sein, um eine Typenprüfung und eine optionale Einführung von Parametern zu erlauben, wie z.B in »extern int foo()« oder »extern int foo(int i, int j)«.
Lokale Speicherplatzzuordnung Falls die Assemblerroutine Speicherplatz benötigt, kann das wie folgt geschehen: • Auf dem Stack. • Im »Static Workspace«, falls die Routine nicht »reentrant« sein muss. Funktionen können R12 bis R15 immer ohne sie zu retten verwenden. R6 bis R11 können verwendet werden, wenn sie zuvor auf dem Stack gerettet wurden. R4 und R5 sollen nicht verwendet werden, um ROM-Monitor-kompatiblen Code zu haben. Wenn der C-Code mit -ur45 compiliert wurde, und die Applikation nicht mit dem ROM-Monitor arbeitet, dann kann man R4 und R5 in der Assemblerroutine verwenden, ohne sie zu retten, da der C-Code sie nicht verwendet.
Interrupt-Funktionen Die obige Aufrufkonvention kann nicht für Interrupt-Funktionen verwendet werden, da der Interrupt während des Aufrufs einer Foreground-Funktion geschehen
284
Kapitel 8: Software
kann. Daher unterscheiden sich die Anforderungen für Interrupt-Funktionsroutinen von denen für eine normale Funktionsroutine: • Die Routine muss alle benutzten Arbeitsregister – einschließlich der »Scratch Registers« R12 bis R15 – retten. • Die Routine muss mit dem Befehl RETI enden. • Die Routine muss alle Flags als undefiniert behandeln.
Definition von Interrupt-Vektoren Als eine Alternative zur Definition einer C-Interrupt-Funktion in Assemblersprache wie zuvor beschrieben, kann man eine Interrupt-Routine assemblieren und die Startadresse direkt in den Interrupt-Vektor schreiben. Die Interrupt-Vektoren sind im INTVEC-Segment enthalten.
8.5.3
Softwarebeispiele
Es folgen drei Softwarebeispiele für die Einbindung von in Assemblersprache geschriebenen Programmteilen in C-Software. Drei unterschiedliche Anwendungen werden behandelt. Die drei Beispiele wurden nicht übersetzt, da sie selbsterklärend sind. Beispiel: Aufruf einer Assembler-Code-Funktion von einem C-Programm aus, ohne Übergabe von Parametern und ohne Resultat bei der Rückkehr. Das Beispiel verwendet eine Assemblerfunktion um den I/O-Pin P1.0 hin- und herzuschalten. C-Code für den Aufruf einer Assemblerfunktion: /*******************************************************/ /* example1.c 2001-02-18 */ /* */ /* Mixing C and Assembler Code */ /* */ /* This software demonstrates how C and Assembler Code */ /* could be mixed to get the optimum of both */ /* programming languages */ /* */ /* Note: project must include assembly file: Port1.s43 */ /* */ /* */ /* Texas Instruments Incorporated */ /* Stefan Schauer */ /*******************************************************/ #include <MSP430x44x.h> /* Processor definitions */
8.5 Verwendung von Assembler-Software in C-Programmen
285
/* ------------external Function Prototypes ---------- */ extern void set_port(void); /* Function Prototype for asm function */
/*******************************************************/ /* main */ /*******************************************************/ void main( void ) { // === Initialize system =============================== IFG1=0; /* clear interrupt flag1 */ WDTCTL=0x5A80; /* stop WD */ P1DIR = 0x01; while(1) { set_port(); } } // === end of main =====================================
Die aufgerufene Assemblerfunktion um den Pin P1.0 hin – und herzuschalten: ; ; ; ; ; ; ; ; ; ;
****************************************************** File: Port1.s43 Author: Stefan Schauer, Texas Instruments Deutschland Date: 18. Feb 2001 Routines to get and set the Port 1 accessed out of C as standard extern Calls (see "Example1.c"): ******************************************************** #include "msp430x44x.h" ; Processor definitions NAME
Port1
EXTERN rand ;========================================================= ; set_port ;========================================================= PUBLIC RSEG set_port; xor.b ret END
set_port ; Declare symbol to be exported CODE ; Code is relocatable #01h,&P1OUT ; Toggle bit 1 Port1 output
286
Kapitel 8: Software
Beispiel: In diesem Beispiel ruft die Assemblerfunktion die Standard C Library Function rand(). Diese Funktion hat als Resultat eine Zufallszahl. Das Ergebnis wird mit 25 multipliziert (und damit in den Bereich 0..25 gebracht) und das Resultat in den I/O-Port1 geschrieben. C-Code der eine Assemblerfunktion aufruft, die eine C-Funktion aufruft: /*********************************************************/ /* example3.c 2001-02-18 */ /* */ /* Mixing C and Assembler Code */ /* */ /* This software demonstrates how C and Assembler Code */ /* could be mixed to get the optimum of both programming */ /* languages */ /* */ /* Note: project must include assembly file "port1.s43" */ /* */ /* */ /* Texas Instruments Incorporated */ /* Stefan Schauer */ /*********************************************************/ #include <MSP430x44x.h> /* Specific definitions */ /* -------------------external Function Prototypes ------*/ extern void set_port_rand(void);/* Function Prototype for asm function */
/*********************************************************/ /* main */ /*********************************************************/ void main( void ) { // === Initialize system ================================ IFG1=0; /* clear interrupt flag1 */ WDTCTL=0x5A80; /* stop WD */ P1DIR = 0xFF; /* all ports of P1.x are output*/ while(1) /* Infinite loop*/ { set_port_rand() ; /* Move rand() value to port 1 */ } } // === end of main ====================================== /*********************************************************/ /* mult */ /*********************************************************/ unsigned long mult(unsigned int x , unsigned int y)
8.5 Verwendung von Assembler-Software in C-Programmen
287
{ return ( x * y);
/* multiply x * y */
} // === end of mult ======================================
Die Assemblerfunktion, die eine C-Funktion aufruft: ;******************************************************** ; File: Port1.s43 ; Author: Stefan Schauer, Texas Instruments Deutschland ; Date: 18. Feb 2001 ; ; Routines to get and set the Port 1 ; accessed out of C as standard extern Calls ; (see ; "Example3.c"): ; ; ********************************************************* #include "msp430x44x.h"
; Specific definitions
NAME
Port1
EXTERN
rand
; Std C function
EXTERN
mult
; function in example3.c
;========================================================= ; set_port_rand ;========================================================= PUBLIC RSEG set_port_rand; call
set_port_rand ; Declare symbol exported CODE ; Code is relocatable #rand
; Call rand(): stored at R12
mov #25,R14 ; 2nd operand -> R14 ; ; 1st operand -> R12 from rand() function ; call #mult ; return in R12 / R13 mov.b R13,&P1OUT ; Move low byte R13 to Port1 ret ; Random number 0 to 25 END
Beispiel: Das Beispiel zeigt eine Interrupt-Routine für den Timer_A. Durch ihre Struktur (Verwendung des Interrupt-Vektor-Registers TAIV) kann sie auch für den Timer_B und den Analog-Digital-Wandler ADC12 verwendet werden: Beide verwenden ebenfalls Interrupt-Vektor-Register für die Dekodierung des anstehenden Interrupts.
288
Kapitel 8: Software
C-Code für die Verwendung einer speziellen Interrupt-Routine: /********************************************************/ /* example5.c 2001-02-18 */ /* */ /* Mixing C and Assembler Code */ /* */ /* This software demonstrates how C and Assembler Code */ /* could be mixed to get the optimum of both */ /* programming languages */ /* */ /* Note: project must include assembly file "ta_int.s43"*/ /* */ /* */ /* Texas Instruments Incorporated */ /* Stefan Schauer */ /********************************************************/ #include <MSP430x44x.h> /* Specific definitions */ int Count; /********************************************************/ /* main */ /********************************************************/ void main( void ) { // === Initialize system ================================ IFG1=0; /* clear interrupt flag1 */ WDTCTL=0x5A80; /* stop WD */ P1DIR = 0x01; /* P1.0 is output */ TACTL = CCR1 = CCTL1 =
0x0204; 0x4000; 0x0010;
TACTL |= 0x0022;
/* CLK = SMCLK ; clear counter*/ /* Capture value for CCR1 */ /* enable CCR1 int */ /* start cont. up; enable TA int. */
_EINT(); while(1) { } } // === end of main====================================== /********************************************************/ /* TIMOVH_C */ /********************************************************/ interrupt void TIMOVH_C( void ) { Count ++;
8.5 Verwendung von Assembler-Software in C-Programmen } // === end of TIMOVH_C ==================================
/*******************************************************/ /* TIMMOD1_C */ /*******************************************************/ interrupt void TIMMOD1_C( void ) { P1OUT ^= 0x01; /* Toggle P1.0 */ } // === end of TIMMOD1_C =================================
Die in Assemblersprache geschriebene Interrupt-Routine für den Timer_A: ; ; ; ; ; ; ; ; ; ;
******************************************************* File: ta_int.s43 Autor: Stefan Schauer, Texas Instruments Deutschland Date: 18. Feb 2001 Routines to handle Timer A interrupt service accessed out of C as interrupt routine (see "Example5.h"): ******************************************************* NAME
TA_ISR
#include "msp430x44x.h"
; Definitions
; -------------------- external Function Prototypes ----EXTERN TIMOVH_C EXTERN TIMMOD1_C ;======================================================== ; ta_isr Timer_A Interrupt service ;======================================================== PUBLIC ta_isr ; Declare symbol to be exported RSEG CODE ; Code is relocatable ; Interrupt handler for Capture/Compare Modules 1 to 4. ; The interrupt flags CCIFGx and TAIFG are reset by ; hardware. Only the flag with the highest priority ; responsible for the interrupt vector word is reset. ; ta_isr ; Interrupt latency 6 cycles ADD &TAIV,PC ; Add offset to Jump table RETI ; Vector 0: No interrupt JMP TIMMOD1 ; Vector 2: Module 1 JMP TIMMOD2 ; Vector 4: Module 2 JMP TIMMOD3 ; Vector 6: N/A JMP TIMMOD4 ; Vector 8: N/A
289
290
Kapitel 8: Software
; Module 5. Timer Overflow Handler ; fall through TIMOVH JMP TIMOVH_C ; RETI
; Vector 10: TIMOV Flag ; Handle Timer Overflow in C ; is handled by the C function
TIMMOD1 ; Vector 2: Module 1 ; ; If JMP could not be executed through the limited ; jump width first jump to this position and then ; branch to the C function ; BR #TIMMOD1_C ; Handle CCR1 interrupt in C ; RETI ; is handled by the C function TIMMOD2 ; ; If all five CCR registers are not implemented on a ; device, the interrupt vectors for the register that ; are present must still be handled. ; TIMMOD3 TIMMOD4 RETI ; Simply return ;======================================================== COMMON INTVEC(1) ; Interrupt vectors ;======================================================== ORG DW
TIMERA1_VECTOR ta_isr
; Timer A CC1-2, TA
END
Weitere Informationen: [12] Applikationsnotiz »Mixing C and Assembler Code for the MSP430« Vollständige Applikationsnotiz mit weiteren Beispielen.
291
9
APPLIKATIONEN
Es werden einige typische Applikationen für den MSP430 gezeigt. Zwei davon sind nur durch den extrem niedrigen Stromverbrauch des MSP430 möglich (Gaszähler und elektronische Sicherung), eine davon nur durch die sehr hohe Rechenleistung (Elektrizitäts-Zähler). Beide Eigenschaften, zum Teil in einer Applikation vereint, machen auch andere Anwendungen möglich: • Digitale Steuerung für Elektromotoren (DMC) mit dem MSP430F14x bzw. MSP430F44x • Heizkostenverteiler • Wärmemengenzähler • Wasserzähler • Rauchmelder und andere sicherheitsrelevante Anwendungen • Alle Anwendungen, bei denen niedrige Stromaufnahme und/oder hohe Rechenleistung eine Rolle spielen Anmerkung: Für die als normale Ein- und Ausgänge verwendeten I/O-Pins sind keine definitiven Bezeichnungen wie z.B. P4.2 vergeben worden: Die Anordnung der externen Bauelemente auf der Schaltungsplatine entscheidet normalerweise, welcher I/O-Pin verwendet werden kann.
Weitere Anwendungsbeispiele sind in [1] und [2] in den Kapiteln »Application Examples« enthalten.
9.1
Dreiphasen-Elektrizitätszähler
Ein Dreiphasen-Elektrizitätszähler wird in Abbildung 9.2 gezeigt. Das zugehörige Netzteil mit den zwei Ausgangsspannungen 1,5 V ist in Abbildung 7.8 gezeigt. Die Messsequenz (Corrective Scan Principle) für diesen Elektrizitätszähler ist in Abbildung 9.1 zu sehen: Symmetrisch zu den Spannungsmessungen werden je zwei Strommessungen durchgeführt.
292
Kapitel 9: APPLIKATIONEN
Diese Messmethode hat zwei Vorteile: • Die Auflösung der Strommessung wird verdoppelt. • Der Winkelfehler a zwischen Strom- und Spannungsmessung, der durch die zeitversetzte Messung bedingt ist, wird vollständig kompensiert.
Abb. 9.1: Das »Corrective Scan Principle« für Energiemessung
Das »Corrective Scan Principle« ist in Abbildung 9.6 mit Strom und Spannung gezeichnet. Die Mittelspannung 0 V wird in jeder Messsequenz mitgemessen. Ihr ADCWert wird von jedem Messwert für Strom und Spannung subtrahiert, um einen offset-freien, vorzeichenrichtigen Strom- bzw. Spannungswert zu erhalten. Die Bereichsschalter in den Stromkreisen sind nur für sehr hohe Genauigkeiten bei kleinen Strömen notwendig (I < 1,5 % Inom). Diese Schalter öffnen bei kleinen Strömen und machen nur den Widerstand Rct0 wirksam: Dadurch entsteht eine höhere Ausgangsspannung am Stromwandler, was eine höhere Auflösung bewirkt. Auch der MSP430x43x kann für diesen Elektrizitätszähler verwendet werden: Die Multiplikation der Strom- und Spannungswerte wird dann durch eine Softwareroutine durchgeführt. Die Rechenleistung ist bei dieser Lösung allerdings begrenzt (Wirk-, Blind- und Scheinleistung, cosj usw.). Als Stromsensoren können Stromwandler (normale und gleichstromkompensierte), Shunts und Rogowski-Spulen verwendet werden.
9.1 Dreiphasen-Elektrizitätszähler
293
Abb. 9.2: Dreiphasen-Elektrizitätszähler
Die gemessene elektrische Energie W ist: : =
Q=
Ê XQ (L Q + LQ ) WU
Q=
Das zuvor gezeigte »Corrective Scan Principle« mit zwei Strommessungen pro Spannungsmessung kann auch mit vier Strommessungen pro Spannungsmessung verwendet werden. Die Auflösung der Strommessung wird dadurch noch größer. Die nächste Abbildung zeigt dieses Prinzip für eine Phase. Der ADC12 kann alle notwendigen Messungen für einen Dreiphasenzähler mit einer einzigen Sequenz (16 Messungen) durchführen: • 3 4 Strommessungen für die drei Phasen • 3 Spannungsmessungen • Eine 0 V-Messung für die Offset-Kompensation
294
Kapitel 9: APPLIKATIONEN
Abb. 9.3: Messsequenz für das »Corrective Scan Principle« mit vier Strommessungen
Mit vier Strommessungen pro Spannungsmessung ist die gemessene Energie W : : =
Q=
Ê YQ (LQ + LQ + L Q + LQ ) WU
Q=
Anmerkung: Die Messmethode mit vier Strommessungen pro Spannungsmessung ist geistiges Eigentum von Texas Instruments und darf nur mit Mikrocomputern dieser Firma verwendet werden.
Weitere Informationen: [1] Kapitel »Electricity Meters« [2] Kapitel »Electricity Meters« Beispiele und Berechnungen für elektronische Ein-, Zwei- und Dreiphasenzähler.
9.2
Gaszähler
Ein Gaszähler ist in Abbildung 9.4 gezeigt, der alles enthält, was ein moderner Gaszähler haben kann. Das Volumen-Interface ist mit einer elektronischen Schaltung gelöst, aber selbstverständlich ist auch ein mechanisches Interface möglich. Das elektronische Volumen-Interface gibt zwei elektrische Signale V1 und V2 ab, solange der Enable-Eingang auf Vcc-Potential liegt. Die beiden Signale sind um 90 gegeneinander verschoben, um auch die Strömungsrichtung des Gases erkennen zu können. Die Gastemperatur wird mit dem Eingang A0 des Analog-Digital-Wandlers des MSP430F447 gemessen. Dadurch ist eine wesentlich höhere Genauigkeit der Volumenmessung möglich, da die starke Abhängigkeit des Gasvolumens von der Temperatur berücksichtigt werden kann (Gesetze von Boyle-Mariotte und Gay-Lussac). Jede gewünschte Kombination von externer Peripherie ist möglich, es ist nicht nötig, alle in der Abbildung gezeigten Möglichkeiten zu implementieren.
9.2 Gaszähler
295
Der MSP430F447 befindet sich normalerweise im Low Power Mode 3 (Icc = 0,9…1,9 mA nominal), aber interne und externe Interrupts wecken ihn daraus auf: • Volumen-Interface: Jede Änderung der Spannungen V1 und V2, falls der Enable-Eingang eingeschaltet ist. • Basic Timer1: Dieser ständig arbeitende Timer kann den MSP430 in regelmäßigen, programmierbaren Zeitabständen aufwecken (Intervalle bis zu 2 s). Seine Frequenz wird vom ACLK (32,768 kHz) abgeleitet. • Betätigung einer Taste: Alle Port1- und Port2-Eingänge können Interrupt auslösen. • M-BUS-Aktivität: Durch das RS232-Interface (UART) wird nach dem Empfang eines Zeichens Interrupt ausgelöst. • Einschieben einer Kundenkarte in das Karten-Interface.
Abb. 9.4: Gaszähler mit Verbrauchsprofilspeicherung
296
Kapitel 9: APPLIKATIONEN
Die externen EEPROMs (128K × 8 Bit), die an den MSP430 angeschlossen sind, speichern das »Verbrauchsprofil« des Gaszählers: Die verbrauchte Gasmenge wird in Abhängigkeit von der Zeit aufgezeichnet. Durch ein regelmäßig stattfindendes Auslesen der EEPROMs – über das Infrarot-Interface, den M-BUS oder die UART – ist es für den Gashersteller möglich, den zukünftigen Gasverbrauch sehr präzise vorauszuschätzen. Gaszähler, die diese Eigenschaft nicht benötigen, können die wenigen, wichtigen System-, Kalibrierungs- und Sicherheitswerte in den beiden Information Memories abspeichern. Die Speisespannung der EEPROMs wird abgeschaltet, wenn kein Schreiben oder Lesen notwendig ist. Weitere Informationen: [1] Kapitel »Application Examples« Weitere elektronische Gaszähler in einfacherer Ausführung werden gezeigt.
9.3
Elektronische Sicherung
Sicherungen sollen elektrische Anlagen gegen die Zerstörung durch hohe Ströme schützen. Das Problem bei Sicherungen ist die sichere Unterscheidung zwischen zwei unterschiedlichen Situationen: • Kurzzeitiger Überstrom, der z.B. durch den Einschaltstromstoß eines Elektromotors oder einer starken Lampe erzeugt wird: Die Sicherung soll nicht auslösen, um kostspielige Stillstände von Anlagen zu vermeiden. • Kurzschluss: Die Sicherung soll so schnell als möglich den Stromfluss unterbrechen, um kostspielige Zerstörungen zu vermeiden. (MI9RXIVWGLIMHYRKHIVFIMHIR*ÆPPIQYWWWSKIREY[MIQ¶KPMGLWIMRYQ/SW XIR^YZIVQIMHIR7XMPPWXERHZSR1EWGLMRIR>IVWX¶VYRK Die nächste Abbildung zeigt die beiden unterschiedlichen Situationen. Durch die Verwendung des Effektivwertes des gemessenen Stromes – ohne Einfluss der Umgebungstemperatur oder von Toleranzen wie bei der thermischen Sicherung – ist eine genaue Entscheidung für eine elektronische Sicherung wesentlich leichter. Eine elektronische Sicherung misst den Strom mit ihrem Analog-Digital-Wandler, quadriert den gemessenen Wert und summiert das Ergebnis. Dies wird für jede Phase individuell durchgeführt.
9.3 Elektronische Sicherung
297
Abb. 9.5: Kurzschluss und kurzzeitiger Überstrom
Dann wird geprüft, ob ein gegebener Effektivwert des Stromes Ieffmax innerhalb eines definierten Zeitintervalls Dt überschritten wurde oder nicht:
DW
W + DW
×,
GW < ,HIIPD[
W
mit digitaler Messung ergibt das: Q=N
N
;SFIM Dt
Ê LQ < ,HIIPD[ Q =
Messintervall, z.B. eine Halbperiode der Netzspannung
[s]
k
Anzahl der Messungen innerhalb von Dt
[1]
in
Messwert der n-ten Strommessung
[A]
Falls der Stromwert Ieffmax überschritten wurde, schaltet die Sicherung ab, falls nicht, wird ein neues Zeitintervall Dt gestartet. Das Ziehen der Wurzel aus dem aufsummierten Wert ist dabei nicht notwendig: Der quadratische Wert wird verwendet. %FFMPHYRK ^IMKX HEW 1IWWIR ZSR 7XVSQ YRH 7TERRYRK J°V IMRI IMR^IPRI 4LEWI >[IM 7XVSQQIWWYRKIR [IVHIR W]QQIXVMWGL ^Y HIV 7TERRYRKWQIWWYRK HYVGLKIJ°LVX(EWIVKMFXIMRIL¶LIVI%YJP¶WYRKJ°VHIR7XVSQYRHrJEPPWR¶XMKr HMI 1¶KPMGLOIMX EYGL HMI ;MVOPIMWXYRK OSVVIOX EYW^YVIGLRIR YRH ER^Y^IMKIR (EWWIPFIKMPXEYGLJ°V7GLIMRYRH&PMRHPIMWXYRKWS[MIJ°VHIRGSWjHIV0EWX
298
Kapitel 9: APPLIKATIONEN
Abb. 9.6: Messpunkte für eine Einphasensicherung
;SFIM
tr
Wiederholungsintervall zwischen zwei Messsequenzen [s]
ts
Zeitintervall zwischen zwei Messungen
[s]
(EW1IWWMRXIVZEPP tr kann durch den Timer_A oder den Timer_B definiert werden; sein Wert ist: WU =
DW . N
Der Strom kann vor der Messung auch gleichgerichtet werden, das erhöht die Auflösung (siehe nächste Abbildung rechts).
Abb. 9.7: Strombereiche mit dem 12-Bit-ADC-Bereich
9.3 Elektronische Sicherung
299
Eine dreiphasige elektronische Sicherung ist in Abbildung 9.8 gezeigt. Der 0 VWert wird ebenfalls gemessen, um den Wert des »virtuellen Nullpunkts« (Mitte des ADC12-Bereichs) zu erhalten. Er wird von allen Messwerten subtrahiert, um offset-freie, vorzeichenrichtige Werte zu erhalten. Die Strom- und Spannungsmessungen haben die gleiche Sequenz wie bei einem Elektrizitätszähler. Siehe Abbildung 9.1. Der Spannungspfad ist nicht für jede Anwendung notwendig, aber er kann helfen, noch schneller zwischen Kurzschlüssen und vorübergehender Überlast zu unterscheiden. Zusätzlich erlaubt er, wie in Abbildung 9.8 gezeigt, die Anzeige von Leistung, Spannung und cosj individuell für jede Phase. Eine schnelle Quadrierung für MSP430-Familienmitglieder ohne HardwareMultiplizierer ist im Kapitel »Integer-Rechenroutinen« unter »Schnelle Quadrierung« gezeigt.
Abb. 9.8: Dreiphasige elektronische Sicherung
300
Kapitel 9: APPLIKATIONEN
Weitere Informationen: [2] Electronic Fuses Weitere Beispiele und Berechnungen. [1] Kapitel »Connection of Sensors« [2] Kapitel »Interfacing of 5V to 3V Circuits« [2] Kapitel »Accumulator Supervision«
301
10 Das IAREntwicklungswerkzeug
Die folgende Beschreibung des Entwicklungswerkzeuges für den MSP430 basiert auf der IAR-Version 2.20 des Sommers 2003. Sie ist aber – mit kleinen Abweichungen – auch für die vorherige Version 1.x gültig. Das Entwicklungswerkzeug für den MSP430F449 besteht aus folgenden Komponenten, die unter der Bezeichnung »MSP-FET430P440« bestellt werden können: • Software »Embedded Workbench« auf der MSP430 CD-ROM SLAC001 (die im Buch enthalten ist). • Adapter für den Anschluss des Target Socket Module MSP-430PZ100 an den Personal Computer: Interface Board MSP-FETP430IF. Dieser Adapter ist auch für die anderen Target Socket Module der MSP430-Familie verwendbar. • 25-poliges Kabel für die Verbindung zwischen dem Interface Board und dem Personal Computer. • Das Target Socket Module MSP-430PZ100 mit dem Sockel für den MSP430F449. • 14-poliges Kabel für die Verbindung zwischen dem Interface Board und dem MSP-430PZ100.
10.1
Anschluss der Hardware an den Personal Computer
Anmerkungen: Es empfiehlt sich, den Anschluss des Entwicklungswerkzeuges bei ausgeschaltetem Personal Computer vorzunehmen. Die Verbindung des Adapters mit dem Personal Computer verursacht durch das Aufladen eines Kondensators einen kurzen Stromstoß, der bei manchen Computern – speziell bei Laptops – einen Reset mit Neustart auslöst.
Das Einsetzen des MSP430F449 in das Target Socket Module sollte unbedingt an einem geerdeten Arbeitsplatz durchgeführt werden!
302
Kapitel 10: Das IAR-Entwicklungswerkzeug
Falls sich kein 32-kHz-Quarz auf dem MSP-430PZ100 befindet (direkt am Sockel, am Pin 1), sollte er jetzt eingelötet werden. Die beiden Softwarebeispiele, »Das erste Programm« und die »MSP430F449 Quick Start Software«, benötigen beide einen Quarz für die Funktion. Die Schritte für den Anschluss des IAR-Entwicklungswerkzeuges an den Personal Computer sind: • Personal Computer ausschalten. • Den MSP430F449 in den Sockel des Target Socket Module MSP-430PZ100 einsetzen. Dazu wird der Rahmen des Sockels vorsichtig nach unten gedrückt und der MSP430F449 eingesetzt. Der Punkt in der Ecke des MSP430F449 zeigt auf den Pin 1 des MSP-430PZ100. • Target Socket Module MSP-430PZ100 und Interface Board MSPFETP430IF werden durch das 14-polige Kabel miteinander verbunden. • Der Druckerausgang LPT1 des Personal Computers und das Interface Board werden durch das 25-polige Kabel miteinander verbunden. • Jetzt kann der Personal Computer problemlos eingeschaltet werden.
10.2
Installation der IAR-Software
Die nachfolgende Beschreibung der Installation des Entwicklungswerkzeuges kann kleine Abweichungen aufweisen. Es ist auf jeden Fall ratsam, zwischen den einzelnen Schritten zu warten, da einige von ihnen relativ lange dauern. Es sind die englischen Bezeichnungen der Programmgruppen, Schaltflächen, Dialogfelder und Menüs verwendet, da das Laptop, das zur Bucherstellung verwendet wurde, die amerikanische Version von Windows geladen hatte. Das IAR-Entwicklungswerkzeug ist ohnehin nur in englischer Sprache erhältlich. Die verwendeten symbolischen Darstellungen bedeuten: »Yes« anklicken:
Die Schaltfläche »Yes« mit der linken Maustaste 1-mal bzw. 2-mal anklicken. »Project« »Rebuild All«: Aus dem Menü (Programmgruppe), das nach dem Anklicken von »Project« erscheint, den Befehl »Rebuild All« auswählen. Eine aktive Auswahl ist dick geschrieben.
10.2 Installation der IAR-Software
Abb. 10.1: Die Programmgruppe »Project«
C:\Program Files\IAR Systems\Embedded Workbench 3.2. Kursiv geschriebene Texte bedeuten eine Eingabe von Hand in ein Feld.
Abb. 10.2: Das Dialogfeld »Target«
303
304
Kapitel 10: Das IAR-Entwicklungswerkzeug
Abb. 10.3: Das Dialogfeld »Save As«
Die Schritte für die Installation des IAR-Entwicklungswerkzeuges sind: • Die MSP430-CD (SLAC001) in das CD-Laufwerk einlegen und Laufwerk schließen. • Der »Internet Browser« startet. • Die Titelseite der MSP430-CD erscheint. • Die Schaltfläche »TOOL Software« am linken Rande anklicken: Die Seite mit den Entwicklungswerkzeugen erscheint. • Das »IAR System«-Logo anklicken: Die IAR-Seite erscheint. • Die Schaltfläche »Flash Emul. Tools« anklicken: Die Seite »Description« erscheint. • Die Zeile Install FET430 Software anklicken: Die Seite »Tool Software« erscheint. • Die Zeile MSP-FET430P440 Flash Emulation Tool anklicken • Das Dialogfeld »Save As« erscheint mit dem Dateinamen FET_R306.exe. Siehe Abbildung 10.3. • Den Ordner C:\ auswählen, dann »Save« anklicken: »Saving Location« erscheint, die Datei C:\FET_R306.exe wird erstellt. • Die Datei C:\FET_R306.exe mit »Start« »Run« ausführen lassen. • Das Dialogfeld »MSP430 Development Tool-Setup« erscheint: Die Schaltfläche »Setup« anklicken. Die Erstellung des IAR-Entwicklungswerkzeuges beginnt.
10.2 Installation der IAR-Software
305
• Das Fenster »InstallShield Wizard« erscheint: Warten bis das Dialogfeld »IAR Embedded Workbench Kickstart for MSP430 V2.20« erscheint. Die Schaltfläche »Next« anklicken. • Das Dialogfeld »Software License Agreement« erscheint: Durchlesen, dann die Schaltfläche »Accept« anklicken. • Das Dialogfeld »Select Destination Folder« erscheint. Die Schaltfläche »Browse..« anklicken und dann C:\Program Files\IAR Systems\Embedded Workbench 3.2 auswählen. Dann die Schaltflächen »OK« und »Next« nacheinander anklicken. • Das Dialogfeld »Installation Type« erscheint: Die Option »Full« auswählen, dann die Schaltfläche »Next« anklicken. • Das Dialogfeld » Select Program Folder« erscheint: IAR Systems\IAR Embedded Workbench for MSP430 Kickstart…wählen, dann »Next« anklicken. • Das Dialogfeld »Review Settings Before Copying Files« erscheint: »Next« anklicken. • Das Fenster »Performing Operations« erscheint: Warten, bis das Kopieren beendet ist (100 % erreicht ist). • Das Dialogfeld »Installation Finished« erscheint: Alle drei Kontrollkästchen einschalten, dann »Next« anklicken und warten. • Das Fenster »Internet Browser« erscheint mit »Important Information«. • Das Fenster »IAR Embedded Workbench« erscheint: Warten. • Das Dialogfeld »IAR Embedded Workbench« erscheint: »File« »Exit« anklicken. • Das Dialogfeld »Setup Complete« erscheint: »Finish« anklicken. • Das Fenster »Internet Browser« erscheint: Der »Migration Guide« (enthält Änderungen und Umstellungen bezüglich der Version 1.x) und die README-Datei (enthält wichtige Informationen) können angesehen werden. • Das Installationsprogramm durch »File« »Exit« beenden. Die Entwicklungsumgebung für den MSP430 ist jetzt installiert, das IAR-Entwicklungswerkzeug für die MSP430-Familie kann verwendet werden. Anmerkung: Nach der Installation ist bei NT Rechnern ( WIN NT, WIN 2000, WIN XP) ein Neustart nötig.
306 10.3
Kapitel 10: Das IAR-Entwicklungswerkzeug
Inbetriebnahme
Um zu vermeiden, dass wichtige Dateien, die das IAR-Entwicklungswerkzeug erstellt, irgendwo auf dem Plattenspeicher abgespeichert werden, wird ein Ordner C:\TEST erstellt, in dem alles, was mit der MSP430-Programmerstellung zu tun hat, gespeichert wird. • Erstellen eines Ordners C:\TEST für die Sources, Objekte, Listings und anderen Hilfsdateien mit dem Programm Windows Explorer: Das Programm »Windows Explorer« aufrufen. »Address« C:\ wählen, »File« »New« »Folder«: TEST eingeben, dann Taste »Enter« betätigen. • Kopieren der Source FET4402.s43 »Das erste Programm« von der MSP430CD in den neuen Ordner C:\TEST. Die Datei FET4402.s43 ist im Ordner X:\FRANZIS« enthalten (X ist der Systemname des CD-Laufwerks). Die Software des IAR-Entwicklungswerkzeuges wird mit der folgenden Sequenz von Programmsymbolen gerufen: • »Start« »Programs« »IAR Systems« »IAR Embedded Workbench Kickstart for MSP430 V2« »IAR Embedded Workbench« Das Programm »IAR_Embedded Workbench« wird geladen. Die Schritte, um das IAR-Entwicklungswerkzeug für »Das erste Programm« (siehe nächstes Kapitel) vorzubereiten sind folgende. Im Gegensatz zu der vorherigen Version des IAR-Entwicklungswerkzeuges, ist vor die »Project«-Ebene noch die »Workspace«-Ebene gesetzt worden. Diese Ebene wird jetzt definiert: • »File« »New« »Workspace«: »OK« anklicken. Das Dialogfeld »New Workspace« erscheint. • FRANZIS in Feld »Filename« eingeben (Name der Workspace-Ebene) und dann »Save« anklicken. Als nächstes wird die Project-Ebene definiert. Die Einstellungen für den MSP430-Typen, Allgemeines, den Assembler A430, den Linker XLINK und den Debugger C-SPY werden festgelegt. »Das erste Programm« FET4402.s43 wird geladen: • »Project« »Create New Project in Current Workspace«. TEST in Feld »File name« eingeben, dann Schaltfläche »Create« anklicken. • »Project« »Add Files«: C:\TEST\FET4402.s43 mit dem Feld »Files of type« »All Files« auswählen, dann Schaltfläche »Open« anklicken.
10.3 Inbetriebnahme
307
• Workspace-Namen im Fenster »FRANZIS-TEST« (über File Name) anklicken. • »Project« »Options« »General« »Target«: »msp430F449« auswählen. Kontrollkästchen »HW-Multiplier« und »Assembler only« auswählen. Schaltfläche »OK« anklicken. Siehe Abbildung 10.2. • »Project« »Options« »General« »Output«: »Executables/libraries«: C:\TEST\Debug\Exe eingeben. »Object files«: C:\TEST\Debug\Obj eingeben. »List files«: C:\TEST\Debug\List eingeben. Schaltfläche »OK« anklicken: Alle Assembler- und Linkerdateien werden im Ordner C:\TEST gespeichert. • »Project« »Options« »A430« »List«: Kontrollkästchen »List file« einschalten. »OK« anklicken. • »Project« »Options« »XLINK« »Include«: Kontrollkästchen »Ignore CSTARTUP in library« ausschalten. »OK« anklicken. • »Project« »Options« »XLINK« »List«: Kontrollkästchen »Generate linker listing« einschalten. »OK« anklicken. • »Project« »Options« »C-SPY«. Im Feld »Driver«: »Flash Emulation Tool« auswählen. Kontrollkästchen »Run to« ausschalten. »OK« anklicken. Jetzt kann »Das erste Programm«, das im nächsten Kapitel beschrieben ist, geladen und ausgeführt werden: • »Project« »Rebuild all«: Die Source wird assembliert und gelinkt, es sollten 0 Errors, 0 Warnings angezeigt werden. Die Listings von Assembler und Linker sind in dem Ordner C:\TEST\Debug\List gespeichert. • »Project« »Debug«: Es wird nochmals assembliert und gelinkt. Der Debugger C-SPY wird geladen, das Objekt FET4402.obj wird in das FETModul transferiert. Der Bildschirm des Debuggers erscheint ungefähr so, wie in Abbildung 10.4 gezeigt.
308
Kapitel 10: Das IAR-Entwicklungswerkzeug
Abb. 10.4: Der erste Bildschirm des IAR-Entwicklungswerkzeuges
• »Debug« »Go«: Das Programm wird gestartet, die LED auf dem Target Socket Module blinkt mit 8 Hz. Das bedeutet, dass das Programm richtig arbeitet. Um das MSP430-Programm anzuhalten und das IAR-Entwicklungswerkzeug zu beenden, sind folgende Schritte nötig: • »Debug« »Break«: Das Programm hält an. • »Debug« »Stop Debugging«: Der C-SPY wird verlassen. • »File« »Close«: Der Workspace wird beendet. • »File« »Exit«: Das IAR-Entwicklungswerkzeug wird beendet.
10.4
Das erste Programm
Das nachfolgende, relativ einfache Programm zeigt bereits – fast – alle Teile eines strukturierten Assemblerprogramms: • Eine kurze Beschreibung des Programms als Kommentar • Den Initialisierungsteil
10.4 Das erste Programm
309
• Die Hauptschleife, die hier sehr kurz ist, da sofort der Low Power Mode 0 aufgerufen wird • Den Interrupt-Teil, in dem der Interrupt des Timer_A behandelt wird • Die Interrupt-Vektoren mit dem RST/NMI- und dem Timer_A-Vektor Das Programm ist bereits für die IAR-Embedded Workbench V2.20 geändert! Falls es mit der V1.x laufen soll, muss die Programmzeile rseg
DATA16_Z
; Beginn der RAM-Definitionen
rseg
UDATA0
; Beginn der RAM-Definitionen
in
geändert werden. ; ; MSP-FET430P449 Anfangsprogramm: "Das erste Programm" ; ; Dateiname: FET4402.s43. Geaendert fuer IAR-Version 2.20 ; ; Beschreibung: Port P5.1 wird durch den Timer_A0 ; Interrupt geaendert. Die Wiederholrate wird auf die ; langsamste Frequenz gesetzt (Offset ist FFFFh). ; Die SMCLK-Frequenz 1,048MHz wird fuer den TACLK verwendet ; (diese Frequenz stellt sich automatisch ein, da die FLL+ ; nicht initialisiert wird). ; Die Interrupt-Routine des Timer_A aendert den Port P5.1 ; (an dem die LED des FET-Moduls angeschlossen ist) und ; addiert den Wert FFFFh auf das Capture/Compare Register ; TACCR0. Das ergibt eine Blinkfrequenz von ; 1,048E6/(2 x 65535) = 8 Hz ; Jede steigende Flanke wird im Zaehler COUNTER gezählt ; #include "msp430x44x.h" ; Definitionen fuer MSP430F449 ; rseg DATA16_Z ; Beginn der RAM-Definitionen ; COUNTER ds 2 ; Zaehlt 0->1 Flanken an P5.1 ; rseg CODE ; Beginn des Programms ; ; Initialisierung: ; Timer_A: SMCLK, TAR loeschen, TACCR0 Interrupt ; INIT MOV #0A00h,SP ; Initialisiere Stack Pointer CLR COUNTER ; Zaehler loeschen MOV #WDTPW+WDTHOLD,&WDTCTL ; Watchdog stoppen MOV #TASSEL1+TACLR,&TACTL ; TAR = 0, SMCLK MOV #CCIE,&TACCTL0 ; TACCR0 Interrupt ein
310
Kapitel 10: Das IAR-Entwicklungswerkzeug
MOV #0FFFFh,&TACCR0 ; Langsamste Frequenz BIS.B #002h,&P5DIR ; P5.1 als Ausgang schalten BIS #MC1,&TACTL ; Start Timer_A: Cont. Mode EINT ; Interrupts ein ;------; Hauptschleife ; MainLoop BIS #LPM0,SR ; Low Power Mode 0 ein NOP ; Fuer Test mit C-SPY ;------; Timer_A Interrupt-Routine fuer den Timer_A Block 0 ; TA0_ISR equ $ ; Start Timer_A0 Interrupt ADD #0FFFFh,&TACCR0 ; Addiere Offset auf TACCR0 XOR.B #002h,&P5OUT ; P5.1 aendern BIT.B #002h,&P5OUT ; Steigende Flanken zaehlen: ADC COUNTER ; COUNTER + 1 falls 0 -> 1 RETI ; Rueckkehr vom Interrupt ;------; Interrupt-Vektoren des MSP430F449 ; rseg INTVEC ; Beginn der 16 Vektoren dw 0,0,0,0,0,0 dw TA0_ISR ; Adresse Timer_A Interrupt dw 0,0,0,0,0,0,0,0 dw INIT ; Programmstart end
10.5
Kleine Einführung in die Praxis des IAREntwicklungswerkzeugs
Hier sollen noch einige Möglichkeiten des IAR-Entwicklungswerkzeuges, wie das Setzen eines Breakpoints, die Auswahl dessen, was für die Programmierung in Assemblersprache angezeigt werden soll (Arbeitsregister, RAM usw.) und einiges mehr besprochen werden. Die tatsächlichen Möglichkeiten sind dabei so umfangreich, dass nur die wichtigsten erwähnt werden können. Durch die praktische Verwendung des Entwicklungswerkzeuges erweitern sich aber die Möglichkeiten und Fertigkeiten ganz von selber.
10.5.1 Modifikation des CSPY-Debuggers für Assemblerprogrammierung Die Abbildung 10.4 zeigt den Bildschirm des CSPY-Debuggers wie er sich nach der Installation ergibt. Diese Anordnung ist aber nicht für die Entwicklung von
10.5 Kleine Einführung in die Praxis des IAR-Entwicklungswerkzeugs
311
Assemblerprogrammen geeignet. Es empfiehlt sich daher, die folgenden Änderungen der Bildschirmanordnung vorzunehmen. Um diese Änderungen vornehmen zu können, wird folgendermaßen vorgegangen: • »Start« »Programs« »IAR Systems« »IAR Embedded Workbench Kickstart for MSP430 V2« »IAR Embedded Workbench«: Das Entwicklungswerkzeug wird geladen und gestartet. • »File« »Recent Workspaces« »FRANZIS.eww« anklicken: Der Workspace von »FRANZIS-Test« erscheint. • »Project« »Rebuild all« anklicken: »Das Erste Programm« wird assembliert und gelinkt. • »Project« »Debug« anklicken: Der Debugger lädt das Programm FET4402.s43 in das FET-Modul und zeigt den Bildschirm von Abbildung 10.4. • Die drei nicht benötigten Fenster »Locals«, »Watch« und »Terminal I/O« durch Anklicken des Symbols in der jeweiligen linken oberen Ecke und nachfolgendes Anklicken von »Close« zum Verschwinden bringen. • Das Fenster »Messages« mit der Maus wesentlich verkleinern und nach rechts unten schieben. • Mit »View« »Register« die Arbeitsregister R0 bis R15 anzeigen. Das Fenster wird mit der Maus verkleinert und in das rechte obere Eck des Bildschirms gebracht. Durch Anklicken des »+«-Zeichens vor dem »SR«-Symbol können die Bits des Status Registers einzeln angezeigt werden. • Mit »View« »Memory« den Inhalt des Speichers anzeigen. Durch die Eingabe einer Adresse – die aus unerfindlichen Gründen dezimal ist – in das Feld »Go to« wird die gewünschte Adresse in die Mitte des Fensters gebracht. Hexadezimale Eingaben sind durch Voranstellen von »0x« vor die Adresse möglich. Beispiel: Die Eingabe von »0x1000« bringt die Adresse 1000h in die Mitte des Fensters. Um den Inhalt von Worten anzuzeigen, wird die Schaltfläche »x2« angeklickt, um den Inhalt von Bytes anzuzeigen, wird die Schaltfläche »x1« angeklickt. Mit der Schaltfläche »Little E.« (Little Endian) wird das untere Byte mit der geraden Adresse adressiert. Das Fenster »Memory« mit der Maus verkleinern und in das rechte untere Eck des Bildschirms bringen. • Mit »View« »Stack« den Stack anzeigen. Das Fenster »Stack« mit der Maus verkleinern und links neben den Arbeitsregistern platzieren. Der grüne Pfeil bedeutet den Stack Pointer SP: Er zeigt auf den aktuellen Wert des TOS. Das Feld »SP« zeigt den Inhalt des Stack Pointers SP an. • Das Fenster der Source mit der Maus vergrößern.
312
Kapitel 10: Das IAR-Entwicklungswerkzeug
Nach diesen Änderungen ergibt sich ein Bildschirm, der wie in Abbildung 10.5 aussieht:
Abb. 10.5: Der Bildschirm des IAR-Entwicklungswerkzeuges für AssemblerSoftware
Anmerkung: Das Fenster »Memory« zeigt die Daten-Worte richtig. Im Listing des Assemblers sind die beiden Daten-Bytes vertauscht! Statt des Wertes 0001h steht also 0100 im Listing. Anmerkung: Alle nachfolgend beschriebenen Änderungen können nur bei angehaltenem MSP430-Programm durchgeführt werden.
10.5.2 Setzen eines Breakpoints Ein Breakpoint kann wie folgt auf eine Programmzeile gesetzt werden: • Die Programmzeile, auf die der Breakpoint gesetzt werden soll, in das Fenster FET4402.s43 (das die Source anzeigt) bringen. • Den Pfeil der Maus auf die Programmzeile setzen und mit der rechten (!) Maustaste anklicken. Es erscheint eine Programmgruppe, von welcher der Befehl »Toggle Breakpoint (Code)« angeklickt wird. Die Programmzeile färbt sich rot, was einen gesetzten Breakpoint anzeigt. Ein Breakpoint kann
10.5 Kleine Einführung in die Praxis des IAR-Entwicklungswerkzeugs
313
nur auf eine tatsächlich assemblierte Programmzeile gesetzt werden, also nicht auf Kommentarzeilen oder durch »conditional assembly« ausgesparte Zeilen. Anmerkung: Auf die gleiche Weise kann ein Breakpoint wieder entfernt werden.
Wenn der Watchdog verwendet wird, sollte anfangs ein Breakpoint auf den 1. Befehl gesetzt werden (dessen Adresse in der Interrupt-Vektoradresse FFFEh steht). Dadurch kann man sehen, ob der Watchdog aktiv wird, was manchmal schwer zu verstehende Fehler erklärt. Wenn sich nach einigen Tests herausstellt, dass nicht der Watchdog an unerklärlichem Verhalten Schuld hat, kann man natürlich den Breakpoint anderweitig verwenden.
10.5.3 Editieren von Breakpoints Mit »Edit« »Breakpoints..« ergibt sich eine große Anzahl von Möglichkeiten, wie ein Breakpoint gesetzt werden kann. Es empfiehlt sich, nach einer kurzen Einarbeitungszeit diese Möglichkeiten zu studieren und anzuwenden. Sie sind in den Dialogfeldern »Code«, »Range« und »Conditional« programmierbar. Zur Einführung sei gezeigt, wie man schnell alle gesetzten Breakpoints löschen und damit klare Verhältnisse schaffen kann. Die Eingabefolge »Edit« »Breakpoints..« »Remove All« »Ok« entfernt alle gesetzten Breakpoints.
10.5.4 Lesen und Schreiben des Inhalts von Registern Inhalt der Arbeitsregister R0 bis R15 In dem Feld des Fensters »Register« die Anzeige von »CPU Registers« auswählen. Es erscheinen die 15 Arbeitsregister mit ihren Inhalten. Eine Änderung des Inhalts ist wie folgt möglich: • Der Inhalt des Arbeitsregisters, das geändert werden soll, wird angeklickt. Der Inhalt färbt sich. • Durch nochmaliges Anklicken wird der Inhalt wieder farblos und kann nun einzeln für jede Stelle oder insgesamt mit hexadezimalen Zahlen geändert werden. • Durch die »Enter«-Taste wird der neue Inhalt in das Arbeitsregister übernommen.
314
Kapitel 10: Das IAR-Entwicklungswerkzeug
Anmerkung: Das Status Register SR kann wie die anderen Arbeitsregister geändert werden, oder aber individuell für jedes Bit. Dazu ist es nur nötig, das »+«-Kästchen links neben dem Symbol »SR« anzuklicken. Die SR-Bits erscheinen dann individuell und können geändert werden. Durch Anklicken des »-«-Zeichens verschwinden die SR-Bits wieder.
Inhalt von Peripherie-Modul-Registern Auf die gleiche Weise, wie für die Arbeitsregister gezeigt, können auch die Register aller Peripherie-Module angesehen und geändert werden. Es ist dazu nur nötig, in dem Feld des Fensters »Register« das gewünschte Peripherie-Modul auszuwählen: Alle im selektierten MSP430-Familienmitglied vorhandenen Peripherie-Module sind wählbar. Nach der Wahl des Peripherie-Moduls erscheinen seine Register und deren momentane Inhalte.
10.5.5 Lesen und Schreiben des Inhalts von Adressen Es ist möglich, den Inhalt aller – existierenden – Adressen zu lesen und zu ändern. Dazu sind folgende Schritte notwendig: • Das Fenster »Memory« und das gewünschte Datenformat (»x1« für Bytes, »x2« für Worte) auswählen. • Im mittleren Feld die gewünschte Speicherart auswählen. Dabei bedeuten (beim MSP430F449) • Memory: Der gesamte Speicherbereich von 0 bis FFFFh • FLASH: Der Programmspeicher von 1100h bis FFFFh • INFO:
Die beiden Information Memories A und B von 1000h bis 10FFh
• RAM:
Das RAM von 200h bis 9FFh
• SFR:
Die Special Function Registers von 0 bis Fh
• Im Feld »Go to« die gewünschte Adresse auswählen. Hexadezimale Adressen werden im Format »0xNNNN« eingegeben, wobei »NNNN« die gewünschte Adresse darstellt. • Nach der Eingabe von »Enter« erscheint die ausgewählte Adresse in der Mitte des »Memory«-Fensters. Die Inhalte der umgebenden Adressen können ebenfalls angesehen werden. • Für eine Änderung wird der Inhalt der gewünschten Adresse mit der Maus ausgewählt und mit der Tastatur geändert. Nach der Eingabe von genügend korrekten Werten wird der neue Inhalt in die Adresse übernommen.
10.5 Kleine Einführung in die Praxis des IAR-Entwicklungswerkzeugs
315
10.5.6 Start/Restart eines Programms Ein angehaltenes Programm kann durch die Eingabe von »Debug« »Go« gestartet, bzw. wieder gestartet werden. Links oben erscheint eine rote Hand, die anzeigt, dass die MSP430-Software aktiv ist.
10.5.7 Anhalten eines Programms Ein aktives MSP430-Programm kann auf zweierlei Arten zum Anhalten gebracht werden: • Durch Anklicken der roten Hand im linken oberen Eck des Bildschirms • Durch die Eingabe von »Debug« »Break«. In beiden Fällen hält das MSP430-Programm an und alle Fenster werden auf den aktuellen Stand gebracht. Der grüne Pfeil am linken Rand der Source zeigt den Stand des Program Counters PC.
10.5.8 Reset des FET-Moduls Ein angehaltenes Programm kann durch die Eingabe von »Debug« »Reset« oder »Emulator« »«Power on« Reset« auf einen definierten Anfangsstand gebracht werden: • Der Program Counter PC wird mit der Adresse, die im Interrupt-Vektor FFFEh steht, geladen. • Das FET-Modul wird durch ein 0-V-Signal am RST/NMI-Pin zurückgesetzt. • Die Fenster werden auf den Stand, der dadurch bedingt ist, gebracht.
10.5.9 Änderung der angezeigten Fenster Zusätzlich zu den angezeigten Fenstern der Abbildung 10.5 können noch weitere Fenster angezeigt werden. Die möglichen Fenster sind in zwei Programmgruppen aufgelistet: Durch die Eingabe von »View« zeigt sich eine Programmgruppe, die primär die Auswahl von Fenstern für MSP430-interne Größen ermöglicht. Durch die Eingabe von »Window« zeigt sich eine Programmgruppe, die es erlaubt, die Anordnung und Anzeige der Fenster zu verändern, z.B. nebeneinander oder hintereinander. Es ist auch eine Auswahl eines Teils der mit »View« wählbaren Fenster möglich.
316
Kapitel 10: Das IAR-Entwicklungswerkzeug
Es empfiehlt sich, die vorhandenen, sehr zahlreichen Möglichkeiten langsam durchzuprobieren.
10.6
Die Quick Start Software und das IAREntwicklungswerkzeug
Wenn »Das erste Programm« erfolgreich mit dem FET-Modul zum Funktionieren gebracht wurde, dann kann man daran gehen, die MSP430F449 Quick Start Software – die im Kapitel »Die MSP430F449 Quick Start Software« beschrieben ist – für den MSP430F44x mit dem FET-Modul zu testen. Zuerst sollte man das Programm so laden, wie es ist und nach erfolgreichem Test so abändern, wie man es für die eigene Applikation braucht. Das Vorgehen ist genauso, wie es beim »Ersten Programm« beschrieben ist. Nur wird jetzt statt des Dateinamens FET4402.s43 der Dateiname der Quick Start Software QSTSW44X.s43 verwendet. Zuvor muss allerdings das Gleitkommapaket FPP4 von der MSP430-CD in den Ordner C:\TEST geladen werden. Das Vorgehen hierfür ist im Kapitel »Installation des Gleitkommapaketes FPP4« beschrieben. Das Vorgehen für die Umstellung auf die MSP430 Quick Start Software ist: • Kopieren der Source QSTSW44x.s43 von der MSP430-CD in den Ordner C:\TEST. Die Datei QSTSW44x.s43 ist im Ordner X:\FRANZIS« enthalten (X ist der Systemname des CD-Laufwerks). • »Start« »Programs« »IAR Systems« »IAR Embedded Workbench Kickstart for MSP430 V2« »IAR Embedded Workbench«: Das IAR-Entwicklungswerkzeug wird geladen. • »File« »Recent Workspaces« »FRANZIS.eww« anklicken: Der Workspace von »FRANZIS-Test« erscheint. • »Project« »Add files« anklicken: Das Dialogfeld »Add files« erscheint. • In das Feld »File name« C:\TEST\QSTSW44x.s43 eingeben. Die Schaltfläche »Open« anklicken. Der Dateiname QSTSW44x.s43 erscheint mit im Workspace »FRANZIS-Test«. • Den Dateinamen FET4402.s43 im Workspace anklicken und die Taste »Del« der Tastatur betätigen. • Das Dialogfeld »IAR Embedded Workbench IDE« erscheint mit der Frage, ob die Datei FET4402.s43 wirklich aus dem Projekt herausgenommen werden soll. »Yes« anklicken.
10.7 Notwendige Modifikationen für existierende Version 1.x-Programme
317
• »Project« »Rebuild all« anklicken: Die MSP430 Quick Start Software wird assembliert und gelinkt. Sie ist nun alleiniger Bestandteil des Workspace »FRANZIS-Test«. • »Project« »Debug« anklicken: Der C-SPY Debugger startet. Für die notwendigen Änderungen empfehlen sich neben den im vorliegenden Buch enthaltenen Subroutinen und Programmteilen auch die im »MSP430 Family Application Report« enthaltenen Beispiele.
10.7
Notwendige Modifikationen für existierende Version 1.x-Programme
Die wichtigsten Änderungen sind die neuen Namen, die für die Programmsegmente eingeführt wurden: Name für V1.x
Name für V2.x
CDATA0 CONST CSTR IDATA0 NO_INIT UDATA0
DATA16_ID DATA16_C DATA16_C DATA16_I DATA16_N DATA16_Z
Tabelle 10.1: Modifikationen
Weitere hilfreiche Hinweise sind im »Migration Guide for EW430 2.10A« auf der MSP430-CD enthalten.
10.8
Wenn gar nichts geht
Nachfolgend ist eine Prüfliste für den Programmtest mit dem IAR-Entwicklungswerkzeug. Wenn nach dem Laden des Programms gar nichts geht (z.B. das Fenster mit der Source leer bleibt), dann sollte man diese Liste durchgehen und sicherstellen, dass alle aufgeführten Programmabsturz-Möglichkeiten beseitigt sind. Die aufgeführten Fehler führen normalerweise zu totalem Ausfall des MSP430: Nichts geht. Es sind meist Fehler, die den Stack und den Program Counter beeinflussen.
318
Kapitel 10: Das IAR-Entwicklungswerkzeug
Anmerkung: Beim aktiven Verwenden des Stacks und des Stack Pointers sollte man nie vergessen, dass auch die CPU den Stack mitverwendet. (Aus einem PDP11Handbuch der frühen 70-er Jahre)
• Fehlender RESET-Vektor: An der Adresse 0FFFEh des Programmspeichers muss die Startadresse des Programms stehen. Falls das nicht der Fall ist, kann das Programm nicht starten: Das Programmfenster des CSPY bleibt leer. • Fehlende Initialisierung des Stack Pointers SP: Der Stack Pointer SP muss initialisert werden, bevor einer der Befehle EINT, PUSH, POP oder CALL verwendet wird. Der normale Befehl hierfür ist: MOV
#RAMEND+2,SP
; Stack im obersten RAM
Dem Wert RAMEND entspricht dabei die höchste vorhandene RAM-Adresse (z.B. 09FEh für den MSP430x449 mit seinen 2K-Byte RAM: 200h + 2048 = 0A00h = 09FEh + 2). • Byte Strings: Nach Byte-Listen im Programm ist unbedingt eine »HYHQ«Directive notwendig. Falls nicht, wird der IAR-Assembler das nächste Wort (Befehl oder Daten) in die nächsten zwei Bytes schreiben, die nicht unbedingt im selben Wort stehen! Es wird keine Fehlermeldung gegeben!
EDE
db dw MOV
1,2,3 ; Byte-String mit 3 Bytes 123 ; Fehler: 123 ist in 2 Worten! R14,0(R15) ; Fehler: Befehlswort geteilt!
Im Listing kann der Fehler daran erkannt werden, dass die Adresse eines Befehls ungerade ist (die Adresse ist allerdings nicht dick gekennzeichnet): 1185 1186
0005BD 0220 0005BF C04F
JNE MOV.B
MainLoop ; Ungerade! R15,MainMode ; Ungerade!
Das korrekte Vorgehen um diesen Fehler zu vermeiden ist:
EDE
db even dw MOV
1,2,3,0
; ; 123 ; R14,0(R15) ;
Byte-String mit 3 Bytes Zur naechsten Wortgrenze Korrekt: 123 in einem Wort Korrekt: Befehl in einem Wort
Anmerkung: Das Einsetzen des Null-Bytes verhindert eine Warnung des Linkers.
• Wort-Befehle mit Byte-Operanden: Der Assembler gibt keine Fehlermeldung, wenn ein Wortbefehl auf ein Byte zugreift. Das bedeutet, dass die folgende falsche Programmzeile vom IAR-Assembler nicht als falsch angesehen wird! Das RAM-Byte 203h wird nicht um 2 erhöht! Ein schwer zu findender Fehler! ADD
#2,&203h
; Fehler: ADD.B ist richtig
10.8 Wenn gar nichts geht
319
• Falsche Abschlussbefehle für Subroutinen und Interrupts: Trotz ihrer scheinbaren Ähnlichkeit haben Subroutinen und Interrupt-Routinen völlig unterschiedliche Befehle für ihre Beendigung. • Subroutinen enden mit dem RET-Befehl: Nur die Adresse des nächsten Befehls (desjenigen, der dem Subroutinenaufruf folgt) wird vom Stack geholt und in den Program Counter geschrieben. • Interrupt-Routinen enden mit dem RETI-Befehl: Zwei Worte werden vom Stack geholt, zuerst wird das Status Register restauriert und dann die Adresse des nächsten Befehls (des Befehls nach dem letzten vor dem Interrupt ausgeführten Befehl) vom Stack geholt und in den Program Counter geschrieben. • Falls RETI und RET falsch benutzt werden, wird ein falscher Wert in den Program Counter geschrieben. Das bedeutet, dass das Programm an einer zufälligen Adresse weitermacht und sich daher »aufhängt«. • Das Programm erreicht den gesetzten Breakpoint nicht. Beim Anhalten des Programms ist das Source-Fenster leer: Dies ist wahrscheinlich auf fehlendes »Housekeeping« bei Stack-Operationen zurückzuführen. Wenn Daten in Subroutinen oder Interrupt-Routinen vom Stack geholt oder auf den Stack geschrieben werden, ist es unbedingt notwendig, diese Operationen genau zu verfolgen. Jedes falsche Positionieren des Stack Pointers führt zu einem »Aufhängen« des Programms, da falsche Adressen in den Program Counter geschrieben werden. In komplizierten Fällen empfiehlt sich das Zeichnen des Stack-Aufbaus während des Programmteils! • Stack-Bereich ist zu klein: Unter »worst case«-Bedingungen (maximale Anzahl von verschachtelten Interrupts und Subroutinen-Ebenen gleichzeitig) überschreibt der Stack Daten im RAM. Dies führt zu Fehlern. Der StackBereich muss durch Verkleinern des Datenbereichs vergrößert werden, oder das Zusammenfallen zu vieler Interrupts muss vermieden werden. • Benutzung von Byte-Befehlen mit dem Program Counter als Arbeitsregister: Dies hat keinen Sinn. Das dadurch verursachte Löschen des oberen Byte des Program Counters ist in jedem Falle falsch. Stattdessen sollte ein anderes Arbeitsregister verwendet werden, bevor der Program Counter mit dem Ergebnis modifiziert wird. • Falsch adressierte Branches und Subroutinenaufrufe: Die Zieladresse von BRs und CALLs wird indirekt gebildet, was heißt, dass der Inhalt des adressierten Wortes (Register oder Speicher) als Adresse benutzt wird. Dieser Fehler wird meistens beim »Symbolic Mode« und beim »Absolute Mode« gemacht: CALL CALL
MAIN #MAIN
; Subroutinenadresse in MAIN ; Subroutine startet bei MAIN
320
Kapitel 10: Das IAR-Entwicklungswerkzeug
Das tatsächliche Verhalten kann leichter beim BR-Befehl gesehen werden: Er ist ein emulierter Befehl, der den MOV-Befehl benutzt: BR MOV
MAIN MAIN,PC
; Befehl BR (Adresse in MAIN) ; Emulation durch MOV-Befehl
Die Adressierung für den CALL-Befehl ist die gleiche wie für den BRBefehl. • RESET passiert während des Programmablaufs: Dies kann mehrere Ursachen haben. 1. Der Watchdog ist aktiv, wird aber vom Background-Programm nicht rechtzeitig zurückgesetzt. Er muss in regelmäßigen Abständen zurückgesetzt oder aber abgeschaltet werden. Im Gegensatz zu fast allen anderen Mikrocomputern ist der Watchdog des MSP430 nach dem RESET eingeschaltet! Ob der Watchdog die Ursache für einen RESET ist, kann durch einen Breakpoint auf die Startadresse (diejenige Adresse, die im Interrupt-Vektor FFFEh steht) festgestellt werden: Erreicht das Programm nach dem Start wieder die Startadresse und ist der Watchdog-Flag (Bit WDTIFG in Byte &IFG1) gesetzt, dann ist der Watchdog die Ursache für den RESET. 2. Am RESET-Pin sind Störungen vorhanden, die einen RESET auslösen. Durch Kontrolle mit einem Oszillographen (nicht Logic Analyzer!) kann das festgestellt werden. 3. Der Watchdog wird ohne Passwort angesprochen: BIS.W
#WDTHOLD,&WDTCTL
; Passwort fehlt
• Die Software hängt sich auf: Dieser Fehler wird normalerweise durch Manipulation des Stacks verursacht. Eine Prüfung aller PUSH- und POPBefehle ist dann ebenso notwendig wie die aller Veränderungen des Stack Pointers. • Der 32-kHz-Quarz schwingt nicht oder unregelmäßig (1): Bei der FLL+ sind die internen, programmierbaren Lastkapazitäten nach dem RESET auf dem kleinsten möglichen Wert (ungefähr 1 pF). Für viele Quarze reicht das nicht zum Anschwingen aus. Abhilfe: Verwendung der im Kapitel »Die MSP430F449 Quick Start Software« gezeigten Initialisierungsroutine und Definition der in der Quarzspezifikation angegebenen Lastkapazität am Programmbeginn durch CL
equ
6
; Lastkapazitaet fuer LFXT1: 6 pF
• Der 32-kHz-Quarz schwingt nicht oder unregelmäßig (2): Eine Ursache kann die durch den extrem niedrigen Stromverbrauch des 32 kHz-Oszillators bedingte sehr hohe Empfindlichkeit des Oszilllators sein. Um diese Empfindlichkeit zu verringern, sind folgende Maßnahmen unbedingt notwendig:
10.8 Wenn gar nichts geht
321
• Die Verbindungsleitungen zwischen Quarz, Lastkapazitäten und MSP430-Oszillatorpins XIN und XOUT müssen so kurz als möglich sein, um als »Antennen« auszuscheiden. Der Quarz und auch die eventuellen Lastkapazitäten müssen also unmittelbar am MSP430 angeordnet sein! • Falls das Quarzgehäuse aus Metall ist – was ein Vorteil ist – muss es mit der AVss-Speisung des MSP430 niederohmig verbunden sein. • LCD arbeitet unregelmäßig oder gar nicht: Wenn der Basic Timer1 nicht korrekt initialisiert wird, arbeitet das LCD nicht richtig. Grund: Die LCDArbeitsfrequenz wird im Basic Timer1 generiert. • Oszillatoren arbeiten nicht: Die Steuerbits OscCap in der FLL+ für die Quarzkapazitäten sind nicht initialisert und dadurch sind 0 pF als Parallelkapazität Cp des 32-kHz-Quarzes programmiert. Dies kann Nichtanschwingen des Quarzes zur Folge haben. • Fehlermeldung »Error: More than 100 Lines« des IAR-Entwicklungswerkzeuges: Hier hilft nur das Neuinstallieren der Projektdateien. Siehe Kapitel »Das IAR-Entwicklungswerkzeug« für das Vorgehen. Selbstverständlich empfiehlt sich auch das Studium des Kapitels »Tipps und Empfehlungen«. In ihm sind weitere Fehlermöglichkeiten, deren Ursache und deren Beseitigung beschrieben. Weitere Informationen: [8] MSP430-CD: X:\Literature\Literature – MSP 430\User’s Guide\ a430.pdf
Assembler, Linker, Librarian Programming Guide
cw430.pdf
C-SPY User Guide
icc430.pdf
C-Compiler Programming Guide
Internet:
http://www.iar.se
323
11 Die MSP430F449 Quick Start Software
11.1
Einleitung
Für die MSP430F44x-Familie werden eine Software mit getesteten Routinen und Subroutinen, die in Assemblersprache geschrieben sind, gezeigt. Für jedes Peripherie-Modul des MSP430F44x ist ein Programm enthalten. In den Kapiteln, welche die einzelnen Programme beschreiben, sind Hinweise gegeben, wie man die Programme abändern kann und wo andere nützliche Softwarebeispiele gefunden werden können. Die Software ist im IAR-Assemblerformat für das IAR-Entwicklungswerkzeug 2.20 geschrieben. Die Softwarebeispiele für die MSP430F44x-Familie sind als eine Hilfe gedacht, um wesentlich schneller eine funktionierende Software zu erhalten. Dies bedeutet, schneller am Markt zu sein. Alle Überlegungen, was alles am Beginn einer Entwicklung notwendig ist, können entfallen: Es ist bereits in der Software enthalten. Aus diesem Grunde wird sie im Folgenden auch als »Quick Start Software« bezeichnet. Der gegebene Code enthält alle Softwareteile, die für ein Projekt notwendig sind: Die am häufigsten gebrauchten Softwaremodule für jedes Peripherie-Modul, das auf dem Chip enthalten ist, sind zusammengefasst. Die sieben Softwareteile, die für die Verwendung eines Peripherie-Modules notwendig sind, werden aufgeführt: • Definitionen, Macros, Initialisierung, Hauptprogramm (Background), Subroutinen, Interrupt-Routinen (Foreground), Interrupt-Vektoren Die Benutzung dieser getesteten Software macht eine Menge Suchen und Softwareentwicklung unnötig. Für kleinere Familienmitglieder der MSP430F4xxFamilie kann die Software durch Weglassen vereinfacht werden. Anmerkung: Nur typische Werte sind in den Beispielen verwendet. Für maximale und minimale Werte müssen die aktuellen Datenblätter verwendet werden.
324 11.2
Kapitel 11: Die MSP430F449 Quick Start Software
Struktur der Quick Start Software
Die Quick Start Software für die MSP430F44x-Familie besteht aus sieben Teilen: 1. Definitionen:
Vom Benutzer definierte Werte, z.B. für RAMBytes und Worte
2. Macro-Definitionen:
Definitionen der benutzten Assembler-Macros
3. Initialisierung:
Initialisierung für die Peripherie-Module und des RAMs
4. Hauptprogramm:
Demo-Software und Beispiele
5. Subroutinen:
Verwendete Subroutinen komma-Paket FPP4
6. Interrupt-Routinen
Interrupt-Behandlung für die Peripherie-Module
7. Interrupt Vektoren:
Definiert für die MSP430F44x-Familie
einschließlich
Gleit-
Diese sieben Programmteile werden im Folgenden erklärt. Sie können bei Bedarf geändert und ergänzt werden. Wie dies zu bewerkstelligen ist, wird im Kapitel »Änderung der Quick Start Software« erklärt.
11.2.1 Definitionen Die Hardware-Register der Peripherie-Module müssen nicht definiert werden, wenn – wie in der Quick Start Software gemacht – am Beginn des Programms die Programmzeile #include "msp430x44x.h" ; MSP430x44x Definitionen
steht. Der Assembler liest die Definitionen aus dieser Datei, die in der IAR-Software enthalten ist. Es ist sehr zu empfehlen, diese Definitionen zu verwenden, da die Software vereinheitlicht und die Lesbarkeit verbessert wird. Für jedes Peripherie-Modul sind die anwendungsspezifischen Definitionen zusammengefasst: • Die applikationsabhängigen Definitionen sind am Beginn angeordnet (z.B. die Baudrate einer SPI-Schnittstelle). Die Definitionen, die applikationsabhängig sind, und daher geändert werden sollten, sind mit »;[]« statt »;« am Beginn des Kommentars gekennzeichnet. Es ist also relativ einfach, diese Definitionen zu finden. • Am Ende der Definitionen sind die Reservierungen für die RAM-Bytes und RAM-Worte gemacht. Hier sind Status, Datenlisten, Zwischenspeicher usw. reserviert. All diese Werte können nach Bedarf geändert werden. Anmerkung: Auch im Initialisierungsteil sind noch einige wenige Definitionen enthalten. Auch sie sind mit »;[]« gekennzeichnet.
11.2 Struktur der Quick Start Software
325
11.2.2 Macro-Definitionen Für einige Peripherie-Module (z.B. die USARTs) sind Macros definiert, welche die Verwendung stark vereinfachen. So ist es z.B. nicht einfach, den Inhalt des »Modulation Register« der USART für relativ langsame Clock-Raten auszurechnen. Das enthaltene Macro CALC_UART berechnet alle notwendigen Werte für die korrekte Initialisierung beider USARTs, sowohl für den Betrieb als UART als auch als SPI. Diese Macros benötigen weder Programmspeicher noch RAM: Sie berechnen nur wichtige Werte für die Register der Peripherie-Module.
11.2.3 Initialisierung Die unbedingt notwendige Initialisierungs-Software für die benutzten PeripherieModule ist in diesem Softwareteil enthalten. Es ist dringend empfohlen, die Reihenfolge der Befehle in den einzelnen Programmsequenzen nicht zu ändern: Nur die gezeigte Reihenfolge garantiert die korrekte Funktion der Initialisierung der Peripherie-Module. Auch die Initialisierung enthält einige Definitionen. Auch sie sind mit »;[]« am Kommentarbeginn gekennzeichnet.
11.2.4 Hauptprogramm Das Hauptprogramm zeigt einige Möglichkeiten, wie man die Peripherie-Routinen in die Software einbinden kann. Für jedes Peripherie-Modul ist ein Beispiel gegeben. Ein kleines Demo-Programm ist enthalten, das mit dem Analog-DigitalWandler ADC12 einen Analog-Eingang misst, den ADC-Wert in eine Spannung relativ zu AVcc umrechnet und diese in der LCD-Anzeige ausgibt. Eine nähere Erklärung ist im Kapitel »Beschreibung der Quick Start Software« gegeben.
11.2.5 Subroutinen Einige verwendete, getestete Subroutinen sind hier enthalten. So z.B. die Messroutine für den Analog-Digital-Wandler ADC12 und die Schreibroutine für die beiden Information Memories A und B.
11.2.6 Interrupt-Routinen Interrupt-Routinen für die Peripherie-Module, die den Interrupt verwenden, sind hier enthalten. Die Interrupt-Routinen sind so kurz als möglich geschrieben und sind sowohl in der Code-Länge als auch in der Verarbeitungszeit optimiert. Sie erfüllen damit wichtige Forderungen für Echtzeit-Anwendungen (real time). Flags sind vermieden, statt dessen werden Status für die Kontrolle des Ablaufs verwendet.
326
Kapitel 11: Die MSP430F449 Quick Start Software
11.2.7 Interrupt-Vektoren Die sechzehn Interrupt-Vektoren sind hier für die MSP430F44x-Familie angegeben. Peripherie-Module, die den Interrupt nicht benutzen, sollten – wie im Programm gemacht – den Interrupt-Vektor mit der Adresse einer RETI-Instruktion laden. Dies gibt die höchstmögliche Sicherheit, dass ein durch externe Störungen verursachter Interrupt nicht ein Aufhängen des Programms bedeutet. Bei Peripherie-Modulen, die ihre Interrupt-Flags nicht automatisch löschen, ist noch ein Rücksetzen dieses Flags nötig.
11.3
Änderung der Quick Start Software
Wird das MSP430-Familienmitglied geändert, dann muss die Programmzeile #include "msp430x44x.h"
; MSP430x44x Definitionen
am Beginn der Quick Start Software gegen die richtige ausgewechselt werden. Mehr darüber im Kapitel »Codieren mit dem Editor«.
11.3.1 Änderung von Definitionen Die vom Benutzer definierten Definitionen sind durch »;[]« vor dem Kommentar gekennnzeichnet. Diese änderbaren Definitionen sind am Beginn der Definitionen und der Initialisierungen angeordnet. Der Wert hinter der EQUDirektive wird auf den gewünschten Wert gesetzt. Der erlaubte Bereich des Wertes kann aus den zugehörigen Applikationsberichten entnommen werden. Der erlaubte Bereich hängt normalerweise stark von der benutzten System Clock Frequency SMCLK ab. Sie ist mit dem Wert SMCLK am Beginn der Quick Start Software definiert.
11.3.2 Einfügen von Softwaremodulen Diese Softwaremodule können beispielsweise sein: • Die Anwendersoftware • Das Gleitkommapaket FPP4 und seine speziellen Funktionen (trigonometrische, logarithmische und hyperbolische Funktionen). Die Grundfunktionen sind schon enthalten. • Andere Treiber für Peripherie- und Softwaremodule die in [1] oder in anderen Applikationsberichten enthalten sind. Siehe auch das Kapitel »Referenzen und wo zu finden«.
11.4 Blockschaltbild der MSP430x44x-Familie
327
• Vom Anwender geschriebene Peripherie-Routinen und Softwaremodule Wenn Softwaremodule eingefügt werden sollen, dann sind die folgenden Schritte empfohlen: • Aufteilung der Module in die – bis zu sieben – Teile, die zuvor gezeigt wurden. Nicht jedes Modul besteht aus allen Teilen, es müssen natürlich nur die notwendigen berücksichtigt werden. So besteht z.B. das Gleitkommapaket FPP4 nur aus den Definitionen und dem Programm selber (das besteht allerdings aus drei Dateien). • Anhängen der bis zu sieben Teile an die entsprechenden Softwareteile der Quick Start Software.
11.3.3 Entfernen von Softwaremodulen Die – bis zu – sieben Teile von nicht verwendeten Peripherie-Modulen werden gelöscht. Dies kann sein, weil die Peripherie-Module nicht auf dem Chip vorhanden sind, oder weil sie nicht benötigt werden. Wenn der Assembler anschließend Fehler findet, dann muss individuell die Ursache beseitigt werden.
11.4
Blockschaltbild der MSP430x44x-Familie
Auf die in Abbildung 11.1 gezeigten Peripherie-Module des MSP430F44x wird in den nächsten Kapiteln eingegangen: Ihre Behandlung in der MSP430F449 Quick Start Software wird kurz erläutert.
Abb. 11.1: Der MSP430F44x mit seiner Peripherie
328 11.5
Kapitel 11: Die MSP430F449 Quick Start Software
Schaltbild des Quick Start Software-Beispiels
Abbildung 11.2 zeigt das Prinzipschaltbild der Hardware, die für die MSP430F449 Quick Start Software als Beispiel angenommen wird. Nicht benutzte PeripherieModule sind: • Die mit »Frei« bezeichneten I/O-Ports auf der linken Seite der Schaltung • Die Timer_B Module TB3 bis TB6
Abb. 11.2: Prinzipschaltbild der MSP430F44x Quick Start Software
11.6
Beschreibung der MSP430F449 Quick Start Software
Die Erklärungen beziehen sich auf das Blockschaltbild in Abbildung 11.1 und das Prinzipschaltbild, das in Abbildung 11.2 gezeigt ist. Nicht aufgeführt sind Beschreibungen der Hardware-Definitionen, da sie festgelegt sind und nicht geändert werden können.
11.6 Beschreibung der MSP430F449 Quick Start Software
329
Anmerkung: Die Peripherie-Module, deren Verwendung in der MSP430F449 Quick Start Software gezeigt wird, werden im Kapitel »Die Peripherie-Module« noch eingehender behandelt.
11.6.1 Demonstrationsprogramm Ein Demo-Programm ist in der MSP430F449 Quick Start Software enthalten. Es ist als »Rahmenprogramm«, beziehungsweise als Anregung gedacht, wie ein MSP430-Programm aussehen könnte. Es führt die folgenden Schritte in einer Schleife durch, die jede Sekunde durchlaufen wird: • Zurücksetzen des Watchdogs, falls sowohl der Basic Timer1 als auch der Timer_A noch aktiv sind (d.h. ihre Aktivitäts-Flags in den Interrupt-Routinen gesetzt haben). • Test, ob eine volle Sekunde vergangen ist. Falls nicht, Rückkehr in den gewählten Low Power Mode (LPM0 oder LPM3). • Messung der Eingangsspannung Vin am Analogeingang A0 des 12-BitADCs. Der Bereich der Spannung Vin reicht von AVss (Messwert 000h) bis AVcc (Messwert FFFh). Nach der Messung wird der ADC12 abgeschaltet, um minimalen Stromverbrauch zu erreichen. • Das Ergebnis des Analog-Digital-Wandlers ADC12 wird mit einem Slope SlopeV und einem Offset OffsetV korrigiert. Beide Werte stehen im Information Memory B. Für die Rechnung wird das Gleitkommapaket FPP4 verwendet, was die Rechnung sehr vereinfacht. Der Hardware-Multiplizierer wird dabei vom Gleitkommapaket verwendet (HW_MPY EQU 1). • Das korrigierte ADC12-Resultat wird mit einem Wert multipliziert, der die Anzahl der Nachkommastellen und die Referenzspannung (AVcc) beinhaltet. Dieser Wert – auch er ist im Information Memory B definiert – ist (3,00 V 1000/212) = 0,732422 mV/ADC-Schritt. • Der Gleitkommawert von Vin 1000 – um drei Nachkommastellen zu erhalten – wird in BCD-Format umgerechnet. Die Konversionsroutine CNV_FP_BCD des FPP4 wird dafür verwendet. • Der BCD-Wert von Vin 1000 wird an die 14-stellige LCD-Anzeige ausgegeben. Die 10-3-Stelle (LSD) wird mit den Select-Leitungen S0 und S1 ausgegeben. • Für die LCD-Anzeige wird die Unterdrückung führender Nullen (leading zero suppression) durchgeführt und der Dezimalpunkt wird hinter die 100Stelle geschrieben (z.B. 2.955).
330
Kapitel 11: Die MSP430F449 Quick Start Software
• Falls die Uhrzeit 23:59:59 ist, wird der Inhalt des Information Memory B in einen RAM-Buffer geschrieben, geänderte Werte (anwendungsabhängig) werden modifiziert und das Ergebnis (128 Bytes) zurück in das Information Memory B geschrieben. • Jede volle Minute (Uhrzeit ist xx:xx:00) werden die beiden Motoren 1 und 2 für 2 Sekunden eingeschaltet. Dafür wird der Timer_B mit seiner PWMMöglichkeit benutzt. • Die beiden Eingänge CA0 und CA1 werden mit dem Comparator_A verglichen. Je nachdem, welcher Eingang eine höhere Spannung zeigt, können verschiedene Programmteile durchlaufen werden. • Der Ereigniszähler, der an den Interrupt-Eingang P1.3 angeschlossen ist, wird sicher ausgelesen. Da dies im Abstand von 1 Sekunde geschieht, enthält er die Frequenz der letzten Sekunde. Diese wird gespeichert und der Wert akkumuliert. • Es wird geprüft, ob die Speisespannung AVcc größer als 1,8 V ist. Falls nein, kann ein bestimmter Programmteil durchlaufen werden. • Nach Fertigstellung aller Aufgaben geht das Programm in den LPM3 (SMCLK inaktiv) oder den LPM0 (SMCLK bleibt aktiv). Der nächste Interrupt (normalerweise der 4-Hz-Interrupt des Basic Timer1, der die Zeitgrundlage darstellt) weckt den MSP430 und lässt ihn die obige Folge neu starten. Falls der Basic Timer1 den MSP430 aufweckt, erhöht seine Interrupt-Routine die Uhrzeit – und gegebenenfalls auch das Datum – wenn eine volle Sekunde vorbei ist.
11.6.2 System Clock Generator FLL+ Definitionen: Es sind vier Werte zu definieren: SMCLK
Die Ausgangsfrequenz des System Clock Generators für die CPU (MCLK) und die Peripherie-Module (SMCLK), wobei gleiche Frequenz angenommen wird. Die Demo-Software verwendet 2,096 MHz.
fcrystal
Die Eingangsfrequenz des System Clock Generators. Die DemoSoftware verwendet einen Uhrenquarz mit 32.768 Hz (215 Hz).
FLLDw
Der gewünschte Untersetzungsfaktor zwischen der FLL+-Ausgangsfrequenz und den Frequenzen SMCLK und MCLK. Die Demo-Software verwendet den Wert 1, was minimalen Stromverbrauch bedeutet. Die Untersetzungsfaktoren 2, 4 und 8 können verwendet werden, wenn die (minimale) Frequenzschwankung (Jitter) von SMLK und MCLK noch weiter reduziert werden soll.
11.6 Beschreibung der MSP430F449 Quick Start Software
CL
331
Die für den Quarz notwendige Lastkapazität CL. Sie ist normalerweise 6 pF, es sind aber auch drei andere interne Werte möglich: 1 pF, 8 pF und 10 pF.
Initialisierung: Mit den oben definierten vier Werten errechnet die Subroutine INITSR die optimalen Größen für den System Clock Generator und setzt sie in die Kontrollregister ein. Auch der optimale Stromschalter FN_x wird ausgewählt, um den DCO in die Mitte des gewünschten Frequenzbereiches zu bringen. Der SMCLK wird an Pin P1.4, der ACLK an P1.5 ausgegeben (beide gepuffert). Weitere Informationen: [1] Kapitel »The System Clock Generator« [5] Kapitel »FLL+ Clock Module« [10] Application Report »The Frequency Locked Loop System Clock Generator (FLL+)« Kapitel »Der FLL+ System Clock Generator«
11.6.3 Oscillator Fault Detection Definitionen: Nur Hardware-Definitionen. Initialisierung: Der Interrupt für einen Oszillatorfehler wird eingeschaltet. Hauptschleife: Nicht darin enthalten. Interrupt-Routine: Die Interrupts des Oszillatorfehlers und des NMI haben einen gemeinsamen Interrupt-Vektor an der Adresse FFFCh. Der erste Befehl der gemeinsamen Interrupt-Routine prüft den Flag OFIFG ob ein Oszillatorfehler passierte. Falls dies nicht der Fall ist, passierte ein NMI-Interrupt. Die jeweiligen benutzerspezifischen Programmteile können einfach in die vorhandene Software eingesetzt werden. Mehr Information: [1] Kapitel »The System Clock Generator«, »The Oscillator Fault Interrupt« [5] Kapitel »FLL+ Clock Module«, »Oscillator Fault Detection«
11.6.4 RAM Definitionen: Definition der niedrigsten (RAMSTRT) und der höchsten RAMAdresse (RAMEND). RAMSTRT hat immer den Wert 200h, RAMEND hängt vom MSP430-Typen ab.
332
Kapitel 11: Die MSP430F449 Quick Start Software
Tabelle 11.1 zeigt die Größe von RAMEND für die MSP430F43x und MSP430F44x. Der Wert 256 Bytes gibt die Größe der beiden Information Memories A und B an. MSP430-Typ
RAM-Größe
RAMEND
Flash-Größe
MSP430F435 MSP430F436 MSP430F437 MSP430F447 MSP430F448 MSP430F449
512 Bytes 1 Kbyte 1 Kbyte 1 Kbyte 2 Kbyte 2 KByte
400h – 2 600h – 2 600h – 2 600h – 2 A00h – 2 A00h – 2
16 KByte + 256 Byte 24 KByte + 256 Byte 32 KByte + 256 Byte 32 KByte + 256 Byte 48 KByte + 256 Byte 60 KByte + 256 Byte
Tabelle 11.1: Wert von RAMEND und Speichergrössen
Initialisierung: Wenn das RAM-Wort INITKEY (Adresse 200h) nicht den (nach dem Einschalten fast unmöglichen) Wert F05Ah enthält – was bedeutet, dass das RAM ohne Speisespannung war – wird das RAM vollständig gelöscht und F05Ah in INITKEY geschrieben. Enthält das RAM-Wort INITKEY den Wert F05Ah, dann war der Watchdog oder eine externe Störung die Ursache für den RESET und die Information des RAMs kann gerettet werden. Der Stack Pointer SP wird mit der ersten Adresse oberhalb des RAMs geladen: Der erste Stack-Wert wird also in das Wort mit der Adresse RAMEND geschrieben. Weitere Informationen: [1] Kapitel »Connection of large External Memories« [5] Kapitel »RAM and Peripheral Organization«
11.6.5 Information Memory Definitionen: Definition der Korrekturwerte für die gemessenen ADC12-Werte (FPP4-Format) im Information Memory B. Durch die Programmzeile rseg
INFO (7)
wird dem Assembler mitgeteilt, dass es sich um das Information Memory B handelt. Für das Information Memory A sieht diese Definition so aus: align
7
11.6 Beschreibung der MSP430F449 Quick Start Software
333
Initialisierung: Eine Initialisierung ist nicht notwendig, der Programminhalt der beiden Information Memories A und B wird beim Programmieren des Programmspeichers mitprogrammiert. Hauptschleife: Alle 24 h um 23:59:59 – die Uhrzeit ist einfach zu ändern – wird das Information Memory B in den RAM-Buffer IM_Buffer geladen, geänderte Werte werden überschrieben und die neuen Daten zurückgeschrieben. Die neuen Werte im Information Memory B werden mit denjenigen im RAM verglichen und bei Übereinstimmung aller 128 Bytes das N-Bit im Status Register gelöscht, bei Nichtübereinstimmung ist es gesetzt. Die gleiche Subroutine Write_Flash ist auch für das Information Memory A verwendbar: Es ist nur das Argument der Subroutine von 1000h auf 1080h zu ändern. Weitere Informationen: [5] Anhang C »Flash Memory« Kapitel »Die Flash-Speicher«
11.6.6 12-Bit-Analog-Digital-Wandler Definitionen: Alle Hardware-Definitionen sind in der IAR-Datei »msp430x44x.h« enthalten. Initialisierung: Die Subroutine MEAS_ADC12 initialisiert sich vollständig neu vor jeder Messung der acht Analogeingänge A0 bis A7. Die Bedingungen für jede der acht Messungen sind einfach änderbar (Eingang Ax, Referenzspannung usw.). Interrupt-Routine: Der Interrupt des ADC12 wird nicht verwendet. Weitere Informationen: [2] Kapitel »The 12-Bit Analog-to-Digital Converter« [5] Kapitel »ADC12« Kapitel »Der Analog-Digital-Wandler ADC12«
11.6.7 Digitale Ein- und Ausgabeports Definitionen: Alle Hardware-Definitionen der fünf Ports sind in der IAR-Datei »msp430x44x.h« enthalten. Die drei RAM-Worte für den 16-Bit-Ereigniszähler sind: • EVTCNT Zählt die fallenden Flanken am Port 1.3 während einer Sekunde • EVTFRQ Enthält die gezählten Flanken der letzten Sekunde (Frequenz) • EVTACC Enthält die Anzahl der akkumulierten Flanken
334
Kapitel 11: Die MSP430F449 Quick Start Software
Initialisierung: Die fünf Ports werden in den für das Demonstrationsprogramm notwendigen Zustand gebracht. Nicht verwendete Ports werden als Ausgang geschaltet (bessere Störsicherheit). Hauptschleife: Die Behandlung des 16-Bit-Ereigniszählers wird gezeigt. Es wird eine sichere Methode des Auslesens verwendet, bei der kein Eingangsimpuls verloren gehen kann. Interrupt-Routinen: Für die Ports 1 und 2 sind der Beginn und das Ende einer Interrupt-Routine gezeigt. Die Flags PxIFG werden in einer Weise gelesen und zurück gesetzt, die garantiert, dass keine Information verloren gehen kann: Nur die gelesenen Flags werden zurück gesetzt, ein während der Interrupt-Routine gesetzter Flag löst nach der Rückkehr vom Interrupt einen nochmaligen Interrupt aus. Der 16-Bit-Ereigniszähler EVNTCNT wird von jeder fallenden Flanke am Eingang P1.3 inkrementiert. Weitere Informationen: [1] Kapitel »I/O-Port Usage« [5] Kapitel »Digital I/O Configuration« Kapitel »Die digitalen Ein- und Ausgabeports«
11.6.8 Flüssigkristallanzeigen-Treiber (LCD) Definitionen: Die acht Segmentdefinitionen (a bis h) müssen an die Hardware der verwendeten Flüssigkristallanzeige angepasst werden: Die tatsächlich benutzten Common- und Select-Leitungen müssen für jedes Segment definiert werden. Beispiele sind in [5] Kapitel »Liquid Crystal Display Drive« gegeben. Die Definitionen, die beschreiben, welche Segmente bei einem bestimmten Zeichen aktiviert sind, werden in der nächsten Tabelle für die Zahlen von 0 bis 9 und die Buchstaben A bis F angegeben. Sie sind für die alphanumerischen Zeichen von 0 bis 15 definiert und können bei Bedarf geändert werden. Das letzte benutzte LCD Buffer Byte wird mit dem Wert LCDM definiert: Hier 9Eh, was den Select-Leitungen S26/S27 entspricht. Initialisierung: Das LCD Control Byte LCDCTL wird folgendermaßen initialisiert: • S0 bis S27 sind Segmentleitungen:
080h
LCDP2
• 4MUX-Multiplex:
01Ch
LCD4MUX
• LCD-Treiber aktiv:
01h
LCDON
11.6 Beschreibung der MSP430F449 Quick Start Software
335
Abb. 11.3: Die Segment/Common-Anordnung der Quick Start Software
Hauptschleife: Die zwölf BCD-Zahlen in den RAM-Bytes RES bis RES+7 werden mit der Subroutine LCDOUT in das LCD Display Memory 091h bis 9Ch geschrieben. Anschließend werden die führenden Nullen unterdrückt. Die Information erscheint daraufhin automatisch in der LCD. Weitere Informationen: [5] Kapitel »Liquid Crystal Display Drive«
11.6.9 Basic Timer1 Definitionen: Die RAM-Definitionen für einen 32-Bit-Timer, der mit 128 Hz Eingangsfrequenz gezählt wird, sowie für eine 24-h-Uhr mit Kalender werden gemacht. Die Uhr wird im Sekundentakt weitergezählt, der Kalender enthält auch die Behandlung eines Schaltjahres. Initialisierung: Die Interrupt-Frequenz des Basic Timer1 wird auf 4 Hz gesetzt, der Interrupt des Basic Timer1 wird eingeschaltet. Diese Werte sind einfach änderbar. Hauptschleife: Der Basic Timer1 wird in der Hauptschleife nicht benutzt, es wird nur auf die Information des 32-Bit-Timers zugegriffen, um den 1-s-Takt festzustellen. Subroutinen: Es sind zwei Subroutinen vorhanden: RTCLKD:
Sie erhöht eine 24-Stunden-Uhr um eine Sekunde. Wird 00:00:00 Uhr erreicht, so ist bei der Rückkehr das Carry Bit gesetzt, ansonsten ist es gelöscht. Die Zählung erfolgt im BCD-Format.
DATES:
Das Datum wird mit jedem Aufruf um einen Tag erhöht. Schaltjahre werden berücksichtigt. Die Zählung erfolgt binär.
336
Kapitel 11: Die MSP430F449 Quick Start Software
Interrupt-Routine: Aufruf im 4-Hz-Takt. Der Aktivitätsflag für den Watchdog wird gesetzt. Der Sekundenzähler wird um Eins erhöht, falls eine Sekunde vorbei ist. Uhr und Kalender werden auf den neuesten Stand gebracht. Wenn eine Sekunde vorbei ist, werden die Low Power Bits (CPUoff, SCG1 und SCG0) im Status Register gelöscht, sodass der Active Mode nach der Rückkehr aus der Interrupt-Routine sicher eingeschaltet ist. Weitere Informationen: [1] Kapitel »The Basic Timer« Hier sind einige Anwendungen des Basic Timer gezeigt: • Änderung der Frequenz des Basic Timer1 während des Betriebs (abwechselnde Verwendung zweier Frequenzen ohne den Verlust von Impulsen) • Kompensation der Quarztoleranz durch Messung des Frequenzfehlers • Verwendung des Basic Timer als einen 16-Bit-Timer [5] Kapitel »Basic Timer1« Kapitel »Der Basic Timer1«
11.6.10 Comparator_A Definitionen: Alle Hardware-Definitionen sind in der IAR-Datei »msp430x44x.h« enthalten. Initialisierung: Der Comparator_A wird eingeschaltet. Der Vergleich der beiden Eingänge CA0 und CA1 wird verwendet. Das Ausgangsfilter wird eingeschaltet. Hauptschleife: Der Zustand des Comparator-Ausgangs wird abgefragt (Bit CAOUT). Abhängig vom Zustand können zwei verschiedene Programmteile durchlaufen werden: • CA0 > CA1: Die Spannung am Eingang CA0 ist größer als die an CA1 • CA1 > CA0: Die Spannung am Eingang CA0 ist kleiner als die an CA1 Weitere Informationen: [1] Kapitel »The Comparator_A« [2] Kapitel »The Comparator_A« [5] Kapitel »Comparator_A« Kapitel »Der Comparator_A«
11.6 Beschreibung der MSP430F449 Quick Start Software
337
11.6.11 Brownout und Supply Voltage Supervision Definitionen: Alle Hardware-Definitionen sind in der IAR-Datei »msp430x44x.h« enthalten. Initialisierung: Das Modul wird auf den Vergleich der Speisespannung mit 1,8 V eingestellt. Die Reset-Funktion POR durch Unterspannung ist nicht eingeschaltet. Hauptschleife: Der Zustand des Comparator-Ausgangs wird abgefragt (Bit SVSOP). Abhängig vom Zustand können zwei verschiedene Programmteile durchlaufen werden. Es sind zwei verschiedene Programmversionen vorhanden, die mit dem Wert LPM3use geschaltet werden: • LPM3use = 0:
Das Bit SVSOP wird abgefragt und entsprechend verzweigt. Das Modul ist immer eingeschaltet, da der Stromverbrauch des Moduls keine große Rolle spielt (LPM0 wird verwendet).
• LPM3use = 1:
Das Modul wird eingeschaltet und 160 ms gewartet, um eine sichere Funktion zu ermöglichen. Am Ende der Routine wird das Modul wieder abgeschaltet, um minimalen Stromverbrauch zu ermöglichen.
Weitere Informationen: [5] Kapitel »System Reset and Initialization« Kapitel »Das SVS-Modul, Reset und die Brownout-Erkennung«
11.6.12 USART0 in SPI Mode Definitionen: Die Baudrate Baudr0 (200 kHz) und die verwendete Clock-Frequenz UARTCLK0 (2,096 MHz, SMCLK) werden definiert. Es sind keine RAM-Definitionen vorhanden, da die SPI-Routinen ihre Informationen über die Arbeitsregister R13, R14 und R15 erhalten. Es können dadurch beliebige Buffer verwendet werden. Macro-Definitionen: Das Macro CALC_UART berechnet die drei notwendigen Werte für das SPI-Modul ohne Speicherplatz zu benötigen: • UBR10/UBR00: Die beiden 8-Bit-Register werden für die Erzeugung der Baudrate verwendet • UMCTL0: Der Inhalt des Modulation Register UMCTL sorgt bei der Verwendung des ACLK – oder einer anderen relativ niedrigen Frequenz – für die korrekte Länge aller Bits, obwohl die Länge eines Bits kein ganzzahliges Vielfaches der Clock-Periode ist.
338
Kapitel 11: Die MSP430F449 Quick Start Software
Initialisierung: Zwei Zeilen in der Initialisierung der SPI können geändert werden. Die Anzahl der Datenbits, der Mode (3 oder 4 Signale), die Priorität (Master oder Slave) und der verwendete Clock sind hier definiert: MOV.B MOV.B
#SSEL1+SSEL0+STC,&UTCTL0 ;[] SMCLK, 3-pin #CHAR+SYNC+MM,&UCTL0 ;[] 8-Bit, Master
Eingestellt sind acht Datenbits, Master Mode, drei Leitungen und der SMCLK. Hauptschleife: Hier sind Beispiele für das Senden und Empfangen von Datenblocks gegeben. Es wird gezeigt, wie eine Datenübertragung (Senden und Empfangen) gestartet wird und wie man prüfen kann, ob sie beendet ist. Die Beispiele sind nicht in die Hauptschleife eingebunden, sondern sind einfach an den notwendigen Stellen im Programm einzusetzen. Interrupt-Routine: Der Interrupt wird nicht verwendet. Die beiden Subroutinen SPI_RCV und SPI_TX können aber einfach auf Interrupt-Betrieb umgeschrieben werden. Weitere Informationen: [5] Kapitel »USART Peripheral Interface, SPI Mode« Kapitel »Die USARTs«
11.6.13 USART1 in UART Mode Definitionen: Die Baudrate Baudr1 (2400 Baud) und die verwendete ClockFrequenz UARTCLK1 (32.768 Hz, ACLK) werden definiert. Die RAM-Definitionen für den Empfangs- und Sendestatus (RCCNT und TXCNT) sowie die Zeiger für die beiden Daten-Buffer (RCPOI und TXPOI) werden gemacht. Zwei Vier-Byte-Buffer (einer für Empfang und einer für Senden, um Full-Duplex Mode zu erlauben) werden auch definiert. Diese beiden Buffer (RCBUF und TXBUF) können bei Bedarf einfach erweitert werden. Macro-Definitionen: Das Macro CALC_UART berechnet die drei notwendigen Werte für das UART-Modul ohne Speicherplatz zu benötigen: • UBR11/UBR01: Die beiden 8-Bit-Register werden für die Erzeugung der Baudrate verwendet. • UMCTL1: Der Inhalt des Modulation Register UMCTL sorgt bei der Verwendung des ACLK – oder einer anderen relativ niedrigen Frequenz – für die korrekte Länge aller Bits, obwohl die Länge eines Bits kein ganzzahliges Vielfaches der Clock-Periode ist. Initialisierung: Drei Zeilen in der Initialisierung der UART können geändert werden. Parity, die Anzahl Stoppbits, die Anzahl der Datenbits und der verwendete Clock sind hier definiert:
11.6 Beschreibung der MSP430F449 Quick Start Software MOV.B MOV.B MOV.B
339
#PENA+SPB+CHAR,&UCTL1 ;[] USART Ctrl Reg. #SSEL0,&UTCTL1 ;[] TX Ctrl Reg ACLK #0,&URCTL1 ;[] RC Ctrl Reg.
Eingestellt sind acht Datenbits, ungerade Parity, zwei Stoppbits und der ACLK. Hauptschleife: Hier sind Beispiele für das Senden und Empfangen von Datenblocks gegeben. Es wird gezeigt, wie eine Datenübertragung (Senden und Empfangen) gestartet wird und wie man sie vorzeitig beenden kann. Die beiden Status RCCNT und TXCNT steuern den Ablauf der Datenübertragung und können auch für die Überwachung des Fortschritts verwendet werden. Die Beispiele sind nicht in die Hauptschleife eingebunden, sondern sind einfach an den notwendigen Stellen im Programm einzusetzen. Interrupt-Routine: Die Interrupt-Routinen für das Senden und den Empfang werden von den beiden Status-Bytes RCCNT und TXCNT kontrolliert. Abhängig von ihrem Stand, wird die empfangene Information in den Buffer RCBUF geschrieben und die zu sendende Information aus dem Buffer TXBUF gelesen. Enthält ein Status-Byte Null, so wird die Aktivität eingestellt. Erreicht ein Status-Byte den Wert Null (programmierte Anzahl Bytes ist empfangen bzw. gesendet), dann werden die Low Power Bits (CPUoff, SCG1 und SCG0) im Status Register gelöscht, sodass der Active Mode nach der Rückkehr aus der Interrupt-Routine sicher eingeschaltet ist. Weitere Informationen: [1] Kapitel »The USART Module« [2] Kapitel »The USART Modules« Es werden drei Möglichkeiten des Betriebs beschrieben: • Die oben beschriebene Software (ACLK mit Interrupt) • Eine UART, die ohne Interrupt arbeitet, indem sie die UART-Flags prüft • Eine UART, die die SMCLK-Frequenz mit Interrupt verwendet [5] Kapitel »USART Peripheral Interface, UART Mode« Kapitel »Die USARTs«
11.6.14 Timer_A Definitionen: Für den Timer_A-Clock TACLK wird die Frequenz SMCLK definiert. Die Port-Bits der drei Signale TA0, TA1 und TA2 werden definiert. Achtung: diese Signale sind bei anderen Familienmitgliedern an anderen PortBits angeschlossen!
340
Kapitel 11: Die MSP430F449 Quick Start Software
Vier Worte sind reseviert für: • OLDRE
Zeitpunkt des letzten 0 1-Übergangs am Eingang TA1
• PERIOD
Berechnete Periode des Eingangssignals an TA1
• STOR2
Zeitpunkt des letzten 1 0-Übergangs am Eingang TA2
• TIMAEXT
Erweiterung des Timer_A-Registers TAR auf 32 Bit.
Initialisierung: Das Timer_A-Kontrollwort TACTL und die anderen Kontrollwörter TACCTLx werden für folgende Funktionen initialisiert: • TACTL
SMCLK als Clock, Interrupt für Überlauf TAR ein, TAR löschen
• TACCTL0
Reset Mode (Interrupt setzt TA0 zurück), Interrupt ein für TAR = TACCR0, eine Frequenz von ungefähr 1 kHz wird am Ausgang TA0 erzeugt
• TACCTL1
Capture Mode (positive Flanke an TA1), Interrupt ein für positive Flanke an TA1, mit SMCLK synchronisiertes Lesen von TA1
• TACCTL2
Capture Mode (negative Flanke an TA2), Interrupt ein für negative Flanke an TA2, mit SMCLK synchronisiertes Lesen von TA2
• TACCR0
»1« wird in das Register geschrieben, damit mit dem nächsten SMCLK-Puls die Frequenzerzeugung an TA0 beginnt.
Der Timer_A wird danach im Continuous Mode gestartet. Hauptschleife: Keine Aktivität, nur Interrupt-Betrieb. Interrupt-Routine: Die vier Interrupt-Routinen und die Dekodierung mit dem Vektor-Wort TAIV werden gezeigt. Abbildung 11.4 zeigt die vier Funktionen des Timer_A: • TACCTL0
Die Periodenlänge von 1 kHz wird auf das Register TACCR0 addiert (Zeitpunkt des nächsten Interrupts), der Ausgang TA0 wird zurückgesetzt und sofort wieder gesetzt (negativer Impuls an TA0).
• TACCTL1
Mit dem gespeicherten Zeitpunkt der positiven Signalflanke an TA1 in TACCR1 wird die Periode des Signals im RAM-Wort PERIODE errechnet. Der jetzige Zeitpunkt in TACCR1 wird für die nächste Periodenberechnung im RAM-Wort OLDRE gespeichert.
• TACCTL2
Der gespeicherte Zeitpunkt der negativen Signalflanke an TA2 wird in STOR2 gespeichert.
11.6 Beschreibung der MSP430F449 Quick Start Software
341
Abb. 11.4: Timer_A-Funktion im Beispielprogramm
Weitere Informationen: [1] Kapitel »The Timer_A« [2] Kapitel »The Timer_A« [5] Kapitel »Timer_A« Kapitel »Der Timer_A« Anmerkung: Die Beispiele für den Timer_A in [1] müssen bei der Verwendung der Output Unit mit I/O-Ports leicht verändert werden: • Bei der MSP430C3xx-Familie schaltet das CAP-Bit im Register TACCTLx die Richtung des Ports, der an die Output Unit angeschlossen ist. • Bei den MSP430F1xx und MSP430F4xx schaltet das jeweilige PxDIR-Bit die Richtung dieses Ports. Es muss bei diesen beiden MSP430-Familien also zusätzlich das zugehörige PxDIR-Bit gesetzt werden.
11.6.15 Timer_B Definitionen: Für den Timer_B-Clock TBCLK wird die Frequenz SMCLK definiert. Die PWM-Frequenz wird auf 20,0 kHz festgelegt. Die Port-Bits der zwei verwendeten Signale TB0 und TB1 werden definiert. Achtung: diese Signale sind bei anderen Familienmitgliedern an anderen Port-Bits angeschlossen!
342
Kapitel 11: Die MSP430F449 Quick Start Software
Initialisierung: Das Timer_B-Kontrollwort TBCTL und die anderen Kontrollwörter TBCCTLx werden für folgende Funktionen initialisiert: • TBCTL
SMCLK als Clock, Interrupt aus für Überlauf, Timer Register TBR löschen
• TBCCTL1
Reset/Set Mode (Überlauf von TBR setzt TB1, Gleichheit von TBCCR1 mit TBR setzt TB1 zurück), Interrupt aus
• TBCCTL2
Reset/Set Mode (Überlauf von TBR setzt TB2, Gleichheit von TBCCR2 mit TBR setzt TB2 zurück), Interrupt aus
• TBCCR0
Die Anzahl SMCLK-Pulse für die PWM-Frequenz I3:0 wird in das Register geschrieben (60&/.I3:0 ±). Sie kann durch die Definition von I3:0 einfach verändert werden.
• TBCCR1
Die PWM-Pulslänge wird auf Null gesetzt (Motor 1 aus)
• TBCCR2
Die PWM-Pulslänge wird auf Null gesetzt (Motor 2 aus)
Der Timer_B wird danach im Up Mode gestartet. Hauptschleife: Jede volle Minute werden die beiden Motoren 1 und 2 für zwei Sekunden eingeschaltet. Dazu wird die gewünschte PWM-Länge – in Prozenten der PWM-Pulslänge ausgedrückt- in die Register TBCCR1 und TBCCR2 geschrieben. Nach zwei Sekunden werden die Motoren durch die PWM-Länge Null ausgeschaltet und die Ausgänge TB1 und TB2 definiert auf DVss gesetzt (sonst laufen die Motoren – je nach zufälligem Stand von TB1 und TB2 – eventuell mit 100 % PWM weiter!). Interrupt-Routine: Es wird kein Interrupt verwendet. Die sechs möglichen Interrupt-Routinen und die Dekodierung mit dem Vektor-Wort TBIV werden gezeigt. Die Interrupt-Routinen können bei Bedarf mit Code versehen werden, allerdings muss dazu in der Initialisierung der jeweilige Interrupt mit eingeschaltet werden (siehe Initialisierung des Timer_A als Beispiel dafür). Weitere Informationen: [1] Kapitel »The Timer_A«: Alle Beispiele können verwendet werden. Siehe Anmerkung im Kapitel »Der Timer_A«. [2] Kapitel »The Timer_B« [5] Kapitel »Timer_B« Kapitel »Der Timer_B«
11.6 Beschreibung der MSP430F449 Quick Start Software
343
11.6.16 Watchdog Definitionen: Es werden ein RAM-Byte WDFlg und zwei Bits darin – BTFlg (Basic Timer1 Flag) und TAFlg (Timer_A Flag) – sowie deren Summe (WDcFlg = BTFlg + TAFlg) definiert. Initialisierung: Das Watchdog Control Word WDTCTL wird wie folgt initialisiert: • Watchdog Mode:
WDTTMSEL = 0
• ACLK wird benutzt:
WDTSSEL = 1
• Watchdog Interval ist 215/ACLK: WDTIS0 = WDTIS1 = 0. (1,0 s) • RST/NMI-Pin ist Reset-Pin:
WDTNMI = 0
• Watchdog-Funktion inaktiv:
WDTHOLD = 1 (wird später aktiviert)
Hauptschleife: In Abständen von 0,25 s wird geprüft, ob die beiden Bits BTFlg und TAFlg gesetzt sind. Das bedeutet, dass sowohl der Timer_A als auch der Basic Timer1 aktiv sind (die beiden Bits werden in den zugehörigen InterruptRoutinen gesetzt). Der Watchdog wird zurückgesetzt, wenn beide Bits gesetzt sind. Wird einer der beiden Timer inaktiv, dann löst der Watchdog einen Reset aus. Interrupt-Routine: Der Watchdog im Watchdog Mode benutzt den ResetVektor (Adresse FFFEh). In der Initialisierung (Label INIT) prüft die Software, ob der Reset durch den Watchdog oder aus einem anderen Grunde erfolgte. Dadurch sind verschiedene Initialisierungen möglich, z.B. eine mit der Erhaltung des RAM-Inhalts. Weitere Informationen: [1] Kapitel »The Watchdog Timer« Das oben gezeigte Verfahren, die Funktion mehrerer Peripherie-Module mit dem Watchdog zu überwachen, wird hier noch erweitert. [5] Kapitel »Watchdog Timer« Kapitel »Der Watchdog Timer«
11.6.17 Hardware Multiplier Definitionen: Alle Hardware-Definitionen sind in der IAR-Datei »msp430x44x.h« enthalten. Initialisierung: Nicht nötig.
344
Kapitel 11: Die MSP430F449 Quick Start Software
Macros: Macros werden für alle acht möglichen Funktionen gezeigt: Multiplikation und MAC-Funktion (multiply-and-accumulate), beide mit und ohne Vorzeichen, beide für 16-Bit- und 8-Bit-Operanden). Weitere Informationen: [1] Kapitel »The Hardware Multiplier« [2] Kapitel »The Hardware Multiplier« Hier ist auch die vorzeichenbehaftete MAC-Funktion ausführlich und mit Beispielen behandelt. [5] Kapitel »Hardware Multiplier« Kapitel »Der Hardware Multiplier«
11.6.18Low Power Mode Definitionen: Mit der Größe LPM3use wird definiert, welcher Low Power Mode am Ende der Hauptschleife verwendet werden soll: • LPM3use = 0:
LPM0 wird verwendet, SMCLK und ACLK bleiben für die Peripherie-Module aktiv, die CPU ist abgeschaltet.
• LPM3use = 1:
LPM3 wird verwendet, nur der ACLK bleibt aktiv.
Initialisierung: Nicht möglich. Hauptschleife: Nach Beendigung aller Berechnungen und Aktivitäten wird der LPM0 bzw. LPM3 eingeschaltet. Die verwendeten Befehle sind: BIS.B
#CPUOFF+GIE,SR
; LPM0 ein: SMCLK aktiv
BIS.B
#CPUOFF+GIE+SCG1+SCG0,SR
bzw. ; LPM3 ein
Interrupt-Routinen: Die Interrupt-Routinen des Basic Timer1 und der beiden UART-Module wecken die CPU aus dem jeweiligen Low Power Mode auf. Der verwendete Befehl dazu ist: BIC.B
#CPUOFF+SCG1+SCG0,0(SP) ; Beende LPMx
Weitere Informationen: [1] Kapitel »Application Operating Modes« [2] Kapitel »The Operating Modes used for MSP430 Applications« [5] Kapitel »Operating Modes« Kapitel »Verringerung des Stromverbrauchs«
11.7 Weitere Informationen
11.7
345
Weitere Informationen
Noch weitergehende Informationen sind in den folgenden Kapiteln der MSP430Literatur enthalten. Die darin enthaltenen Applikationsbeipiele für den MSP430F1xx und den MSP430x3xx lassen sich relativ einfach für die MSP430F4xx-Familie abwandeln.
11.7.1 Digital-Analog-Wandlung [1] Kapitel »Digital-to-Analog Converters« R/2R-Methode, Digital-Analog-Wandler mit gewichteten Widerständen, DigitalAnalog-Wandler die über den I2C-Bus angeschlossen sind, PWM- Digital-Analog-Wandler mit dem Timer_A. Alle diese Methoden sind sehr einfach auch mit dem MSP430x44x zu realisieren, da er eine grosse Anzahl von Ausgängen besitzt.
11.7.2 Verbrauchsmessung [1] Kapitel »Application Examples« Es werden Beispiele für Elektrizitäts-, Gas-, Wasser-, Wärmemengen- und Heizenergiezähler gezeigt. [2] Kapitel »Application Examples« Es werden Beispiele für elektronische Elektrizitäts- und Wasserzähler gezeigt.
11.7.3 Digitale Motorsteuerung [1] Kapitel »Digital Motor Control« [1] Kapitel »Timer_A«, »Software Examples for the Continuous Mode, »TRIAC Control« [1] Kapitel »Timer_A«, »Software Examples for the Up Mode«, »TRIAC Control« Digitale Motorsteuerungen (DMC) mit PWM und mit TRIACs
11.7.4 Batterieüberwachung und Netzausfall-Erkennung [1] Kapitel »Battery Check and Power Fail Detection« [1] Kapitel »The RESET-Function«
346
Kapitel 11: Die MSP430F449 Quick Start Software
Applikationsbeispiele für netz- und batteriegespeiste Systeme werden gezeigt. Mehrere Methoden für die Erkennung und Behandlung von Speisespannungseinbrüchen werden erklärt.
11.7.5 Gleitkommapaket [1] Kapitel »The Floating Point Package« Eine detaillierte Beschreibung des vollständigen Gleitkommapaketes ist enthalten (Definitionen, Basis-, Umwandlungs- und mathematische Routinen). Die mathematischen Routinen (trigonometrische, hyperbolische, logarithmische und exponentielle) sind beschrieben und gezeigt. Die maximalen Fehler sind angegeben. Beispiele für alle Routinen werden gezeigt.
11.7.6 Integerrechenroutinen [1] Kapitel »Integer Calculation Subroutines« Subroutinen für schnelle Multiplikation, Division, Schieberoutinen, Quadratwurzel, Vergleichsroutinen und Zufallszahlen-Erzeugung sind angegeben und werden erklärt. Wo immer möglich, wird – falls vorhanden – der Hardware-Multiplizierer verwendet.
11.7.7 I2C-Bus [1] Kapitel »I2C Bus Connection« Die Software für die Übertragung von 8-Bit-Daten (Lesen und Schreiben) über den I2C-Bus wird gezeigt.
11.8
Die Source der MSP430F44x Quick Start Software
Dieses Kapitel enthält die Source der MSP430F44x Quick Start Software. Das Gleitkommapaket FPP4 wird aus dem Ordner C:\TEST\IAR\FPP413 geladen. Es muss daher zuerst von der MSP430-CD dorthin kopiert werden. Das Vorgehen ist im Kapitel »Die Quick Start Software und das IAR-Entwicklungswerkzeug« beschrieben. Die Source der MSP430F44x Quick Start Software ist auf der MSP430-CD enthalten, allerdings dort in englischer Sprache. Das Programm auf der CD ist identisch mit der unten gezeigten Source, nur die Kommentare unterscheiden sich, da eine Buchseite nicht die volle Kommentarlänge aufnehmen kann.
11.8 Die Source der MSP430F44x Quick Start Software
347
Mit der MSP430x44x Quick Start Software ist es möglich, unmittelbar mit der Entwicklung applikationsbezogener Assembler-Software zu beginnen: Das normalerweise mühsame Zusammensuchen des Programmrahmens entfällt. Jedes der zahlreichen Peripherie-Module ist in der Software mit einer typischen Anwendung enthalten. Die Hinweise bei der Beschreibung der einzelnen Peripherie-Module, wo weitere Informationen und Softwarebeispiele gefunden werden können, erleichtern den Start mit dem MSP430 noch mehr. ;======================================================== ; MSP430 Quick Start Software for the MSP430F44x Family ; ; Texas Instruments Deutschland ; Date: July 25, 2003 ; Author: Lutz Bierl TID
[email protected] ; Version: 1.0 IAR Assembler Format ; Given for inclusion into MSP430-CD 25.7.03 ; LSTOUT+ ;======================================================== ; ; This file contains software for all MSP430x44x ; peripherals. The most often used software handlers are ; included. ; The Software may be adapted to the individual needs. ; ;[] A source line with this comment is thought for ; adaptations. ; #include "msp430x44x.h" ; MSP430F44x Definitionen ; COL 100 ; Page width of listing LSTCND+ ; Do not list false conditions PAGSIZ 60 ; Lines per page ; ;======================================================== ; DEFINITIONS FOR THE PERIPHERALS ;======================================================== ; LPM3use EQU 0 ; 0: LPM0 1: LPM3 after task FPP4 EQU 1 ; 0: no FFP4 1: .float 2: .double ; ; FPP4 Definitions ; IF FPP4 = 1 DOUBLE EQU 0 ; .float format: 32-bits ENDIF IF FPP4 = 2 DOUBLE EQU 1 ; .double format: 48-bits ENDIF IF FPP4 ; If FPP is wished HW_MPY EQU 1 ; Use the HW-MPYer
348
Kapitel 11: Die MSP430F449 Quick Start Software
SW_UFLOW EQU 0 ; No error for underflow SW_RND EQU 1 ; Rounding for conversions ; LSTOUT; Include FPP4 definitions file #include "C:\TEST\IAR\FPP413\FPPDEF4.s43" /* Defs. */ LSTOUT+ ; ENDIF ; ;======================================================== ; RAM Definitions: 200h...RAMEND ;======================================================== ; ; RAM Definitions ; RAMSTRT EQU 0200h ; Start of the RAM RAMEND EQU 09FEh ;[] Highest RAM address (449) ; RSEG DATA16_Z ; RAM definitions INITKEY DS 2 ; 0F05Ah: initialized state IM_Buffer ds 128 ; Buffer of Info Memories A B SPI_Read_Buffer ds 20 ; Receive buffer SPI0 SPI_Write_Buffer ds 20 ; Transmit buffer SPI0 ;-------------------------------------------------------; Definitions for the FLL+ Peripheral ; SMCLK equ 2097152 ;[] SMCLK = 64x32768Hz = 2.096MHz fsystem equ SMCLK ;[] Def. MCLK (460kHz..8MHz) [Hz] fcrystal equ 32768 ;[] Def. ACLK fcrystal [Hz] FLLDw equ 1 ;[] Division of fDCOCLK (1,2,4,8) CL equ 6 ;[] Load capacitance crystal [pF] ; ;-------------------------------------------------------; Definition Part for the Basic Timer ; TIMER DS 4 ; 128 Hz COUNTER BTDTOL DS 1 ; LAST READ BT VALUE SEC DS 1 ; Byte for counting of seconds MIN DS 1 ; Byte for counting of minutes HOURS DS 1 ; Byte for counting of hours DAY DS 1 ; Day of month 1 – 31 (byte) MONTH DS 1 ; Month 1 – 12 (byte) even YEAR DS 2 ; Year 1990 – 65535 (word) ;-------------------------------------------------------; Definition Part for the USART0 (SPI Mode) ; Baudr0 EQU 200000 ;[] Baudrate is 200000 Baud UARTCLK0 EQU SMCLK ;[] SMCLK is used for SPI ;
11.8 Die Source der MSP430F44x Quick Start Software ;-------------------------------------------------------; Definition Part for the USART1 (UART Mode) ; Baudr1 EQU 2400 ;[] Baudrate is 2400 Baud UARTCLK1 EQU fcrystal ;[] ACLK is used for UART ; RCCNT DS 1 ; Counter/status for receive TXCNT DS 1 ; Counter/status for transmit EVEN RCPOI DS 2 ; Receive buffer pointer TXPOI DS 2 ; Transmit buffer pointer RCBUF DS 4 ;[] Receiver buffer length TXBUF DS 4 ;[] Transmitter buffer length ;-------------------------------------------------------; Definition Part for the LCD Driver ; LCD EQU LCDMEM ; Address of 1st LCD buffer byte C3 EQU 08h ; Common 3 C2 EQU 04h ; Common 2 C1 EQU 02h ; Common 1 C0 EQU 01h ; Common 0 Sn1 EQU 010h ; Odd Select lines Sn EQU 01h ; Even Select lines ; LCDM EQU 09Eh ;[] Address of MSD LCD buffer ; ; Definitions for the segments: change Cx*Sy to actual ; connections of the segments of your LCD. ; 4MUX example: LCD of MSP-EVK3xx ; a EQU C0*Sn ;[] Common0/even Select b EQU C1*Sn ;[] Common1/even Select c EQU C0*Sn1 ;[] d EQU C2*Sn ;[] Common2/even Select e EQU C3*Sn1 ;[] f EQU C1*Sn1 ;[] Common1/odd Select g EQU C3*Sn ;[] h EQU C2*Sn1 ;[] Common2/odd Select ; ; The used segments for the characters 0...9 and A...F ; are defined. This table may be simply modified and ; adapted to the actual needs. ; CH0 EQU a+b+c+d+e+f ;[] Segments of "0" CH1 EQU b+c ;[] Segments of "1" CH2 EQU a+b+d+e+g ;[] Segments of "2" CH3 EQU a+b+c+d+g ;[] Segments of "3" CH4 EQU b+c+f+g ;[] Segments of "4" CH5 EQU a+c+d+f+g ;[] Segments of "5" CH6 EQU a+c+d+e+f+g ;[] Segments of "6"
349
350
Kapitel 11: Die MSP430F449 Quick Start Software
CH7 EQU a+b+c ;[] Segments of "7" CH8 EQU a+b+c+d+e+f+g ;[] Segments of "8" CH9 EQU a+b+c+d+f+g ;[] Segments of "9" CHA EQU a+b+c+f+g ;[] Segments of "A" CHB EQU c+d+e+f+g ;[] Segments of "b" CHC EQU a+d+e+f ;[] Segments of "C" CHD EQU b+c+d+e+g ;[] Segments of "d" CHE EQU a+d+e+f+g ;[] Segments of "E" CHF EQU a+e+f+g ;[] Segments of "F ; ;[] Add more characters ; RES DS 8 ;[] LCD buffer for 14 dig. ;-------------------------------------------------------; Definition Part for the Ports-SW ; EVEN EvtCnt EQU 8 ;[] P1.3 Event Counter EVNTCNT DS 2 ;[] 16-bit event counter at P1.3 EVTFRQ DS 2 ;[] Frequency of EVNTCNT [Hz] EVTACC DS 2 ;[] Accumulated EVNTCNT [1] ;-------------------------------------------------------; Definition Part for the Timer_A ; TACLK EQU SMCLK ;[] TACLK: 2.096 MHz TA0 EQU 001h ; Bit address TA0 Port1: P1.0 TA1 EQU 004h ; Bit address TA1 Port1: P1.2 TA2 EQU 001h ; Bit address TA2 Port2: P2.0 ; OLDRE DS 2 ; Time of last edge at CCI1A PERIOD DS 2 ; Calc. period of CCI1A event STOR2 DS 2 ; Repetition rate Block 2 TIMAEXT DS 2 ; Extension for TAR: Bits 16..31 ;-------------------------------------------------------; Definition Part for the Timer_B ; TBCLK EQU SMCLK ;[] TBCLK: 2.096MHz fPWM EQU 20000 ;[] PWM-frequency 20kHz TB0 EQU 001h ; Bit address TB0 Port2: P2.1 TB1 EQU 004h ; Bit address TB1 Port2: P2.2 TB2 EQU 008h ; Bit address TB2 Port2: P2.3 TB3 EQU 010h ; Bit address TB3 Port3: P3.4 TB4 EQU 020h ; Bit address TB4 Port3: P3.5 TB5 EQU 040h ; Bit address TB5 Port3: P3.6 TB6 EQU 080h ; Bit address TB6 Port3: P3.7 ;-------------------------------------------------------; Definition Part for the Watchdog ; WDFlg DS 1 ; Watchdog flag byte BTFlg EQU 1 ; Basic Timer1 intrpt flag TAFlg EQU 2 ; Timer_A TAOVL intrpt flag
11.8 Die Source der MSP430F44x Quick Start Software WDcFlg EQU TAFlg+BTFlg ;[] Flags to be checked ;------; End of Definitions ;======================================================== ; .MACROS ;======================================================== ; ; Macro Definitions for the Hardware Multiplier ; MPYU16 MACRO arg1,arg2 ; Unsigned MPY 16x16 MOV arg1,&0130h MOV arg2,&0138h ENDM ; Result in RESHI|RESLO ; ; Example: Multiply indirectly the registers R4 and R5 ; ; MPYU16 @R4,@R5+ ; MPY @R4 by @R5+ unsigned ; MOV &RESLO,R6 ; LSBs of result to R6 ; MOV &RESHI,R7 ; MSBs of result to R7 ; ... ; Continue ; MACU16 MACRO arg1,arg2 ; Unsigned MAC 16x16 MOV arg1,&0134h ; Multiply-and-Accumulate MOV arg2,&0138h ; Carry in SumExt ENDM ; Sum: SUMEXT|RESHI|RESLO ; MPYS16 MACRO arg1,arg2 ; Signed MPY 16x16 bits MOV arg1,&0132h MOV arg2,&0138h ENDM ; SUMEXT|RESHI|RESLO ; MACS16 MACRO arg1,arg2 ; Signed MAC 16x16 bits MOV arg1,&0136h ; Multiply-and-Accumulate MOV arg2,&0138h ENDM ; Sum: SUMEXT|RESHI|RESLO ; MPYU8 MACRO arg1,arg2 ; Unsigned MPY 8x8 MOV.B arg1,&0130h ; 00xx to 0130h MOV.B arg2,&0138h ; 00yy to 0138h ENDM ; Result: RESLO. RESHI = 0 ; MACU8 MACRO arg1,arg2 ; Unsigned MAC 8x8 MOV.B arg1,&0134h ; 00xx MOV.B arg2,&0138h ; 00yy ENDM ; Sum: SUMEXT|RESHI|RESLO ; MPYS8 MACRO arg1,arg2 ; Signed MPY 8x8 MOV.B arg1,&0132h ; 00xx SXT &0132h ; Ext. sign: 00xx or FFxx
351
352
Kapitel 11: Die MSP430F449 Quick Start Software MOV.B SXT ENDM
; MACS8
arg2,&0138h &0138h
; 00yy ; Ext. sign: 00yy or FFyy ; SUMEXT|RESHI|RESLO
MACRO arg1,arg2 ; Signed MAC 8x8 bits MOV.B arg1,&0136h ; MACS is used SXT &0136h ; Ext. sign: 00xx or FFxx MOV.B arg2,&0138h ; 00yy SXT &0138h ; Extend sign ENDM ; Sum: SUMEXT|RESHI|RESLO ;-------------------------------------------------------; Macro Definitions for the USART ; The calculation for the content of the Modulation ; Register UMCTLx and the Baud Rate Registers UBR1x/UBR0x ; follows. Seven bits of resolution are used. ; Call: CALC_UART UARTCLKx,Baudrx,&UMCTLx,&UBR1x,&UBR0x ; ; Modulation Register content: the rounded fraction of ; CMOD = UARTCLKx/Baudrx is calculated dependent on ; the value of UARTCLKx. ; Binary format of CMOD: 0.xxxxxxx ; Then the 8 bits of UMCTLx are built. ; The values for the Division Registers UBR1x/UBR0x are ; calculated: CUBR1x and CUBR0x contain the truncated ; result of the division UARTCLKx/Baudrx. ; Inputs: arg1: UARTCLKx [Hz] (N x 1000 if > 2^16) ; arg2: Baudrx [Hz] ; arg4: UBR1x address (absolute mode) ; arg5: UBR0x address (absolute mode) ; Output: arg3 UMCTLx address (absolute mode) ; CALC_UART macro arg1,arg2,arg3,arg4,arg5 lstexp; Do not list loops if arg1>8000*1000 ; UARTCLKx > 8 MHz? CMOD var ((((64*arg1)/arg2)-64*(arg1/arg2))+1)*2 else if arg1>4000*1000 ; UARTCLKx > 4 MHz? CMOD var (((128*arg1)/arg2)-128*(arg1/arg2)) else CMOD var ((((256*arg1)/arg2)-256*(arg1/arg2))+1)/2 endif endif ; B$0 var CMOD ; Set variables B$1 var 1 CUMCTL var 0 ; Result 8 bits rept 8 ; Repeat loop 8 times B$0 var CMOD+B$0 if B$0>127 ; Carry? B$0 var B$0-128
11.8 Die Source der MSP430F44x Quick Start Software CUMCTL
var CUMCTL+B$1 endif B$1 var B$1+B$1 ; To next bit endr lstexp+ MOV.B #CUMCTL,arg3 ; UMCTLx value MOV.B #arg1/(arg2*256),arg4 ; UBR1x value MOV.B #(arg1/arg2)-256*(arg1/(arg2*256)),arg5 endm ;------; – For "arg2" Microseconds delay ; arg2 < 2^16 x 1000000 x 3 cykles/SMCLK -> ; arg2 < 196.6E9/SMCLK ; ; Call: DELAYus 100 ; 100us delay ; Inputs: arg2 # us delay ; DELAYus macro arg2 ; Delay "arg2" us lstexpPUSH R15 ; Save R15 MOV #arg2*SMCLK/(1000000*3),R15 DEC R15 JNZ $-2 POP R15 ; Restore R15 endm lstexp+ ; ; End of MACROs ;======================================================== ; Info Memory B: 1000h...107Fh ;======================================================== ; ; Stored System values in Information Memory B ; AVcc/step = (3.0 x 1000/4096) ; rseg INFO (7) ; Address Info Memory B BegSystem equ $ ; Start of System values AVcc .float 3.0 ; AVcc 3.0 V FPP [V] AVccresol .float 0.732422 ; AVcc/step FPP [mV] SlopeV .float 1.02 ; Correction Slope FPP [1] OffsetV .float 0.020 ; Correct. Offset FPP [V] EndSystem equ $ ; End of System values ; ;======================================================== ; Info Memory A: 1080h...10FFh ;======================================================== ;
353
354
Kapitel 11: Die MSP430F449 Quick Start Software
; Stored System values in Info Memory A ; align 7 ; Def. Start Info Memory A ; ; Not yet used ; ;======================================================== ; INITIALIZATION SOFTWARE ;======================================================== ; ; Program Start ; RSEG CODE ; 447: 08000h 449: 01100h INIT MOV.B &IFG1,R5 ; Store flags MOV #WDT_ARST_1000+WDTHOLD,&WDTCTL ;Hold WD BIT.B #WDTIFG,R5 ; Reset by watchdog? JZ NOWD ; No, normal RESET ; ; Watchdog caused RESET: special handling is possible ; ; ... ; Insert WD handler here ; ; Normal Initialization Part ; NOWD MOV #RAMEND+2,SP ; Define Stack Pointer ; ; Check the INITKEY value first: ; If value is 0F05Ah: reset occurred, RAM is not cleared ; otherwise: Vcc was switched on: complete init. ; CMP #0F05Ah,INITKEY ; PUC or POR? JEQ IN0 ; Key is ok, continue ; CLR R5 ; Clear RAM: R5 index reg. RCL CLR RAMSTRT(R5) ; 1st RAM address INCD R5 ; Next word address CMP #RAMEND-RAMSTRT+2,R5 ; RAM cleared? JLO RCL ; No, once more ; MOV #0F05Ah,INITKEY ; Define init. state ; ; The FLL+ is initialized and the load capacity CL ; connected to the 32 kHz crystal ; IN0 CALL #INITSR ; Define MCLK and SMCLK ; ;-------------------------------------------------------; Init. Part for Basic Timer1: 0.25s 32768:(256x32)=4 Hz ; ; Input frequency ACLK: BTSSEL = 0 ; Input division by 256: BTDIV = 1
11.8 Die Source der MSP430F44x Quick Start Software ; Add. input division by 32 4 Hz ; LCD frequency = 128Hz: BTFRFQ1=BTFRFQ0=1 ; MOV.B #BTDIV+BT_fCLK2_DIV32+BT_fLCD_128,&BTCTL ;[] 0.25 s BIS.B #BTIE,&IE2 ; Basic Timer1 Intrpt on ;-------------------------------------------------------; Initialize USART0: SPI master mode, 8 bits, 200 kHz, no ; interrupt. Calculate values for the Modulation Register ; UMCTL0 and the Baud Rate Registers UBRx and insert them ; by MACRO CALC_UART ; Select SIMO0, SOMI0, UCLK0 at P3.1, P3.2, P3.3 ; CALC_UART UARTCLK0,Baudr0,&UMCTL0,&UBR10,&UBR00 ; MOV.B #0Eh,&P3SEL ; P3.1-3 SPI select BIS.B #USPIE0,&ME1 ; Enable USART0: SPI MOV.B #SSEL1+SSEL0+STC,&UTCTL0 ;[] SMCLK, 3-pin MOV.B #CHAR+SYNC+MM,&UCTL0 ;[] 8-bit Master ;-------------------------------------------------------; Initialization part for the UART1: Odd parity, 8 data ; bits, 2 stop bits, ACLK used for the UART clock, ; interrupt mode ; Calculate values for the Modulation Register UMCTL1 and ; the Baud Rate Registers UBR1x and insert them by MACRO ; CALC_UART ; Select RXD1, TXD1 at P4.0, P4.1 ; CALC_UART UARTCLK1,Baudr1,&UMCTL1,&UBR11,&UBR01 ; MOV.B #03h,&P4SEL ; Select RXD1 + TXD1 BIS.B #UTXE1+URXE1,&ME2 ; Enable UART1 Mod. MOV.B #PENA+SPB+CHAR,&UCTL1 ;[] USART1 Ctrl Reg MOV.B #SSEL0,&UTCTL1 ;[] TX Ctrl Reg MOV.B #0,&URCTL1 ;[] RC Ctrl Reg BIS.B #UTXIE1+URXIE1,&IE2 ; USART1 intrpts on ; CLR.B RCCNT ; UART receive off CLR.B TXCNT ; UART transmit off ;-------------------------------------------------------; Initialization part for the watchdog: ; ISx=0 (/2^15), SSEL=0 (ACLK) = 1s period ;!! ; TMSEL=0 (watchdog mode), NMI=0 (no NMI), HOLD=0 ; (watchdog stopped) ; MOV #WDT_ARST_1000+WDTHOLD,&WDTCTL ;[] Define ; watchdog ;-------------------------------------------------------; Initialization part for the LCD controller 14 digits ; S0-S27: LCD, 4MUX, LCD on
355
356
Kapitel 11: Die MSP430F449 Quick Start Software
; MOV.B #LCDP2+LCD4MUX+LCDON,&LCDCTL ;[] Def. LCD ;-------------------------------------------------------; Initialization part for the Oscillator Fault control ; BIS.B #OFIE,&IE1 ; Enable Osc. Fault intrpt ;-------------------------------------------------------; Initialization part for the Ports. Unused ports are ; switched to output direction for lower sensitivity ; MOV.B #030h+TA0+TA1,&P1SEL ;[] SMCLK+ACLK MOV.B #000h,&P1OUT ;[] Unused ports MOV.B #0FFh-EvtCnt-TA1,&P1DIR ;[] Unused ports MOV.B #EvtCnt,&P1IE ;[] Event Cntr intrpt on MOV.B #EvtCnt,&P1IES ;[] for trailing edge ; MOV.B #TB2+TB1+TA2,&P2SEL ;[] Timer_B, Timer_A MOV.B #000h,&P2OUT ;[] Unused ports lo MOV.B #0FFh-TA2,&P2DIR ;[] Unused ports MOV.B #000h,&P2IE ;[] No intrpt enabled MOV.B #000h,&P2IES ;[] ; MOV.B #00Eh,&P3SEL ;[] SPI0 I/Os MOV.B #000h,&P3OUT ;[] Unused ports lo MOV.B #0FFh-0Eh,&P3DIR ;[] Unused ports ; MOV.B #003h,&P4SEL ;[] UART1 I/Os MOV.B #000h,&P4OUT ;[] Unused ports lo MOV.B #0FFh-03h,&P4DIR ;[] Unused ports ; MOV.B #000h,&P5SEL ;[] Not used MOV.B #000h,&P5OUT ;[] Unused ports lo MOV.B #0FFh,&P5DIR ;[] Unused ports ; ;-------------------------------------------------------; Initialization part for the Timer_A ; SMCLK, Continuous Mode, Interrupt enabled for all ; modules 0..2. Inputs (CCIxA) and outputs (TAx) of ; Timer_A are defined. Direction bit for TA0 was set ; during port initialization ; MOV #TASSEL_2+TAIE+TACLR,&TACTL ;[] SMCLK, TAR = 0 MOV #OUTMOD_5+CCIE,&TACCTL0 ;[] Reset Mode TA0 MOV #CM_1+CCIS_0+SCS+CAP+CCIE,&TACCTL1 ;[] Capt. Mode, + MOV #CM_2+CCIS_0+SCS+CAP+CCIE,&TACCTL2 ;[] Capt. Mode, ;
11.8 Die Source der MSP430F44x Quick Start Software MOV #1,&TACCR0 ;[] Imm. start for output CLR TIMAEXT ;[] Clear TAR ext. word BIS #MC_2,&TACTL ;[] Start TB in Cont. Mode ;-------------------------------------------------------; Initialization part for the Timer_B ; SMCLK, Up Mode for PWM generation, Interrupt off ; PWM with Reset/Set Mode ; Outputs (TAx) of Timer_A are defined ; Direction bit for TB1 and TB2 was set during port ; initialization ; MOV #TBSSEL_2+TBCLR,&TBCTL ;[] SMCLK, TBR = 0 MOV #SMCLK/fPWM-1,&TBCCR0 ; Def. PWM-frequ. MOV #OUTMOD_7+CLLD_1,&TBCCTL1 ;[] Reset/set MOV #OUTMOD_7+CLLD_1,&TBCCTL2 ;[] Reset/set ; CLR &TBCCR1 ;[] 0% PWM for Motor1 CLR &TBCCR2 ;[] 0% PWM for Motor2 BIS #MC_1,&TBCTL ;[] Start TA in Up Mode ;-------------------------------------------------------; Initialize Comparator_A for the input voltage test ; MOV.B #CAON,&CACTL1 ; Define Comp_A mode MOV.B #P2CA1+P2CA0+CAF,&CACTL2 ; Conn. CA0+CA1 ;-------------------------------------------------------; Supply Voltage Supervision: ; MOV.B #VLD_1_8V,&SVSCTL ; Comp. with 1.8V ;-------------------------------------------------------MOV #WDT_ARST_1000,&WDTCTL ; Reset watchdog EINT ; Enable interrupt ; ; End of Initialization Part ; ;======================================================== ; MAIN LOOP ;======================================================== ; ; Wake-up with 4 Hz. Reset WD if BT1 and TA are active ; MAINLOOP EQU $ ; Program loop starts here XOR.B #2,&P5OUT ; LED blinks with 0.5 Hz CALL #WDCheck ; WD to be cleared? ; ; The demonstration software is called every second. ; 1s elapsed, if TIMER.6 = TIMER.5 = 0 ; 2^15Hz/(256 x 32) = 4 Hz ; BIT #60h,TIMER ; 1 s frame? JZ ML0 ; Yes proceed
357
358
Kapitel 11: Die MSP430F449 Quick Start Software
BR #PLPM3 ; No, back to LPMx ; ML0 EQU $ ; ... ; Insert SW parts here ;--------------; Demonstration Software: ; Convert the ADC sample: 12-bit result in &ADCMEM0 ; Vref = AVcc = +3 V (equivalent to 7FFh result) ; CALL #MEAS_ADC12 ; Meas. ADC input VA0 at A0 ; ; Initialize FPP4. Convert ADC12 result to FP format ; CALL #FLT_SAV ; Save registers R5 to R12 SUB #FPL,SP ; Reserve stack for result MOV #ADC12MEM0,RPARG ; Addr. of ADC12 result CALL #CNV_BIN16U ; Convert to FP format ; ; Calculate VA0: ; VA0 = (ADC12-result x AVccresol) x SlopeV + OffsetV ; MOV #AVccresol,RPARG ; Resolution AVcc/4096 CALL #FLT_MUL ; AVccresol x ADC12-result MOV #SlopeV,RPARG ; Address of slope CALL #FLT_MUL ; (Avccresolx ADC12)xSlopeV MOV #OffsetV,RPARG ; Address of offset CALL #FLT_ADD ; VA0 CALL #CNV_FP_BCD ; FPP result in to BCD ; Result to LCD-Buffer RES POP RES+4 ; BCD-MSDs and sign POP RES+2 ; BCD-MSD-4 to LSD+4 POP RES ; BCD-LSD+3 to LSD ; Stack correction by POPs CALL #FLT_REC ; Restore R5 to R12 ; ; The 8 digit decimal result in RES+2|RES is output ; to the LCD. Decimal point: .000 to 3.250V ; CALL #LCDOUT ; (Vin x 1000) -> LSDs BIS.B #h,&LCD+3 ; Set decimal point ;-------------------------------------------------------; If time is 23:59:59 then the values are stored in the ; Information Memory B. The time is stored in BCD format! ; CMP.B #59h,SEC ; Seconds = 59? JNE EoTC0 ; No CMP.B #59h,MIN ; Minutes = 59? JNE EoTC0 ; No CMP.B #23h,HOURS ; Hours = 23? JNE EoTC0 ; No
11.8 Die Source der MSP430F44x Quick Start Software ; ; 23:59:59: Read Information Memory B to IM_Buffer ; MOV #BegSystem,R5 ; IM_Buffer start StSyL MOV @R5+,IM_Buffer-BegSystem-2(R5) CMP #EndSystem,R5 ; System values in buffer? JLO StSyL ; No, once more ; ; Modify changed values ; MOV #05A5Ah,IM_Buffer+20 ; Modify new values MOV #0A5A5h,IM_Buffer+22 ; Example only! ; ; Write back modified RAM buffer to Information Memory B ; CALL #Write_Flash ; IM_Buffer Info to Flash Dw 01000h ; Info Memory B address EoTC0 EQU $ ; ;-------------------------------------------------------; If time is xx:xx:00 then the two Motors are switched on ; for 2 s with 75 % PWM (Motor1) and 35 % PWM (Motor2) ; TST.B SEC ; Seconds = 0? JNZ MCh ; No, check if xx:xx:02 ; MOV #75*SMCLK/(fPWM*100),&TBCCR1 ; Motor1 on MOV #35*SMCLK/(fPWM*100),&TBCCR2 ; Motor2 on ; MCh EQU $ IF LPM3use MLop CALL #WDCheck ; LPM3: Timers active? CMP.B #2,SEC ; Seconds = 2? JLO MLop ; No, wait ELSE CMP.B #2,SEC ; Seconds = 2? JNE EoTC1 ; No, wait ENDIF ; ; 2 s elapsed: turn off the motors. Ensure low voltage ; at the outputs by PWM = 0 % and outputs to low ; MOV #0*SMCLK/(fPWM*100),&TBCCR1 ; Motor1 off MOV #0*SMCLK/(fPWM*100),&TBCCR2 ; Motor2 off MOV #OUTMOD_0,&TBCCTL1 ; TB1 to low MOV #OUTMOD_0,&TBCCTL2 ; TB2 to low MOV #OUTMOD_7+CLLD_1,&TBCCTL1 ; Reset/set MOV #OUTMOD_7+CLLD_1,&TBCCTL2 ; Reset/set ; EoTC1 EQU $
359
360
Kapitel 11: Die MSP430F449 Quick Start Software
;-------------------------------------------------------; Compare the input voltages VIN0 at CA0 and VIN1 at CA1 ; If VIN0 > VIN1: Go to Label V0GTV1 and execute code ; If VIN0 < VIN1: Proceed with necessary code ; BIT.B #CAOUT,&CACTL2 ; VIN0 > VIN1? JNZ V0GTV1 ; Yes ; ... ; No, VIN0 < VIN1: JMP EoCA ; Insert code before ; V0GTV1 EQU $ ; VIN0 > VIN1: ; ... ; Insert code here ; EoCA EQU $ ; Common end ;-------------------------------------------------------; The event counter EVNTCNT is stored in STORE. No count ; can be lost: EVNTCNT is 0 or 1 after the sequence. ; EVCT PUSH EVNTCNT ; Counted trailing edges SUB @SP,EVNTCNT ; Subtr. read value POP EVTFRQ ; Store read value: [Hz] ADD EVTFRQ,EVTACC ; Accumulate EVNTCNT [1] ;-------------------------------------------------------; A check is made if AVcc is above 1.8 V ; LPM3use = 1: LPM3 SVS is switched on/off to save power ; LPM3use = 0: LPM0 SVS is always active ; IF LPM3use MOV.B #VLD_1_8V,&SVSCTL ; Compare with 1.8 V DELAYus 160 ; Wait 160 us to ensure ; correct result BIT.B #SVSOP,&SVSCTL ; AVcc > 1.8 V? JZ AVccok ; Yes, proceed ; ... ; Insert low AVcc code AVccok EQU $ CLR.B &SVSCTL ; Switch off SVS ; ELSE ; LPM0: SVS always on BIT.B #SVSOP,&SVSCTL ; AVcc > 1.8 V? JZ AVccok ; Yes, proceed ; ... ; Insert low AVcc code AVccok EQU $ ENDIF ;-------------------------------------------------------; After completion of all tasks, the program enters a LPM ; LPM3use = 1: LPM3 SMCLK stopped ; LPM3use = 0: LPM0 SMCLK active ; PLPM3 EQU $ ; Enter LPM IF LPM3use
11.8 Die Source der MSP430F44x Quick Start Software BIS ELSE BIS ENDIF NOP JMP ; ; ; ; ; ; ;
#CPUOFF+GIE+SCG1+SCG0,SR ; Enter LPM3 #CPUOFF+GIE,SR
MAINLOOP
; Enter LPM0 ; For the CSPY necessary ;!! To Mainloop TEST
An interrupt handler cleared the CPUoff bit on the stack. Checks are made if activity is needed: Receive: receive input buffer full Transmit: transmit buffer output completely ... other interrupt handlers
TST.B RCCNT ; Receive completed? JZ PROCRC ; Yes, process rec. data TST.B TXCNT ; Transmit completed? JZ NXTTX ; Yes, prepare next char. ; ... ; Other handlers? BR #MAINLOOP ; To Mainloop ;------NXTTX EQU $ ; Prepare next characters ; ... ; Insert code here JMP PLPM3 ; To LPM3 again ; PROCRC EQU $ ; Process received data ; ... ; Insert code here JMP PLPM3 ; To LPM3 again ;-------------------------------------------------------; The USART software (SPI and UART) is not included into ; the demo software. It needs to be inserted where ; necessary. Examples are given ; ; SPI0 Software: ; Preparation for the reception of 4 bytes. Buffer ; starts at address in R14. ; MOV #SPI_Read_Buffer+3,R14 ; Buffer address MOV.B #4,R13 ; # bytes to rec. ; SPI_Rcv_Lop CALL #WDCheck ; Timers active? CALL #SPI_RCV ; Receive 1 byte: @R14 DEC R13 ; Byte count – 1: JNZ SPI_Rcv_Lop ; > 0: receive next byte ; ... ; = 0: proceed ;-------; Preparation for the transmission of 10 bytes. ; Buffer starts at address in R15. ;
361
362
Kapitel 11: Die MSP430F449 Quick Start Software MOV MOV.B
#SPI_Write_Buffer,R15 ; Start data bytes #10,R13 ; Number of data bits
; SPI_TX_Lop CALL #WDCheck ; Timers active? Reset WD MOV.B @R15+,R14 ; Data byte to R14 CALL #SPI_TX ; Output R14 data via SPI DEC R13 ; Byte count – 1 JNZ SPI_TX_Lop ; > 0: transmit next byte ; ... ; = 0: proceed ;-------------------------------------------------------; UART1 software: ; Preparation for the reception of 4 bytes. Buffer starts ; at address RCBUF. ; TST.B RCCNT ; Ready? JNZ RNR ; No, RCCNT > 0 MOV #RCBUF,RCPOI ; Receive buffer start MOV.B #4,RCCNT ; Number of bytes RNR EQU $ ; ... ; Continue in background ; ; Stop the reception of data. The actually received ; character is input completely ; CLR.B RCCNT ; Status is zero ; ... ; Proceed here ; ; Preparation for the transmission of 4 bytes starting ; at address TXBUF. The check for the empty TX buffer ; is faster, but needs more ROM bytes. ; TST.B TXCNT ; Ready for next chars? JNZ TNR ; No, TXCNT > 0 BIT.B #UTXIFG1,&IFG2 ; TX part also ready? JZ TNR ; No, busy ; MOV.B #4-1,TXCNT ; Ready, init. byte count MOV #TXBUF+1,TXPOI ; Init. TX buffer pointer MOV.B TXBUF,&TXBUF1 ; 1st byte to TX buffer TNR EQU $ ; to start transmission ; ... ; Continue in background ; ; Stop the transmission of data. The actually sent ; character is transmitted completely ; CLR.B TXCNT ; Status is zero ; ... ; Continue here ;
11.8 Die Source der MSP430F44x Quick Start Software ;======================================================== ; SUBROUTINES ;======================================================== ; ; Common Initialization Subroutine: FLL+ and load ; capacitances are initialized ; INITSR equ $ ; ; Choice of the internal load capacitors Cint for LFXT1 ; in dependence on the crystal’s load capacitor CL ; if CL LE 3 ; 0 pF < CL =< 3 pF? Cint equ XCAP0PF ; Use Cint = 0 pF else if 3 < CL LE 7 ; 3 pF < CL =< 7 pF? Cint equ XCAP10PF ; Use Cint = 10 pF else if 7 < CL LE 9 ; 7 pF < CL =< 9 pF? Cint equ XCAP14PF ; Use Cint = 14 pF else ; 9 pF < CL? Cint equ XCAP18PF ; Use Cint = 18 pF and ; external Cs endif endif endif ;--------; Choice of the system frequency divider factor DCf and ; the D bits in dependence on the two frequencies fsystem ; and fcrystal. If the wished minimum pre-division FLLDw ; (1,2,4 or 8) is greater than DCf then FLLDw is taken ; for DCf. ; if (fsystem/fcrystal) < 121 if FLLDw > 1 DCf equ FLLDw ; Min. pre-divider wished else DCf equ 1 ; Define DCO+ factor endif ; else if (fsystem/fcrystal) < 240 if FLLDw > 2 DCf equ FLLDw ; Min. pre-divider wished else DCf equ 2 ; Define DCO+ factor endif ; else if (fsystem/fcrystal) < 480
363
364 DCf DCf
Kapitel 11: Die MSP430F449 Quick Start Software if equ else equ endif
FLLDw > 4 FLLDw
; Min. pre-divider wished
4
; Define DCO+ factor
; DCf
else equ endif endif endif
8
; ; D bit definition ; if DCf = 1 Dfa equ FLLD_1 ; D = 0 (fDCOCLK/1) else if DCf = 2 Dfa equ FLLD_2 ; D = 1 (fDCOCLK/2) else if DCf = 4 Dfa equ FLLD_4 ; D = 2 (fDCOCLK/4) else Dfa equ FLLD_8 ; D = 3 (fDCOCLK/8) endif endif endif ; ; Decision if direct DCO output or pre-divided DCO output ; if FLLDw > 1 fdcoclk equ fsystem*DCf ; Min. pre-division? DCOP equ 0 ; DCO+ = 0 Nplus1 equ fsystem/fcrystal ; Define N+1 else fdcoclk equ fsystem ; Direct DCO output DCOP equ DCOPLUS ; DCO+ = 1 Nplus1 equ (fsystem/fcrystal)/DCf ; Define N+1 endif ; MOV.B #Nplus1-1,&SCFQCTL ; Def. DCO mult. by N ; if fdcoclk < 3000000 ; DCO current source: MOV.B #0+Dfa,&SCFI0 ; MCLK < 3.0MHz: FN_x=0, D else if (fdcoclk > 3000000-1) and (fdcoclk < 6000000) MOV.B #FN_2+Dfa,&SCFI0 ; 3MHz < fdcoclk < 6MHz: ; FN_2=1,D else if (fdcoclk > 6000000-1) and (fdcoclk < 9000000)
11.8 Die Source der MSP430F44x Quick Start Software MOV.B
#FN_3+Dfa,&SCFI0 ; 6MHz < fdcoclk < 9MHz: ; FN_3=1,D
else if (fdcoclk > 9000000-1) and (fdcoclk < 13000000) MOV.B #FN_4+Dfa,&SCFI0 ; 9MHz < fdcoclk 13MHz: FN_8=1, D endif endif endif endif ; MOV.B MOV.B ; ;
#DCOP+Cint,&FLL_CTL0 ; Define DCO+ and CL #XT2OFF,&FLL_CTL1 ; Define MCLK/SMCLK ; sources,ACLK
MOV #28*32*DCf*Nplus1/28,R5 ; Calculated delay: MOV #8,R6 ; Allow the FLL+ to settle DEC R6 ; at the correct DCO tap JNZ IN1 DEC R5 JNZ IN2 RET ; Return from init. subroutine ;-------------------------------------------------------; Subroutine init. the ADC12 to measure all ADC inputs ; MEAS_ADC12 equ $ ; BIC #ENC,&ADC12CTL0 ; Disable Conversion BIS.B #0FFh,&P6SEL ; Enable A0..A7 ; ; Sample time x1, multiple samples ; ADC12 on ; VR+ (Vref) = AVcc, VR- = AVss, enable multiple S&H ; t_sample = 96 ADCCLKs ; MOV #SHT1_5+SHT0_5+MSC+ADC12ON,&ADC12CTL0 ; ; Use sample timer, ADC core runs at SMCLK (2.096 MHz), ; Conversion of a single sequence, start with ADC12MEM0 ; MOV #SHS_0+SHP+ADC12DIV_0+ADC12SSEL_3+CONSEQ_1,&ADC12CTL1 ; ; Def. of conversion sequence VR+ = AVcc+, VR- = AVss ; MOV.B #SREF_0+INCH_0,&ADC12MCTL0 ; A0 MOV.B #SREF_0+INCH_1,&ADC12MCTL1 ; A1 MOV.B #SREF_0+INCH_2,&ADC12MCTL2 ; A2 MOV.B #SREF_0+INCH_3,&ADC12MCTL3 ; A3 MOV.B #SREF_0+INCH_4,&ADC12MCTL4 ; A4 IN2 IN1
365
366
Kapitel 11: Die MSP430F449 Quick Start Software MOV.B MOV.B MOV.B
#SREF_0+INCH_5,&ADC12MCTL5 ; A5 #SREF_0+INCH_6,&ADC12MCTL6 ; A6 #EOS+SREF_0+INCH_7,&ADC12MCTL7 ; A7, EOS
; MOV #0,&ADC12IFG ; Clear ADC12 flags TST &ADC12MEM7 ; Clear IFG7 BIS #ENC+ADC12SC,&ADC12CTL0 ; Start ADC12 WAITADC BIT #80h,&ADC12IFG ; Ready? (IFG7 set?) JZ WAITADC ; Not yet ; RET ; Results in ADC12MEM0 to ADC12MEM7 ;------------------------------------------------------; The binary number in R12 is converted to a 5-digit BCD ; number contained in R14 and R13: R14|R13 ; BINDEC MOV #16,R15 ; Loop counter CLR R14 ; 0 -> Result MSD CLR R13 ; 0 -> Result LSD BDL RLA R12 ; Binary MSB to carry DADD R13,R13 ; Result x 2 LSD DADD R14,R14 ; Result x 2 MSD DEC R15 ; Through? JNZ BDL ; No RET ;-------------------------------------------------------; ; Output of the calculated BCD result to the LCD driver ; Result in memory RES+4 (4 MSDs), RES+2 and RES (4 LSDs) ; LCDOUT PUSH R5 ; Save R5, R6, R7 PUSH R6 PUSH R7 MOV #LCD,R6 ; Address 1st LCD buffer MOV #RES,R7 ; Address of result LSD LCDLOP MOV.B @R7,R5 ; Start LSD (00xy in R5) AND #0Fh,R5 ; LSD "y" in low nibble MOV.B LCDTAB(R5),0(R6); Segment info to LCD-HW ; MOV.B @R7+,R5 ; LSD+1 (00xy in R5) RRA R5 ; LSD+1 "x" to low nibble RRA R5 RRA R5 RRA R5 ; BCD info "x" in R5 000x MOV.B LCDTAB(R5),1(R6); Segment info to LCD-HW ADD #2,R6 ; To next two LCD buffers CMP #LCDM+1,R6 ; All output to LCD-HW? JLO LCDLOP ; No, 2 next two char. ; ; Leading zero suppression for MSD to LSD+3 ;
11.8 Die Source der MSP430F44x Quick Start Software LZL
LCDRET
CMP JEQ DEC CMP.B JNZ CLR.B JMP POP POP POP RET
#LCD+3,R6 LCDRET R6 #CH0,0(R6) LCDRET 0(R6) LZL R7 R6 R5
; ; ; ; ; ;
10^0 reached? Yes, return To next lower digit Zero in LCD buffer? No, return Yes, Suppress 0 (blank)
; Restore R7, R6, R5
; Return ; ; Table LCDTAB contains the used segments for characters ; 0..9 and A..F ; This table may be simply modified to the actual needs ; LCDTAB DB CH0,CH1,CH2,CH3,CH4,CH5,CH6,CH7 ; 0...7 DB CH8,CH9,CHA,CHB,CHC,CHD,CHE,CHF ; 8...F ; ;----------------------; Subroutine provides a decimal clock: ; Return C = 0: Normal, 00:00:01 to 23:59:59 ; C = 1: 00:00:00 ; RTCLKD SETC ; Entry every second DADC.B SEC ; Increment seconds CMP.B #060H,SEC ; One minute elapsed? JLO RTRETD ; No, return (C=0) CLR.B SEC ; Yes, clr seconds (C=1) DADC.B MIN ; Incr. minutes with C=1 CMP.B #060H,MIN JLO RTRETD CLR.B MIN DADC.B HOURS CMP.B #024H,HOURS JLO RTRETD CLR.B HOURS ; Return 00.00.00 RTRETD RET ; C = 1: one day elapsed ; ;-------------------------------------------------------; The next subroutine increments the date with each call. ; The handling of leap-years is included. ; The data is stored in binary format. ; DATES PUSH R5 ; Save R5 INC.B DAY ; To next day of month MOV.B MONTH,R5 ; Look for length of month MOV.B MT-1(R5),R5 CMP.B #2,MONTH ; February now? JNE NOFEB
367
368
Kapitel 11: Die MSP430F449 Quick Start Software
NOFEB
DATRET
BIT JNZ INC CMP.B JLO MOV.B INC.B CMP.B JLO MOV.B INC POP RET
#3,YEAR NOFEB R5 R5,DAY DATRET #1,DAY MONTH #13,MONTH DATRET #1,MONTH YEAR R5
; ; ; ; ; ; ; ; ; ; ; ;
Yes, Leap Year? No Yes, 29 days: February One month elapsed? No Yes, start with 1st day of next month Year over? No Yes, start with January of next year Restore R5
; ; Table with the length of the 12 months ; MT DB 31+1,28+1,31+1,30+1,31+1,30+1 ; Jan..Jun DB 31+1,31+1,30+1,31+1,30+1,31+1 ; Jul..Dec ; ;-------------------------------------------------------; Subroutine writes IM_Buffer to Flash: 128 Bytes ; (20 ms time) ; ; Call CALL #Write_Flash ; Call ; dw Flash Address ; Start address (1000h) ; ... ; N=0: No error N=1: error ; Write_Flash EQU $ PUSH R5 ; Save R5 and R6 PUSH R6 MOV 4(SP),R6 ; Save return address in R6 MOV @R6+,R5 ; Flash Start Address in R5 MOV R6,4(SP) ; Corrected return address ; DINT ; Intrpt off during write MOV #FWKEY+FSSEL0+FN1,&FCTL2 ; Timing=MCLK/3 MOV #FWKEY,&FCTL3 ; Lock = 0 MOV #FWKEY+ERASE,&FCTL1 ; Erase bit = 1 MOV #0,0(R5) ; Dummy write: erase ; MOV #FWKEY+WRT,&FCTL1 ; Write bit = 1 MOV #IM_Buffer,R6 ; Info Start WF00 MOV @R6+,0(R5) ; IM_Buffer to Flash INCD R5 ; Next Flash address CMP #IM_Buffer+128,R6 ; End of IM_Buffer? JLO WF00 ; Not yet MOV.W #FWKEY+LOCK,&FCTL3 ; Lock = 1 EINT ; ; Test if info correct
11.8 Die Source der MSP430F44x Quick Start Software
WF01
; WFErr
MOV MOV MOV CMP JNE INCD CMP JLO POP POP CLRN RET
@SP,R5 -2(R5),R5 #IM_Buffer,R6 @R6+,0(R5) WFErr R5 #IM_Buffer+128,R6 WF01 R6 R5
; ; ; ; ; ; ; ; ; ; ;
Corr. return address Flash Start in R5 Info Start im RAM Info equal? No, error message Next word in Flash End of IM_Buffer? Not yet reached Yes, return Restore R5 and R6 No error: N = 0
POP POP SETN RET
R6 R5
; Error return ; Restore R5 and R6 ; Error: N = 1
; ;-------------------------------------------------------; SPI Receive Subroutine writes received byte to memory ; pointed to by R14 ; SPI_RCV equ $ ; Dummy write to start CLR.B &TXBUF0 ; SPI receive SPIRC0 BIT.B #URXIFG0,&IFG1 ; RXBUF0 ready? JZ SPIRC0 ; No, 1 = ready MOV.B &RXBUF0,0(R14) ; Yes, read receive buffer INC R14 ; Address next buffer byte RET ;-------------------------------------------------------; SPI Transmit Subroutine writes low byte of R14 to SPI ; transmit buffer ; SPI_TX equ $ BIT.B #UTXIFG0,&IFG1 ; Transmit buffer ready? JZ SPI_TX ; No, wait BIT.B #TXEPT,&UTCTL0 ; TX output reg. .and. ; UTXBUF empty? JZ SPI_TX ; No, not both, wait MOV.B R14,&TXBUF0 ; Data to transmit buffer RET ; Start transmission ;-------------------------------------------------------; Subroutine checks if all peripherals observed by the ; Watchdog have set their flags. ; If yes, watchdog and flags are reset ; WDCheck equ $ CMP.B #WDcFlg,WDFlg ; Are all flags set? JNE WDCret ; No, do nothing
369
370
Kapitel 11: Die MSP430F449 Quick Start Software MOV CLR.B RET
#WDT_ARST_1000,&WDTCTL ; Yes, reset WD WDFlg ; Clear flags
WDCret ; ;======================================================== ; INTERRUPT HANDLERS ;======================================================== ; ; Interrupt Handler Basic Timer1 4 Hz ; The register BTCNT2 needs to be read twice ; BT_HAN PUSH R5 ; Save used register BIS.B #BTFlg,WDFlg ; Set flag for watchdog L$300 MOV.B &BTCNT2,R5 ; Read actual timer value CMP.B &BTCNT2,R5 ; Ensure data integrity JNE L$300 ; Read again if not equal ; ; R5 contains actual timer value, BTDTOL contains the ; last value read. The difference (20 h) is added to the ; 4hz counter TIMER ; PUSH.B BTDTOL ; Save last timer value MOV.B R5,BTDTOL ; Actual -> last value SUB.B @SP+,R5 ; Actual – last -> R5 ADD R5,TIMER ; 16-bit diff. to counter ADC TIMER+2 ; Carry to high word ; ; If TIMER.6 = TIMER.5 = 0: 1 s elapsed, increment time. ; (2^15/(20h x 256) = 4 Hz ; BIT #60h,TIMER ; Bits show 0.25 s frame JNZ BTret ; Set: 0.25, 0.5 or 0.75 s ; CALL #RTCLKD ; Increment time by 1 s JNC BTret CALL #DATES ; C = 1: one day elapsed ; BTret POP R5 ; Restore R5 BIC #CPUOFF+SCG1+SCG0,0(SP) RETI ; Active Mode after RETI ; ;-------------------------------------------------------; Interrupt Handler for the USART1 Receive part. ; See also MSP430 Application Report 2000 for description ; R7 is used exclusively for the receive part ; RC1_HAN TST.B RCCNT ; Reception allowed? JZ RCRET ; No, status is 0 BIT.B #RXERR,&URCTL1 ; Error during receive? JNZ RCERR ; Yes
11.8 Die Source der MSP430F44x Quick Start Software DEC.B PUSH MOV MOV.B INC MOV POP TST.B JNZ BIC RETI
RCCNT ; Byte count -1 R7 ; Save R7 RCPOI,R7 ; Receive buffer pointer RXBUF1,0(R7) ; Next byte to buffer R7 ; To next buffer byte R7,RCPOI ; Update buffer pointer R7 RCCNT ; Buffer filled? RCRET ; No, proceed #CPUOFF+SCG1+SCG0,0(SP) ; Active Mode after RETI
RCRET ; ; Error: Clear all error flags to allow next RC interrupt ; RCERR ; ... ; Insert error handling BIC.B #FE+PE+OE+BRK+RXERR,&URCTL1 RETI ; ;--------------; Interrupt handler for the USART1 Transmit part. ; R6 is used exclusively for the transmit part. ; TX1_HAN TST.B TXCNT ; Something to transmit? JZ TXRET ; No, buffer is empty DEC.B TXCNT ; Byte count -1 PUSH R6 ; Save R6 MOV TXPOI,R6 ; Transmit buffer pointer MOV.B @R6+,&TXBUF1 ; Next byte for output MOV R6,TXPOI ; Update buffer pointer POP R6 TST.B TXCNT ; Buffer output? JNZ TXRET ; No, proceed BIC #CPUOFF+SCG1+SCG0,0(SP) ; Yes: TXRET RETI ; Active Mode after RETI ; ;-------------------------------------------------------; Interrupt handler for the Port1: P1.0...P1.7 (if used ; as inputs). Event Counter is connected to P1.3 ; P1_HAN PUSH R5 ; Save R5 MOV.B &P1IFG,R5 ; P1 Flags to R5 BIC.B R5,&P1IFG ; Reset set flags ; BIT.B #EvtCnt,R5 ; 1 -> 0 at Event Counter? JZ NoEvt ; No INC EVNTCNT ; Yes, increment counter ; NoEvt equ $ ; R5 contains set flags: ; ... ; process them here
371
372
Kapitel 11: Die MSP430F449 Quick Start Software POP RETI
R5
; Restore R5
; ;-------------------------------------------------------; Interrupt handler for the Port2: P2.0..P2.7 (if inputs) ; P2_HAN PUSH R5 ; Save R5 MOV.B &P2IFG,R5 ; P2 Flags to R5 BIC.B R5,&P2IFG ; Reset set flags ; ... ; R5 contains set flags: ; process them here POP R5 ; Restore R5 RETI ; ;-------------------------------------------------------; Interrupt handlers for the Timer_A ; ; Interrupt handler for Capture/Compare Block 0. An ext. ; peripheral is started every 1 ms with a negative pulse ; at TA0 (set exactly in time by Output Unit 0). ; The handler adds the time interval to TACCR0,sets the ; negative signal, switches back to Reset Mode and ; falls through to TA3_HAN. ; TA0_HAN EQU $ ; Start of handler ADD #((2*TACLK/1000)+1)/2,&TACCR0 MOV #OUTMOD_0+CCIE+OUT,&TACCTL0 BIS #OUTMOD_5,&CCTL0 ; To TA3_HAN ; ; Interrupt handlers for Capture/Compare Blocks 1 and 2 ; The interrupt flags CCIFGx are reset by the reading ; of the Timer Vector Register TAIV ; TA3_HAN EQU $ ; Start of Timer_A handler EINT ; Allow interrupt nesting TH0 ADD &TAIV,PC ; Add Jump table offset RETI ; Vector 0: No interrupt JMP TA_MOD1 ; Vector 2: Block 1 JMP TA_MOD2 ; Vector 4: Block 2 RETI ; Vector 6: Not implemented RETI ; Vector 8: Not implemented ; ; Block 5. Timer Overflow Handler: the Timer Register ; TAR is expanded into the RAM location TIMEXT (MSBs) ; The activity flag for the watchdog is set ; TA_OV EQU $ ; Vector 10: TIMOV Flag BIS.B #TAFlg,WDFlg ; Set activity flag for WD INC TIMAEXT ; Incr. Timer extension JMP TH0 ; Test for other interrupts
11.8 Die Source der MSP430F44x Quick Start Software ; ; Timer Block 1 measures the period of an input signal at ; pin CCI1A. ; The interval between two rising edges is measured ; TA_MOD1 EQU $ ; Vector 2: Block 1 MOV &CCR1,PERIOD ; Time of capt. rising edge SUB OLDRE,PERIOD ; Calculate period MOV &CCR1,OLDRE ; Store actual edge time JMP TH0 ; Test for other interrupts ; ; Timer Block 2 stores the time for a trailing edge at ; CCI2A ; STOR2 contains the time of the latest trailing edge ; TA_MOD2 EQU $ ; Vector 4: Block 2 MOV &CCR2,STOR2 ; Store event time JMP TH0 ; Test for other interrupts ;-------------------------------------------------------; Interrupt handlers for the Timer_B (not used here) ; If used, the "interrupt enable" bits of the Timer_B ; blocks must be set! ; ; Interrupt handler for Capture/Compare Block 0. ; TB0_HAN EQU $ ; Start of handler ; ... ; Insert TB0 code here RETI ; ; Interrupt handlers for Capture/Compare Blocks 1 to 6 ; The interrupt flags CCIFGx are reset by the reading ; of the Timer Vector Register TBIV. ; TB7_HAN EQU $ ; Start of Timer_B handler ADD &TBIV,PC ; Add Jump table offset RETI ; Vector 0: No interrupt JMP TB_MOD1 ; Vector 2: Block 1 JMP TB_MOD2 ; Vector 4: Block 2 JMP TB_MOD3 ; Vector 6: Block 3 JMP TB_MOD4 ; Vector 8: Block 4 JMP TB_MOD5 ; Vector 10: Block 5 JMP TB_MOD6 ; Vector 12: Block 6 ; ; Block 7. Timer Overflow Handler ; TB_OV EQU $ ; Vector 14: TIMOV Flag ; ... ; Insert TB_OV code here RETI ;
373
374
Kapitel 11: Die MSP430F449 Quick Start Software
; Timer_B Block 1: ; TB_MOD1 EQU $ ; Vector 2: Block 1 ; ... ; Insert TB1 code here RETI ; ; Timer_B Block 2: ; TB_MOD2 EQU $ ; Vector 4: Block 2 ; ... ; Insert TB2 code here RETI ; ; Timer_B Block 3: ; TB_MOD3 EQU $ ; Vector 6: Block 3 ; ... ; Insert TB3 code here RETI ; ; Timer_B Block 4: ; TB_MOD4 EQU $ ; Vector 8: Block 4 ; ... ; Insert TB4 code here RETI ; ; Timer_B Block 5: ; TB_MOD5 EQU $ ; Vector 10: Block 5 ; ... ; Insert TB5 code here RETI ; ; Timer_B Block 6: ; TB_MOD6 EQU $ ; Vector 12: Block 6 ; ... ; Insert TB6 code here RETI ; ;-------------------------------------------------------; Interrupt handler for Watchdog used in timer mode ; WD_HAN EQU $ ; Watchdog (timer mode) ; ... ; Handler (not used here) RETI ;-------------------------------------------------------; Interrupt handler for the NMI and Oscillator Fault ; NMI_HAN BIT.B #OFIFG,&IFG1 ; INTRPT by Osc. fault? JNZ OFERR ; Yes, handle it ; ... ; Insert NMI handler here RETI ;
11.8 Die Source der MSP430F44x Quick Start Software OFERR ;
EQU ... RETI
$
; Oscillator fault: ; Insert handler here
; ;-------------------------------------------------------; Interrupt handler for the Comparator_A (not used here) ; CA_HAN EQU $ ; ... ; Insert CA handler here RETI ;-------------------------------------------------------; Interrupt handler for the USART0 Transmit Part ; TX0_HAN EQU $ ; (not used here) ; ... ; Insert handler here RETI ; ;-------------------------------------------------------; Interrupt handler for the USART0 Receive Part ; RC0_HAN EQU $ ; (not used here) ; ... ; Insert handler here RETI ;-------------------------------------------------------; Interrupt handler for the ADC12 (not used here) ; ADC_HAN EQU $ ; ... ; Insert handler here RETI ; ;======================================================== ; Floating Point Package FPP4 ;======================================================== ; ; The definitions are located at the start of the source ; IF FPP4 LSTOUT#include "C:\TEST\IAR\FPP413\FPP04.s43" /* Basics */ #include "C:\TEST\IAR\FPP413\CNV04.s43" /* Conversions */ #include "C:\TEST\IAR\FPP413\FPPFNC4.s43" /* Functions */ LSTOUT+ ENDIF ; ;======================================================== ; INTERRUPT VECTORS ;======================================================== ; RSEG INTVEC ; Start of Interrupt Vectors ;
375
376
Kapitel 11: Die MSP430F449 Quick Start Software DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW END
BT_HAN P2_HAN TX1_HAN RC1_HAN P1_HAN TA3_HAN TA0_HAN ADC_HAN TX0_HAN RC0_HAN WD_HAN CA_HAN TB7_HAN TB0_HAN NMI_HAN INIT
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
FFE0h: FFE2h: FFE4h: FFE6h: FFE8h: FFEAh: FFECh: FFEEh: FFF0h: FFF2h: FFF4h: FFF6h: FFF8h: FFFAh: FFFCh: FFFEh:
Basic Timer1 Port2 P2.0 bis P2.7 USART1 TX 44x only USART1 RC 44x only Port1 P1.0 to P1.7 Timer_A3 Moduls 1/2 Timer_A3 Modul 0 ADC12 USART0 transmit USART0 receive Watchdog (Timer) Comparator_A Timer_B7 Moduls 1/6 Timer_B7 Modul 0 NMI, Osc., Flash Reset, WD (WD Mode)
; ; End of the MSP430x44x Quick Start Software ;========================================================
377
12 Tipps und Empfehlungen
12.1
Verbesserung der Lesbarkeit
Die Aufnahme der emulierten Befehle in den Befehlssatz des Assemblers wurde zu einem nicht unerheblichen Teil deswegen gemacht, um ein besser lesbares und verständlicheres Programm schreiben zu können. Daher sollte man unbedingt – auch sich selbst zuliebe – die besser geeignete Form des Befehls wählen. Spätestens beim Ändern des Programms kommt einem das zu gute! Zum Beispiel ist es nicht ganz leicht, auf Anhieb zu verstehen, was der Befehl XOR
#-1,R5
; ???
eigentlich macht. Wesentlich einfacher ist es zu verstehen, was der durch die obige Programmzeile emulierte Befehl tut: INV
R5
; Invertiere R5
Es ist der INV-Befehl (alle 16 Bits in R5 werden gewechselt). Das Gleiche gilt für die bedingten Sprünge. In den folgenden beiden Programmzeilen ist unklar, unter welchen Bedingungen gesprungen wird: CMP JC
EDE,R5 L$1
; Vergleiche R5 mit EDE ; Springe falls Carry = 1 (??)
Im Gegensatz dazu sind die beiden folgenden Programmzeilen, die den vorzeichenlosen, durch JC emulierten Sprungbefehl JHS (Jump if Higher or Same) verwenden, sehr leicht verständlich. CMP JHS
EDE,R5 L$1
; Ist R5 > EDE ; Springe falls R5 >= EDE
Der Sprung wird ausgeführt, wenn der Inhalt von R5 größer oder gleich dem Inhalt des Wortes EDE ist. Zur besseren Lesbarkeit trägt auch eine saubere, konsequente Zeilenaufteilung der Source bei, wie sie in der MSP430 Quick Start Software angestrebt wurde. Also eine Aufteilung nach dem Schema: ; Erklaerung fuer naechsten Block ; LABEL Befehl src,dst ; Kommentar
378 12.2
Kapitel 12: Tipps und Empfehlungen
Tipps und Empfehlungen
Die nachfolgenden Tipps und Empfehlungen entstammen der Praxis einer mehrjährigen Unterstützung von Kunden, die sowohl am Telefon, als auch schriftlich erfolgte. Die Erfahrung daraus zeigte, dass es eigentlich immer dieselben Probleme waren, die es zu lösen galt. • Einschwingzeit der FLL+: Die FLL+ startet mit der niedrigsten DCO-Frequenz. Bis die programmierte Frequenz erreicht ist, dauert es im »worst case«-Fall 28 25 2D (N +1) Wobei:
fDCOCLK-Zyklen
D
Gewählte Untersetzung des DCO (D = 0, 1, 2, 3)
N
Programmierter Multiplikationsfaktor des DCO (1…127)
Diese Anzahl von Zyklen muss in der Initialisierungsroutine abgewartet werden, bevor der LPM3 aufgerufen wird. Ansonsten wacht das Programm mit einer zu niedrigen Arbeitsfrequenz auf: Die von MCLK und SMCLK abhängigen Zeiten sind falsch. Ein Beispiel für die korrekte Initialisierung ist in der Initialisierungsroutine INITSR der »MSP430F449 Quick Start Software« enthalten. • Einschwingzeit des Quarzes: Wenn der hochfrequente Quarz während des LPM3 abgeschaltet wird, dauert es relativ lange, bis er nach dem Aufwachen des MSP430 wieder richtig schwingt. Diese Einschwingzeit kann verkürzt werden, wenn man einen Keramikschwinger anstelle des Quarzes verwendet. Die niedrigere Güte Q des Keramikschwingers führt zu einem kürzeren Zeitintervall bis eine stabile Schwingung erreicht ist. Der Nachteil ist die geringere Frequenzgenauigkeit des Keramikschwingers. Diese spielt aber in den meisten Anwendungen keine große Rolle. • Einschwingzeit des Quarzes: Dasselbe gilt für den 32-kHz-Quarz nach der Beendigung des LPM4: Auch hier dauert es relativ lange, bis der Quarz nach dem Aufwachen des MSP430 wieder richtig schwingt (bis zu vier Sekunden). Zeitgenaue Anwendungen müssen diese Zeit abwarten. • Modifikation des Information Memory: Ein Block des Information Memory kann mit Hilfe des anderen Blocks sicher verändert werden. Der »alte» Block wird gelesen, modifiziert und in den anderen »neuen« Block geschrieben. Dann wird der erfolgreich modifizierte, »neue« Block zurück in den »alten« Originalblock geschrieben oder aber ein Zeiger im RAM wird so verändert, dass er auf den »neuen« Block zeigt. • Byte Strings: Wenn nach RAM-Zuordnungen eine rseg-Anweisung kommt, dann sollte die Anzahl der reservierten RAM-Bytes durch eine weitere GVAnweisung geradzahlig gemacht werden, andernfalls generiert der Linker eine schwer zuzuordnende Fehlermeldung.
12.2 Tipps und Empfehlungen
EDE
rseg ds
DATA16_Z 3
rseg MOV
CODE R14,0(R15)
; ; ; ; ;
379
Frueher "rseg UDATA0" 3 RAM-Bytes reservieren: eines ist frei Programmspeicher beginnt Linker generiert Warnung!
Durch das Einfügen eines unbenutzten Bytes verschwindet die Warnung des Linkers:
EDE
rseg ds ds rseg MOV
DATA16_Z 3 1 CODE R14,0(R15)
; ; ; ; ;
Frueher "rseg UDATA0" 3 RAM-Bytes reservieren 1 unbenutztes RAM-Byte Programmspeicher beginnt Linker gen. keine Warnung!
Wichtig: Bei allen Hardware-Tests sollte ein Oszilloskop – kein Logic Analyzer – mit ausreichender Bandbreite verwendet werden. Ein Logic Analyzer bildet nicht die wahren Verhältnisse ab! So zum Beispiel kann die Speisespannung mit diesem Gerät überhaupt nicht daraufhin kontrolliert werden, ob Brummen oder Rauschen auf ihr vorhanden sind.
12.2.1 Häufigste Softwarefehler Während der Programmentwicklung machen fast alle Assemblerprogrammierer dieselben Fehler. Die folgende Liste enthält diejenigen Softwarefehler, die am häufigsten vorkamen. • Befehle die die Status-Bits nicht beeinflussen: Die Befehle BIS, BIC, MOV, CALL, PUSH, SWPB und die JMPs beeinflussen die Status-Bits im Status Register SR nicht. Das bedeutet, die Status-Bits behalten den Zustand, den sie vor dem Befehl bereits hatten. Bedingte Sprünge, die nach diesen Befehlen stehen richten sich nach den Bedingungen des vorletzten Befehls – was durchaus gewünscht sein kann – und nicht nach den Resultaten der BIS, BIC, MOV, CALL, PUSH, SWPB und JMPs. • Oszillatorfehler (MSP430F1xx-Familie): Solange der Quarz für die CPU nicht schwingt, wird automatisch der DCO verwendet. Die Software muss prüfen, ob das OFIFG-Bit im Interrupt Flag Register IFG1 zurückgesetzt ist (Quarz(e) schwingen richtig) und falls ja, zum Quarzoszillator zurückschalten. • Oszillatorfehler: Bei der MSP430F1xx-Familie beeinflusst der 32-kHzOszillator den OFIFG-Flag nicht! • Analog-Digital-Wandler ADC12 mit interner oder externer Referenz: wenn die analoge Speisespannung AVcc nicht als Referenz verwendet wird, dann reicht es nicht aus, die interne 1,5 V- bzw. 2,5 V-Referenzspannung
380
Kapitel 12: Tipps und Empfehlungen
einzuschalten. Die Sref-Bits in den ADC12MCTLx-Registern müssen auch noch entsprechend modifiziert werden. • Falsche Port-Flags: Die Port-Flags P1FLG.x und P2FLG.x werden nicht gesetzt, wenn sie gleichzeitig gelesen und geschrieben werden. Das kann passieren, wenn die Flags durch Software abgefragt werden und gleichzeitig durch externe Signale verändert werden. Die Benutzung des Port-Interrupts vermeidet diesen Fehler. • Stack Pointer ist nicht initialisert: Der Stack Pointer SP muss vor dem ersten EINT, PUSH, POP oder CALL-Befehl initialisiert werden. Der normale Weg dafür ist (256 Bytes RAM): MOV
#0300h,SP
; SP auf max. RAM-Adresse+2
• Stack Pointer negativ indiziert: Ein Stack-Zugriff mit negativem Index wie CMP
#15,-4(SP)
; Stand 15 auf dem Stack?
ist in jedem Falle Unsinn, da Interrupts oder Subroutinen alles überschreiben, was unterhalb der Adresse im Stack Pointer SP steht. Es wird also anstatt auf vermeintliche Daten, auf willkürliche Rückkehradressen oder frühere Inhalte des Status Registers SR zugegriffen.
Abb. 12.1: Stack mit nicht verwendbarem Bereich
• Benutzung falscher Jump-Befehle: Die »Conditional Jump«-Befehle JLO und JL, oder JHS und JGE, ergeben verschiedene Resultate wenn sie für Operanden benutzt werden, deren MSB gesetzt ist (08000h bis 0FFFFh bei Wort-Befehlen bzw. 080h bis 0FFh bei Byte-Befehlen). JLO und JHS: Operanden sind vorzeichenlos, d.h. 08000h > 07FFFh. JL und JGE: Operanden sind vorzeichenbehaftet, d.h. 08000h < 07FFFh. Es ist daher sehr wichtig, immer zwischen vorzeichenbehafteten und vorzeichenlosen Operanden zu unterscheiden. • Byte-Befehle auf Arbeitsregister angewendet: Byte-Befehle, die auf Arbeitsregister (R0 bis R15) angewendet werden, löschen immer das obere Byte des Arbeitsregisters (Bits 8 bis 15). Ausnahmen sind die Befehle
12.2 Tipps und Empfehlungen
381
CMP.B, TST.B, BIT.B, PUSH.B: Sie lesen das Destinationregister nur, ohne es zu verändern. Es ist daher notwendig, Wort-Befehle für Arbeitsregister zu verwenden, wenn der Bereich für Bytes (0…255) überschritten werden kann. Anmerkung: Die fünf Eingabe-Register des Hardware-Multiplizierers (Adressen 130h…138h) verhalten sich bei Byte-Befehlen wie die Arbeitsregister! Das obere Byte wird gelöscht.
• Zähler und Timer länger als 16 Bits: Falls Zähler oder Timer, die länger als 16 Bits sind, von Interrupt-Routinen verändert werden können und vom Background verwendet werden, dann ist es notwendig, den Interrupt während des Lesens zu sperren. Am einfachsten geht das mit dem DINT-Befehl. Wenn das nicht gemacht wird, kann die Interrupt-Routine die Daten zwischen dem Lesen der beiden Wörter verändern. Das bedeutet, das MSB-Wort wurde mit dem neuen Wert gelesen, das LSB-Wort mit dem alten. Beispiel: Die Timer-Interrupt-Routine inkrementiert einen 32-Bit-Zähler TIMHI/TIMLO. Der Background benutzt diesen Timer für Berechnungen. Das Ausschalten der Interrupts verhindert, dass ein Timer-Interrupt zwischen dem Lesen von TIMLO und TIMHI die gelesene Information verfälschen kann. Das ist der Fall, wenn TIMLO während der Interrupt-Routine von 0FFFFh auf 0000h überläuft: TIMLO wird mit der alten Information 0FFFFh gelesen und TIMHI mit der neuen (x+1). Das folgende Programm verhindert diesen Fehlerfall. BT_HAN
INC ADC RETI ...
TIMLO TIMHI
; Inkrementiere LSB Wort ; Inkrementiere MSB Wort
; ; Der Background kopiert TIMHI/TIMLO fuer Berechnungen ; DINT ; GIE TACCR0 ist: Verlust der Synchronitaet. ; Falls ja, Aktivitaet wiederholen, bis wieder synchron ; MOV &TACCR0,R15 ; TACCR0 – TAR SUB &TAR,R15 ; delta in R15 JN TA00 ; Falls neg.: TACCR0 < TAR POP R15 ; R15 restaurieren RETI
12.2.2 Häufigste Hardwarefehler • Parallelkapazität des Quarzes: Der 32-kHz-Oszillator des System Clock Generators der MSP430F4xx-Famile hat eingebaute, wählbare Kapazitäten von 0 pF, 10 pF, 14 pF und 18 pF an den Pins XIN und XOUT. Mit der Schaltkapazität von ungefähr 2 pF zusammen ergibt das Werte für die Parallelkapazität CL von 1 pF, 6 pF, 8 pF und 10 pF (der Quarz sieht die Kapa-
12.2 Tipps und Empfehlungen
387
zitäten in Reihe geschaltet). Wenn die Parallelkapazität nicht initialisiert wird, ist der Wert 0 pF gewählt, was ein Nichtanschwingen des Quarzes oder ein instabiles Schwingen verursachen kann. Siehe Kapitel »Der FLL+ System Generator«. • Quarzgehäuse: Wenn der benutzte Quarz ein Metallgehäuse hat, dann sollte dieses Gehäuse mit AVss verbunden werden. Diese Methode verringert die EMV-Empfindlichkeit der Oszillatorschaltung wesentlich. • Speisespannung: Auch kurze negative Spitzen unter die Mindestspeisespannung Vccmin des MSP430 können ein Abstürzen der Software zur Folge haben. Es ist daher sehr wichtig, dies durch eine stabile Speisespannung zu verhindern. • Offene Eingänge: Jeder Eingang muss ein definiertes Potential haben. Falls nicht, sorgen Brumm und Rauschen für unerwünschte Eingangssignale, die den Programmablauf stören können. Zusätzlich steigt auch die Stromaufnahme an, da sich eine Eingangsspannung in der Mitte der Versorgungsspannung DVcc einstellt, was beide Transistoren der Eingangsstufe leitend macht. • Quarz-Anschwingzeit: Wenn der MSP430 aus dem Low Power Mode 4 aufgeweckt wird, dann braucht der Quarz eine relativ lange Zeit bis er stabil schwingt. Dies kann bis zu 4 s dauern. Zeitmessungen sind erst möglich, wenn der Quarz mit der korrekten Frequenz arbeitet. • Speisespannung für batteriebetriebene Systeme: Manche Batterien mit langer Lebensdauer können im Active Mode durch ihren hohen Innenwiderstand unter die Mindestspannung des MSP430 fallen. Dies kann speziell dann der Fall sein, wenn der Analog-Digital-Wandler benutzt wird. Ein großer Kondensator parallel zur Batterie kann dies verhindern. Siehe Kapitel »Stromversorgung«. • Speisespannung für netzbetriebene Systeme: Brummen, Rauschen und Spannungsspitzen sind nicht erlaubt. Falls sie vorhanden sind, wird die Zuverlässigkeit des Systems verringert und die Genauigkeit des AnalogDigital-Wandlers beeinflusst. • Speisespannungsanschlüsse: Alle Vss- und Vcc-Anschlüsse (z.B. AVss, DVss1, DVss2, AVcc, DVcc1, DVcc2, Vssx, Vccx) eines Gehäuses müssen angeschlossen sein, um eine fehlerfreie Funktion zu erhalten. • EEPROM-Clock: Bei manchen externen EEPROMs ist die Mindestlänge eines Clock-Signals länger als ein MSP430-Befehl. Das bedeutet, dass NOPs in die Software eingesetzt werden müssen, um fehlerfreie Funktion zu garantieren. Näheres in der Spezifikation des benutzten EEPROMs. • ACLK ist aktiv im Low Power Mode 4: Auch sehr kleine Gleichströme, die in den XIN-Pin hineinfließen, können den 32-kHz-Oszillator aktivieren. Das kommt von dem Logiktor, das von diesem Strom geöffnet wird.
388
Kapitel 12: Tipps und Empfehlungen
Meistens passiert dies, wenn man einen Oszillographen- oder Logic Analyzer-Tastkopf an den XIN-Pin hält. • LCD-Kontrast: Zu große LCDs, mit dadurch zu hohen Kapazitäten, führen zu schlechtem Kontrast. Die Signale an den Common- und Select-Pins sind verschliffen. Ein LCD mit geringerer Kapazität hilft hier. • Strom in Anschlüsse hinein: Dieser Fehler wird normalerweise durch externe Spannungen, die außerhalb des Speisespannungsbereiches (DVss bis DVcc) des MSP430 sind, hervorgerufen. Einige Beschränkungen müssen hier beachtet werden: • Der maximale Strom in einen Anschluss hinein oder aus ihm heraus (2 mA) darf nicht überschritten werden. Falls das nicht beachtet wird, kann »latch-up« auftreten: Der MSP430 nimmt hohen Strom auf und arbeitet nicht mehr. • Der maximale Strom ist nicht als ständiger Strom gedacht. • Der zu hohe Strom wird auf den Vcc-Bus abgeleitet, wenn die externe Spannung positiv ist: Das bedeutet, dass eine speisende Batterie geladen wird. Einige Batterietypen können in diesem Falle explodieren. Näheres ist in der Spezifikation der Batterie zu lesen. • Der ADC12 misst falsch, wenn seine Eingänge mit Strom beaufschlagt werden. • Vermeidung von Latch-up: In einigen Fällen ist es notwendig, den MSP430 gegen externe Einflüsse zu schützen. • 1-kW-Widerstände in Reihe mit den TDI-, TDO- und RST/NMIAnschlüssen. Sie sollten so nahe als möglich an den MSP430-Anschlüssen platziert sein! • Speisung des gesamten MSP430-Systems durch eine einzige Spannungsversorgung. Gleiche Speisespannung für alle Systemkomponenten bedeutet, dass keine Spannungsdifferenzen auftreten können, die Strom in die MSP430-Anschlüsse verursachen können. • 1-kW-Widerstände in Reihe mit allen LCD-Anschlüssen (Select und Common). Sie müssen direkt an den MSP430-Anschlüssen angeordnet sein. • MSP430-Eingänge, die von Quellen mit anderen Speisespannungen als der MSP430-Speisespannung getrieben werden, sollten einen Widerstand (10 bis 100 kW) in Reihe haben. Siehe Abbildung 12.2. • MSP430-Ausgänge, die Lasten treiben, die an andere Speisespannungen angeschlossen sind, sollten einen Strombegrenzungswiderstand in Reihe haben. Der notwendige Wert kann durch »Worst case«-Berechnung gefunden werden. Siehe Abbildung 12.2.
12.3 Prüflisten für Fehler
389
Abb. 12.2: Vermeidung von »Latch-up«
12.3
Prüflisten für Fehler
Die beiden Prüflisten dienen zum unvoreingenommenen Test des zu prüfenden MSP430-Systems. Sie enthalten häufig gemachte Fehler, sowohl für die Software, als auch für die Hardware. Bei unerklärlichem Fehlverhalten des MSP430Systems sollten die beiden Listen durchgegangen werden. Oft kann damit das Fehlverhalten erklärt und beseitigt werden.
12.3.1 Durch die Software bedingte Fehler 1. Initialisierung des Stack Pointers: Wurde sie vergessen oder erst nach den Befehlen EINT, CALL, PUSH oder POP durchgeführt? Dies hat zufällige Programmabstürze zur Folge, je nach der Reihenfolge der Geschehnisse. 2. Der Überlauf von zu kurzen Registern (Arbeitsregister, Memory und Peripherie-Register) produziert negative Zahlen oder eine »Sägezahncharakteristik« der Resultate. 3. PWM-Applikationen: Das Laden der Pulslängen-Register des Timer_A muss mit dem Wechsel des Ausgangs synchronisiert sein. Ansonsten entstehen undefinierte Ausgangswechsel während des Änderns des Pulslängen-Registers TACCRx. Siehe Kapitel »Der Timer_A«. 4. PWM-Applikationen: Ist die Ausgangsfrequenz zu hoch? Z.B. falls die Registerladezeit länger ist als die Impulslänge (Timer_A).
390
Kapitel 12: Tipps und Empfehlungen
5. Echtzeit-Anwendungen: Der verwendete Algorithmus muss kürzer sein als das zur Verfügung stehende Zeitintervall und das auch bei »worst case«Bedingungen. 6. Bedingte Sprünge: Sind vorzeichenbehaftete und vorzeichenlose Sprünge richtig verwendet worden? So sind z.B. JHS (Jump if Higher or Same) und JGE (Jump if Greater or Equal) vollständig verschiedene Befehle. Das Gleiche gilt für JLO (Jump if Lower) und JL (Jump if Less Than). JHS und JLO sind vorzeichenlose Sprünge, JGE und JL sind vorzeichenbehaftete Sprünge. Bei Adressvergleichen haben nur vorzeichenlose Sprünge Sinn. 7. Fehlende Stack-Korrektur (housekeeping) bei Stack-Operationen? Dies führt zum Verwenden falscher Daten für die Rückkehr aus einer Interrupt-Routine oder einer Subroutine. Programmabsturz ist die normale Folge. 8. Änderung der Rückkehrwerte auf dem Stack: Wenn die Rückkehrwerte für das Status Register SR und den Program Counter PC – die während des Interrupts auf dem Stack gespeichert sind – mit Daten überschrieben werden, so kann das durch die RETI-Instruktion das OSCoff-Bit im Status Register setzen. Das bedeutet, dass das Programm stehen bleibt. 9. Auslesen von Zwei-Wort-Registern ohne das Abschalten des Interrupts: Falls während des Auslesens ein Übertrag vom unteren zum oberen Register stattfindet, enthält das eine Register den neuen Wert, das andere den alten. 10.Schieben durch mehrere Wörter: Der richtige Schiebebefehl muss verwendet werden (RRC oder RLC). Die arithmetischen Schiebeinstruktionen schieben statt des Carrys Nullen ein (RLA) bzw. duplizieren das Vorzeichen (RRA). 11.Interrupt-Routinen: Lange Programmteile ohne wieder eingeschalteten Interrupt (EINT Befehl) blockieren alle anderen Interrupt-Aktivitäten. Wichtig bei Timer_A und Timer_B wenn der Continuous Mode verwendet wird: Die Interrupt-Routinen müssen durch einen ADD-Befehl die Zeit für den nächsten Interrupt definieren. Kann dies durch ein lange ausgeschaltetes GIE-Bit im Status Register nicht geschehen, dann gerät der Timer aus der Synchronisation und setzt für 216/fTimer [s] aus. 12.Falls die Zweitfunktion eines Port-Registers verwendet wird (z.B. für den Timer_A oder die USART): Ist das betreffende Bit in dem zugehörigen PxSEL-Register gesetzt? Ist das betreffende Bit im PxDIR-Register gesetzt, falls der Port als Ausgang verwendet wird? 13.Sind alle Peripheriemodule initialisiert? Ist ihr Interrupt eingeschaltet? 14.Wird auf Werte außerhalb des Stacks zugegriffen? Adressen, die unterhalb des Stacks liegen (also eine kleinere Adresse haben als diejenige im Stack Pointer SP), werden mit dem nächsten Interrupt überschrieben! Nur Adressen gleich oder größer als der SP-Inhalt enthalten sichere Daten.
12.3 Prüflisten für Fehler
391
12.3.2 Durch die Hardware bedingte Fehler 1. Ist der Initialisierungsschaltkreis angeschlossen? Ein RC-Glied ist in den meisten Fällen nicht ausreichend. 2. Hat das RST/NMI-Signal überlagerte Spannungsspitzen oder falsche Spannungspegel? Dies ist ein oft vorkommender Grund für Probleme. 3. Ist die Treiberfähigkeit der Ausgänge überschritten? In der Spezifikation des MSP430 ist sie definiert. Die Ausgangsimpedanz eines Ausgangs liegt – abhängig vom Ausgangsstrom – zwischen 100 W und 500 W. 4. Wird der maximale Gesamtstrom aller Ausgänge überschritten? Er sollte 12 mA (DVout = 0.25 V) bzw. 48 mA (DVout = 0.6 V) nicht überschreiten. 5. Offene Eingänge (Interrupt, Reset, Eingänge usw.): Jeder Eingang muss an einen definierten Spannungspegel angeschlossen sein. Falls nicht, werden undefinierte Signale (normalerweise die Netzspannung, aber auch Störungen) an den hochohmigen Eingängen gesehen. Siehe auch Kapitel »Korrekter Abschluss unbenutzter Anschlüsse«. 6. Wird die Anschwingzeit des Quarzes abgewartet? Diese kann beim 32-kHzQuarz bis zu vier (!) Sekunden betragen. 7. Sind korrekte Eingangsspannungspegel an allen Eingängen? Sowohl für hohe als auch für niedrige Pegel? 8. Sind die Eingangssignale in den spezifizierten Grenzen: Pegel, Frequenz und Übergangszeiten? 9. Haben die Ausgangssignale die notwendigen Werte um die angeschlossene externe Peripherie zu treiben: Pegel, Frequenz und Übergangszeiten? 10.Speisespannung: Ist sie in den spezifizierten Grenzen und störfrei (also ohne Spannungsspitzen, Brumm und überlagertes Rauschen)? 11.Sind die externen Interrupt-Signale zu kurz? Dies bedeutet, dass kein Interrupt ausgelöst wird. Die Mindestimpulslänge ist 1,5 MCLK-Zyklen (also 1,5 ms bei fMCLK = 1,0 MHz). 12.Externes EEPROM: Ist das vom MSP430 generierte Clock-Signal zu schnell oder von zu kurzer Dauer? Siehe die EEPROM-Spezifikation. 13.Sind Leiter auf der Leiterplatte unterbrochen? Dies kann mit einer beleuchteten Lupe sehr gut festgestellt werden. 14.Sind kalte Lötstellen auf der Leiterplatte? 15.Sind unbenutzte MSP430-Pins richtig abgeschlossen? Siehe auch Kapitel »Korrekter Abschluss unbenutzter Anschlüsse«.
393
13 Verbesserung der Störempfindlichkeit
Um die Störempfindlichkeit (electromagnetic compatibility) eines MSP430Systems oder einer Schaltplatine zu verbessern, haben sich folgende Maßnahmen bewährt (Vss und Vcc bedeuten sowohl DVssx und DVccx als auch AVss und AVcc): • Kondensatoren (100 nF) zwischen Vss und Vcc und nahe an den MSP430Anschlüssen. SMT-Ausführungen haben sich am besten bewährt, da sie die kleinsten Anschlussinduktivitäten haben. • Breite und kurze Vss- und Vcc-Leitungen. Mehr darüber im Kapitel »Erwägungen zum Bezugspotential Vss«. • »Ground planes« (Vss) wo immer möglich. Die gesamte, unbenutzte Platinenfläche sollte auf diese Weise genutzt werden und zwar auf beiden Seiten. Die »ground planes« müssen, wo immer möglich, miteinander verbunden werden, z.B. durch Durchkontaktierungen. • Der Quarz – und seine eventuellen, externen Lastkapazitäten – müssen unmittelbar (!) an den MSP430-Anschlüssen XIN und XOUT montiert werden. Falls nicht, wirken die Zuleitungen wie Antennen und stören den hochempfindlichen Oszillator. Siehe Kapitel »Leitungsführung«. • Die Batteriezuleitungen sollten verdrillt werden. • Wichtig ist ein definiertes Potential für alle Eingänge: Pull-up- oder Pulldown-Widerstände sollten vorhanden sein (ungefähr 100 kW). Genaue Information im Kapitel »Korrekter Abschluss unbenutzter Anschlüsse«. • Pull-up-Widerstand für den RST/NMI-Anschluss (100 kW). • Serienwiderstände (10 bis 100 kW) – nahe den MSP430-Eingängen – für alle langen Leitungen. • Wenn das MSP430-System in einem metallisierten Gehäuse untergebracht ist, dann muss dieses Gehäuse an DVss-Potential gelegt sein. Falls nicht, werden die Störverhältnisse normalerweise schlechter, als sie ohne die Metallisierung sind. • Ein dicker Ring mit DVss-Potential um das LCD herum schützt diesen Schwachpunkt, der auch bei einem metallisierten Gehäuse offen ist.
394
Kapitel 13: Verbesserung der Störempfindlichkeit
• Der Quarz sollte ein Metallgehäuse haben. Dieses Gehäuse muss mit AVss verbunden werden.
13.1
Erwägungen zum Bezugspotential Vss
Die korrekte Auslegung des Bezugspotentials – also normalerweise die Auslegung der Vss-Speisung – ist sehr wichtig für Analog-Digital-Wandler mit hoher Auflösung. Es gibt ein paar grundlegende Regeln, die dabei beachtet werden sollten. Sie wurden von E. Haseloff/TID entwickelt. • Verwendung von getrennten analogen und digitalen Masseflächen (Ground Planes) wo immer das möglich ist: Keine dünnen Leitungen von der Speisung zu den Dvss und AVss-Anschlüssen des MSP430. • Der AVss-Anschluss des MSP430 ist der Sternpunkt für alle analogen Masseverbindungen, wie z.B. Sensoren oder analoge Eingangssignale. Der DVssAnschluss ist der Sternpunkt für alle digitalen Masseverbindungen, wie z.B. Schalter, Tasten, Leistungstransistoren, Ausgangsleitungen und digitale Eingangssignale. • Die Batterie und der Kondensator Cb müssen eng beieinander angeordnet sein (der Kondensator Cb wird bei Batterien mit relativ hohem Innenwiderstand benötigt). Von diesem Kondensator gehen zwei unterschiedliche Leitungen zu den analogen und den digitalen Anschluss-Pins. Zwei kleine, hochwertige Kondensatoren sind direkt an den digitalen (Cd) und analogen (Ca) Versorgungs-Pins angeschlossen, wie es in Abbildung 13.1 für den Eingang VREF+/VeREF+ gezeigt ist. • Alle oben angeführten Punkte für Vss sind auch für die Vcc-Leitungen gültig, also für DVcc1, DVcc2 und AVcc. • Die AVss- und DVss-Anschlüsse müssen extern verbunden werden, da sie intern nicht verbunden sind. Das Gleiche gilt für die AVcc- und DVccAnschlüsse. Diese Verbindung wird mit der Schaltung in Abbildung 13.1 sowieso gemacht. • Die Induktivität L ist nur in besonders schwierigen Fällen notwendig. • Die Verbindungen des Kondensators Cb sind der Sternpunkt des gesamten MSP430-Systems. Der Grund hierfür ist die niedrige Impedanz dieses Kondensators. • Wenn ein metallisiertes Gehäuse um die MSP430-Schaltplatine herum angeordnet ist, dann ist es sehr wichtig, die Metallisierung dieses Gehäuses mit dem Massepotential der Schaltplatine (normalerweise DVss) zu verbinden. Wenn das nicht gemacht wird, ist das Störverhalten normalerweise schlechter, als es ohne Metallisierung ist.
13.2 Leitungsführung
395
Abb. 13.1: Spannungsversorgung für Analog-Digital-Wandler
Im Kapitel »Stromversorgung« wird ein Bezugspotential für den ADC12 gezeigt, das nicht dem AVss-Potential entspricht: Die Mitte der Speisespannung Vcc.
13.2
Leitungsführung
Die korrekte Leitungsführung auf einer Schaltplatine ist sehr wichtig, wenn minimale Störungen gewünscht sind. Abbildung 13.2 zeigt – in vereinfachter Darstellung – eine Leitungsführung, die in dieser Hinsicht nicht optimal ist: Die grauen Flächen empfangen Störungen von externen Quellen oder strahlen selbst Störungen ab. Um den Einfluss, der von externen Störquellen kommt, auf ein Minimum zu bringen, müssen diese Flächen so klein wie möglich sein. Dies ist beim 32-kHz-Quarz besonders wichtig, um Aussetzer zu vermeiden: Der extrem leistungsarm ausgeführte Oszillator ist natürlich dadurch empfindlich gegenüber externen Störungen.
396
Kapitel 13: Verbesserung der Störempfindlichkeit
Abb. 13.2: Störungsempfindliche Leitungsführung
Abbildung 13.3 zeigt eine optimale Leitungsführung: Die Flächen, die Störungen empfangen oder abstrahlen, sind hier so klein als möglich gemacht. Der 32-kHzQuarz ist unmittelbar an den XIN- und XOUT-Anschlüssen des MSP430 montiert.
Abb. 13.3: Leitungsführung für minimale Störempfindlichkeit
13.3 Anschluss langer Sensorleitungen
13.3
397
Anschluss langer Sensorleitungen
Wenn der Abstand des MSP430 zum Sensor relativ groß ist (>30 cm), dann ist es empfehlenswert, ein geschirmtes Kabel zwischen dem MSP430 und dem Sensor zu verwenden. Das geschirmte Kabel vermeidet Spannungsspitzen am ADCEingang durch Störspannungen, die Messfehler verursachen. Zusätzlich wird der ADC-Eingang geschützt. Abbildung 13.4 zeigt diese Schaltung auf der linken Seite der Zeichnung. Auf die gleiche Weise können auch Vierleiter-Sensoren an den MSP430 angeschlossen werden. Wenn ein abgeschirmtes Kabel nicht verwendet werden kann, dann sollte die Schaltung auf der rechten Seite der Abbildung 13.4 verwendet werden: Die AVss-Leitung parallel zu der Signalleitung gibt eine relativ gute Abschirmung. Das Verdrillen der beiden Leitungen verbessert den Schutz noch. Um die Messungen gegen Spannungsspitzen, Brumm, Rauschen und andere unerwünschte Störungen zu schützen, können auch die Ratschläge des Kapitels »Signalmittelung und Störungsunterdrückung« verwendet werden. Dieses Kapitel zeigt Möglichkeiten für die Verringerung dieser Einflüsse durch Software.
Abb. 13.4: Sensoranschluss über lange Leitungen
Mit der Schaltung in Abbildung 13.4 muss die minimale Zeit zwischen dem Einschalten der Spannung am Ausgang Px und der eigentlichen Messung – um die vollen 12 Bit Genauigkeit zu erhalten – eine Mindestgröße tdelay haben: WGHOD\ =
t PD[ =
t PD[
Der Wert von tmax ist: tPD[ =
( 5S + 5VHQVPD[__5Y) &
t PD[
398
Kapitel 13: Verbesserung der Störempfindlichkeit
13.4
Signalmittelung und Störungsunterdrückung
Wenn das gemessene Signal Rauschen, Spannungsspitzen und andere unerwünschte Signalkomponenten enthält, dann ist eine Mittelung der ADC-Resultate notwendig. Fünf verschiedene, einfache Methoden werden gezeigt: 1. Aufsummierung (Oversampling): Mehrere Messresultate werden aufsummiert und die Summe wird für die Berechnungen benutzt. 2. Kontinuierliche Mittelung (Continuous Averaging): Ein Ringspeicher (circular buffer) wird für die Messresultate benutzt. Mit jedem neuen Messresultat wird ein neuer Mittelwert berechnet. 3. Gewichtete Aufsummierung (weighted summation): Der alte Wert und das neue Messresultat werden addiert und durch zwei geteilt. Das Ergebnis wird gespeichert und verwendet. 4. Unterdrückung von Extremwerten (Rejection of Extremes): Das größte und das kleinste Messresultat werden nicht verwendet. Die anderen Messresultat werden gemittelt. 5. Synchronisation der Messungen zum Brummen. Die Vor- und Nachteile der obigen Methoden werden aufgeführt.
13.4.1 Aufsummierung Aufsummierung (Oversampling) ist die einfachste Methode für die Mittelung von Messresultaten: N Messresultate werden aufsummiert und die Summe danach durch N dividiert oder aber so benutzt, wie sie ist. Bei der Berechnung muss dann nur berücksichtigt werden, dass die Summe um den Faktor N zu groß ist. Falls Slope und Offset für die Korrektur der Messresultate verwendet werden, kann die folgende Formel für diese Korrektur verwendet werden: 9QRUPDO = 6ORSH $'& + 2IIVHW 9RYHUVDPSOH =
Ê 6ORSH $'& + 2IIVHW 1
Beispiel: N ADC12-Messungen sollen in SUMLO und SUMHI aufaddiert werden. Die Anzahl N ist in N_ADC definiert. Falls N 16 ist, genügt das Register SUMLO, da der maximale Wert dann 16 FFFh = FFF0h ist. SUMLO SUMHI N_ADC ;
OVSLOP
EQU EQU EQU
R4 R5 R6
; LSBs der ADC-Wert-Summe ; MSBs der Summe ; Anzahl summierter ADC-Res.
MOV CLR CLR CALL
#32,N_ADC ; 32 Messwerte summieren SUMLO ; Init. der Summenregister SUMHI #MEAS_ADC12 ; 12-Bit-Resultat in ADC12MEM0
13.4 Signalmittelung und Störungsunterdrückung ADD ADC DEC JNZ ...
Nachteile: Vorteil:
399
&ADC12MEM0,SUMLO ; LSBs der Summe SUMHI ; MSBs der addierten Summe N_ADC ; Decr. N-Zaehler: 0 erreicht? OVSLOP ; Nein, weiter messen ; Ja, 32 Werte in SUMHI|SUMLO
Relativ hoher Stromverbrauch durch die Anzahl der notwendigen ADC-Messungen Einfache Programmierung Verbesserte Auflösung durch summierte N Messresultate Unterdrückung von Spitzen und Störungen durch N definiert
13.4.2 Kontinuierliche Mittelung Eine sehr einfache und schnelle Methode um digitale Signale zu mitteln ist die Kontinuierliche Mittelung (Continuous Averaging): Ein Ringbuffer wird mit dem neuesten Messresultat aktualisiert und das älteste Messresultat wird aus ihm herausgenommen (die beiden Messresultate haben die gleiche RAM-Adresse). Um die Rechenzeit zu minimieren, wird das älteste Messresultat von der Summe subtrahiert und das neueste wird addiert. Die Summe in CFSUM (ein 32-BitWert, der N Messresultate enthält) wird vom Hauptprogramm für die Berechnungen benutzt. Es muss nur berücksichtigt werden, dass CFSUM die Summe von N Messresultaten repräsentiert. Dieselbe Rechenformel wie bei der Aufsummierung kann verwendet werden. Die Charakteristik dieser Mittelung ist ähnlich der eines Kammfilters (comb filter), das eine relativ gute Unterdrückung für Frequenzen aufweist, die ganzzahlige Vielfache der Abtastfrequenz sind. Das Frequenzverhalten wird in der nächsten Abbildung gezeigt:
Abb. 13.5: Frequenzverhalten der Kontinuierlichen Mittelung
400
Kapitel 13: Verbesserung der Störempfindlichkeit
Nachteil:
N RAM-Worte werden für den Ringbuffer benötigt
Vorteile:
Geringer Stromverbrauch, da jeweils nur eine Messung notwendig ist Verbesserte Auflösung durch summierte N Messresultate Schnelle Aktualisierung des Buffers Gute Unterdrückung bestimmter Störfrequenzen (Vielfache der Abtastfrequenz)
Beispiel: Eine Interrupt-getriebene Routine (z.B. vom ADC12, der vom Timer_A oder Timer_B gestartet wird) aktualisert einen Ringbuffer mit N Messresultaten. Die Summe in CFSUM wird aktualisiert durch die Subtraktion des ältesten Messresultats und die Addition des neuesten. CFSUM und CFSUM+2 enthalten immer die Summe der letzten N Messresultate. Falls N 16 ist, genügt ein Wort für CFSUM, da der maximale Wert dann 16 FFFh = FFF0h ist. N CFSTRT CFSUM CFPOI ; CFHND
EQU DS DS DS
16 N*2 4 2
; ; ; ;
Circular Buffer mit N ADC12-Res. Adresse des 1. Wertes Summe der letzten N Werte Zeiger: naechster, aeltester Wert
PUSH MOV CMP JLO MOV
R5 ; R5 retten CFPOI,R5 ; Aktuelle Adresse in R5 #CFSTRT+(N*2),R5 ; Ausserhalb des Buffers? CF00 ; Nein #CFSTRT,R5 ; Ja, Zeiger auf Anfang
; ; Der aelteste Wert wird von der Summe CFSUM subtrahiert. ; Der neueste Wert ueberschreibt den aeltesten und wird ; zur Summe addiert ; CF00 SUB @R5,CFSUM ; CFSUM – aeltestem Wert SBC CFSUM+2 MOV &ADC12MEM0,0(R5) ; Neuester Wert in Buffer ADD @R5+,CFSUM ; CFSUM + neuester Wert ADC CFSUM+2 ; MSBs MOV R5,CFPOI ; Zeiger aktualisieren POP R5 ; Restauriere R5 RETI
13.4.3 Gewichtete Aufsummierung Die gewichtete Summe der bisherigen Messungen und die neueste Messung werden addiert und dann durch zwei geteilt und gespeichert. Diese Methode gibt jeder Messung ein bestimmtes Gewicht (Dt ist das Zeitintervall zwischen zwei Messungen):
13.4 Signalmittelung und Störungsunterdrückung
Messzeit
Gewicht
Kommentar
t0 t0 – Dt t0 – 2Dt t0 – 3Dt t0 – 4Dt t0 – nDt
0.5 0.25 0.125 0.0625 0.03125 2-(n+1)
Neuestes Messresultat Letztes Messresultat
401
Messresultat vor n Zeitintervallen
Tabelle 13.1: Gewicht der Messresultate
Nachteil:
Unterdrückung von Spitzen manchmal nicht ausreichend, da nur durch den Faktor 2 unterdrückt wird
Vorteile:
Geringer Stromverbrauch, da nur eine Messung notwendig ist Extrem kurzer und schneller Code Nur ein RAM-Wort notwendig
Beispiel: Die Aktualisierung der Summe in WSSUM wird gezeigt. WSSUM ; WSHND
DS
2
; Gewichtete Summe
ADD RRA ...
&ADC12MEM0,WSSUM ; Addiere neueste Messung WSSUM ; Neue Summe/2 ; Weiter mit neuer Summe
Eine zweite Variante ist die Rundung des neuen gemittelten Wertes durch Verwendung des bei der Division durch zwei entstehenden Carry: WSHND
ADD RRA ADC ...
&ADC12MEM0,WSSUM ; Addiere neueste Messung WSSUM ; Bit 2^-1 im Carry WSSUM ; Mit Bit 2^-1 runden ; Weiter mit neuer Summe
Bei Verwendung des Gleitkommapaketes kann auch eine Mittelung mit unterschiedlicher Gewichtung der alten und neuen Messresultate vorgenommen werden, z.B können die summierten alten Werte eine Gewichtung von zwei erhalten und das neueste Messresultat eine solche von eins. Die Summe der beiden wird dann durch drei geteilt. Es ist aber auch jede andere Kombination der Gewichtungen möglich z.B. 2,5 und 3,4. Der Divisor ist dann 2,5 + 3,4 = 5,9. Beispiel: Die alten, gewichtet summierten Messresultate der Batteriespannung Ubatt (gespeichert in Ubattgm) haben eine Gewichtung von 3,00, das neueste Messresultat hat eine solche von 1,00. ; Fuer Ubatt wird ein gleitender Mittelwert Ubattgm ; verwendet: Ubattgm(n) = (3 x Ubattgm(n-1) + Ubatt(n))/4 ; SUB #FPL,SP ; Platz fuer Berechnungen MOV #Ubattgm,RPARG ; Alter Mittelwert Ubatt
402
Kapitel 13: Verbesserung der Störempfindlichkeit
; FLT3 FLT4
MOV CALL MOV CALL MOV CALL MOV MOV ....
#FLT3,RPRES ; Gewichtung 3,00 adress. #FLT_MUL ; Ubattgm x 3,00 #Ubatt,RPRES ; Spannung Ubatt (neu) #FLT_ADD ; 3 x Ubattgm + Ubatt #FLT4,RPARG ; Divisor 4,00 adressieren #FLT_DIV ; (3 x Ubattgm + Ubatt)/4 @SP+,Ubattgm ; Gemitt. Spannung Ubattgm @SP+,Ubattgm+2 ; speichern. House keeping ; Mit Ubattgm rechnen
.float .float
3.00 4.00
; Gewichtung Mittelwert ; Divisor (FLT3 + 1,00)
13.4.4 Unterdrückung von Extremwerten Diese Mittelungsmethode misst (N+2) Messresultate unmittelbar hintereinander und entfernt dann den kleinsten und den größten gemessenen Wert. Die verbleibenden N Messresultate werden addiert und die Summe für die nächsten Rechenschritte durch N geteilt, oder so benutzt, wie sie ist (was zu einer besseren Auflösung führt). Man muss nur daran denken, dass die Summe um den Faktor N zu groß ist. Nachteil:
Relativ hoher Stromverbrauch, da N+2 Messungen notwendig sind
Vorteile:
Einfache Programmierung Sehr gute Unterdrückung von Spitzen (sie werden nicht verwendet) Nur N+2 RAM-Worte notwendig
Beispiel: Sechs ADC12-Messresultate werden addiert, die beiden Extremwerte werden festgestellt und von der Summe subtrahiert und die Summe der mittleren vier Messresultate in SESUM gespeichert. Die Konstante N kann in jeden beliebigen Wert geändert werden, allerdings benötigt der Speicher SESUM zwei RAM-Worte, wenn N größer als 14 gewählt wird, da (15 +2) FFFh = 10FEFh und damit > FFFFh ist. Man sollte für die Konstante N eine Potenz von 2 wählen, da dann die Division vereinfacht wird: Es ist nur Rechtsschieben (RRA) notwendig. N SESUM SESUM SEHI SELO SECNT
EQU IF DS ELSE DS ENDIF DS DS DS
4 N GT 14 4
; Anzahl Messg.–2 (also 6)
2
; N =< 14 Buffer 16 Bit
2 2 1
; Groesstes ADC12-Resultat ; Kleinstes ADC12-Resultat ; Zaehler fuer N
; Summen-Buffer 32 Bit
13.4 Signalmittelung und Störungsunterdrückung ; SEHND
CLR IF CLR ENDIF MOV.B MOV CLR
SESUM N GT 14 SESUM+2
; Buffer loeschen
#N+2,SECNT #0FFFFh,SELO SEHI
; Anzahl Messungen +2 ; ADCmax -> SELO ; ADCmin -> SEHI
403
; 2. Wort auch loeschen
; ; N+2 Messungen werden gemacht und in SESUM aufsummiert ; SELOOP CALL #MEAS_ADC12 ; ADC12-Res. in &ADC12MEM0 MOV &ADC12MEM0,R5 ; ADC12-Resultat in R5 ADD R5,SESUM IF N GT 14 ; 32-Bit-Summe falls N > 14 ADC SESUM+2 ENDIF CMP R5,SEHI ; Resultat > SEHI? JHS SE00 ; Nein MOV R5,SEHI ; Ja, aktualisiere SEHI SE00 CMP R5,SELO ; Resultat < SELO? JLO SE01 ; Nein MOV R5,SELO ; Ja, aktualisiere SELO SE01 DEC.B SECNT ; Dekr. Zaehler fuer N JNZ SELOOP ; N+2 noch nicht erreicht ; ; N+2 Messungen sind aufsummiert, Extremwerte werden ; von der Summe subtrahiert. ; Rueckkehr mit N-fach zu grossem Wert in SESUM ; SUB SELO,SESUM ; Subtr. niedrigsten Wert IF N GT 14 ; Falls N > 14 SBC SESUM+2 ; Auch vom 2. Wort subtr. ENDIF SUB SEHI,SESUM ; Subtrahiere grössten Wert IF N GT 2 ; Falls N > 14 SBC SESUM+2 ; Auch vom 2. Wort subtr. ENDIF RET ; Resultat in SESUM
13.4.5 Synchronisation der Messungen zur Netzfrequenz Falls Brummen auf der Messspannung eine Rolle spielt, kann eine Synchronisation der Messungen zur Netzspannung eine Hilfe sein, um dieses Problem zu bewältigen. Abbildung 13.6 zeigt den – übertrieben gezeichneten – Einfluss der Netzspannung auf die Messspannung eines Sensors. Die notwendige Anzahl von Messungen – hier 10 – wird in zwei gleiche Teile aufgeteilt: Die zweite Hälfte der Messungen wird nach exakt einer halben Periode Tmain/2 der Netzfrequenz
404
Kapitel 13: Verbesserung der Störempfindlichkeit
fmain durchgeführt. Das jeweils gemessene Brummen der beiden Teilmessungen ist absolut gesehen gleich groß, hat aber verschiedene Vorzeichen. Dadurch ist die akkumulierte Summe der Brummspannung nahezu Null: Der Einfluss ist minimiert.
Abb. 13.6: Minimierung des Brummeinflusses durch Synchronisation zur Netzfrequenz
Falls eine Differenzmessung notwendig ist – also die beiden Messergebnisse voneinander subtrahiert werden – dann verschlechtert die oben gezeigte Methode das Ergebnis. Verwendet man aber eine Zeitverzögerung von exakt einer Netzperiode Tmain zwischen den Messungen, dann minimiert sich auch hier der Brummeinfluss auf das Messergebnis. Diese Messmethode wird z.B. bei Wärmemengenzählern verwendet, wo die Temperaturdifferenz zwischen dem Warmwassereinlass und dem Wasserauslass für die Berechnung der Energie verwendet wird.
13.4 Signalmittelung und Störungsunterdrückung
405
Abb. 13.7: Minimierung des Brummeinflusses durch Synchronisation zur Netzfrequenz
Für die Messung und Generierung der Zeitverzögerung Tmain können sowohl der Basic Timer1 als auch der Timer_A oder Timer_B verwendet werden. Abbildung 13.8 zeigt zwei Möglichkeiten für die Messung der Netzperiode Tmain mit dem Timer_A der dabei im Capture Mode arbeitet. Die Netzspannung wird hochohmig in den Spannungsbereich des MSP430 heruntergeteilt und die Zeitpunkte der Nulldurchgänge gemessen. Aus der Zeitdifferenz zwischen zwei gleichartigen Nulldurchgängen (z.B. von negativ nach positiv) kann die Netzperiode berechnet werden. Die in der Abbildung gezeichneten Eingänge P1.0/TA0 und P1.2/TA1 haben eine direkte Verbindung zu den Timer_A-Modulen 0 bzw. 1 und können daher die Zeitpunkte der Nulldurchgänge der Netzfrequenz exakt messen.
406
Kapitel 13: Verbesserung der Störempfindlichkeit
Abb. 13.8: Messung der Periode der Netzspannung ( Zwei Methoden)
In [1] Kapitel »Synchronization of the Measurement to Hum« sind die Formeln für die Abtastfehler beider Methoden aufgeführt.
13.5
Korrekter Abschluss unbenutzter MSP430-Pins
Unbenutzte MSP430-Anschlüsse müssen in einer definierten Weise abgeschlossen werden, wenn höchste Sicherheit gegen Störungen und geringster Stromverbrauch verlangt werden. Die Tabelle 13.2 ist für die MSP430x4xx-Familie gemacht, gilt aber – bis auf das JTAG-Interface – auch für die anderen MSP430Familien. Der korrekte Abschluss des JTAG-Interface muss im jeweiligen Datenblatt nachgesehen werden. Anschluss
Potential
AVcc AVss A0…A7 VREF+ VeREF+ VREF-/VeREFXIN
DVcc DVss offen offen DVss DVss DVcc
Kommentar
Als Ausgangs-Port P6 schalten
Wenn kein Quarz oder ext. Clock benutzt wird
13.5 Korrekter Abschluss unbenutzter MSP430-Pins
Anschluss
Potential
XOUT/TCLK XT2IN XT2OUT Px.0…Px.7 R03 R13 R23 R33 S0…S39 RST/NMI Com0…Com3 TDO TDI: TMS TCK
offen DVcc offen offen DVss DVss DVss offen offen DVcc oder Vcc offen offen offen offen offen
407
Kommentar Wenn kein Quarz oder ext. Clock benutzt wird Unbenutzte Ports als Ausgänge schalten LCD ausschalten: LCDM0 = 0
Unbenutzte I/O-Ports als Ausgänge schalten Mit Pull-up-Widerstand 100 kW
Tabelle 13.2: Abschluss unbenutzter MSP430F4xx-Pins
Anschlüsse die nur die MSP430x3xx-Familie hat: Anschluss
Potential
Rext A0…A7 Xin Xout XBUF CI S0…S1 TP0.0…TP0.5
offen offen Vcc offen offen Vss offen offen
Kommentar Als analoge Eingänge schalten: AEN.x = 0 Wenn kein Quarz oder ext. Clock benutzt wird Wenn kein Quarz oder ext. Clock benutzt wird Ausgang abschalten Kann als digitaler Eingang verwendet werden TP.5 als Ausgang, die anderen auf HI-Z
Tabelle 13.3: Abschluss unbenutzter MSP430C3xx-Pins
409
14 Verringerung des Stromverbrauchs
Um alle Vorteile des Low-Power-Designs der MSP430-Familie ausnützen zu können, müssen einige Regeln beachtet werden. Das folgende Kapitel gibt eine Übersicht, was zu beachten ist, um eine minimale Stromaufnahme des MSP430Systems zu erreichen. Es genügt ja nicht, dass der MSP430 wenig Strom aufnimmt, der Rest der Schaltung muss es auch tun. Die Minimierung des Stromverbrauchs ist von überragender Bedeutung für batteriegespeiste Systeme, aber auch bei netzgespeisten Systemen lohnt es sich, sich Gedanken über den Stromverbrauch zu machen: • Je geringer der Stromverbrauch ist, desto kleiner – und damit kostengünstiger – kann das Netzteil sein. • Dasselbe gilt für einen Kondensator, der kurze Spannungseinbrüche von Vcc überbrücken soll.
14.1
Stromaufnahme-Profil eines MSP430F4xx
Um die Stromaufnahme eines MSP430-Systems so gering als möglich zu halten, muss der MSP430 fast immer im LPM3 arbeiten (Größenordnung 99,99 % der Zeit): nur der Basic Timer1, die Flüssigkristallanzeige und die Interrupt-Hardware sind eingeschaltet, die CPU ist ausgeschaltet und wird in programmierbaren Zeitintervallen (z.B. jede Sekunde) vom Basic Timer1 aufgeweckt. Die Stromaufnahme eines solchen Systems, das jede Sekunde aufwacht um einen Zeitzähler zu erhöhen und jede Minute mit dem Analog-Digital-Wandler misst sowie danach Berechnungen durchführt, schaut folgendermaßen aus:
410
Kapitel 14: Verringerung des Stromverbrauchs
Abb. 14.1: Stromaufnahme-Profil für den Low Power Mode 3
;SFIMEPPI>IMXIRMR7IOYRHIR t1
Zeitintervall zwischen zwei ADC12-Messungen (hier 60 s).
t2
Zeitintervall zwischen zwei aktiven Perioden (hier 1 s).
tTim
Aktive Zeit nach dem Aufwachen. Typisch 25 µs bis 1 ms. (z.B. Erhöhen eines Sekundenzählers, Prüfung ob t1 vorbei ist).
tADC
Aktive Zeit mit eingeschaltetem ADC und eingeschalteter CPU. Typisch sind 3 µs bis 13 µs pro Wandlung mit dem ADC12.
tproc
Aktive Zeit mit eingeschalteter CPU. Typisch sind 1 ms bis 100 ms. (z.B. Berechnungen nach den Messungen).
IAM
Stromaufnahme des MSP430: Active Mode, ADC12 aus. Typisch sind 0,42 mA.
IAMAD
Stromaufnahme des MSP430: Active Mode, ADC12 ein. Typisch sind 0,42 mA + 0,8 mA = 1,22 mA.
ILPM3
Stromaufnahme des MSP430: Low Power Mode 3. Typisch sind 1,6 µA.
Der mittlere Strom Icc, der vom MSP430 aus der Batterie entnommen wird, ist: ,&& =
Û W Ë W Û Ë Ì W7LP ,$0 + WSURF ,$0 + W$'& ,$0$' + Ì W - W7LP - W$'& - WSURF Ü ,/30 ÜÜ W W ÌÍ W Ý Í Ý
Die obige Formel kann vereinfacht werden, falls tTim, tADC und tproc wesentlich kürzer sind als t1 , was normalerweise der Fall ist: ,&&
W7LP ,$0 + WSURF ,$0 + W$'& ,$0$' + ,/30 W W
14.2 Minimierung der Stromaufnahme eines MSP430-Systems
411
Beispiel: Ein MSP430-System arbeitet mit den folgenden Werten. AVcc = DVcc = 3,0 V, TA = +25 C, t1 = 60 s, t2 = 1 s, tTim = 0,5 ms, tADC = 0,15 ms, tproc = 10 ms, fMCLK = 1 MHz, zwei ADC12-Messungen zu je 13 ms. Da tTim, tADC und tproc wesentlich kürzer sind als t1 , kann mit der vereinfachten Formel gerechnet werden. Damit ergibt sich ein typischer, mittlerer Strom Icc : ,&&
PV P$ + PV P$ + PV P$ + m$ V V
,FF m$
Bei dem obigen Beispiel erhöht sich der Stromverbrauch des MSP430F4xx nur um 17,5 % verglichen mit dem Stromverbrauch ILPM3 des LPM3 (1.6 µA).
14.2
Minimierung der Stromaufnahme eines MSP430Systems
Die Gesamtstromaufnahme eines batteriegespeisten MSP430-Systems besteht aus mehreren Komponenten: 1. Stromaufnahme des MSP430 2. Selbstentladung der Batterie 3. Stromaufnahme des Quarzes 4. Stromaufnahme der Flüssigkristallanzeige (LCD) 5. Stromaufnahme der externen Bauelemente Jede dieser fünf Komponenten der Stromaufnahme wird nachfolgend im Detail beschrieben. Es wird dabei von einem System ausgegangen, das im LPM3 arbeitet, da der LPM4 – der einen noch geringeren Stromverbrauch als der LPM3 hat – keine Zeitmessung erlaubt: Da auch der ACLK abgeschaltet ist, können nur noch die Interrupts der Ports 1 und 2 den MSP430 aus dem LPM4 wecken.
14.2.1 Stromaufnahme des MSP430 Der Low Power Mode 3 muss die normale Betriebsart des MSP430 sein. Der Active Mode und der Active Mode mit eingeschaltetem ADC werden nur verwendet, wenn das notwendig ist. Einige wichtige Regeln für die Minimierung der Stromaufnahme des MSP430 sind:
412
Kapitel 14: Verringerung des Stromverbrauchs
1. Der LPM3 sollte so selten als möglich verlassen werden (wake-up), z.B. nur alle zwei Sekunden durch den Interrupt des Basic Timer1. 2. Das Programm, das nach dem Aufwachen aus dem LPM3 abgearbeitet wird, sollte so kurz wie möglich sein, z.B. das Erhöhen eines Zeitzählers und die Prüfung, ob noch andere Aktivitäten notwendig sind. Falls das nicht der Fall ist, sofortige Rückkehr in den LPM3. 3. Die Zeitintervalle zwischen zwei aktiven Perioden – also Perioden in denen gemessen und gerechnet wird – sollten so lange wie möglich sein, z.B. 60 s und länger. 4. Nur die wirklich benötigten Peripherie-Module sollten eingeschaltet sein. So sollte der ADC nur während einer Messung eingeschaltet sein, danach sollte er sofort mit dem Bit ADC12ON im Register ADC12CTL0 ausgeschaltet werden. Hier kann auch die Verwendung des ADC-Interrupts helfen: Die Interrupt-Service-Routine des ADC12 schaltet den ADC nach erfolgter Messsequenz aus. 5. Vermeidung des Abfragens von Eingängen, um Änderungen ihres Zustandes festzustellen. Stattdessen die Verwendung der Interrupt-Möglichkeit der Ports 1 und 2, um solche Änderungen festzustellen. Da diese Eingänge auf beide Flanken eines Eingangssignals reagieren können, kann jede Änderung festgestellt werden, ohne ständig den Zustand abfragen zu müssen. 6. Vermeidung langer Berechnungen (z.B. Reihenentwicklungen). Stattdessen sollten Tabellen benutzt werden. Die sieben Adressierungsarten des MSP430 sind wie maßgeschneidert für schnelle, codesparende Tabellenverarbeitung. 7. Subroutinenaufrufe (CALLs) sollten in Programmteilen, die häufig durchlaufen werden, vermieden werden, da sie sieben MCLK-Zyklen für einen normalen Aufruf samt Rückkehr benötigen. Stattdessen kann der benutzte Code zwei- oder dreimal eingesetzt werden (z.B. als MACRO). Mehr Programmplatz ist nötig, aber weniger CPU-Zyklen. 8. Kurze Programmschleifen sollten vermieden werden, da die Schleifenkontrolle einen relativ hohen Anteil an der Verarbeitungszeit hat. Stattdessen sollte die Schleife in eine lineare Codesequenz umgewandelt werden, die keinerlei »Overhead« hat. 9. Für lange Softwareteile sollten die Arbeitsregister R4 bis R15 verwendet werden. Das bedeutet kürzere Ausführungszeiten und geringere Programmlänge im Speicher. 10.Sofortiges Beenden einer Berechnung, falls einer der Faktoren Null wird und dadurch auch das Ergebnis. 11.Verwendung des Hardware-Multiplizierers, falls er vorhanden ist. Die Multiplikation von 16-Bit-Daten kann dadurch von ungefähr 170 MCLK-Zyklen
14.2 Minimierung der Stromaufnahme eines MSP430-Systems
413
auf 12 reduziert werden. Bei Verwendung des Gleitkommapaketes die Größe »HW_MPY equ 1« setzen. Wenn die obigen Empfehlungen angewendet werden, dann ist die Stromaufnahme des Active Mode nur noch zweitrangig: Die ungewöhnlich hohe Rechenleistung von 1623 Millionen Befehlen pro Wattsekunde (bekannter unter der Bezeichnung MIPS/W) erlaubt es, den Einfluss eines einzelnen Befehls zu ignorieren. Die Stromaufnahme des LPM3 ist wesentlich wichtiger. Die mittlere Stromaufnahme des MSP430 ergibt sich, wie im vorigen Kapitel berechnet, zu Icc = 1,88 mA. Anmerkung: Die Rechenleistung 1623 MIPS/W errechnet sich für die Bedingungen: MSP430F4xx, AVcc = DVcc = 2,2 V, IAM = 280 mA, fMCLK = 1 MHz 0,36: =
I0&/. ( = = ( '9FF ,$0 ( -
14.2.2 Selbstentladung der Batterie Dieser Teil der Stromaufnahme des MSP430-Systems erlaubt nur geringe Einflussnahme. Hier ist es wichtig, die Empfehlungen des Batterieherstellers genau zu beachten. Es ist empfehlenswert, die Batterie an einem relativ kühlen Ort im Gehäuse zu platzieren. Das bedeutet, nicht direkt an heißen Teilen, wie z.B. am Heizkörper selbst, bei einem elektronischen Heizkostenverteiler. Ein häufig verwendeter Schätzwert für die Selbstentladung einer Batterie während einer Betriebszeit von 10 Jahren ist, mit nur 70 % der nominellen Ladung zu rechnen. Dies entspricht einer Selbstentladung pSE pro Jahr von S6( =
-
=
-DKU
Ausgedrückt durch einen stetigen Selbstentladestrom Strom ISE bedeutet das für eine Batterie mit 0,5 Ah nomineller Ladung: ,6( =
S6( 4 = K -DKU
$K = K
m$
Der Selbstentladungsstrom ISE hat also eine Größe von ungefähr 2 mA.
414
Kapitel 14: Verringerung des Stromverbrauchs
14.2.3 Stromaufnahme des Quarzes Gute Quarzqualität und die niedrige Frequenz (32,768 kHz) beim MSP430 bedeuten eine notwendige Treiberleistung des Oszillators, die von ungefähr 1 µW bis 10 µW reicht. Bei einer Speisespannung Vcc = 3 V reicht die Stromaufnahme des Quarzes damit von 333 nA bis 3,33 µA. Der Mittelwert des Quarzstromes ist also IQu = 1 µA. Dieser Strom fließt immer, da die Frequenz des 32,768-kHz-Oszillators im LPM3 als Zeitbasis benutzt wird.
14.2.4 Stromaufnahme der Flüssigkristallanzeige (LCD) Gute Qualität und eine niedrige Arbeitsfrequenz (128 Hz) resultieren in einer Stromaufnahme von ungefähr 13 nA/mm2 LCD-Fläche. Für eine Flüssigkristallanzeige mit 100 mm2 Fläche bedeutet das einen LCD-Strom ILCD von ,/&' =
PP
Q$ PP =
m$
Der MSP430 erlaubt es, durch externe Widerstände an den Anschlüssen R03, R13, R23 und R33 die Anpassung an eine gegebene Flüssigkristallanzeige zu optimieren. Der Strom IRLCD durch diese Widerstände kommt noch zu dem Strom ILCD hinzu. Bei vierfach-Multiplex und vier 1,5-MW-Widerständen ergibt dies einen Strom IRLCD: ,5/&' =
9FF 5/&'
=
9 = 0W
m$
14.2.5 Stromaufnahme der externen Bauelemente Tasten und Schalter die an Eingangs-Ports angeschlossen sind, können während langer Zeitintervalle geschlossen sein (z.B. der Flügelradkontakt eines elektronischen Wasserzählers während des Urlaubs). Durch den unbedingt notwendigen Ableitwiderstand am Eingang kann ein – im Vergleich zum sonstigen System – großer Strom fließen. Solche Kontakte sollten daher abschaltbar sein, wie in Abbildung 14.2 der oberste Kontakt. Dadurch fließt kein Strom durch einen internen oder externen Ableitwiderstand. Das Programm muss prüfen, ob ein Kontakt länger als eine definierte Zeit geschlossen ist und den Kontakt abschalten, falls dies der Fall ist. Von da an ist allerdings eine regelmäßige Abfrage notwendig, ob der Kontakt nicht wieder geöffnet wurde: Falls ja, wird der Kontakt wieder ständig eingeschaltet. Diese Abfrage kann aber sehr kurz sein (einige Mikrosekunden), der Stromverbrauch spielt also keine Rolle.
14.2 Minimierung der Stromaufnahme eines MSP430-Systems
415
Abb. 14.2: Anschluss von Tasten und Schaltern
Falls Eingänge des MSP430 kein definiertes Potential in der Nähe einer der beiden Spannungen Vss oder Vcc haben, dann fließt innerhalb des Eingangsschaltkreises ein zusätzlicher Querstrom, da die beiden Eingangstransistoren nicht vollständig gesperrt sind. Abbildung 14.2 zeigt drei Möglichkeiten, um einem Eingangs-Port ein definiertes Potential zu geben. • Eingang mit einem internen Ableitwiderstand: Der Schalter kann mit einem Ausgang abgeschaltet werden. Der Ausgang wird zu diesem Zwecke nach Vss (DVss) oder in den hochohmigen Zustand (Hi-Z) geschaltet. Anmerkung: Nur Maskentypen haben die Möglichkeit interner Ableitwiderstände. • Eingang mit einem externen Ableitwiderstand: Hier wird der Ableitwiderstand auf dasselbe Potential geschaltet wie der Schalter, d.h. wenn der Schalter offen ist, wird der Ableitwiderstand auf Vss-Potential geschaltet, falls er geschlossen ist, auf Vcc-Potential. • Kein Ableitwiderstand: Der Schalter verbindet den Eingang immer mit einem definierten Potential. Externe Schaltungen (z.B. Sensoren) sollten ausgeschaltet werden, wenn sie nicht gebraucht werden. Dies kann direkt mit einem Port geschehen (linke Schaltung in Abbildung 14.3). Falls die Stromaufnahme der externen Schaltung die Treiberfähigkeit eines Ports überschreitet (RDSon 100 W), kann man mehrere Ausgänge eines Ports – wie hier gezeigt parallelschalten – oder aber die Schaltung rechts in Abbildung 14.3 mit dem PNP-Transistor verwenden: Falls die Speisespannung der externen Schaltung als Referenzspannung für den ADC12 verwendet wird, wird die geschaltete Speisespannung – wie hier gezeigt – einfach auf den externen Referenzeingang VeREF+ des ADC12 geschaltet.
416
Kapitel 14: Verringerung des Stromverbrauchs
Abb. 14.3: Ein- und Ausschalten externer Schaltungen
Beispiel: Ein 1-kW-Sensor zieht 3 mA (!) wenn er an eine Spannung von Vcc = 3 V angeschlossen wird. Der gleiche Sensor zieht einen extrem kleinen, mittleren Strom Isensor wenn er nur im Abstand von 60 s während der eigentlichen Messzeit des ADC12 an die Spannung Vcc angeschlossen wird. (3 bis 13 µs bei ADC12CLK = 1 MHz): ,VHQVRU =
9 mV = Q$ NW V
Der mittlere Strom durch den Sensor ist jetzt nur noch 0,5 nA, d.h. er ist 59,3 109 mal kleiner, als wenn er immer eingeschaltet wäre.
14.2.6 Berechnung der Lebensdauer der Batterie Mit den bisher gefundenen Werten für den Stromverbrauch kann nun die Lebensdauer einer gegebenen Batterie berechnet werden: W%DWW =
4%DWW ,FF + ,4X + ,/&' + ,5/&' + ,6\V
14.2 Minimierung der Stromaufnahme eines MSP430-Systems
Wobei: tBatt
417
Lebensdauer der Batterie in Stunden
QBatt
Ausnützbare Ladung der Batterie (70 % von 0,5 Ah in diesem Beispiel)
Icc
Mittlerer Speisestrom des MSP430F44x (1,88 µA in diesem Beispiel)
IQu
Mittlerer Speisestrom des Quarzes (1,0 µA in diesem Beispiel)
ILCD
Speisestrom des LCD (1,3 µA in diesem Beispiel)
IRLCD Strom durch die externen LCD-Widerstände (0,5 µA in diesem Beispiel) ISys
Mittlerer Speisestrom durch die externe Schaltung (nicht einberechnet, da zu stark von der Anwendung abhängig)
Für eine Umgebungstemperatur von TA = +25 °C und die vorher berechneten Verbrauchswerte für die Ströme ergibt sich eine Lebensdauer der Batterie von: W%DWW =
$K m $ + m $ + m $ + m $
= K
Diese Stundenzahl entspricht einer Batterielebensdauer von 8,53 Jahren. Durch die Verwendung von Vcc = 2,2 V kann die Lebensdauer der Batterie erhöht werden, da alle Ströme kleiner werden.
419
15 REFERENZEN und »Wo zu Finden«
Die im Buch in eckigen Klammern »[]« enthaltenen Zahlen beziehen sich auf die nachfolgenden Schriften: So weist z.B. [3] auf den »MSP430x1xx Family User’s Guide« hin. Der Name »X:\« steht für den Systemnamen des CD-Antriebs. 1. MSP430 Family Application Reports
2001
SLAA024
2. MSP430x1xx Family Application Reports
2001
3. MSP430x1xx Family User’s Guide
2000
SLAU049
4. MSP430x3xx Family User’s Guide
2000
SLAU012
5. MSP430x4xx Family User’s Guide
2001
SLAU056
6. Data Sheet MSP430x43x,MSP430x44x
2002
SLAS344
7. MSP-FET430 Flash Emulation Tool (FET) User’s Guide 2003 8. IAR-Literatur 9. MSP430 Family Software User's Guide
1994
SLAUE11
10.The Frequency Locked Loop System Clock Generator (FLL+) 11.The MSP430 Liquid Crystal Display Module
2001
12.Mixing C and Assembler Code for the MSP430 13.The 12-Bit Analog-to-Digital Converter Part 1
SLAA140 2001
Die oben angegebenen Referenzen sind an folgenden Stellen aufzufinden: [1] Texas Instruments Buch SLAA024 MSP430-CD: X:\Literature\Literature – MSP430\Application Reports\ SLAA100.pdf sowie ch1.pdf bis ch9.pdf Internet: http://www.ti.com/sc/msp430 [2] MSP430-CD: X:\Literature\Literature – MSP430\Application Reports\ Internet: http://www.ti.com/sc/msp430 [3] Texas Instruments Buch SLAU049 MSP430-CD: X:\Literature\Literature – MSP 430\User’s Guide\
420
Kapitel 15: REFERENZEN und »Wo zu Finden«
Family Users Guide\SLAU049C.pdf [4] Texas Instruments Buch SLAU012 MSP430-CD: X:\Literature\Literature – MSP 430\User’s Guide\ Family Users Guide\SLAU012A.pdf [5] Texas Instruments Buch SLAU056 MSP430-CD: X:\Literature\Literature – MSP 430\User’s Guide\ Family Users Guide\SLAU056C.pdf [6] Texas Instruments Data Sheet SLAS344 MSP430-CD: X:\Literature\Literature – MSP 430\Data sheets\ MSP430x43x_x44x\SLAS344C.pdf http://www.ti.com/sc/msp430 [7] MSP430-CD: X:\Literature\Literature – MSP 430\User’s Guide\ FET Users Guide\MSP-FET430 Users Guide.pdf Internet: http://www.iar.se [8] MSP430-CD: X:\Literature\Literature – MSP 430\User’s Guide\ a430.pdf Assembler, Linker, Librarian Programming Guide cw430.pdf C-SPY User Guide icc430.pdf C-Compiler Programming Guide Internet: http://www.iar.se [9] Texas Instruments Buch SLAUE11 [10] MSP430-CD: X:\FRANZIS Datei LCDAR.pdf und LCDAR.zip (enthält die Softwarebeispiele aus LCDAR.pdf in komprimierter Form) [11] MSP430-CD: X:\FRANZIS Dateien FLLPLUS.pdf und FLLPLUS.zip (enthält die Softwarebeispiele aus FLLPLUS.pdf in komprimierter Form) [12] MSP430-CD: X:\Literature\Literature – MSP430\Application Reports\ [13] MSP430-CD: X:\FRANZIS Datei ADC12A.zip (enthält die Softwarebeispiele in komprimierter Form)
15.1
Die Quellen für MSP430-Information
15.1.1 Internet Die Internet-Homepage für die MSP430-Familie ist: http://www.ti.com/msp430 Diese Homepage enthält Informationen über Entwicklungswerkzeuge, Produkte, Fehlerlisten, Datenblätter, Bücher, Artikel, Produkte unabhängiger Hersteller und Applikationsberichte.
15.1 Die Quellen für MSP430-Information
421
Da sich die Einteilung der Home Page von Zeit zu Zeit ändert, wird nicht näher auf diese eingegangen. Weitere brauchbare Internetadressen: TI Semiconductor Home Page:
http://www.ti.com
TI Distributors:
http://www.ti.com/sc/docs/distmenu.htm
Support Centers:
http://www.ti.com/cgi-bin/sc/support.cgi
15.1.2 MSP430-CD Die MSP430-CD wird normalerweise in Quartalsabstand neu herausgegeben. Die dem Buch beiliegende CD enthält die im Buch beschriebenen Programme und Applikationsberichte in einem eigenen Kapitel. Family:
Overview, MSP430 Series
Literature:
Data Sheets, Application Reports, Seminar Presentations
Tools:
Overview, Software Installations
Homepage:
http://www.ti.com/sc/msp430
Literature Number: SLAC001H Diese CD enthält Information über Entwicklungswerkzeuge, Produkte, Datenrd blätter, Fehlerlisten, 3 -Party-Firmen, Bücher, Artikel und Applikationsberichte. Weiter sind enthalten: • Die IAR-Software (Assembler A430, Linker XLINK, Embedded Workbench, C-SPY) • Das Gleitkommapaket FPP4 • »Das Erste Programm« • Die MSP430 F449 Quick Start Software
423
Stichwortverzeichnis
16-Bit-Wort 41 24-Bit-Mantisse 274 32-kHz-Oszillator 23, 39, 121, 122, 379, 386, 387 32-kHz-Quarz 244, 302, 320, 378, 391, 395, 396 40-Bit-Mantisse 274 8-Bit-Daten 346
A Ableitwiderstand 414, 415 Abschaltmöglichkeit 154 Abschaltung 139 Abschirmung 397 Abschluss 280, 391, 393, 406, 407 Absolute Adressierung 58 Absolute Adressierung (Absolute Mode) 58 Abtastfrequenz 399, 400 Abwärtszählung 211 ACLK 17, 119, 121, 122, 123, 124, 125, 139, 140, 147, 149, 150, 155, 166, 184, 185, 188, 194, 204, 206, 229, 295, 331, 337, 338, 339, 343, 344, 348, 349, 354, 355, 356, 365, 384, 387, 411 ACLK/2 140 ACLK/4 140 ACLK/8 140 ACLK-Frequenz 125, 145, 384, 385 ACLK-Zyklus 141 Acrobat Reader 249 Active Mode 28, 31, 33, 39, 119, 120, 121, 122, 129, 130, 188, 336, 339, 370, 371, 387, 410, 411, 413 ADC 17, 20, 25, 66, 69, 71, 117, 155, 157, 158, 162, 164, 168, 169, 170,
172, 173, 175, 177, 236, 241, 250, 273, 310, 358, 365, 370, 375, 376, 381, 398, 399, 400, 401, 403, 410, 411, 412 ADC Memory 157, 158, 168, 170, 173 ADC Memory Control Byte 157, 158 ADC Memory Register 157, 158 ADC12 17, 25, 41, 58, 121, 122, 153, 154, 156, 157, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 215, 236, 241, 250, 252, 287, 293, 325, 329, 333, 358, 365, 366, 375, 376, 379, 388, 395, 398, 400, 403, 410, 412, 415, 416 ADC12 Control Register 0 156 ADC12 Control Register 1 157 ADC12CTL0 156, 159, 164, 166, 169, 170, 171, 172, 175, 176, 365, 366, 412 ADC12CTL1 156, 157, 168, 169, 172, 175, 365 ADC12-Hardware 153, 160 ADC12IV 161, 162, 176 ADC12MEMx 157, 162, 168, 170, 173, 273 ADC12-Resultat 273, 329, 402, 403 Addition 20, 39, 82, 110, 111, 112, 231, 235, 236, 237, 243, 274, 276, 385, 400 Adressbit 185 Adressierungsart 44, 46, 47, 54, 56, 58, 61, 76, 78, 105, 131, 238 Adressierungsmöglichkeit 29, 136, 137 Adressraum 24, 34, 41, 42, 48, 50, 54, 117, 118, 132 Adressvergleich 390 AGND 17 Akkumulator 252, 253
424
Kapitel 15: Stichwortverzeichnis
Aktivität 66, 231, 339, 340 Algorithmus 236, 268, 270, 383, 390 Amplitude 30 Analog-Digital-Wandler 153, 168, 241, 244, 251, 259, 287, 296, 325, 333, 379, 387, 394, 395, 409 Analog-Digital-Wandlereingang 178 Analogeingang 156, 157, 168, 169, 170, 171, 259, 329 Anschwingzeit 391 Anzeige 182, 190, 263, 299, 313, 315 Applikation 156, 283, 291, 316 Arbeitsaufteilung 226 Arbeitsdefinition 241, 242 Arbeitsfrequenz 143, 148, 242, 378, 414 Arbeitsgeschwindigkeit 143 Arbeitsregister 17, 18, 20, 25, 29, 31, 36, 37, 40, 41, 42, 43, 44, 46, 47, 48, 50, 53, 54, 56, 58, 60, 61, 63, 75, 76, 77, 78, 79, 82, 86, 87, 102, 103, 113, 114, 115, 132, 135, 136, 137, 168, 232, 234, 264, 270, 273, 276, 277, 278, 281, 282, 283, 284, 310, 311, 313, 314, 319, 337, 380, 381, 389, 412 Arbeitszyklen 45 Architektur 21, 24, 132, 134, 276 Arithmetik 113 ASCII-orientiert 247 ASCII-Zeichen 245 Assembler 5, 40, 54, 56, 58, 65, 104, 105, 249, 250, 281, 284, 286, 288, 290, 306, 307, 318, 321, 324, 327, 332, 347, 419, 420, 421 Assemblerfunktion 284, 285, 286, 287 Assemblerprogramm 266 Assemblerprogrammierer 379 Assemblerprogrammierung 133, 310 Assemblerroutine 282, 283 Assembler-Software 281, 312, 347 Assemblersprache 24, 134, 281, 283, 284, 289, 310, 323 Aufladezeit 252 Auflösung 163, 165, 177, 205, 273, 276, 292, 293, 297, 298, 394, 399, 400, 402
Aufsummierung 233, 236, 237, 252, 270, 398, 399, 400 Aufwachen 33, 123, 124, 125, 129, 143, 378, 384, 410, 412 Aufwärtszählen 218 Ausführungszeit 126, 133 Ausgang 140, 176, 178, 179, 180, 181, 182, 197, 202, 220, 221, 227, 255, 310, 334, 340, 390, 391, 397, 407, 415 Ausgangsfilter 198, 336 Ausgangsfrequenz 31, 140, 141, 145, 149, 330, 389 Ausgangsimpedanz 182, 391 Ausgangspuls 164 Ausgangsregister 178, 181 Ausgangsspannung 161, 255, 260, 261, 292 Autoinkrement 43, 50 Auxiliary Clock ACLK 140 AVcc/2 156, 160, 161
B Background 19, 238, 239, 243, 323, 381, 382, 385 Background-Programm 193, 320, 382, 385 Back-up-Batterie 30 Bandbreite 379 Basic Timer1 25, 28, 34, 121, 122, 123, 124, 125, 129, 131, 193, 194, 195, 230, 253, 295, 321, 329, 330, 335, 336, 343, 344, 350, 354, 355, 370, 376, 384, 405, 409, 412 Basic Timer1 Control Register 193 Batterie 21, 22, 23, 118, 143, 242, 251, 252, 387, 388, 394, 410, 411, 413, 416, 417 Batterielebensdauer 21, 276, 417 Batterie-Management 252, 253 Batteriespannung 252, 401 Battery Check 345 Baudrate 183, 187, 324, 337, 338, 348, 349 Baudraten-Generator 184
15.1 Die Quellen für MSP430-Information Bauelement 242 BCD 17, 83, 84, 277, 279, 329, 358, 366 BCD-Buffer 279 BCD-Format 274, 278, 329, 335 BCD-Zahl 277, 279 Befehl 26, 36, 38, 39, 42, 43, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 62, 64, 65, 67, 68, 75, 77, 78, 84, 88, 92, 93, 94, 95, 96, 97, 98, 100, 103, 113, 123, 124, 125, 127, 128, 129, 130, 132, 134, 135, 136, 143, 238, 248, 264, 284, 302, 312, 313, 318, 319, 320, 331, 344, 377, 379, 384, 385, 386, 390 Befehlsausführung 39, 43, 44, 104, 105, 106 Befehlsausführungszeit 34 Befehlsfolge 26 Befehlsformat 60 Befehlssatz 17, 18, 39, 65, 67, 377 Befehlswort 43, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 137, 318 Begriff 131 Beispielprogramm 341 Berechnung 91, 97, 98, 136, 148, 149, 150, 165, 167, 261, 278, 279, 383, 398, 404, 412, 416 Bestückungskosten 242 Betriebsart 18, 119, 120, 121, 122, 123, 125, 143, 205, 206, 210, 211, 212, 411 Bezugspotential 393, 394, 395 Binary Coded 17 Bit 17, 18, 19, 20, 22, 27, 34, 39, 41, 43, 47, 48, 49, 50, 51, 52, 53, 56, 58, 60, 61, 62, 64, 65, 66, 68, 75, 81, 94, 95, 96, 104, 105, 106, 107, 108, 110, 112, 113, 114, 129, 134, 135, 136, 145, 146, 156, 159, 164, 165, 173, 178, 182, 184, 186, 187, 190, 196, 197, 198, 202, 206, 209, 215, 216, 218, 219, 223, 225, 229, 233, 237, 238, 245, 269, 270, 271, 272, 273, 274, 275, 296, 314, 320, 336, 337, 340, 350, 390, 397, 401, 402, 412
425
Bitlänge 185 Bitverarbeitung 39 Blindleistung 297 Blink Bit 190 Block 86, 87, 207, 209, 213, 214, 218, 223, 310, 350, 372, 373, 374, 377, 378, 386 Blockierung 385 Blockschaltbild 33, 189, 327, 328 Breakpoint 312, 313, 319, 320 Brownout 34, 337 Brownout-Erkennung 200, 202, 203, 337 Brumm 387, 391, 397 Brummspannung 255, 258, 404 Byte 18, 20, 32, 34, 37, 38, 40, 41, 42, 46, 47, 48, 50, 55, 59, 62, 63, 69, 70, 72, 73, 74, 75, 82, 83, 84, 85, 86, 91, 94, 95, 97, 98, 99, 100, 101, 102, 105, 106, 107, 112, 113, 114, 116, 117, 126, 135, 136, 152, 157, 191, 194, 195, 213, 232, 234, 265, 276, 311, 318, 319, 320, 332, 334, 348, 361, 362, 371, 378, 380, 381 Byte String 318, 378 Byte-Adressierung 40, 48, 49, 51, 52, 53, 55, 56, 57, 59, 94, 265 Byte-Bereich 41, 245 Bytes 19, 20, 37, 38, 41, 42, 45, 48, 50, 51, 54, 63, 64, 71, 72, 83, 86, 96, 99, 101, 108, 113, 114, 115, 118, 126, 130, 136, 150, 151, 152, 153, 166, 190, 195, 263, 265, 276, 278, 311, 314, 318, 330, 332, 333, 339, 368, 379, 380, 381 Byte-Verarbeitung 32, 47 Byte-Version 68
C C = .not. Z 39, 72, 75, 92, 114, 117, 135 C Code 133 C Library Function 286 Capture Compare Register 165 Capture Latch 221, 223, 224, 225, 226, 227
426
Kapitel 15: Stichwortverzeichnis
Capture Mode 209, 210, 213, 218, 223, 340, 405 Capture Register 208 Capture/Compare Block 205, 207, 209, 213, 216, 218, 221, 223, 224, 372, 373 Capture/Compare Control Register 209, 210, 226 Capture/Compare Register 165, 203, 207, 208, 211, 212, 213, 215, 216, 217, 221, 223, 224, 225, 226, 227, 309 Capture/Compare Register Block 207, 208 Capture/Compare-Register 34 Carry 20, 39, 47, 48, 49, 50, 51, 52, 53, 55, 56, 57, 58, 59, 60, 61, 62, 63, 65, 66, 67, 68, 69, 70, 71, 72, 75, 80, 82, 83, 84, 85, 92, 97, 98, 104, 105, 106, 107, 108, 109, 110, 112, 113, 134, 233, 234, 236, 238, 335, 351, 352, 370, 377, 401 Carry Bit 20, 39, 66, 68, 69, 71, 72, 75, 80, 83, 92, 97, 109, 134, 335 Carry-Info 66, 108, 112 C-Compiler 133, 281, 321, 420 CD-Laufwerk 279, 304 Central Processing Unit 17 C-Funktion 286, 287 Charakteristik 167, 399 Chip 20, 183, 226, 323, 327 Chipfläche 21, 133 Circular Buffer 400 CISC 17 CISC-Konzept 29, 137 Clock 17, 18, 31, 140, 143, 147, 174, 205, 206, 210, 211, 216, 218, 331, 338, 340, 342, 406, 407 Clock-Frequenz 184, 185, 229, 337, 338 Clock-Phase 186 Clock-Polarität 186 Clock-Signal 187, 391 Common 188, 190, 191, 192, 334, 349, 360, 363, 388 Common/Select 188, 190, 191 Common/Select-Konfiguration 191
Comparator_A 26, 34, 121, 122, 129, 195, 196, 197, 198, 199, 200, 241, 244, 330, 336, 357, 375, 376 Comparator_A Control Register 197 Compare Mode 172, 208, 209, 210, 213, 214, 216, 217, 223 Compare Register 203, 207, 208 Compiler 133, 281 Complex Instruction 17, 133 Complex Instruction Set Computer 17, 133 Conditional Jump 64, 380 Constant Generator 36, 38, 40, 56, 65, 91, 127, 139 Continuous Averaging 398, 399 Continuous Mode 58, 74, 170, 174, 206, 208, 209, 211, 212, 213, 215, 226, 340, 345, 356, 385, 386, 390 Control Register 143, 147, 156, 157, 166, 168, 184, 186, 197, 203, 209, 216, 217, 218, 229, 384 Control Word 343 Conversion Memory 157, 158, 162 Conversion Memory Register 158 Conversion Mode 157, 168, 169 Conversion Modes 157 Converter-Diode 261 Corrective Scan Principle 291, 292, 293, 294 Cosinus 277 Cotangens 277 Count Mode 205 Counter Length 225 C-Programm 266, 283, 284 CPU 17, 18, 21, 23, 25, 26, 31, 35, 36, 38, 39, 43, 44, 56, 60, 103, 119, 120, 121, 122, 123, 124, 125, 126, 129, 130, 139, 140, 143, 147, 154, 164, 194, 208, 211, 213, 215, 217, 231, 234, 241, 242, 243, 251, 278, 313, 318, 330, 344, 379, 386, 409, 410 CPUoff 39, 124, 129, 336, 339, 361 C-SPY Debugger 317 CSPY-Test 249
15.1 Die Quellen für MSP430-Information
D Das erste Programm 122, 248, 302, 306, 307, 308, 309, 316 Dateiname 249, 309, 316 Daten 17, 18, 34, 53, 102, 150, 151, 152, 262, 263, 276, 282, 318, 319, 333, 380, 381, 390 Datenlänge 183, 186, 187 Datenspeicher 18, 34, 242, 246 Datenübertragung 338, 339 Datum 195, 226, 330, 335 DCO 17, 31, 140, 141, 142, 144, 145, 146, 148, 149, 150, 244, 331, 363, 364, 365, 378, 379, 384 DCO-Ausgangsfrequenz 141, 142, 144, 145, 146 DCO-Frequenz 141, 143, 149, 378 DCO-Stromquelle 144 Definition 149, 172, 175, 225, 269, 284, 320, 331, 332, 342, 348, 349, 350 Definitionsdatei 248 Dekodierung 155, 287, 340, 342 Demo-Programm 325, 329 Denormalized 274, 276 Destination 17, 19, 42, 48, 54, 60, 61, 62, 63, 66, 75, 77, 78, 82, 305 Destination-Index 52, 54 Destination-Operand 48, 49, 50, 51, 54, 57, 58, 59, 61, 63, 66, 71, 73, 74, 82, 83, 84, 85, 87, 89, 90, 91, 92, 104, 105, 106, 107, 109, 111, 112, 115, 116 dezimal 19, 61, 62, 83, 84, 311 Dezimalpunkt 191, 277, 329 Dezimalzahl 83, 84, 85 Dialogfeld 279, 303, 304, 305, 306, 316 Differenzmessung 404 Digital Signal Processor 17 Digitally Controlled Oscillator 17, 31, 140, 141 Digital-to-Analog Converter 345 Diode 161, 259 Divider 204, 205, 206, 212 Division 106, 107, 149, 169, 174, 243, 274, 277, 346, 348, 352, 401, 402
427
Double Operand Instruction 60 Dreileiterbetrieb 187 Dreiphasen-Elektrizitätszähler 291, 293 DSP 17 dst 17, 44, 61, 62, 63, 64, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 80, 82, 83, 84, 85, 86, 87, 89, 90, 91, 99, 100, 101, 104, 105, 106, 107, 108, 111, 112, 113, 114, 115, 116, 129, 238, 377 DTMF 203
E Echtzeit-Fähigkeit 30, 31, 383 Echtzeituhr 123 Echtzeit-Verarbeitung 383 Editieren 313 Editor 247, 249, 280, 326 EEPROM 246, 391 EEPROM-Clock 387 Effektivwert 297 Ein- und Ausgabe 120, 136, 160, 178, 179, 180, 181, 182, 190, 226, 333, 334 Ein- und Ausgabeport 160, 178, 179, 180, 181, 182, 190, 333, 334 Ein- und Ausgang 18 Eingabe-Register 381 Eingang 106, 156, 157, 161, 169, 178, 179, 180, 181, 182, 198, 199, 210, 213, 214, 250, 255, 294, 330, 333, 334, 336, 340, 387, 391, 394, 407, 414, 415 Eingangsbuffer 198, 199 Eingangsfrequenz 140, 145, 212, 330, 335 Eingangsmultiplexer 155 Eingangs-Port 415 Eingangsregister 178 Eingangsschalter 198 Eingangsschaltung 163 Eingangsspannung 155, 163, 164, 165, 166, 244, 273, 329, 387 Eingangsstrom 198 Eingangsstufe 387 Eingangsumschalter 196, 198
428
Kapitel 15: Stichwortverzeichnis
Eingangsuntersetzung 165, 166 Einschwingzeit 30, 378 electromagnetic compatibility 393 Elektrizitätszähler 30, 118, 256, 291, 292, 299 Embedded Workbench 248, 249, 301, 303, 305, 306, 311, 316, 421 Empfang 186, 295, 338, 339 empfangen 339, 395, 396 Emulation 36, 65, 68, 69, 75, 76, 77, 80, 81, 83, 85, 86, 88, 89, 90, 91, 100, 101, 102, 104, 105, 108, 109, 110, 111, 115, 220, 227, 304, 307, 320, 419 Energie 261, 293, 294, 404 Energiemessung 292 Entladung 252, 253, 255, 256, 262 Entwicklung 5, 132, 134, 250, 263, 310, 323, 347 Entwicklungswerkzeug 301, 311 Entwicklungszeit 134, 248 Ereignis 20 Ereigniszähler 330 Erfassungsbedingung 209, 210 Erfassungs-Kondensator 164 Erfassungsmethode 164 Erfassungssignal 165, 169, 174 Erfassungszeit 163, 164, 165, 166, 167, 174 Erwärmung 30, 118 Even 349 Exponent 19, 276 Exponentialfunktion 277 Extended Sample Mode 164 external 283, 289, 363 externen Eingangs 196
F Fehler 31, 32, 110, 141, 149, 150, 151, 185, 249, 273, 275, 280, 313, 317, 318, 319, 320, 327, 346, 379, 380, 383, 385, 386, 388, 389, 391 Fehleranzeige 278 Fehlerbit 386 Fehlermeldung 318, 321, 378
Fehlverhalten 389 Feld 68, 279, 280, 303, 306, 307, 311, 313, 314, 316 Fenster 305, 307, 311, 312, 313, 314, 315, 317 FET-Modul 249, 250, 307, 311, 315, 316 Flag 197, 202, 206, 209, 210, 290, 331, 334, 343, 372, 373 Flanke 169, 176, 197, 198, 205, 210, 214, 229, 309, 334, 340 Flanken 149, 210, 214, 309, 310, 333, 412 FLASH 17, 314 Flash Control Register 203 Flash Memory 151, 152, 333 Flash-Programmspeicher 34 FLASH-Speicher 150 Flexibilität 25, 27 Flip-Flop 21, 22 FLL 31, 129, 130, 139, 140, 141, 142, 143, 145, 146, 147, 148, 149, 150, 309, 320, 321, 330, 331, 348, 354, 363, 365, 378, 384, 385, 387, 419 FLL+ 31, 129, 130, 139, 140, 141, 142, 143, 145, 146, 147, 148, 149, 150, 309, 320, 321, 330, 331, 348, 354, 363, 365, 378, 384, 385, 387, 419 FLL+ System Clock Generator 139, 140, 141, 143, 149, 150, 331 FLL+ Tap 142 FLL+CTL0 Control Register 145 Floating Point 19, 281, 346, 375 Flussdiagramm 246, 247 Flüssigkristallanzeige 182, 191, 334, 409, 411, 414 Flüssigkristallanzeigen-Treiber 188, 334, 335 FN_x 141, 144, 146, 148, 331, 364, 384 Foreground 19, 323, 381 Format 262, 274, 276, 314, 347 Formel 145, 161, 268, 398, 410, 411 Fraktionsteil 277 Frequenzerzeugung 215, 340 Frequenzfehler 149 Frequenzgenauigkeit 378
15.1 Die Quellen für MSP430-Information Frequenzschwankung (Jitter) 142, 330 Frequenzverhalten 399 Funktion 21, 67, 73, 117, 133, 144, 145, 146, 147, 156, 178, 179, 181, 182, 186, 189, 190, 193, 196, 198, 202, 203, 206, 210, 225, 226, 229, 230, 231, 232, 286, 302, 325, 337, 343, 384, 387
G Gaszähler 291, 294, 295, 296 Gehäuse 242, 387, 393, 394, 413 Genauigkeit 21, 22, 166, 167, 266, 278, 294, 387, 397 Genauigkeitsanforderungen 243 Gesamtadressraum 41 Gesamtchip 133 Gesamtfehler 150 Geschwindigkeit 135, 139, 242, 243, 264, 268, 281 Geschwindigkeitsverbesserung 239 GIE 27, 39, 88, 89, 122, 123, 124, 125, 129, 172, 176, 210, 213, 216, 218, 344, 361, 381, 382 GIE-Bit 26, 27, 88, 129, 383, 385, 390 Glasfiberkabel 261, 262 Glas-Fiber-Leitungen 251 Gleichrichterdiode 255 Gleitkomma 19 Gleitkommaformat 277 Gleitkommapaket 29, 234, 238, 239, 243, 274, 276, 316, 326, 327, 329, 346, 421 Gleitkommazahl 275, 276, 277, 278 ground planes 393 Ground planes 393 Gruppe 224, 225 Gruppierung 224, 225 Guard Bits 278 Güte 378
H Halbwelle 254 Halbwellen-Gleichrichtung 254, 255 Hardware 33, 133, 163, 195, 196, 199,
429
219, 220, 227, 230, 231, 239, 241, 249, 250, 251, 301, 328, 334, 343, 344, 351, 389, 391 Hardware Multiplier 239, 343, 344, 351 Harvard-Architektur 24 Hauptprogramm 89, 191, 214, 215, 238, 246, 248, 263, 323, 324, 325, 399 Hauptschleife 19, 96, 169, 172, 176, 309, 310, 331, 333, 334, 335, 336, 337, 338, 339, 340, 342, 343, 344 Hauptspeicherplatte 248, 249 Heizkostenverteiler 21, 291, 413 Herstellungskosten 23 Hochfrequenzmodulation 203 Hochsprachenprogrammierung 133 housekeeping 38, 390 Housekeeping 19, 319
I I/O 18, 29, 121, 122, 125, 179, 181, 183, 284, 286, 291, 311, 328, 334, 341, 356, 384, 385, 407 I/O-Pin 179, 181, 284, 291 I/O-Pins 179, 181, 291 I/O-Port 121, 122, 125, 179, 286, 328, 334, 341, 384, 385, 407 I/O-Ports 121, 122, 125, 328, 341, 384, 385, 407 I2C Bus 346 I2C Bus Connection 346 IAR 220, 227, 248, 249, 280, 281, 303, 304, 305, 306, 311, 316, 346, 347, 348, 375 IAR-Assembler 206, 209, 224, 249, 318 IAR-Entwicklungssystem 247, 248, 249 IAR-Software 249, 302, 324, 421 IEEE-Format 274, 276 IEEE-Richtlinien 274 Immediate Mode 40, 43, 45, 47, 53, 56, 57, 58, 76, 78, 104, 106, 107, 137 Impedanz 163, 165, 256, 394 Independent Code 18 Index 36, 38, 43, 45, 48, 52, 54, 56, 77, 79, 380
430
Kapitel 15: Stichwortverzeichnis
Indexed Mode 38, 43, 46, 48, 50, 52, 53, 54, 58, 77, 78, 79, 129, 137 Index-Register 36 Index-Wort 54 Indirect Autoincrement Mode 38, 43, 45, 46, 50, 51, 53, 56, 76, 78, 79, 137, 234, 383 Indirect Mode 38, 43, 45, 46, 48, 49, 50, 76, 78, 79, 234 indirekt 36, 48, 66, 76, 77, 78, 79, 238, 319 Indizierte Adressierung 43, 52 Indizierung 44 Induktivität 394 Infinity 274, 276 Information 25, 31, 32, 34, 39, 41, 52, 54, 55, 58, 60, 75, 106, 107, 111, 130, 135, 139, 143, 150, 151, 152, 153, 161, 177, 178, 182, 183, 188, 193, 195, 200, 203, 206, 210, 211, 220, 227, 230, 232, 233, 238, 239, 242, 243, 245, 250, 254, 262, 274, 278, 281, 296, 305, 314, 325, 329, 330, 331, 332, 333, 334, 335, 339, 353, 358, 359, 378, 381, 384, 386, 393, 421 Information Memory 34, 41, 52, 54, 55, 151, 152, 242, 245, 329, 330, 332, 333, 353, 358, 359, 378, 386 Initialisierung 89, 160, 169, 172, 175, 176, 183, 187, 188, 190, 194, 214, 220, 246, 248, 263, 269, 309, 318, 323, 324, 325, 331, 332, 333, 334, 335, 336, 337, 338, 340, 342, 343, 344, 378, 384, 389 Initialisierungsroutine 320, 378, 384 Initialisierungsteil 308, 324 Innenwiderstand 163, 251, 252, 387, 394 Input 18, 204, 205, 206, 210, 212, 354 Installation 248, 249, 279, 302, 304, 305, 310, 316 Instruction 18 Integer-Rechenroutinen 239, 265, 299 Interface 18, 64, 183, 186, 188, 294, 301, 302, 338, 339
Interface Board 301, 302 Internet Browser 279, 304, 305 Interrupt 20, 25, 26, 27, 28, 34, 37, 39, 46, 63, 87, 88, 89, 101, 102, 103, 123, 124, 126, 128, 129, 130, 131, 137, 143, 154, 155, 161, 162, 168, 172, 173, 175, 176, 177, 178, 179, 180, 181, 187, 194, 197, 198, 204, 205, 206, 207, 208, 209, 210, 213, 214, 216, 218, 223, 224, 225, 229, 238, 243, 283, 289, 290, 295, 309, 310, 319, 324, 325, 326, 330, 331, 333, 334, 335, 338, 339, 340, 342, 356, 357, 370, 371, 372, 373, 374, 375, 379, 381, 382, 383, 385, 386, 390, 391, 412 Interrupt Edge Select 198 Interrupt Enable Bit 39, 129, 181, 206, 210, 213 Interrupt Flag Register 379 Interrupt Latency Time 129 Interrupt Nesting 26, 130 Interrupt Vector Register 161, 162, 204, 223 Interrupt-Aufruf 283 Interrupt-Ausführungszeit 128 Interrupt-Fähigkeit 178, 180, 244 Interrupt-Flag 129, 207 Interrupt-Frequenz 194, 335 Interrupt-Latenzzeit 208, 238 Interrupt-Möglichkeit 34, 385, 412 Interrupt-Priorität 29 Interrupt-Routine 20, 25, 26, 27, 28, 31, 46, 103, 123, 124, 125, 128, 129, 130, 131, 137, 143, 172, 176, 178, 195, 207, 208, 223, 238, 243, 283, 284, 287, 288, 289, 309, 310, 330, 331, 333, 334, 336, 338, 339, 340, 342, 343, 381, 382, 383, 384, 385, 390 Interrupt-Software 19 Interrupt-Struktur 21, 25 Interrupt-Vektor 37, 207, 284, 315, 320, 326, 331 Interrupt-Verschachtelung 25, 130
15.1 Die Quellen für MSP430-Information INTVEC-Segment 284 Isolation 254, 256
J JTAG-Interface 406 Jump 65, 92, 93, 94, 95, 96, 97, 98, 116, 289, 372, 373, 377, 390
K Kabel 301, 302, 397 Kalender 193, 335, 336 Kapazität 147, 148, 160, 163, 388 Keramikschwinger 378 Kombination 131, 188, 197, 231, 244, 294, 401 Kommentar 156, 158, 159, 179, 181, 226, 239, 308, 326, 377, 401, 406, 407 Kommentarlänge 346 Kondensator 30, 163, 251, 252, 256, 257, 261, 387, 394, 409 Kondensatornetzteil 256, 258, 259 Konstante 36, 38, 40, 43, 53, 56, 65, 91, 111, 179, 181, 268, 402 Kontakt 414 Kontrast 388 Kontrollkästchen 305, 307 Konzept 21, 29, 30, 31, 136, 143 kopieren 37, 88, 91, 99, 117, 250, 381, 383 Korrektur 94, 95, 167, 177, 185, 398 Korrelation 268 Kreisfrequenz 257 Kubikwurzel 277 Kurzschluss 296, 297 Kurzzeit-Genauigkeit 149
L Ladekondensator 254, 255, 258, 262 Ladetransistor 253 Ladezustand 253 Ladungsende 253, 262 Ladungskontrolle 253 Lagerhaltung 242
431
Last 255, 256, 297 Lastkapazität 147, 148, 320, 331 Latch-up 388, 389 LCD 18, 41, 188, 189, 190, 191, 321, 334, 335, 349, 350, 355, 356, 358, 366, 367, 384, 388, 393, 407, 411, 414, 417 LCD Control Register 189, 190 LCD Memory 190, 191 LCD-Anzeige 191, 253, 278, 325, 329 LCD-Arbeitsfrequenz 321, 384 LCDCTL 189, 190, 334, 356 LCD-Hardware 188, 191 LCD-Konfiguration 191 LCD-Treiber 22, 23, 34, 190, 334 leading zero suppression 329 Lebensdauer 143, 251, 387, 416, 417 Lebenszeit 242 Leistung 242, 260, 261, 299 Leistungsaufnahme 33 Leistungseffizienz 254 Leiterplatte 391 Leitungsführung 393, 395, 396 Lesbarkeit 133, 135, 324, 377 Lesen 36, 56, 78, 296, 313, 314, 340, 346, 381, 382, 383 Les-und Schreibbarkeit 32 LFXT1 Oscillator 139, 140, 146, 147 Linear Congruential Method 268 Linker 249, 306, 307, 321, 378, 379, 420, 421 Linksschieben 66, 67, 106 Listing 249, 312, 318 LOAD 29, 136, 137 Low Power Bits 336, 339 Low Power Mode 25, 27, 30, 31, 33, 39, 119, 121, 122, 123, 125, 128, 129, 130, 139, 140, 143, 150, 193, 202, 263, 295, 309, 310, 329, 344, 387, 410, 411 Low Power Mode 0 119, 121, 122, 309, 310 Low Power Mode 3 27, 31, 33, 119, 122, 123, 140, 143, 295, 410, 411
432
Kapitel 15: Stichwortverzeichnis
Low Power Mode 4 33, 119, 125, 387 LPM0 119, 121, 122, 310, 329, 330, 337, 344, 347, 360, 361 LPM3 27, 31, 34, 119, 122, 123, 124, 125, 129, 139, 143, 148, 184, 188, 194, 202, 251, 252, 253, 329, 330, 344, 347, 359, 360, 361, 378, 384, 409, 411, 412, 413, 414 LPM4 119, 125, 126, 378, 411 LSB 18, 36, 38, 75, 104, 105, 106, 107, 108, 135, 163, 164, 165, 166, 185, 209, 265, 266, 267, 268, 271, 381
M MAC 231, 233, 235, 237, 238, 239, 351, 352 MAC-Funktion 34, 232, 344 Macro 184, 185, 188, 325, 337, 338, 351, 352 Main Clock MCLK 140, 147 Majoritätstest 199 Mantisse 19, 275, 276, 278 MARK-Information 262 Maskentypen 415 Masseflächen 394 Master 186, 187, 338, 355 Master Mode 187, 338 Maus 311, 312, 314 M-Bus 251 M-BUS 296 MCLK 18, 121, 122, 125, 140, 142, 146, 149, 155, 166, 169, 174, 175, 188, 194, 267, 330, 348, 354, 364, 365, 368, 378 MCLK-Frequenz 34, 140, 143, 148, 200, 243, 245, 384 MCLK-Zyklen 20, 31, 33, 100, 103, 121, 124, 126, 127, 128, 129, 135, 136, 143, 162, 164, 174, 243, 265, 266, 269, 272, 273, 381, 382, 384, 391, 412 Memory-to-Memory-Architektur 34 Messfehler 167, 397 Messresultat 398, 399, 401
Messsequenz 157, 170, 172, 175, 198, 291, 292, 294, 412 Messung 154, 156, 157, 158, 160, 161, 165, 167, 169, 170, 172, 173, 198, 202, 251, 292, 297, 298, 329, 333, 336, 397, 400, 401, 405, 406, 412 Messzeit 167, 252, 401, 416 Metallgehäuse 387, 394 Metallisierung 393, 394 Mikrocomputer 21, 22, 134 Mikrocontroller 132 Mikrocontroller-Architekturen 36, 53 Mindestspannung 203, 387 Mindestspeisespannung 387 Minimierung der Stromaufnahme 411 Minuszeichen 191 MIPS/W 413 Mittelspannung 259, 292 Mittelung 398, 399, 401 Mittelwert 170, 171, 173, 398, 401, 402, 414 Modul 25, 26, 158, 327, 337, 376 Modulation 141, 142, 144, 145, 149, 325, 337, 338, 352, 355 Modulation Register 325, 337, 338, 352, 355 Modulations-Steuerbit 145 Modulator 184, 185 Modulator-Register 184 Modulausgang 182 Moduleingang 182 Modulus 268 Modus 146, 157 MSB 18, 39, 47, 48, 49, 50, 51, 52, 53, 55, 56, 57, 58, 59, 60, 68, 69, 70, 71, 72, 75, 82, 83, 84, 85, 86, 87, 89, 90, 91, 104, 105, 106, 107, 108, 109, 112, 113, 114, 115, 117, 195, 265, 266, 267, 268, 276, 366, 380, 381, 383 MSP430 CD-ROM 301 MSP430-Arbeitsregister 36 MSP430C3xx-Familie 149, 221, 227, 341, 384, 385
15.1 Die Quellen für MSP430-Information MSP430-CD 249, 279, 304, 306, 316, 317, 321, 346, 347, 419, 420, 421 MSP430-CPU 24, 28, 29, 40, 241, 272 MSP430F449 Quick Start Software 141, 148, 151, 173, 183, 184, 187, 191, 192, 194, 195, 202, 215, 230, 237, 247, 263, 280, 302, 316, 320, 323, 327, 328, 329, 378 MSP430F4xx-Familie 119, 188, 221, 323, 345 MSP430-Familie 22, 24, 26, 30, 35, 42, 43, 60, 118, 152, 228, 274, 301, 305, 409, 420 MSP430-Interrupt-Struktur 25 MSP430-Konzept 21, 25, 30 MSP430-System 241, 251, 253, 260, 393, 411 MSP430-Typ 118, 242, 332 MSP430-Zentraleinheit 17, 36 Multiplexmethode 191 Multiplikand 268, 271, 272 Multiplikation 34, 104, 231, 232, 234, 235, 236, 237, 238, 239, 270, 271, 272, 274, 275, 276, 278, 292, 344, 346, 412 Multiplikation mit Vorzeichen 235, 270 Multiplikation ohne Vorzeichen 234, 235, 270, 271 Multiplikation und Addition ohne Vorzeichen 236 Multiplikationsfaktor 145, 378, 384 Multiplizierer 230, 238, 239, 241, 243 Multiply and Accumulate 270 Multiply-and-Accumulate 231, 351
N Näherungsformel 150, 257 Nennspannung 256 Nennwert 245, 260 nested interrupt 385 Netz 251, 254, 256 Netzausfall 151 Netzausfall-Erkennung 345 Netzfrequenz 257, 403, 404, 405
433
Netzperiode 255, 404, 405 Netzspannung 257, 297, 391, 403, 405, 406 Netzspeisung 251 Netzteil 23, 30, 242, 254, 255, 258, 259, 291, 409 NEWTON-Verfahren 265 Nichtanschwingen 321, 387 Nichtlinearität 167, 168 NMI-Interrupt 331 Non-Maskable Interrupt 229 Normalisierung 278 Not a Number 274, 276 NPN-Transistor 261
O ODER-Funktion 19, 73, 74 Offset 58, 64, 92, 93, 94, 95, 96, 97, 98, 272, 273, 279, 309, 310, 329, 353, 398 Offsetkompensation 200, 259 Opamp 259, 261, 262 Operand 19, 20, 36, 47, 48, 50, 56, 62, 63, 64, 101, 135, 232, 238, 276, 277 Operandenlänge 231 Operanden-Register 232, 234, 235, 236 Option 305 Ordner 220, 227, 248, 249, 279, 280, 304, 306, 307, 316, 346 orthogonal 132, 134 Orthogonalität 29, 131, 132, 133, 139 Oscillator 146, 331, 356, 374, 375 OSCoff 39, 129 Oszillator 17, 22, 31, 146, 155, 166, 384, 393, 395 Oszillatorregelschleife 384 Oszilloskop 379 Output Mode 210, 216, 217, 218, 219, 220 Output Unit 164, 165, 170, 174, 176, 182, 203, 207, 208, 210, 214, 215, 216, 217, 218, 219, 221, 227, 243, 341, 372, 385 Overflow 20, 39, 64, 68, 85, 94, 95, 116, 175, 176, 177, 210, 223, 290, 372, 373, 383
434
Kapitel 15: Stichwortverzeichnis
Overflow Bit 20, 39, 64, 68, 94, 95, 116 Overhead 20, 128, 137, 162, 412 Oversampling 398
P Parallelkapazität 321, 385, 386 Parameter 282 Parameterübergabe 282 Parity 183, 185, 338, 339 Passwort 203, 229, 320 Pegel 391 Periodenberechnung 340 Periodenlänge 340 Peripherie 20, 241, 242, 260, 294, 326, 327, 391 Peripherie-Clock 121 Peripherie-Modul 18, 20, 25, 129, 139, 231, 263, 314, 323, 324, 325 Personal Computer 301, 302 Pin 147, 179, 181, 182, 285, 302, 331, 384 Pinbelegung 182 Platine 242, 250 Platinenfläche 393 PNP-Transistor 415 Polling 25 POR/PUC 228 POR-Signal 202, 203, 206 Port 83, 117, 178, 181, 183, 221, 227, 285, 287, 309, 333, 384, 390, 415 Port Select Register 384 Position 18, 19, 106 Potenz 402 Power Fail Detection 345 Preis 133, 242 Priorisierung 25, 28 Priorität 28, 129, 162, 205, 207, 338 Produkt 21, 232, 233 Programmablauf 100, 242, 245, 264, 387 Programmabsturz 27, 390 Programmadresse 46 Programmgeschwindigkeit 264 Programmgruppe 302, 303, 312, 315
Programmierung 24, 32, 45, 148, 149, 178, 263, 310, 399, 402 Programmlänge 46, 132, 134, 412 Programmspeicher 17, 18, 24, 28, 40, 41, 45, 100, 118, 134, 150, 314, 325, 379 Programmspeicheradresse 49, 50, 51 Programmteil 126, 263, 264, 330 Programmtest 317 Programmzeile 133, 309, 312, 318, 324, 326, 332, 377 Projektschritt 241 Protokoll 183 Prüfliste 317 PUBLIC-Label 283 PUC-Signal 206 Pull-up 244, 393 Pulsausgang 218 Pulse Sample Mode 165 Pulslängen-Register 389 Pulsweite 208, 212, 215, 217 Pulsweitenmessung 203 Pulsweiten-Modulation 30, 253 PWM-Länge 342 PWM-Pulslänge 342
Q Quadratwurzel 265, 277, 346 Quadrierung 272, 273, 299 Quarz 30, 143, 146, 147, 244, 302, 321, 331, 378, 379, 386, 387, 393, 394, 406, 407 Quarz-Anschwingzeit 387 Quarzgehäuse 321, 387 Quarzoszillator 150, 379 Quarzqualität 414 Quarzreferenz 141 Quarzspezifikation 320 Quelle 20, 161 Querstrom 415 Quick Start Software 188, 192, 248, 265, 316, 317, 323, 324, 325, 326, 327, 328, 335, 346, 347, 376, 377, 421
15.1 Die Quellen für MSP430-Information
R R/2R-Methode 345 Radians 278 Rahmenprogramm 247, 329 RAM 18, 20, 22, 23, 25, 26, 29, 32, 34, 37, 41, 52, 55, 86, 87, 89, 91, 118, 121, 122, 125, 134, 150, 151, 152, 153, 171, 175, 190, 225, 242, 245, 264, 269, 310, 314, 318, 319, 325, 331, 332, 333, 348, 354, 359, 369, 372, 378, 380 RAM-Byte 53, 55, 56, 58, 80, 85, 87, 99, 100, 101, 117, 265, 318, 343, 379 RAM-Erhaltung 33 RAM-Erweiterung 190, 209, 212 RAM-Wort 46, 52, 55, 80, 86, 87, 97, 98, 102, 108, 117, 332, 340, 401 Rauchmelder 291 Rauschen 379, 387, 391, 397, 398 RC-Glied 244, 391 RC-Tiefpass 163 read only 139, 233 read, modify, write 384 Real Time 383 Real Time Processing 383 Receive/Transmit 18, 183 Rechenalgorithmus 243 Rechengeschwindigkeit 134, 241 Rechenleistung 20, 21, 24, 30, 291, 292, 413 Rechenzeit 266, 272, 399 Rechnerarchitektur 5 Rechtsschieben 63, 107, 402 Reference Module 158 Referenz 31, 145, 155, 158, 169, 171, 174, 175, 198, 202, 244, 258, 261, 379 Referenzdiode 198, 258, 261 Referenzeingang 415 Referenzfrequenz 141 Referenzspannung 34, 156, 157, 158, 159, 161, 175, 196, 198, 200, 202, 329, 333, 415
435
Regelschleife 140, 384 Register 18, 20, 24, 26, 27, 29, 31, 32, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 56, 57, 58, 59, 61, 63, 64, 68, 75, 76, 78, 80, 81, 82, 83, 88, 94, 95, 96, 101, 102, 103, 105, 109, 110, 111, 116, 123, 126, 127, 128, 129, 130, 135, 136, 137, 145, 147, 151, 156, 162, 166, 173, 179, 181, 185, 188, 196, 203, 204, 206, 207, 208, 209, 211, 212, 216, 217, 218, 220, 221, 223, 224, 225, 227, 231, 232, 236, 237, 238, 275, 278, 283, 311, 313, 314, 319, 325, 333, 336, 339, 340, 341, 342, 352, 379, 383, 384, 385, 386, 390, 398, 412 Register Mode 24, 38, 42, 43, 46, 47, 48, 49, 51, 57, 58, 59, 76, 78, 126, 127, 135 Register/Register-Adressierung 24, 29 Register-Überlauf 383 Regler 255 Rejection of Extremes 398 Relais 241, 260 Repeat Sequence 157, 168, 173 Repeat Sequence of Channels Mode 157, 168, 173 Repeat Single 157, 168, 170, 171 Repeat Single Channel Mode 157, 168, 170, 171 Reset 18, 26, 37, 84, 121, 123, 124, 129, 170, 172, 176, 177, 179, 181, 200, 201, 202, 210, 212, 219, 227, 228, 301, 315, 337, 340, 342, 343, 354, 356, 357, 359, 362, 371, 372, 376, 391 Reset/Set 210, 219, 227, 342, 357 Reset/Set Mode 342, 357 RESET-Pin 320 Reset-Vektor 343 RESHI-Register 232 RESLO-Register 232
436
Kapitel 15: Stichwortverzeichnis
Resultat 39, 42, 72, 82, 87, 89, 90, 91, 92, 96, 97, 98, 110, 112, 113, 115, 116, 162, 168, 170, 172, 173, 175, 177, 196, 199, 232, 233, 253, 266, 269, 271, 272, 275, 276, 277, 278, 279, 282, 284, 286, 385, 403 RISC-Architektur 21, 29, 136, 137 RISC-Konzept 29, 136, 137 ROM-Monitor 283 RS232 184 RS232-Protokoll 183 RS232-Schnittstelle 34 RST/NMI 202, 229, 244, 261, 309, 315, 343, 388, 391, 393, 407 RST/NMI-Pin 202, 229, 315, 343 RST/NMI-Signal 391 Rückkehradresse 27, 37, 77, 78, 102, 383 Ruhebetrieb 253 Rundung 273, 278, 401
S Sägezahncharakteristik 389 Sample-and-Hold 34, 154, 163, 170, 171, 174 Sampling Timer 169, 171, 174 SCFI0 Control Register 143 SCFI1 Control Register 144 SCFQCTL Control Register 144 SCFQCTL Register 144, 145 SCG-Bits 39 Schalter 146, 147, 156, 161, 198, 292, 394, 414, 415 Schaltfläche 279, 280, 302, 304, 305, 306, 307, 311, 316 Schaltjahre 335 Schaltkapazität 386 Schaltplan 244 Scheinleistung 292 Schiebebefehl 390 Schieben 113, 390 Schieberegister 186 Schmitt-Trigger 261 Schutzwiderstand 256, 258
Scratch Register 281, 283, 284 Segment 52, 55, 150, 151, 188, 192, 334, 335, 366 Segment/Common-Anordnung 335 Segmentkapazität 192 Sekundärspannung 255, 256 Sekundenzähler 336 Selbstentladestrom 413 Selbstentladung 118, 253, 411, 413 Select 178, 192, 206, 210, 305, 349, 355, 388 Senden 186, 338, 339 Sensor 253, 397, 416 Sequence of Channels Mode 157, 168, 173 Sequenz 54, 56, 58, 142, 144, 157, 167, 173, 174, 268, 293, 299, 306, 384 Serial Peripheral Interface (SPI) 186 Serienkondensator 256, 257 Serienwiderstand 257, 261 Set 18, 73, 109, 110, 111, 210, 212, 219, 352, 358, 370, 372 Set/Reset 210, 219 Shunt 252 Sicherheitscode 229 Sicherheitskopie 254 Sicherung 25, 26, 291, 296, 297, 299 Signal 93, 140, 171, 185, 187, 198, 202, 208, 210, 216, 398 Signal-Eingangsfrequenz 245 Signalflanke 340 Signalleitung 397 Signalrichtung 179, 181, 229 Silizium 133, 230 Simulator 249 Single Channel Mode 157, 169 Single Operand 62 Single Slope 241 Sinus 277 Slave 186, 338 Slave Mode 186 Slope 279, 329, 353, 398
15.1 Die Quellen für MSP430-Information SMCLK 18, 121, 122, 125, 139, 140, 146, 147, 149, 155, 166, 171, 172, 176, 187, 204, 206, 214, 229, 288, 309, 326, 330, 331, 337, 338, 339, 340, 341, 342, 344, 348, 350, 353, 354, 355, 356, 357, 359, 360, 365, 378 Software 19, 32, 36, 38, 125, 126, 134, 173, 191, 196, 199, 212, 213, 216, 218, 223, 224, 227, 233, 239, 246, 247, 248, 249, 263, 272, 273, 275, 279, 281, 301, 304, 305, 306, 320, 323, 324, 325, 331, 339, 343, 345, 346, 347, 358, 361, 379, 380, 384, 387, 389, 397, 419, 421 software underflow 274 Softwarebeispiel 170, 194, 230 Softwareentwicklung 133, 247, 250, 264, 323 Software-Timer 123 Source 18, 20, 24, 44, 46, 48, 50, 54, 60, 61, 71, 75, 82, 84, 91, 126, 131, 133, 148, 149, 238, 280, 306, 307, 311, 312, 315, 316, 317, 346, 377 Source-Index 52, 54 Source-Operand 49, 50, 51, 54, 57, 58, 59, 61, 70, 71, 73, 74, 82, 84, 99, 102, 111, 112, 116 Source-Register 51, 383 Spannung 156, 161, 198, 199, 201, 242, 252, 253, 254, 258, 259, 260, 261, 262, 292, 297, 299, 325, 329, 330, 336, 388, 397, 402, 416 Spannungsabfall 255 Spannungsbereich 155, 405 Spannungsmessung 200, 253, 292, 293, 294, 297 Spannungsquelle 163 Spannungsreferenz 159 Spannungsregler 255, 256, 261 Spannungsspitze 258 Spannungsteiler 156, 161, 244 Spannungsüberwachungs-Modul 201 Spannungsversorgung 160, 251, 260, 262, 388, 395
437
Spannungswert 242, 292 Special Area 282 Special Function Register 41, 117, 314 Speicher 34, 36, 47, 48, 49, 50, 51, 52, 53, 55, 57, 59, 123, 133, 319, 402, 412 Speicherbereich 265, 276, 314 Speicherplatz 47, 134, 281, 283, 337, 338 Speicherplatzbedarf 139 Speicherzugriff 24 Speisespannung 22, 31, 37, 121, 141, 143, 158, 161, 200, 201, 202, 203, 228, 242, 245, 254, 296, 330, 332, 337, 379, 387, 388, 391, 395, 414, 415 Speisespannungsüberwachung 34 Speisungsart 242 Sprung 36, 75, 77, 78, 80, 90, 94, 123, 124, 128, 377, 386 Sprungadresse 76, 77, 79 Sprungbedingung 128 Sprungbefehl 64, 377 src 18, 44, 61, 62, 63, 65, 67, 70, 71, 72, 73, 74, 82, 84, 99, 101, 111, 112, 116, 129, 238, 377 Stabilität 31, 197 Stack 18, 19, 24, 27, 28, 31, 32, 37, 38, 46, 56, 63, 66, 67, 77, 78, 90, 91, 100, 101, 102, 103, 123, 124, 127, 128, 129, 130, 153, 171, 175, 214, 245, 277, 278, 279, 282, 283, 309, 311, 317, 318, 319, 320, 332, 354, 358, 380, 382, 383, 389, 390 Stackbelegung 131 Stack-Bereich 319 Stack-Korrektur 390 Stack-Überlauf 27 Stack-Verarbeitung 31, 382 Standby 33 Stapelzeiger 18 Startadresse 25, 56, 78, 86, 284, 318, 320 Static Workspace 283 Status 18, 20, 26, 27, 28, 31, 36, 37, 38, 39, 40, 42, 43, 44, 56, 58, 60, 61, 62, 63, 64, 66, 68, 69, 70, 71, 72, 73, 74, 75, 76, 78, 80, 81, 82, 83, 85, 86, 87
438
Kapitel 15: Stichwortverzeichnis
Status 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 121, 122, 123, 124, 125, 128, 129, 130, 134, 137, 151, 179, 181, 242, 245, 264, 265, 275, 278, 283, 311, 314, 319, 324, 325, 333, 336, 339, 362, 379, 380, 383, 385, 390 Status-Byte 46, 90, 339 Sternpunkt 394 Steuerlogik 212 Steuerung 169, 171, 174, 189, 197, 201, 205, 211, 224, 242, 243, 291 Stop Mode 206, 211, 218 STORE 29, 136, 137, 360, 382 Störempfindlichkeit 393, 396 Störquellen 395 Störungen 320, 326, 391, 395, 396, 397, 399, 406 Strom in Anschlüsse 388 Stromaufnahme 21, 23, 119, 120, 123, 139, 143, 148, 154, 252, 254, 260, 291, 387, 409, 410, 411, 413, 414, 415 Stromaufnahme-Profil 409, 410 Strombegrenzungswiderstand 388 Strommessung 252, 292, 293, 297 Stromverbrauch 21, 22, 30, 118, 121, 134, 196, 251, 291, 320, 329, 330, 337, 399, 400, 401, 402, 406, 409, 411, 414, 416 Stromversorgung 251, 387, 395 Stromwandler 292 struct 282 struct/union 282 Sub-Main Clock SMCLK 140 Subroutine 77, 78, 79, 80, 81, 84, 91, 101, 102, 105, 110, 111, 141, 143, 149, 151, 173, 191, 230, 239, 265, 268, 269, 270, 272, 319, 331, 333, 335, 363, 365, 367, 368, 369, 390 Subroutinen 19, 20, 31, 32, 37, 38, 195, 246, 248, 263, 277, 280, 317, 319, 323, 324, 325, 335, 338, 346, 380
Subroutinenaufruf 77, 78, 110, 111, 272, 319 Subtraktion 82, 84, 110, 112, 113, 274, 276, 382, 400 Sum Extension 233 SUMEXT-Register 233, 234, 235, 236 Summenfehler 273 Supply Voltage Supervision 337, 357 Supply Voltage Supervisor Control 201 Supply Voltage Supervisor Control Register 201 Supply Voltage Supervisor Modul 201 SVS-Modul 200, 201, 202, 337 Symbolic Mode 24, 43, 46, 53, 54, 55, 56, 77, 78, 79, 137, 319 Symbolische Adressierung 54 symmetrisch 297 Synchronisation 210, 216, 218, 226, 227, 385, 390, 398, 403, 404, 405 synchronisiert 224, 225, 389 Synchronisierung 221, 223, 224, 227 Synchronität 211, 386 System 18, 20, 22, 23, 30, 31, 37, 90, 123, 124, 125, 129, 149, 150, 203, 241, 242, 259, 261, 296, 304, 306, 316, 326, 330, 331, 337, 353, 354, 359, 384, 386, 411, 414, 419 System Clock 18, 30, 31, 125, 129, 149, 150, 326, 330, 331, 384, 386, 419 System Clock Frequency 326 System Clock Generator 31, 125, 129, 149, 150, 330, 331, 384, 386, 419 Systembedingungen 150 Systemfrequenz 31 Systemfunktion 228 System-Gleichspannung 260 Systempreis 242 Systemspeisung 260 Systemspezifikation 241 System-Stack 38, 91 Systemzuverlässigkeit 242
15.1 Die Quellen für MSP430-Information
T Tabelle 40, 44, 45, 47, 48, 49, 50, 51, 52, 53, 55, 56, 57, 58, 59, 76, 77, 79, 93, 121, 122, 125, 144, 145, 146, 147, 156, 157, 158, 159, 166, 179, 181, 182, 189, 190, 194, 198, 202, 203, 206, 210, 218, 219, 224, 225, 226, 229, 234, 235, 236, 237, 239, 272, 273, 282, 317, 332, 334, 401, 406, 407 Tabellenverarbeitung 45, 412 Tabellenzugriff 46 Tangens 277 Target Socket Module 33, 301, 302, 308 Tastatur 215, 314, 316 Tastaturabfrage 226 Taste 83, 295, 306, 316 Temperatur 31, 141, 161, 200, 253, 294 temperaturabhängig 253 Temperaturabweichung 245 Temperaturdifferenz 404 Temperaturdiode 154, 156, 161 Temperaturmessung 253 Test 74, 115, 199, 200, 242, 249, 250, 310, 316, 329, 368, 372, 373, 386, 389 Test-Hardware 249, 250 Test-Modus 249, 250 Tests 100, 313 TI-Format 280 Timer 20, 23, 25, 26, 28, 34, 41, 58, 74, 121, 122, 124, 126, 164, 165, 169, 170, 171, 172, 174, 175, 176, 178, 182, 195, 203, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 243, 244, 253, 287, 289, 290, 295, 298, 309, 310, 328, 329, 330, 336, 339, 340, 341, 342, 343, 345, 348, 350, 356, 357, 372, 373, 374, 376, 381, 384, 385, 386, 389, 390, 400, 405 Timer Block 204, 205, 373 Timer Control Register 205, 206
439
Timer Register 203, 205, 206, 209, 211, 213, 215, 216, 217, 218, 225, 342, 372, 385 Timer Vector Register 205, 207, 372, 373 Timer_A 25, 41, 58, 74, 121, 122, 124, 126, 164, 165, 170, 171, 172, 174, 175, 176, 178, 203, 204, 205, 206, 211, 212, 214, 216, 218, 220, 221, 222, 223, 225, 226, 227, 228, 230, 231, 243, 253, 287, 289, 298, 309, 310, 329, 339, 340, 341, 342, 343, 345, 350, 356, 357, 372, 376, 385, 386, 389, 390, 400, 405 Timer_A Control Register 206 Timer_A3 25, 203, 376 Timer_B 26, 28, 41, 121, 122, 124, 126, 164, 165, 182, 212, 221, 222, 223, 224, 225, 226, 227, 228, 243, 244, 253, 287, 298, 328, 330, 341, 342, 350, 356, 357, 373, 374, 376, 384, 385, 390, 400, 405 Timer_B Control Register 224 Timer_B3 221, 223 Timer_B7 26, 28, 221, 223, 376 Timer-Clock 204, 205 Tipps 321, 377, 378 Toggle 172, 210, 212, 219, 220, 285, 289, 312 Toggle/Reset 210, 219 Toggle/Set 210, 219 Toleranz 164, 166 Transformator 256 Treiber 244, 326 Treiberfähigkeit 391, 415 Treiberleistung 414 TRIAC 345 Triggersignal 173, 174 TSS400 21
U U0RXBUF 102 UART Mode 188, 338, 339, 349 Überlauf 20, 60, 64, 94, 95, 96, 195, 210, 213, 214, 236, 237, 340, 342, 383, 389
440
Kapitel 15: Stichwortverzeichnis
Übernahme 224, 225, 226, 227 Übernahmebedingung 224 Überstrom 296, 297 Übertrag 20, 47, 48, 49, 50, 51, 52, 53, 55, 56, 57, 58, 59, 60, 70, 71, 98, 390 Uhr 193, 335, 336 Uhrenquarz 149, 330 Uhrzeit 195, 330, 333 Umgebungstemperatur 296, 417 Umkehrfunktionen 274 Umwandlung 164, 166, 168, 170, 172, 174, 176 Umwandlungsmodus 157 Umwandlungssequenz 173, 174, 175 Umwandlungszeit 167 UND-Funktion 19, 71, 72, 73, 74 union 282 Unmittelbare Adressierung 56 Untersetzungsfaktor 148, 330 Unterspannung 337 Up Mode 165, 206, 208, 209, 211, 215, 216, 219, 226, 227, 342, 345, 357 Up/Down Mode 206, 208, 209, 211, 217, 218, 219, 226, 227 Update Mode 225, 226 URXBUF0 59 USART 18, 58, 121, 122, 183, 184, 186, 187, 188, 325, 338, 339, 352, 361, 390 USART Module 188, 339 USART0 25, 183, 188, 337, 348, 355, 375, 376 USART1 25, 28, 183, 185, 188, 338, 349, 355, 370, 371, 376
V Variable 234, 265, 274 Vektor 28, 129, 162, 176, 177, 205, 207, 223 Vektorisierung 25, 28 Vektortabelle 25, 26, 28 Vektor-Wort 340, 342 Verarbeitungszeit 325, 412 Verbrauch 118 Verbrauchsmessung 345
Vergleich 92, 93, 94, 95, 96, 97, 98, 151, 196, 210, 222, 239, 274, 277, 336, 337, 414 Verluste 256 Verschachtelung 20, 142 Versorgungsspannung 33, 156, 387 Versorgungsstrom 125 Verzögerungszeit 203 Vierleiterbetrieb 186 Vierleiter-Sensoren 397 Vollweggleichrichtung 256 Von-Neumann-Architektur 24 Vorteilerkonstante 212 Vorwiderstand 256 Vorzeichen 19, 20, 34, 63, 64, 65, 94, 95, 96, 100, 104, 105, 106, 107, 114, 136, 233, 235, 236, 237, 239, 271, 274, 275, 276, 278, 344, 390, 404 vorzeichenbehaftet 94, 95, 105, 107, 272, 380 vorzeichenbehaftete 20, 92, 93, 94, 95, 96, 97, 98, 104, 105, 106, 114, 136, 232, 235, 236, 344, 386, 390 vorzeichenlos 92, 97, 114, 136, 380 vorzeichenrichtig 252
W Wandelzeit 155 Wärmemengenzähler 291 Wartezeit 148, 160 Wasserzähler 21, 118, 291, 345 Watchdog 25, 34, 122, 123, 125, 170, 172, 176, 202, 203, 206, 228, 229, 230, 309, 313, 320, 332, 336, 343, 350, 354, 369, 374, 376 Watchdog Control Register 203, 229 Watchdog Mode 202, 343 Watchdog Timer 34, 228, 230, 343 Watchdog-Funktion 228, 343 Werkzeug 243 Wertigkeit 18 Widerstandsteiler 164, 166 Wiederholungsrate 170, 174, 214 Winkelfehler 292
15.1 Die Quellen für MSP430-Information WORD 247 Workspace 306, 308, 311, 316, 317 worst case 31, 149, 150, 236, 243, 251, 319, 378, 383, 384, 390 Worst Case 20, 243, 244, 245, 250 Wort 32, 36, 37, 38, 40, 41, 43, 45, 48, 52, 54, 56, 64, 66, 67, 68, 72, 73, 74, 76, 77, 78, 79, 80, 83, 84, 85, 86, 91, 96, 99, 100, 103, 115, 117, 127, 130, 136, 137, 151, 245, 265, 273, 318, 332, 381, 383, 400, 403 Wort/Byte-Bereich 41 Wort-Adressierung 40, 55 Wortbefehl 68, 69, 80, 81, 109, 110, 111, 113, 114, 318 Wort-Bereich 41, 245 Wort-Modul 234 Wort-Offset 64 Wortstruktur 204 Wort-Verarbeitung 32 Write-Only 384 Wurzelprogramm 265
X XT2 Oscillator 140, 146, 147
Z Zahl 18, 20, 45, 58, 60, 92, 94, 95, 97, 191, 212, 234, 235, 273, 274, 275, 276, 277, 278 Zahlenbereich 275, 276, 278 Zahlendarstellung 19, 276 Zählrichtung 206, 209, 211, 217, 218 Zählung 209, 211, 335, 381, 382 Zeiger 36, 45, 46, 87, 157, 276, 277, 278, 338, 378, 383, 400
441
Zeilenaufteilung 377 Zeitabschätzung 126 Zeitbasis 21, 31, 121, 122, 193, 194, 195, 414 Zeitbetrachtung 243 Zeitgrundlage 330 Zeitinformation 208 Zeitintervall 170, 174, 208, 209, 212, 213, 214, 225, 229, 243, 297, 298, 378, 390, 400, 410 Zeitmessung 125, 216, 411 Zeitpunkt 195, 213, 224, 340 Zeitverzögerung 404, 405 Zeitzähler 409 Zenerdiode 254, 258, 260, 261 Zenerspannung 254, 259, 260 Zentraleinheit 35 Zero Bit 39, 60, 65, 66, 68, 72, 75, 81, 82, 93, 98, 111, 135 Zufallszahl 268, 269, 270, 286 Zufallszahlen-Erzeugung 346 Zufallszahlen-Generator 268, 269 Zugriff 31, 37, 38, 46, 50, 53, 54, 117, 132, 134, 162, 242 Zusatzfunktion 178, 180, 182 Zuverlässigkeit 23, 30, 387 Zweierkomplement 64, 92, 111, 232, 235, 236 Zweierkomplement-Wort 114 Zweitfunktion 178, 179, 181, 190, 390 Zwischenspeicher 225, 324 Zyklen 20, 100, 126, 128, 143, 144, 162, 164, 166, 169, 174, 200, 213, 215, 217, 238, 273, 378, 385