Los módulos CCPx.
;Modo de Captura, Medida de la duración de un pulso.
;
;El ejemplo emplea el módulo CCP1 y trata de capturar el valor del TMR1 cada vez que lleguen
;un flanco ascendente y otro descendente por la línea RC2/CCP1. Conocida la velocidad a la
;que evoluciona el TMR1, se puede determinar el lapsus de tiempo transcurrido entre ambos
;flancos, lo que nos dará la anchura del pulso.
;
;La pantalla LCD visualiza dicho lapsus de tiempo expresado en microsegundos. Hay que multiplicarlo
;por 8 (valor del preescaler del TMR1) para obtener el valor final.
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
cblock 0x20 ;Inicio de variables de la aplicación
Byte_L ;Parte baja del byte a convertir
Byte_H ;Parte alta del byte a convertir
BCD_2 ;Byte 2 de conversión a BCD
BCD_1 ;Byte 1 de conversión a BCD
BCD_0 ;Byte 0 de conversión a BCD
Contador ;Variable de contaje
Captura ;Nº de capturas
Temporal ;Variable temporal
endc
Lcd_var equ 0x70 ;Variables para las rutinas de manejo del LCD
org 0x00 ;Vector de RESET
goto Inicio
org 0x04 ;Vector de interrupción
goto CCP1_Inter
org 0x05
include "LCD4bitsPIC16.inc" ;Incluye rutinas de manejo del LCD
;Visualizar: Visualiza sobre la pantalla LCD los cinco dígitos situados en las variables
;BCD_0, BC_1 y BCD_2
Visualizar movlw 0x80
call LCD_REG ;Posiciona el cursor
movlw 3
movwf Contador ;Inicia contador de bytes a convertir
movlw BCD_0
movwf FSR ;Inicia puntero índice
Visual_loop swapf INDF,W
andlw 0x0f
iorlw 0x30 ;Convierte a ASCII el nible de más peso
call LCD_DATO ;Lo visualiza
movf INDF,W
andlw 0x0f
iorlw 0x30 ;Convierte a ASCII el nible de menos peso
call LCD_DATO ;Lo visualiza
decf FSR,F ;Siguiente byte
decfsz Contador,F
goto Visual_loop
movlw ' '
call LCD_DATO ;Visualiza espacio
movlw 0xe4
call LCD_DATO ;Visualiza micro
movlw 'S'
call LCD_DATO ;Visualiza 'S'
return
;16Bits_BCD: Esta rutina convierte un número binario de 16 bits situado en Byte_H y
;Byte_L y, en 5 dígitos BCD que se depositan en las variables BCD_0, BCD_1 y BCD_2,
;siendo esta última la de menos peso.
;Está presentada en la nota de aplicación AN544 de MICROCHIP y adaptada por Microsystems
;Engineering
Bits16_BCD bcf STATUS,C
clrf Contador
bsf Contador,4 ;Carga el contador con 16
clrf BCD_0
clrf BCD_1
clrf BCD_2 ;Puesta a 0 inicial
Loop_16 rlf Byte_L,F
rlf Byte_H,F
rlf BCD_2,F
rlf BCD_1,F
rlf BCD_0,F ;Desplaza a izda. (multiplica por 2)
decfsz Contador,F
goto Ajuste
return
Ajuste movlw BCD_2
movwf FSR ;Inicia el índice
call Ajuste_BCD ;Ajusta el primer byte
incf FSR,F
call Ajuste_BCD ;Ajusta el segundo byte
incf FSR,F
call Ajuste_BCD
goto Loop_16
Ajuste_BCD movf INDF,W
addlw 0x03
movwf Temporal
btfsc Temporal,3 ;Mayor de 7 el nibble de menos peso ??
movwf INDF ;Si, lo acumula
movf INDF,W
addlw 0x30
movwf Temporal
btfsc Temporal,7 ;Mayor de 7 el nibble de menos peso ??
movwf INDF ;Si, lo acumula
return
;Programa de tratamiento de la interrupción que provoca el módulo CCP1 cada vez que se
;detecta, primero un flanco ascendente y luego un descendente por la línea RC2/CCP1.
CCP1_Inter btfsc Captura,0 ;Es la captura del flanco descendente
goto Medir ;Si, medir el tiempo transcurrido entre ambas
incf Captura,F ;No, ha sido la captura del flanco ascendente
bcf CCP1CON,0 ;Capturar al flanco descendente
clrf TMR1H
clrf TMR1L ;Borra el TMR1 para iniciar la medida
bcf PIR1,CCP1IF ;Repone el flag del módulo CCP1
retfie
;Al detectar 2 flancos, uno ascendente y otro descendente, se calcula el tiempo
;transcurrido entre la 1ª y 2ª captura
Medir movf CCPR1L,W
movwf Byte_L
movf CCPR1H,W
movwf Byte_H ;Lee el valor capturado desde el TMR1
;Se convierte a BCD y visualiza en el LCD
bsf CCP1CON,0 ;Captura al flanco ascendente
call Bits16_BCD ;Convertir a BCD
call Visualizar ;Salida a pantalla LCD
incf Captura,F ;Capturar el 1er. flanco
bcf PIR1,CCP1IF ;Repone el flag del módulo CCP1
retfie
;Programa principal
Inicio clrf PORTB ;Desconecta salidas
clrf PORTA
bsf STATUS,RP0
bsf STATUS,RP1 ;Banco 3
clrf ANSEL
clrf ANSELH ;Puertas A y B digitales
bcf STATUS,RP1 ;Banco 1
bsf PIE1,CCP1IE ;Habilita interrupción del módulo CCP1
bcf STATUS,RP0 ;Banco 0
;Configura e inicia la pantalla LCD
call UP_LCD ;Configura puertos para el LCD
call LCD_INI ;Inicia el LCD
movlw b'00001100'
call LCD_REG ;LCD On, cursor y blink Off
;El TMR1 actúa en el modo temporizador con reloj interno y un preescaler 1:8 evoluciona cada 8uS a 4MHz.
;Según esto, el periodo máximo que se puede medir estará comprendido entre 0,5s (2Hz) y 8 uS (125 KHz)
;aproximadamente. Para otros rangos se debe seleccionar un preescaler diferente.
movlw b'00110001'
movwf T1CON ;TMR1 en On, preescaler 1:8
movlw b'11000000'
movwf INTCON ;Habilita interrupciones
;El módulo CCP1 actúa en modo de captura al flanco ascendente
movlw b'00000101'
movwf CCP1CON ;Módulo CCP en On
clrf Captura ;Inicia captura en el 1er. flaco ascendente
Loop nop
goto Loop ;Bucle infinito
end ;Fin del programa fuente