Forum: Mikrocontroller und Digitale Elektronik MSP430 Button


von ... .. (0x01)


Lesenswert?

Hallo,
ich hab mir vor kuzem ein MSP430 Launchpad geholt,
und habe jetzt einige Fragen:

1. Wie kann ich z.B. dieses Programm umschreiben, sodass
die Lampe erst nach drücken des Buttons ausgeführt wird.
1
#include <msp430g2231.h>
2
#define LED_0 BIT0 
3
#define LED_1 BIT6
4
#define LED_OUT P1OUT
5
#define LED_DIR P1DIR
6
7
void main(void) {
8
WDTCTL=WDTPW+WDTHOLD; 
9
LED_DIR |= (LED_0 + LED_1); 
10
LED_OUT &= ~(LED_0 + LED_1); 
11
P1OUT ^= LED_1; 
12
}
Hat bei mir nicht mit den Tutorials on ti.com funktioniert.

2. Wie soll man den Chip mit Strom versorgen, wen er z.B. in
einer externen SChaltung verbaut wurde? Reicht es ihn an  mit 3V
und an GND mit der Kathode einer Batterie zu verbinden.

3.Nach einem Upload auf das Launchpad bleibt es stehen, und erst wen
ich einen Reset ausführe beginnt der Chip (mit dem neuen Programm)
zu arbeiten. Ist dies normal, oder sollte ich einen Quarz auf das Board
löten?

4. Ich steuere bisher die einzelnen Pins so an:
1
P1.0 = BIT0
Wie soll dies aussehen wen ich den Pin 2.0 ansteuern will ?

Schonmal danke für Antworten
0x01

von Cyrill M. (kerik)


Lesenswert?

1.
Wenn dein Programm warten soll, bis ein Taster gedrückt wurde und dann 
einfach die LED einschalten dann so:
1
#include <msp430g2231.h>
2
#define LED_0 BIT0 
3
#define LED_1 BIT6
4
#define LED_OUT P1OUT
5
#define LED_DIR P1DIR
6
#define TASTE BIT3
7
8
void main(void) {
9
WDTCTL=WDTPW+WDTHOLD; 
10
LED_DIR |= (LED_0 + LED_1); 
11
LED_OUT &= ~(LED_0 + LED_1); 
12
13
while(P1IN & TASTE);      //Hier wird auf die Taste gewartet
14
P1OUT ^= LED_1;            
15
16
while(1);
17
18
}
Ganz einfache Lösung, ohne ISR.

Wenn die LED leuchten soll während eine Taste gedrückt bleibt und beim 
Loslasen wieder aus sein, dann:
1
#include <msp430g2231.h>
2
#define LED_0 BIT0 
3
#define LED_1 BIT6
4
#define LED_OUT P1OUT
5
#define LED_DIR P1DIR
6
#define TASTE BIT3
7
8
void main(void) {
9
WDTCTL=WDTPW+WDTHOLD; 
10
LED_DIR |= (LED_0 + LED_1); 
11
LED_OUT &= ~(LED_0 + LED_1); 
12
           
13
14
while(1){
15
     if(!(P1IN & TASTE)){        //Ist die Taste gedrückt?
16
         LED_OUT |= LED_0;       //Ja -> LED an
17
     }
18
     else{
19
         LED_OUT &= ~LED_0;      //Nein -> LED aus
20
     }
21
   }
22
}
Man muss halt bedenken, dass P1.3 durch einen Pull-Up auf HIGH ist. 
Durch die Taste wird der Pin dann auf Masse gezogen.

2. Zusätzlich muss den RESET-Pin über ein 10k-20k Widerstand auf die 
Versorgungsspannung. Vielleicht muss noch irgendwas beachtet werden, 
habe bisher den MSP nur programmiert, um die Beschaltung haben sich 
andere Leute gekümmert.

3. Kann sein,dass er dann im Debug-Modus bleibt oder so. Kann aber nicht 
genau sagen.

4.
1
P2OUT |= BIT0;     //Pegel-HIGH
2
P2OUT &= ~BIT0;    //Pegel-LOW
Port2 muss natürlich vorher als Ein- oder Ausgang konfiguriert werden, 
je nach dem was du brauchst.
1
P2DIR |= BIT0;     //Pin2.0 - Ausgang
2
P2DIR &= ~BIT0;    //Pin2.0 - Eingang


Grüße,

Cyrill

