HY alle zusammen!
Ich möchte die PWM Funktion des Attiny45 mit dem Timer1 auf PB4(OC1B)
nutzen, aber irgendwie lässt es sich nicht realisieren.
Es ist eigentlich ganz einfach, aber ich denke ich überfliege den Fehler
die ganze Zeit...
Hier mal der ASM code:
ldi r16, (1<<PWM1B) ;| (1<<COM1B0) ;| (1<<COM1B1) ;PWM modulator B
22
out GTCCR, r16
23
24
ldi r16, (1<<WGM00) | (1<<WGM01) | (1<<COM0B1)
25
out TCCR0A, r16
26
27
ldi r16, 12 ;irgendein startwert
28
out OCR1C, r16
29
30
; ldi r17, 0
31
main:
32
; inc r17
33
; out OCR1C, r17
34
35
; einfach nop und den Timer arbeiten lassen
36
rjmp main
Mir kommt vor als würde sich der Timer gar nicht aktiviern, wenn ich den
Pull-up setz leuchtet die LED durch. Bei COM1B0 auf 1 (toggle PB4) kommt
auch ein kurzes Aufblinken der LED.
Die auskommentierten Sachen hab ich nur ausprobiert, ohne Erfolg. TCCR0A
hat dann mit dem Timer1 nichts zu tun, oder brauch ich es doch? Ich
blicks iwie nicht durch...
kann mir jemand vl. nur hinweise geben was ich vergessen haben könnte?
Vielen Dank /!\
Du hast gar nix falsch gemacht, der Tiny45 hat nen Bug im Timer1 durch
den die PWM nicht richtig nutzbar ist. (Wobei ich den Code jetzt nicht
angeschaut habe...)
Das sollte aber eigentlich nur OC1B betreffen, der Pin wird einfach
durchgehend auf High gezogen sobald ein Wert >0 im OCR1B Register steht.
(Bzw. ein Wert <255 bei invertierter PWM)
Ich hatte das Problem auch, ich wollte vor kurzem einen kleinen
RGB-Fader mit Hardware-PWM auf nem Tiny45 machen, ging aber um's
verrecken nicht.
Ich bin dann in irgend einem englischen Forum über nen Thread gestolpert
in dem einer das exakt gleiche Problem hatte. Derjenige schrieb dann
auch, dass Atmel das als aktuellen Bug bestätigt hätte. Das war
irgendwann im Januar.
Im Datenblatt des Tiny45 steht bei den Errata auch noch, dass in
Revision D der Tiny45 nen Bug hat, bei dem die OC1AX und OC1BX Bits
identisch gesetzt sein müssen damit der Timer überhaupt das macht was er
soll. Aber auch das hat bei mir nicht geklappt...
Benutz den Timer0, da funktioniert die PWM einwandfrei und es reicht für
zwei LEDs. Wenn es mehr werden sollen nimm Soft-PWM
Joe schrieb:> ldi r16, (1<<PWM1B) ;| (1<<COM1B0) ;| (1<<COM1B1) ;PWM modulator B> out GTCCR, r16
Hier vermisse ich COM1B1 und/oder COM1B0. Wieso sind die Kommentar?
Solange die 0 sind, ist die PWM nicht zum Ausgang durchgeschaltet.
Echt vielen Dank für die schnellen Antworten!!!
Was mich auch stutzig macht is, das es in C funktioniert hat. Nur in asm
noch nicht.
Das mit dem Hardware Bug habe ich auch schon gehört, es funktioniert
aber in C :D .. naja, vielen Dank für die Mühe.
Stimmt, das mit dem COM1B0 und COM1B1 hab ich versucht, aber wenn beide
1 sind, also "set", dann leuchtet die led auch nur durch.
Ich muss mich auch nochmal korrigieren wg. des Bugs: Er tritt nur bei
invertierter PWM auf.
Hast Du ein Oszi? Falls ja, schau doch mal nach ob die LED wirklich
durchleuchtet oder kurze Pausen drin sind. Falls kurze Pausen drin sind
ist es der Bug.
Shuzz schrieb:> Ich bin dann in irgend einem englischen Forum über nen Thread gestolpert> in dem einer das exakt gleiche Problem hatte. Derjenige schrieb dann> auch, dass Atmel das als aktuellen Bug bestätigt hätte.
Das muss dieser sein:
http://www.avrfreaks.net/forum/attiny45-timercounter1-pwm-output-mode-error
Ich bin mit Revision G des Attiny45 ebenfalls auf das Problem gestossen.
Der invertierende Modus der Timer1-PWM funktioniert bei mir aber, wenn
ich wie in den Errata Revision B-C beschrieben, die Bits COM1A1 und
COM1A0 (TCCR1) identisch zu COM1B1 und COM1B0 setze. Teil A des Timer1
verwende ich nicht und Timer0 versorgt noch weitere zwei PWM-Ausgänge,
so dass ich insgesamt drei invertierende HW-PWMs nutzen kann. Für meinen
Fall OK.
Aber es wurde in sechs Jahren nicht geschafft, den Fehler im Datasheet
zu dokumentieren? Schwache Leistung, Atmel!