Per Bitmanipulation mehrere LEDs ohne Schieberegister schalten

Hallo,

ich würde gerne per Bitmanipulation mehrere LEDs schalten.

Im Buch von Erik Bartmann wird dies [u]unter Verwendung eines Schieberegisters[/u] beschrieben.

Ich würde dies in meinem Projekt jedoch gerne [u]ohne Schieberegister[/u] lösen und frage mich nun, wie ich es bewerkstelligen kann, dass jeweils ein Bit eines Bytes jeweils dem Zustand einer LED entspricht.

Beispiel:

Lautet das Byte 00000010 soll nur die vorletzte von acht LEDs leuchten. Lautet das Byte 11111111 sollen alle LEDs leuchten.

Leider fand ich im Netz kein Tutorial, wie man das "umrechnet" um wie bereits geschrieben aus einem Byte einzelne Zustände "herauslesen" zu können.

Ein Link oder kleiner Codefetzen dürften mir zur Erklärung evtl. schon reichen, denke ich. :)

Gruß Chris

hi,

einzelne bits lesen:

http://arduino.cc/en/Reference/BitRead

Du kannst auch direkt in einen port hineinschreiben (1 port bedient acht pins). dann mußt Du garnichts rechnen. such "arduino portmanipulation".

gruß stefan

Idealerweise bzw. elegant per stuct und einem sog. bitfeld. Es kommt drauf an was du damit genau machen willst.

Danke für Eure Antworten.

Die LEDs sollen verschiedene "Schaltzustände" an einem Bedienteil darstellen. Hierbei würde dann im Normalfall lediglich eine LED leuchten. Bei einem Fehler sollen jedoch z.B. alle leuchten.

Bin beim suchen nach einer zweckmäßigen Lösung für die Umsetzung dann auf die Bitmanipation gestoßen.

Gruß Chris

Du kannst das ganz einefach per BitRead machen.

byte LEDByte=0;   // Hier ist dein Bitmuster drinnen

void setup(){
// Hier deine Ausänge als Output deklarien
}


void loop(){
 LEDByte=B00000010;  // Vorletze LED ist an

digitalWirte(3,Bitread(LEDByte,0));     // damit liest du das Bit an Positon 0 (ganz "rechts") und schriebst das ergebniss an den Ausgang 
digitalWirte(4,Bitread(LEDByte,1));     // damit liest du das Bit an Positon 1 (vorletzte "rechts") und schriebst das ergebniss an den Ausgang
digitalWirte(5,Bitread(LEDByte,2));
digitalWirte(6,Bitread(LEDByte,3));
digitalWirte(7,Bitread(LEDByte,4));
digitalWirte(8,Bitread(LEDByte,5));
digitalWirte(9,Bitread(LEDByte,6));
digitalWirte(10,Bitread(LEDByte,7));

}

Das ist eine Q&D Lösung aber schnell umgesetzt so kannst du dir die Ausgänge auch frei zuordnen. Auchtung Positionen fangen mit 0-Index an. Das ist das (rightmost) "rechteste" Bit und 7 ist das (leftmost) "Linkeste".

Gruß Der Dani

Du kannst das dann auch mit hinterlegeten Zahlen mach

AlleAus=0 LED1an=1 LED2an=2 LED3an=4 LED4an=8 LED5an=16 LED6an=32 LED7an=64 LED8an=128

Jetzt kannst du einfach die einzuschaltenden LED addieren und und das LEDByte schreiben. alle an wäre 255. Gruß Der Dani

Cool! Dankeschööön!! :)

Gruß Chris

@volvodani: bitRead statt Bitread, nicht wahr? ;)

bitRead statt Bitread, nicht wahr?

Wer mit digitalWirte zurecht kommt, kann sicher auch raten, was Bitread bedeuten soll ;)

...hinterlegeten Zahlen mach AlleAus=0 LED1an=1

Damit meint volvodani sicher

const byte AlleAus=0;
const byte LED1an=1;
...
const byte LED8an=128;

Wenn der Michael den ersten reply gelesen hätte würde er auch den verweis auf Bitread Mitbekommen warum sollte ich dann gesagtes wiederholen. Wenn einer schon mit bitshiften um die ecke kommt kommt er auch mit digitalWrite klar. :) Ausserdem steht in der refrence alles. Gruß Der Dani

Also ich habe es verstanden. :roll_eyes:

Vertragt Euch. ;)

Gruß Chris