Forum: Compiler & IDEs Auslesen einzelner Bits einer char-Variable


von EPS (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Im Prinzip ja.  Sei aber vorsichtig mit "char", das ist per
default signed, und das Verschieben vorzeichenbehafteter
Zahlen ist nicht empfehlenswert (da das Verhalten implementation
defined ist).  Nimm also besser unsigned char oder noch besser
#include <stdint.h> und uint8_t.

von Peter Dannegger (Gast)


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

von EPS (Gast)


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.

von The Daz (Gast)


Lesenswert?

Bau dir ne union

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.