hola a todos...tengo un problema con el pwm del 16f877 y no consigo la razon por la cual no funciona bien por favor quisiera que revisaran este programa y me digan que puede ser. cuando sumo algo al registro ccpr1l para variar el ancho del pulso se coloca en 1. lo estoy simuando en proteus. escrib el programa en pic simulator ide
pdel0 equ 0x20
pdel1 equ 0x21
pdel2 equ 0x22
org 0
;-------------------------
bsf 0x03,5 ;entro al banco 1
clrf 0x05 ;como salida puerto a
clrf 0x06 ;como salida puerto b
clrf 0x07 ;como salida puerto c
movlw .255
movwf 0x08 ;como entrada puerto d
clrf 0x09 ;como salida puerto e
movlw .255
movwf 0x92 ;configuracion de periodo del pwm
bcf 0x03,5 ;vuelvo al banco 0
clrf 0x05
clrf 0x07
movlw b'00001100'
movwf 0x17
movwf 0x1d
movlw b'00000100'
movwf 0x12
;-----------------------------
inicio btfss 0x08,0
call suma
btfss 0x08,1
call resta
goto inicio
;----------------------
suma movlw .1
addwf 0x15,1
call pdelay
return
;----------------------
resta movlw .1
subwf 0x15,1
call pdelay
return
;----------------------
PDelay2 movlw .100 ; 1 set number of repetitions (B)
movwf PDel0 ; 1 |
PLoop4 movlw .207 ; 1 set number of repetitions (A)
movwf PDel1 ; 1 |
PLoop5 clrwdt ; 1 clear watchdog
decfsz PDel1, 1 ; 1 + (1) is the time over? (A)
goto PLoop5 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (B)
goto PLoop4 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 cycles delay
PDelL2 clrwdt ; 1 cycle delay
return ; 2+2 Done
;----------------------
PDelay movlw .22 ; 1 set number of repetitions (C)
movwf PDel0 ; 1 |
PLoop0 movlw .134 ; 1 set number of repetitions (B)
movwf PDel1 ; 1 |
PLoop1 movlw .211 ; 1 set number of repetitions (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) is the time over? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) is the time over? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (C)
goto PLoop0 ; 2 no, loop
return ; 2+2 Done
;-----------------------
end