Auslesen einzelner Bits einer char-Variable

Gast #284219
Lesenswert?
• ▲
▼
Hallo!

Wie kann ich von einer char-Variable die einzelnen Bits auslesen und
diese auf verschieden Portausgänge (auch Pins verschiedener Ports)
zuweisen.

meine Idee war:

char x = 5;
PORTD |= ((x & 0x04)<<PD3)|((x&0x08)<<PD5)|...;

Der Hintergrund ist eine Displayansteuerung wobei die 4 bzw. 8
Datenleitung nicht hintereinander am µC-Port angeschlossen sind.
Gast #284221
Lesenswert?
• ▲
▼
Ich vermute mal, das wird für den Compiler ziemlich umständlich werden.

Mit dem Wissen, daß der AVR einen SBRC-Befehl hat, kann man ihn etwas
lenken:
1
char tmp = 0;
2
if( x & 0x01 )
3
  tmp |= 1<<5;
4
if( x & 0x02 )
5
  tmp |= 1<<3;
6
if( x & 0x04 )
7
  tmp |= 1<<0;
8
// usw.
9
PORTD = tmp;


Peter
Gast #284222
Lesenswert?
• ▲
▼
Hallo nochmal!

Vielen Dank erst einmal für die schnellen Antworten! Mit meiner obigen
Variante komme ich noch nicht zurecht.

Mit:
   char struct {
   unsigned char bit_0:1;
   unsigned char bit_1:1;
   unsigned char bit_2:1;
   unsigned char bit_3:1;
   unsigned char bit_4:1;
   unsigned char bit_5:1;
   unsigned char bit_6:1;
   unsigned char bit_7:1;
        } d;
 d.bit_0=1;
 d.bit_1=0;
 d.bit_2=1;...

geht es zwar.

Nun kann ich nach Belieben die einzelnen Bits verschiedenen
Portausgängen zuweisen, z.B. Bit_0 an PortD.Pin0, Bit_1 nicht an
Portd.Pin1 sondern an Pin3 (deshalb, weil ich Pin 1 und Pin 2 für
Interrupts nutze).
Dies funktioniert mit:

PORTD |=(d.bit_0<<PD0)|(d.bit_1<<PD2)|(d.bit_2<<PD3)...
PORTB |=(d.bit_3<<PB0)|(d.bit_4<<PB1)...u.s.w.

Da es aber sehr umständlich ist die einzelnen Bits immer zu setzen,
möchte ich auf die einzelnen Bits einer (unsigned) char-Variable
zugreifen und diese bei der Zuweisung an die Ausgänmge einfach nur
auslesen.
Dazu habe ich dann folgendes versucht:
char d=5;
PORTD |= ((d & 0x01)<<PD0)|((d & 0x02)<<PD3)...
          (1.Bit von d)     (2.Bit von d)

Aber entweder ist der Code für die Auslesung der einzelnen Bits (d &
0x01) falsch oder es liegt ein anderer Fehler vor.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.