Mit 3Bits arbeiten, andere Möglichkeit?

Gast #4221446
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;
Gast #4221472
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?
Gast #4221492
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..
Gast #4221507
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
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.