Forum: Mikrocontroller und Digitale Elektronik Einstieg MSP430


von Pascal B. (Gast)


Lesenswert?

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

: Verschoben durch User
von Der Die Das (Gast)


Lesenswert?

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.

von Der Die Das (Gast)


Lesenswert?

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.

von Pascal B. (Gast)


Lesenswert?

Tach,

vielen Dank für die ausführliche Antwort!
Ich denke damit sollte alles geklärt sein.

Falls nicht melde ich mich :-P

Danke & Gruß
Pascal

von Pascal B. (Gast)


Lesenswert?

1
if (BUTTON_IN & BUTTON) {
2
      LED_OUT &= ~GREEN_LED;
3
    } else {
4
      LED_OUT |= GREEN_LED;
5
    }

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

von Der Die Das (Gast)


Lesenswert?

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

von Der Die Das (Gast)


Lesenswert?

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

von Pascal B. (Gast)


Lesenswert?

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

von Pascal B. (Gast)


Lesenswert?

1
#define RED BIT0
2
#define GREEN BIT6
3
#define LED_DIR P1DIR
4
#define LED_OUT P1OUT
5
6
// LED Pins auf Ausgang setzen
7
  LED_DIR |= RED_LED | GREEN_LED;

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

von Pascal B. (Gast)


Lesenswert?

#define RED BIT0
#define GREEN BIT6

wird zu

#define RED_LED BIT0
#define GREEN_LED BIT6

sonst stimmt der untere Teil nicht.
Mein Fehler .. sorry

von Pascal B. (Gast)


Lesenswert?

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

von Pascal B. (Gast)


Lesenswert?

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

von OrAnd (Gast)


Lesenswert?

Pascal B. schrieb:
> Was ist der Unterschied zwischen "|=" und "&="?
1
uint8_t foo = 0;
2
// logisch oder
3
foo = foo | 1;     // foo hat den Wert 1 : 0000 0001
4
foo = foo | 4;     // foo hat den Wert 5 : 0000 0101
5
foo |= 0x20;       // foo hat den Wert 37: 0010 0101
6
7
// logisch und
8
foo = foo & 4;     // foo hat den Wert 4 : 0000 0100
9
foo |= foo & 2;    // foo hat den Wert 0 : 0000 0000

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Pascal B. schrieb:
> Was ist der Unterschied zwischen "|=" und "&="?

Das steht in Deinem C-Buch.

Du hast keines?

von Der Die Das (Gast)


Lesenswert?

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

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.