mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Attiny45 Timer1 PWM -ASM


Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

.include "tn45def.inc"

.org 0x000F

init:
  ldi r16, LOW (RAMEND)    ;stackinit
  out SPL, r16

  ldi r16, HIGH (RAMEND)
  out SPH, r16

  ldi r16, (1<<PB4)  ;pinb4 als output
  out DDRB, r16

  ;ldi r16, (1<<PB4)      ;pinb4 pull-up ein
  ;out PORTB, r16

  ldi r16, (1<<CS10) | (1<<CS12) ; | (1<<CTC1) ;prescaler FCPU/16
  out TCCR1, r16
  
  ldi r16, (1<<PWM1B) ;| (1<<COM1B0) ;| (1<<COM1B1) ;PWM modulator B
  out GTCCR, r16

  ldi r16, (1<<WGM00) | (1<<WGM01) | (1<<COM0B1)
  out TCCR0A, r16

  ldi r16, 12       ;irgendein startwert
  out OCR1C, r16

 ; ldi r17, 0
main:
 ; inc r17
 ; out OCR1C, r17

  ; einfach nop und den Timer arbeiten lassen 
  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 /!\

Autor: Shuzz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
.include "tn45def.inc"

.org 0x000F

init:
  ldi r16, LOW (RAMEND)    ;stackinit
  out SPL, r16

  ldi r16, HIGH (RAMEND)
  out SPH, r16

  ldi r16, (1<<PB4)  ;pinb4 als output
  out DDRB, r16

  ;ldi r16, (1<<PB4)      ;pinb4 pull-up ein
  ;out PORTB, r16

  ldi r16, (1<<CS10) | (1<<CS12) ; | (1<<CTC1) ;prescaler FCPU/16
  out TCCR1, r16
  
  ldi r16, (1<<PWM1B) | (1<<COM1B0) | (1<<COM1B1) ;PWM modulator B
  out GTCCR, r16

  ldi r16, 12       ;irgendein startwert
  out OCR1C, r16

main:
  ; einfach nop und den Timer arbeiten lassen 
  rjmp main

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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch mal ob das funktioniert:
.include "tn45def.inc"

.org 0x000F

init:
  ldi r16, LOW (RAMEND)    ;stackinit
  out SPL, r16

  ldi r16, HIGH (RAMEND)
  out SPH, r16

  ldi r16, (1<<PB4)  ;pinb4 als output
  out DDRB, r16

  ldi r16, (1<<COM1A1)|(1<<COM1A0)|(1<<CS10) | (1<<CS12) ;prescaler FCPU/16
  out TCCR1, r16
  
  ldi r16, (1<<PWM1B) | (1<<COM1B0) | (1<<COM1B1) ;PWM modulator B
  out GTCCR, r16

  ldi r16, 100 ;Max. PWM-Wert
  out OCR1C, r16

  ldi r16, 20 ;PWM-Wert
  out OCR1B, r16

main:
  ; einfach nop und den Timer arbeiten lassen 
  rjmp main

Autor: Shuzz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-timercount...

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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.