Forum: Mikrocontroller und Digitale Elektronik ATmega8 Timer2 PWM funktioniert nicht


von BerndB (Gast)


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

von Karl H. (kbuchegg)


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.

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.