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.
|