Was jetzt passieren "sollte", ist, dass er im fast-pwm Modus zwischen
high- und low "toggelt", und jedes mal OCR1A als Counter benutzt, also
On-und Off-Phasen gleich lang sind.
Doch leider passiert gar nichts! PWM an sich funktioniert (mit anderem
Code getestet, der leider auch etwas anderes macht...).
Könnt Ihr denn da einen Fehler entdecken???
MfG, und vielen Dank schon einmal, Ozzy
Du hast den Modus anscheinend nicht verstanden. Das OCR1A definiert den
TOP-Wert der PWM und damit die PWM-Periodendauer. Um ein PWM-Signal zu
erhalten, musst Du in OCR1B einen Wert schreiben, der dann das
Tastverhältnis bestimmt. Getoggelt wird dann der OC1B-Pin
(vorausgesetzt, er ist richtig konfiguriert).
Hi,
ich denke, ich habe das wirkich nicht so ganz verstanden. Was bedeutet
denn "Tastverhältnis"? Also ich möchte ja, dass ON- und OFF-Phase gleich
lang sind.
Ist dann der OC1B-Pin nicht PB5 beim 128?
MfG, und vielen Dank, Ozzy
Christoph O. wrote:
> Hi,>> ich denke, ich habe das wirkich nicht so ganz verstanden. Was bedeutet> denn "Tastverhältnis"?
Das Verhältnis von Einschalt zu Ausschaltzeit.
> Also ich möchte ja, dass ON- und OFF-Phase gleich> lang sind.
Dann gibst du in OCR1B immer die Hälfte vom OCR1A Wert.
>> Ist dann der OC1B-Pin nicht PB5 beim 128?>
Doch. Aber wenn du den OCR1B nicht besetzt, dann ist der immer 0
>Tastverhältnis
Das ist das Verhältnis zwischen Einschalt- und Ausschaltdauer innerhalb
einer Periode.
Auch Duty-Cycle genannt.
Das was du machen willst, lässt sich mit dem CTC-Modus erreichen, wobei
man ihn mit doppelter Frequenz laufen lassen muß.
Bei einer PWM brauchst Du immer zwei Werte:
1. den TOP-Wert, der bestimmt, bis wohin der Zähler (Timer) zählen soll
(in diesem Fall OCR1A) und
2. den Wert, bei dem (innerhalb des Zählintervalls) der Ausgang
umgeschaltet werden soll (in diesem Fall OCR1B oder auch OCR1C).
Der Timer zählt aufwärts, bis der Wert in TCNT1 den Wert in OCR1B (oder
OCR1C) erreicht hat. Beim folgenden Timertakt wird der entsprechend
konfigurierte Ausgangspin (OC1B oder OC1C) umgeschaltet. Der Timer zählt
weiter bis TOP (in Deinem Fall bis OCR1A) und wird dann zurückgesetzt.
Beim Zurücksetzen wird gleichzeitig der Ausgangspin wieder in seinen
Ausgangszustand gebracht.
Hi,
also ich habe jetzt OCR1A mal den Wert 500, und OCR1B den Wert 250
gegeben.
Aber es funktioniert immer noch nicht. Es bleiben knappe 0 V (etwas
Rauschen). Oder sind die 14,7456Mhz einfach zu viel? Doch ein Prescaler?
MfG, Ozzy
Christoph O. wrote:
> Nein, ich muss auch gestehen, dass ich nicht weiß, wie...
Du hast doch oben den OC1A mit den COM1An-Bits konfiguriert. Mit dem
OC1B funktioniert das praktisch genauso. Auch zu dem Pin gibt es zwei
Bits, mit denen man bestimmen kann, was der Pin bei einem bestimmten
Ereignis machen soll. Abgesehen davon muss der Pin natürlich über das
entsprechende Datenrichtungsregister (DDRx) als Ausgang konfiguriert
sein, sonst kommt gar nichts raus.
Johannes M. wrote:
> Christoph O. wrote:>> Nein, ich muss auch gestehen, dass ich nicht weiß, wie...> Du hast doch oben den OC1A mit den COM1An-Bits konfiguriert. Mit dem> OC1B funktioniert das praktisch genauso. Auch zu dem Pin gibt es zwei> Bits, mit denen man bestimmen kann, was der Pin bei einem bestimmten> Ereignis machen soll. Abgesehen davon muss der Pin natürlich über das> entsprechende Datenrichtungsregister (DDRx) als Ausgang konfiguriert> sein, sonst kommt gar nichts raus.
Öhm, dann stehe ich aber doch gerade auf dem Schlauch: Ich muss also
OC1A und OC1B konfigurieren, benutze aber statt OC1A OC1B als Ausgang?
Ist das richtig? Kann ich den dann genauso konfigurieren?
MfG, Ozzy
Christoph O. wrote:
> Öhm, dann stehe ich aber doch gerade auf dem Schlauch: Ich muss also> OC1A und OC1B konfigurieren, benutze aber statt OC1A OC1B als Ausgang?> Ist das richtig? Kann ich den dann genauso konfigurieren?
Nein, OC1A brauchst Du nicht zu konfigurieren! Das PWM-Signal wird
(bei Benutzung von OCR1B als Compare-Wert) an OC1B ausgegeben. OC1A hat
im Modus 15 keine Funktion, weil das dazugehörige Compare-Register durch
den TOP-Wert belegt ist. Es muss nur OC1B (mit den entsprechenden
COM-Bits) konfiguriert werden. Und die dazu erforderlichen Daten stehen
in den Tabellen im Datenblatt.
Hi,
eine Frage hätte ich jetzt noch: wie schaffe ich es denn, das Signal
invertiert auf einem anderen Pin auszugeben? Bekomme das irgendwie nicht
hin...
MfG, Ozzy
Auf einem beliebigen anderen Pin geht natürlich nur per Software (und
dementsprechend verzögert gegenüber dem hardwaremäßigen Signal am
OCnx-Pin). Die einfachste Methode geht über zwei Interrupts (Overflow
und der entsprechende Compare-Interrupt). Musst eben in einem
Interrupt-Handler den gewünschten Pin setzen und im jeweils anderen
wieder löschen.
Wenn vom selben Timer noch eine Compare-Einheit frei ist und der
dazugehörige Ausgangspin auch, dann gehts natürlich auch, indem man in
das entsprechende OCR denselben Wert schreibt wie in das andere, aber
die Steuerung des Pins "umdreht".
Hi
>Mal ne Frage: wo bitte steht im Datenblatt dass man im Modus 15 OCR1B>als comparewert nehmen soll???
Weil auf S.135 steht, daß OCR1A der Top-Wert ist.
MfG Spess