Feineres Statusmanagement/ Bitmanipulation mit jeweils mehr als zwei Zuständen

Hallo,

ich habe ein mittlerweile recht großes Projekt, bei dem ich mehrere LEDs mithilfe von Bitmanipulation steuere.

Beispielsweise geschieht dies folgendermaßen:

if (val_2 != Knopf_2_State)                                
{                          
  if (val_2 == HIGH)                                       
  {
    Serial3.print("RTE 2\rFREEZ 0\r");
    Serial.println("Anfrage: Taste 2 wurde gedrueckt!");
    LEDbit=LEDbit & LEDloeschmaske;
    LEDbit=LEDbit | 0b00000010;
    LEDschaltvorgang(LEDbit);
  }
}

Ein Druck auf diese Taste löst nach einer Bitmanipulation im Anschluss den Schaltvorgang aus:

void LEDschaltvorgang(byte LEDbeschaltung)
{
  digitalWrite(LED_1, (LEDbeschaltung&1)==1?HIGH:LOW);
  digitalWrite(LED_2, (LEDbeschaltung&2)==2?HIGH:LOW);
  digitalWrite(LED_3, (LEDbeschaltung&4)==4?HIGH:LOW);
  digitalWrite(LED_4, (LEDbeschaltung&8)==8?HIGH:LOW);
  digitalWrite(LED_5, (LEDbeschaltung&16)==16?HIGH:LOW);
  digitalWrite(LED_6, (LEDbeschaltung&32)==32?HIGH:LOW);
}

LEDs können somit aus und eingeschaltet werden. Funktioniert soweit gut.

Mein Problem ist nun, dass es mir für dieses Projekt nicht mehr reicht zu wissen, ob eine LED an oder aus ist, sondern die LEDs werden auch noch diverse andere Zustände annehmen können, wie z.B. "schnelles Blinken" oder "langsames Blinken".

Da ein Bit jedoch leider nur zwei Zustände "kennt", komme ich an dieser Stelle nun leider nicht mehr weiter.

Kann mich vielleicht jmd. auf die richtige Spur führen, wie ich meinen Code "umbauen" kann?

Ich stelle es mir (in Pseudocode geschrieben) grob so vor:

LEDbit = 00040210;

// LED_1 ist aus
// LED_2 ist an
// LED_3 blinkt langsam
// LED_4 ist aus
// LED_5 blinkt sehr schnell
// LED_6 ist aus

Gruß Chris

Ganz so einfach lässt sich das nicht lösen. Entweder speicherst du immer in 2,3 oder 4 Bit den Status den die LED gerade haben soll oder du nimmst gleich eine neue 8 Bit Variable und speicherst dort für jede LED den Status.

Zu dem benötigst du noch Funktionen die im Hintergrund ablaufen und das Blinken bzw die Aktion umsetzen. Diese Funktionen müssen dann zyklisch aufgerufen werden, ansonsten sieht das Blinken nicht gleichmäßig aus.

Ich kann mal ein Beispiel auf Basis von simpleThreads basteln, welches deine Ansprüche erfüllt.

Guten morgen,

dass im Hintergrund noch weitere Funktionen laufen müssten, wäre dann mein nächstes Problem. :smiley:

Wäre super, wenn Du was basteln könntest. Bin lernwillig. :stuck_out_tongue:

Gruß und danke- Chris

Schau dir den Link den ich dir oben gegeben habe schon mal an. Ich bastel gerade ...

So im Anhang befindet sich ein Beispiel.

Ich habe die digitalWrite Funktion auskommentiert. Das Beispiel arbeitet nur mit der Konsole (Serielle Ausgabe). Schau es dir einfach mal in Ruhe an. Wenn man mit simple Threads arbeitet ist der Programmaufbau ein wenig anders da man viele Setup und Loop Funktioin hat. Im ersten Moment ist es komplizierter, aber später kann man damit wesentlich einfacher komplizierte Abläufe realisieren.

Das Demo Programm wird alle 10 Sekunden aufgerufen und beinhaltet 3 unterschiedliche Programmabläufe.
Blink Fast wird alle 250 ms aufgeurfen.
Blink Slow jede Sekunde.

Die Loop Funktion alle 20 ms, diese ist aber leer und ruft keinen Programmcode auf.

An der orginal Loop und Setup Funktion sollte nicht viel verändert werden.

Fragen beantworte ich gerne.

blink_led_example_with_simple_threads.rar (2.16 KB)

Was es auch noch gibt sind Bitfelder mit structs:

Da hat man einzelne Bits in einem Konstrukt und jedes Bit hat einen Namen. Habe ich aber noch nicht ausprobiert.

In das struct kannst du auch noch beliebige andere Daten packen.

Argh! Liest sich beides (auf den ersten Blick für mich als Laie) kompliziert.

Geht das nicht einfacher und gibt es da keine Bibliothek für? :frowning:

So ein spezieller Fall ist das doch jetzt auch nicht, was ich da machen möchte, oder?

Gruß Chris

@Serenifly
Die sind mir auch neu, man lernt eben nie aus :wink:

@Chris72622
Du kannst auch alles per Hand schreiben, dann wird dein Quellcode aber schnell unübersichtlich und du kannst den Quellcode später schlecht für andere Projekte weiter verwenden und müsstest alles neu schreiben. Schau dir das Beispiel doch erstmal in Ruhe an. :wink:

Ok, Jomelo,

ich hab mir Deine Library schon geladen. Werd mir auch die anderen Beispiele von Dir angucken. Danke!

Gruß Chris

Das könnte so aussehen:

struct leds {
   byte led1: 1;
   byte led2: 1;
   byte led3: 1;

   byte led1Speed: 1;
   ....
} myLeds;

ledxSpeed könnte da auch den Wert 2 haben für 2 Bits und vier Zustände.

Man kann das dann einfach ansprechen:
myLeds.led1 = 1;
myLeds.led3 = 0;

structs können auch Methoden haben. Also man kann auch Methoden einfügen um mehrere LEDs auf einmal zu setzen.

Wofür sich das aber nicht so eignet sind shift-Operationen. Das wird da recht kompliziert.