Hallo. Ich benutze in einem Projekt den Hardware PWM des ATTiny2313,
genauer gesagt 3 Kanäle davon. Mit einer Menge Zeit, und Try 'n Error
habe ich es auch irgendwie hinbekommen das ganze zum laufen zu bringen.
Leider würde ich auch nun gerne ganz begreifen, was ich da angestellt
habe.
Für den Dritten Kanal ist der Code Sinngemäß gleich.
Der Code für die ersten 2 Kanäle lautet wie folgt:
1 | ;/////////// Timer0 & PWM/////////////////////////////////////////
|
2 | ldi temp0, (1<<COM0A1) | (1<<COM0B1) | (1<<WGM01) | (1<<WGM00)
|
3 | out TCCR0A, temp0
|
4 |
|
5 | ldi temp0, (1<<CS00)
|
6 | out TCCR0B, temp0
|
7 |
|
8 | ldi temp0, 0xff
|
9 | out OCR0A, temp0
|
10 | ldi temp1, 0xff
|
11 | out OCR0B, temp1
|
12 | ;////////////////////////////////////////////////////////////////
|
So wie ich es nun verstanden habe passiert folgendes:
1. Mit dem Setzen von COM0A1/COM0B1 ist der Zustand der Pins OC0A/OC0B
nicht mehr vom PORT abhängig. Außerdem sind die Pins (OC0A/OC0B) LOW
wenn der Timer den Wert aus OCR0A/OCR0B erreicht und HIGH wenn TOP (laut
Datenblatt) erreicht wird.
2. Durch das setzen von WGM00/WGM01 wird der Timer in den CTC Mode
gestzt.
Hierbei habe ich nun ein kleines Verständnisproblem. Im CTC Mode wird ja
eigentlich der Timer zurückgesetzt sobald der Timer den Wert aus OCR0A
erreicht. Wenn es in meinem Fall so wäre, dann würde der Timer ja bei
bestimmten OCR0A Werten nicht mehr bis OCR0B zählen können, da dieser
zurückgesetzt wird. Außerdem werden die Pins OC0A/OC0B erst gesetzt wenn
der Timer den TOP Wert erreicht. Das könnte dann ja nie passieren da der
Timer vorher zurückgesetzt wird.
3. Der Rest ist nur Vorteiler setzen etc.
Ich hoffe mir kann jemand die Zusammenhänge erklären, dass ich besser
begreifen kann was da eigentlich genau passiert.
MfG