Hallo, Ist meine init für die 3Hardware Kanäle richtig eingestellt für 8bit. Ich möchte damit eine RGBD Led faden. Der Atmega8 läuft mit 16Mhz // OC1A, OC1B, OC2 auf Ausgang DDRB = (1 << PB1 ) | (1 << PB2 ) | (1 << PB3 ); TCCR1A = (1<<COM1A1) | (1<<WGM10); // PWM Phase correct, 8Bit // Clear OCR1A/B on Compare Match when up-counting. // Set OCR1A/B on Compare Match when downcounting. TCCR1B = (1<<CS10); // keinen Vorteiler TCCR2 = (1<<WGM20) | (1<<COM21) | (1<<CS20); // PWM Phase correct, 8Bit // Clear OC2 on Compare Match when up-counting. // Set OC2 on Compare Match when downcounting. // keinen Vorteiler //Maximale Helligkeit OCR1A = 255; // der Zähler zählt bis zu diesen Werten OCR1B = 255; OCR2 = 255;
Kay O. schrieb: > TCCR1A = (1<<COM1A1) | (1<<WGM10); // PWM Phase correct, 8Bit > // Clear OCR1A/B on Compare Match > when up-counting. Wenn du auf OC1B das gleiche machen möchtest wie auf OC1A, dann solltest du noch das COM1B1 Bit setzen, sonst passiert auf OC1B nix. > // keinen Vorteiler Das würde ich mir nochmal überlegen. Bei 16Mhz liegt die PWM Frequenz dann bei 31,25 kHz und stresst deine Endstufe ganz schön. Aus Erfahrung ist eine PWM Frequenz von etwa 4kHz zum flimmerfreien Dimmen von LED ausreichend. Gehen tuts aber auch mit 31 kHz.
:
Bearbeitet durch User
Kay O. schrieb: > Ist meine init für die 3Hardware Kanäle richtig eingestellt für 8bit. Nicht ganz. Hier fehlt noch ein Bit: > TCCR1A = (1<<COM1A1) | (1<<WGM10);
Ich hab das jetzt erstmal so das geht auch, ist sicherlich nicht ganz richtig. Bei OCR2 Flackerte meine Led. vielleicht könnte mir nochmal einer weiterhelfen das ich auf allen 3Kanälen die gleiche Frequenz habe und das alle 3Kanäle 8bit sind.
1 | TCCR2 = (1<<WGM20|1<<COM21|0<<COM20|1<<CS22|0<<CS21|0<<CS20); |
2 | |
3 | TCCR1A = (1<<COM1A1|1<<COM1B1|1<<WGM10); //;COM1A1,COM1A0,COM1B1,COM1B0,COM1C1,COM1C0,WGM11,WGM10 |
4 | |
5 | TCCR1B = (0<<CS12|1<<CS11|1<<CS10); // ;ICNC1,ICES1,WGM13,WGM12,CS12,CS11,CS10 |
Kay O. schrieb: > TCCR2 = (1<<WGM20|1<<COM21|0<<COM20|1<<CS22|0<<CS21|0<<CS20); Sach mal, liest du ab und zu mal Datenblätter? Ich habe dir doch oben beispielhaft mal eine PWM Frequenz genannt und du rätst bei den Prescalern jetzt einfach nur rum. Klar, 488 Hz sieht man nun mal flimmern. > TCCR1B = (0<<CS12|1<<CS11|1<<CS10); Und hier genauso. Lies also mal die Registerbeschreibung von TCCR2 und TCCR1B. Die Klammern aus deinem ersten Beitrag schaden übrigens keineswegs. Mach die mal wieder rein.
:
Bearbeitet durch User
ich hatte gefragt ob mir das vielleicht einer Erklären kann die Berechnung für den vorteiler , da ich nicht so richtig klarkomme wie die passende Frequenz berechnet wird.
Kay O. schrieb: > wie die passende Frequenz berechnet wird. Welches ist denn "die passende Frequenz"? Mit welcher Frequenz soll denn deine LED "flackern"? Wenn du diese Frequenz hast, dann multiplizierst du sie mit 256 und hast die Frequenz, die du am Zählereingang brauchst. Und dann nimmst du die 16MHz und teilst sie durch diese Zählereingangsfrequenz und bekommst den nötigen Vorteiler.
Kay O. schrieb: > vielleicht könnte mir nochmal einer weiterhelfen das ich auf allen > 3Kanälen die gleiche Frequenz habe und das alle 3Kanäle 8bit sind. Wie schon weiter oben gesagt, war dein ursprüngliches Programm bereits fast vollständig korrekt, bis auf das eine fehlende Bit für die Ausgabe auf OC1B. Warum hast du das nicht erstmal einfach nur ergänzt und gut isses? Die Anmerkung von 'Kay O.' ist zwar nicht ganz von der Hand zu weisen, aber wie er ja auch schon selber schrieb: funktionieren muss es erstmal auch mit 31kHz. Wenn du dann die PWM-Frequenz durch veränderte Prescaler absenken willst, spricht da natürlich auch nix dagegen. Nimmst du einfach die beiden Tabellen der möglichen Prescaler für Timer1 und Timer2, legst sie nebeneinander und suchst dir erstmal die übereinstimmenden Teilerfaktoren heraus. Dann rechnest du zu jedem der übereinstimmenden Teiler die sich ergebende Frequenz aus und wählst dann was passendes aus. Hier würde ich übrigens die Grenze viel niedriger ansetzen als 'Kay O.'. Schon alles oberhalb ca. 200Hz ist gut brauchbar, da sollte nix flimmern und schon garnix flackern. Nur (vorsichtig ausgedrückt) "besonders sensitive" Personen sehen da eventuell aus den Augenwinkeln noch ein leichtes Flimmern. Möchte mal wissen, wie die damals(tm) TV geguckt haben, als die Dinger allesamt noch mit 50(!)Hz liefen... Wie auch immer. Wenn du den passenden Prescalerfaktor ausgewählt hast, dann entnimmst du der Tabelle für den jeweiligen Timer einfach die jeweils zu setzenden Bits und schreibst die in deinen Quelltext und fertig. Denn ansonsten gibt es daran nix zu ändern.
Lothar M. schrieb: > dann multiplizierst du sie mit 256 Bei 'Phase Correct PWM' sinds doch 512, oder? Aber das spielt hier ja nicht wirklich die grosse Geige. c-hater schrieb: > Schon alles > oberhalb ca. 200Hz ist gut brauchbar, da sollte nix flimmern und schon > garnix flackern. Probiers mal aus - sehr dunkel gedimmte LED sieht man auch bei 200Hz Flimmern, vor allem bei Bewegungen (des Kopfes oder der LED). Ich hab damit mal rumgespielt und einen brauchbare Kompromiss bei so 3-4 kHz gefunden.
Matthias S. schrieb: > Probiers mal aus - sehr dunkel gedimmte LED sieht man auch bei 200Hz > Flimmern Ich persönlich seh' schon bei 100Hz kein Flimmern mehr. Aber klar: ich bin erstens scheissealt und war zweitens auch nie "besonders sensitiv" veranlagt... Was ich mich aber frage: was würde von deiner offensichtlich weit über der Norm der menschlichen Wahrnehmung liegenden gehobenen Sensitivität in einem Doppelblindtest tatsächlich über bleiben?...
c-hater schrieb: > Ich persönlich seh' schon bei 100Hz kein Flimmern mehr. Aber klar: ich > bin erstens scheissealt und war zweitens auch nie "besonders sensitiv" > veranlagt... Dann nimm mal im dunklen Raum eine Punktlichtquelle und bewege den Kopf zügig. Du siehst nicht irgendwelches Flimmern, sondern die Lichtpunkte.
Wolfgang schrieb: > ....und bewege den Kopf > zügig. Kann er nicht mehr, denn er ist: c-hater schrieb: > ....ich > bin erstens scheissealt und war zweitens auch nie "besonders sensitiv" > veranlagt... ;-) MfG Paul
Wolfgang schrieb: > c-hater schrieb: >> Ich persönlich seh' schon bei 100Hz kein Flimmern mehr. Aber klar: ich >> bin erstens scheissealt und war zweitens auch nie "besonders sensitiv" >> veranlagt... > > Dann nimm mal im dunklen Raum eine Punktlichtquelle und bewege den Kopf > zügig. Du siehst nicht irgendwelches Flimmern, sondern die Lichtpunkte. Ist wohl irgendwie logisch, denn die einzelnen kurzen Sendepulse liegen dann wie aufgereiht auf einer Perlschnur im Auge vor bereit gelesen zu werden. Ist es eine kontinuierliche Lichtquelle wird's wohl ein Strich sein den man sieht. Kurt
so, ich habe mit 1khz gerechnet: 1000x256 = 256000 16000000:256000 = 62,5Teiler 62,5 gibs aber nicht laut Datenblatt da hab ich 64 genommen. ist das so richtig?
1 | TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10); |
2 | |
3 | TCCR1B = (0<<CS12)|(1<<CS11)|(1<<CS10); // teiler64 |
4 | |
5 | TCCR2 = (1<<WGM21)|(1<<WGM20)|(1<<COM21)|(1<<CS22);// teiler64 |
Wolfgang schrieb: > Dann nimm mal im dunklen Raum eine Punktlichtquelle und bewege den Kopf > zügig. Du siehst nicht irgendwelches Flimmern, sondern die Lichtpunkte. Ah, jetzt ja. Jetzt erkenne ich das Problem. Ich bin einfach noch nicht alt genug. Jedenfalls wackelt mit der Kopf normalerweise noch nicht derart, dass mir das auffallen könnte... Naja, reden wir in zehn Jahren oder so nochmal drüber... Allerdings: Flimmern oder Flackern ist das auch mit derart krankhaftem Kopfwackeln noch nicht, oder? Und ich frage da jetzt echt den Fachmann...
Kay O. schrieb: > ist das so richtig? > >
1 | > TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10); |
2 | >
|
3 | > TCCR1B = (0<<CS12)|(1<<CS11)|(1<<CS10); // teiler64 |
4 | >
|
5 | > TCCR2 = (1<<WGM21)|(1<<WGM20)|(1<<COM21)|(1<<CS22);// teiler64 |
6 | >
|
Nein. Wieso änderst du bei jeder Iteration den Modus, in dem du den Timer betreiben willst? Das ist entweder Trolligkeit vom Feinsten oder völlige Idiotie. In jedem Fall ist dir nicht zu helfen. Denn auch Trolligkeit ist eine Form von Idiotie.
c-hater schrieb: > Kay O. schrieb: > >> ist das so richtig? >> >>
1 | >> TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10); |
2 | >>
|
3 | >> TCCR1B = (0<<CS12)|(1<<CS11)|(1<<CS10); // teiler64 |
4 | >>
|
5 | >> TCCR2 = (1<<WGM21)|(1<<WGM20)|(1<<COM21)|(1<<CS22);// teiler64 |
6 | >>
|
> > Nein. > > Wieso änderst du bei jeder Iteration den Modus, in dem du den Timer > betreiben willst? Das ist entweder Trolligkeit vom Feinsten oder völlige > Idiotie. > > In jedem Fall ist dir nicht zu helfen. Denn auch Trolligkeit ist eine > Form von Idiotie. Ich habe höflich gefragt und bekomme von ihnen nur oberflächlichen aussagen dies und jenes sei nicht richti . kann man mir nicht helfen da ich nicht so bewandert bin.
Kay O. schrieb: > kann man mir nicht helfen da ich nicht so bewandert bin. Blablabla. Wir haben dir jetzt mehrfach geholfen, indem wir selber im Datenblatt rumgewühlt haben - nun ist es bei dir, zu lesen und das Datenblatt in dein Programm umzusetzen.
Hallo lieber TO, beschreib doch mal was Du machen willst. Schreibe Dir gerne das eine oder andere C Programm!
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.