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 :-)
ups, das wurde ja gerade beantwortet, thx :-)
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?!
* keine Variable ... nicht deine Variable
PC4 hat den Wert 4 und wird in dem entsprechenden Header des verwendeten Controllers per #define definiert.
doch, es ist eine oder-verknüpfung, aber mit oder setzt man ja alle bits die in einer der beiden argumente 1 sind
entschuldigung, hatte grad nicht aktualisiert, oben geschriebenes bitte ignorieren
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.
>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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.