Sei sulla pagina 1di 12

GALIZIA-impaginato224 9-02-2004 12:32 Pagina 26

TUTORIAL

®
PIC MICROCONTROLLER
BY EXAMPLE
quarta parte
di Tiziano Galizia (t.galizia@farelettronica.com)
e Sergio Tanzilli (s.tanzilli@farelettronica.com)

Questo mese presentiamo due moduli che bisognerebbe studiare ed imparare a


memoria. Infatti torniamo a parlare un po’ di teoria, analizzando il funzionamento
delle direttive più importanti dell'assemblatore MPASM (modulo 8) e del completo
set d’istruzioni disponibili sul PIC16F84 (modulo 9).

sione di un LED collegato sulla linea #DEFINE INSERISCI_TEST


MODULO 8
RA0 ad ogni passaggio: ;Parte iniziale della
; nostra applicazione
Le direttive sono dei particolari co- ;Parte iniziale della ...
mandi, utilizzabili all'interno dei no- ; nostra applicazione
stri sorgenti, per condizionare il ... IFDEF INSERISCI_TEST
funzionamento del nostro assem- ;Inizio delle istruzioni ;Inizio delle istruzioni
blatore (MPASMWIN.EXE) durante ; di test da eliminare ; di test da eliminare
la compilazione. ; nella versione ; nella versione
Contrariamente a quanto avviene ; definitiva ; definitiva
per le istruzioni assembler, le diret- bsf PORTA,0 bsf PORTA,0
tive non vengono tradotte dall'as- ;Fine delle istruzioni di ;Fine delle istruzioni di
semblatore direttamente in codici ; test. Continua con il ; test
operativi per il micro, ma vengono ; resto nell’applicazione ENDIF
interpretate ed eseguite diretta- ... ;Continua con il resto
mente dall'assemblatore. ; dell’applicazione
Passiamo subito ad un esempio pra- Una volta completato il test pos- ...
tico per capire meglio di che si siamo decidere di eliminare questa
tratta. istruzione dal nostro source o di Notate il codice di test è stato inse-
commentarla per mantere il codice rito tra una direttiva IFDEF INSERI-
LA DIRETTIVA IFDEF scritto a futura memoria. SCI_TEST che segna l'inizio dell'area
Questa direttiva serve ad indicare Tutto è molto semplice se le istru- da escludere alla direttiva ENDIF
all'assemblatore se compilare o zioni sono poche e se sono tutte che segna la fine.
meno una sezione di codice. Ipotiz- concentrate in un unica parte del All'inizio del sorgente è stata inse-
ziamo di dover inserire nel nostro nostro programma. rita la direttiva #DEFINE INSERISCI_
programma delle istruzioni utili solo Ma che cosa accade se il codice di TEST che servirà da "interruttore"
nella fase di test ma da eliminare test è sparso un po' ovunque nel per includere o meno il codice tra la
nella versione definitiva. nostro sorgente? IFDEF e la ENDIF.
Ipotizziamo, per esempio, di voler In questo caso ci viene incontro la In pratica se vogliamo includere il
verificare se una parte di codice direttiva IFDEF ed il nostro sorgente codice di test dovremo inserire la
viene eseguita provocando l'accen- diventa così: direttiva #DEFINE INSERISCI_TEST

26 TUTORIAL
GALIZIA-impaginato224 9-02-2004 12:32 Pagina 27

TUTORIAL

