;Los módulos CCPx
;Modo PWM. Variando la anchura del pulso a partir de una tensión analógica
;
;Los dispositivos PIC16F88X disponen de un convertidor A/D de 10 bits de resolución y 5 u 8
;canales de entrada analógica. La tensión de referencia determina la resolución por bit:
;(Res. = Vref/1024). Con Vref=5 --> res.= 4.8 mV/Bit; con Vref=2.5V --> res.= 2.4 mV/Bit
;
;Se propone realizar una modulación de anchura de pulsos (PWM) mediante el módulo CCP1 y con
;salida de señal por la línea RC2/CCP1. La anchura se ajusta a partir de una tensión analógica
;que se introduce por RA0/AN0. Se establece un periodo fijo de 3200uS
;
;El TMR2 trabajando con un preescaler de 1:16 y a una frecuencia de 4 MHz evoluciona cada 16 uS
;
;Un osciloscopio conectado en RC2/CCP1 permitirá visualizar las variaciones del ancho de pulso
;en la señal salida RC2/CCP1 según la tensión analógica aplicada por RA0/AN0. Nosotros hemos
;empleado el modelo PoScope Basic 2.
List p=16F886 ;Tipo de procesador
include "P16F886.INC" ;Definiciones de registros internos
;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades
__config _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF ;Palabra 1 de configuración
__config _CONFIG2, _WRT_OFF&_BOR40V ;Palabra 2 de configuración
Periodo equ .200 ;Valor para el periodo de 3200uS (200*Preescaler de 16)
Duty_H equ 0x20
Duty_L equ 0x21 ;Variable para la anchura de pulso
org 0x00 ;Vector de RESET
goto Inicio
org 0x05
;Programa principal
Inicio bsf STATUS,RP0
bsf STATUS,RP1 ;Banco 3
movlw b'00000001'
movwf ANSEL ;RA0/AN0/C12IN0- entrada analógica, resto digitales
clrf ANSELH ;Puerta B digital
bcf STATUS,RP1 ;Banco 1
movlw b'11111011'
movwf TRISC ;RC2/CCP1 salida
bcf STATUS,RP0 ;Selecciona banco 0
bsf STATUS,RP0 ;Selecciona página 1
clrf ADCON1 ;Alineación izda. Vref= VDD para el convertidor
bcf STATUS,RP0 ;Selecciona página 0
;Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32
Loop movlw b'10000001'
movwf ADCON0 ;ADC en On, seleciona canal AN0
bcf PIR1,ADIF ;Restaura el flag del conversor AD
bsf ADCON0,GO ;Inicia la conversión
;Esperar el final de la conversión y leer el resultado
ADC_Wait_0 btfss PIR1,ADIF ;Fin de conversión ??
goto ADC_Wait_0 ;Todavía no
movf ADRESH,W
movwf Duty_H ;Registra valor actual para el periodo
bsf STATUS,RP0 ;Selecciona página 1
rrf ADRESL,F
rrf ADRESL,W
bcf STATUS,RP0 ;Selecciona página 0
andlw b'00110000'
movwf Duty_L ;Salva parte baja de la conversión
;El módulo CCP1 se configura en modo PWM con salida por RC2/CCP1. Los bits LSB se obtienen
;de la variable Duty_L
movlw b'00001100'
iorwf Duty_L,F
movwf CCP1CON ;Modo PWM para el módulo CCP1
;El periodo se determina según el valor de la constante "Periodo". Este se carga sobre el
;registro PR2.
movlw Periodo-1
bsf STATUS,RP0 ;Selecciona página 1
movwf PR2
bcf STATUS,RP0 ;Selecciona página 0
;La anchura del pulso o "Duty" se determina según el valor con que se cargue el registro
;CCPR1L concatenado con los bits 4 y 5 de CCP1CON. Dichos valores se obtiene de las varia-
;bles Duty_H y Duty_L respectivamente.
movf Duty_H,W
movwf CCPR1L
;Trabajando con un preescaler 1:16 y a una frecuancia de 4MHz, el TMR2 evoluciona cada 16 uS.
movlw b'00000111'
movwf T2CON ;TMR2 en On
goto Loop
end ;Fin del programa fuente