;Los módulos CCPx
;PWM mejorado. Se aplica sólo al generador PWM del módulo CCP1.
;
;El modo puente en H (Full-Bridge) con Auto-Shutdown. Genera cuatro señales de salida para
;controlar las cuatro entradas típicas de un puente en H. En el modo directo la salida RC2/P1A
;se mantiene activa mientrás que por RB4/P1D se obtiene la señal PWM. RB2/P1B y RB1/P1C se
;mantienen inactivas. En el modo inverso la salida RB1/P1C se mantiene activa mientrás que por
;RB2/P1B se obtiene la señal PWM. RC2/P1A y RB4/P1D se mantienen inactivas.
;
;En el ejemplo se genera una señal PWM a partir de una tensión analógica por RA0/AN0. Mediante
;la entrada digital RA2 se controla el modo: a "0" modo directo, a "1" modo inverso del puente H.
;
;También se usa el control Auto-Shutdown. Este consiste en desactivar automáticamente todas las
;salidas cuando ocurre un determinado evento. En este caso el evento es el generado por el módulo
;comparador C1. Este compara una tensión analógica externa, aplicada por la entrada RA1/C12IN1-,
;con la que genera el módulo CVREF y que es fija de 2.5V. Cuando la externa sea superior a 2.5V
;todas las salidas quedarán desactivadas a nivel "0". También se utiliza la facultad del rearme
;automático. Este consiste en que las salidas se activan de nuevo automáticamente cuando desaparezca
;la causa o evento que las desactivó, es decir, la tensión en RA1/C12IN1- sea inferior a 2.5V.
;
;Con un osciloscopio de doble trazo podemos analizar las señales de salida: en RC2/P1A y RB4/P1D
;para el modo directo y en RB1/P1C y RB2/P1B para el modo inverso. También podríamos emplear un
;analizador lógico para visualizar simultáneamente las 4 señales. Nosotros hemos empleado el
;modelo PoScope Basic 2 en el modo analizador de funcionamiento.
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'00000011'
movwf ANSEL ;RA0/AN0/C12IN0- y RA1/AN1/C12IN1- analógicas, resto digitales
clrf ANSELH ;Puerta B digital
bcf STATUS,RP0
bsf STATUS,RP1 ;Banco 2
;El comparador C1 se configura con una entrada por RA1/C12IN1- y la otra por la generada por el módulo CVREF.
;La salida es invertida y se activará cuando la tensión de RA1/C12IN1- sea mayor que la proporcionada
;por el módulo CVREF (2.5V)
movlw b'11010101'
movwf CM1CON0 ;Configuración del módulo comparador C1
bsf CM2CON1,C1RSEL ;La tensión generada por CVREF se asocia como entrada + al comparador C1
bsf STATUS,RP0
bcf STATUS,RP1 ;Banco 1
;Configura el módulo generador CVREF para generar una tensión fija de referencia de 2.5V
movlw b'10101100'
movwf VRCON ;Mód. CVREF=ON, rango bajo y VREF fuente=VDD. Genera 2.5V
;RC2/P1A, RB2/P1B, RB1/P1C y RB4/P1D salidas PWM para el puente en H ("Full-Bridge")
movlw b'11101001'
movwf TRISB
movlw b'11111011'
movwf TRISC
;Control de Auto-Shutdown. Las salidas RC2/P1A, RB2/P1B, RB1/P1C y RB4/P1D pasan a "0" cuando
;el comparador C1 detecta una tensión en RA1/C12IN1- superior a 2.5V
movlw b'00010000'
movwf ECCPAS
;Rearmado automático de la salida PWM cuando la tensión en RA1/C12IN1- sea inferior a 2.5V
bsf PWM1CON,PRSEN
;Configuración del ADC
clrf ADCON1 ;Alineación izda. Vref= VDD para el convertidor
bcf STATUS,RP0 ;Banco 0
;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
;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
;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 en puente en H (Full-Bridge) con salidas por RC2/P1A,
;RB2/P1B, RB1/P1C y RB4/P1D. Los bits LSB se obtienen de la variable Duty_L
movlw b'01001100'
iorwf Duty_L,F
movwf CCP1CON ;Modo PWM directo para el módulo CCP1
;Si RA2=1 se selecciona el modo inverso
btfsc PORTA,2
bsf CCP1CON,P1M1
;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
goto Loop
end ;Fin del programa fuente