mikrocontroller.net

Forum: Compiler & IDEs Bestimmter Stelle aus Variable erhalten


Autor: Manipulator (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C?

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

Du kannst die Variable auch als bitarray definieren.

Grüße, Freakazoid

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier was zum Lesen zu Bitfeldern:

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

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

Autor: Manipulator (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Manipulator (Gast)
Datum:

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

Autor: Manipulator (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
  }

Autor: Nico Schümann (Gast)
Datum:

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

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.