all'inizio del nostro sorgente, se in- nessuno, lavorando sulle sole diret- tica la #DEFINE consente di definire
vece vogliamo escluderlo dovremo tive #DEFINE all'inizio del sorgente. delle porzioni di testo da associare
togliere la diretta #DEFINE INSERI- ad una unica parola.
SCI_TEST cancellandola o commen- Esiste anche la direttiva IFNDEF che
tandola (mettendoci davanti un include il codice se "non" è stata in- Vediamo un esempio:
punto e virgola). serita una #DEFINE e la direttiva
Nessuno ci vieta, ovviamente, di re- ELSE che si comporta come la IFN- #DEFINE ON_LED1 bcf PORTA,0
plicare le direttive IFDEF in più DEF ma indica l'alternativa ad una
punti all'interno del sorgente in IFDEF, come riportato nell'esempio Con questa linea diciamo all'assem-
modo da includere o escludere più seguente. blatore di sostituire in fase di com-
porzioni di codice con un unico co- pilazione ogni occorrenza della pa-
mando. #DEFINE INSERISCI_TEST rola ON_LED1 con il testo riportato
;Parte iniziale della sulla destra. In questo modo pos-
È ovviamente possibile definire an- ; nostra applicazione siamo quindi definire delle frasi che
che diversi tipi di esclusione inse- ... una volta inserite nel nostro sor-
rendo più #define all'inizio del sor- ;La linea seguente e' gente lo rendono più leggibile.
gente, come riportato di seguito. ; stata inserita solo per
; testare l'applicazione. #DEFINE ON_VERDE bsf PORTA,0
#DEFINE INSERISCI_TEST1 ; Deve essere eliminata #DEFINE OFF_VERDE bcf PORTA,0
#DEFINE INSERISCI_TEST2 ; nella versione
;Parte iniziale della ; definitiva #DEFINE ON_ROSSO bsf PORTA,1
; nostra applicazione #DEFINE OFF_ROSSO bcf PORTA,1
... IFDEF INSERISCI_TEST
;Accende il led verde
IFDEF INSERISCI_TEST1 ;Inizio delle istruzioni ON_VERDE
;Inizio delle istruzioni ; di test, da eliminare
; di test, da eliminare ; nella versione ;Ora accende il led rosso
; nella versione ; definitiva ON_ROSSO
; definitiva bsf PORTA,0
bsf PORTA,0 ;Fine delle istruzioni di ;Ora spegne entrambe i led
;Fine delle istruzioni di ; test OFF_ROSSO
; test ELSE OFF_VERDE
ENDIF bcf PORTA,0
;Continua con il resto ENDIF LA DIRETTIVA MACRO
; dell’applicazione ;Continua con il resto La direttiva MACRO è ancora più in-
... ; dell’applicazione teressante della #DEFINE per inven-
... tare nuove istruzioni.
IFDEF INSERISCI_TEST2 Come la #DEFINE lavora sempre
;Inizio delle istruzioni In questo caso se all'inizio del sor- sulla sostituzione di testo in fase di
; di test, da eliminare gente c'è una #DEFINE compilazione, ma consente di sosti-
; nella versione INSERISCI_TEST viene compilata la tuire ad una parola (il nome della
; definitiva linea bsf PORTA,0 se invece la diret- macro) un insieme di istruzioni e di
bcf PORTA,0 tiva non c'è viene compilata la linea definire anche i parametri della
;Fine delle istruzioni di bcf PORTA,0. nuova funzione.
; test Vediamo un esempio: ipotizziamo
ENDIF LA DIRETTIVA #DEFINE di dover mettere a zero le linee
;Continua con il resto Vediamo ora in dettaglio cosa fa RB0, RB1 ed RB2 in diversi punti del
; dell’applicazione esattamente la direttiva #DEFINE. nostro programma.
... Per chi conosce il linguaggio C di- Ogni volta che è necessario com-
ciamo subito che la direttiva #DE- piere questa operazione dovremo
In questo caso possiamo escludere FINE si comporta esattamente scrivere le seguenti istruzioni all'in-
solo uno dei due test, entrambi o come nel C standard ANSI. In pra- terno del nostro sorgente:

TUTORIAL 27
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 28

TUTORIAL

BCF PORTB,0 AZZERA 3,5,7 ADDLW K


BCF PORTB,1 Somma la costante k al valore
BCF PORTB,2 Le MACRO consentono quindi di memorizzato nell'accumulatore W e
definire delle funzioni un po' come mette il risultato nell'accumulatore.
con l'aiuto della direttiva MACRO si fa con le subroutine che abbiamo
possiamo definire una "nuova istru- visto nelle lezioni precedenti, ma at- Esempio:
zione" (una macro appunto) per tenzione a non confondere le due
definire l'insieme delle tre istruzioni cose. org 00H
assembler con un'unica etichetta. Le MACRO si comportano molto di- start
All'inizio del nostro sorgente sarà versamente dalle subroutine. Que- movlw 10
sufficiente scrivere: st'ultime, infatti, lavorano a livello di addlw 12
codice eseguibile e non livello di ...
AZZERA MACRO compilazione del sorgente.
BCF PORTB,0 In pratica, quando richiamiamo una Dopo aver eseguito questo pro-
BCF PORTB,1 subroutine usando l'istruzione gramma l'accumulatore W varrà 22.
BCF PORTB,2 CALL, richiamiamo sempre lo stesso Questa istruzione influenza i bit Z,
ENDM gruppo di istruzioni all'interno della DC e C del registro STATUS.
memoria programma del PIC. Z vale 1 se il risultato dell'operazio-
e quindi ogni volta che abbiamo la Quando invece compiliamo una ne vale 0.
necessità di inserire le tre istruzioni, MACRO, non facciamo altro che so- DC vale 1 se il risultato dell'opera-
scrivere semplicemente: stituire del testo all'interno del no- zione è un numero superiore a 15.
stro sorgente ed inserire quindi una C vale 1 se il risultato è positivo,
AZZERA nuova copia dei codici operativi ovvero, se il bit 7 del registro conte-
della MACRO all'interno dell'area nente il risultato vale 0; vale 1 se il
Ci penserà l'assemblatore ad espan- programma. risultato è negativo, ovvero, se il bit
dere la label AZZERA nelle tre istru- Per funzioni complesse e nel caso si 7 del registro contenente il risultato
zioni corrispondenti. debba tener sotto controllo lo spa- vale 1.
Con le macro è possibile anche spe- zio occupato dal nostro programma
cificare dei parametri. è sempre meglio ricorrere alle sub- ADDWF F,D
Ipotizziamo ad esempio che le linee routine che non alle MACRO. Questa istruzione somma il valore
da azzerare non siano sempre le contenuto nell'accumulatore W con
stesse ma cambino di volta in volta. il valore contenuto nel registro indi-
In questo caso dovremo riscrivere la rizzato dal parametro f.
MODULO 9
macro nel seguente modo: Il parametro d è un flag che indica
su quale registro deve essere memo-
AZZERA MACRO L1, L2, L3 Dopo aver analizzato alcune tra le rizzato il risultato.
BCF PORTB,L1 direttive più importanti del compi- Per d = W il risultato viene memoriz-
BCF PORTB,L2 latore MPASM ed aver preso un po' zato nel registro W.
BCF PORTB,L3 di confidenza con i sorgenti assem- Per d = F il risultato viene memoriz-
ENDM bler del PIC16F84, analizziamo una zato nel registro f.
per una tutte le istruzioni assem-
Ogni volta che richiamiamo la ma- bler disponibili su questo micro- Esempio:
cro potremo ora specificare quali controllore.
linee devono essere azzerate. add1 equ 0CH
Per azzerare, ad esempio, le linee Nella tabella 1 (posizionata alla fine add2 equ 0DH
RB0, RB1 ed RB2 possiamo inse- dell’articolo) sono elencate, in ordi- org 00H
rire: ne alfabetico, tutte le istruzioni dis- ;Primo addendo = 10
ponibili con la descrizione e la sintas- movlw 10
AZZERA 0,1,2 si fornita dalla Microchip, mentre qui movwf add1
di seguito viene fornita una descri- ;Secondo addendo = 15
Per azzerare invece le linee RB3, zione dettagliata di ogni istruzione movlw 15
RB5 ed RB7: con un semplice esempio d'uso. movwf add2

