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.