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
- Funktioniert die Datenübertragung zum WS2801 bei deinem Timing fehlerfrei? - wie lange braucht long-delay()
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.
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...
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.
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.
Sind diese Probleme mit _delay_ms() reproduzierbar? Ich werde das mal mit dem Timer versuchen... Rein interessenhalber, wo liegt das Problem bei dieser Funktion?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.