Ejemplos De Ccp

5
;Ejemplo nro 1 ;Captura: Medida de la duración de un pulso ;PWM: Generar una señal de onda cuadrada por la línea RCx/CCPx cuyo periodo puede ;ser modificado así como la anchura del pulso (Duty Cycle). ;Módulo CCP1 con salida de señal por la línea RC2/CCP1. La señal de ;salida tiene un periodo determinado pora la constante "Periodo" y una anchura "Duty" ;Módulo CCP2 trabaja en modo Captura. En la RSI se realiza el cambio de flanco ;ascendente y descendente de manera alternada List P=16F873 include "P16F873.INC" TONL equ 0x22 ;Parte baja del valor del ancho de pulso TONH equ 0x23 ;Parte alta del valor del ancho de pulso Contador equ 0x27 ;Variable de contaje Temporal equ 0x28 ;Variable temporal Captura equ 0x29 ;Nº de capturas CapiniL equ 0x2a CapiniH equ 0x2b ;Variables temporales para las capturas Periodo equ D'100' ;Periodo de 100 uS Duty equ D'60' ;Anchura 25 uS org 00H ;Vector de Reset goto Inicio org 04H goto Inter ;Vector de interrupción ;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.

description

Dos ejemplos resueltos sobre el módulo CCP

Transcript of Ejemplos De Ccp

Page 1: Ejemplos De Ccp

;Ejemplo nro 1;Captura: Medida de la duración de un pulso;PWM: Generar una señal de onda cuadrada por la línea RCx/CCPx cuyo periodo puede;ser modificado así como la anchura del pulso (Duty Cycle). ;Módulo CCP1 con salida de señal por la línea RC2/CCP1. La señal de ;salida tiene un periodo determinado pora la constante "Periodo" y una anchura "Duty" ;Módulo CCP2 trabaja en modo Captura. En la RSI se realiza el cambio de flanco;ascendente y descendente de manera alternada

List P=16F873include "P16F873.INC"

TONL equ 0x22 ;Parte baja del valor del ancho de pulsoTONH equ 0x23 ;Parte alta del valor del ancho de pulsoContador equ 0x27 ;Variable de contajeTemporal equ 0x28 ;Variable temporalCaptura equ 0x29 ;Nº de capturasCapiniL equ 0x2aCapiniH equ 0x2b ;Variables temporales para las capturasPeriodo equ D'100' ;Periodo de 100 uSDuty equ D'60' ;Anchura 25 uS

org 00H ;Vector de Resetgoto Inicio

org 04Hgoto Inter ;Vector de interrupción

;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.

Inter bcf PIR2,CCP2IF ;Repone el flag del módulo CCP1btfsc Captura,0 ;Es la captura del flanco descendentegoto Medir ;Si, medir el tiempo transcurrido entre ambasincf Captura,F ;No, ha sido la captura del flanco ascendentemovf CCPR2L,Wmovwf CapiniLmovf CCPR2H,Wmovwf CapiniH ;Salvar, temporalmente, el 1er valor capturadobcf CCP2CON,0 ;Capturar al flanco descendenteretfie

Medir movf CapiniL,W ;Es la captura del flanco descendente

Page 2: Ejemplos De Ccp

subwf CCPR2L,Wmovwf TONLbtfss STATUS,Cincf CapiniH,Fmovf CapiniH,Wsubwf CCPR2H,Wmovwf TONH ;Restar el tiempo entre la 2ª captura y la 1ªincf Captura,F ;Capturar el 1er. flancobsf CCP2CON,0 ;Captura al flanco ascendenteretfie

;Programa principal

Inicio clrf PORTC ;Borra salidasbcf STATUS,RP1bsf STATUS,RP0 ;Selecciona banco 1movlw b'11111011'movwf TRISC ;Puerta C entradamovlw Periodo-1movwf PR2 ;Carga el registro de periodosbsf PIE2,CCP2IE ;Habilita interrupción del módulo CCP1bcf STATUS,RP0 ;Selecciona banco 0movlw Dutymovwf CCPR1L ;Carga la anchura del pulso

;El TMR1 actúa en el modo temporizador con reloj interno y un preescaler 1:1.;Según esto, la duración máxima del pulso que se puede medir será en torno a los 65mS.;La mínima estará en torno a los 20 uS. Para otros rangos se debe seleccionar un ;preescaler diferente.

movlw b'00000001'movwf T1CON ;TMR1 en Onmovlw b'11000000'movwf INTCON ;Habilita interrupciones

;El módulo CCP2 actúa en modo de captura al flanco ascendentemovlw b'00000101'movwf CCP2CON ;Módulo CCP2 en On

;El módulo CCP1 actúa en el modo PWM con salida de señal por RC2/CCP1movlw b'00001100'movwf CCP1CON

;El TMR2 trabaja con un preescaler 1:1 por lo que con una frecuencia de 4MHz se ;incrementa cada uS (4*Tosc)

movlw b'00000100'movwf T2CON ;T2 en Onclrf Captura ;Inicia captura en el 1er. flaco ascendente

Loop clrwdt ;Refresca el WDTgoto Loop ;Bucle infinito

end

Page 3: Ejemplos De Ccp

;Ejemplo nro. 2;El TMR1 cuenta tantos pulsos externos como se indique ;Mediante el valor cargado en CCP1CON por la constante Ncompar;Cada vez que se alcanza el valor fijado, la salida RB0;cambia de estado.

List p=16F873include "P16F873.INC"

Ncompar equ 0FH ;Constante para modificar número de comparaciones bajas

org 00H ;Vector de Resetgoto Inicio

org 04Hgoto Inter ;Vector de interrupción

;Programa de tratamiento de la interrupción que provoca el módulo CCP1 ;cada vez que el TMR1 cuenta tantos pulsos externos como los prefijados ;mediante Ncompar

Inter bcf T1CON,TMR1ON ;TMR1 en Offbcf PIR1,CCP1IF ;Repone el flag del módulo CCP1

clrf TMR1Lclrf TMR1H ;Puesta a 0 del TMR1movlw b'00000001'xorwf PORTB,F ;RB0 cambia de estadobsf T1CON,TMR1ON ;TMR1 en Onbcf PIR1,CCP1IFretfie

;Programa principal

Inicio bcf STATUS,RP0bcf STATUS,RP1bcf T1CON,TMR1ON ;Timer1 desconectadoclrf PORTB ;Desconecta salidasbsf STATUS,RP0 ;Selecciona banco 1clrf TRISB ;Puerta B se configura como salidamovlw b'11001011'movwf TRISC ;RC0 entradabsf PIE1,CCP1IE ;Habilita interrupción del módulo CCP1bcf STATUS,RP0 ;Selecciona banco 0

;El TMR1 actúa en el modo contador de pulsos externos

Page 4: Ejemplos De Ccp

;sensible al flanco ascendente y con un preescaler de 1:1.movlw b'00000010'movwf T1CON ;TMR1 en Off

;El módulo CCP1 actúa en modo de comparación e interrupción al coincidirmovlw b'00001010'movwf CCP1CON ;Módulo CCP en modo comparaciónmovlw 00hmovwf CCPR1H ;Puesta a 0 de la parte alta del valor a compararclrf TMR1Lclrf TMR1H ;Puesta a 0 del TMR1movlw Ncomparmovwf CCPR1L ;Ajusta la parte baja del valor a comparamovlw b'11000000'movwf INTCON ;Habilita interrupcionesbsf T1CON,TMR1ON ;TMR1 en On, comienza a contar

Loop clrwdt ;Refresca el WDTgoto Loop ;Bucle infinito

end