;
;					ESEMPIO 2.10
;
;				Autore: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Esempio per simulazione e/o MicroPIC Trainer
;
;L'interruzione del TMR0.
;
;Si tratta di verificare l'interruzione provocata dal TMR0. Il programma
;legge lo stato degli interruttori conessi a RA0 e RA4 per portarlo ai
;leds collegati rispettivamente a RB0 e RB4 . Nello stesso tempo il TMR0
;genera un'interrupt ogni 0.05 sec. (50 mS) che si ripeterà 5 volte con lo scopo 
;di creare un'intermittenza di 250 mS sul led collegato a RB7.

	
		List	p=16F84		;Tipo di processore
		include	"P16F84.INC"	;Definizioni di registri interni

Contatore	equ	0x0c		;Variabile per la temporizzazione
                    
		org	0x00		;Vettore di Reset
		goto	Inizio

		org	0x04		;Vettore di interrupt

Interrupt   	bcf	INTCON,T0IF	;Rimetti flag del TMR0
		decfsz 	Contatore,F	;Diminuisci il contatore
           	goto 	Continuare
Con_si_0   	movlw 	5
           	movwf 	Contatore       	;Rimetti di nuovo il contatore 
           	btfsc 	PORTB,7        	;Controlla ultimo stato di RB7
           	goto 	RB7_ES_1	;E' a 1
           	bsf 	PORTB,7		;E' a 0, attiva RB7
           	goto 	Continuare

RB7_ES_1   	bcf 	PORTB,7		;Disattiva RB7

Continuare    	movlw 	0x3c
           	movwf 	TMR0      	;Rimetti il TMR0 con 195
           	retfie			;Ritorno 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'00000111'
		movwf	OPTION_REG	;Prescaler di 256 per il TMR0		
		bcf	STATUS,RP0	;Seleziona banco 0			                                                                         

;Il TMR0 viene aumentato ogni 1 uS. Se si impiega un prescaler di 256, dovrà subire 195
;incrementi per provocare un'interrupt ogni 50000 uS (50 mS). Se questa si ripete 5
;volte, il tempo totale trascorso è di 250000 uS (250 mS). Il complemento del valore
;195 in hex. è 0x3c.

		movlw	0x3c
		movwf	TMR0		;Carica il TMR0 con 195
		movlw	0x05
		movwf	Contatore	;Nº di volte per ripetere l'interrupt
		movlw	b'10100000'
		movwf	INTCON		;Attiva l'interrupt del TMR0

Loop		clrwdt			;Aggiorna il WDT
		btfsc 	PORTA,0        	;Controlla lo stato di RA0
           	goto 	RA0_ES_1
           	bcf 	PORTB,0		;Disattiva RB0
           	goto 	TEST_RB1
RA0_ES_1   	bsf 	PORTB,0		;Attiva RB0
TEST_RB1   	btfsc 	PORTA,1        	;Controlla lo stato di RA1
           	goto 	RA1_ES_1
           	bcf 	PORTB,1		;Disattiva RB1
           	goto 	Loop
RA1_ES_1   	bsf 	PORTB,1		;Attiva RB1
		goto 	Loop


		end			;Fine del programma principale
