Forum: Compiler & IDEs Bestimmter Stelle aus Variable erhalten


von Manipulator (Gast)


Lesenswert?

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

von André K. (freakazoid)


Lesenswert?

C?

if(nValue & (1<<7))
{
 print("Bit 7 ist 1");
}
else
{
}

Du kannst die Variable auch als bitarray definieren.

Grüße, Freakazoid

von André K. (freakazoid)


Lesenswert?

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

von Manipulator (Gast)


Lesenswert?

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.

von Manipulator (Gast)


Lesenswert?

Muss natürlich jedesmal (wert & (1<<Stelle)) heissen, geht damit aber
auch nicht.

von Manipulator (Gast)


Lesenswert?

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);
  }

von Nico Schümann (Gast)


Lesenswert?

Das hat nichts mit Löschen zu tun. Such bei Google mal nach
Bitoperationen (&) und Shift-Operator (<<).. Sollte helfen ;)

von André K. (freakazoid)


Lesenswert?

@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
Noch kein Account? Hier anmelden.