Forum: Mikrocontroller und Digitale Elektronik Attiny45 Timer1 PWM -ASM


von Joe (Gast)


Lesenswert?

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:

1
.include "tn45def.inc"
2
3
.org 0x000F
4
5
init:
6
  ldi r16, LOW (RAMEND)    ;stackinit
7
  out SPL, r16
8
9
  ldi r16, HIGH (RAMEND)
10
  out SPH, r16
11
12
  ldi r16, (1<<PB4)  ;pinb4 als output
13
  out DDRB, r16
14
15
  ;ldi r16, (1<<PB4)      ;pinb4 pull-up ein
16
  ;out PORTB, r16
17
18
  ldi r16, (1<<CS10) | (1<<CS12) ; | (1<<CTC1) ;prescaler FCPU/16
19
  out TCCR1, r16
20
  
21
  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 /!\

von Shuzz (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

>Ich möchte die PWM Funktion des Attiny45 mit dem Timer1

Dann benutze bitte auch die Register und Bitbezeichnungen von Timer1.

MfG Spess

von Hc Z. (mizch)


Lesenswert?

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.

von Joe (Gast)


Lesenswert?

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.
1
.include "tn45def.inc"
2
3
.org 0x000F
4
5
init:
6
  ldi r16, LOW (RAMEND)    ;stackinit
7
  out SPL, r16
8
9
  ldi r16, HIGH (RAMEND)
10
  out SPH, r16
11
12
  ldi r16, (1<<PB4)  ;pinb4 als output
13
  out DDRB, r16
14
15
  ;ldi r16, (1<<PB4)      ;pinb4 pull-up ein
16
  ;out PORTB, r16
17
18
  ldi r16, (1<<CS10) | (1<<CS12) ; | (1<<CTC1) ;prescaler FCPU/16
19
  out TCCR1, r16
20
  
21
  ldi r16, (1<<PWM1B) | (1<<COM1B0) | (1<<COM1B1) ;PWM modulator B
22
  out GTCCR, r16
23
24
  ldi r16, 12       ;irgendein startwert
25
  out OCR1C, r16
26
27
main:
28
  ; einfach nop und den Timer arbeiten lassen 
29
  rjmp main

Das is die conf. wo die LED durchleuchtet.
Danke für eure Bemühungen!

von Markus (Gast)


Lesenswert?

Versuch mal ob das funktioniert:
1
.include "tn45def.inc"
2
3
.org 0x000F
4
5
init:
6
  ldi r16, LOW (RAMEND)    ;stackinit
7
  out SPL, r16
8
9
  ldi r16, HIGH (RAMEND)
10
  out SPH, r16
11
12
  ldi r16, (1<<PB4)  ;pinb4 als output
13
  out DDRB, r16
14
15
  ldi r16, (1<<COM1A1)|(1<<COM1A0)|(1<<CS10) | (1<<CS12) ;prescaler FCPU/16
16
  out TCCR1, r16
17
  
18
  ldi r16, (1<<PWM1B) | (1<<COM1B0) | (1<<COM1B1) ;PWM modulator B
19
  out GTCCR, r16
20
21
  ldi r16, 100 ;Max. PWM-Wert
22
  out OCR1C, r16
23
24
  ldi r16, 20 ;PWM-Wert
25
  out OCR1B, r16
26
27
main:
28
  ; einfach nop und den Timer arbeiten lassen 
29
  rjmp main

von Shuzz (Gast)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.