;
;					EJEMPLO 3
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo MicroPIC Trainer y Micro'PIC IO
;
;El TMR1 en el modo contador ascendente de eventos externos
;
;Mediante el generador de onda cuadrada de la tarjeta Micro'PIC IO, se aplican pulsos por la 
;línea RC0/T1CKI. La pantalla LCD de la tarjeta Micro'PIC Trainer visualizará, en binario, 
;el contenido del TMR0
;
;Si se selecciona una muy baja frecuencia en el generador (1H aprox.), se puede apreciar 
;claramente que los incrementos del contador se producen en los flancos ascendentes de la
;señal de onda cuadrada.
;
		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Lcd_var		equ	0x20		;Inicio de variables de las rutinas LCD
Temporal_1	equ	0x22		;Variable temporal
Temporal_2	equ	0x23		;variable temporal

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x05		;Salva el vector de interrupción

		include	"LCD_CXX.INC"	;Incluye rutinas de manejo del LCD

;Visualiza: Esta rutina coge el octeto presente en la variable Temporal_1, lo convierte
;a 8 caracteres ASCII (0 o 1) y los visualiza sobre el LCD

Visualiza:	movlw	.8
		movwf	Temporal_2	;Nº de caracteres a visualizar
Visual_loop	rlf	Temporal_1,F
		btfsc	STATUS,C	;Testea el bit a visualizar
		goto	Bit_1		;Está a 1
		movlw	'0'
		goto	Visu_1
Bit_1		movlw	'1'
Visu_1		call	LCD_DATO	;Visualiza el "0" o el "1" sobre el LCD
		decfsz	Temporal_2,F	;Siguiente bit/carácter
		goto	Visual_loop
		return
		
;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
		bcf	STATUS,RP0	;Selecciona banco 0

;El TMR1 actúa como contador externo asíncrono y con un preescaler de 1:1

		movlw	b'00000011'
		movwf	T1CON

		clrf	TMR1L
		clrf	TMR1H		;Puesta a 0 del TMR1

		call	UP_LCD		;Configura puerto para el LCD
		call	LCD_INI		;Inicia el LCD
		movlw	b'00001100'
		call	LCD_REG		;LCD On, cursor y blink Off

Loop		clrwdt			;Refresca el WDT
		movlw	0x80
		call	LCD_REG		;Cursor home
		movf	TMR1H,W
		movwf	Temporal_1	;Lee byte alto del TMR1
		call	Visualiza	;Visualiza en binario
		movf	TMR1L,W
		movwf	Temporal_1	;Lee byte bajo del TMR1
		call	Visualiza	;Visualiza en binario

		goto	Loop		;Bucle infinito		

		end			;Fin del programa fuente
