;
;					EJEMPLO 4
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo MicroPIC Trainer y Micro'PIC IO
;
;El TMR1 en el modo contador de eventos externos. División de frecuencias.
;
;Mediante el generador de onda cuadrada de la tarjeta Micro'PIC IO, se aplican pulsos por la 
;línea RC0/T1CKI. El contador cuenta N eventos procedentes del generador y a una frecuencia
;conocida (Fg). Al llegar a 0, la línea de salida RB0 cambia de estado. La frecuencia de salida
;en esta línea será: Fg/2N
		
		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Valor_N		equ	.6		;Valor por el que se divide la frecuencia

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		;Vector de interrupción

Inter		movlw	low ~Valor_N
		movwf	TMR1L
		movlw	high ~Valor_N
		movwf	TMR1H		;Restaura el TMR1 con el valor a dividir
		bcf	PIR1,0
		movlw	b'00000001'
		xorwf	PORTB,F		;RB0 cambia de estado
		retfie		
		
;Programa principal

Inicio	        clrf 	PORTB		;Borra los latch de salida
		clrf	PORTA		;Borra los latch de salida
		bsf	STATUS,RP0	;Selecciona banco 1
		movlw	b'00000110'
		movwf	ADCON1		;Puerta A E/S digitales
		clrf	TRISB		;Puerta B se configura como salida
		clrf	TRISA		;Puerta A se configura como salida
		movlw	b'11111111'
		movwf	OPTION_REG	;Preescaler d 128 asociado al WDT		
		movwf	TRISC		;Puerta C como entrada
		bsf	PIE1,0		;Habilita interrupción del TMR1
		bcf	STATUS,RP0	;Selecciona banco 0

;El TMR1 actúa como contador externo asíncrono y con un preescaler de 1:1

		movlw	b'00000111'
		movwf	T1CON

		clrwdt			;Refresca el WDT
		movlw	low ~Valor_N
		movwf	TMR1L
		movlw	high ~Valor_N
		movwf	TMR1H		;Carga el TMR1 con el valor a dividir
		movlw	b'11000000'
		movwf	INTCON		;Habilita interrupciones

Loop		clrwdt
		nop
		goto	Loop		;Bucle infinito		

		end			;Fin del programa fuente
