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.
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.
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
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.
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.