www.mikrocontroller.net

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


Autor: EPS (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
char tmp = 0;
if( x & 0x01 )
  tmp |= 1<<5;
if( x & 0x02 )
  tmp |= 1<<3;
if( x & 0x04 )
  tmp |= 1<<0;
// usw.
PORTD = tmp;


Peter

Autor: EPS (Gast)
Datum:

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

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bau dir ne union

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.