28 TUTORIAL
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 29

TUTORIAL

;W = add1 Per d = F il risultato viene memoriz- org 00H


movf add1,W zato nel registro f. movlw 11111111B
;W = W + add2 ;Valore iniziale
addwf add2,W Esempio: movwf parm1
bcf parm1,0 ;D0=0
L'esempio sopra è la somma tra due Spesso l'AND logico viene utilizzato
registri. per mascherare il valore di alcuni bit Al termine del programma il registro
Questa istruzione influenza i bit Z, all'interno di un registro. parm1 varrà 11111110B.
DC e C del registro STATUS. Se ad esempio volessimo estrarre Questa istruzione non influenza
Z vale 1 se il risultato dell'operazio- dal numero binario 01010101B i alcun bit di stato.
ne vale 0. quattro bit meno significativi al fine
DC vale 1 se il risultato dell'opera- di ottenere il seguente valore BSF F,B
zione è un numero superiore a 15. 00000101B, basterà preparare una Questa istruzione mette a uno il bit
C vale 1 se il risultato è positivo, maschera del tipo 00001111B e b del registro all'indirizzo f.
ovvero, se il bit 7 del registro conte- farne l'AND con il nostro valore di
nente il risultato vale 0; vale 1 se il partenza, vediamo come. Esempio:
risultato è negativo, ovvero, se il bit
7 del registro contenente il risultato ;Memorizza nel registro parm1 equ 0CH
vale 1. ; all'indirizzo org 00H
movlw 01010101B movlw 00000000B
ANDLW K ;Memorizza nel registro ;Valore iniziale
Effettua l'AND tra il valore contenu- ; all'indirizzo 0CH il movwf parm1
to nell'accumulatore W ed il valore ; valore iniziale da bsf parm1,0 ;D0=1
costante k. Il risultato viene memo- ; mascherare
rizzato nell'accumulatore. movwf 0CH Al termine del programma il registro
movlw 00001111B parm1 varrà 00000001B.
Esempio: ; Prepara la maschera Questa istruzione non influenza
; di bit alcun bit di stato.
org 00H andwf 0CH,W
start ;Effettua l'AND e BTFSC F,B
movlw 10101010B ; memorizza il risultato Testa il bit b contenuto nel registro
andlw 11110000B ; nell'accumulatore W all'indirizzo f e salta l'istruzione suc-
... cessiva se questo vale 0.
Il risultato in W sarà 00000101B
Dopo aver eseguito questo pro- come richiesto. Esempio:
gramma l'accumulatore W varrà
10100000B. W = 00001111 AND parm1 equ 0CH
Questa istruzione influenza il bit Z f = 01010101 = org 00H
del registro STATUS. ---------------- ;Valore iniziale
Z vale 1 se il risultato dell'operazio- W = 00000101 movlw 11111110B
ne vale 0. movwf parm1
La ANDWF influenza il bit Z del regi- loop
ANDWF F,D stro STATUS che varrà 1 se il risulta- ;D0 = 0 ? Si, esce
Questa istruzione effettua l'AND to dell'operazione è 0. btfsc parm1,0
logico tra il valore contenuto nell'ac- ;No, esegue il loop
cumulatore W ed il valore contenu- BCF F,B goto loop
to nel registro indirizzato dal para- Questa istruzione azzera il bit b del
metro f. Il parametro d è un flag che registro all'indirizzo f. Questo programma esegue un loop
indica su quale registro deve essere infinito lo stesso programma, non ese-
memorizzato il risultato. Esempio: gue il loop se sostituiamo l'istruzione:
Per d = W il risultato viene memoriz-
zato nel registro W. parm1 equ 0CH ;Valore iniziale

TUTORIAL 29
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 30

TUTORIAL

movlw 11111110B org 00H ne il bit Z del registro STATUS viene


