;
;					EJEMPLO 14
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo MicroPIC Trainer y Micro'PIC I/O
;
;Los módulos CCPx. Modo de Comparación. 
;
;El TMR1 cuenta tantos pulsos externos como se indique mediante los interruptores RA4-RA0
;de la tarjeta Micro'PIC Trainer. Cada vez que se alcanza el valor fijado, la salida RB0
;cambia de estado.
;		
		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		
		goto	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 las entradas RA4-RA0.

Inter		bcf	PIR1,CCP1IF	;Repone el flag del módulo CCP1
		bcf	T1CON,TMR1ON	;TMR1 en Off
		clrf	TMR1L
		clrf	TMR1H		;Puesta a 0 del TMR1
		movlw	b'00000001'
		xorwf	PORTB,F		;RB0 cambia de estado
		bsf	T1CON,TMR1ON	;TMR1 en On
		retfie		

;Programa principal

Inicio	        clrf	PORTB		;Desconecta salidas
		clrf	PORTA
		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
		movwf	TRISC		;RC0 entrada
		movlw	b'11001111'
		movwf	OPTION_REG	;Preescaler de 128 asociado al WDT
		bsf	PIE1,CCP1IE	;Habilita interrupción del módulo CCP1
		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.

		movlw	b'00000010'
		movwf	T1CON		;TMR1 en Off
		
		movlw	b'11000000'
		movwf	INTCON		;Habilita interrupciones

;El módulo CCP1 actúa en modo de comparación e interrupción al coincidir

		movlw	b'00001010'
		movwf	CCP1CON		;Módulo CCP en modo comparación
		
		clrf	CCPR1H		;Puesta a 0 de la parte alta del valor a comparar
		clrf	TMR1L
		clrf	TMR1H		;Puesta a 0 del TMR1

		bsf	T1CON,TMR1ON	;TMR1 en On, comienza a contar

Loop		clrwdt			;Refresca el WDT	
		movf	PORTA,W
		andlw	b'00011111'	;Lee las entradas RA4-RA0
		movwf	CCPR1L		;Ajusta la parte baja del valor a comparar
		goto	Loop		;Bucle infinito		

		end			;Fin del programa fuente
