Hallo, ich beschäftige mich gerade mit der Shiftoperation und habe demzufolge versucht mir folgenden Code etwas näher zu bringen, nur leider bekomme ich immer ein anderes Ergebnis als der Controller. Vieleicht kann mir ja hier jemand von Euch helfen. Auszug aus dem Code: // 4Bit 2 Zeilen 5x7 lcd_command(0x28); hiermit wird ja die Funktion lcd_command mit dem Parameter 28H bzw 40D aufgerufen. jetzt geht es los!!!! // sendet einen Befehl an das LCD void lcd_command(unsigned char temp1) { unsigned char temp2 = temp1; temp2 wird mit 40H initialisiert LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen temp1 = temp1 >> 4; // oberes Nibble holen 0010 1000 >> 0000 1000 ist das richtig???? temp1 = temp1 & 0x0F; // maskieren Nach UND Verknüpfung = 0000 1000 für temp1 richtig??? LCD_PORT &= 0xF0; LCD_PORT ist jetz 0000 0000 LCD_PORT |= temp1; // setzen Oder Verknüpfung: 0000 0000 LCD_PORT 0000 1000 temp1 ---------- 0000 1000 wo liegt mein Fehler????? lcd_enable(); temp2 = temp2 & 0x0F; // unteres Nibble holen und maskieren der Debbuger zeigt mir an das angeblich Port DP2 gesetzt ist!!! LCD_PORT &= 0xF0; LCD_PORT |= temp2; // setzen lcd_enable(); _delay_us(42); } Kann mir das vieleicht bitte jemand erklären? Gruß, Andreas
> temp1 = temp1 >> 4; // oberes Nibble holen > > 0010 1000 >> 0000 1000 ist das richtig???? Nein, ist es nicht. Der Schiebeoperator verschiebt die Bits. Aus 0010 1000 (0x48) wird 0000 0010 (0x04) Der Rest sind Folgefehler.
> Nein, ist es nicht. > > Der Schiebeoperator verschiebt die Bits. > > Aus 0010 1000 (0x48) > wird 0000 0010 (0x04) > > Der Rest sind Folgefehler. Das heißt, der Schiebeoperator verschiebt ab dem ersten gesetzten Bit? Ich dachte er fängt bei Bit 7 an zu schieben bei >> ,bzw Bit 0 bei << Hab ich das so richtig verstanden?
Nein, der Schiebeoperator schiebt alle Bits, ob sie nun 0 oder 1 sind. Wird nach rechts geschoben, wird von links mit Nullen aufgefüllt: Und so wird aus ABCD EFGH >> 4 0000 ABCD
Andreas V. schrieb: >> Nein, ist es nicht. >> >> Der Schiebeoperator verschiebt die Bits. >> >> Aus 0010 1000 (0x48) >> wird 0000 0010 (0x04) >> >> Der Rest sind Folgefehler. > > Das heißt, der Schiebeoperator verschiebt ab dem ersten gesetzten Bit? > Ich dachte er fängt bei Bit 7 an zu schieben bei >> ,bzw Bit 0 bei << > > Hab ich das so richtig verstanden? Es hat nichts damit zu tun, ob die Bits gesetzt sind. Würde man die Bits mit Buchstaben durchnummerieren:
1 | HGFEDCBA>>1 => 0HGFEDCB |
1 | HGFEDCBA<<1 => GFEDCBA0 |
Das frei werdende Bit wird einfach mit 0 aufgefüllt.
Rufus t. Firefly schrieb: >> temp1 = temp1 >> 4; // oberes Nibble holen >> 0010 1000 >> 0000 1000 ist das richtig???? > Nein, ist es nicht. > Der Schiebeoperator verschiebt die Bits. > Aus 0010 1000 (0x48) > wird 0000 0010 (0x04) > Der Rest sind Folgefehler. [Schlaumeiermodus] sollte wohl heißen: Aus 0010 1000 (0x28) wird 0000 0010 (0x02) [/Schlaumeiermodus]
Ja, danke. Hat es also doch jemand herausgefunden. Glühstrumpf, äh, Glückwunsch.
wollte dir nicht ans Bein pinkeln, jedoch konnte ich es auch nicht 'ungesehen' so stehen lassen... Gruß Christian
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.