;
;					ESEMPIO 2.9
;
;				Autore: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Esempio per simulazione e/o MicroPIC Trainer
;
;Gioco di luci, altra temporizzazione.
;
;Si vuole eseguire una rotazione sequenziale nell'accensione di ogni led connesso alla
;porta B nel Trainer. Se RA0 = 0, la rotazione sarà da destra a sinistra e viceversa.
;Ogni led rimane acceso 0.25 secondi (250 mS)
	
		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	0x05		;Salva il vettore di interrupt

;***************************************************************************************
;Delay è una procedura che realizza una temporizzazione di 250 mS che è il tempo in cui deve
;restare acceso ognuno dei leds.
;
;Se il PIC lavora a una frequenza di 4MHz, il TMR0 cambia ogni uS. Se si vuole tempo-
;rizzare 25000 uS (25mS) con un prescaler di 128, il TMR0 dovrà contare 195 eventi (195 *
;128 = 24960). Il valore 195 equivale a 0xc3 e, poiché il TMR0 è ascendente, bisognerà cari-
;care il suo complemento (0x3c). Questa temporizzazione dovrà essere ripetuta 10 volte per raggiungere
;il totale desiderato (250000)

Delay		movlw	.10
		movwf	Contatore	;Carica il contatore con 10
Delay_0		bcf	INTCON,T0IF	;Disconnetti il flag di overflow del TMR0
		movlw	0x3c
		movwf	TMR0		;carica il TMR0
Delay_1		clrwdt			;Aggiornamento del WDT
		btfss	INTCON,T0IF	;Overflow del TMR0 ??
		goto	Delay_1		;Ancora non sono passati i 25 mS
		decfsz	Contatore,F	;Diminuisci contatore. Si è ripetuto 10 volte ?
		goto	Delay_0		;Ancora no, attendi 25 ms
		return			;Adesso sì

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'00000110'
		movwf	OPTION_REG	;Prescaler di 128 per il TMR0
		bcf	STATUS,RP0	;Seleziona banco 0			                                                                         

		bsf	STATUS,C	;Attiva il carry
Loop		call	Delay		;Attendi 250mS
		btfsc	PORTA,0		;E' a 0 RA0 ??
		goto	A_Dsra		;No, rotazione a destra
A_Sina		rlf	PORTB,F		;Sì, rotazione a sinistra
		goto	Loop
A_Dsra		rrf	PORTB,F		;Rotazione a destra
		goto	Loop

		end			;Fine del programma principale
