Aussetzer bei einfacher Soft-PWM Anwendung

OP #2644155
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
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #2644417
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...
Moderator Persönliche Seite #2644759
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
OP #2645626
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]));
      }

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.