Forum: Compiler & IDEs Aussetzer bei einfacher Soft-PWM Anwendung


von Jan M. (jan_m)


Angehängte Dateien:

Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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

von Jan M. (jan_m)


Lesenswert?

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
Noch kein Account? Hier anmelden.