In diesem Artikel geht es um die Grundlagen der Assembler-Programmierung für den MSP430 (speziell um das Launchpad oder auch MSP430G2231/MSP430G2211). Es sollen bestimmte Ports gesetzt werden oder abgefragt werden. Dazu gibt es ein kleines Beispielprogramm.
Beispielprogramm
In diesem Programm soll der Taster “S2” an Port 1.3 abgefragt werden. Wurde der Taste betätigt, soll die rote LED (LED1) an Port 1.0 aufleuchten. Wird der Taster ein weiteres mal betätigt, wird die LED wieder ausgeschaltet usw.
.cdecls "msp430g2231.h" .global main .text main: mov.w #0x280,SP ;initialize stack pointer mov.w #WDTPW+WDTHOLD,&WDTCTL ;stop watchdog timer bis.b #0x01,&P1DIR ;P1.0 (LED1) output bic.b #0x08,&P1DIR ;P1.3 (S2) input mov.b #0x00,&P1OUT ;clear P1.0 pressed: bit.b #0x08,&P1IN ;test state of switch (S2=high?) jnz pressed ;low, wait xor.b #0x01,&P1OUT ;toggle LED1 pressed_not: bit.b #0x08,&P1IN ;test state of switch (S2=low?) jz pressed_not ;high, wait jmp pressed ;S2=low .end
Beschreibung (Zeilenweise)
.cdecls "msp430g2231.h" .global main .text
1. Zeile: | Die Header-Datei vom MSP430G2231 wird eingebunden |
2. Zeile: | Die Startadresse des Programms wird definiert (bzw. der Eintrittspunkt “main”, hier kann aber auch ein anderer Name gewählt werden. |
3. Zeile: | Das Programm (Programm-Code) fängt in dieser Sektion an. |
mov.w #0x280,SP ;initialize stack pointer mov.w #WDTPW+WDTHOLD,&WDTCTL ;stop watchdog timer
1. Zeile: | Der Stack-Pointer (SP) wird initialisiert (der Speicher (RAM) fängt bei der Adresse 0x0200 an). |
2. Zeile: | Watchdog-Timer deaktivieren |
bis.b #0x01,&P1DIR ;P1.0 (LED1) output bic.b #0x08,&P1DIR ;P1.3 (S2) input mov.b #0x00,&P1OUT ;clear P1.0
1. Zeile: | Port 1.0 wird als Ausgang definiert. Dies geschieht über das P1DIR (Port 1-Direction) Register (High=Ausgang, Low=Eingang).0x01 = 00000001 (binär) -> LSB = Port 1.0 ; MSB = Port 1.7 |
2. Zeile: | Port 1.3 (Direction-Register) wird geleert (Low=Eingang).0x08 = 00001000 (binär) |
3. Zeile: | Port 1.0 wird auf 0 gesetzt (die LED soll am Anfang nicht leuchten) |
pressed: bit.b #0x08,&P1IN ;test state of switch (S2=high?) jnz pressed ;low, wait xor.b #0x01,&P1OUT ;toggle LED1
1. Zeile: | Port 1.3 (Taster 2) wird auf “1” abgefragt (das Status-Flag wird geändert) |
2. Zeile: | Falls der Taster nicht betätigt wurde, wird wieder zum Label “pressed” gesprungen und es erfolgt eine weitere Abfrage (Endlos-Schleife, bis der Taster gedrückt wurde). |
4. Zeile: | Port 1.0 (LED1) wird getoggled (an/aus geschaltet), dies wird ganz einfach durch eine XOR-Verknüpfung realisiert:0^0=0, 0^1=1, 1^0=1 (die LED ist aus und der Taster wird gedrückt => AN) 1^1=0 (die LED ist an und der Taster wird gedrückt => AUS) |
In dem nächsten Abschnitt wird eine weitere Taster-Abfrage programmiert. Dies ist notwendig damit man nicht in der ersten Taster-Abfrage “hängen” bleibt. Die erste Schleife (wurde der Taste gedrückt?) würde immer wieder ausgeführt werden und die LED immer wieder an/aus geschaltet werden (für das menschliche Auge nicht sichtbar). Deswegen muss gewartet werden bis der Taster wieder losgelassen wird. Erst dann kann zu ersten Abfrage (wurde der Taster erneut gedrückt?) gesprungen werden.
pressed_not: bit.b #0x08,&P1IN ;test state of switch (S2=low?) jz pressed_not ;high, wait jmp pressed ;S2=low .end
Hallo!
Wo hast du die Assembler Programmierung gelernt? Was würdest Du empfehlen wenn ich auch Assembler am Beispiel des MPS430 lernen möchte. Ich nutze derzeit das CCS und quäle mich wirklich mit dem Verstehen und Finden von Zusammenhängen beim Programmieren. Ich erhoffe mir von Assembler einen tieferen Einblick in die Struktur und Funktionsweise von Microcontrollern. Es wäre super wenn Du einen Tip für mich hättest.
Danke!
Gruß, Steffen
Hi,
als erstes sollte man die Befehle verstehen, findet sich hier: http://www.ti.com/lit/ug/slau144j/slau144j.pdf. Ich habe mal früher eine Liste mit allen Befehlen (gibt es hier auf der Seite unter “MSP430”) zusammengestellt. Was mir geholfen hat: einfache C/C++/Java-Programme in ASM umschreiben. Und immer schön den Debugger benutzen.
http://www.ti.com/product/msp430g2231 -> unter “Applicaiton Notes” finden sich auch viele Infos.
Danke! Dann werde ich mich mal da herantasten. Wir wollten in unserer Technikgruppe sowieso mit Assembler beginnen. Wir wussten nur nie so recht wie man damit beginnt. Ich denke mit dem Befehlen und deinem Beispiel können wir erste Versuche machen.
Gruß, Steffen
Assembler ist keine Programmiersprache. Es ist Maschinensprache, d.h. man begibt sich auf die Ebene der CPU und des Systems und zwar eines speziellen, in diesem Fall des TI MSP430G2 Prozessors mit all seinen Komponenten und dieses ist sehr komplex. Assembler dient dazu, einen Computer auf der Hardwarebene zu erforschen und zu studieren. Im Endeffekt wird man dann zu einem Experten, wie in diesem Fall das TI MSP430G2 System aufgebaut ist, welche Funktionen enthalten sind, Beispiel Temperatursensor, welche Maschinensprachebefehle der Prozessor enthält, welche Register, Systembus und so weiter. Das richtige Werkzeug für einen TI MSP430G2 Fetischisten dessen Computerwelt nur aus der TI MSP430G2553 16MHZ 16bit Risc CPU besteht und für den das 667 Seitige Handbuch User Guide zu dem Prozessor eine Art Bibel ist.
Ich habe mein Spaß!
you’ve got trolled
hallo,
gibt es einen Assembler unter Linux für den MSP430?
Gruß
Horst
MSP430 Toolchain