Hallo Leute,
ich habe mir das MSP430 Launchpad gekauft.
Ich versuche schon seit 2 Tagen zu verstehen,
warum die Definition der LEDs und des Buttons so aussieht:
1
#define RED_LED BIT0
2
#define GREEN_LED BIT6
3
#define LED_DIR P1DIR
4
#define LED_OUT P1OUT
5
6
#define BUTTON BIT3
7
#define BUTTON_OUT P1OUT
8
#define BUTTON_DIR P1DIR
9
#define BUTTON_IN P1IN
10
#define BUTTON_REN P1REN
BIT0 und BIT6 ist klar. Aber was ist P1DIR und P1OUT?
Warum wird eine LED mit
1
LED_OUT|=RED_LED;
eingeschalten und mit
1
LED_OUT&=~RED_LED;
ausgeschalten?
Warum ist bei LED_OUT und bei BUTTON_OUT "P1OUT"?
Warum wird hier geprüft ob BIT3 oder P1IN true ist?
1
if(BUTTON_IN&BUTTON)
ob der Button gedrückt wurde?
Ich verstehe leider überhaupt nichts. :(
Gruß
Pascal
Moin,
das ist eigentlich ganz einfach, wenn man es erst mal weiß:-)
Die Bezeichnungen BIT3, P1DIR sind alles includes aus einer
msp430-library.
Diese libary kannst du mit dem Befehl include in dein Programm
einbinden, wenn Du sie besitzt. Die findet man auch einfach im Internet,
wenn Du sie nicht haben solltest, einfach nach deinem MSP-Typ suchen.
Es schaut dann so aus in der include libary:
#define BIT0 0x01
Dann kannst immer, wenn Du das erste Bit z.B. in einem Register setzen
willst BIT0 verwenden, ist deutlich einfacher zu verstehen als 0x01.
Und bei dem Beispiel:
#define BUTTON BIT3
sagst Du das BUTTON gleich 0x01 ist.
Eigentlich ganz einfach:-) Na ja jeder Anfang ist schwer.
Also mit P1DIR und P1OUT kannst Du den Pin als Ausgang oder Eingang
schalten.
Mit LED_OUT |= RED_LED; schaltest Du den Ausgang auf HIGH, das
Ausgangsregister wird Bitweise ODER verknüpft.
Mit LED_OUT &= ~RED_LED; wird das Komplement von RED_LED gebildet (0x01
-> ~0x01 = 0xFE), dieser Wert wird dann mit dem Registerinhalt von
LED_OUT und verknüpft und bildet dann den Ausgangswert.
if (BUTTON_IN & BUTTON), dabei werden die beiden in der Werte BUTTON_IN
und BUTTON Bitweise ODER verknüpft, ist das Bit von BUTTON_IN gleich dem
Bitwert von BUTTON, so wird in die die nachfolgende Funktion verzweigt
und ausgeführt.
Stichwort -> Bitoperationen :
http://www.oreilly.de/catalog/cplus2ger/chapter/ch11.pdf
Schau Dir auch noch mal das MSP430 Manuel von TI an, Stichwort I/O.
Warum wird der Teil im else Block ausgeführt wenn der Button gedrückt
wird?
Wenn ich den Button drücke müsste die Bedingung doch wahr sein.
Warum ist das nicht so?
Gruß
Pascal
Moin Pascal,
ist deine Frage so richtig gestellt?
"Warum wird der Teil im else Block ausgeführt wenn der Button gedrückt
wird?
Wenn ich den Button drücke müsste die Bedingung doch wahr sein.
Warum ist das nicht so?"
Oder meinst Du das NICHT in den else Block verzweigt wird?
Du Solltest Dir mal die Werte der beiden Variablen BUTTON_IN und BUTTON
anscheuen, ob die so richtig sind. Sollte BUTTON_IN nicht den
erwarteteten Wert besitzen, so kann das folgende Gründe haben (ich gehe
davon aus, dass BUTTON _IN den Werte des I/O-Registers beinhaltet):
1. Der I/O-Pin ist nicht als input-I/O initialisiert?
2. Ist das der falsche I/O-Pin ausgewählt?
Ein weitere Möglichkeit könnte der Abfragewert BUTTON sein, besitzt er
den richtige Vergleichswert?
MfG
Sorry,
vergess den oberen Teil, hatte ich falsch verstanden. Es ist ja noch
früh:-) Aber die möglichen Fehlerquellen solltest Du trotzdem
überprüfen. Für weitere Informationen schau mal in das Dokument, ist
wohl für einen anderen MSP430 als denn Du verwendest, sollte aber gehen:
www.ti.com/lit/ug/slau049.pdf
Sonst suche im Netzt nach deinem MSP Typ und dem Stichwort slau, damit
findest Du den User Guide für deinen MSP430.
MfG
Abend,
die Frage oben hat sich erledigt.
Ich glaube ich komme der Sache näher aber so ganz verstanden hab
ich es trotzdem noch (lange) nicht.
Fühlt sich an wie eine Denkblockade im Kopf >.<
Ich check einfach nicht was es mit P1DIR, P1OUT, P1IN & P1REN auf sich
hat...
Die Beschreibungen im Internet habe ich schon mehrfach gelesen und
immernoch check ich das nicht so wirklich. :/
Bin auf das hier gestoßen:
1
Und wenn ich z.B. PB1 auf HIGH setzen möchte, wenn PB0 LOW ist und umgekehrt, dann sieht das so aus:
2
3
IF PINB.0 = 0 THEN
4
PORTB.1 = 1
5
ELSE
6
PORTB.1 = 0
7
END IF
(http://halvar.at/elektronik/kleiner_bascom_avr_kurs/hallo_welt/)
Warum kann es nicht so einfach sein wie dort :x!!
Das verstehe ich sofort..
Vielleicht sollte ich erwähnen, falls es dir noch nicht aufgefallen ist,
dass ich eine super Pfeife bin was Technik/Elektronik angeht... :D
Programmieren ist kein Problem. Aber Hardware .......
Gruß Pascal
Um die LEDs auf Ausgang zu setzen muss der Wert 1 gesetzt werden, oder?
Warum steht da aber jetzt LED_DIR "|=" RED_LED ?
Würde dort stehen:
LED_DIR = 1;
dann fände ich es logisch.
Wo ist mein Fehler?
Gruß Pascal
Okay hab es verstanden! :-)
(Beitrag "Anfängerfrage: MSP430F2274")
Bleiben 2 letzte Fragen..
Will ich den Wert auf High setzen benutze ich "|=".
Bei Low benutze ich "&=" und den Gegenwert mit "~".
Die Fragen:
Was ist der Unterschied zwischen "|=" und "&="?
Was ist P1REN - Pullup/Pulldown Resistor?
Gruß Pascal
Ich schreib ja wirklich nur ungern den 5. Post hintereinander :/
Code:
1
if(BIT3&P1IN){
2
// Dieser Teil wird ausgeführt wenn der Button nicht gedrückt wird.
3
}else{
4
// Dieser Teil wird ausgeführt wenn der Button gedrückt wird.
5
}
Zusätliche Infos:
1
P1DIR&=~BIT3;
2
P1REN|=BIT3;
BIT3 ist der Button.
Frage:
Wenn der Button gedrückt wird müsste doch BIT3 den Wert 1 haben und
ebenso auch P1IN, oder?
Warum wird dann der else Block ausgeführt wenn beide High sind.
Schreibe ich nur "if(BIT3)" wird keiner der beiden Blöcke ausgeführt.
Woran liegt das?
Gruß Pascal
Pascal B. schrieb:> Was ist P1REN - Pullup/Pulldown Resistor?
Ist ein Portpin als Eingang geschaltet, kann im Chip ein Widerstand gegn
Vcc oder Gnd geschaltet werden. Der Pin hat dadurch immer ein
definierters Potential anliegen und offene Eingänge toggeln nicht.
Moin,
einfach mal den Link folgen den ich schon einmal gepostet hatte:
Stichwort -> Bitoperationen :
http://www.oreilly.de/catalog/cplus2ger/chapter/ch11.pdf
Da steht alles soweit drin.
@Pascal B.
Also wenn Du dich mit diesem thema weiter beschäftigen willst, würde ich
Dir raten das Du dich ein wenig tiefer mit der Funktionsweise von
Mikroarchitekturen auseinander setzt. Also wie so eine MCU/CPU arbeitet,
das hilft bei vielen Problemen und ist ein sehr interessantes Thema:-)
MfG