call ledOn messo a 1.
con l'istruzione: ...
;Subroutine di accensione CLRW
;Valore iniziale ; di un led Azzera il registro W.
movlw 11111111B ledOn
bsf PORTB,LED1 Esempio:
Questa istruzione non influenza return
alcun bit di stato org 00H
Quando la CPU del PIC incontra una start
BTFSS F,B istruzione CALL, memorizza nello clrw
Testa il bit b contenuto nel registro STACK il valore del registro PC + 1 in ...
all'indirizzo f e salta l'istruzione suc- modo da poter riprendere l'esecu-
cessiva se questo vale 1. zione dall'istruzione successiva alla Dopo aver eseguito questo pro-
CALL, quindi, scrive nel PC l'indiriz- gramma l'accumulatore W varrà 0
Esempio: zo della subroutine saltando all'ese- ed il bit Z del registro STATUS sarà
cuzione di quest'ultima. uguale a 1.
parm1 equ 0CH Il valore originale del PC viene ripri-
org 00H stinato all'uscita della subroutine CLRWDT
;Valore iniziale con l'esecuzione dell'istruzione di Reset del watch dog timer.
movlw 11111111B ritorno RETURN o RETLW. Questa istruzione deve essere utiliz-
movwf parm1 Nel PIC16F84 sono disponibili 8 zata quando programmiamo il PIC
loop livelli di stack, per cui il numero con l'opzione watchdog abilitata
;D0 = 1 ? Si, esce massimo di CALL rientranti, ovvero (flag WDTE della word di configura-
btfss parm1,0 di istruzioni CALL all'interno di sub- zione).
;No, esegue il loop routine che a loro volta contengono In questa modalità il PIC abilita un
goto loop altre CALL, è limitato ad 8 livelli. timer che, dopo un determinato
Questa istruzione non influenza nes- tempo, effettua il reset della CPU.
Questo programma esegue un loop sun bit di stato. Questo timer deve essere azzerato
infinito lo stesso programma non ciclicamente con l'istruzione
esegue il loop se sostituiamo l'istru- CLRF F CLRWDT prima che raggiunga il suo
zione: Questa istruzione azzera il valore tempo massimo per evitare il reset
contenuto nel registro indirizzato della CPU.
;Valore iniziale dal parametro f. Maggiori informazioni sul
movlw 11111111B Watchdog (dall'inglese cane da
Esempio: guardia) sono riportate nelle scorse
con l'istruzione: puntate.
Ipotizziamo di voler azzerare il regi-
;Valore iniziale stro TMR0 il cui indirizzo è 01H esa- Esempio:
movlw 11111110B decimale, l'istruzione da eseguire
sarà: Nel loop riportato nel listato
Questa istruzione non influenza seguente il timer del watchdog
alcun bit di stato. clrf 01H viene azzerato ad ogni iterazione.
Se togliamo l'istruzione CLRWDT il
CALL K Oppure, se si include all'inizio del PIC verrà resettato automantica-
Richiama in esecuzione una subrou- nostro sorgente il file P16F84.INC, mente allo scadere del timer.
tine memorizzata all'indirizzo k. potremo utilizzare il nome simbolico Questa istruzione non influenza
Il parametro k può essere specificato del registro TMR0: alcun bit di stato.
utilizzando direttamente il valore
numerico dell'indirizzo oppure la clrf TMR0 org 00H
relativa label. loop
Esempio: Dopo l'esecuzione di questa istruzio- clrwdt

30 TUTORIAL
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 31

TUTORIAL

goto loop ; valore di W ciclo (loop) infinito.


movwf 0CH
COMF F,D ;Decrementa il valore org 00H
Questa istruzione effettua il comple- ; contenuto nel registro loop
mento del valore contenuto nel ; 0CH goto loop
registro indirizzato dal parametro f. decf OCH,F
Il parametro d determina la destina- Questa istruzione non influenza nes-
zione del valore ottenuto. Questa istruzione influenza il bit Z sun bit di stato.
Per d = W il valore viene memoriz- del registro STATUS che vale 1 se il
zato nel registro W, per d = F il valo- risultato dell'operazione vale 0. INCF F,D
re viene lasciato nel registro f. Incrementa il contenuto del registro
DECFSZ F,D all'indirizzo f e memorizza il risultato
Esempio: Decrementa il valore del registro nello stesso registro o nell'accumu-
all'indirizzo f e se il risultato vale latore W in base al valore del flag d.
parm1 equ 0CH zero, salta l'istruzione successiva. Per d = W il risultato viene memoriz-
org 00H Il risultato del decremento può esse- zato nel registro W, per d = F il risul-
movlw 01010101B re memorizzato nello stesso registro tato viene memorizzato nello stesso
movwf parm1 f oppure nell'accumulatore W in registro f.
comf parm1,F base al valore del flag d.
... Per d = W il risultato viene memoriz- Esempio:
zato nel registro W.
Al termine dell'esecuzione del pro- Per d = F il risultato viene memoriz- Con il seguente programma scrivia-
gramma il valore del registro parm1 zato nel registro f. mo il valore 23H nel registro all'indi-
sarà 10101010B. rizzo 0CH e quindi lo incrementia-
Questa istruzione influenza il bit Z Esempio: mo di uno.
del registro STATUS che vale 1 se il Al termine dell'esecuzione il registro
risultato dell'operazione vale 0. counter equ 0CH alla locazione 0CH conterrà il valore
org 00H 22H.
DEC F,D movlw 10 ;counter=10
Questa istruzione decrementa il movwf counter movlw 23H
contenuto del registro indirizzato loop ;Scrive in W il valore 23H
dal parametro f. ;counter=counter -1 movwf 0CH
Il parametro d è un flag che indica decfsz counter,F ;Copia nel registro 0CH
su quale registro deve essere memo- ;counter=0? Si esce ; il valore di W
rizzato il risultato. goto loop ;No continua incf OCH,F
Per d = W il risultato viene memoriz- ;Incrementa il valore
zato nel registro W. Questo programma esegue per 10 ; contenuto nel registro
Per d = F il risultato viene memoriz- volte l'istruzione decfsz finché esce ; 0CH
zato nel registro f. per counter = 0.
Questa istruzione non influenza Questa istruzione influenza il bit Z
Esempio: alcun bit di stato. del registro STATUS che vale 1 se il
risultato dell'operazione vale 0.
Con il seguente programma scrivia- GOTO K
mo il valore 23H nel registro all'indi- Determina un salto del programma in INCFSZ F,D
rizzo 0CH e quindi lo decrementia- esecuzione all'indirizzo k. Il parametro Incrementa il valore del registro
mo di uno. Al termine dell'esecuzio- k può essere specificato utilizzando all'indirizzo f e se il risultato vale zero
ne, il registro alla locazione 0CH direttamente il valore numerico del- salta l'istruzione successiva.
conterrà il valore 22H. l'indirizzo oppure la relativa label. Il risultato dell'incremento può esse-
re memorizzato nello stesso registro
;Scrive in W il valore 23H Esempio: f oppure nell'accumulatore W in
movlw 23H base al valore del flag d.
;Copia nel registro 0CH il Questro programma esegue un Per d= W il risultato viene memoriz-

TUTORIAL 31
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 32

TUTORIAL

zato nel registro W, per d=F il risulta- ----------- MOVLW K


to viene memorizzato nel registro f. 11111111 Assegna all'accumulatore W il valore
costante k.
Esempio: Traduciamo ora questo esempio in
un programma assembler per PIC: Esempio:
counter equ 0CH
org 00H org 00H org 00H
movlw 250 start
;counter = 250 start movlw 20
movwf counter movlw 00001111B ...
loop iorlw 11110000B
incfsz counter,F ... Dopo aver eseguito questo pro-
;counter=counter + 1 gramma l'accumulatore W varrà 20.
;counter=0? Si esce Dopo aver eseguito questo pro- Questa istruzione non influenza nes-
goto loop gramma l'accumulatore W varrà sun bit di stato.
;No, continua 11111111B.
Questa istruzione influenza il bit Z MOVF F,D
Questo programma esegue per del registro STATUS che vale 1 se il Questa istruzione copia il contenuto
256-10=6 volte l'istruzione incfsz risultato dell'operazione vale 0. del registro indirizzato dal parame-
finché esce per counter = 0. tro f, nell'accumulatore W o nello
Essendo counter un registro a 8 bit IORWF F,D stesso registro F. Il parametro d
quando viene incrementato dal valo- Questa istruzione effettua l'OR inclu- determina la destinazione.
re 255 assume nuovamente valore 0, sivo tra il valore contenuto nell'ac- Per d = W il valore viene memoriz-
da qui la formula 256-10=6. Questa cumulatore W ed il valore contenu- zato nel registro W.
istruzione non influenza alcun bit di to nel registro indirizzato dal para- Per d = F il valore viene lasciato nel
stato. metro f. registro f. In questo caso l'utilità dell'i-
struzione sta nel fatto che viene alte-
IORLW K Il parametro d determina dove viene rato il bit Z del flag STATUS in base al
Effettua l'OR inclusivo tra il valore memorizzato il risultato dell'opera- valore contenuto nel registro f.
contenuto nell'accumulatore W ed il zione. L'esempio seguente copia il valore
valore costante k. Per d = W il risultato viene memoriz- contenuto nel registro all'indirizzo
zato nell'accumulatore W. 0CH nell'accumulatore W:
Esempio: Per d = F il risultato viene memoriz-
zato nel registro f. movf 0CH,W
L'operazione OR inclusivo tra due MOVWF f
bit segue la seguente tavola della Esempio:
verità: Questa istruzione copia il contenuto
parm1 equ 0CH del registro W nel registro indirizza-
0 OR 0 = 0 org 00H to dal parametro f.
0 OR 1 = 1 Esempio: ipotizziamo di voler scrive-
1 OR 0 = 1 movlw 00001111B re il valore 10H (esadecimale) nel
1 OR 1 = 1 movwf parm1 registro TMR0. Le istruzioni da ese-
guire sono le seguenti:
In pratica se uno dei due bit vale 1 movlw 11111111B
anche il risultato sarà pari a 1. iorwf parm1,F movlw 10H
L'OR tra due registri viene effettuato ;Scrive nel registro W il
a coppia tra i bit che occupano la Al termine dell'esecuzione il valo- ; valore 10H
stessa posizione come riportato nel- re del registro parm1 sarà movwf 01H
l'esempio seguente: 11111111B. ;E lo memorizza nel
Questa istruzione influenza il bit Z ; registro TMR0
00001111 OR del registro STATUS che vale 1 se il
11110000 = risultato dell'operazione vale 0. Per i registri utilizzati dal PIC per

32 TUTORIAL
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 33

TUTORIAL

funzioni specifiche, solitamente non glia l'uso. Questa istruzione non influenza
viene inserito direttamente l'indiriz- In alternativa è consigliabile usare le alcun bit di stato.
zo ma il relativo nome simbolico seguenti istruzioni.
definito nel file P16F84.INC. RETLW K
Il codice diventa quindi il seguente: org 00H Questa istruzione ritorna il controllo
da una subroutine al programma
movlw 10H start principale.
;Scrive nel registro W bsf STATUS,RP0 A differenza dell'istruzione RETURN
; il valore 10H ;Attiva il banco registri 1 essa consente di passare, tramite
movwf TMR0 movlw 01000100B l'accumulatore W, il valore costante
;E lo memorizza nel movwf OPTION_REG k al programma principale.
; registro TMR0 ...
Esempio:
L'esecuzione della MOVWF non In pratica si consiglia di scrivere diret-
influenza nessun bit di stato. tamente nel registro OPTION presen- rtc equ 0CH
te nel banco 1 dei registri del PIC uti- org 00H
NOP lizzando la MOVWF, anziché l'istru- call mySub1
Questa istruzione non esegue nessu- zione OPTION che in futuro potreb- movwf rtc
na operazione ma è utile per inseri- be non essere più implementata. ...
re ritardi pari ad un ciclo macchina. Questa istruzione non influenza nes- mySub1
sun bit di stato. nop
Esempio: retlw 10
RETFIE
Utilizzando un quarzo da 4 MHz Questa istruzione deve essere inseri- Una volta eseguito questo program-
potremo ottenere un ritardo pari ad ta al termine di ogni subroutine di ma memorizza nel registro rtc il
1µs per ogni istruzione NOP inserita gestione degli interrupt per ridare il valore 10 passato dalla subroutine
nel nostro sorgente. controllo al programma principale. mySub1.
Questa istruzione non influenza
nop Esempio: alcun bit di stato.
;Esegue un ritardo pari
; ad 1µs org 00H RETURN
;Loop infinito Questa istruzione deve essere inseri-
La NOP non influenza nessun bit di loop ta al termine di ogni subroutine per
stato. goto loop riprendere l'esecuzione del pro-
gramma principale.
OPTION org 04H
Questa istruzione memorizza nel ;Interrupt vector Esempio:
registro speciale OPTION il valore intHandler
contenuto nell'accumulatore W. ... org 00H
retfie
Esempio: ;Ritorna dall'interrupt call mySub1
...
org 00H In questo sorgente il programma
principale esegue un loop infinito. mySub1
start Se abilitiamo uno degli interrupt del nop
movlw 01000100B 16F84, non appena esso si verifiche- return
option rà il controllo verrà dato automati-
... camente al programma allocato dal- Nel PIC16F84 possono essere anni-
l'indirizzo 04H (nell'esempio date fino ad 8 chiamate a subrouti-
Questa istruzione esiste per mante- intHandler), l'istruzione RETFIE ne del tipo:
nere la compatibilità con i PIC pro- determinerà quindi il ritorno al loop
dotti finora, la Microchip ne sconsi- principale. org 00H

