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
voidmain(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
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
voidmain(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
voidmain(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.
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.
Funktioniert immer noch nicht.
Ich verwende die IAR Embedded Workbench.
Und wen ich diesen Code verwende leuchten beide LEDs.
Ein Buttondruk verändert nichts.
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"
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
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.
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
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?
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.
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
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.
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.
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?
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
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.
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!
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?
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.
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.
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
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ö.
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.