;
;					EJEMPLO 16
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo MicroPIC Trainer y Micro'PIC I/O
;
;Los módulos CCPx. Modo de Comparación. Disparo de eventos
;
;Los módulos CCPx pueden disparar, en el modo de comparación, diferentes eventos al coinci-
;dir el valor del TMR1 con el valor prefijado en los registros CCPRxL y CCPRxH. El módulo 
;CCP1 concretamente, puede provocar un reset del TMR1 poniéndolo a 0. De esta forma, los 
;registros CCPR1L y CCPR1H, actúan como registros de periodo.
;		
;El ejemplo propone sacar por la línea RB0 una onda cuadrada cuyo periodo se establece en la
;constante "Periodo".

		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Periodo		equ	.500		;Periodo de una frecuencia de 2KHz 
Semi_P		equ	Periodo/2	;Cálculo del semiperiodo

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		
	
;Programa de tratamiento de la interrupción 

Inter		bcf	PIR1,CCP1IF	;Reponer el flag del módulo CCP1
		movlw	b'00000001'
		xorwf	PORTB,F		;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
		bcf	STATUS,RP0	;Selecciona banco 0
	
;El módulo CCP1 actúa en modo de comparación con disparo de eventos. Los registros CCPR1L y
;CCPR1H forman un registro de 16 bits que actúa a modo de registro de periodos, provocando 
;que el TMR1 se reinicie cada vez que alcance el valor prefijado en esos registros.

		movlw	b'00001011'
		movwf	CCP1CON		;CCP1 en modo comparación con disparo de eventos

		movlw	high Semi_P
		movwf	CCPR1H
		movlw	low Semi_P
		movwf	CCPR1L		;Carga el valor del semiperiodo deseado

		clrf	TMR1L
		clrf	TMR1H		;Puesta a 0 del TMR1
		
;El TMR1 actúa en el modo temporizador con el reloj interno del sistema y con un preescaler 
;de 1:1. Trabajando a una frecuencia de 4MHz, evolucionará cada microsegundo.

		movlw	b'11000000'
		movwf	INTCON		;Habilita interrupciones
		
		movlw	b'00000001'
		movwf	T1CON		;TMR1 en On
		
Loop		clrwdt			;Refresca el WDT	
		goto	Loop		;Bucle infinito		

		end			;Fin del programa fuente
