Hallo, ich habe eine Variable uint8_t wert, und muss jetzt für jede Stelle wissen, ob dort eine 1 oder eine 0 steht, um dies nachher einem Pin zuzuweisen. Wie erreiche ich das? Gruß Manipulator
C? if(nValue & (1<<7)) { print("Bit 7 ist 1"); } else { } Du kannst die Variable auch als bitarray definieren. Grüße, Freakazoid
Hier was zum Lesen zu Bitfeldern: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Bitfelder Wenn Du vorhast sowas wie für x in Bit 0..7 Wenn Bit x == 1 setze PinB.x sonst lösche PinB.x end machen willst - das kann man vereinfachen (zwinker) Grüße, Freakazoid
Hallo, hab das so versucht: void write_data(uint8_t wert) { if(wert & 1) { LCD_DATA0_PORT |= (1 << LCD_DATA0_PIN); } else { LCD_DATA0_PORT &= ~(1 << LCD_DATA0_PIN); } if(wert & 2) { LCD_DATA1_PORT |= (1 << LCD_DATA1_PIN); } else { LCD_DATA1_PORT &= ~(1 << LCD_DATA1_PIN); } if(wert & 4) { LCD_DATA2_PORT |= (1 << LCD_DATA2_PIN); } else { LCD_DATA2_PORT &= ~(1 << LCD_DATA2_PIN); } if(wert & 8) { LCD_DATA3_PORT |= (1 << LCD_DATA3_PIN); } else { LCD_DATA3_PORT &= ~(1 << LCD_DATA3_PIN); } } aber funktioniert nicht, z.B. mit dem Wert 1010.
Muss natürlich jedesmal (wert & (1<<Stelle)) heissen, geht damit aber auch nicht.
So gehts, wobei ich nicht verstehe, warum ich bei den ifs löschen muss, um das richtige Resultat zu bekommen.... void write_data(uint8_t wert) { if(wert & (1<<0)) { LCD_DATA0_PORT &= ~(1 << LCD_DATA0_PIN); } else { LCD_DATA0_PORT |= (1 << LCD_DATA0_PIN); } if(wert & (1<<1)) { LCD_DATA1_PORT &= ~(1 << LCD_DATA1_PIN); } else { LCD_DATA1_PORT |= (1 << LCD_DATA1_PIN); } if(wert & (1<<2)) { LCD_DATA2_PORT &= ~(1 << LCD_DATA2_PIN); } else { LCD_DATA2_PORT |= (1 << LCD_DATA2_PIN); } if(wert & (1<<3)) { LCD_DATA3_PORT &= ~(1 << LCD_DATA3_PIN); } else { LCD_DATA3_PORT |= (1 << LCD_DATA3_PIN); }
Das hat nichts mit Löschen zu tun. Such bei Google mal nach Bitoperationen (&) und Shift-Operator (<<).. Sollte helfen ;)
@Nico: Und? Was würde er dann lernen? if(wert & (1<<2)) { LCD_DATA2_PORT &= ~(1 << LCD_DATA2_PIN); * } else { LCD_DATA2_PORT |= (1 << LCD_DATA2_PIN); } Seine Frage war, warum bei * das Bit ausgeblendet werden muß, wo if(...) auf '1' im Bit prüft (bzw. auf != 0). Kann ich mir nur durch eine umgekehrte Ausgangslogik erklären, oder ich hab was übersehen (dann sollte ich das Vorglühen bei Maiwanderungen weglassen). Grüße, Freakazoid
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.