Con este codigo pude controlar el ciclo de trabajo del PWM usando el modulo ADC, lo cheque en proteus y parece funcionar, cualquier sugerencia sera bien recibida.
Este todavia no lo checo en fisico, la duda mas grande que tengo es como poder almacenar los 2 bits menos significativos de la conversion en los registros del pwm CCP1CON<5:4>, justifique la conversion a la izquierda para que asi estos bits sean los menos significativos y no me afecten tanto, algun metodo para poder llevarlo a cabo?
list p=16f887
#include <p16f887.inc>
ERRORLEVEL -302
__CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF & _DEBUG_OFF
__CONFIG _CONFIG2, _BOR40V & _WRT_OFF
CBLOCK 0X20
CONTA_1
CONTA_2
ENDC
ORG 0X0000
GOTO CONFIGURACION
CONFIGURACION
; CONFIGURACION ADC
MOVLW B'01000001' ;Configuracion ADCON0
;01------ Reloj Fosc / 8
;--0000-- Canal analogico AN0
;------0- GO/DONE
;-------1 ADC Habilitado
MOVWF ADCON0
BSF STATUS,RP0 ;Banco 1
MOVLW B'01100111' ;Configurar reloj interno a 4MHz
MOVWF OSCCON
MOVLW B'11111111' ;Configurar PuertoA como entrada
MOVWF TRISA
CLRF TRISB ;Configurar PuertoB como salida
CLRF TRISC ;Configurar PuertoC como salida
MOVLW B'00000000' ;Configuracion ADCON1
;0------- Justificado a la izquierda
;--0----- Referencia Vss
;---0---- Referencia Vdd
MOVWF ADCON1
BSF STATUS,RP1 ;Banco 3
MOVLW B'00000001' ;Configurar A0 como analogica
MOVWF ANSEL
MOVLW 0x00
MOVWF ANSELH
;***************************************************
; PWM Period = [(PR2)+1] * 4 * Tosc * TMR2 Prescaler
; = [255+1] * 4 * [1 / 4 Mhz] * 1
; = [256] * 4 * .25 uS * 1
; PWM Period = 0.256 mS
;
; PWM Frec = 1 / PWM Period
; = 1 / 0.256 mS
; PWM Frec = 3906.25 Hz
;
; Pulse Width= (CCPR1L:CCP1CON<5:4>) * Tosc * (TMR2 Prescaler)
; = Variable con el ADC * (1 / 4 MHz) * 1
; Pulse Width= 0.25 uS min. - 63 uS max.
;
; (CCPR1L:CCP1CON<5:4>)
; Duty Cycle = ----------------------
; 4 (PR2 + 1)
; 1020
; Duty Cycle = ------
; 1024
; Duty Cycle = 99.6% max
;
; log[4(PR2+1)]
; Resolution = -------------- bits
; log(2)
; Resolution = 10 bits
;
;****************************************************
;CONFIGURACION PWM
BCF STATUS,RP1 ;Banco 1
;MOVLW B'00110111' ;Configurar reloj interno a 500 kHz
;MOVWF OSCCON
MOVLW B'11111111' ;Cargamos 255 al registro PR2
MOVWF PR2 ;Obtenemos un PWM con Frec de 3906.25 Hz
;CLRF TRISC ;Puerto C como salida
MOVLW B'10000000' ;Configuracion PWM1CON
MOVWF PWM1CON
BCF STATUS,RP0 ;Banco 0
MOVLW B'00000100' ;Configuracion del T2CON
;'-0000---' Postscaler 1:1
;'-----1--' Timer2 activado
;'------00' Prescaler 1:1
MOVWF T2CON
MOVLW B'00001101' ;Configuracion del CCP1CON (PWM Mejorado)
;'00------' Single output P1A Modulado, P1B, P1C y P1D pines de puerto
;'--00----' LSB del Duty Cycle
;'----1101' Modo PWM, P1A y P1C activos en alto, P1B y P1D activos en bajo
MOVWF CCP1CON
MOVLW B'00001101' ;Configuracion del CCP2CON
;'--00----' LSB del Duty Cycle
;'----1101' Modo PWM
MOVWF CCP2CON
;MOVLW B'01000000' ;Configuracion del CCPR1L
;MOVWF CCPR1L ;Duty Cycle del 25% (0x100)
;CONVERSION ADC
CONVERSION CALL RETARDOCONV ;Retardo (40 uS) conversion
BSF ADCON0,GO
BTFSC ADCON0,GO ;Termino la conversion
GOTO $-.1 ;NO, salta 1 atras
MOVF ADRESH,W ;9-2 bits conversion -> W
MOVWF PORTB ;W -> PORTB
MOVWF CCPR1L ;W -> CCPR1L
CALL RETARDO2TDA ;Retardo 2Tda (10 uS) antes de la sig conversion
GOTO CONVERSION
RETARDOCONV
MOVLW d'9'
MOVWF CONTA_1
NOP
DECFSZ CONTA_1,F
GOTO $-.2
RETURN
RETARDO2TDA
MOVLW d'2'
MOVWF CONTA_2
NOP
DECFSZ CONTA_2,F
GOTO $-.2
RETURN
END