MSP430 Button

OP #2949070
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
#2949137
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
#2949871
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.
OP #2950244
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
OP #2950670
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
Persönliche Seite #2950705
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.
OP #2950808
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
Gast #2950859
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
Persönliche Seite #2950969
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?
#2952010
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!
Persönliche Seite #2952036
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.
Gast #2952069
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren