Forum: Mikrocontroller und Digitale Elektronik ws2812, light_ws2812, examples undurchsichtig


von julius (Gast)


Lesenswert?

hi,


mein led Streifen ist endlich angekommen, also gleich mal die .zip vom 
light_ws2812 library von cpldcpu runtergeladen und entpackt.


Es gibt einen Unterordner mit dem namen: ./light_ws2812_AVR
Das wird wohl der für AVR's sein.

in diesem Verzeichnis liegt eine Makefile, ein simples make baut die 3 
Beispiele unter Examples - In der Makefile wird CPU Typ und Frequenz 
angegeben.

Unter Examples gibt es dann:
Rainbow.c
mit der Erklärung:
This example is configured for a Atmega32 at 16MHz
- Warum, die Software wurde doch speziell dafür entwickelt um 
Timergefrickel und andere unschöne Sachen zu vermeiden...warum jetzt 
solche Kommentare wenn gerade erst die CPU definiert wurde?


RGB_blinky.c
This example is configured for a ATtiny85 with PLL clock fuse set and
- Wieder, warum?


RGBW_blinky.c
* This example does only work with the SK6812RGBW LEDs
- Was auch immer das sein mag, aber wohl kein WS2812



Hat jemand ein Beispiel für dieses Library das eine feste Anzahl von 
LED's durchläuf?

von Michael U. (amiga)


Lesenswert?

Hallo,

Du suchst also keine Libray sondern ein fertiges Programm für Deine 
Anzahl LEDs und Deinen AVR.

Die Lib bietet Funktionen an um das Programmieren einfacher zu machen.
Die Beispiele sollen zeigen, wie man mit der Lib umgeht, wie man die 
Funktionen benutzt, welche Einstellungen abhängig vom Prozessor nötig 
sind usw.

Beispiele eben, programmieren mußt Du Deine konkrete Anwendung wohl 
selbst.

Gruß aus Berlin
Michael

von julius (Gast)


Lesenswert?

Ein paar Worte zum Einstieg mit dem lib wären einfach nett gewesen, das 
hier:

http://electronics.stackexchange.com/questions/180896/ws2812b-with-atmega8-and-light-ws2812-libray


hab ich jetzt zum "laufen" bekommen.
naja, die ersten 4 leds strahlen rot.


ws2812_setleds(led,4);    auf ws2812_setleds(led,10);    geändert.
jetzt leuchten zwar die ersten 10 leds, rot. aber wozu dient denn struct 
cRGB led[4] ?


und auch sehr interessant, eines der mitgelieferten beispiele 
geflashed...einfach mal die doku ignoriert. jetzt sind immer noch 10 
leds rot, und die erste "versucht" zu blinken. rot, grün....tot....rot

trotz trennung der strumzufuhr, steckt der code für die leds nicht im 
uc?
sprich neuer code, neue leuchtfolge?

von Stefan S. (sschultewolter)


Lesenswert?

Du hast einfach nur keine Ahnung, wie du das ganze mit deinem Controller 
löst. Desweiteren ignorierst du die Doku des Lib.

ws2812_setleds(led,x); Das x gibt NICHT die Anzahl an Leds an!!

von julius (Gast)


Lesenswert?

Danke für die Liebe Antwort.
Wo ist denn die Doku?

im git repo gibts die readme, da steht nur was es können soll.
in light_ws2812.c stehen ein paar kommentare, aber nichts wirkliches.

von Stefan S. (sschultewolter)


Lesenswert?

Tim hat das ganze in meinen Augen sehr gut (kurz und informativ) 
ausgedrückt in der Readme. Desweitern reichen die Kommentare in der 
header-Datei für die Bedienung als Readme/Wiki aus.
1
Add "light_ws2812.c", "light_ws2812.h" and "ws2812_config.h" to your project.
2
Update "ws2812_config.h" according to your I/O pin.
3
Make sure F_CPU is correctly defined in your makefile or the project. (For AtmelStudio: Project->Properties->Toolchain->AVR/GNU C Compiler->Symbols. Add symbol F_CPU=xxxxx)
4
Call "ws2812_setleds" with a pointer to the LED array and the number LEDs.
5
Alternatively you can use "ws2812_setleds_pin" to control up to 8 LED strips on the same Port.

Ansonsten sollten die Beispiele schon ausreichend sein, um einen Code 
auf die Beine zu stellen.
Hier mal ein Test
1
#include <util/delay.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include "light_ws2812.h"
5
6
const uint8_t NUM_LEDS = 24; // Anzahl Leds
7
struct cRGB leds[NUM_LEDS];
8
9
int main(void)
10
{
11
  while(1)
12
  {
13
    for(uint8_t step = 0; step < NUM_LEDS; step++)
14
    {
15
      // Led einschalten
16
      leds[step].r = 255;
17
      leds[step].g = 255;
18
      leds[step].b = 255;
19
      ws2812_setleds(leds, NUM_LEDS);
20
      
21
      _delay_ms(500);
22
23
      // Led ausschalten
24
      leds[step].r = 0;
25
      leds[step].g = 0;
26
      leds[step].b = 0;
27
      ws2812_setleds(leds, NUM_LEDS);
28
    }
29
  }
30
}


Ansonsten wäre der Weg für die vermutlich besser -> Arduino und FastLED!

von julius (Gast)


Lesenswert?

Wenn man:
const uint8_t NUM_LEDS = 24; // Anzahl Leds

mit
#define NUM_LEDS 60


tauscht funktioniert es. Danke.


Den oberen Code in das Verzeichnis (.zip vom light_ws2812 github archiv 
laden/entpacken):
light_ws2812/light_ws2812_AVR/Examples/testleds.c

kopieren, und die vorhandere Makefile um folgendes erweitern (testleds 
am ende ist neu):
EXAMPLES  = RGB_blinky RGBW_blinky Chained_writes testleds

damit die for schleife gültig ist:
CFLAGS+= -std=gnu99

Dann noch:
F_CPU = 8000000
DEVICE = atmega32

anpassen und make laufen lassen.

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.