von ... .. (0x01)


Lesenswert?

Kann man auch auf diese weise Sensoren,
z.B. Lichtsensoren auslesen?

0x01

von ... .. (0x01)


Lesenswert?

Hab den Code versucht zu testen,
aber die Lampe leuchtet bei beiden Codes
von Anfang an und ein Buttondruck ändert nichts.

0x01

von Jörg S. (joerg-s)


Lesenswert?

Wie sieht dein Code jetzt aus?

>3.Nach einem Upload auf das Launchpad bleibt es stehen, und erst wen
>ich einen Reset ausführe beginnt der Chip (mit dem neuen Programm)
>zu arbeiten. Ist dies normal, oder sollte ich einen Quarz auf das Board
>löten?
Welchen Compiler hast du? Ich glaube beim IAR gibt es eine Option "Run 
after Upload" oder so ähnlich.

von Cyrill M. (kerik)


Lesenswert?

Ach ja!
1
LED_OUT &= ~(LED_0 + LED_1);
Die Zeile muss natürlich weg. Habs übersehen. Jetzt muss es eigentlich 
gehen.

Die Zeile schaltet ja die beiden LEDs schon vorher.

Grüße,

Cyrill

von ... .. (0x01)


Lesenswert?

Funktioniert immer noch nicht.
Ich verwende die IAR Embedded Workbench.
Und wen ich diesen Code verwende leuchten beide LEDs.
Ein Buttondruk verändert nichts.
1
#include <msp430g2231.h>
2
#define LED_0 BIT0 
3
#define LED_1 BIT6
4
#define LED_OUT P1OUT
5
#define LED_DIR P1DIR
6
#define TASTE BIT3
7
8
void main(void) {
9
WDTCTL=WDTPW+WDTHOLD; 
10
LED_DIR |= (LED_0 + LED_1); 
11
           
12
13
while(1){
14
     if(!(P1IN & TASTE)){        //Ist die Taste gedrückt?
15
         LED_OUT |= LED_0;       //Ja -> LED an
16
     }
17
     else{
18
         LED_OUT &= ~LED_0;      //Nein -> LED aus
19
     }
20
   }
21
}

0x01

von Launch (Gast)


Lesenswert?

Schau einmal nach, welches Launchad du hast. Kann sein, dass der Pullup 
für den Taster fehlt. Man kann dann den internen nutzen.

von ... .. (0x01)


Lesenswert?

Auf dem Karton steht MSP-EXP430G Rev. 1.5 und ich verwende
den MSP430G2425 Prozessor.

0x01

von Coder (Gast)


Lesenswert?

Soweit ich mich erinnere, musste man die interne Pull-Ups aktivieren. Am 
einfachsten ziehst Du den Schaltplan hinzu.

von Launch (Gast)


Lesenswert?

Schaust du hier:
http://www.ti.com/lit/ug/slau318c/slau318c.pdf

Auf deinem Launchpad dürfte der R34 nicht bestückt sein. Du kannst den 
internen Pullup vom µC nutzen.

Um die Ports zu verstehen, hilft das Kapitel aus dem Family User Guide. 
Sind nur ein paar Seiten.
http://www.ti.com/lit/ug/slau144i/slau144i.pdf
Kapitel 8

von Coder (Gast)


Lesenswert?

Genau. Der R34 ist bei (meinem) Launchpad, PCB V1.5, nicht bestückt.

von ... .. (0x01)


Lesenswert?

Launch schrieb:
> Auf deinem Launchpad dürfte der R34 nicht bestückt sein. Du kannst den
> internen Pullup vom µC nutzen.

Wie mach ich das genau?

0x01

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Im zum 'G2452 passenden "MSP430x2xx Family User's Guide" (slau144) sind 
die Register beschrieben, die zum Parallel-I/O-Port gehören.

Da ist Seite 331 interessant, insbesondere der Abschnitt
"8.2.4 Pullup/Pulldown Resistor Enable Registers PxREN"

von ... .. (0x01)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Im zum 'G2452 passenden "MSP430x2xx Family User's Guide" (slau144) sind
> die Register beschrieben, die zum Parallel-I/O-Port gehören.
>
> Da ist Seite 331 interessant, insbesondere der Abschnitt
> "8.2.4 Pullup/Pulldown Resistor Enable Registers PxREN"

Wie soll ich das nun machen?
Hab gerade erst angefangen auf dem Launchpad
zu programmieren.

