Forum: Mikrocontroller und Digitale Elektronik WS2812 RGB LED mit AT89C51 programmieren


von Max B. (max12)


Lesenswert?

Hallo User,


nach dem ich jetzt schon länger am suchen bin,
um wenigstens einen Ansatz zu finden wie ich am besten den WS2812 
programmiere, wollte ich mal in diesem Forum fragen und nach Hilfe 
bitten. Die meisten Ansätze die ich bis jetzt gefunden habe sind leider 
in anderen Sprache geschrieben. Ich benutze einen at89c51. Dies ist ein 
Schulprojekt.


Es wäre ganz nett, wenn mir jemand erklären würde wie ich den passenden 
Timer einfach und richtig konfigurieren kann, da ich es bisher nicht 
wirklich verstanden habe.

Es werden pro Farbe 8 Bit, also insgesamt 24 Bit seriell weitergegeben.
Für die High und Low braucht man eine spezielle sequenz.
Für ein High muss das Signal 0.7us auf HIGH und 0.6us auf LOW sein.
Für ein Low muss das Signal 0.35us auf HIGH und 0.8us auf LOW sein.
Am Ende wird noch ein Latch Command benötigt, ich weiß aber nicht was 
das ist und wie es funktioniert.

datasheet:
http://cdn.sparkfun.com/datasheets/Components/LED/WS2812.pdf

PS: Was sehr cool wäre, aber ich auch verstehen würde wenn man es nicht 
macht da es viel Zeit kostet, ist ein Beispiel Programm mit Kommentaren 
zu schreiben das ich dann nachvollziehen kann und das ich auch gleich 
direkt auf den Mikrocontroller spielen kann.

von Thomas E. (picalic)


Lesenswert?

Max Bla schrieb:
> Am Ende wird noch ein Latch Command benötigt, ich weiß aber nicht was
> das ist und wie es funktioniert.

das ist eigentlich ganz einfach eine längere Pause mit konstantem 
"Low"-Pegel. Solange die Datenübertragung weiterläuft, machen die LEDs 
nämlich nichts, außer die Daten an die jeweils nächste LED 
weiterzuleiten. Erst wenn eine Pause eintritt (lt. Datenblatt min. 50µs, 
in der Praxis geht es aber auch deutlich kürzer), stellt die LED sich 
auf die vorher übertragenen, neuen Helligkeitswerte um.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Max Bla schrieb:
> Es wäre ganz nett, wenn mir jemand erklären würde wie ich den passenden
> Timer einfach und richtig konfigurieren kann, da ich es bisher nicht
> wirklich verstanden habe.

Ein Timer ist eine Möglichkeit von vielen. Toll, falls hier einer lang 
und breit den Timer erklärt und drei Tage später jemand kommt: Mit einem 
UART und einem Inverter geht es doch viel einfacher …

Eine sehr gute Informationsquelle ist das Weblog von Tim:
https://cpldcpu.wordpress.com/tag/ws2812/

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Es kann sein, das es gar nicht funktioniert, wenn es sich hier um einen 
Standard 80C51 handelt, der mit 12MHz getaktet wird.
Die minimale Granularität ist dann nämlich 1µs, und damit sind Zeiten 
wie 0,6µs oder sowas nicht ohne externe Hardware hinzukriegen.
Selbst bei 24MHz Takt wird es hier kompliziert.

Entweder nimmt man dann einen MCS51 mit WARP Architektur (pro Oszillator 
Takt ein Befehl), oder man muss auf z.B. einen Mega8515 ausweichen, der 
wenigstens in den gleichen Sockel passt, wenn man auch am Reset Signal 
basteln muss.
Mehr Info zu der Problematik liefert das Datenblatt des AT89C51.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Max Bla schrieb:
> Ich benutze einen at89c51

Welcher Typ an welchem Quarz?

Du mußt unter 0,5µs High-Zeit kommen.
Das kann z.B. ein AT89C51RB2 im X2-Mode an 14,7456MHz.
Die Low-Zeit muß lt. Blog <9µs sein.

: Bearbeitet durch User
von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Matthias Sch. schrieb:
> Es kann sein, das es gar nicht funktioniert, wenn es sich hier um einen
> Standard 80C51 handelt, der mit 12MHz getaktet wird.

Auch nicht über UART und Inverter?

Ich kenne das Datenblatt nicht, aber 2400 KBd mit 12MHz klingt doch 
erstmal unproblematisch. Das sind 5 Takte pro UART-Bit.

Falls der UART nur Teiler von 2, 4, 8, … kann, müsste man halt mit 
9,6MHz takten und die Baud-Rate auf 1/4-Teiler stellen.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Torsten C. schrieb:
> Ich kenne das Datenblatt nicht

Schon mal gar nicht gut - das ist Grundlagenliteratur...

Torsten C. schrieb:
> aber 2400 KBd mit 12MHz klingt doch
> erstmal unproblematisch

2400 kbit/s? Nö, ist nicht drin. Die UART in der MCS51 Standardfamilie 
wird von einem Timer getaktet und kann damit nur so schnell wie dieser 
sein. Die höchste erzielbare Baudrate bei 12MHz Takt ist also 750.000 
bit/s.
http://www.keil.com/products/c51/baudrate.asp
Das sind also in deiner Schreibweise 750 kbit/s.

von Peter D. (peda)


Lesenswert?

Torsten C. schrieb:
> aber 2400 KBd mit 12MHz klingt doch
> erstmal unproblematisch.

Welche UART kennst Du denn überhaupt, die 5 Takte kann?
Typischer Weise teilen UARTs erstmal /16 und dann durch den 
Baudratengenerator.

Bei der 8051-UART gibt es den Mode 0, der durch 2 oder 4 teilt (5 geht 
aber nicht).
Wenn man dann noch nen 1-Clocker nimmt (AT89LP51), kommt man mit 20MHz 
Quarz auf 10MBaud.

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.