Forum: Compiler & IDEs PWM und Led Dimmen


von Matthias K. (gidarrnmatze)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Ich bin neu hier und wollte erst einmal ein riesen Lob an diese tolle 
Homepage aussprechen. Ich arbeite erst seit ca. 2 Wochen mit den AVR 
Mikrocontrollern und hab mir alles über diese Seite beigebracht.

Das Programm soll folgendes machen:
Durch drücken von Taster 0 am Port D soll eine LED hoch gedimmt werden.
Durch erneutes Drücken kann runter gedimmt werden.
Die Vorgänge werden jeweils komplett ausgeführt.
Als Board hab ich ein STK500 verwendet.
Chip ist ein ATMega8

Nun wollte ich Euch mal zu meinem ersten Programm im Anhang folgendes 
Fragen:
wie findet ihr den Quelltext? was kann man verbessern? ist das so 
sinnvoll?

Und warum läuft die LED so soft hoch wenn ich den 8 Bit Modus im PWM 
verwende?
im 10 Bit Modus flackert die LED so seltsam...

Danke für Eure Antworten

mfg
Matthias

von Karl H. (kbuchegg)


Lesenswert?

Matthias Kugler schrieb:

> Nun wollte ich Euch mal zu meinem ersten Programm im Anhang folgendes
> Fragen:
> wie findet ihr den Quelltext? was kann man verbessern? ist das so
> sinnvoll?
1
//OCR1A ist verantwortlich für die verschiedenen PWM Werte
2
//OCR1A soll sich immer von 0x0000 bis maximal 0x00FF bewegen!
3
4
  OCR1A = 0x0000 | dimmer;

Mit 0 zu verodern ist nicht sinnvoll. Dadurch verändert sich die Zahl 
nicht. Daher ist das eine Operation bei der sich der geneigte Leser 
fragt: Hääää? Was will mir der Dichter hier sagen? Ist das Absicht oder 
hat er einen Fehler gemacht?
1
 
2
 // 8-Bit PWM // PWM invertiert // Vorteiler = 1
3
  TCCR1A = (1<<COM1A1) |(1<<COM1A0)| (1<<WGM10);
4
  TCCR1B = (1<<CS10); 
5
6
7
  //  den Endwert (TOP) für den Zähler setzen
8
  //  der Zähler zählt bis zu diesem Wert
9
  // Hier: 256
10
  ICR1 = 0x00FF;
Gewöhn dir die Arbeitsweise an:
In main werden am Anfang alle beteiligten Komponenten konfiguriert und 
dann wird nur noch das verändert was verändert werden muss. Dein Timer 
macht sowieso ständig eine PWM, also kommt die Konfiguration dafür an 
den Anfang der main() und in der pwm() Funktion wird nur noch der 
Tastgrad entsprechend umgestellt. Es ist hier nicht notwendig, jedesmal 
an den Konfigurationsbits bzw. den Vorteilerbits rumzuspielen.

1
    // Leuchte kann nur hochgedimmt werden wenn der Taster0 Low UND der Stand 0 ist.
2
  while((!(PIND & (1<<PIND0))) & (Stand == 0)) {
3
 
4
        for(i=0; i<=255; i++) {
5
      //Aufrufen der Funktion pwm
6
      pwm(i);
7
        _delay_ms(20);
8
     }
9
    Stand = 1;
10
   }
Diese while Schleife ist als Schleife überflüssig, weil sie sowieso nur 
ein einziges mal augeführt werden kann. Durch die "Stand" Variable dreht 
sich die Schleife quasi selber den Hahn ab. Ein normales if würde es 
auch tun.
1
  while((!(PIND & (1<<PIND0))) & (Stand == 0)) {
Auf den Unterschied zwischen binärem Und (&) und logischem Und (&&) 
achten! An dieser Stelle willst du ganz sicher kein binäres Und sondern 
ein logisches!

> Und warum läuft die LED so soft hoch wenn ich den 8 Bit Modus im PWM
> verwende?
> im 10 Bit Modus flackert die LED so seltsam...

Rechne mal ein wenig, wie lange der Timer braucht um einmal den 
Zahlenbereich 0 bis 255 (im 8 Bit Modus) zu durchlaufen und wie lange 
dasselbe im 10 Bit Modus (0 bis 1024) dauert. Wenn du die Zeiten kennst, 
kannst du daher ausrechnen wieviele Flackerer (denn nichts anderes ist 
ja eine PWM) du daher in der Sekunde hast. Ist diese Anzahl über einem 
Grenzwert, dann sieht dein Auge kein Flackern mehr sondern eine ruhig 
glimmende LED. Ist die Anzahl zu gering, dann siehst du das Flackern. 
Ist wie im Kino: Wenn deinem Auge mindestens 24 Bilder in der Sekunde 
präsentiert werden, dann siehst du flüssige Bewegung. Sind es weniger, 
dann ist das eine zackige Abfolge von Bildern.

von Matthias K. (gidarrnmatze)


Lesenswert?

Prima, deine Antworten haben mir sehr geholfen.
Auf vieles wär ich allein so schnell wohl nicht gekommen!

Dankeschön
Gruß
Matthias

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.