www.mikrocontroller.net

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


Autor: ben91 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fledertier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ben91 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fledertier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ben91 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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  :-)

Autor: ben91 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups, das wurde ja gerade beantwortet, thx  :-)

Autor: ben91 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: ben91 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
* keine Variable ... nicht deine Variable

Autor: Mark .. (mork)
Datum:

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

Autor: Marcus (Gast)
Datum:

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

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
entschuldigung, hatte grad nicht aktualisiert, oben geschriebenes bitte 
ignorieren

Autor: ben91 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht zu vergessen: Bitmanipulation

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.