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
"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.
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??
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.
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.
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 :-)
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?!
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
> 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.
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.