ATmega8 Timer2 PWM funktioniert nicht

Gast #1697694
Lesenswert?
• ▲
▼
Hallo,
beim verändern des PWM-Wert's über UART flakert die LED3 lediglich nur 
ein wenig auf bei meinem ATmega8.
Wenn ich einen festen Wert eingebe habe ich ein PWM-Ausgangssignal, 
allerdings invertiert d.h. 0 = LED => 100% an, 255 LED => aus!?
Beim Debuggen (AVR Studio4) fällt mir auf das bei "OUT OCR2, neuerWert"
in der Schleife "receive_loop:"der alte Wert nicht durch den neuen Wert 
überschrieben wird.
Muß das Register OCR vor dem Neueintrag gelöscht werden, oder was mache 
ich nur falsch?

Vielen Dank in Voraus!

;Timer3_ATmega8.asm, Function Timer2
.INCLUDE "M8DEF.INC"
.DEF temp = R17
.EQU XTAL = 4000000
;======================================================================= 
===
;init UART (Universal Asynchronous Receiver and Transmitter) 
TXD=Transmit Data (send), RXD Reseive Data (reseive)
;======================================================================= 
===
.EQU BAUD     =  9600    ;Baudrate
.DEF RxdValue   =  R16  ;PWM-Value
;Math
.EQU UBRR_VAL   =   ((XTAL+BAUD * 8)/(BAUD*16)-1)  ;round
.EQU BAUD_REAL   =  (XTAL/(16*(UBRR_VAL+1)))    ;real baudrate
.EQU BAUD_ERROR  =  ((BAUD_REAL*1000)/BAUD-1000)  ;ERROR in promille

.IF ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
.ERROR "Systematischer Fehler der Baudrate groesser 1% und somit zu 
hoch!"
.ENDIF
;======================================================================= 
===
  RJMP start
start:
  LDI temp,(1<<PB3)    ;Ausgangsport bestimmen hier 0x
  OUT DDRB, temp
  LDI temp, HIGH (RAMEND)    ;init stackpointer
  OUT SPH, temp
  LDI temp, LOW (RAMEND)
  OUT SPL, temp
;======================================================================= 
===
;init Baudrate
  LDI temp, HIGH(UBRR_VAL)
  OUT UBRRH,temp
  LDI temp, LOW(UBRR_VAL)
  OUT UBRRL,temp
;======================================================================= 
===
;Frame-Format: 8Bit
  LDI temp,(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
  OUT UCSRC,temp
;======================================================================= 
===
;RX (receive) activate
  SBI UCSRB,RXEN
;======================================================================= 
===
;get and send data
  LDI temp, 0  ;init before start
  OUT OCR2, temp
  LDI temp, (1<<WGM21) | (1<<WGM20)  | (1<<COM21) | (0<<COM20) | 
(1<<CS21)
  OUT TCCR2,temp
receive_loop:
  SBIS UCSRA, RXC     ;wait for Byte
  RJMP receive_loop
  IN RxdValue, UDR   ;copy received byte in reg16
  OUT OCR2, RxdValue ;neuer Wert wird beim debuggen nicht übernommem
  RJMP receive_loop
#1697702
Lesenswert?
• ▲
▼
BerndB schrieb:

> Muß das Register OCR vor dem Neueintrag gelöscht werden, oder was mache
> ich nur falsch?

Die meisten PWM Modi übernehmen den neuen OCR Wert nicht sofort, sondern 
erst dann wenn der Timer seinen maximalen oder minialen Wert erreicht 
(siehe Datenblatt).
Würden sie das nicht tun, müsstest du selber darauf aufpassen, ob der 
aktuelle Zählerstand kleiner oder größer als der neu zu setzende 
Vergleichswert ist und ob du dementsprechend den Ausgangspin auch noch 
ein oder ausschalten müstest.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.