;
;					EJEMPLO 15
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo MicroPIC Trainer y Micro'PIC I/O
;
;Los módulos CCPx. Modo de Comparación. Control de la salida RC2/CCP1. 
;
;Con objeto de obtener grandes temporizaciones, es posible enlazar la salida que provoca
;el módulo CCP1 en el modo de comparación, con el TMR0 en el modo contador. Basta conectar
;la salida RC2/CCP1 con la entrada RA4/T0CKI.
;
;El TMR1 trabaja en el modo contador de pulsos externos. Por la línea RC0/T1CKI se le aplica
;la señal que proporciona un generador (p.e. el de la tarjeta Micro'PIC I/O) y cuenta tantos 
;pulsos externos como se indique en la constante n. 
;
;Cada vez que se alcanza el valor fijado, RC2/CCP1 cambia de estado. El TMR0 a su vez cuenta 
;los flancos ascendentes que se le aplican por RA4/T0CKI. Al rebasar y pasar por 0 se provoca
;una interrupción que hace bascular la línea RB0 de salida. (el interruptor RA4 de la Trainer
;debe estar a "1")
;
;Es un ejemplo que muestra, además, el tratamiento de varias fuentes de interrupción
;		
		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

n		equ	.500		;Nº de pulsos externos a contar por el TMR1

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		
		goto	Inter		;Vector de interrupción

;Programa de tratamiento de la interrupción 

Inter		btfsc	INTCON,T0IF	;Ha sido el TMR0 ??
		goto	Inter_TMR0	;Si
		btfss	PIR1,CCP1IF	;Ha sido el módulo CCP1 ??
		retfie			;No, falsa interrupción

Inter_CCP1	bcf	PIR1,CCP1IF	;Reponer el flag del módulo CCP1
		clrf	TMR1L
		clrf	TMR1H		;Inicia TMR1
		movf	CCP1CON,W
		xorlw	b'00000001'
		movwf	CCP1CON		;Bascular el disparo de RC2/CCP1 en la comparación
		retfie

Inter_TMR0	bcf	INTCON,T0IF	;Reponer el flag del TMR0
		clrf	TMR1L
		clrf	TMR1H		;Inicia TMR1
		movlw	b'00000001'
		xorwf	PORTB,F		;La salida RB0 cambia de estado
		retfie

;Programa principal

Inicio	        clrf	PORTB		;Desconecta salidas
		clrf	PORTA
		clrf	PORTC
		bsf	STATUS,RP0	;Selecciona banco 1
		movlw	b'00000110'
		movwf	ADCON1		;Puerta A E/S digitales
		clrf	TRISB		;Puerta B se configura como salida
		movlw	b'00011111'
		movwf	TRISA		;Puerta A entradas
		movlw	b'11111011'
		movwf	TRISC		;RC0 entrada, RC2 salida
		movlw	b'11101111'
		movwf	OPTION_REG	;Preescaler de 128 asociado al WDT
		bsf	PIE1,CCP1IE	;Habilita interrupción del módulo CCP1
		bsf	INTCON,T0IE	;Habilita interrupción del TMR0
		bcf	STATUS,RP0	;Selecciona banco 0
	
;El TMR1 actúa en el modo contador de pulsos externos sensible al flanco ascendente y con
;un preescaler de 1:1. Estos pulsos pueden ser suministrador por el generador de la tarjeta
;Micro'PIC I/O con una frecuencia F

		movlw	b'00000010'
		movwf	T1CON		;TMR1 en Off

;El módulo CCP1 actúa en modo de comparación y, hace bascular RC2/CCP1, al coincidir con el 
;valor n. En RC2/CCP1 hay un cambio de estado c determinado por c=(1/F)*n

		movlw	b'00001000'
		movwf	CCP1CON		;Módulo CCP en modo comparación
		
		clrf	TMR1L
		clrf	TMR1H		;Puesta a 0 del TMR1
		
		movlw	high n
		movwf	CCPR1H
		movlw	low n
		movwf	CCPR1L		;Carga el valor a comparar

;El TMR0 trabaja con un preescaler de 1:1. La interrupción y el basculamiento de RB0 se 
;producirá al rebasar (256*2c)

		clrf	TMR0		;Puesta a 0 del TMR0
		bsf	T1CON,TMR1ON	;TMR1 en On, comienza a contar

		movlw	b'11000000'
		movwf	INTCON		;Habilita interrupciones
		
Loop		clrwdt			;Refresca el WDT	
		goto	Loop		;Bucle infinito		

		end			;Fin del programa fuente
