Espanol
AddThis Social Bookmark Button

18 Iterazioni e selezioni

Vediamo ora come possiamo utilizzare le istruzioni per creare le strutture base
di tutti i linguaggi ad alto livello: selezioni e iterazioni.

Gli esempi proposti sono da considerarsi più che altro dei modelli, che verranno
poi adattati in base alla situazione.

Selezione Semplice (If - Then)

	btfsc	STATUS,C	; carry = 1 ??
	istruzione		; sì

	btfss	STATUS,C	; carry = 1 ??
	goto	EndIf	; no
	istruzione1		; sì
	istruzione2
	istruzione3
EndIf
	....                        

Selezione Doppia (If - Then - Else)

	btfss	STATUS,C	; carry = 1 ??
	goto	Else	; no
	istruzione1		; sì
	istruzione2
	istruzione3
	goto	EndIf	
Else
	istruzione4
	istruzione5
	istruzione6
EndIf
	...

Iterazione a cicli fissi

	movlw	10	; 10 cicli
	movwf	0x0C	; usiamo il registro 0x0C come contatore
Loop
	istruzione1
	istruzione2
	....
	decfsz	0x0C,F	; decrementa 0x0C, se 0 salta l'struzione successiva
	goto	Loop	; altrimenti torna a "Loop"
	....                                        	
  

In questi esempi, si nota che ad alcuni numeri sono state sostituite delle lettere:
- STATUS = 0x03
- C = 0x00
- F = 0x01
Questo può essere fatto, in MPLab, con la direttiva EQU:
STATUS	EQU	0x03
C	EQU	0x00
F	EQU	0x01

Allo stesso modo possiamo dare ai nostri registri un nome; nell'ultimo esempio potremmo chiamare "Contatore"
il registro 0x0C.

Forti di queste conoscenze, possiamo vedere il primo esempio completo:

Il PIC non è in grado di eseguire moltiplicazioni: questo programma esegue la moltiplicazione
5x3 sommando tre volte cinque => 5x3 = 5+5+5

	include	"P16F84.INC"	; include il file che contiene tutte le EQU del PIC 16F84

DatoA	EQU	0x0C	; primo operando nel registro 0x0C
DatoB	EQU	0x0D	; il secondo in 0x0D
Ris	EQU	0x0E	; mettiamo il risultato in 0x0E

	ORG	0x00	; indica che ci troviamo all'indirizzo 0
			; della memoria programma

; il programma esegue la moltiplicazione 5x3
	movlw	0x05
	movwf	DatoA	; DatoA = 5

	movlw	0x03
	movwf	DatoB	; DatoB = 3

	clrf	Ris	; Ris = 0

Loop
	movf	DatoA,W	; W = DatoA = 5
	addwf	Ris,F	; Ris = Ris + W

	decfsz	DatoB,F	; decrementa DatoB (esegue il ciclo DatoB volte)
	goto	Loop	; torna a Loop

	END		; tutti i programmi devono terminare con END

Putroppo il risultato non può essere visto, se non con il debugger, perchè effettivamente questo
non viene comunicato all'esterno del chip; ma scopriremo come farlo nella prossima lezione.