Scheda detle istruzioni : f istruzione BTFSC M$%, uesta e una delle istruzioni chiamate "istru- ffi ffi 'ffi zioni di salto condizionato" che ha il PlC. ffi ffi Anche se tante consonanti di seguito W ffi appaiono difficili da ricordare dato che non qffieei#W&b hanno significato, in realtà rispondono alle sigle di quello che fa: testa (t) un bit (b) di registro (f e la denominazione che stiamo dando ai registri in gene- rale. prima di sostituirla con il vaìore corretto caso per ---^\ ^ --r+- /-\ -^ : -.ro (c) Ouesto salto e niuttosto un Ld)U,/ C )dlLd \)/ )U C ZCrv \!/. \<ULJLv JurLv L V passo in avanti, dato che ignora solo un'istruzione che, pertanto, non viene eseguita. Questa è la prima istruzione fra quelle viste finora, il cui ciclo di esecuzione puo essere 1 o 2. Così se il saito non si realizza il PC conosce I'induizzo dell'istru- zione da eseguire in successione, che è quello seguen- te alla btfsc; pero, se deve effettuare il salto, dato che il valore del bit e uguale azero, il PC dovra calcoìare il nuovo indirizzo, per cui sarà necessario un ciclo addi- zionale. scit* s+ fu:* s! csegu* s* b= I PARAMETRO PARAMETRO MNEMONICO I 2 .--l-.:l".:":"""--i""-r . ""!"-,-.-".-i Operozione: nel coso che il bit segnoloto dol registro obbio volore 0 l'istruzione seguente è ignoroto e nel coso confrorio no. Cicli: 1-2 Codice OP: 0l lObb bfff ffff Flogs: nessuno Schema del comportamento dell' istruzione btfsc a seconda del valore di un bit. tr$*:ffi$3X il*ru fK-Y*tUXg#rufr #?$:Sfl Dobbiamo tenere conto che quando si compie la condizione e si esegue il salto, si esegue un'unica istruzione, pero se la con- dizione non si compie, si eseguono entrambe le istruzioni perche dopo la prina arriva la seconda. Questo e indicato nello schema generaìe della frgura, dove le lrareo r:nnro<ont:n, , -rr, ---,,.-,,o ta sequenza cne senronÒ le ìsf rr rzioni in entrambi i casi. ì due grafici mostrano la stessa cosa, il prìmo nella forma che avrà il programma e il secondo in forma grafica. Caratteristiche dell' istruzione btfsc $w$*wwww
54
Embed
Microrobotica Monty Peruzzo Editore - 09 B - Programmazione
Tutta la raccolta in versione torrent al link: http://www.tntvillage.scambioetico.org/index.php?act=showrelease&id=192104 Su Issuu c'è la raccolta completa. Cerca "Monty Peruzzo Editore".
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Scheda detle istruzioni :
f istruzione BTFSC
M$%, uesta e una delle istruzioni chiamate "istru-ffi
ffi 'ffi zioni di salto condizionato" che ha il PlC.
ffi ffi Anche se tante consonanti di seguito
W ffi appaiono difficili da ricordare dato che nonqffieei#W&b hanno significato, in realtà rispondono alle
sigle di quello che fa: testa (t) un bit (b) di registro (f ela denominazione che stiamo dando ai registri in gene-
rale. prima di sostituirla con il vaìore corretto caso per---^\ ^ --r+- /-\ -^ : -.ro (c) Ouesto salto e niuttosto unLd)U,/ C )dlLd \)/ )U C ZCrv \!/. \<ULJLv JurLv L V
passo in avanti, dato che ignora solo un'istruzione che,
pertanto, non viene eseguita.
Questa è la prima istruzione fra quelle viste finora,il cui ciclo di esecuzione puo essere 1 o 2. Così se il
saito non si realizza il PC conosce I'induizzo dell'istru-zione da eseguire in successione, che è quello seguen-
te alla btfsc; pero, se deve effettuare il salto, dato che
il valore del bit e uguale azero, il PC dovra calcoìare il
nuovo indirizzo, per cui sarà necessario un ciclo addi-zionale.
scit* s+ fu:*s! csegu* s* b= I
PARAMETRO PARAMETROMNEMONICO I 2
.--l-.:l".:":"""--i""-r . ""!"-,-.-".-iOperozione: nel coso che il bit segnoloto dol
registro obbio volore 0 l'istruzioneseguente è ignoroto e nel cosoconfrorio no.
Schema del comportamento dell' istruzione btfsca seconda del valore di un bit.
tr$*:ffi$3X il*ru fK-Y*tUXg#rufr #?$:SflDobbiamo tenere conto che quando si
compie la condizione e si esegue il salto, si
esegue un'unica istruzione, pero se la con-dizione non si compie, si eseguonoentrambe le istruzioni perche dopo la
prina arriva la seconda. Questo e indicatonello schema generaìe della frgura, dove lelrareo r:nnro<ont:n,, -rr, ---,,.-,,o ta sequenza cnesenronÒ le ìsf rr rzioni in entrambi i casi. ì
due grafici mostrano la stessa cosa, il
prìmo nella forma che avrà il programma e
il secondo in forma grafica.Caratteristiche dell' istruzione btfsc
$w$*wwww
Sch eda delte istr uzioni :f istruzione BTFSS
$ analoga alla precedente. Seguendo dì
nuovo la sua sigla vediamo che cambia solol'ultima lettera, questa istruzione testa (t) un
bit (b) di un registro (f) e salta (s) se è un uno(s e l'iniziale in inoìese della narola "set" o
mettere a uno).
Per quanto riguarda i cicli di istruzione si comportacome l'istruzione orecedente.
fl5*iffi pg **r* ilxsY$cqixg{:*h$ffi $3sFss
In questa occasione sono stati sostituiti i dati generali
per ottenere un esempio reale. In esso, a seconda del
valore del flag Z del registro di Stato, si indirizza l'ese-
cuzione del programma ad una parte oppure ad un'al-tra. Listruzìone fa la stessa cosa della btfsc, però salta
nelcaso che ilvalore sia a uno e ilsalto riguarda solo l'i-struzione immediatamente successiva. Nonostante que-
sto, come possiamo vedere, l'organigramma e variatoin modo sostanziale risoetto al caso orecedente.
nel cqso che il bit segnololodol registro obbio volore ll'istruzione seguente è ignorotoe nel coso controrio no.1-2ot 1 l bb bfff ffffnessuno
Ca ratte r i sti c h e d e I I' istru z i o n e btf ss
Schema del comportamento dell' istruzione btfss,
a seconda del valoredi un bit, mostrato con un csempro.
Questo non è dovuto alla funzione cherealizza l'istruzione btfss tpotrebbe essere
così anche per la btfsc), ma dal fatto che
f ra tutte le istruzioni che si potevano utiliz-zaro dana l: htf<< lo htf<r) o qtat: qrclt; la4q,r uvyv
goto.Con questa istruzione, come abbiamo già
visto, si spezza il flusso sequenziale di un
programma e si salta lì dove indica l'etichet-ta. Questo è il modo di utilizzo più comune
delle istruzioni btfsc e btfss.
Sw**q*wwrm
Programm azione:strutture di control,lo
a programmazione modulare e strutturatadiminuisce il costo dt realizzazione e manteni-mento dei programmi, e aumenta la sua affi-dabilita e leggibilita. Per questo si costruisco-
no moduli o pezzi di programmi seguendo
certe regole. I moduli a loro volta, sono formati da
strutture, le quali possono essere di tre tipi: sequenzia-
li, condizionali e ripetitive. L'organigramma della figuraa lato, rappresenta un programma con tre tipi di strut-ture, che sono quelle abituali.
$Yffi #YT9J ffi €: Sil*tj ile*HX&Lg
Le strutture sequenziali, o concatenate, si costruiscono
scrivendo le istruzioni nell'ordine in cui piu tardi saran-
no eseguite, sarebbe a dire una dietro l'altra.
Graficamente si puo rappresentare come una serier{i nrr:dri in <o-
quenza, ognunodei quali e un'i-struzione.
Le frecce di
unione segnanoIa sequenza logi-ca di esecuzione,nella quaìe nonpossiamo omet-+^r^LUtC ttc))utto Organigramma di un programma con tre tipi
di strutture di controllo.
Dcre mes:oggi di benvenuto
€hiedere N" degli olunni
O ff"18'L No
Vo ollo finerlro"Non si DUò fore lo medio"
Prende il N' degli olunni
Chiede il voto medio del corsoln(rmenlq il (onl,otore delle medie
Contq*ore delle medie = Confqtoredelle medie / N' degli olurni
Vq qllq finestrcr"ll voto medio dello clqsse èr"vqfore del <onlotore di nedio
Dore mes:oggio di uscifo
istruzione I
istruzione 2
islruzione..
istruzione n
[.]lì.r,ì x 6 i ur 5LruLLuteut LUrìììrì,ììì. azlone. J -___,-*:ììiìì lP annra<Ònfa7i^na
delle strutture sequenziali in forma grafica
$€$q ilJY-r'à$ w$i fl # ru ffi xxx* rueLs
Normalmente non e sufficiente porre
le istruzioni una dietro l'altra, nel caso
in cui esse dipendano da eventi ester-ni hisnnna notpr nrendere una deci-sione e sceoliere un nercorso fra due- -" tr'
nossibili F orrello che viene denomi-nato struttura condizionale o alterna-
fo lso
blocco diistruzioni 2
condizionevero
blxco diistruzioni I
Se lo condizione è vero
A,LLORA eseguire il blocco I iiALTRIMENTI eseguire il blocco 2
1
blocco diisiruzioni 3
Ra a a resentazio ne del le struttu re co nd izi o n a l i I F-TH EN- ELS E.
Ssp$$wwr**
condizione
bl*co diistruzioni I
SE lo condizione è vero l
- ii'i,T:::':::l::.::' . . i
blocco diislruzioni 2
cur dobbiamo evitare questo schema,
e per questo la cosa migliore e tra-sformarlo in una struttura condiziona-le gia vista, pero in forma annidata.
Nella figura corrispondente vienerndicato questo annidamento con un
esempio. Si vuole determinare qual e
il colore scelto fra tre possibili. ll
primo impulso è chiedere direttamen-te qual è il colore, restando alla prima
figura.
Rappresentazione della struttura condizionale IF-THEN-ELSE con un solo ramo
tiva. che in pseudocodice si conosce come lF-THEN-
ELSE se la condizione ha solo due ramificazioni, oCASE, se la scelta è multipla. La decisione puo essere
determinata dal valore di una variabile, per una chia-mata di un evento esterno, ecc.
ll grafico indica i due cammini possibili di una lF-
THEN-ELSE. Come possiamo vedereall' nterno di una struttura condizio-nale puo esistere, a sua volta, una
struttura sequenziale, che possiamo
sostituirla con il suo schema.A seconda del valore della condi-
zione, si eseguirà il blocco di istruzio-ni 1 o 2, però mai entrambe. Anchese l'esecuzione del blocco di istruzio-ni 3 non e pertinente alla strutturacondizionale in sé, è stato introdottonel grafico perche dopo una biforca-zrone si ritorna sempre ad ;n pro-gramma comune, anche se alla fine,per termínare in un unico punto.
Potrebbe succedere che manchiuno dei blocchi di istruzioni, in que-
sto caso, a seconda della condizione,si escnrrir: rrn hlorro di istruzioni o
non si farà nulla. Nella figura in alto,e stata rappresentata la mancanzadel blocco di istruzione, nel caso di"condizione falsa", pero potrebbeverificarsi anche il caso contrario: nonfare nulla se si compie tale condizio-ne.
Potrebbe succedere che la decisio-no ri: nrondoro nnn <i: lan r+r r Àr rnrrL uu vrLrruLrL rrvr rrro lcgcto d uuc<olo ricnó<tp m: :d I,_., ..-r_,-_ Jn nun'ero ptu
alto, come succede nel CASE. In que-
sto caso non abbiamo una traduzioneimmediata nell'assembler del PlC, per
Ss#kwww
Se al posto di questo immaginiamo il gioco del"vero o falso", dove Ie sole risposte alle domande pos-
sono essere "si" o "no" , andiamo alla seconda strut-tura, in cui il risultatofinale è lo stesso. Anche se abbia-mo fatto due domande, l'annidamento puo essere
largo quanto vogliamc.
gngro
blocco diisiruzioni I
nero
blocco diisfruzioni 2
blqco diistrszioni 4
blocco diistruzioni 3
colore bisnco Ir.b
colore nero
blocco diistruzioni I
Hg colore grigio
blocco diistruzioni 2
blocco diisiruzioni 3
blcco diÍstruzioni 4
Se lo condizione I è veroALLORA eseguire blocco 'i
ALTRIMENTI
Se lo condizìone 2 è vero
ALLORA eseguire blocco 2ALÌRIMENT| eseguire blocco 3
:
Esempio di trasformazione di una struttura CASE in varie IF-THEN-ELSE annidate
m,F,:-,
W:iai..:
ì!::lìat:ia :,1
l11d;:: -
&it. .
&F
íi.m:ffi*.'
F.
À1,*
#H_:tr:Wb,'
ffi.R}:ff.'w;!::{'-fl:t.,:
a
T".,*Í$..k"'
s{,*&{il,t:,:::.
;
w""w\lss!*i:: .
$95:l::ì:l
*tìrì'::.À!ùì:::irìì :.'
ffilì,.',
#ffii:'.,
ffi}li:,.r,ffiq{li:::-::t:- - :
::
;Hw{
.1*.,aa:a:::,,:
ilà:ì:ì,',:
ffii;l;i'ttt.:.:a:,-,
*iìa,.,..
ffif:'.4glifl.w-...w:ffi.i...
ffi;àli'''rì:::l:.'?ìl!$iì::l&:ri:::'à.6t:
dàl;i:F"-
{..':.&.::3:: .
*{|
w{91"ffi&€i, '
ffiffi$E*..
&r":ffii..@'
Fl SF annidate e nrran619 si vuole ana-lizzare un blocco di istruzioni solo se
si compiono alcune condizioni nellostesso tempo. In questo caso, comenel precedente, dobbiamo evitare oifare una domanda, e al posto di que-sta, una volta verificata la veridicità di
una condizione, formulare la doman--J - -^^, ,^^+^
^, ,^-+uc )cgucrLc. rluc>rO fappfeSenta
l'implementazione di una AND logi-ca, Le altre operazioni logiche, inol-tre, possono anche essere rappresen-tate con strutture annidate.
SYffi &JYYIJ ffi K ffiXPffiYXYXVg
Come indica il nome stesso, le strut-ture ripetitive servono per ripetere un
determinato numero di volte un bloc-co di istruzioni. Nuovamente, quindi,all'interno di esse devono essere con-tenute le strutture sequenziali. ll
numero di volte che si ripete il bloccopuo essere noto, o dipendente da
una variabile o da un evento. Aseconda dell'autore consultato, o del
linguaggio di programmazione che si
prende come riferimento, il nome di
questo trpo di struttura varia, di
modo che conviene f issarci sull'essen-za di ouello che fa niuttosto che sul
nome che riceve. Se il numero di
volte che deve essere eseguita un'i-Osserviamo che in questa occasione le alternative
vere si trovano alla sinistra della figura, perche lo sche-ma ristrltarte e nirrrnrpglo da vedere e da realizzare.
L'altro caso in cui sono necessarie le strutture lF-THEN-
Struttura FOR conpseudocodice e suo adattamento per il compilatore del PIC
struzione e fisso, stiamo parlando di un ciclo, previstonella maggior parte dei linguaggi di programmazione,
e che di solito si chiama FOR; si ripete qualcosa per un
numero di volte Anche all'interno delle strutture ripe-
Struttura WHILE-DO
in pseudocodice e suo adattamento per il compilatore del PIC
Ng
rímongo o coso
è giornofo bello
vodo o posseggio
NO e grorno
ùto
rimcngo o coso
fo bello
vodo c posseggio
Se lo condizione 'l è veroALLORA
Se lo condizione 2 è veroALLORA eseguire blocco I
ALIRIMENTI eseguire blocco 2
ALTRIMENTI eseguire blocco 2
lmplementazione dell'operatore logrco AND con strutture IF-THEN-ELSE annidate
Strutturo l
::-"rvl-:-*::: _..iStrutturo odottoto
. ..t_:::::_T:::":::".*l T _ruK numero vofé uu
lslruzione 1
lslruzione 2lstruzione 3
irtrr.ion. nEND FOR
Contolore = numero di volîeEtichefo lstruzìone l
lstruzione Ilslruzione 2lstruzione 3
iriru.ion. nDecremenlo conloloreSe il volore del contotore è 0
ALLORA vo ollo FineALTRIMENTI vo q Etichetio
Fi ne
Shutturo Shutluroin pseudocodic" i per il compilobre del PIC
WHILE condizione vero D0Isfruzione Ilstruzione 2lstruzione 3
iitrurion" n
ENDWHILE
Chiedere Se lo condizione è verqALLORA ondore o EtichettoALTRIMENTI ondore ollo Fine
Etichetto lstruzione 1
lstruzione 2lstruzione 3
tsruztone n
Andore o ChìedereFine
S*$&nrwre
Strulturoin pseudocodice
: Strutturq odqllqtqi "".
il compilorore del PIC
I EiichettoDO
lslruzione llslruzione 2lstruzione 3
irìr".i."" "WHILE condizione vero
lstruzìone Ilstruzione 2lstruzione 3
iiirr=io.".Chiedere Se lo condizione è vers
ALLORA ondore o EtichefroALTRIMENTI ondore ollo Fine
F ine
Struttura DO-WHILEin pseudocodice e suo adattamento per il compilatore del PlC.
titive si ulllizza una condizione oer controllare la finedel ciclo, ma non deve essere confusa con le strutturecondizionali. Quando si deve compiere una condizioneper uscire dal ciclo si dice che è una WHILE-DO (men-
tre si compie una condizione fare qualcosa), o una DO-
WHILE (fare qualcosa mentre si compie una condizio-ne) oppure una REPEAT-UNTIL (fare qualcosa fino a che
si compie la condizione). E infrequente che i linguaggidi programmazione abbiano le tre varianti allo stesso
tempo, dato che una si può trasformare in un'altra. I
tre tipi di cicli possono tradursi facilmente nell'assem-
bler deì PlC. La differenza fra la WHILE-DO e la DO-
Slrutlurq i Strutturo odqltqfq
i: "-:::-t""d:-" r T: :l ::-":1"::" t"l::'i
REPFAT i Eliche*oi lstruzione I
lstruzionef I lstruzione2fslruzione2 i lstruzione3lslruzione 3 ...
rstruzione. i lstruzionen
Ch;"d"." Se lo condizione è 'eroUNTIL condizione vero
; ALLORA ondore o Eticheito; ALTRIMENTI ondore ollo Fine
: Fine
Struttu ra RE PEAT-U NTIL
in pseudocodtce e suo adattamento per il compilatore del PIC
WHILE è che nella prima se non si compie la condizio-ne, le istruzioni non si eseguono. Nella DO-WHILE inve-ra qi oqonrrnnn lo iqtfl J-i^^i l- ^.;-- ,,^l+- ^-ztonr ra pilmd vorrd, e se sl com-pie la condizione, si continuano ad eseguire. La
REPEAT-UNTIL è simile alla DO-WHlLE, dato che il bloc-
co di istruzioni si ripete almeno una volta, e continua a
ripetersi fino a che non si compie la condizione. Comepossiamo osservare, se si comparano gli schemi, le dif-ferenze sono nella negazione della condizione, datoche nella DO-WHILE si suooone che sia vera e si esce
quando si converte in falsa, e nella REPEAT-UNTIL si
considera falsa e si esce 0uando dìventa vera
bloccodi islruzioni
bloccodi istruzioni
verq folso
condizione condizione
folso verq
STRUTTURA DO.WHIIE STRUTTURA REPEAT.U NTI L
Schema di funzionamento delle strutture DO-WHILE e REPEAT-UNTIL
ncora una volta le lettere che compongonoil mnemonico di questa istruzione ci indica-no la funzione che realizza. La decfsz
decrementa (dec) un registro lf) e salta (s)
se il risultato è zero (z). ll risultato del
decremento può essere memorizzato nello stesso regi-ctrn rhp <i nrcndp romo h:co nér nro<t: nnor:zinno
oppure nel registro di lavoro W, nel cui caso il valore del
regrstro non vara.Forse ricorderete un'istruzione simile chiamata btfsc,
in quell'istruzione per fare riferimento allo zero si ulilizzala c al posto della z. Questo perche esiste una differenzasostanziale, dovuta al fatto che la btfsc verifica se è a
zero un bit ("clear" o cancellato), mentre nella decfsz si
verifica se un registro completo ha assunto valore zero(00h). Come la btfsc, il salto che produce e di una sola
istruzione, e nel caso in cui il salto venga eseguito, la
Operozione: decremenlo di uno unitò ilcontenuto del reqistro f. Nel cosoin cui il risultoto"di ouestooecremento sio 0 l'istruzioneseguente è ignoroto, e nel cosocontrorio no. Se d= 0 il risultotodel decremento si memorizzo nelregistro di lovoro W e se d-l simemorizzo nello stesso registro f.
Cicli: 1-2CodiceOP: 00 I0l I dfff ffffFlog: nessuno
Ca ratteristi che del I' istruzi on e decfsz.
Schema di come si comporta l'istruzione decfsz, a secondad el ri su ltato del l' operaz ion e,
prendendo come secondo parametro il valore d = 0.
€:%ffi$!qPg
il#ru $-'gsT$ail$Kx#rdffi #ffiilflsxLo schema rappresentato ricordaquello gia visto per l'istruzione btfsc,anche se con sostanziali differenze. La
piu importante, per quanto ci riguar-da, è che l'istruzione non solo verificarrn rr:lnro nor r]oridoro ca .:l+..^ ^ur I vorvrq pgr uELtuEtE )c )ctLdtc u
meno, ma realizza anche un'opera-zione, il decremento, e salta a secon-da dpl ricr rltato .ronor:tn So npr l:JL VL' 'u
funzionalità del programma, ci inte-ressa solo l'operazione di salto, non ènecessario memorizzare il risultato,quindi lo porteremo nel registro di
lavoro, senza eseguire ulteriori opera-zioni su di esso. La stessa funzioneche compie questa operazione si può
realizzare mediante la combinazionedelle istruzioni decf e la successivaverifir: dol flen 7 ron 16 [1f56
$$w#sxesclwxrw
Scheda detle istruzioni:l'istruzione INCFSZ
ffi d istruzione e simile allaffi -;- ^^l-ffi Prece0enle, sld llelrd
ffi struttura che nell'uso,ffiffi anche se al posto del
W decremento di un
registro questa realizza il suo
incremento, e in ugual modo
salta se il risultato è zero. Nelrrcn dalle dorf<z nrr,'Y-J apparlrepiu chiaro, pero anche incre-
mentando un registro si puoneqs:rp npr lo zero dato che
dopo il valore massimo (FF) si
Strutturo dipseudocodice
FOR numero di volte DO
lstruzione'llstruzione 2lstruzione 3
iri.r.;on. nENDFOR
Strutturo utilizzondo decfsz i S*r*ro ufilizondo incfsz
Traduzione della struttura FOR mediante le istruzioni decfsz e incfsz
movlw NUMERO I movìw C2 (NUMERO)mowf CONTATORE I mowf CONTATORE
ETICHETTA lstruzione 1 I ETICHETTA lstruzione 'l
lstruzione 2lsiruzione 3
lstruzione 2lstruzìone 3
decfsz CONTATOREgoro ETICHETTAgoto FINE
lstruzione nincfsz CONTATORE
goto ETICHETTAgoto FINE
passa al minimo (00) con l'incrementosuccessivo,
flsgffipxf, #f'é *iXSTRL$AX#ru tr Xrufl rSX
Lo schema di funzionamento di questa
istruzione e lo stesso di quello per ladecfsz anche se al nosto delle sottra-zioni abbiamo le somme. Entrambe le
istruzioni si utilizzano nella costruzionedei cicli in cui si deve ripetere un insie-
me di istruzioni un determinato numero
di volte.
Nella figura è mostrata la traduzionedella struttura FOR a istruzioni del PlC,
impiegando la incfsz e la decfsz. Notare
che l'unica differenza, a parte il cambiodi un'istruzione con L;n'altra, e r^el valo--^ -L ^ .J^. .^ ^--^-^ i^trndnttn nol roni-lC Llltr UCVC t:))flC lllLrvuvLrv rLr rLyl
stro che si usa come contatore, che nel
caso dell'istruzione è direttamente il
numero di volte che si vuole ripetere
una sequenza, mentre per la incfsz, per
contare lo stesso numero di volte, biso-gna introdurre il complemento a 2 di
detto valore.
OPERANDOMNEMONICO FONTE
OPERANDODESTINAZIONE
Operozione: incremenfo di uno unitò il conienulo- del regislro f. Nel coso in cui il risuhotodi que"sto incremento sio O l'istruzioneseguente è ignoroto, e nel coso confroriono. Se d=O il risultolo dell'incremen?o simemori-.o nel registro di lovoro W e sed=l si memorizzo nello stesso reqistro f.
ma sino al momento della simulazione.Complìcheremo ora un po' il prtmo pro-nramma nronosfo e faremo tutte le fasi
una dopo l'altra.
Modificheremo l'enunciato dell'esercizio nel se-
guente modo.
[nunciato òmpliato del prtmo programma propasto
L'applicazione dell'esercizio suppone di vedere i dati, dt
modo che l'utìlizzatore possa osservare cosa sta succe-
dendo all'interno del microcontroller.
l"'l'-; rj.*í{'.'t ', '
Quando parliamo dei passr per la realizzazione di un
progetto, abbiamo gia visto che la prima cosa da fa-re e plasmare l'enunciato dell'esercizio in un organi-grarnma, Quanto piu preciso e l'enunciato, tanto piu
facile sara questa trasformazione, e meno ambigr,,ita
esisteranno al momento di interpretarlo. 5e si vuolefare un organigramma dell'enunciato precedente do-
vrebbe risultare come quello della f igura a f ianco.
Nel fare un organigramma, il primo riquadro deve
corrispondere alla definizione e alla configurazione dei
registri Anche se non e obbligatorìo decidere ìn prece-
denza qualì risorse si utilizzeranno, facilita il lavoro suc-
cessivo di programmazione. Dal nostro enunciato possia-
mo dedurre che si
utilizzeranno treradr<irr o rrn2 n^r-
ta, che verrà con-figurata come
uscrta, per mo-
strare i dati. Da-
to che r reg t-
stri hanno ottobit e delìe duennrto pcictenti nol
PlC16FB4 solo lannrte R a nli ntin
l;^^^ -, ^
--^l+-
q u esta.
ll programma
consisterà in una
serie di istruzionidiqnn<to in fnrm:
-^^,,^^-i-l^
questo sr puo ve-
dere nell'organi-gramma per l'as-
senza dei rombirha frnnn nranr]a-
re una decisione in
base a un dato.
All'interno del-
l'organig ramma,il modo di rappre-
sentare la visualiz-
zazione di un da-
to si puo ridurre--.1,,^^.t^ t- ^-.^)Lt tvtrt tuu rd poru-
ìa "DATO", senza,^-"-i-^prfuLLUPdrLr or r-
-^"^ A, ^, ,.li i.+", ,LUtO Ut 9UOil rJLr U-
zìoni si utilizze-ranno per que-
sto.
O rg a n ig ra m m a de I l' en u n c i atoproposto.
Configurozione:DATOI, DATO2, DATO3
PB uscito
mostrq DATOI
moslrq DATO2
mostro DATOS
03 -+
DATOI
DATO2..+ DATO3
mosfro DATOI
mostro DATO2
mostro DATO3
Abbiomo tre posizioni di memorio chechiomeremo DATOI, DATO2 e DATO3"Nel DATOI si vuole scrivere il voloreesodecimole O3 e nel DATO3 il volore l
che si lrovovo nel DATO2. i
5i mosfreronno frqmile i diodi LED i volori ,
dei registri primo e dopo le operozionidi movimenro dei doti. ,
Dopo la direttiva LIST si definiscono i registri che vo-gliamo usare. Nell'organigramma apparivano già i regi-stri dei dati e la porta B. Nel realizzare il programma ve-diamo che abbiamo bisogno anche del registro di STA-TO. ll bit 5 di questo registro ci permette di muoverci dalbanco 0 al banco 'l . Nel banco 0 avremo la porta B, chesitrova all'indirizzo 06 dì questo banco, e nel banco 1 ilregistro di configurazione di questa porta B (TRISB)
che occupa la stessa posizione. Questi registri si po-trebbero chiamare rispettivamente PORTAB e TRISB,
oppure si possono chiamare entrambi nello stesso mo-do (PORTAB), così come abbiamo fatto noi, tenendoconto però che significano cose diverse, a seconda delbanco in cui le stiamo utilizzando. DAfOl, DATO2 e
DATO3 sono registr di utilizzo generale che possonoessere impiegati sia nel banco 0 che nel banco '1.
Dopo la definizione delle variabili, si deve posizio-
nare una prima istruzione del programma alla posizio-ne 0 della memoria di istruzioni. Questo si fa attraver-so la direttiva ORG con il parametro 0.
;Definizione del processore
;Definizione delle variabili
;posizionamento della prima istruzione;all'indirizzo O della memoria di codice
;Passaggio al banco f;Configurazione della poÉa B come;uscita;Passaggio al banco O
;Visualizzazione dei dati prima del;movimento dei dati
;Movimento di un valore a W;MovimentodiWaDATOí;Movimento di DATO2 a W;MovimentodiWaDATO3
;Visualizzazione dei dati dopo il;movimento dei dati
EQuEQuEQU
EQuEQu
ORG
bsfmovlwmowvfbcf
movfmowvfmovfmovwfmovfmovwf
movlwmovwfmovfmovwf
movfmovwfmovfmovwfmovfmovwf
END
P=16F84
o3o60cOD
OE
0
STATUS,5ooPORTABsTATUS,5
DATOl,OPORTABDATO2,OPORTABDATO3,OPORTAB
o3DATOIDATO2, O
DATO3
DATOI,OPORTABDATO2,OPORTABDATO3,OPORTAB
:
Programma in assembler dell'enunciato proposto.
$w**wwrs
;Fine del programma
Normalmente, prima di cominciare il programma si
devono configurare i registri prima definiti. ll nostro pro-gramma non fa eccezione. I registri che dobbiamo confi-gurare sono quelli specifici, e questa configurazione de-terminerà il comportamento successivo del PlC. Per uti-lizzarli correftamente dobbiamo conoscere bene le carat-
c{3ffi pxL&xg#Nm mffi L $3ffiffi ffi R,eMM&ll programma che abbiamo appena visto dovremo edi-tarlo in MPLAB per poterlo poi in seguito compilare. Si
può creare un progetto e un file nuovo o aprire quelloche avevamo già fatto con il nome "primo".
Entrando in N/PLAB ci verrà chiesto se dobbiamoteristiche di ognuno di questi registri.
La configurazione che dobbiamo fa-re è quella di assegnare le otto linee
della porta B come linee di uscita per
mostrare i dati che vengono richiesti.Per questo prima dobbiamo passare
al banco 1. L'assegnazione come li-nea di uscita si fara ponendo a 0 il
registro TRISB o, come si e spiegatoprecedentemente, in PORTAB sapen-do che siamo nel banco 1. Dopoquesto si torna al banco O.
La visualizzazione dei dati e sem-plice tanto come muovere il valoreche contiene ognuno dei registri alla
porta B. Dato che non abbiamo nes-
suna istruzione che permetta il movi-mento dei datitra due registri diretta-mente, si utilizza come punto di ap-
'poggio il registro di lavoro W. Si vederncì rho l: nnrt: R /a ln cfoqcn nor l:nnrt: A) :nrhe <o o (peciale perche
nermette l'inorpsso e l'uscita dei datid: p nor l'o<fornn dol Pll- <i no<ti<ra
in eguale modo di tutti gli altri registrill hlorro strnrtrnttr di istruzioni e
gia stato spiegato nel primo pro-gramma, ed è quello che realizza il
movimento dei dati.Per ultimo ci viene richiesto di vi-
sualizzare i dati dei registri con dei
nuovi valori. La sequenza di istruzio-ni e una ripetizione di quelle già vi-ste ne' la nrima uisttalizzazione.
I a fine del oronr:mma si ha con
la direttiva AND Ricordiamoci che
abbiamo seguito le norme per scrive-
re un programma così come sonostate spiegate per realizzare il primo.
ll programma, inoltre, contiene tuttele parti che ogni programma di com-prlazione richiede, anche se non sono
tutte utilizzate.
Apertura di un progetto che abbiamo già e che è stato l'ultimo utilizzato
Apertura di un progetto che abbramo già, però non è stato l'ultimo ad essere utilizzato.
SwSkwsw
Compilazione del programma
aprire l'ultimo progetto che è stato in uso, in modo
che, se coincide con il progetto "primo" basterà ri-spondere affermatìvamente. Si apriranno in seguito i
Onf ion srpflliprpmo il modovvUvl
simulazione e apriremo ìe fi-nestre dei reg istri specif ici(Special Function Register) e
dei registri generali (File Regi-<tor\ nltro : nrrolìo dol nrn-
gramma che abbiamo già:nórt^ Por riodaro f 1;tf a la {i-qPql Lw. I gr vgugrL Lullc lc ll-
nestre nello stesso tempo, le
ordineremo verticalmente (Ti-
le Vertical). Potremo in segui-to regolare la loro dimensionea piacere.
Dopo aver fatto un Reset
del sistema introdurremo unv:lorp nel reoistro etichettatocome DATO2, ad esempro il
valore esadecimale FA, e trale nossihili azioni di simula-ziono srpnlicremo nuella di
evidenziare. Cliccando suc-
cessive volte F7 resterannoevidenziate le ìstruzioni che
entreranno ìn esecuzione e ivalori che prenderanno
i registri. Alla f ine verif icheremo che rl valore conte-nuto in essi sia corretto.
{iloc:(<^.;:ti : nro(t^ nr^-rrrqJ oJJvLruLì u vuLJLv vrv
getto e nel nostro caso il filecon lo stesso nome.
Nel caso che non sia statol'ultimo progetto utilizzato,possiamo rispondere no, e
aprire il progetto tramite il
menù principale di MPLAB.
Allo stesso modo si aprirannoi f iles associati. Nell'u no onell'altro caso si puo ampliaredrrettamente I programmache abbìamo gia visto per
adattarlo ai nuovi requisiti.Una volta salvato il f ile e som-mato al progetto, si passera
alla sua compilazioneDopo aver verrficato che
non ci siano errori di sintassiprocederemo a realizzare la
Finestre necessarie per la simulazione del programma
Scheda detle istruzioni :
f istruzione CALL
ffi uando abbiamo spiegato le strutture di
ffi ffi controllo, abbiamo visto che un program-
ffi ffi ma non puo essere composto solamente
ffi W da istruzioni disposte in forma sequenzia-'E{W le, dato che la normalità è introdurre strut-
ture cne rompano quesra sequenza, reailzzanoo un sal-
to all'interno del programma per eseguire parti distinte,
secondo la convenienza.In questo caso rompiamo la sequenza con la quale
si eseguono le istruzioni, non a causa del valore di una
condizione, ma per rendere la struttura del programma
piu chiara. Quando abbiamo visto le parti di cui si com-poneva questa struttura, abbiamo già parlato di sub-
routines, anche se non le abbiamo trattate in profon-
dità. Per realizzare questa subroutine si utilizza l'istru-zione call. Questa istruzione fa sì che il puntatore salti
ad un'altra parte del programma, etichettato col nome
che accompagna l'istruzione come parametro. Questachiamata, o salto è incondizionato, come l'istruzionegoto, pero non si comporta come questa. All'arrivo di
un'istruzione call, prima di produrre il salto, sì porta au-
tomaticamente allo Stack del PIC il valore del PC, in mo-
do che, una volta conclusa la subroutine, si possa tor-nare alla parte di programma da cuie stata fatta la chra-
mata, e continuare con l'esecuzione normale. Poiché
non si conosce ilvalore del PC sino a che non si esegue
l'istruzione, non si è potuto calcolare in precedenza, per
EMONICO
:,r.1-- -*LMN
C
PARAMETRO PARAMETROI
k
Operozione: chiomoto od uno subroutineil cui nome oppore come porometrodell'istruzione.
Cicli: 2Codice OP: I O Okkk kkkk kkkkFlog: nessuno
Caratteristiche dell'istruzione call
Smfrswssre
cui i ciclr di istruzione so-
no due.
ffisffi&4$39 il#ruE--'gSYffi#Xg#$\$ffifl&*_*"
I a e\,iare zza in rrn nro-I v,, Yl
gramma e una qualrtàmoltn annrezz:ta sne-
cialmente quando il lin-^,,-^^i^ ,,+ili---+^ À l,-9Ud99rO ULilZldr(-) e ras-
sembler, che necessita dimoltp islrr rzioni ner rea-
lizzaro nnprazioni cpm-
plici. La bravura consiste
nel pensare ad una strut-tura del programma cosl
come se si trattasse di
una sequenza di moduli,-^h,î ^^+/-"^ ^^; l^icr r4o cr rLr or s I rqr rUIO
dettagli interni. Quantopiù complesso sarà il
modulo, e più frammen-ti ripetuti contiene, tantopiù sarà necessario fareuso di subroutine.
La trad uzione del-l'organrgramma, cherannresenfa il flrrssoprincipale del program-ma nrrò essere imme-diata utilizzando le su-
broutines. Se si ritiene necessario si possono fare al-
tri organigrammi indipendenti per ognuno dei mo-duli. Trasoortando ouesto in codice assembler si con-verte in una seouenza di istruzioni call che si ese-guono una dopo l'altra, e formano la parte principa-le del programma. Al termine di questa parteprincipale subentra lo sviluppo di ognuna deìle sub-
l'istruzione di complementoalla call. Mentre la call si uti-li--- ^^. l- -l^;-*-+-rzza per ra cnramala a su-
broutine, l'istruzione returncomanda il ritorno dalla su-
broutine, una volta terminata la sua
esecuzione. Per il ritorno non è neces-
sario nessun parametro, dato che l'in-dirizzo si trova già nella prima posizio-
ne dello Stack, memorizzalo al mo-mento dell'esecuzione dell'istruzionecall. Per questo motivo bisogna fare
attenzione a non utilizzare l'istruzione
return senza aver preventivamente
usato l'istruzione call, altrimenti non
avremo nessun indirizzo di ritornonello Stack, oppure finiremmo per utilizzare I'indirizzodi ritorno di un'aìtra istruzione.
KsX$,{PX C**$ L"XSYRL$XXffi h{ffi KffiY{jffiNNella figura possiamo osservare parte di un program-ma che ulilizza delle subroutines, e come funziona il
PIC internamente quando le esegue. A sinistra abbia-
@
,.-"- 0,.' I
2
coll configurozione -.--'
coll roccolto-doti =-
configurozione btf SfnfUS,Smovlw 00mowvf PORTA B
bcf STATUS,Srefu rn
ì2345
ó78
-i n
n+ln+2n+3n+4
Seouenza dei passi durante Ia chiamata a subroutine
PARAMETROMNEMONICO I
PARAMETRO2
Operozione:Cicli:Codice OP:Flog:
ritorno do subroutine.200 0000 0000 r 000nessuno
Ca ratteri sti ch e d el I' istru z ion e retu rn.
mo una serie di chiamate a subroutine e lo sviluooo di
una di esse. Possiamo supporre che la prima istruzio-ne inizi nella oosizione 0 delìa memoria di codice e leseguenti occupino posizioni successive a partire da
questa. La scheda rappresenta la sequenza di esecu-zione delle istruzioni del programma e quello checomportano, e i numeri sopra le frecce, l'ordine di
questa sequenza. Quando si eseguela prima istruzione, si tratta di unacall, si scrive nello Stack l'indirizzodell'istruzione (la 0), per poi poterritornare. Nel PC si carica I'induizzodell'etichetta che accompagna la
call, in questo caso "configurazio-ne", in modo che l'istruzione che si
trova in questo indirizzo sarà la se-oronta d: o(onrriro (,. ,r segue In or-dine la subroutine fino ad arrivareall'istruzione return, che farà sì chesi torni a caricare nel PC I'indirizzomemorizzato in cima allo Stack, chepermette di tornare ad eseguire I'i-struzione successiva alla prima chia-mata a subroutine.
$qrftultlre
Applicaúone pratica:contando il tempo
uando abbiamo modtficato il primo pro-gramma per visualizzare i registri prima e
dopo il movimento dei dati, proponem-mo di fare una simulazione del tioo istru-ziano nor i<trrrzinno nor \/anora .^mo
veniva eseguita; avete provato a fare una simula-zione del programma in modo completo, per vede-re come cambiano i registri nel momento in cuiavviene? Questo è proprio il momento. Apriamo il
progetto e ci apparrranno le finestre così come le
abbiamo Iasciate. Facciamo un reset del sistema e
introduciamo il valore FA nella posizione 0D dellamemoria dei dati. Quando saremo pronti per farequesto tipo di simulazione, dovremo selezionareI'opzione Animate all'interno del menùDebuq>Run. Fatelo ora.
Così come succedeva eseguendo il primo program-ma in questo modo, al termine delle nostre istruzioni il
Program Counter (PC) continua ad incrementarsi, e
dobbiamo fermarlo con Debug>Run>Halt. La velocitàdipenderà dal computer su cui si sta eseguendo il pro-gramma, ma. quasi certamente, sarà troppo alta per
poter vedere adeguatamente come variano i registri. La
stessa cosa succederà quando il programma invece di
essere simulato, sarà eseguito nel microcontroller conhardware reale: la visualizzazione dei dati che ci inte-ressano sarà appena apprezzabile. Lunico dato che si
potrà vedere chiaramente sarà I'ultimo che rimane nella
Porta B come neìla simulazione. Quindi sarà necessario
introdurre alcuni tipi di ritardo, che ci permetteranno.quando saremo nei panni dell'utilizzatore, di interagirecon il sistema.
&KffiA$dX&K&ffiffi&
Qualsiasi cambio che faremonel programma dovrà essere
riportato anche all'inizio, cioè
dovrà essere inserito nell'orga-nigramma.
L'idea è che i dati che dob-biamo vedere mediante i diodiLED, siano visualrzzati per il
tempo sufficiente ad essere
visti. Questo si ottiene introdu-cendo una routine di ritardodopo aver spostato ogni datosulla Porta B. Per fare in modoche ogni dato sia visualizzatoper circa 1 secondo sarà suffi-ciente per raggiungere il nostroobiettivo. Modifichiamo anche
l'organigramma.
Quello che è stato intro-dotto nell'organigramma chegià abbiamo, è una specie dipiccolo programma indipen-
O rga n ig ra m ma del I' en u nciato conI' i nseri mento dei rita rd i.
dente all'internooer programmanrinrinelo ad ò
chiamato routine,
o subroutine, e si
ulilizza quando unpezzo di program-
ma deve essere
ripetuto varie volte.In questo casoquesro pezzo al
programma si
ripete 6 volte,<pmnro nolln (to(-
so modo. L ultimoritardo non sareb-
be necessario, datoche come abbia-mo potuto verifi-
care nella simula-zione, il dato finalenarmano o ln <i
puo osservare senza
problemi.
Xt YE$K*I metodi per otte-nere un ritardo," una perdita di
tempo", sono mol-
to vari. ll primoche ci viene inmontó À nnrro rrn:
f ila d i istruzion i
n op u na c relro:ll':ltr: norn qp
\/nnlrlmn nttonoro
una temporizza-zione di un secon-rin o nnni i<tri rzin-
ne impiega 1 ps
:d o<<ora a<onrri-
ta, dovremmo utr-
ltzzare ptù o meno
un milione di istru-ziani .li nroct.liinn il rho nlfro
che assurdo è
impossibile, dato
Sw#*vrwwe
che il PIC'l6FB4 ha solo una caoacità di 1024 istruzio-
ni. La seconda opzione è eseguire cicli all'interno di altri
cicli, in modo che una ripetizione dietro l'altra fornisca
il valore desiderato. Considerata la struttura di control-lo dedicata alla programmazione del PlC, avremo biso-gno di un contatore a cui far decrementare un valore,
e dato che i registri sono a B bit, il valore massimo che
si puo ottenere è 255, quindi il valore totale da conta-re si divide in gruppi da 256 (da 0 a 255). I cicli propo-
sti realizzano 256x256x15 = 983.040 istruzioni noo.
che si awicina al valore cercato.
Questo modo di lavorare è valido, anche se non e il
migliore. Quando ci serve contare il tempo, convienefare ricorso ad una risorsa del PIC che è il temporizza-tore TimerO (TMR0) Questo temporizzatore, una voltaconfigurato, è capace di contare un valore determina-to (256 x 256 come valore massimo), in modo indipen-dente da quello che si sta facendo con la CPU del PlC.
Alla fine ci awiserà. Così, in questo caso dobbiamo fare
un unico ciclo in cui il TMRO conterà 15 volte il valore
FOR 256 DOFOR 256 DO
FOR 15 DONop
ENDFORENDIOR
ENDFOR
Con un ciclo all'interno dell'altro-: ^ .- .--:,.--^ -il. ,^*^--Utaztone desiderata.)l lJuu alt tvdlc dild Lcl t tlJvt )
massimo. ll modo di configurare il TMR0 e il suo regi-cir^ rccari r+n n^r ^troqt: :nnirr:zinno islro d55ocidt() per q-r-.- ,l regl5lro
OPTìON, e rllustrato nella figura.Metteremo il valore 00h nel TN/R0, il quale si incre-
menterà ad ogni ciclo sino ad arrivare a FFh, da doveîornpra,r O0h nrodrrrpndn orrpllo che viene chtamato
overflow con il quale si attiverà un flag per indicare
che ha finito di contare. Questo flag e il bit 2 del regi-
stro INTCON.
Per quanto riguarda la configurazione del registroOPTION, questa deve essere fatta all'inizio del pro-
Configurazione del registro OPTIAN e del TMR0 per contare 256x256
inserire il valore indicato nella figura in alto. Le xsono valori che in questo specifico caso possono
essere'l onnrrre 0 indifferentemente. ltre bit meno' "rr''sionifrcativi (0-2) messi a'l indicano un divisore dif roattanzz .li 7 CA 172lara ralr+f ^ î ^,,^.+- tomnnriz_-, .-lUlC dUdLLU d qUC)Ld LLrrrpvrrl
zazione. ll bit 3 assegna questo divisore al TMR0. llbit 5 a zero fa si che ilTN/R0, dei due modi in cui puocontare, lo faccia utilizzando gli impulsi deì clocki nterno.
*"'{ ."" } ;.';. /'- -'";| : rorrtinp di Iemnorizzazione f unzionerà comemostrato nella frgura. Inizia con il nome della routine,
che abbiamo chiamato "ritardo". Come abbiamo spie-n:tn in nrcredenz: il îemno desiderato si otterra con
un ciclo all'interno di un altro, con quello rnterno che
realizza una temporizzaztone di 256x256 ms, grazie al
TN/R0, e un altro esterno che fa ripetere 15 volte quel-
lo interno. L introduzione del valore 15 fra virgolettesemplici, e con Lrna'd'davantr, fa sì che lvalore sia
considerato come decirirale. All'inizlo di ogn ciclo
dobbramo inizializzare i contatori
associati; verificando il valore del bit2 del registro INTCON, si sa se il
TMR0 ha terminato il conteggio, nelnrr:l r:<n
^lo<t^ hit n--.^-- -,,*^Vuur luJv VuLrLv urr pd))tjld dULU-
maticamente a 1 e noi lo dovremorimettere a zero. Al termine di
entrambi i cicli si esce dalla routine.
PS *{* S $il{ \1 .;\ T,|}T. L{Una volta visto perche si fa cosr,rama ranl'nr rrero il fl4R0 e il fegi-
stro OPTION, e come rimane la
routine di temporizzazione, andiamo ad integrare tuttoquesto nel programma che vogliamo modificare.
Le iinee in neretto sono quelle nuove aggiunte nel
nronr:mmà rnmp si nrro vedpre tr rtti i renistri che uti-lizzeremo in seguito devono essere definiti. Nella con-figurazione delle variabili abbiamo assegnato nuoviri:lnri nltro : nrrollì rha ni: o<ictov:nn I._..t regtstro
OPTION lo abbiamo definito come OPT perche la paro-
la OPTION è una parola riservata dell'Assembler, e uti-lizzata in nrtrqtn mndo ar,rohho npnoratn rln effofe.
Q.relìi che nell'organigramma erano rettangoli, di"rìtardo di 1 s", ora sono stati convertiti in chiamatead una routine di ritardo. Ouesta routine. di cui abbìa-*^ ^i; ^-.1-+^ : -+-+- ^^-+- -l +^.*i^^ ^l^lmo gra paflaro, e sTaTa posia ar rermrne oer program-
movlw 00 ;Configurazione della porta B comemo!$'f PORTAB ;uscitamovlw b'00000f tl' ;Configurazione di OPTION per il TMR0movwf OPTbcf STATUS,5 ;Passaggio al banco 0
mov'f DAT01,0 ,Vjsualizzazione deidatiprima del
movwf PORTAB ;movimento dei daticall RITARDO ;Chiamata alla routine di ritardomov'f DAT02,0movwf PORTAB
call RITARDO ;Chiamata alla routine di ritardomovf DAT03,0movw,f PORTAB
call RITARDO ;Chiamata alla routine di ritardo
movlw 03 ;Movimento di un valore a Wmowvf DAT01 ;Movimento da W a DATO1
movf DAT02,0 ;Movimento del DATO2 a Wmowvf DAT03 ;Movimento di W a DAT03
movf DAT01,0 ;Vìsualìzzazione dei dati dopo il
movwf PORTAB ;movimento dei datì
call RITARDO ;Chiamata alla routine di ritardomovf DAT02,0movwf PORTAB
call RIIARDO ;Chiamata alla routine di ritardomovf DAT03,0movwf PORTAB
call RIIARDO ;Chiamata alla routine di ritardogoto FlilE ;Terminare programma
RITARDO movlw d'15' ;Ciclo esterno che si ripeterà f 5 voltemowvf CONT
CICLO1 movlw 00 ;lnizializzazione del ciclo internomovwf TMRO
CICLO2 btfss INTCON,2 ;Ha finito di contare?goto CICLO2 ;No. Continua nel ciclo internobcf INTCON,2 ;Si, Azzera il flagdecfsz CONLT ;Decrementa il contatore del ciclo esternogoto CICLOI ;Dato che non è zero torna al ciclo internoreturn ;ll contatore esterno è arrivato a zero, esci dalla routine
FINE END ;Fine del programma
Programma con la routine di temporizzazione integrata
Sofîwsre
Scheda detl,e istruzioni:l'istruzione RETLW
uso di subroutine è moltocomune in qualsiasi pro-gramma del PlC. Deidue tipidi subroutine che possiamo
distinguere, a seconda delle
istruzioni di chiamata e ritorno, abbia-
mo già visto quella che corrisponde alle istruzioni call e
return. L'istruzione con la quale lavoreremo in questa
sezione, la retìw. è anche un'istruzione di ritorno, che
ha similitudini e differenze rispetto all'istruzione return,
pertanto si usa in differenti tipi dì subroutine, a cui si
accede sempre con l'istruzione call. Quando si torna da
una subroutine con l'istruzione return, il valore che si
trova nella orima posizione dello Stack viene caricato
nel PC, in modo che questi torni a puntare l'indtrizzo
da cui era partito. Se al posto dell'istruzione return si
utilizza I'istruzione retlw, oltre a portare di nuovo il
valore dello Stack nel PC, in W rimane memorizzato il
valore che appare come parametro dell'istruzione.
xsKeapgffi fl*ru L'gs?Raixxsr-é ffi mffiY$-w
Questa istruzione si utilizza per formare le tabelle, negli
altri linguaggi di programmazione si chiamano array, con
indicì consecutivi che iniziano la loro numerazione da 0,
così come mostrato nell'immagine in alto. Per accedere
ad un dato dell'array dobbiamo conoscere l'indìce: il regi-
stro di lavoro W viene caricato con il valore dell'indice, e
TABELLA Dotol Doto2,.., , :,.ìì
I
Doto3
z
Doto4 DqtoN
n-l
Array di nome "Tabella" con indice da 0 a N
PARAMETRO PARAMETROMNEMONICO 1 2
: :-llv--*-J-"*-:-*-"--.L"Operozione: ritorno dollo subroutine
losciondo un volore letterole in W.Cicli: 2
€odice OP: I I 0l xx kkkk kkkkFlog: nessuno
Ca ratte ri sti ch e d e I l' i stru zi o n e retlw
poi si esegue una chiamata alla tabella come se fosse una
normale subroutine. Tornando dalla subroutine, in Wrimarrà caricato il dato che corrisponde all'indice fornito.
Per costruire una tabella dobbiamo porre il nome della
medesima, una prima istruzione addwf con i parametri
PCL e 0 e tante istruzioni retlw quanti indici ha ìa tabel-
la, ognuna con il parametro associato all'indice. La prima
istruzione, che è obbligatoria. fa sìche alPC (la sua parte
bassa PCL), venga sommato ilvalore che in quel momen-
to si trova scritto in W così da provocare un salto all'indi-
ce adeguato. Di tutte le istruzioni retlw, ad ogni chiama-
ta alla tabeìla se ne eseguirà solo una, quella corrispon-
dente all'indice utilizzato. Prendiamo l'esempio della figu-
ra: se prima di esegurre la chiamata alla tabella si carica il
registro W con valore 1, al PC, che a causa della chiama-
ta alla subroutine stava puntando all'istruzione addwf.
verrà sommato 1 sulla sua parte bassa; questo ptù I'au-
toincremento normale che caratterizza questa risorsa del
PlC, portano il PC a puntare all'ìstruzione retlw
b'00001111'che è quella che si stava cercando.
tobello
robello oddwf PCL,O
redw b'OOOOI I l t' i
retlw 5ó i
Frammento di programmanel quale si mostra l'utilizzo delle tabelle.
Sw#*wwsw
Sch eda delle istr uzioni :f istruzione RETFIE
I'ultima delle istruzioni di ritor-no, però questa volta da inter-rupt. Anche se il suo utilizzoappare simile a quello dell'i-
struzione return. in questo caso quan-
do il processore ritorna al flusso prin-
cipale del programma, recuperandoI'indirizzo memorizzato nello Stack,pone il bit GIE del registro INTCON avalore 1 .
Questo bit che abilita il microcon-troller ad accettare gli interrupt, e
^^.+^ -' ';pwrrv a Lctv ou LOflìattcament€entrando nella routìne di servizioall'interrupt. per fare in modo che
durante la sua esecuzione non ne ven-gano accettati altri. Mettendo di
nuovo il bit GIE a 1 si torna a permet-tora nli inforrr rnf qo c; ^.-^ 'l- ' '^-rsrs yil il rrEr I upr. Js )l c>Lc ud ul ld
routine di servizio all'interrupt con
return, invece che con retfie, questapossibilità viene annullata.
R llaE Hex Dec Binar! Chari0 il 1 000[0001
pcl 85 5 80tJ0tìl 01optifin_r€g 0ú 2BB 11[18868stJtus 1C 2B 06S1110úfsr UB Í 00880890p0rta 80 0 06i188006tri5è 1t 3l 0ú01111JpOftb ffS g S{'BBSSBùtrisb [ù I 05ù06060Èedèta gS g Bú0S0080elconl ffù B 86866[[úPeèdr 0S ù 0B0SSBBù
IlfiC0ll,T0IF iRèsètti@ i1 flag delh'111111.11' rcarichi@ di nuovo ilTllS! ;dla cootale
tffi#. : .'l: Beturn Addres5:
.2 96-tC {Interrupt)
Programma esempto per I'uso dell'istruzione retfie.
PARAMETRO PARAMETROMNEMONICO 1 2
.--::*t*li-: , "i--..- . .- ""*iOperozione: ritorno dollo subroutine
di servizio dell'interrupt.Cicli: 2Codice oP: 00 0000 0000 I 001Flog: nessuno
Ca ratter i sti c h e del I' i stru z i o n e retf i e
$i$swPsil*ru $i3SY$e#X3*S*il KffY$;Xfi
Nella figura abbiamo tre finestre aperte:quella del codice del programma, quella
dei reoistri snprifiri e nuella dello Stack.
E stato eseguito il programma passo an:qqÒ è l'imm:nino a qtaf: nro<: nol
momento in cui si entra nell'interrupt.Nello Stack è rimasto l'indirizzo di ritor-no, per quanto riguarda i registri specifi-ci, possiamo notare che nel registro INT-
coN, e più esattamente il bit 7 o bit GtE,
e appena stato messo a zerc, per nonpermettere altri interrupt. Come ultimaistruzione nelle subroutine dedicate agli
interrupt, si trova la retfie.
$s$*xrywr*
Program m azione: subroutire,macro e recursività
: npressità di nron16pl-131'g
in forma strutturata e modu-l-"^ À .+-+- .^i^^-+. ^^ll-rcrc c )LoLd )Prc9drd rEild
sezione precedente, cosìcome le strutture che forma-
no parte di questi moduli. Ora trattere-mo idifferenti moduli esistenti, e qualisono le differenze fra di loro. In ognicaso la modularità deve sempre per-mettere che un programma da princi-pio complesso, si divida in parti piu
semplici, riutilizzabili, e pertanto piuf:rili d: mtrttprc ,a nUnto e da mOdifi-ca re.
5t$ffiffi*8"$TXF$ilLa decisione di ulilizzare o meno le
Sotq terÈirati ; Fógii?llo" CcatidúaSi. ti5attira it tlrqn1tcrra
Cariea il fB*
scúo terrArati i pèssi?tb " CodtituèSi. oisat?lsa 1l fl*gIittr*s
Proeramma che utilizza moduli nella stesura
ll programma precedente, sciltto senza l'utilizzo dei moduli
ne si ripete molte volte, come puo esse-
re il "ritardo di un tempo determinato",non è consigliabile ripetere tutto il codi-
ce ogni volta che bisogna usarlo.
Questo potrebbe portare gravi inconve-
nienti, il primo è che stiamo sprecando
spazio nella memoria di programma, e
questo è pericoloso, tenendo conto che
il PlC16F84 dispone solo di 1024 linee
di programma. ll secondo e che un pic-
colo cambio in una di queste parti di
programma che si ripete, comporta un
cambio in ognuna delle ripetizioni. il
che oltre ad essere oneroso. può provo-rara tlanli arrari
L'inconveniente e che sia la chiama-ta sia il ritorno dalla subroutine "sciu-pano" cicli di istruzione, in altre paro-le ogni chiamata ad una subroutinecomporta una perdita di tempo,
Sw*fuswxw
accedono sia il programma che il subprogrammasiano indipendenti, cioè di ambito locale, di modoche al momento della chiamata al procedimento,siano le uniche variabili interessate. Pero questo non
e possibile con il compilatore del PlC, dato che la
chiamata a subroutine (istruzione call) ammettecome parametro solo il nome della subroutine stes-
sa. Una soluzione intermedia fra lo scambio di oara-metri e la non comunicazione fra programma e sub-programma, consiste nell'utilizzo di variabili globali,. -',i ^^c.îna trraAaTp antr:mhi l-nqj nri-: Àoll:d LUI pU))OllU OLLCULT Prlllld \lrlld
chiamata ad una subroutine, verranno introdotti nei
^-i^-i^'r^ hasterà inserire iì nome della9rorilro prrLrporE L
marro nel nrrnfo che ri interessa e lp istrrrzioni che la|,L' Pvl
compongono saranno eseguite.Nome_macro esprime il nome della macro che in
seguito verra inserita nel programma prrncipale per
aggiungere tutte le istruzioni che appaiono sotto que-sto nomtr fr: le n:rolc chiave maCro e endm.
ffigrrtr${{r,iffff rffi& ffieflft* # s#ffiR*{jYi{$\é#Nonostante I'ulilizzo delle macro e delle subroutine si
assomiglino, fra loro c'è una differenza fondamentale.n,,-^.1^ -i -^-^il *- {-++^ -^^ SUbfOUti-vuottuu )t LU|tPilo uttPrw9rorrilro rotLv LUrl
modo coerente, i vantaggisono maggiori degli svan-
tagg r.
Normalmente una sub-routrne comunrca con rl pro-gramma principale median-te lo scambio di una sene di
valorr. Quando si chiama il
subprogramma, questo rice-
ve gli argomenti necessari-ll- -,, ,-,^^^ ^ .^-+,ì,,ts ts tu)U-
tuisce dei risultati. È consi-gliabile che le variabili a cui
rpnic,tri nrodisnncti i valOri
da utilizzare con le subrouti-ne, e prima di ritornare dalla
subroutine, saranno aggror-nati iregistri che devonocontenere irisultati del lavo-ro svolto onnrrre entrambe
le cose se sono necessarie.I ln o<omnin tinirn eli nrro<tn
e l'uso delle tabelle, che-l^r-i--^ ^i. ,,i-+^ ^-a00ramo 9rd vrsLo pdrlan0odell'istruzione retlw. In que-qtn càsn il reoistro che f un-zionava da intermediario era
il registro di lavoro W.
r'{ i; r* €}S*f il:L:\'J
Un altro modo di semplifica-re un programma consrstenell'utilizzare delle macro.
Una macro definisce un
insieme di istruzioni a cui si
assegna un nome. Nel pro-
Sw$*xeswrw
Nome_macro mactolstruzione-1
lstruzione-2
lstruzione-3
lstruzione-{n-l)lstruzione-n
endm
Avanti macr0
movlwmovwfendm
b'0000rî01'PORTA
Struttura di una macro ed esempio del suo uttlizzo.
Secondo programma esempio con le macro defintte in modo errato.
Sw#*wexre
Errore che genera MPASM cercando di assemblare il secondo proqramma
sarà traslata in anticipo o in ritar-do del valore che ha in quelmomento il PC. Visto che ognichramata a macro verrà sostitui-ta -da tutte le istruzioni che la
compongono, ogni istruzioneverrà collocata in indirizzi diversidella memoria di programma.per cui il PC al momento di ese-guirle avrà un valore diverso, egli induizzi che ne risulterannoper incremento o decrementoanche. Se isalti sono realizzati"verso l'esterno" della macro, si
noqsono riilizzaro ptirhafto
dato che queste non sarannoconsiderate ripetute.
ef;e uesxvxTeLa recursività è definita come lacapacità di un subprogramma
codice compilato. Una soluzronea questo inconveniente, la tro-viamo utilizzando gli indiizzirelativi. Invece di saltare verso
l' induizzo esatto di un'etichetta,si salta verso una posizione che
Soro tarnlnitl I passl?tllt. Cortinut31. tisótttca 11 FlagRlt6roó
*viozó dl 2gS w l7 Oasst,
dlra i destra dl tó paÉ51.
guanza úl It paesl
Forma corretta di fare i salti nelle macro.
di auto-chramarsi. Al momentodi dichiararla, bisogna identifica-re bene il caso base per cui il
proced imento terminerà.Non tutti i problemi possono
essere definiti in base alla recur-srvità, e generalmente è unadelle cose più difficili da capire e
applicare nella programmazio-ne. In ogni caso con il PIC potre-mo ulilizzarla poco, perche conla recursività si generano indiriz-zi di ritorno ogni volta che la
subroutine si "auto-chiama", e
nel PlC16F84 abbiamo solo 8inditzzi di ritorno, tanti quantine puo contenere lo Stack,numero che è molto basso per la
maggior parte dei programmirecursrvr.
Ss**xrw**
Sch eda dette istr uzioni :fistruzione SUBLW
istruzione "sublw" potrebbe essere descritta
come il contrario dell'istruzione "addlw",
dato che realtzza la sottrazione di un valore
letterale meno il valore del registro W. ll risul-
tato rimane in quest'ultimo. I flag che vengo-
no attivati sono gli stessi che nel caso delìa somma,però, dato che l'operazione si realizza med ante il
metodo del complemento a due, il flag di carry, invece
di attivarsi quando c'è riporto, lo fa quando non c'è.
OPERANDODESTINAZIONE
Operozione: Sottrozione del volore letterole k
ol volore del registro W {k-W)Cicli: I
Codice oP: I I I lOx kkkk kkkk
Flog: C, DC, Z
Caratteristiche dell' istruzione sublw.
.q-o.-q_"9o9-t-1
oooooloo
Complemenloo 2diW lMlt0l
sommg -d9l
lqrole -c91 !t ,gomg-femlto o 2 {|!v oo-o9:1o_o_l
Doto che c'è riporto nello sommo si ottivo it flog C
v:hr-: -9i.Y.eli ry: i:ll li:1r".:i.:r:-
Volore letierole do cui soltrorre
Esecuzi one de I I' i str uzi o n.. su b lw
::::::aa:a:tt:a::aaaaat*la,?taaa,lL,tl::::::i:;\i
oDtion req lFistatuE- -
1F
I rs. {lo
iporta 0€
! trisr B0
: prrtb 6ttrisb FF
eedata go
€econJ St€eèir 3B
€econ2 BS
tclath BB
intcsn 6B
Esemaio tiaico dell'uso dell'rstruzione sublw.
l-Éffi,r'=:.,irr-SF* ll* llartBrB [8
: -lBldÌc g:^l
enflÈ s
254 1
t @lr QSf ; Pottr B
cffYF&l! ffiìÈ !O ; ltrtà aIt Hr* 6l2 htf *t,G : Ps$ al àaFl3t* elÈ S ; Si sp"4w i15 Frs 6*É ú!f s,l ; le3{o li p&ta7î ssùli Gtl btfs (É,2
; |lcro m cEi
; tccÉdt iì tE!2t agsal! hif f6,l
ff gste riR
Così come ci mostra ì'esempio, vediamo che quando il
risultato di un'operazione e un valore negatlvo, quello
che si scrive in W non è il valore, ma il suo comple-
mento a due, e il fatto che sia negativo viene segnala-
to da uno zero nel bit del carry.
g$frffirr. {*f,f &.'XS?ffi1}X5#ruffi S#ffiLWOltre alla funzìone classica di eseguire la sottrazione, l'i-
struzione sublw si ufilizza per fare le comparazioni.
lmmaginiamo di aver formato un numero con gli inter-
ruttori, e che questi siano collegati, ad esempio, alla
porta B. Questo numero può essere il numero di una
chiave, ed è necessario sapere se esso possiede un valo-
re determinato per convalidarla, e accendere un LED
rosso per proibire l'accesso e uno verde per accettarlo.
Sottraendo il valore che abbiamo in ingresso con il valo-
re di riferìmento (ma potremmo anche fare il contrario),
possono succedere due cose: che il resto della sottra-
zione dia come risultato zero o che dia un numero
diverso da zero, qualunque esso sia. Se il risultato è
zero, signif ica che ì due numeri sono uguaìi, e ottenen-
do questo risultato si attivera ilflagZ (di zero). Se dopo
la sottrazione si verifica il valore di7, si saprà se ivaloricomparati erano uguali oppure no, a seconda che il flag
Zvalga 1 o 0 rispettivamente.
$q*{i$wsxw*
Scheda delte istruzioni:fistruzione SUBWF
la seconda istruzionedi sottrazione e sot-lraa ad I rn ron i<trn
chramato "f " il valoreche contiene il regi-
stro di lavoro W. ll risultato diquesta operazione rimane in fo in W a seconda del valoredel parametro d.
Così come I'istruzione pre-rcdpnto \/onnnnn rninvOlti i
flag C, DC e Z nella forma già
descritta.
ffi$ffie$trx fl#ru$-*XSTffi WtrX# $q ]l: S t* **W $:
|'uso di nreqta istrr r7i61'19 g
simile ,a nrrelln dpll'istruzione
sublw, che abbiamo appenavisto. Entrambe servono per
OPERANDOFONTE
f
El*is :{€úÈ !Eà1es leb
LIST P=1éF8à ; Defini:i3ne d"t procass$ra
CR* O ; Posizionafiento dell.a pri$à istruaione; all'indirj.zzo B della sì*ncria {ti pro$raRfla
;Cst arazion* con i ualori letterali
muf AC,O ; Sl mtte in S iL uetorg d1 rÈgistro gCsubl's 94 ; ffurmro con cui si uuole far"e La conparazitne
fioulù, g{ ; NUR€ro con cui si vusl"e fars la canparazionesubsf 6t,S : Sl ps"gue la sattrazione ccn il registro da
;Carvàrazione Sra registri
na'Jf Bs,a ; Si &ettè in !, il ual3re d"l registra BCsubnf S',€ : Regi.stro con cui si uùol* far€ La coaparazi
Esempio di comparazrone con le istruzioni sublw e subwf
Cicli:
Codice OP:
Flog:
Ca ra L teris ù c he d el I' istru z io n e su bwf
Sottroe ol contenuto del registro fil contenuto del registro di lovoro W.Se d=0 il risultoto si porto nel
registro di lovoro W, e se d=l si
loscio nello stesso reoistro f.I
)0 0010 dfff ffff., DC, Z
Operozione:
MNEMONICO
subwf
OPERANDODESTINAZIONE
d
sottrarre valori p oer fare com-' " Y-' '
pa razron r.
Comttnnrro ,a <crgnda del+i^^ ^li ^l-+^ ^l-upo (lr odro Lìa fomparare, nonsempre sr puo ulilizzare la
sL-rblw, a rneno di casi semprici,r'l:tn rhp nor o<adrrirn ÀnllnuoLU Lrrc PEr q)Eguilc uc tE
comparazioni la subwf e piu
comnieta Ner caso della com-parazione fra il valore di un
regrsîro e un vatore costantedeterminato, sarebbe a direcon un valore letterale, è indif-ferente l'uso di una o dell'altraistruzione, ma nel caso di com-parazione fra registri è necessa-
rio I'ulilizzo dell'istruzionesubwf .
Sw6*ses*wss*
Appli cazione pratica:
poco a poco stiamo conoscendo l'uso dellevarie risorse del PlC. Abbiamo studiato i
registri, le porte di ingresso/uscita e nell'ulti-mo esercizio proposto abbiamo parlato del
TMR0. Però il TMRO si può utilizzare in duemodi: uno come temporizzalore, e l'altro come conta-tore di impulsi esterni. In questo esercizio lo utilizzere-mo nel secondo modo
Leggete con attenzione l'enunciato dell'esercizioproposto e pensate a come risolverlo.
r{qx{\$# #KseN$sffi&&4ffi&La prima idea ootrebbe essere I'utilizzo di un contatoreda incrementare tramite il programma, ogni volta che
rileveremo un impulso (passaggio da 0 a 1 e nuova-mente a 0, oppure il contrario) sul piedino a cui abbia-mo collegato il pulsante.
Ogni volta che aumenta il registro contatore, dovre-mo comparare al numero a cui vogliamo arrivare, in
questo caso al '10. ll programma potrebbe essere risol-to in modo soddisfacente già con il primo organigram-ma esposto. Dato che il nostro programma deve solosvolgere una funzione, non importa se impiega tutto il
tomn^ nol foqt:ro rrn i;16;pqq6 increment:re Un COnta-
tore, e compararlo con un valore dato; però se oltre a
Abbiomo un nostro trosportotore sul quolesiqnno possondo i pe:ni che vogliomo conlqre.Per contore il numero dei pzzi posizioneremoun pulsonle che sorà oftivoto dol possoggiodi ogni singolo pezzo. Per ognigruppo di lO pezzi otliveremo un diodo IEDche ci owiserà, od esempio,che i pezzi possono essere impocchettoti.
En u nciato del l' eserci zi o proposto
sl:èì::Wrrrrrrrrlu,urlSw#*wwvw
un altro programma con it TMR0
Configurozione:CONTATORÉRAO ingressoRBO uscito
spegnere il LED
RAO=I?
RAO=O?
CONTATORE = CONTATORE + I
CONTATORE = lO?
occendere il LED
Primo organigramma dell'esercizio proposto.
€onfigurozione:RAA ingressoRBI usritoTIARO
spegnere LEDiniziqlizore TMRO
occeîdere LEDTOIF=O
Secondo organ ig ra m ma del l' eserci zioproposto.
*ffi*&ruXffiffi&Mffi&MffiTXruXTX\g#tl ^,,1--^+^ -++i,,-+^ -l-ll pur5anTe aluvaro oòt pezzt, sl puo
collegare al piedino RA4, il quale si
puo configurare per introdurre impul-si nel TN/R0. Ogni volta che arriva un
fronte di salita o di discesa, il TMRO si
auroincreme^ra senza la necessita di
eseguire alcuna ist'-z one. 'r- Pi-,confÌgurando ll TNIR0 Ln modo ade-guato, potremo essere avvisati del
termine del contegg o delie 10 unità.A^che se o-trsto qccordo rodo d
procedere e rnigliore del primo, non e
ancora quello ott ma e, pero non
potremo migliorare ulteriormente il
programma senza l'ulilizzo degliinterru pt.
Come vedremo, abbiamo elimina-to tutti i riferimenti al conreggio -che e controllato dìrettamente dal-
OPTION
Configurazione del registro OPTION per questo esercizio
questo dovesse
controlìare an-rho rho i nozzi
non siano di-fettosi, il movi-l-^h+^
^^l ^ aIlEttLU uEt tto-
stro trasporta-+^v^ -,, -,,, ^^-LLrr c )u Lu r pd>-<:nn i nozzi a
il braccio del
robot che li
prende, questo
sottrarrebbetempo al processore, dato che ci sono modi migliori di
fare la stessa cosa
l'hardware del TMR0 - ad eccezione del suo termine;questo controllo è realizzato verificando il valore delfl:r^r T0lF rhp nasspr: aUtomaticamente a 1 al terminedel conteggio, e che dovrà essere rimesso a zero per un
nuovo conteggio"
{sru Fgffi tiffiexg{.}ruffi *ffi L ffififfigsYK#$p?x**dIn uno dei capitoli precedenti, abbiamo visto come con-
figurare ìl registro OPTION per realizzare un determina-to conteggio.
Dovremo impostare questo registro ogni volta che
desideriamo lavorare con il TMR0. Per l'esercizio in
corso, in cui ilTMR0 dovrà contare gruppi di 10, non è
Sw#Swwrs*
VATORE DELTMRO
o00000r r Volore che si vuole contore
III!tIO0 Complemenf,o o I del volore do conlore
lIIltI0l Complemenfo o 2 del volore dq conlore,che è quello che si deve metlere nel TMR0
lllllll0 Volore che si incremento nel TMRO,con il primo impulso o istruzione
illiltìl Vqlore che si incremento nel TMROcon il secondo impulso o istruzione
00000000 Volore che si incremento nel TMRO
con il ferzo impulso o istruzione.A questo punlo owiene l'overflow e si oftivoun flog per owisorci di questo
Esempio del valore che dobbiamo introdurre nel TMR0
necessario il divisore di frequenza, e dobbìamo confi-gurare il contatore in modo che gli incrementi sianoprodotti con gli impulsi che arrivano dall'esterno e non
con gli impulsi interni del clock.
I primi tre bit (0-2) rappresentano il valore del dìvi-
sore. Come abbiamo già detto, per questo esercizio
non è richiesto nessun divisore di frequenza, però asse-
gnando il valore "000" al divisore per il TMRO, risulte-
rebbe di 1:2. Pertanto dobbiamo combinare questo
dato insieme al bit 3, che avendo valore 'l assegna il
divisore al Watchdog in modo 1:1.
Con i valori dei bit 5 e 4 impostiamo rispettivamen-te l'incremento del TMR0 mediante impulsi, ed il fron-te di discesa per questi impulsi. Le X riflettono valori
che non hanno alcuna influenza sul risultato di questo
esercizro.
bóe$-#$qg: ffiffi&- Ytu$ffi#
Un altro importante dato da considerare quando si
lavora con iì TN/R0, è il valore con cui viene carìcato.
Per non creare equivoci è necessario conoscere come
lavora il TMR0; ouesto contatore si autoincrementa ad
ogni istruzione o impulso esterno,
oppure ogni due o tre istruzioni oimnrrlsi estprni sino ad arrivare al
suo valore massimo, che vale FF,
dato che sì tratta di un registro a Bbit, per poi passare dal valore massi-
mo al valore minimo, a 00.A, ,^-+^ ^ ----^^i^ e conosciutovuc)rv Pd))d99ru
con il nome di overflow, e ci awisa
che il conteggio è terminato, anche
se in realtà il conteggio non si ferma
ma prosegue. rmparato queslo, se
vogliamo che il TMRO conti fino a
"3" non possiamo caricare questo
valore direttamente, altrimentiotterremmo un conteggio di
3,4,5,6,7 ,8..., sino a FF, avverrebbe
l'overflow e ne saremmo avvisati.
^^^i .,^r+- -t^ ,,^^riamO Contafe\-/9 | il VUr Ld Lr rC vU9 |
un valore dobbiamo introdurre il
rnmnlomonfn : 7 di nrroctn v:lorc!v,,,P,Ll
Nl^ll- {in, 'rr rllnnr+r o rinnrt:fn rrnl\Clld ll9uld dllc9d Lo/ L I rpvl
esempio per il valore 3, in cui si vede
'n modo semplice e rapido come si
rnmnio nrael: nnrm:
La stessa tecnrca si aoplichera oer
numeri p ùr grandi.
${F$SeÌé! gLffiryffigil*
Nella f gura e r ooriato io schema
eettrico sempirficato. \,4ontandolo
dov'e-o coilegare oltre al 'al:ren-
tazione e la massa, il cristallo di
quarzo e il pulsante di Reset per
livello basso su MCLR.
Dei due elementi montati il pul-<:nto rlorro o<<ora nrnnrin <tt nttoqt:I f,r vl./r
ino: norrho o l'r rnir: rha o rnllan:-'il rLu/ VL !r rL L I urilLU Ll lq E LVllqyo-
H
-{ *uo
E'ù.iH,'rJE,ú,:C14lq,sr-r
H E'I
fccl HsICEEREù
I'EÉ H EilEB?
UBt' HE1E ETIIHT
Ftr IEFII4
Schema elettrtco dell'esercizio proposto
0fiG E ; Il programa inizia ,.,
goto IHIZIo : alf indirizzo U ,.,
tBfZIo bsf SIAîUS, fiPB ; Si passa aI banco I :noulu 8'866808ù6' ; Porta E uscitanDuuf TnISBnoulu E'38È16806' ; Bg4 inqr€sso" if resto uscitefiùu0f TRISnnouls B'081-llBBB' ; Configuraziùne de1 THnBnouuf llPfloH_REGbcf SÍRIùS,RFB ; Si passa a1 banco B
I bcf PùfiTS,LFD ; Disattiua LEDnouls 0*F6 ; Carica il TNBo con il cohplemîtoftousf IHRB :a2di1ú
CLo btfss INICOil,Í0IF ; Sono pèssati 10 pezzi?goto clcltl ; Ho, attenderegoto nCCENDEÈÉ ; si, auuisè cor iI LÉD ,.
IIDERE bsf PORTB,LED ; ÉCcENdèTÉ iI LEDbcf IHICoN,IBIF : nzzera lt +lèq per Ia prossina tenpgoto unL0RI ; Torna alf inizio
Programma finale dell enunciato proposlo.
Sw$*wwsw
ta internamente con il TMR0, per fare in modo che si
incrementi. ll LED è stato collegato al piedino RB1,
ma potrebbe essere collegato a qualsiasi altro piedi-no di l/O.
Pffi##ffi&f-$fv$e
ll programma, dopo aver considerato tutti i passi pre-cedenti, apparirà come mostrato nella figura. Comenovità, è possibile notare il nome assegnato ai registrie ai bit.
Anche se potremmo chiamarli come vogliamo,ferma restando la funzione di ognuno e il modo diutilizzarli, normalmente hanno nomi che si possonoconsrderare universali, in modo che tutti quelli cheutilizzano l'assembler del PIC abbiano un linguaggiocomune.
Stato del I a si m u lazio n esubito prima dell'overflow del TMR0
La simulazione del programma precedente ci pone unanuova sfida, dobbiamo introdurre impulsi tramite RA4in modo che il TMR0 si incrementi.
Se proviamo a farlo con I'opzione Window>Modify,vedremo che è imoossibile.
Lo dobbiamo fare con l'opzione Debug>SimulatorStimulus>Asynchronous Stimulus. Da qui si aprirà unafinestra in cui fare la scelta dei pin da utilizzare perintrodurre tutti i dati necessari, e la forma di questi dati:impulso, livello basso, livello alto, o zero e uno alterna-tivamente.
Nel nostro caso sceglieremo gli impulsitramite RA4.In seguito mostreremo lo stato della simulazione, subi-to prima che il TMRO vada in overflow, e poi dopo l'o-verflow, al momento dell'accensione del LED
Stato d el I a si m u lazi o nedopo I'overflow del TMR0 e accensione del LED
uesta è un'altra istruzionenor l: no<tinno dai rr..- --, ,Jgt-
stri, anche se questa voltasi tr:tfa del renistro flilavoro W. L'operazioneche comnip non e altro
che la cancellazione (clear) del conte-nuto del registro, ossia la sostituzione
del valore del registro con 0. Comeper molte altre istruzioni, producendoquesto risultato si attiva il flag Z.
Dato che sì agisce sul registro Wnon sono necessari ulteriori parametri
addìzionali.
$:Sffi $-*PK fl*N gJ gSYffi $Kg#f\$ ffi
{$_ffiw
PARAMETRO PARAMETROMNEMONICO I 2
clrwOperozione: il registro di lqvoro W viene
coricoto con il volore 00.Cicli: ICodice OP: 00 0001 0000 00] 1
Flog: Z
Caratteristiche dell' istruzione clrw.
Come si puo osservare nelle due figure seguenti, l'uso
dell'istruzione clrw è simile a quello dell'istruzionemovlw 00. L'unica differenza sta nel fatto che dopoclrw si attiva il flag Z, dato che il risultato presente Wsarà 0, mentre dopo l'istruzione movlw 00 questo flagnon viene attivato.
Per fare la prova con MPLAB e vedere bene quando
Valore dei registri STATUS e W dopo I'esecuzrone
dell'istruzione movlw 00
variano i registri si raccomanda di cambiare i valori dei
registri STATUS e W prima dell'esecuzione di ogni istru-
zrone. Vì suggeriamo di introdurre nel registro STATUS
ilvalore 00, anche se in pratica i bit 3 e 4 non si posso-
no cambiare, e nel registro W il valore FF. Osserviamo
che eseguendo l'ultima istruzione la riga evidenziata innero non si modifica.
Valore dei regisrri STATUS e W dopo I'e>ecuzionedell'istruzione clrw.
Sw#&e*ewwep
Scheda delte istruzioni:f istruzione CLRF
Valore dei registri STATUS
e TRISB dopo I'esecuzione della prima opzione
Mruffi
WM-^^-tÍt -^>pcLil rLd
assoctato
messo a
ome l'istruzione precedente,anche questa realizza la cancel-lazione di un registro, in questo
caso della memoria RAM dei
dati. L'indirizzo del registro si
come parametro. ll suo flagè nuovamente Z, che verrà
1 dato che il risultato sarà 0.
K$*&q PK fi #ru L*gSYffiWXg# gd ffi
CL&PLavorando con le porte di ingresso e usci-
ta. sovente è stato necessario inizializzare
MNEMONICO
clrf
OPERANDOFONTE
OPERANDODESTINMIONE
f
Operozione: il registro f viene coricoto con
il volore 00.Cicli: I
Codice oP: 00 000.| I fff ffff
k*Caratteristiche dell' istruzione clrf.
tutte le linee di una porta come uscita, per cui doveva-mo caricare il registro di configurazione con degli zero.
Questo veniva fatto con la combinazione di due istru-
zioni: la movlw 00 e la movwf f, dove f era il registro
da configurare.A partire da questo momento, con l'uso delle due
nuove istruzioni clrw e clrf. avremo diverse oozìoni. Per
:r.Ì20 ùdo ót tnt:iart:zèzto
provare adeguatamente i differenti casi, dovremo ini-zializzare prima di ogni blocco i registri STATUS (00), W
Valore dei registri STATUS
e TRISB dopo I'esecuzione della seconda opzioneValore dei registri STATUS
e TRISB dopo I'esecuzione della terza opzione
(FF) e TRISB
(FF)
Nel prrmo
caso non si
orLrvo il ilo9 L
per nessuna
delle dueistruzioni, nel
seconOo caso
si modif ica
con la terzaistruzione,così come nel
terzo blocco.
qrP
iFln. del p.ogr.h
$c#!wsre
rappresentazione dei datisuldisplayaTsegmenti
Appli cazione pratica:
rrtti i <ìqtomi o il rnmn,,ruter ne e un esempro,
si possono differenziare in tre parti: l'ingres-so dei dati, ì'elaborazione dei medesimi e la
rappresentazione del risultato. I dispositivi diinnresso c la rannresentazione dei risultati
sono chiamati interfaccia utente, e stanno assumendo
sempre maggiore importanza, rendendo le interfacce
sempre piu comode e facili da utilizzare. Un program-me nro psserp molto buono e fare molte cose nerò se!vJr/ v!,v Jr
la sua interfaccia è complicata da utilizzare o richiedemolte conoscenze, azioni ripetitive, ecc. è condannatoall'insuccesso.
Non bisogna però conf ondere le interf acce di
ingresso o di uscita piu adatte, con le piu moderne; il
miglior modo per introdurre caratteri in un programmaresta la tastiera, e per muoversi sul video, il mouse. Nel
lavoro con i microcontroller succede qualcosa di simile.
Sino ad ora abbiamo lavorato solo con interruot oer
introdurre idati, e con idiodi LED pervisualizzare ì risul-
tati. Ora faremo un passo in più con l'utilizzo di un
nuovo elemento, il display a 7 segmenti. Sicuramente la*-^^;^"-^-- ,.Ji ,,^; -,,"- ,,+ili---+^ ^,,^-+^maggloranza or vor avra uLrtttàLo quesì.o elemenTo
come utente. E quello che indica il turno in pescheria o
al supermercato, pero ora saremo noi a programmarloaffinche gli altri lo utilizzino.
Rappresentazione del display a 7 segmenti
xL $}KStr$_&Y & 3 Sffiffiei$ffiFdYg
Quando abbiamo bisogno di rappresentare dei numeri,
la soluzione più semplice ed economica è il display a 7
segmenti. Come indica il suo nome è un dispositivo for-mato da 7 segmenti che non sono altro che diodi LED
COfiIPUIER
INGRESSI
I t t | .--1+lì\ttrtlrll.l
usctrt
L'interfaccia uomo macchina è sempre più importante.
$*#*wwm*w
0n
n
0
I
I
I
1
Volore Volorei"crt"n"ti a".irol" dP S f*i*"0 -:--*o -':-*-o d o **]*"4'
ib;i*
1-*:1jl!rÌl;oi0itì
iqll
1:0l
\loloe ieqdeimte lj
3F
0ó5B
4F
ooóD
7D
07
I
I
001
I
I
1
0I
0I
ri0Ì02 i o i13:Ot]4a0tr5:Oilójorl710:0
00
lI
I
0
In
rì
0
l0
0
I
I
01
I
1
01
I
I
I
I
I
0I
lI
Tabella di trasformazione dei valori binari al codrce per i 7 seqmenti a catodo comune
di forma allungata, dìsposti in modo da formare il
numero 8. Questi segmenti sono numerati, comemostra la figura, con lettere consecutive dalla 'a' alla'g' iniziando dal segmento superiore e continuando in
senso orario per terminare con il segmento centrale.Oltre ai 7 segmenti c'e un punto decimale nella parte
inferiore destra, indicato come dp, che a volte si ripeteanche nella oarte sinistra.
ffi ru# ruflg&Yffi *KLei"g$mKflXXX*Lesercizio che ora vr proponiamo non ha grandi prete-
se, vuole solo aiutare a comprendere il funzionamentodel display a 7 segmenti per il suo uso in progetti più
ambiziosi. Leggiamo pertanto l'enunciato e mettiamo-ci al lavoro.
Quello che si richiede è di trasformare ilvalore bina-rio che un utente introduce tramite gli interruttori in un
codice nuovo, in modo che si illuminino i differentidisplay a seconda del numero che si vuole rappresen-tare. I numeri possibili sono dallo 0 al 7, dato che i valo-
ri degli interruttori potranno variare da 000 a 111.Prima di fare la tabella corrispondente dobbiamo cono-scere un dato in piu sul display. Tutti sappìamo che un
diodo LED ha due terminali, conosciuti come anodo e
catodo, e che se colleghramo il catodo a terra e l'ano-do a un PIC dobbiamo far uscire dal piedino del PIC un
1 logico per accenderlo, al contrario se l'anodo è colle-gato a 5 V e il catodo al PlC, dobbiamo fornire uno 0logico per accenderlo. Con i display succede la stessa
cosa, solo che tutti i segmenti (LED interni) sono unitifra loro per l'anodo o per il catodo, dando quindi il
nome al display che potrà essere di anodo comune o di
catodo comune rispettivamente. In un display di anodocomune, si dovranno mandare degli zero per accende-re i differenti segmenti, e in un display a catodo comu-ne ogni segmento si accenderà con il suo 1 corrispon-
dente. In questo esercizio simulramo il display che si
accende con uscita a 'l , cioè un display a catodo comu-ne. Vedr tabella in alto
Alcuni digit possono essere rappresentati in più di
una forma, per cui dovremo scegliere.D:tn rho in nrro<fn e<o___mpto non 5t uSa
il punto decimale, questo rimarra(non+^ ll mntivn nor., r-. cur 5r pa55a al
valori esadecimali e che si possono
maneggiare più efficacemente i dati,mpnfrp nnfrohhpro eSSere confusifacilmente con tanti 1 e 0.
*ffi#eruxffiR&ffiffi&L'organigramma per questo esercizio
è molto semplice, visto il modo concui utilizzeremo il display a 7 segmen-
tì. Forse qualcuno starà pensando che
bisognerà testare il valore degli inter-
Si vuole roppresenfore per mezzo di un disploy o Z segmentiil volore introdotto tromitelre interrutlori, in modo che il volore binorio di questi ultimisio visuqlizzoto in decimole.Questo può essere uno piccolo porte di un progetto più gronde,in cui un fottore importonte siolo roppresenlozione dei numeri - doto che non tutti gli utentipotrebbero non essere o conoscenzodel sistemq binorio, come succederebbe se si visuolizzosserole informozioni tromite i diodi LED.
E n u nciato del I' eserci zio proposto
$e$trnrsre
Configurozione:RAO-2 ingressi
RBO-ó uscite
Roccogli volore
ConYeÉivqlore in
codice 7 segmenfi
Visuolizzo numero
Organ ig ra m ma del l' eserc izi o p roposto
ruttori, e a seconda di questo,
mostrare i differenti valori sul display,
però per questa simulazione non sarà
necessaflo.
Confìgureremo la porta B come
uscita, per collegare ad essa il display,
e la porta A come ingresso per gli
interruttori. Dopo aver raccolto il ""--"-"-"-
Fo+i:o+>o+
Disploy o cotodo comune :
Schema elettrico dell'esercizio Droposto.
istruzioni tipiche di configurazione delle porte, di un
ciclo principale che corrisponde con i passi visti nell'or-ganigramma e che è ripetuto all'infinito Per ultimo, la
subroutine di conversione dei valori binari al codice per
i 7 segmenti, che abbiamo già spiegato parlando dell'r-
struzione retlw.
valore degli interruttori si realizzerà una conversione,
secondo la tabella vista in precedenza, e si visualizzera
il risultato sul display a 7 segmenti.
S{$"$flr*qe m$-ffiYYffiX{#
Nella figura dello schema elettrico mostriamo la con-
nessione degli elementi da utilizzare.Non sono riportati i collegamenti del-
I'alimentazione positiva e negativa, il
quarzo né iì pulsante di reset. ll
nrrntn dorim:lo dol r.li.^l-,, À e+r+apurrLU usL[rors usr ul)Pldy C )LdtU
lasciato in aria. Se si volesse collegar-
lo, si dovrebbe fare con la linea RB7.
Gli inter.uttori sono collegati alle
linee meno significative della portaA nor rondoro niir comnliro l: rnn-
versione.
PM*GRAMM&ll programma risultante è illustratonella frgura: si compone, oltre alle
$sffi#v'e ffiffi*-pR#*ffi&ffiF$&
La simulazione del
programma non
sarà semplice, datoche non abbiamonel sìmulatore un
display a 7 segmen-ti, su cui vedere i
valori convertiti.Dovremo accon-tentarci di vedere i
valori che ottenia-mo dalla tabella. sul
Sw$*wr*xse
ED
ÌtIzt0
B 000ad1r'
atN_tsE6
CICLO
50
rl 9rograR in12ia
Passiar aÌ àaîco 1
tèggìar ll larorè dèg1l lîtèrrúttori0niaÈta allà roútìae ri trèsfo.Èriún€uisuèriz.iah il !.lorè sùl distìagst rtpètq aD tnflntto
Si srN il ualorÈ dell'indlcèsl rèstitùls.e il ùrÌ.ru úi a tr.sforÈtò31 restltùis.e i1 uèhre dt 1 trasrorÈtosi rèstltùis.e iÌ oèlora di 2 trasforDtosi rcstitùl5ce il u.l.r. dì 3 trasrorstosi restitúiscè il !ùlore dì | tràsFùrEtosì .èstltúlscè ll ùaÌù.e di 5 tiast.rDt.sl r.stitúisc. lì calorè dt 6 trèscèrÈt.si restltùisc. ù !òÌo.è di I trasforÉt.
Prog ra m ma del I' en u nciato proposto
Un momento della simulazone
registro PORTB. ll valore mostrato dipenderà dal valore
valore degli interruttori, e al registro PORTB che contie-ne il valore convertito. I valori devono coincidere con latabella che abbiamo visto.
fl #ffi pà_xfl F$ s&$w * $Jffi ru q"$ pé fl.l{&?*
Che cosa ne dite se vi oroooniamo di ulilizzare non un
solo display, ma diversi, per rappresentare numeri conpiù di un digit? Di sicuro starete pensando: impossibi-le, il PIC 'l6FB4 ha solo 13 Iinee di ingresso/uscita e
ogni display ne utrlizza B I
Arioto r:ninno norlH-,J Sr puo sempre ncorrere a quar-
che piccolo trucco. In questo caso collegheremo diver-si display in parallelo, in modo che I'rnformazione man-data a uno di essi sia ricevuta anche da tutti gli aìtrì.
Affinché non sia visualizzato lo stesso dato su tutti i
display, che sarebbe la stessa cosa di averne uno solo,
brsogna ulilizzare le linee addizionali, una per ogni
display, che li attiveranno in modo consecutivo tramitedei transistor; in modo che se ne attiva solo uno per
volta, al momento divisualizzare il dato che gli compete.Ogni attìvazione sarà associata al dato da visualiz-
7Àre îpr nrrpl disnlav Orresto nroceqso e cOnOSCiutOYVLJLV
con il nome di scansione, ed è simile a quello realizza-
to, ad esempio nei teìevisori, per mostrare l'immagine.Se si realizza l'attivazione di ogni display con sufficien-te velocita. orazie alla modalità di funzionamento del-l'occhio umano, si produrrà la sensazione ottica che
tutti i display siano attivi allo stesso tempo, ognuno con
il proprio dato.Per realizzare questa simulazione pero, servirebbe
qualcosa in piu dell'immaginazione.introdotto sulle linee RAO-RA2.
Ricordate che il modo di introdur-ro nr ro<ti d:ti qi rnnf in' '.. À -ll'^^-i^-ru VuLrLr il ryulo uoll UP4IU-
ne Debug>Simulator Strmulus>Asyn-chronous Stimulus.
Abbiamo sceìto l'opzione Toggle,rho p nrrolla in nr,ado di simularemeglio il funzionamento degli inter-ruttofl.
Ogni impulso che introdurremotramrte una linea fara in modo che
questa cambi il suo valore, cioè se è an ^---^.- - I ^-^ À - I ^--.^"ì - n\JPd))Crdd I c)ced I pd))crddv.
La simulazrone si realizzerà conl'opzione Debug>Run>Animate.Nella frgura è riportato un momentodi questa simulazione. Fate attenzio-ne al registro PORTA, che contiene il
ino a questo momento la maggior parte delleistruzioni viste hanno due modalità, per quantoriguarda gli operandi con cui lavorano; in que-sto caso, anche l'istruzione and ha questa
seconda forma: la andwf. Come si può immaginare,per comparazione con le altre istruzioni, la differenzasta nel fatto che le operazionr si realizzano fra il valoredel registro di lavoro W e il valore del registro f, lascian-
do il risuitato in uno o nell'altro, a seconda del valoredel secondo parametro. lnoitre verra coinvolto il flaq Z.
If OPERANDO OPERANDO
MNEMONICO FONTE DESTINAZIONE
ondwfOperozione: reolizza l'operozione logico AND
fro il volore del registro f e ilcontenuto del registro di lovoro WSe d = 0 il risultoto si loscionel regisfro di lovoro W e se d = lsi loscio nel medesimo registro f.ICicli:
Codice OP:Flog:
Ca ratte risti che d e I I' i stru zion e a n dwf
Nella figura corlspondente si realizza la rappresenta-zione grafica dell'istruzione and mediante un circuitoformato da alcunr interruttori. È sufficiente che un solointorrt rttnro <i: :norin /r,:lnra {rlcnt nnrrh^ r lrmn'ÀiilrLErruLLvrs )ro qpEr Lv \vorutq tcì>ur pctL|c d tdItpdul-
na non si accenda (valore falso).
il$;*.${ tr.Y *fr L!*'i.STffi #X,h3fd tr . S $}bd$r
f istruzione andwf opera nello stesso modo della andlw,cioe bit a bit, per cui l'esempio già esposto serve ancheper questa istruzione. Così l'esempio che vedremo ora,sara simile per enrrambe le istruzionr. Queste, e tutte le
logiche in generale, si utilizzano per fare quelle che ven-gono chiamate maschere. Una maschera permette di
operare su diversi bit di un registro senza alterare il resto.
l*1,Circuito con interruttori per rappresentare I'istruzione and
Orroctn À rriilo nrrrnn{n rrn ranic+rn ci "+ili--- "yvlJLv ,-- un regr5rro 5t uI'|tzza per otversernco:lln <ttr(q^ tomn^ Pcr pqpmnin noi nrnnr3pprylj 163{-I rvv.
' Ll
lali finn.ì orestÒ mompnlo lp norte A p R si ulllizzava-no come ingressi o come uscite, pero mai con le due fun-zioni allo stesso tempo; non perche non sia possibile, maper maggior comodità. lmmaginiamo ora che la porta B
sia collegata a quattro interruttori e quattro diodi LED: si
tratta di conoscere il valore di questa porta per realizzarenrpqt: n nrroll: nnor:zionp o di :nire sr ri LED Senza
interferire con il valore degli ingressi. Per non falsare i
dati, dovremo realizzare differenti maschere. Nella figurasi esegue quest'operazione con l'istruzione andlw o con
la andwf. essendo 0ueste intercambiabili.
Annullamento dei bit più significativi della Porta B, rimanendo con i valoridegli intenuttori situati sui quattro bit meno signifkativi.
PORTB,W
b'00001 I I 1'
5e PORTB = 0,|101100, dopo l'operazione avremo che W = 00001100, dato chegli zero del letterale fanno in modo che qualsiasi valore diventi zero, mentreil valore I lascia che il risultato dipenda dall'ahro bit.
Azzeramento dei ted della Porta B senza coinvolgere gli interruttori.
movlw 0tandwf PORTB,F
Anche se l'operazione sembra la stessa del caso precedente,
nel primo caso awiene in W. per cui la Porta B non viene modificata, mentre
nel secondo caso si realizza direttamente sulla porta, cambiandone il valore.
ffi n numerose applicazioni è-re-ffi necessario scrivere una serieg&EEI
ffi dr datr cne dovranno por esse-
ffi re recuperati. Se questi dati si&aw memo|zzano e st recuperano
nella medesima esecuzione di pro-gramma, possono essere scritti nellamemoria RAN/ che, anche se volatile,non perde le informazioni sino a che
non si spegne il sistema.Pensate ad esempio a una sveglia:
una volta conf igurata l'ora corrente e
l'ora dell'allarme, essa ci avviseràogni volta che entrambe le ore coin-cideranno, e non dovremo più ripro-grammarla, a meno che non manchi
- la corrente. lmmaginate ora una cartadi credito, i cu j dati sono scritti grazie
a un'alimentazione esterna nel
momento in cui viene introdotta nellptlore' in altre narole dato che nonnn<<iodo :limont: .-zrone propfla,ntt:ndn ò nol lotinra À rnllan:f : avuorruv q rrgt rgLtvrg E twilE9qto/ E
quando non e inserita è scollegata.In oresto raso se si utilizzasse lo
stesso tipo di memoria, la RAM, ognivolta si dovrebbero configurare alcu-ni dati dell'utente, ad esempio il codi-ao nercnn:lo d:tn -l^^ ^,,-l-i--:_,-J LtìE gUdt)td)lmodifica andrebbe persa togliendo la
scheda dal lettore. ll tipo di memoriaadenrrato in nrresto ca5o e la
EEPROM.
Questa memoria si scrive e si can-cella elettricamente, e i suoi dati nonvanno persi togliendo l'alimentazio-ne. Ora impareremo a leggere e scri-vere in questa memoria, e applichere-mo tale metodo in un primo esempiomolto semplice.
Specificore indirizzo dq leggere.
Dore I'ordine di letturo.
Roccogliere il doto lefto.
Passi per la lettura della EEPROM dei dati.
ge ge8us qÉiffi Ift& !g;*A 4+
mulsFus€callMufmuufgsto
LEGAI EEFROII mufnÚuífbsfbsfbcf[ouf60u*Freturo
Passiam al bancc -l
Porta I sgcita
8adóio al banco E
scriuièm l'irdirizeo da leggerein ùna uariàbile ausiliariaChia€ta alla roútine ói lettsrasi ùistralizzù it risrltitosulìa PortB g
SpostiÈE I'iodirizzo da leggeressl sro registroPassiaE al banee Illrdine di letturaPassaggis al banco 5sprstia* il dato sulregistro aúsiliEris
EEADE_UàS,t4EEADÎslATrrs,qP8EEColft,BDSTATtS,SFtEED6TC,tEIDSTR UAB
Subroutine e programma per la lettura della EEPROM dei dati
Sqp$&wwrsp
*-ilYYài Ke ffi tr*-L& 14 sM*ffig&ffiffipffi*$r4 gSKX ffi&YX
ll nrocesso di lettrrra della memoria
EEPROM dei dati richiede solo di
seguire i passi che sono elencati nellart^,.-- -rr^^-+- {^-^tdO USO dellail9Utd cilE9OLO, rqLEl
RAM dei dati.ll nrimo nàqsn p snecificare l'indi-
rizzo che si vuole leggere. Dato che la
EEPROM dei dati nel PlC16FB4 ha 64
byte, questo indirizzo deve essere
compreso fra rvalori 00h e 3Fh.
Questo valore deve essere introdottonel registro EEADR, ubicato nella posi-
zione 09h del banco O. L'ordine di let-
tura si dà ponendo a 1 il bit 0 (bit RD)
del registro EECONl, che occupa I'in-
dirizzo 08h del banco 1 nella memoria
RAM. A quel punto il dato letto appa-
rirà nel registro EEDATA, posto all'indi-rizzo 08h del banco 0. Questi passi
sono stati scritti in una subroutine chia-
mata LEGGI-EEPROM, la quale vtene utiliz-
zata per leggere un dato a un determinato
indvizzo e mostrarlo sulla porta B.
Cambrando il valore del registro
EEADR-VAR, si realizzerà la lettura di
un altro indirizzo. Per fare la simula-
zione di questo primo programma
dovremo prendere, oltre al file dei
registri specifici, come abbiamo già
fatto altre volte, anche i registri della
porta EEPROM dei dati. Inoltre se
vogliamo che neìla porta B si veda il
valore dell'in dvizzo della EEPROM,
prima dovremo mettere in quell'indi-
rizzo un valore, dato che per defaulthanno tutti valore FF. Questo si ottie-ne con l'opzione Window>Modify.Nelle due figure sono riportatequeste finestre, prima e dopo la
EEPROM è un po' più complessodi quello della lettura. Questoncrrhp mtrntro l: lottr rr3 e imme-diata, la scrittura non lo è. La
scrittura impiega un tempo mini-mo di alcuni millisecondi. lnoltre,affinché non si producano scrit-
iure errate, bisogna rispettarealrrrnp nrnrodrrrp di sicurezzanrodi<nncté d:l .Òstr rttore
N/icrochip. Così dopo aver speci-
ficato I'indirizzo dt scrittura del
dato e abilitata la scrittura, dob-biamo caricare nel registroEECON2 due valori reali: 55h e
AAh. Questi registri non sono
implementati fisicanente e si
ulilizzano solo in questo proces-
so di scrittura.
Oltre a questi, si utilizzano glì
stessi registri che servono per la
lettura; infatti sono stati inclusi
in una subroutine chiamataSCRIVERE_EEPROM, che si usa
nel programma della figura per
scrivere il dato 27 all'induizzo03. Cambiando il valore dei regi-
stri EEDATA_VAR ed EEADR_VAR
si realizzerà la scrittura di altri
dati, in altri indirizzr. Per la simu-
lazione di questo secondo pro-
gramma, utilizzeremo gli stessi
reoistri del r-aso nrecedente.rRealizzate la simulazione con
l'opzione Debug>Run>Step e
fermate nell'uìtima istruzione il
programma, arrivando all'eti-chetta fine, cosi come e mostra-
to nella f igura. Come si puo
osservare non e stato scnttonulla nella EEPROM dei dati.
Questa scrittura non si produrràfino a che non utilizzeremoancora diverse volte l'opzioneStep (F7). Questo è dovuto al
Etu Prottrt Ed 0.en"S lptore ]oois Wìndou Eeh
: I1 orooranna inizia
IHIZI0 noulu 03 ; HEttiano I'indirizzo in cui scriueremouuf EEADB_UAE ; su di una u3riabite ausiliarianoulu 27 ; l4ettiano il dato da scriuerefrouuf EEDATA_unR ; su di utra uariabite ausiliariacall SCRIUI_EEPR0}| ; úhianata alla routinegoto FIHE
SCBIuI-EEPR0ì| nouf EEnDfi-Ufi8,1,1 ; spostiano I'indirizzo da scriuere Ifrouuf ETADR ; sul suo registronouf EEDAfn_unR,ll ; spostiano il dato rla scriuerenouúf EEDATA ; sul suo registrobsf STÉTUS,BPO ; Passaggio aI barco 1
eeidf ú3 3 00ú0ù911eeccn2 Èn 170 10101816pcldth B0 B 00008000irìtcon 68 B 8000ùS60$ iìfi 17S 1S101010t Siìr? 1'! tl S681 ùÌ 1 J
---- 06 6l B2 03 94 05 0ó 07 Bf.SCÉS FF TF FF F' FF FF FI FF FI
5810 Fr FF Ft Ft Ff FF tf rF tiÈ@$ iT FI FF FI FF FF FI FF FISffiq FF FF FF FF FF F!: FF IF FI
rc:&r13 w.&4.-zdcc Bk0n 5h thlHz Edt
Finestre al momento dell'ultima istruzÌone
Sw#swwryw
Vogliomo ufilizzorelo EEPROM
per scrivere un codice di un
solo digit che può essere
letto, visuolizzoto o combioto.lJopzione dipenderù dolvolore di un segnole
d'ingresso, e ilvolore domodificore si introdurràtromite quottro piedini del PlC.
E n u n ciato del l' esercizio proposto.
tempo che impiega la EEPROM per scriversi, per cui,se si uscisse dalla subroutine immediatamente dopol'ordine di scrittura, questo tempo non sarebbe anco-ra trascorso. Se dopo aver chiamato questa subrouti-ne si proseguisse con il resto del programma, dopo un
certo numero di cicli riusciremmo a realizzare la scrit-tura, però se subito dopo ilciclo discrittura siva a leg-oere o si nretende di scrivere consecutivamente diver-si dati in differenti indirizzi, il programma non funzio-nerà, dato che non ha avuto tempo sufficiente per
tura che la lettura della EEPROM. Leggete l'enunciatoche vi proponiamo. Utilizzeremo i quattro bit meno
significativi della porta A per introdurre i valori da scri-
vere nella EEPROM e la porta B per mostrare questo
valore. La quinta linea della porta A sarà quella che
determina se si legge la EEPROM o se si scrive in essa
un nuovo valore, a seconda che abbia valore 1 o 0rispettivamente. Seguite le istruzioni del programma
principale. Le chiamate alle subroutines le abbiamo grà
viste e commentate.realizzare la scrittura. Dovremo quin-di modificare la subroutine di scrittu-ra. La modifica consiste nell'attende-re che la scrittura del dato sia termi-nata, croè verificando quando vienemesso di nuovo a 0 il bit WR o quan-
do il bit EEIF (bit 4 del registroEECON 1) viene messo a 1 . Dopodovremo resettare via software que-.+^ {lrn I Inr h' rnnr f666i62 di nrn->LU lld9. ulld UUUI ld LL!ril!u vr prv
grammazione consiste nel verificareche il dato scritto sia veramente il
dato che volevamo scrivere, leggen-dolo e comparandolo con l'originale.ll bit 3 del registro WERR verrà messo
a 1 in caso di errore.
e_ffiYT#ffi& m sflffi]i?Y*ffiefl*î4ffi3qJruYilfìi <onrriin mncfrorom^ r'n: nirrnl:ut )E9utLv I r rv)LtEtEr I tv ur to PtLlwtoapplicazione dove si ulilizza sia la scrit-
Sw$swwrm
SCB I U I-EEPAOH
saEEÉDB-UfiB27EEDÉTÉ-UÉgSCBIUI.EEPROIFIHE
EE nD R_!fÉ , UEEfiDfiEEDÉfÉ-U6n,0EEO9fAslfiTUS,8POEECOill,#REHgt55EECOH2ax A6EECON2
bsfbsf
Íettieno f indlrizzo ln cui scrlueresu di una uariabire àusiliarteEettlàmo il dato da scriueresu dl una uartàbire ausiliartachlamata alla routine
sDostiano L'indírizzo da scriueresul suo registroSDostiano il data da scriueresul súo registroPeEsagglo al banco 1Pernesso di scritturaInlzfo della seouenzaobblígatoria di
Subroutine di scrittura della EEPROM dei dati modificata.
opzione da scegliereSe 884=B si scriueSe BA4=l si leqge
Hettiano 1'ínrtirizzo in cui scriueresu di una uarirbile alsíliariaíettiano il dato da scriuere5u di una uariabile ausiliariaChianata alla routinesi torna a scegliere
Scriuiano f indiri?zo da leggerein una uariabile aùsiliariaDhianata aIIa routine di letturiSi uiEualizza il risultatosul1a Porta B
si torna a scegliere
spostíamo l'indirizzo da leggeresu di un registroP:<<i:nn rl h:nrn I
Terminato il nostro programma, si prosegue eseguendo posizioni non valide
istruzione clrwdt (clear wat-rhnlnn\ r:nrall: il ton,, .-,,rporzza-tore chiamato Watchdog, evi-
tando In questo modo cne
raggiunga il suo valore massi-
mo (FF) e vada in overflow, cosa che
farebbe resettare il sistema. Non ha
nessun parametro, quindi il suo uso è
semolice come scrivere il suo nome.'-"'r"--Nello stesso momento in cui viene
OBG 6 ; Posizionanento della prina istruzione; all'indirizzo 0 della mensria di prcgranna
clrÍ P0ftlfiE ; Iúposto la Porta B cone uscitdbcf STAT0,5 ; Passaggio dl bdnco 6
noulu b'01 61 81 01 ' ; Houinento deÌ uilore inizialenosuf PoBIAB ; sulla porta I
8ICL0 conf PBBTg8,l ; Conplenento a I del ualore della porta Bgoto CICL0
EHD ; Fine del progrÈnna
'11
12t314
16171ft9?!
Programma di simulazione delle luci di Natale
plicazione dove la si vuole utilizzare. Per il
I OPERANDO OPERANDO * momento vooliamo limitarci acl rsarla in rrn
Caratteristiche dell'istruzione comf
: e r-:-"""-i. " l ": "-g* i
Operozione: complemento o I del contenutodel registro f bit o bit. Se d=0 ilrisultoto si loscio nel registro dilovoro W. se d=l si loscio nellostesso registro f.
€icli: I
Codice oP: 00 l00l dfff ffffFlog: Z
momento vogliamo limitarci ad usarla in unprogramma cne la vede prolagonrsta.lmmaginiamo per esempio le luci di un albe-ro di Natale. Possono seguire differentisequenze, pero la maggior parte delle voltesi accendono e si spengono formando drse-
gni in cui ognuna di esse si complementacon l'altra. Digitate sul PC il programma.-l^ll- fi^' rrrÀrta nall: nnrt: R mentroUEIIC llVUld U 9UdlUdtC rrLilu pvrLu u tttLttrtL
viene eseguito con l'opzione "animate".\/nlcfc nrÒ\/Aro:d in5gflpg Un inteffuttofeche, a seconda del suo valore, faccia esegui-re una sequenza oppure un'altra inventatad: riniT F norrho nnn mottorln in nr:tir: nor
il prossimo Natale?
ffiw$$*xerwsr**
Appti cazione pratica:atte nzion e a I Watch dog !
e ri vpnisse snieoato che il
Watchdog è un temporizzalore
a B bit che causa un Reset
quando va in overJlow senza
:nnirrnnpro altro ri notfebbe
sembrare una risorsa inutile. Senza dub-
bio non è così, tuttavia il suo uso risulta
scomodo per alcuni utenti, che decidono
di disattivarlo.
*x$s3TT1f$"Xg*FúL:*flî_ w.&í{"}"$m{.}#
ll primo passo, parlando di Watchdog,
sarà decidere se utilizzarlo o meno. Nel
caso ìa risposta sia negatìva, al
momento dì scrrvere un programma sul'microcontroller dovremo indicare al
software di scrittura questa scelta.
La zona cerchiata in rosso è l'opzione Finestra di configuraztone del Watchdog in MPLAB
La disattivazione del Watchdog si fa tramite il software di scrittura
rhe dovremo nrendere in conside-.,,'" Y,
razione in questo caso: impostar-do NO il Watchdog rimarra disabr-
litato, al contrario, ìmpostando Sl
lo abiliteremo Se in seguito desi-
derassimo utrlizzarlo, dovremoriprogrammare il microcontrollercon questa opzione cambiata.
Se invece di lavorare direttamen-
te con il microcontroller utilizzeremo
il simulatore, potremo attivare o
disattrvare ugualmente il Watchdog,
lo faremo tramite Options>Develop-
ment lVode, e una volta qui, sce-
nliorcmn l,a crhpde rhe si chiama
Configuration per ca'nbtare le carat-
teristiche del Watchdog.
All'interno di questa scheda, set,^^-;^^^ -^^l+^ ---ì,,None,, ilI upztut rc )LcrLd )drd
Watchdog rimarrà disabiliiato.
Sss#*qwwwres
Si vuole visualizzare sulla porta B
il valore complementato introdotto sulla porta A,
in modo ciclico, Inizialmente la porta A avrà valore 0,
5i controllerà l'uso del Watchdog,
Questa scelta equivale a mettere NO nella videata del
software di scrittura. Per l'opzione Sl abbiamo due possi-
bilità: una equivale a quella del software di scrittura, valea dire abilitare il Reset del PIC all'overflow del Watchdog(WDT Chip Reset Enable), e l'altra consiste nella possibi-
lità di fermare il sistema quando sr produce l'overflow(WDT Break Enable). L opzione del Prescale delWatchdog (WDT Prescale) durante la memorizzazione,non serve quando si lavora con un PIC'I6FB4, quindi
appare disabilitata anche se si seleziona una delle dueopzioni relative. La selezione del Prescale per il
Watchdog, in modo che ritardi il momento dell'overflowva fatta via software.
delle variabili. fazioneda compiere consistenal nronriora il nlrin
che si trova sulla porlaA -h^ ^^+"ì ^--^.^n, Lr iE Pv Lr o E))ct c
variato dall'utenteesterno, complemen-
tarlo, e mostrarlo sulla
porta B.
Come sempre,per prima cosa fa-
Sw#sEwcxww
KL WeTfl*{ ffi#ffi
Configurozione:PB uscito
PA ingressoOPTION
OO+ PORIA B
C {PORTA A) *W
W+ PORIA B
O rgan i g ra m ma del l' en u nci ato p roposto.
Organigramma tradotto in programma
remo l'organigramma dell'enunciato proposto.
Come possiamo osservare si prevede l'uso del
Watchdog, anche se non del suo controllo, dato che
l'unico riferimento fatto al Watchdog è la sua confi-gurazione nel registro OPTION. Inoltre possiamo
vedere che il nostro organigramma si avvicina molto. ^"^ll^ .h^ ..r-^^a lo i<trr rzinni dol nrra queilo cne SarannL ,, --, r,Jgramma,d,atn rhp i tro rinrradri :rrrchhcrn nntrto contenefeaffermazioni del tipo: "inizializzare porta B a zero" ,
" Complementare porta A" e " Passare complementodella oorta A sulla oorta 8".
Nel listato del programma si possono vedere
chiaramente ognuna delle parti riflesse in preceden-za nell'organigramma. Nella configurazione del
registro OPTION, gli unici valori che sono significati-vi sono ibit da 0 a 2, che pongono il prescale a 0, eil bit 3 che assegna questo predivisore al Watchdog.ln conseguenza di questo, il Watchdog impiegheràcirca'l B ms ad andare in overflow e a resettare il
sistema. Dopo aver editato e assemblato il pro-gramma, faremo una prima simulazione, con il\^/-+-L,l^^ -ll--++i,,vv6LLruwg ur>or'uato (Options>DevelopmentMode>Configuration>None) per vedere meglio la
d iff erenza.
sge$ài$_&gx#*$**ffiL pffi*&$4&ffiM&
Utilizzare l'opzione
Dato che stiamo eseguendo una simulazione, se sce-
glieremo le l'opzioni Animate, potrebbe passare diver-
so tempo prima che si verifichi l'overflow , quindi apri-
remo alcune finestre per farlo in un altro modo, senza
perdere dettagli.Da un lato attiveremo una finestra che ci indichi
in ogni momento il tempo trascorso: è la finestraWindow>Stopwatch. Ad una f requenza di 4 MHz, il
tempo che deve passare prima che il Watchdog vada
in overflow sara di '1 B ms, pero saremo capaci di fer-mare la simulazione in quel momento, per vedere in
che modo il programma inizia nuovamente?Sicuramente no. Per questo utilizzeremo anche la
finestra per tracciare il programma; in altre parole,
questa finestra ci permette di vedere quando il pro-Iistruzione che ci interessa. Per9rdililro po))o ptrr | |
fare questo utilizzeremo Window>Trace Memory e
Window>Program Memory. Nella finestra di memoria
del programma dovremo selezionare il codice che
vogliamo mettere sotto controllo, ad esempio la prima
istruzione del programma "bsf STATO,5".
Cliccheremo poi con il pulsante destro del muose,^^' {^'^ -^^-'i'^ "^ renù contestuale. All'interno dipcr rorc opvorrc ur rl
questo menù sceglieremo la funzione di tracciatura
Debug>Run>Animate persimrrlarlo e senTa nreoccu-
parci dei valori che assume-
ranno i renistri osservare
come vengono eseguite le
ictrr rzinni 61656 616 an+rrr)tr u4lvr il. uuvv Lr rE cl lt l o
nel cìclo, il programma con-
tinua a girare lì all'infinito.Configureremo ora il
simulatore per lavorare con
il Watchdog. Per il momen-to simuleremo solo la scel-fa che si nrro fare trami-
te il software di scrirtura,rinp rlirrheremo l'onzione
Options>DevelopmentMode>Configuration>WDT Chip Reset Enable. In
\tatn rlplle fine<trp rlnnn sygl'fermato la simulazione
il#pég$q#il1#ffiffiL W&Yflffi**ffi
Ora controlleremo il
Watchdog, in modo che nonprovochi questi reset delprog ra î ma. Per fa re
ouesto rtilizzeremol'istruzione "clrwdt": essa--^-^ll- il \^/-+-l-J^^cdrceild il vvdrLnoog ognl,,nl+r -h^ ',;^^^ ^.^^' 'i+-vurLo Lr rE vrcrE E)cvutLd/
evitando che arrivi al limite e
vada in overflow, a menoche il programma sfugga dalcontrollo in orresîo .aso il
WDT resetterà dawero il
sistema. Questa istruzione di
solito si mette all'inizio dei
cicli, e in sequenze diprogramma molto lunghe.Provate a rnserire questa
istruzione come nella figura,e ripetete la simulazione: ha
funzionato il controllo sul
Watchdog?
(Trace Point(s)); ora sr
puo eseguire il pro-gramma.
Quando la finestra
Stopwatch segneràalmeno 1B ms, si potrà
fermare la simulazione.L'opzione più rapidasarà Debug>Run>Run
Nella finestra Trace
Memory apparirà nellaparte sinistra l'istruzio-ne messa sotto control-lo, e nella parte destra il
tomn^ fr2<rnr<^ ll
primo tempo è quellotrascorso dall'inizio delprogramma, dato che
si tratta della primaistruzione, ogni appari-zione successiva invece
indicherà il susseguirs,dpn li ovorf Inrnr dpl
Watchdog.
%w#@wwww
Inserimento dell'rstrulone per il controllo del Watchdog.
Scheda dell,e istruzioni:l'istruzione SLEEP
uesta istruzione oone il microcontroller instato di riposo o di basso consumo. È suffi-ciente scrivere il mnemonico dell'istruzione,dato che si utilizza senza nessun parametro,per fermare il sistema. ll flag #PD (Power
Down) si pone a 0 e il fìag #TO (Timer Out) si pone a '1
Cara tteristiche del I' istruzione sleep
Questo tipo di funzionamento è con-
sigliato per applicazioni in cuì ci siano
lunghi periodi di inattività, nei quali il
microcontroller debba comunquesorvegliare il valore degli ingressi.
ffism$dètrx
fr#ru e--xsK$q#xg*rutr sLHtrp
Quando si esegue l'istruzione, l'oscil-
latore del sistema si ferma.
Dato che il ritmo, o velocità delle
istruzioni, è scandito dall'oscillatore,e nresto p fermo le istruzioni si fer-mano anch'esse, cioè non sono piu
eseg u ite.
Dato che le uscite del sistema
variano con ìe istruzioni, e queste
non vengono eseguite, le linee confi-gurate come uscrte non cambreranno^i,, ,,.1^"^. r I rnc+nrrnnn rPtu votwiE, )E Etqttv o I rcJrcrorilr\/ d
1 e se erano a 0 anche. Nemmeno il TMR0 funziona,ouìndi non arriva all'overflow.
Questo è lo stato tipico di un telecomando; rimane
in stato di riposo sìno a che qualcuno decide di utiliz-zarlo e preme un pulsante.
Questo pulsante provoca un interrupt che fara usci-
re dal letargo iì processore. Inoltre si puo "svegliare" il
processore provocando un reset tramite il piedino
N/CLR#, oppure mediante il Watchdog.In quest'ultimo caso, entrando in sleep, il Watchdog
si azzera, però dato che funziona con un oscillatore
indipendente, può continuare a incrementarsi e arriva-
re all'overflow. orovocando un reset. Si tratta comun-que di un reset speciale, dato che non si riparte dall'ini-zio del programma, ma dall'istruzione successiva allo
sleep.
Copiate il programma della figura e simulatelo con
il WDT attivato e poi senza attivarlo. Attendete almeno1 B ms ner vedere cosa succede.
PARAMETRO PARAMETRO12MNEMONICO
s.l .e e p
Operozione: Porto il microcontroller nellostoio di riposo
oBG B i PosizioBatrento della prina istruzÍùne: alf indirizzo B della @mria di progrannà
clrl PoBfnB ; Porta B cone uscitanoulD b'68681860' ; confiqurazione di 0PTI6H per il fDTnouuf oPTbcf SIfiTo,5 ; Passaqgio àl banco g
noulu 6xFF ; llovinento .lel ualúre inizialen0!uf PoETAB : sulla Forta I
fICLB sleep ; I1 ricrocontroller entrà in stato di riposoconf PoEfnB,l ; Si canbia il salore della Porta Bqoto CICLo
EllD ; Fine del progranBa
Programma che permane in stato di riposo
S*#swswwe
Scheda detle istruzioni:f istruzione SWAPF
on questa istruzione si cambiano i quattro bitpiu significativi di un registro con i quattrobit meno significativi dello stesso registro. ll
risultato si memorizza nello stesso registro onel registro di lavoro W, come sempre a
seconda del valore del parametro d. Nella figura e rap-presentato il modo in cur è eseguito questo cambio.Dato che il registro si divide in due si cambierà unaparte con I'altra.
DOPO t'ISTRUZIONE
Rappresentazione del funzionamento dell' istruzione swapf
{5{?rz]lr'î {*ru # g$?ffi *J.:*i, il Sii,i,& firQuesta istruzione e piu importante di quanto sem-
bri; come avrete già notato, i dati normalmente sonoraggruppati in byte, cioe in gruppi da B bit, per poi rap-presentare questi bit in binario o in esadecimale. Così B
bit si dividono in due digit esadecimali, o se vogliamorappresentare il dato in decimale, in due digit decimali.
Quindi in un solo registro possiamo scrivere due digit, e..r-+- l- ---.-t+^ r^: -^îi<tr; di rr ri di<nnno ;l Plf 16F84,uo Lo to )Ldt )tLd uEt tEL
fare, se, ad esempio, vogliamo sommare i due numeriche sono scritti nello stesso registro? Ecco che entra in
gioco la nostra istruzione. Lidea è schematizzata nella
figura; dobbiamo annullare i bit più significativi e
memorizzare il
dato su un altroronicfrn <i nttio-
ne così il primovalore.
Si utilizza in<onrrifn l'i<trr r-
zione swapf per
scambiare i bitpiù significativicon quelli meno
significativi, e si
torna ad annul-lare i bit più si-
gnificativi (quelli
che erano I
meno signif ica-
tivi), e si memo-rizza il risultato
SU UN NUOVO
regrstro.
Dopo averottenuto i duedati si puo ese-
guire la somma.
OPERANDO OPEMNDOMNEMONICO FONTE DESTINAZIONE
-. -:--y--e*-? f i -", .r --.,"-,j g . i
Operozione: scombio dei quotiro bitpiù significotivi del regislro fcon i quottro menosignificotivi dello slesso regisfro.Se d=0 il risultotoresto nel registro di lovoro We se d=l il risultoto si loscio nellostesso regislro f
Cicli: 1
Codice oP: 00 I I 10 dfff ffffFlog: nessuno
Caratteristiche dell' istruzione swapf.
Schema esplicativo diun esempio che utilizza I'istrulone swapf .
uando si impara a programmare bene coni microcontroller, è normale utilizzare unastruttura in cui il programma principalecompia solo l'inizializzazione delle risorse,
mentre nella routine di servizio all'inter-rupt (RSl) si realizzi solo cio che si desidera dal pro-gramma. ll difficile non è utilizzare gli interrupt, ma sa-pere cosa fare quando sono generati. Pero e meglioprocedere a poco a poco, per il momento è sufficien-te vedere un primo esempio di routine applicato ad un
orooramma.
g*dYffiffim&ipY ffi& ffiffi*lxruYtultlizzo dell'interruot evita di dover testare continua-mente se si è verificato un determinato evento. Così il
microcontroller puo restare in stato dr riposo e risve-'gliarsi in caso si produca un interrupt, ad esempio unoesterno tramite RBO/INT.
Se si analizza I'enunciato orooosto si arriva alla con-clusione che nel programma principale non si fa niente;
tutto parte dall'interrupt. Nella subroutine dedicata,dopo aver verificato il valore di un bit si esegue qualsia-
sr operazrone.Lorganigramma rappresenta le operazioni che si fa-
ranno nella Routine di Servizio all'lnterrupt. L'organi-gramma principale non è stato disegnato, perché è so-
lamente di configurazione. Prima di trasformare l'orga-nigramma rn programma vediamo il significato dei bit
Abbiamo un dispositivoche permane in stato diriposo sino a che unutente non lo risvegliapremendo RB0/|NT.Al risveglio, a secondadel valore di RB1, si ponelaportaAa0oppureal.
di due registrimolto impor-tantr In questo
caso: INTCON
e OPTION.Nlal ronictrn
INTCON si ese-
guono le abili-tazioni ai di-versr InferrupLNoi lavorere-mo soto conRB0/lNT. quin-di dovremonrnihira irrtf i
gli altri. ll bir 4
RSI
ùb RBt=l O(X)-w lF-w
w -PA
INTF=O
Torno
Organigramma della routine di interrupt
è quelìo chedovremo mettere a 1 in questo caso, inoltre il bit 7 è l'a-bilitazione generale degli interrupt, e se non è a 1 non
sarà possibile utilizzare nessun tipo di interrupt. Per
ogni tipo di interrupt quindi, deve essere messo a 1 il bitche gli corrisponde, più il bit di abilitazione generale.
Dopo aver prodotto l'interrupt, si attiverà un flag, per
RBO/INT sarà il bit 1 di questo stesso registro. Per quan-
to riguarda il registro OPTION solo un bit è significativoper il nostro esempio: il 6. Con esso specifichiamo se il
fronte attivo sarà quello di salita o di discesa, a secon-da che il suo valore sia 1 o 0 rispettivamente.
INTCON
OPTION
Registri coinvolti nell' interrupt RB)/INTEnunciato per I'uso di un interrupt
$s#*wwr*
I
STATO
PORTAAPORTAB
INTCON
OPT
INTF
tNtzto
RIPOSO
CONTINUA
Programma proposto
LIST
EQU
EQU
EQU
EQU
EQU
EQU
ORG
goroORG
gotoORG
bsfMOVIW
movwfcl rfmovlwmovwfbcf
movlwmovwf
sleepgoro
P='l 6F84
03
05
06
OB
81
1
0
lNtzto4tNr5
5TATO,5
0xFF
PORTAB
PORTAA
b'01 000000'OPT
STATO,5
b'10010000'INTCON
RIPOSO
PORTAB,lZERO
UNO
00CONTINUA
b'00011111',CONTINUA
PORTAA
INTCON,INTF
btfssgoto
9oto
movlwgoto
movlwgoto
movwfbcfretfie
END
lndirizzo del Vector di interrupt
Programma princlpale
Porta B come ingresso
Porta A come uscitaConfigurazione del fronte attivo per l'interrupt
Attivazione dell'interrupttramite RB0ilNT
Si pone in stato di riposoRitornando dalla subroutine di!nterrupt si passa in stato di ripososino al prossimo interrupt
Verifica il valore del bit RB jÈ zeroÈ uno
5i sposta lo zero
Si sposta uno
sulla Porta A5i resetta il flag di RB0/INT
Definizione del processore
Definizione di variabili
$ep$Swrwryes
lndirizzi delle istruzioni nella memoria di oroqramma
porta B come ingressi, dato che ab-biamo bisogno di RBO e RB1, la por-
ta A come uscite per visualizzare il ri-sultato delle operazioni da realizzare,
e i registri INTCON e OPTION (OPT)
per configurare l'abilitazione degliinterrupt e selezionare il fronte con
cui si produrranno. ll microcontrollerviene poi messo in stato di riposodall'istruzione sleep, e rimane lì, sen-
za eseguire l'istruzione successiva, si-
no a che si sveglia, al verificarsi di un
r nterrupt.Un interrupt e un avvenimento
asincrono, quindi non si conosce il
momento in cui awerrà. Nel nostrocaso l'interrupt si produce grazie al-
l'attivazione del piedino RB0/lNI,quindi sarà provocato dall'utenteesterno premendo un pulsante. ll PC
La novità è nel modo in cui il programma è orga-nizzalo, anche se di questo abbiamo già parlato nella
parte dedicata alla struttura generale di un program-ma. Per prima cosa, come sempre, bisogna decidereche microcontroller vogliamo usare, e definirne le va-
riabili. La prima istruzione del programma si posiziona
all'induizzo 0 della memoria di programma grazie alla
punterà all'indirizzo 4 e inizierà la
routine dedicata all'interruot. In essa si verifica rl valore
del bit 'l della porta B, configurata come ingresso, e a
seconda del suo valore, carica nel registro di lavoro Wil dato 00 oppure 'l
F, per poi passarlo alla porta A e vi-
sualizzarlo. Prima di uscire dalla routine con I'istruzioneretfie bisogna resettare il flag di questo interrupt a 0.
Ouesto bit è stato messo a 1 nel momento in cui si èdirettiva ORG. Come elemento nuo-vo però, abbiamo introdotto gli in-
terrupt e ìl vector di interrupt si trova
all'indirizzo 4 di questa memoria,questo significa che quando si pro-drrro rrn intorrr rni il Pl- nr rnf l : nr ra-
sto indirizzo snerando di trovareun'istruzione della Routine di Servi-
zio all'lnterrupt (RSl). Per questo mo-
tivo dobbiamo mettere la primaistruzione della routine all'indirizzo4, e lo facciamo utilizzando nuova-mente la direttiva ORG. Nella figurain alto possiamo vedere come resta-
no localizzate le istruzioni nella me-moria del programma, dopo averloassemblato. Notate che negli indiriz-
zi da 1a 3 si trova il valore 3FFF, ciosignifica che non ci sono istruzioni.
ftnc o lgoto INIZI0 :0FÈ 4 ; Indirlzzo del ùèctor .
gotú lt{t Iof,G S :.
r S.fF i lorta B co* lngresl:: : ::::'.. ::.,:. :: ..: :.,ìir .rl
Finestre necessarie per la simulazione.
Swf*wmre
ll microcontrollore permane in stato di riposo in attesa di un interrupt
dati al sistema: Debug>Simulator Sti-
mulus>Asynchronous Stimulus. ln que-
st'ultima programmeremo due linee: la
RBO che introdurrà impulsi (Pulse) e la
RB1, che simulerà un interruttore (Tog-
gle).
Simuleremo ora il programma in for-ma di animazione. ll programma avan-zerà sino ad arrivare all'istruzione sleep,
la eseguirà e si fermerà aspettando che
si produca l'interrupt, mentre punta al-l'istruzione successiva.
Prima di premere qualsiasi pulsanteguardate il valore della linea RB1, e del-la porta A, entrambi nella finestra deironi<tri qnorif iri Prpmotp il nrrlc:nfoRB1 della finestra Stimulus e verificateche ilvalore cambi. Se ha valore 1, pre-
mendo RBO, la porta A assumerà valo-re 1 e se ha valore 0, premendo RB0,
assumerà valore zero.
verificato l'interrupt, così nel caso fossero previstianche interrupt di diverso tipo, consultando i f lag si
saprà quale di questi si è verificato, dato che solo un
flag sarà a 1. Inoltre quando si verifica un interrupt,l'abilitazione generale (bit 7 di INTCON) viene messa
a 0 automaticamente, e sino a che stiamo esequen-
do la subroutine del primo, non se ne potranno ge- l
nerare alîri Fseorrendo I'istruzione di
ritorno dall'interrupt questo bit vienenuovamente messo a 1, e l'istruzione"goto NIENTE" fa sì che il microcon-troller torni in stato di riposo.
sg*iBt3*_&xx#ru$:ffitr1 trffi#ffiffi&&?&,t&
Per simulare il programma avremo bi-qonnn di rrn: sprio di f inestre che ci
permettano di osservare quello che av-
viene all'interno del microcontroller.
Queste finestre sono: quella dei registrispecifici (Window>Special FunctionRonistpr) ner vedpre se le funzioni si/, Y!' Yrv!rr
compiono, lo stack (Window>Stack)npr vpdprp ali indirizz.i di ritorno che
vengono memorizzati, e il programma
vero e propflo, per vedere la sua evolu-zione. Inoltre avremo bisogno della fi-nestra che simula l'introduzione dei
Sm$&wsxpm
Premete ancora RBO. Vedrete che nella finestra diprogramma verranno eseguite rapidamente le altreistruzroni, pero non potremo verificare quali, comun-orre vedremo che nella norta A si carirheranno va-Fv'
!v '
lori diversi. Per verificare isalti all'interrupt ferma-te la simulazione ed eseguitela passo a passo
(Debug>Ru n>Step).
sr-rsfr sr-rrft
; Porta î conmulr È'fit8t!6€' ; Configorazioomqrf OPTbcf STfiT0,s