Gast
#1697694
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