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