www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega8 Timer2 PWM funktioniert nicht


Autor: BerndB (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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.