0x01

von Eumel (Gast)


Lesenswert?

E. S. schrieb:
> Wie soll ich das nun machen?
> Hab gerade erst angefangen auf dem Launchpad
> zu programmieren.
>
> 0x01

Wieso machst du nicht das Tutorial von TI? Mit Video und alles super 
erklärt. Komm wieder wenn du das durchgearbeitet hast.

von ... .. (0x01)


Lesenswert?

Eumel schrieb:

> Wieso machst du nicht das Tutorial von TI? Mit Video und alles super
> erklärt. Komm wieder wenn du das durchgearbeitet hast.

Ich bin nicht sehr gut in Englisch.

0x01

von Eumel (Gast)


Lesenswert?

E. S. schrieb:
> Ich bin nicht sehr gut in Englisch.
>
> 0x01

Und wie willst du dich dann mit sowas beschäftigen? Die ganzen 
Datenblätter und user guides gibts NUR auf Englisch. Oder sollen dir 
hier alle immer jedes Problemchen vorkauen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

E. S. schrieb:
> Wie soll ich das nun machen?

Du hast bereits andere Register mit Werten beschrieben. Lies Dir also 
mal deren Beschreibung im User's Guide durch, und sieh, ob Du das dort 
beschriebene mit dem, was Du gemacht hast, in Einklang bringen kannst.

Was macht P1DIR? (wird bei Deinem Beispiel als "LED_DIR" bezeichnet)

Was bedeutet der Wert, den Du da reinschreibst? Wie kommt der Wert 
zustande?

Wenn Du das nachvollziehen kannst, sieh Dir mal den Abschnitt über das 
Pullup-/Down-Register an. Erkennst Du Parallelen?


Diese Vorgehensweise ist meines Erachtens nach sinnvoller als das 
angucken und abtippen von irgendwelchen Tutorials.

von ... .. (0x01)


Lesenswert?

Hab es jetzt so versucht, aber immer noch kein Ergebniss:
1
#include <msp430g2231.h>
2
#define LED_0 BIT0 
3
#define LED_1 BIT6
4
#define LED_OUT P1OUT
5
#define LED_DIR P1DIR
6
#define TASTE BIT3
7
8
void main(void) {
9
WDTCTL=WDTPW+WDTHOLD; 
10
P1REN = 1;
11
LED_DIR |= (LED_0 + LED_1); 
12
13
while(P1IN & TASTE);      //Hier wird auf die Taste gewartet
14
P1OUT ^= LED_1;            
15
16
while(1);
17
18
}

0x01

von Launch (Gast)


Lesenswert?

Die Ports können als Eingang oder Ausgang konfiguriert werden: z. B. 
P1DIR

Eingänge können gelesen werden: z. B. P1IN

Ausgänge können geschrieben werden: z. B. P1OUT

Ports können für alternative Funktionen konfiguriert werden: z. B. P1SEL

und, und, und

bei Eingängen können die internen Widerstände aktiviert werden: z. B. 
P1REN
ob Up oder Down wird durch P1OUT eingestellt: 0 = Pulldown, 1 = Pullup

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

E. S. schrieb:
> P1REN = 1;

Warum 1?

Versuch mal, das zu erklären. Lies Dir die Beschreibung des Registers 
nochmal genau durch, und erkläre, was passiert, wenn man da 1 
reinschreibt.

von ... .. (0x01)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Versuch mal, das zu erklären. Lies Dir die Beschreibung des Registers
> nochmal genau durch, und erkläre, was passiert, wenn man da 1
> reinschreibt.

Der interne Pullup wird damit genutzt.

von Launch (Gast)


Lesenswert?

E. S. schrieb:
> Der interne Pullup wird damit genutzt.

Die internen Widerstände des ganzen Ports.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

E. S. schrieb:
> Der interne Pullup wird damit genutzt.

Welcher?

Da steht:

> Each bit in each PxREN register enables or disables the
> pullup/pulldown resistor of the corresponding I/O pin.
> The corresponding bit in the PxOUT register selects if
> the pin is pulled up or pulled down.

Ich übersetze das mal:

Jedes Bit in jedem PxREN-Register aktiviert oder deaktiviert den 
Pull-Up-/Down-Widerstand des korrespondierenden I/O-Pins.
Das korrespondierende Bit im PxOUT register bestimmt, ob Pull-Up oder 
Pull-Down.

