Forum: Mikrocontroller und Digitale Elektronik Problem mit Code oder Hardware?


von Patrick L. (socialsmoker)


Lesenswert?

Hey
Sorry für den Nichtssagenden Betreff, mir fällt leider keine knackige 
Beschreibung ein.

Als Einstieg in die Mikrocontrollerwelt habe ich mir eine RGB-LED-Leiste 
gebaut, ein ATMEL8 steuert in Reihe geschaltete WS2801 (3-Kanal-KSQ die 
angesteuert werden kann).

Ich wollte mir nun verschiedene Effekte für diese Leiste programmieren. 
Der erste ist ein langsamer Fade von LED0 zu LEDMAX, die LEDs werden 
langsam von blau nach rot und dann wieder von rot nach blau gefadet.

Der Code (falls relevant) kann hier eingesehen werden: 
http://pastebin.com/8QQWXywk

An sich funktioniert das Ganze. Allerdings scheinen es einige der WS2801 
eiliger zu haben als andere fiel mir auf. Das ist schwer zu 
beschreiben... der Fade hat eigentlich die immer gleiche 
Geschwindigkeit, an einigen Stellen aber scheint es als würde er kurz 
Pause machen und dann schnell nachholen was er gerade verpasst hat. 
Verständlich? ;) Es ist als würde jemand mit nem Poti die Taktfrequenz 
manipulieren.

Nun habe ich grade einen zweiten Effekt einbauen wollen, und zwar das 
die LEDs zwischen gerade und ungerade aufgeteilt werden und dann jeweils 
eine dieser Gruppen gedimmt und die andere aufgehellt wird, also in etwa 
so:
oOoOoOoO -> OoOoOoOo

Auch hier verwende ich Rot und Blau gleichzeitig als Farben (eine als 
gedimmte, eine als Aufgehellte).

Obwohl beim ersten Effekt der Wechsel von rot nach blau funktioniert 
(wenn auch teilweise holprig) gibt es hier bei diesem Effekt einige 
(nicht alle!) LEDs, die den roten Anteil durchgehend anlassen.

Falls nötig hier der Code: http://pastebin.com/fDsXshUZ

Bei den LEDs bei denen der Rotanteil richtig gedimmt wird fällt außerdem 
auf, das die Phasen nicht gleichlange andauern, obwohl mir im Code kein 
Grund dafür einfällt.

Falls das bis hierhin jemand nachvollziehen kann:
Ich sehe einfach die mögliche Fehlerquelle nicht.
Die Software ist für alle LEDs die Gleiche, bei einigen funktioniert sie 
bei anderen nicht?
Die Hardware wurde ja quasi mit dem ersten Effekt erfolgreich getestet, 
dort kann der Rotteil schön gesteuert werden.

Vielleicht hat einer der Veteranen hier eine Idee?




Und nicht erschrecken beim Code, was C angeht bin ich genauso Anfänger 
wie beim Mikrocontrollern an sich :p

von Werner (Gast)


Lesenswert?

- Funktioniert die Datenübertragung zum WS2801 bei deinem Timing 
fehlerfrei?
- wie lange braucht long-delay()

von Ein Gast (Gast)


Lesenswert?

Patrick Liedtke schrieb:
> Sorry für den Nichtssagenden Betreff, mir fällt leider keine knackige
> Beschreibung ein.

Zumindest Schlagworte wie Dimmer, WS2801 oder Fading wären sinntragende 
Begriffe, die man dort unterbringen könnte. Mit deinem nichtsagenden und 
phantasielosen Betreff kann wirklich niemand etwas anfangen und das 
wirkt sich natürlich schlagartig auf die Zahl der Anworten aus.

von Patrick L. (socialsmoker)


Lesenswert?

Werner schrieb:
> - Funktioniert die Datenübertragung zum WS2801 bei deinem Timing
> fehlerfrei?

Davon gehe ich mal aus. Ich habe leider kein Oszilloskop, aber diese 
merkwürdigen Effekte treten mitten in der Mitte auf, bei der letzten LED 
läuft es so wie es soll. Deswegen denke ich müsste das Signal ja 
fehlerfrei durchgeleitet werden?!


> - wie lange braucht long-delay()

long_delay() ist einfach das hier:
void long_delay(uint16_t ms) {
    for (; ms>0; ms--) _delay_ms(1);
}

Bei Aufruf mit gleichem Parameter sollte es also eigentlich genau 
gleichlang brauchen...

von Karl H. (kbuchegg)


Lesenswert?

Patrick Liedtke schrieb:

> Der Code (falls relevant) kann hier eingesehen werden:
> http://pastebin.com/8QQWXywk

Wir sind hier ein Programmiererforum. Wir sind daran gewöhnt Code zu 
studieren. Du kannst deinen Code ruhig vollständig hier posten. Häng 
einfach die Files an.

Je umständlicher du es deinen Lesern machst, die ihrer Meinung nach 
relevanten Dinge zu studieren, desto unwahrscheinlicher wird es, dass 
sich jemand deines Problems annimmt.

von Ralph (Gast)


Lesenswert?

Patrick Liedtke schrieb:
> delay_ms

Schon wieder diese Delay()   Die Funktion gehört da aus den Libs 
gelöscht.

Das Ding macht nur Ärger und sonst gar nichts.

Wenn du eine Wartezeit für mehr als eine wenige µsec brauchst mach das 
mit einem Timer.
Es kann gut sein das dein Programm dann schon funktioniert.

von Patrick L. (socialsmoker)


Lesenswert?

Sind diese Probleme mit _delay_ms() reproduzierbar?
Ich werde das mal mit dem Timer versuchen... Rein interessenhalber, wo 
liegt das Problem bei dieser Funktion?

von Ralph (Gast)


Lesenswert?

1.
Während die Delay läuft macht der µC nichts anderes als Rechenzeit 
verbraten.
Und zwar NUR in der Delay. Wenn du also andere Funktionen in der Main 
hast müssen die warten bis Delay fertig ist.
Also nichts mit Taster einlesen, PWM berechnen,........

2.
Die Zeitangabe bei der Delay ist die Minimal zeit.
Jede Unterbrechung durch einen Interrupt VERLÄNGERT die Delay Zeit.
Beispiel : Delay (100 msec)   in diesen 100 msec gibt es 20 Interrupts a 
100 µsec
Gesamt Zeit Delay 100 msec + 20 * 100 µsec = 102 msec
Interrupts abschalten um eine genaue Delay Zeit zu bekommen ist eine 
noch schlechtere Idee.

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.