www.mikrocontroller.net

Forum: GCC Aussetzer bei einfacher Soft-PWM Anwendung


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Jan M. (jan_m)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite Flattr this
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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...

Autor: Frank M. (ukw) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
if(wert [i] < wert_neu [i])
{
  (wert [i])++;
}
else if(wert [i] > wert_neu [i])        // hier else einfügen
{
  (wert [i])--;
}
else                                    // mit else entfällt if komplett
{
  wert_neu [i] = rand()%(255);
}

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

Autor: Jan M. (jan_m)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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]));
      }

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net