Und was bedeutet das?

Für jeden einzelnen I/O-Pin kann man einzeln einstellen, ob es einen 
Pull-Up-, einen Pull-Down- oder keinen Widerstand geben soll.

Was also geschieht, wenn Du 1 in P0REN schreibst?

An welchem I/O-Pin möchtest Du einen Pull-Up haben?

An dem, an den der Taster angeschlossen ist. Welcher ist das?

von Coder (Gast)


Lesenswert?

Vielleicht schaust Du dir den Code zur Demo des Launchspads an und 
versuchst diesen zu verstehen und das Familiy User Guide parallel zu 
lesen?

von ... .. (0x01)


Lesenswert?

Rufus Τ. Firefly schrieb:
> An welchem I/O-Pin möchtest Du einen Pull-Up haben?
> An dem, an den der Taster angeschlossen ist. Welcher ist das?

An P1.3

0x01

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Eben. Und, das wievielte Bit im Port ist das?

Welcher Wert entspricht diesem Bit?

von ... .. (0x01)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Eben. Und, das wievielte Bit im Port ist das?
> Welcher Wert entspricht diesem Bit?

Das 3. Bit und der Wert ist BIT3.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und warum schreibst Du dann den Wert 1 in P0REN?

Korrektur

Ich meine hier (und in folgenden Beiträgen) natürlich

P1REN

von ... .. (0x01)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Und warum schreibst Du dann den Wert 1 in P0REN?

Wie soll ich ihn dann ansteuern?

0x01

von Eumel (Gast)


Lesenswert?

Mit 0b00001000

WIE DENN SONST???

von Manuel X. (vophatec)


Lesenswert?

Eumel schrieb:
> Mit 0b00001000
>
> WIE DENN SONST???

mit 0x08 ;)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

E. S. schrieb:
> Wie soll ich ihn dann ansteuern?

Du willst den Pullup-Widerstand für Bit3 von Port 0 einschalten. Ist 1 
der Wert von Bit3?

Kann es sein, daß Du immer noch nicht verstanden hast, daß das Register 
P0REN gleich acht Pullupwiderstände separat für Bit0 bis Bit7 steuert?

Korrektur

Ich meine natürlich Port 1 und entsprechend P1REN.

von Eumel (Gast)


Lesenswert?

Manuel Z. schrieb:
> Eumel schrieb:
>> Mit 0b00001000
>>
>> WIE DENN SONST???
>
> mit 0x08 ;)

oder 8 ;)

von BT (Gast)


Lesenswert?

Hallo E. S.,

probier mal ob du damit besser zurecht kommst:

https://github.com/energia/Energia/wiki/Getting-Started

Ist für einen Neueinsteiger einfacher...


Gruß
BT

von Karl H. (kbuchegg)


Lesenswert?

Am Beispiel Port 1 (daher auch überall P1...)


P1REN
       +---+---+---+---+---+---+---+---+
       |   |   |   |   |   |   |   |   |
       +---+---+---+---+---+---+---+---+

P1DIR
       +---+---+---+---+---+---+---+---+
       |   |   |   |   |   |   |   |   |
       +---+---+---+---+---+---+---+---+

P1OUT
       +---+---+---+---+---+---+---+---+
       |   |   |   |   |   |   |   |   |
       +---+---+---+---+---+---+---+---+

P1IN
       +---+---+---+---+---+---+---+---+
       |   |   |   |   |   |   |   |   |
       +---+---+---+---+---+---+---+---+

         ^   ^   ^   ^   ^   ^   ^   ^
       BIT7    BIT5    BIT3    BIT1
           BIT6    BIT4    BIT2    BIT0


Jeweils 1 komplette Spalte aller übereinanderliegenden Bits ist für 1 
Pin zuständig.

Das Bit 0 vom P1DIR steuert die Richtung des des Pins 0 vom Port 1: Ist 
er Eingang oder Ausgang?

Wenn er Ausgang ist, dann ist das Bit 0 vom P1OUT für den Pin 0 vom Port 
1 zuständig: welchen Wert soll er annehmen - 0 oder 1?

Wenn er Eingang ist, dann kann man im Bit 0 vom P1IN den externen Wert 
des physikalischen Pins ablesen. Ist der Pin auf 0 oder auf 1?

Und im Bit 0 vom P1REN wird festgelegt, ob der Pullup Widerstand an 
diesem Pin ein oder ausgeschaltet werden soll.

