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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.