Guten Tag,
ich spiele derzeit ein bißchen mit dem Atmega8 rum.
Bin grad dabei mit der Hardware PWM mich zu beschäftigen, mein Problem
ist derzeit.
Wenn ocr2= 10 ist flackert die Led ein bischen woran könnte das liegen.
OCR1AL = 10 OCR1BL = 10 flackern bei diesen Werten nicht.
vielleivcht könnte mir einer weiterhelfen.
mfg
Das Ganze kann nicht so funktionieren wie du das Initialisierst.
Du setzt TCCR2, das ist ein Register vom 8-Bit Zähler 2.
Dann setzt du aber TCCR1A & TCCR1B, das sind aber Register vom 16-Bit
Zähler 1.
Dann schreibst du von OCR2 = 10 was wiederum zu den 8-Bit Zähler gehört.
Dann schreibst du auf einmal wieder von den Registern OCR1AL und OCR1BL.
Das sind dann wieder Register vom 16-Bit Zähler.
Die Registernamen mit 2 haben nichts mit den Registernamen mit 1 zu tun!
Im Datenblatt vom ATmega8 ist PWM sehr gut beschrieben. Einfach mal
nachlesen!
Und vor allem erst mal sich einig sein, ob man eine 8-Bit PWM (Zähler2)
oder 16-Bit PWM (Zähler1) haben möchte. Dann die entsprechenden zu den
Zähler dazugehörigen Register anhand der Tabelle und
Registerbeschreibungen im Datenblatt setzen und herumprobieren was
passiert, wenn man z.B. die WGM-Bits verändert...
Eigentlich sollte das schon funktionieren; auch war mein erster Einwand
mit den Klammern falsch (ich kann mir nie die Hierarchie merken).
Wenn ich versuche, das Programm lauffähig zu ergänzen und die Ausgänge
auf einen ATmega16 anpasse, dann flackert da zumindest nichts und schon
gar nicht unterschiedlich. Es muss an etwas liegen, was hier nicht
gezeigt wurde.
Also da hatte ich ein _delay_ms eingefügt, und außen herum ein while(1)
gesetzt. Dann läuft die Helligkeit erst langsam hoch und pendelt dann im
oberen Bereich, für alle drei LEDs gleichmäßig. Die Aussage, nur die LED
an Timer2 flackere, kann ich nicht nachvollziehen, schließlich ist die
Initialisierung für beide Timer ja auch gleich.
ROLF schrieb:> Wenn ocr2= 10 ist flackert die Led ein bischen woran könnte das liegen.> OCR1AL = 10 OCR1BL = 10 flackern bei diesen Werten nicht.
10 von 2^16 sind 0% (Timer1)
10 von 2^8 sind 4% (Timer2)
Deine Frage:
Ich setze 2 UNTERSCHIEDLICHE Timer auf GLEICHE Werte. Wieso habe ich
NICHT das GLEICHE verhalten?
mfg
> 10 von 2^16 sind 0% (Timer1)> 10 von 2^8 sind 4% (Timer2)
Auch bei Timer1 ist es nur 2^8, schließlich ist WGM10 gesetzt, das heißt
"PWM, Phase Correct, 8-bit", mit TOP=0x00FF.
Bud schrieb:> Und vor allem erst mal sich einig sein, ob man eine 8-Bit PWM (Zähler2)> oder 16-Bit PWM (Zähler1) haben möchte.
Hat der TE doch gemacht. Sobald WGM10 beim Timer 1 gesetzt ist, ist das
ein 8-bit PWM Timer mit TOP = 0x00FF im 'Phase Correct PWM' Modus. Siehe
Table 39 im Datenblatt. Vorteiler hier ist 64.
Timer 2 wird genauso als 'Phase Correct' initialisiert und genauso mit
Vorteiler 64.
Die beiden sollten also das gleiche Verhalten zeigen.
Wenn sie es nicht tun, ist mögl. die externe Beschaltung des MC schuld.
Allerdings ist 244Hz PWM bei LEDs wirklich sehr langsam und führt immer
zu deutlichem Flimmern. Ich nehme deswegen gerne >3kHz.
Matthias S. schrieb:> S. Landolt schrieb:> ren dann 488 Hz.>> Ok, schon besser. Wäre mir aber immer noch zu kribbelig.
Sind nicht 16000000/256=62500
62500/256=244,14
Liege ich hier verkehrt?
S. Landolt schrieb:> Pardon, sind wegen 'phase-correct' wohl doch nur 255, also
nö, 256 war schon richtig. Die 0 musste ja auch mit zählen. Du
dividierst ja nicht durch den größten Wert sondern durch die Zahl der
möglichen Werte und das sind 256 ;)
M. K. schrieb:> nö, 256 war schon richtig. Die 0 musste ja auch mit zählen. Du> dividierst ja nicht durch den größten Wert sondern durch die Zahl der> möglichen Werte und das sind 256 ;)
Ja, wenn dann die Fuse noch der Angabe entspricht - und nicht auf 1
MHz-Standard steht - ansonsten kann es schon unangenehm sein ...
Code-Fragmente sind immer wieder toll :-)
S. Landolt schrieb:>> nö, 256 war schon richtig.>> Ich denke nicht, im Datenblatt steht 510 (wegen der Umkehrung der> Zählrichtung), und das messe ich hier auch.
Und das ist auch korrekt. In einem kompletten Zyklus kommen alle Werte
zwei mal vor (einmal beim Hochzählen, einmal beim Runterzählen), nur der
Wert für TOP und 0 kommen nur jeweils einmal vor. Wie du vollkommen
korrekt sagtest, wegen der Umkehrung der Zählrichtung.
Gezählt wird eben bei jedem Timertakt genau ein Schritt, bei Erreichen
von TOP oder Null wird aber nebenbei noch die Zählrichtung umgekehrt,
was dazu führt, dass gleich der nächste Takt den Zähler wieder einen
Schritt in die entgegengesetzte Richtung bewegt. Und innerhalb eines
Zyklus kommt man nie wieder zu diesem Endwert. Damit kommt er eben nur
einmal pro Zyklus vor.
Die Grafiken bei der Erklärung des PhaseCorrect-Modus zeigen das
eigentlich auch ziemlich deutlich. Man muss sie sich halt einfach nur
mal wirklich angesehen haben...
c-hater schrieb:> Und das ist auch korrekt. In einem kompletten Zyklus kommen alle Werte> zwei mal vor (einmal beim Hochzählen, einmal beim Runterzählen), nur der> Wert für TOP und 0 kommen nur jeweils einmal vor. Wie du vollkommen> korrekt sagtest, wegen der Umkehrung der Zählrichtung.S. Landolt schrieb:> Ich denke nicht, im Datenblatt steht 510 (wegen der Umkehrung der> Zählrichtung), und das messe ich hier auch
Ach ja, stimmt ja. Daran hab ich gar nicht gedacht.