Schönen guten Abend liebe Forengemeinde. Ich habe die Standard-Soft-PWM Routine verwendet und will die LEDs einfach nur zufällig auf und abdimmen. Dabei soll es keine Sprünge geben und die Werte werden immer in Zwischenschritten nachgeführt. Das ganze schaut so in der mainschleife aus: if(wert [i] < wert_neu [i]) { (wert [i])++; } if(wert [i] > wert_neu [i]) { (wert [i])--; } if(wert [i] == wert_neu [i]) { wert_neu [i] = rand()%(255); } Das zufällige dimmen klappt soweit aber relativ oft gibt es Komplettaussetzer, das heißt alle LEDs werden dunkel und flackern hin und her bis es sich wieder fängt. Habe dafür verschiedneen PWM Frequenzen versucht. Woran könnte es liegen? Grüße Jan
Jan M. schrieb: > alle LEDs werden dunkel und flackern hin und her Brown-Out? Bricht deine Versorgungsspannung zusammen? Wie sieht die Schaltung (Entkopplung) aus? > flackern hin und her Das hört sich nach Bewegung an. Du solltest die LEDs besser befestigen. BTW: wert_neu [i] = rand()%(255); Da wird der Compiler wohl einfach das %(255) weglassen...
Jan M. schrieb: > if(wert [i] < wert_neu [i]) > { > (wert [i])++; > } > > if(wert [i] > wert_neu [i]) > { > (wert [i])--; > } > > if(wert [i] == wert_neu [i]) > { > wert_neu [i] = rand()%(255); > } Unabhängig vom geschilderten Problem eine Anmerkung: Dein Code ist supoptimal, weil immer alle 3 Bedingungen geprüft werden, obwohl sie sich ausschließen. Effizienter ist das:
1 | if(wert [i] < wert_neu [i]) |
2 | {
|
3 | (wert [i])++; |
4 | }
|
5 | else if(wert [i] > wert_neu [i]) // hier else einfügen |
6 | {
|
7 | (wert [i])--; |
8 | }
|
9 | else // mit else entfällt if komplett |
10 | {
|
11 | wert_neu [i] = rand()%(255); |
12 | }
|
Wenn der aktuelle Wert kleiner ist, werden die beiden anderen Bedinungen dann gar nicht mehr geprüft. Wenn der aktuelle Wert größer ist, dann braucht nicht mehr auf Gleichheit geprüft zu werden. Zu Deinem eigentlichen Problem: Überprüfe die in der ISR benutzten Variablen auf volatile-Definition. Zumindest isr_ptr_time und isr_ptr_mask sind für mich verdächtige Kandidaten. Gruß, Frank
Vielen Dank euch beiden! Die Anmerkungen waren sehr passend. Das Problem lag aber einfach nur daran, dass ich den PWM Wertebereich überschritten habe und die LED deshalb komplett ausging wenn eine neue Zufallszahl kam, demnach wohl eine 0. Nun habe ich eine weitere Frage: Das Programm klappt soweit aber ich würde für jede einzelne LED gerne das Zufalls-Fade-Intervall anpassen. Habe das versucht so zu implementieren uint8_t start[8] = {70,80,90,100,110,120,130,140}; uint8_t zufall[8] = {160,150,140,130,120,110,100,90}; if(wert [i] < wert_neu [i]) { (wert [i])++; } else if(wert [i] > wert_neu [i]) { (wert [i])--; } else { wert_neu [i] = start[i] + (rand()%(zufall[i])); }
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.