flic:
Es gibt zwei (drei beim 16Bit-Timer) Timerregister in denen Du einstellen kannst in welchem Modus der Timer laufen soll. (ob als Timer oder als Counter oder für PWM)
Grob gesagt zählt der Timer bei Phasenkorrekter PWM (am einfachsten zu realisieren) mit vorgegebener Frequenz hoch. Beim Überlaufen des Timercounterregisters beginnt der Timer von &hFF (255) auf &h0 (0) runter zu zählen, dann gibts wieder ein Flag und das Teil zähl erneut auf &hFF hoch und so weiter und so fort.
Das sähe in einem Diagramm etwa so aus
&hFF
/\/\/\/\/\
&h0
In einem weiteren Register stehen die Werte bei denen die Hardware-PWM den Pin des Timers einfach nur umschaltet. Da der Timer immer hoch und runter zählt ergibt sich im Bezug auf das oben stehende "Diagramm" eine Phasenkorrekte PWM.
Fang am besten mit dem Timer0 an und arbeite Dich stück für Stück durch die Bedienungsanleitung der AVR. Das ist etwas mühselig, bringt aber was.
Mir fehlt im grad die Zeit um das Dir etwas ausführlicher zu beschreiben.
Das feine an der Hardware-PWM ist das man mittem im Programmablauf die Werte für die PWM ohne eine Interrupt- oder Subroutine ändern kann. Der neue Wert wird erst aktiv wenn der Timer erneut von &h0 nach &hff zählt.
In Dresden bist Du am 21.11. nicht zufällig beim Stammtisch anwesend? Das ganze ließe sich nämlich mit nem Laptop, einem STK500 (wenn's geht) und einem Oszi am leichtesten Erklären.
Tante Edit trägt Daten des Attiny2313 nach:
Das TimerCounterRegister0
TCNT0 vergleicht ständig seinen eigenen Wert mit denen der beiden OutptCompareRegister
OCR0A und
OCR0B. Bei einer Übereinstimmung zwischen
TCNT0 und
OCR0x wird das OutputCompareRegisterFlag
OCRF0x gesetzt, löst damit (wenn aktiviert) beim nächsten Timerzyklus einen Interrupt aus und setzt sich danach automatisch zurück sobald die IRQ-Routine ausgeführt wird. Ähnlich läuft es bei der PWM nur das hier kein Interrupt ausgelöst, sondern der zum Register gehörende Pin umgeschaltet, ein oder ausgeschaltet wird. Eben je nachdem wie man die beiden unten beschriebenen TimerCounterControlRegister (
TCCR0x) einstellt.
Wichtig für die Verwendung der Hardware-PWM sind folgende Register:
TCCR0A = &B0101--01
(an Stelle der Punkte müssen keine Werte festgelegt werden da sie intern überschrieben werden, vergessen darfste dir aber logischer Weise nicht, die ersten beiden Bit's legen die Art der PWM fest, hier &B------01 für Phasecorrect-PWM)
TCCR0B = &B00--0101
(die ersten 3 Bit (101) geben den Prescalerwert vor - hier fclk/1024)
OCR0A
OCR0B wie bei OCR0A die Werte reinschreiben die das Tastverhältnis der PWM festlegen - von 0/1 -> AUS = &B00000000 über 1/255 -> = &B00000001 bis 1/1 -> = &B11111111 geht alles.
Kannst Du im Falle des Attiny2313 alles im Datenblatt ab Seite 63 bis Seite 111 im feinsten technischen Englisch nachlesen und prinzipiell auf alle anderen 8-Bit AVR übertragen.
Es empfielt sich auch die Bezeichnungen und Funktionen der einzelnen Bit's in den Registern aufzuschreiben um die Übersicht zu behalten weil man sich sonst nen Wolf in der PDF rauf und runter scrollt.
Die 16-Bit-Timer besitzen ein drittes TCCR und die OCR unterteilen sich in OCR1AH, OCR1AL, OCR1BH und OCR1BL (
High,
Low)