;
;					ESEMPIO 2.18
;
;				Autore: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Esempio per simulazione e/o MicroPIC Trainer
;
;Il TMR0 come contatore di eventi esterni
;
;Un sensore optoelettronico connesso a RA4 genera un impulso ogni volta che un oggetto si 
;iterpone tra l'emissore e il recettore di luce. Il TMR0 si incarica di contarli 
;a seconda del valore del prescaler. Tale valore si aggiusta mediante 3 interruttori
;(RA0-RA2) connessi alla Porta A, essendoci così 8 pre-divisioni:
;
;			I2	I1	I0		Divisione
;			--	--	--		--------
;			0	0	0		1:2
;			0	0	1		1:4
;			0	1	0		1:8
;			0	1	1		1:16
;			1	0	0		1:32
;			1	0	1		1:64
;			1	1	0		1:128
;			1	1	1		1:256
;
;	Il conteggio è visualizzato in binario sui leds collegato alla Porta B e 
;deve essere moltiplicato per il valore del prescaler selezionato, per determinare il numero
;totale di impulsi. Il contatore si riassetta mettendo RA3 a "1". Va tenuto conto del
;"effetto rimbalzo" che si produce nell'interruttore RA4 del MicroPIC Trainer.

		List	p=16F84		;Tipo di processore
		include	"P16F84.INC"	;Definizioni de registri interni
                    		
		org	0x00		;Vettore di Reset
		goto	Inizio
		org	0x05		;Salva vettore di interrupt

Inizio	        clrf 	PORTB		;Cancella i latch di uscita
		bsf	STATUS,RP0	;Seleziona banco 1
		clrf	TRISB		;Porta B si configura come uscita
		movlw	b'00011111'		
		movwf	TRISA		;Porta A si configura come entrata		
		movlw	b'00110000'
		movwf	OPTION_REG	;TMR0 contatore sensibile al discendente di RA4
		bcf	STATUS,RP0	;Seleziona banco 0			                                                                         					

Loop		clrf	TMR0		;Mettere a 0 il contatore
Loop1:		clrwdt			;Aggiorna il WDT
		btfsc	PORTA,3		;Controlla se I3 è attivo (RESET)
		goto	Loop		;Sì Conto arrestato e settaggio a 0					
		movf	PORTA,W         ;No, leggere I2-I0 per formare il nuovo valore
		andlw	b'00000111'     ;del prescaler
		bsf	STATUS,RP0      ;Seleziona pagina 1
		iorwf	OPTION_REG,F	;Aggiorna il nuovo valore del prescaler
		bcf	STATUS,RP0	;Seleziona pagina 0                                            
		movf	TMR0,W          ;Leggi il valore del contatore					
		movwf	PORTB		;Uscita ai leds
		goto	Loop1
		
		end			;Fine del programma principale

