;
;					EJEMPLO 5
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo MicroPIC Trainer y Micro'PIC IO
;
;El TMR1 en el modo contador de eventos externos. Generación de trenes de pulsos.
;
;Comandando el generador de onda cuadrada de la tarjeta Micro'PIC IO, podemos controlar el 
;número de pulsos que genera. La salida RB0 controla la señal E del generador, habilitándolo
;o no. Este control se puede realizar en base al número de pulsos que cuenta el TMR1.
;
;El ejemplo propone que el generador produzca un tren de 11 pulsos cada 500 uS.

		
		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Valor_N		equ	.9		;Valor N-2 que determina el tamaño del tren

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		;Vector de interrupción

Inter		bcf	PORTB,0		;Desconecta el generador (E=0)
		bcf	T1CON,0		;Desconecta el TMR1
		movlw	low ~Valor_N
		movwf	TMR1L
		movlw	high ~Valor_N
		movwf	TMR1H		;Restaura el TMR1 con el Nº de pulsos a contar
		bcf	PIR1,0		;Restaura el frag del TMR1
		
;El TMR0 evoluciona cada 1 uS. con un preescaler de 4 tendrá que contar 125 eventos para
;generar un lapsus de tiempo de 500 uS

		bcf	INTCON,2	;Restaura el flag del TMR0
		movlw	~.125
		movwf	TMR0		;Carga el TMR0 con 125
Delay		btfss	INTCON,2	;Ha finalizado la cuenta del TMR0 ??
		goto	Delay		;No, esperar

		bsf	T1CON,0		;Activa el TMR1
		bsf	PORTB,0		;Activa el generador externo
		retfie		
		
;Programa principal

Inicio	        bsf 	PORTB,0		;Activa RB0
		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'11000001'
		movwf	OPTION_REG	;Preescaler de 4 asociado al TMR0
		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 Nº de pulsos a contar
		movlw	b'11000000'
		movwf	INTCON		;Habilita interrupciones

Loop		clrwdt
		nop
		goto	Loop		;Bucle infinito		

		end			;Fin del programa fuente
