MSP430 Assembler-Programmierung: Grundlagen

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

 

6 thoughts on “MSP430 Assembler-Programmierung: Grundlagen

  1. Steffen

    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

    Reply
      1. Steffen

        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

        Reply
  2. Hikus

    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.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.