Und natürlich sinngemäss für alle anderen Bits. Jeweils 
korrespondierende Bits in den einzelnen Registern gehören zusammen und 
steuern die Eigenschaften von jeweils einem physikalischen Pin.


Wenn du also Pin 0 vom Port 1 auf Ausgang schalten willst, dann 
schreibst du (zumindest so ähnlich)

     P1DIR |= BIT0;

wenn du den Pin auf 1 setzen willst, dann schreibst du

     P1OUT |= BIT0;

wenn du wissen willst, ob der Pin auf 1 ist, dann schreibst du

     P1IN & BIT0


Was also wirst du schreiben, wenn du in P1REN den zum Bit 0 gehörenden 
Pullup einschalten willst?
Genau

    P1REN |= BIT0;


Bei dir ist das nicht Bit 0, weil deine Taste nicht an den Pin 0 
angeschlossen ist, sondern am Pin 3. Also schreibst du

    P1REN |= BIT3;

und deine Taste fragst du ab mit

    P1IN & BIT3

und den Pin 3 schaltest du auf Eingang mit
(brauchst du nicht, der ist schon auf Eingang)

    P1DIR &= ~( BIT3 );


Ob du jetzt mit
1
#define LED_0 BIT0 
2
#define LED_1 BIT6
3
#define LED_OUT P1OUT
4
#define LED_DIR P1DIR
für das Bit 0, und Bit6 bzw. andere Dinge jeweils einen alternative 
'Namen' definiert hast oder nicht, ändert ja nichts, dass hier
1
   LED_DIR |= (LED_0 + LED_1);

nach der Textersetzung mit den #define immer noch steht
1
   P1DIR |= ( BIT0 + BIT6 );

lass dich nicht davon verwirren, dass da andere Namen im 
Originalprogramm stehen! Ein #define ist einfach nur eine Textersetzung. 
Mehr nicht!

von ... .. (0x01)


Lesenswert?

Danke,
jetzt funktioniert der Button.
Eine Frage habe ich noch:
Wie ließt ma einen Temperatursensor aus?
Wen ich mich nicht irre liefert der eine Spannung,
die gemessen wird.
Wie lese ich dann die Spannung aus?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

E. S. schrieb:
> Wen ich mich nicht irre liefert der eine Spannung,

Es gibt Temperatursensoren, die das tun, es gibt aber auch welche, die 
direkt per SPI, I2C oder sonstwie einen Wert übermitteln.

Im ersten Fall musst Du die Spannung mit einem Analog-Digital-Wandler 
selbst in einen Wert umwandeln. Dein MSP430 hat so etwas.

Beispiele dafür finden sich in den Code-Beispielen von TI. Dort finden 
sich auch Beispiele dafür, wie mit den diversen Schnittstellen (I2C, SPI 
etc.) hantiert wird.

von Eumel (Gast)


Lesenswert?

E. S. schrieb:
> Danke,
> jetzt funktioniert der Button.
> Eine Frage habe ich noch:
> Wie ließt ma einen Temperatursensor aus?
> Wen ich mich nicht irre liefert der eine Spannung,
> die gemessen wird.
> Wie lese ich dann die Spannung aus?


Vergiss es! Das liegt weit außerhalb deiner Fähigkeiten.

von ... .. (0x01)


Lesenswert?

Eumel schrieb:
> Vergiss es! Das liegt weit außerhalb deiner Fähigkeiten.

Das liegt daran das ich mit dem MSP430 neu angefangen
habe. Mit einem Atmel bekomme ich das hin.

0x01

von Eumel (Gast)


Lesenswert?

E. S. schrieb:
> Eumel schrieb:
>> Vergiss es! Das liegt weit außerhalb deiner Fähigkeiten.
>
> Das liegt daran das ich mit dem MSP430 neu angefangen
> habe. Mit einem Atmel bekomme ich das hin.
>
> 0x01

Nö.

von Lemue (Gast)


Lesenswert?

E. S. schrieb:
> Mit einem Atmel bekomme ich das hin.

Was ist ein Atmel?
Die haben 8051, AVR, ARM.

Wenn du den Fusedschungel AVR hinter dir hast, ist der MSP ein Klacks.
Aber ich halte es wie Eumel.  Bei dir happerts an MC Basics, völlig 
unabhängig von der Architektur.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.