Hi,
entschuldigt bitte, dass ich euch ein weiteres Mal um Rat fragen muss,
aber mir scheint die uC Materie nicht so einfach in den Kopf zu gehen.
Ich wage mich gerade an PWM mittels uC heran. Setup ist nach wie vor der
Atmega8. Fast PWM mit Mode 5 (Fast PWM 8bit) funktioniert mit unten
stehenden Code. Abhängig vom Wert OCR1A leuchtet die LED unterschiedlich
hell.
1
#include<avr/io.h>
2
3
intmain(void)
4
{
5
DDRB|=(1<<PB1);
6
OCR1A=120;
7
TCCR1A|=(1<<COM1A1);
8
TCCR1A|=(1<<WGM11);
9
TCCR1B|=(1<<WGM12);
10
// TCCR1B |= (1<<CS10) | (1<<CS12);
11
TCCR1B|=(1<<CS10);
12
13
while(1)
14
{
15
//Code
16
}
17
}
Spaßeshalber habe ich mal Mode 15 gewählt und die LED leuchtet immer
gleich hell. Okay, irgendeinen Unterschied müssen die Modes ja haben,
klar. Aber irgendwie werde ich aus dem Datenblatt nicht schlau, was es
damit auf sich hat. In diesem Forum habe ich einen Beitrag von spess53
gefunden:
> Im Mode 15 (OCR1A als Top) hast du nur den PWM-Kanal B zur Verfügung.> OCR1A bestimmt die Frequenz und Auflösung der PWM. Damit an Kanal B eine> PWM herauskommt muss OCR1A größer als OCR1B sein.
Ich habe das Datenblatt (Seite 88 bis 90) und Seite (96 bis 101) noch
mal durchforstet, aber irgendwie scheine ich diese Information übersehen
zu haben. Wo kann ich Informationen und Konfiguration über die
jeweiligen Modi finden?
Danke
Wenn du mit dem Timer arbeitest (und du schon ein wenig damit umgehen
kannst), dann fängt die Recherche im Datenblatt am einfachsten immer bei
der Modus Tabelle an. Dort steht im Grunde alles drinnen, was man auf
die Schnelle wissen muss.
Für den Timer 1 ist das die Tabelle 39 auf Seite 97/98 des Datenblattes.
Die Zeile des Modus 15 sieht so aus
1
Mode WGM13 WGM12 WGM11 WGM10 Mode of Operation TOP Update TOV1 Flag
2
(CTC1) (PWM11) (PWM10) of OCR1x set on
3
4
...
5
6
15 1 1 1 1 Fast PWM OCR1A BOTTOM TOP
Und hier ist wiederrum die Spalte TOP die für deine konkrete
Fragestellung relevant. TOP verrät dir, wie eigentlich der Zählumfang
des Timers festgelegt wird. D.h. bis wohin zählt denn eigentlich der
Timer, ehe es dann wieder von vorne losgeht?
Beim Modus 5 wäre das zb. 0x00FF also 255. Warum gerade 255? Weil es
sich um eine 8 Bit PWM handelt. 8 Bit bedeutet aber der Zähler muss von
0 bis 255 zählen und in diesem Zahlenbereich je nach Zählerständen das
PWM-Ausgangsbit umschalten. Das ergibt 256 mögliche Schaltpunkte, daher
auch 8 Bit PWM. Die Umschaltung selbst wird davon nicht festgelegt, das
machen die OCR1A bzw. OCR1B Register. Bei Gleichstand vom Zählwert mit
dem jeweiligen Register wird der entsprechende Ausgansgpin geschaltet.
Wie das passiert verrät dir die Einstellung der COM... Bits (die
Tabellen davor). Beachte aber auch: die 0x00FF stehen in der Tabelle
direkt drinnen. d.h. das in diesem Modus bis 255 gezählt wird, ist fest
verdrahtet und ist nun mal in diesem Modus so.
Hier, im Modus 15 steht aber in der TOP Spalte: OCR1A
D.h. in diesem Modus legt der Inhalt des OCR1A Registers fest, wie weit
der Zähler zählt. Steht da 300 drinnen, dann zählt der Timer von 0 bis
300, steht da 587 drinnen, dann zählt der Timer von 0 bis 587 (und
dementsprechend kannst du dann auch die PWM in 588 Stufen abstufen).
Daraus folgt aber auch mehr. Da OCR1A hier die Rolle des TOP Registers
übernimmt, kann mit OCR1A logischerweise keine PWM mehr realisiert
werden, denn die würde logischerweise immer auf 100% stehen. In diesem
Modus kann also nur noch mit OCR1B und zugehörigem Pin eine PWM erzeugt
werden.
D.h. in diesem Modus lässt sich nur noch realisieren:
OCR1A legt fest, wie weit der Timer zählt
OCR1B legt fest, bei welchem Zählerstand der Pin umgeschaltet werden
soll.
Hallo Karl Heinz (mal wieder :)),
vielen Dank. Bis hierhin meine ich alles verstanden zu haben. Aber nun
kommts:
Karl Heinz Buchegger schrieb:> Hier, im Modus 15 steht in der TOP Spalte: OCR1A> D.h. in diesem Modus legt der Inhalt des OCR1A Registers fest, wie weit> der Zähler zählt. Steht da 300 drinnen, dann zählt der Timer von 0 bis> 300, steht da 587 drinnen, dann zählt der Timer von 0 bis 587 (und> dementsprechend kannst du dann auch die PWM in 587 Stufen abstufen).
Okay, so habe ich es auch verstanden.
> Daraus folgt aber auch mehr. Da OCR1A hier die Rolle des TOP Registers> übernimmt, kann mit OCR1A logischerweise keine PWM mehr realisiert> werden, denn die würde logischerweise immer auf 100% stehen.
Das ist für mich nicht logisch. Zuvor schreibst du, dass von 0 bis 587
gezählt wird. Mit meiner Konfiguration bei COM1A1 (non inverting)
schließe ich daraus, dass PB1 solange low ist, bis ein Match erreicht
ist. Deshalb kann ich auch deine weitere Erklärung nicht ganz
nachvollziehen.
> In diesem> Modus kann also nur noch mit OCR1B und zugehörigem Pin eine PWM erzeugt> werden.> OCR1A legt fest, wie weit der Timer zählt> OCR1B legt fest, bei welchem Zählerstand der Pin umgeschaltet werden> soll.
Scheinbar übersehe ich etwas Grundlegendes, weshalb ich zu falschen
Schlussfolgerungen komme. :/
al3ko schrieb:>> Daraus folgt aber auch mehr. Da OCR1A hier die Rolle des TOP Registers>> übernimmt, kann mit OCR1A logischerweise keine PWM mehr realisiert>> werden, denn die würde logischerweise immer auf 100% stehen.> Das ist für mich nicht logisch.
Was ist daran nicht logisch?
> Zuvor schreibst du, dass von 0 bis 587> gezählt wird. Mit meiner Konfiguration bei COM1A1 (non inverting)> schließe ich daraus, dass PB1 solange low ist, bis ein Match erreicht> ist.
Richtig.
Aber wann wird denn der Match erreicht?
Immer dann wenn der Zählerstand mit OCR1A übereinstimmt. Wenn aber
gleichzeitig mit dieser Übereinstimmung der Zähler auf 0 zurück gesetzt
wird und wieder von vorne beginnt, dann kann man das ja wohl schwerlich
eine PWM nennen. Denn deine PWM würde immer gleich aussehen. Von 0 bis n
ist der Pin auf zb 1 und mit dem Erreichen von n wird der Pin 0.
Gleichzeitig beginnt aber auch der Timer wieder bei 0 zu zählen und der
Pin wird wieder 1.
OCR1A sei beispielsweise 7
Timer 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, ...
# #
Match Match
Wird beim Match der Pin abgeschaltet, der Timer zurückgesetzt und der
Pin geht sofort wieder auf 1, dann unterscheidet sich das inwiefern von
OCR1A sei 9
Timer 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ...
# #
Match Match
In beiden Fällen wird gleichzeitig mit dem Match 2-er lei DInge gemacht.
Für eine PWM willst du aber eine andere Steuerung des Ausgangs
realisieren. Du willst vielleicht haben, dass der Timer bis 7 zählt,
aber der Pin soll nur für die Zählerstände bis 3 auf 1 sein, und ab da
dann 0 sein
Timer 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, ...
Pin 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1
# # # #
Nur wie machst du denn das? Du brauchst 2 Matches! Den einen, der dir
den Pin umschaltet und den anderen der den Timer auf 0 zurücksetzt.
Da OCR1A als 'Timer-zurücksetz-Match' dir durch den Modus vorgegeben
ist, bleibt dir nur noch OCR1B
OCR1A 7
OCR1B 3
Timer 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, ...
Pin 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1
# # # #
Match B Match A Match B Match A
Und mit OCR1B kannst du jetzt variieren um das Verhältnis der On Zeit
zur Off Zeit des Pins einzustellen
OCR1A 7
OCR1B 5
Timer 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, ...
Pin 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1
# # # #
Match B Match A Match B Match A
oder in die andere Richtung
OCR1A 7
OCR1B 2
Timer 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, ...
Pin 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1
# # # #
Match B Match A Match B Match A
Den OCR1A kannst du dafür nicht mehr benutzen. D.h. technisch gesehen
kannst du schon. Aber dieser Pin wird eben dauern auf 100% sein.
Vielen Dank für deine sehr schöne und anschauliche Erklärung. Ich meine
es nun verstanden zu haben, was an Mode 5 anders läuft. Dort zählt der
Counter fest bis 255 (8bit) no matter what und fängt dann wieder bei 0
an. Der Wert für OCR1A setzt somit das "duty cycle", gibt also an wann
der Match stattfinden wird. Ob inverting oder non-inverting leuchtet die
LED nun vor oder nach dem Match.
In Mode 15 setzt man den Wert des Timers über OCR1A, also bis wohin der
Timer zählen soll. Klar, dass man nun einen zweiten Match haben muss, um
das duty cycle zu setzen (wie lange die LED an bzw. aus sein soll).
Richtig?
Alex A. schrieb:> Richtig?
Exakt.
Und das ist dann auch der Unterschied zum Mode 14.
Im Mode 15 regelt OCR1A, bis wohin der Timer zählt. Im Modus 14 erledigt
ICR1 diese Aufgabe, sodass OCR1A wieder zur Duty Cycle Einstellung
benutzt werden kann.