Forum: Mikrocontroller und Digitale Elektronik Mit 3Bits arbeiten, andere Möglichkeit?


von Bernds (Gast)


Lesenswert?

Ich möchte einen Kreis aus 8 Leds machen. Am besten möchte ich alles 
einfach nur hochzählen und runterzählen. Wenn ich bei 0 herunterzähl 
gelange ich auf -1. Das soll dann die 8. Led sein (7). Gibt es eine 
einfachere Möglichkeit wie das hier?
1
 
2
const uint8_t numleds = 8;
3
 if (led < 0) return (numleds - led);
4
  else return led % numleds;

von Peter II (Gast)


Lesenswert?

Bernds schrieb:
> Gibt es eine
> einfachere Möglichkeit wie das hier?

einfach nur die letzen 3 bits verwenden.

Das < 0 brauchst du nicht beachten, wenn die variabel unsigned ist.

uint8_t wert = 1;

...
wert++;
...

und beim abfragen einfach


(wert & 7)

machen.

von _C_ (Gast)


Lesenswert?

1
return led & 0x07;

von BirgerT (Gast)


Lesenswert?

Meine Vorposter haben scheinbar nicht gelesen, dass der Wert auf und ab 
gezählt werden soll?!..

Wenn Du eine von 8 LEDs von links nach rechts und wieder zurück leuchten 
lassen möchtest, müssen die ja an einem Port hängen (AVR tippe ich mal).

Wie sollen den aus dem Zähler heraus die Pins gesetzt werden?

Soll der Zähler ein Index für ein Array sein?

von Peter II (Gast)


Lesenswert?

BirgerT schrieb:
> Meine Vorposter haben scheinbar nicht gelesen, dass der Wert auf und ab
> gezählt werden soll?!..

und warum soll es nicht herunterzählen gehen? Wenn man nur die drei 
letzten Bits verwendet ist es egal wie gezählt wird. Du kannst sogar 
multiplizieren.

von _C_ (Gast)


Lesenswert?

Der TE hat bei seinem Code den er einfacher will scheinbar auch 
vergessen, dass der Wert auf und ab gezählt werden soll?!..

von BirgerT (Gast)


Lesenswert?

Peter II schrieb:
> BirgerT schrieb:
>> Meine Vorposter haben scheinbar nicht gelesen, dass der Wert auf und ab
>> gezählt werden soll?!..
>
> und warum soll es nicht herunterzählen gehen? Wenn man nur die drei
> letzten Bits verwendet ist es egal wie gezählt wird. Du kannst sogar
> multiplizieren.

_C_ schrieb:
> Der TE hat bei seinem Code den er einfacher will scheinbar auch
> vergessen, dass der Wert auf und ab gezählt werden soll?!..

Im Grunde habt Ihr ja recht..

Aber habt Ihr Euch den Code mal genauer angesehen?
Damit (led < 0) sein kann, müsste es ein int8_t sein, oder?
Und was wird zurück gegeben, wenn led == -1 ist? (8 -(-1)) = ?

Also ist da vermutlich schonmal in der Denke von Bernd etwas verkehrt.
Also erstmal fragen was er wie vorhat..

von Wolfgang (Gast)


Lesenswert?

Bernds schrieb:
> Am besten möchte ich alles einfach nur hochzählen und runterzählen.
Warum möchtest du überhaupt zählen? Meinst du vielleicht "schieben"?

von Gerald G. (gerald_g)


Lesenswert?

Wenn die 8 LEDs an einem Port hängen, würde ich mit 8 Bit rechnen.
Also einfach:
If (rechtsherum)
return (LEDport <<1) | (LEDport & 0b10000000)
else
return  (LEDport >>1) | (LEDport & 0b00000001)

von BirgerT (Gast)


Lesenswert?

Na Gut, mein Vorschlag für die LED-Animation:
Nix vor und zurückzählen, sondern ein Array mit den Bitmustern der 
einzuschaltenden LEDs verwenden, und dann ein Byte nach dem anderen  auf 
den Port mit den LEDs ausgeben.
Das Array kann auf 256 Bitmuster erweitert werden, wenn's größer werden 
soll, dann uint16_t für lr verwenden (bis zu 32767 = max. Arraygröße).
1
//
2
uint8_t lr = 0;      // "Statusmerker" Leds rot
3
uint8_t lg = 0;      // "Statusmerker" Leds grün
4
uint8_t lt = 0;      // ein Led-"Timer"
5
6
// ..auch Konstanten sind variabel ;-)
7
uint8_t const lpattern[] PROGMEM = {
8
    0b10000000,
9
    0b11000000,
10
    0b01100000,
11
    0b00110000,
12
    0b00011000,
13
    0b00001100,
14
    0b00000100,
15
    0b00001100,
16
    0b00011000,
17
    0b00110000,
18
    0b01100000,
19
    0b11000000,
20
    0b10000000
21
};
22
// Anzahl der Einträge im Array lpattern
23
#define LPATTERN (uint8_t)(sizeof(lpattern)/sizeof(lpattern[0]))  
24
25
26
// die Bitmuster aus lpattern[] an die roten Leds vorne ausgeben
27
// Diese Funktion jenach gewünschter Geschwindigkeit alle 10..200ms
28
// aus der main_loop heraus aufrufen
29
void led_player() {
30
  LED_RD_PORT = pgm_read_byte(&lpattern[lr]);
31
  if (++lr >= LPATTERN) {
32
    lr = 0;
33
  }
34
}

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.