Forum: Compiler & IDEs Was bedeutet denn eigentlich "LCD_PORT |= (1<<LCD_RS);"


von ben91 (Gast)


Lesenswert?

Hallo liebes Forum!

Seit gut einer Woche bin ich dabei,
meine Grundkenntnisse in C,
für die Programmierung von Mikrocontrollern
fit zu machen. Ich habe nun auch mithilfe
des AVR-GCC-Tutorial einige Beispiele mit
Mikrocontrollern geübt.
Soweit kann ich die dort angeführten Programm-Beispiele
auch schon recht gut "entziffern". Eine Programmstruktur
bereitet mir jedoch seit Tagen schon Kopfzerbrechen.
Der angeführte Befehl sieht beispielsweise so aus:
"LCD_PORT |= (1<<LCD_RS);"

Kann mir vielleicht jemand anhand dieses Befehls erklären,
was damit denn konkret gemeint ist, bzw was diese Strukturierung
 (1<<Variable) auf sich hat??

liebe Grüße Benjamin

von Fledertier (Gast)


Lesenswert?

"1 << Variable" heisst, dass eine 1 (Binär: 0000 0001) um "Variable" 
Stellen nach links geschoben wird. Ist Variable = 4, dann wird die 1 4 
Stellen nach links gerückt: 0001 0000; was 16 entspricht.
Also 1 * 2^Variable; jedes mal nach links verrutschen ist eine 
Multiplikation mit 2.

von ben91 (Gast)


Lesenswert?

Erstmal danke für die rasche Antwort!

Aber was ich noch nicht ganz verstehe ist,
was bedeutet dass nun für dieses Beispiel:
"LCD_PORT |= (1<<LCD_RS);"

Der Wert von LCD_PORT wird um eine Stelle verschoben??

von Hc Z. (mizch)


Lesenswert?

ben91 schrieb:

> "LCD_PORT |= (1<<LCD_RS);"
>
> Der Wert von LCD_PORT wird um eine Stelle verschoben??

Nein, verschoben wird die 1.  Der Wert von LCD_PORT wird mit einer 
Konstanten (der geschobenen 1) ODER-verknüpft.

Anders ausgedrückt: Das oben ist dasselbe wie

LCD_PORT = LCD_PORT | (1<<LCD_RS)

LCD_PORT wird ausgelesen, das Bit mit der Nummer vom LCD_RS gesetzt und 
das Ergebnis wieder nach LCD_PORT rausgeschrieben.

von Fledertier (Gast)


Lesenswert?

LCD_PORT |= (1<<LCD_RS)  ist eine Kurzschreibweise für
LCD_PORT = LCD_PORT | (1<<LCD_RS).
(Geht mit so ziemlich allen Operatoren. Also a += 5 heisst z.B. a = a + 
5.)

Das heisst erst mal, dass (1 << LCD_RS) berechnet wird. Ist LCD_RS jetzt 
z.B. 2, steht hier (1 << 2), was binär 00000100 ist.
Der | bedeutet eine ODER-Verknüpfung.
Ist LCD_PORT z.B. 00100010, wird dazu der Wert von oben "geodert"

Oder anders: in LCD_PORT wird das LCD_RS'te (2.) Bit gesetzt.

Zum Löschen verwendet man dann LCD_PORT &= ~(1<<LCD_RS) bzw.
LCD_PORT = LCD_PORT & ~(1<<LCD_RS).
D.h. 1<<LCD_RS wird negiert (~) (0 => 1 und 1 => 0), was 11111011 ist.
Das wird dann mit dem LCD_PORT "verunded" (&).

Das Dritte ist togglen, d.h. das Bit zwischen 0 und 1 wechseln, ohne zu 
wissen, welchen Wert das Bit gerade hat: LCD_PORT ^= (1<<LCD_RS)
Hier wird also das 2. Bit getoggelt.

von ben91 (Gast)


Lesenswert?

Achso ... ja jetzt wird das ganze schon verständlicher.
Aber etwas ist mir noch unklar: Stellt das "|" denn keine
ODER-Verknüpfung dar?? Bzw. wenn nicht, was hat das Zeichen bei
der Programmierung dann zu bedeuten?? Sorry, für die blöden
Fragen, aber ich bin nunmal Anfänger, was Programmieren angelangt  :-)

von ben91 (Gast)


Lesenswert?

ups, das wurde ja gerade beantwortet, thx  :-)

von ben91 (Gast)


Lesenswert?

Wenn LCD_RS nun wie im Tutorial als "#define LCD_RS PC4"
definiert wurde, heißt dass nun das LCD_RS den Wert 4 annimmt??
Weil PC4 ist ja keine Zahl, und kann somit deine Variablen verschieben,
oder?!

von ben91 (Gast)


Lesenswert?

* keine Variable ... nicht deine Variable

von Mark .. (mork)


Lesenswert?

PC4 hat den Wert 4 und wird in dem entsprechenden Header des verwendeten 
Controllers per #define definiert.

von Marcus (Gast)


Lesenswert?

doch, es ist eine oder-verknüpfung, aber mit oder setzt man ja alle bits 
die in einer der beiden argumente 1 sind

von Marcus (Gast)


Lesenswert?

entschuldigung, hatte grad nicht aktualisiert, oben geschriebenes bitte 
ignorieren

von ben91 (Gast)


Lesenswert?

OK ... dan wäre das nun auch geklärt.
Jetzt kann ich bereits mein erstes "Hallo Welt"
am Display ausgeben. Nun werd ich mal das Programm studieren,
um es verstehen zu können.
Danke für die hilfreichen Antworten.

lg Benjamin

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Nun werd ich mal das Programm studieren, um es verstehen zu können.
Als Tipp, wenn du mit dem Studium des Programms fertig bist:
Wie wärs mit dem Studium eines Buches?
K&R "Programmieren in C"  das ist das Standardwerk schlechthin.

von Peter (Gast)


Lesenswert?

>Sorry, für die blöden Fragen, aber ich bin nunmal Anfänger

Dann kaufe Dir mal ein Buch zu C, lese es aufmerksam durch und arbeite 
auch die beiden Tutorials auf dieser Seite durch, bevor Du hier das 
Forum mit 100000 Anfängerfragen löcherst...

http://www.mikrocontroller.net/articles/AVR-Tutorial
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Nicht zu vergessen: Bitmanipulation

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.