TUTORIAL 33
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 34

TUTORIAL

call mySub1 CARRY varrà 0. clrf C,STATUS


... Questa istruzione non influenza nes-
sun altro bit di stato oltre al CARRY. ;Valore iniziale
mySub1 movlw 01010101B
call mySub2 RRF F,B movwf parm1
return Ruota i bit contenuti nel registro rrf parm1,F
all'indirizzo f verso destra (ovvero
mySub2 dai bit più significativi verso quelli Al termine del programma il registro
call mySub3 meno significativi) passando per il parm1 varrà 00101010B mentre il
return bit CARRY del registro STATUS come CARRY varrà 1.
illustrato in figura 2. Questa istruzione non influenza nes-
mySub3 sun altro bit di stato oltre al CARRY.
return Il contenuto del bit CARRY del regi-
stro status viene spostato nel bit D7 SLEEP
Questa istruzione non influenza mentre il valore in uscita dal bit D0 Questa istruzione blocca l'esecuzio-
alcun bit di stato. viene spostato nel CARRY. ne del programma in corso e mette
Il valore del parametro d determina il PIC in stato di standby (sleep dal-
RLF F,B la destinazione del risultato ottenuto l'inglese to sleep, dormire).
Ruota i bit contenuti nel registro all'in- al termine della rotazione.
dirizzo f verso sinistra (ovvero dai bit Per d = W il risultato viene memoriz- Esempio:
meno significativi verso quelli più zato nel registro W lasciando il regi-
significativi) passando per il bit CARRY stro f invariato. org 00H
del registro STATUS come illustrato in Per d = F il risultato viene memoriz- start
figura 1. Il contenuto del bit CARRY zato nello stesso registro f. sleep
del registro status viene spostato nel
bit D0 mentre il valore in uscita dal bit Esempio: Questa istruzione non influenza nes-
D7 viene spostato nel CARRY. Il valo- sun bit di stato.
re del parametro d determina la desti- parm1 equ 0CH
nazione del risultato ottenuto al ter- SUBLW K
mine della rotazione. org 00H Sottrae alla costante k il valore
Per d = W il risultato viene memoriz- ;Azzera il CARRY memorizzato nell'accumulatore W.
zato nel registro W lasciando il regi-
stro f invariato.
Per d = F il risultato viene memoriz-
zato nello stesso registro f.

Esempio: C D7 D6 D5 D4 D3 D2 D1 D0

parm1 equ 0CH Registro f

org 00H Figura 1: Rotazione dei bit contenuti nel registro all'indirizzo f verso sinistra

;Azzera il CARRY
clrf C,STATUS

;Valore iniziale
movlw 01010101B
movwf parm1
rlf parm1,F

Al termine del programma il registro Figura 2: Rotazione dei bit contenuti nel registro all'indirizzo f verso destra
parm1 varrà 10101010B mentre il

34 TUTORIAL
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 35

TUTORIAL

Esempio: SUBWF F,D C=1 in quanto il risultato è positivo.


Questa istruzione sottrae il valore Per valori iniziali di REG1=2 e W=2
org 00H contenuto nel registro W dal valore dopo l'esecuzione avremo REG1=0 e
contenuto nel registro indirizzato dal C=1 perché il risultato è sempre
start parametro f. Il parametro d è un flag positivo. Per valori iniziali di REG1=1
movlw 10 che indica su quale registro deve esse- e W=2, avremo REG1=FFH ovvero -
sublw 12 re memorizzato il risultato. Per d = W 1 quindi C=0 perché il risultato è
... il risultato viene memorizzato nel negativo.
registro W Per d = F il risultato viene Questa istruzione influenza i bit Z,
Dopo aver eseguito questo pro- memorizzato nel registro f. Esempio; DC e C del registro STATUS.
gramma l'accumulatore W varrà 2. analizziamo un esempio estratto dal Z vale 1 se il risultato dell'operazio-
Questa istruzione influenza i bit Z, datasheet della Microchip: ne vale 0.
DC e C del registro STATUS. Se inseriamo l'istruzione: C vale 1 se il risultato è positivo,
Z vale 1 se il risultato dell'operazio- ovvero, se il bit 7 del registro conte-
ne vale 0. subwf REG1,F nente il risultato vale 0; vale 1 se il
DC vale 1 se il risultato dell'opera- risultato è negativo, ovvero, se il bit
zione è un numero superiore a 15. Dove reg1 è l'indirizzo di un qualsia- 7 del registro contenente il risultato
C vale 1 se il risultato è positivo si registro specificato con la direttiva: vale 1.
ovvero se il bit 7 del registro conte-
nente il risultato vale 0 e 1 se il REG1 RES 1 SWAP F,D
risultato negativo ovvero se il bit 7 Scambia il valore del quattro bit più
del registro contenente il risultato Per valori iniziali di REG1=3 e W=2, significativi (D7-D4) contenuti nel
vale 1. dopo l'esecuzione avremo REG1=1 e registro all'indirizzo f con i quattro

VISUAL PARSIC Compilatore grafico per Microchip Picmicro


Per chi vuole scrivere un programma in Assembler senza scrivere un solo rigo di codice

Programmatori PIC
Display LCD/VFD
ICD Debugger
Noritake Cristallfontz

Programmatori Willem
originali olandesi
Gruppi di continuità
da 500 VA fino a 160 KVA

Schede PLC per PICmicro

Telecamere a colori e b/n


trasmittenti e via cavo Display a carattere scorrevole
in offerta speciale

WWW.PARSICITALIA.IT
Via Rovereto, 13 - 48020 Savio (RA) - Tel 0544.927468 - Fax 178.6040078 - Email: parsicitalia@libero.it

TUTORIAL 35
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 36

TUTORIAL

bit meno significativi (D3-D0) dello Questa istruzione non influenza nes- in due forme a seconda di dove
stesso. Il risultato viene memorizza- sun bit di stato. vogliamo mettere il risultato, ovvero:
to nell'accumulatore W o nello stes-
so registro f in base al valore di d. XORLW K xorwf COUNTER,F
Per d = W il risultato viene memoriz- Effettua l'OR esclusivo tra il valore ;COUNTER=COUNTER XOR W
zato nel registro W. contenuto nell'accumulatore W ed il
Per d = F il risultato viene memorizza- valore costante k. In alternativa:
to nello stesso registro F.
Questa istruzione non influenza alcun Esempio: xorwf COUNTER,W
bit di stato. ;W=COUNTER XOR W
org 00H
TRIS F L'OR esclusivo (XOR) è un'operazione
Questa istruzione memorizza in uno start tra due bit in cui il bit risultante vale 0
dei registri speciale TRIS il valore con- movlw 00000000B se i due bit sono uguali.
tenuto nell'accumulatore W. I registri xorlw 11110000B Spesso lo XOR viene utilizzato nell'as-
TRIS determinano il funzionamento in ... sembler del PIC per effettuare la com-
ingresso e uscita delle linee di I/O del parazione tra due valori in mancanza
PIC. Esiste un registro TRIS per ogni Dopo aver eseguito questo pro- di un'istruzione specifica. Ipotizziamo
porta di I/O denominato TRISA, gramma l'accumulatore W varrà di avere un valore nel registro REG1 e
TRISB, e così via. 11110000B. di voler verificare se è uguale a 57H.
Questa istruzione influenza il bit Z Le istruzioni da eseguire sono le
Esempio: del registro STATUS. seguenti:
Z vale 1 se il risultato dell'operazio-
org 00H ne vale 0. movlw 57H
;W=Valore da comparare=57H
start XORWF F,D ;Risultato W = 57H
movlw 11111111B Questa istruzione effettua l'OR
tris PORTA esclusivo (XOR) tra il valore conte- xorwf REG1,W
... nuto nell'accumulatore W ed il valo- ;W = W XOR REG1 Effettua lo
re contenuto nel registro indirizzato ; XOR con il valore in REG1
Questa istruzione esiste per mantene- dal parametro f. btfss STATUS,
re la compatibilità con i PIC prodotti Il parametro d è un flag che indica ;Salta l'istruzione
finora, la Microchip ne sconsiglia l'uso. su quale registro deve essere memo- ; seguente se il risultato
In alternativa è consigliabile usare le rizzato il risultato. ; dello XOR vale 0, ovvero
seguenti istruzioni. Per d = W il risultato viene memoriz- ; se il valore di REG1 e'
zato nel registro W. ; pari a 57H
org 00H Per d = F il risultato viene memoriz- goto diverso
zato nel registro f. ;Salta se diverso da 57H
start Questa istruzione influenza i bit Z goto uguale
;Attiva il banco registri 1 del registro STATUS che varrà 1 se il ;Salta se uguale a 57H
bsf STATUS,RP0 risultato dell'operazione è 0.
CONCLUSIONI
movlw 11111111B Esempio: Abbiamo così terminato il noiosissi-
movwf TRISA mo elenco delle istruzioni assembler
... Ipotizziamo di dover effettuare lo del PIC. Nel prossimo numero, tor-
XOR tra il registro W ed il registro neremo a lavorare su qualcosa di
In pratica si consiglia di scrivere REG1 da noi definito all'indirizzo pratico. Dopo aver realizzato dei
direttamente nei registri TRIS pre- 0CH con la direttiva: semplici esperimenti con diodi LED
senti nel banco 1 dei registri del PIC e pulsanti, vedremo come interfac-
utilizzando la MOVWF anziché l'i- REG1 EQU 0CH ciare il PIC16F84 con qualcosa di
struzione TRIS che in futuro potreb- più complesso come un display
be non essere più implementata. Possiamo utilizzare l'istruzione IORWF LCD. Alla prossima puntata.

36 TUTORIAL
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 37

TUTORIAL

Sintassi Descrizione Microchip Operazione equivalente


ADDLW k Add Literal and W W = W + k
ADDWF f,d Add W and f d = W + f (dove d può essere W o f)
ANDLW k AND Literal with W W = W AND k
ANDWF f,d AND W with f d = W AND f (dove d può essere W o f)
BCF f,b Bit Clear f f(b) = 0
BSF f,b Bit Set f f(b) = 1
BTFSC f,b Bit Test f, Skip if Clear f(b) = 0 ? Si, salta una istruzione
BTFSS f,b Bit Test f, skip if Set f(b) = 1 ? Si, salta una istruzione
CALL k Subroutine Call Chiama la subroutine all'indirizzo k
CLRF f Clear f f = 0
CLRW Clear W Register W = 0
CLRWDT Clear Watchdog Timer Watchdog timer = 0
COMF f,d Complement f d = not f (dove d può essere W o f)
DECF f,d Decrement f d = f -1 (dove d può essere W o f)
d = f -1 (dove d può essere W o f) se
DECFSZ f,d Decrement f, Skip if 0
d = 0 salta
GOTO k Go to address Salta all'indirizzo k
INCF f,d Increment f d = f +1 (dove d può essere W o f)
d = f +1 (dove d può essere W o f) se
INCFSZ f,d Increment f, Skip if 0
d = 0 salta
IORLW k Inclusive OR Literal with W W = W OR k
IORWF f,d Inclusive OR W with f d = f OR W (dove d può essere W o f)
MOVLW k Move literal to W W = k
MOVF f,d Move f d = f (dove d può essere W o f)
MOVWF f Move W to f f = W
NOP No Operation Nessuna operazione
OPTION Load Option Register OPTION = W
RETFIE Return from Interrupt Ritorna da un interrupt handler
RETLW k Return Literal to W Ritorna da una subroutine con W = k
RETURN Return from Subroutine Ritorna da una subroutine
RLF f,d Rotale Left f through Carry d = f << 1 (dove d può essere W o f)
RRF f,d Rotale Right f through Carry d = f >> 1 (dove d può essere W o f)
SLEEP Go into Standby Mode Mette in standby il PIC
SUBLW k Subtract W from Literal W = k - W
SUBWF f,d Subtract W from f d = f - W (dove d può essere W o f)
SWAPF f Swap f f = Swap dei bit 0123 con 4567 di f
TRIS f Load TRIS Register TRIS di f = W
XORLW k Exclusive OR Literal with W W = W XOR k
XORWF f,d Exclusive OR W with f d = f XOR W (dove d può essere W o f)
Tabella 1: Elenco delle istruzioni disponibili per il PIC16F84

TUTORIAL 37

Potrebbero piacerti anche