microrobotica monty peruzzo editore - 09 b - programmazione
Post on 08-Apr-2016
226 Views
Preview:
DESCRIPTION
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.
Cicli: 1-2Codice OP: 0l lObb bfff ffffFlogs: nessuno
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.
-- brlss STATUS Zsolto se b='t (
"oto ETICHETIA |
- si esegue se b-o
\- goro ETICHETIA 2
ETICHETTAI decf CONTATORE,Fgoto ETICHETTA 3
ETICHETTA 2 incf CONTATORE,Fgoto ETICHETTA 3
ETICHETTA 3
:
PARAMETRO PARAMETRO
btfss:j, -..- ..... - -,! ..:. *,.-. - i .-., .. .. ..-l- ---..-"i
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
Sw$*xwexws*g,rrisuìììììtrtlluu:t1t1utl]Niliililililurl
Scheda detle istruzioni:f istruzione DECFSZ
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
sua esecuzione imoieqherà due cicli anziché uno.
z- decfsz Í, dI ictr rzìana I\ '- --- "\-* isiruzione 2
::
f-t +w
' s eseqr,r si; f i:0*-l
È o
OPERANDO OPERANDOMNEMONICO FONTE DESTINAZIONE
decfsz
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.
Cicli: 1-2CodiceoP: 00 llll dfff ffffFlog: nessuno
Caratteristiche dell'istruzione incfsz.
$*S*xrwr*
Applicazion e pntica: visu aLizzazion e
dei dati det primo programma
questo purto abbiamo imparato a realtzza-
re tutte le fasi che comporta un program-
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. ,
$w$#e*ewre
STATUS
PORTABDATOlDATO2DATO3
S{KXXY*JKESHL PRS&K&MPdX& S#Rffi mruYKFatto l'organigramma, dobbiamo tradurlo in istruzioniper rl PlC.
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
simulazione per vedere se il
programma esegue quel o
che vogliamo Nella finestra
Sw#sesesxsw1t:aa:a:ia..::::::!'Nt{..:::::.....ì:ì::::::.1:1.......ii:r,r1,rrì::ììrr,f-!ìì:rìrrììì.,ìììÌ,ììr;l:jr{1
' LIST P=16F8{
.slnTUS Equ 03rP0fiTnB EqU 6ó.DAIO1 EqU BC
,Dsl02 Equ BD
103 EQU BE
bsf STnTus,5noulu SBnouuf P0RIABbcf STATUS,5
nouf DAT0-I , B
frou{f P0ETABnouf DAl02,6ftovuf F0RTABnovf DAl03,6nouuf P0RTAE
noulu 03nouuf DAT0Inouf DAT02, B
frouuf DAT03
noqf DAT01 ,6novuf PIIRTAB
:SFR Hane Hex 0ec Binary6E 8 8O68B6B8ÉE 6 B0BB5C0g
qstisr*rrq Ff :55 1.,|J11111status 1B 2s BSÈ1'lBBg
oB 6 86066889&g B 806980001F 31 86B1111 l80 6 0ú6066C0FF ?55 JlJ11l11BB O O8B88696
66 6 606ú6680
0't d2 03 6rr 95 668s 6g 60 tB 6B 00 60o0 06 0B 0B 00 56 6B56 66 58 0B 00 B5 B0
BC 66 0B C0 B6 86BO BB 66 BO 6O 6B
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-
routines.
coll configurozionecoll roccolto-doticoll visuolizzo-doticoll sommo-doticoll visuolizzo-doticoll soitrozione-dolicoll visuolizzo-doti
configurozione
rqccoltq-dqti
wisuolizzo-doli
sommq-dqti
wissolizzo-doti
softrqzione-dati
visuolizzo-doti
Sequenza dei passi durante Ia
chiamata a subroutine.
Sch eda delte istr uzioni :l'istruzione RETURN
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-
i;*é ffi èÉse. Xffi# r_{'
i,iiÉ***ss*i*iàffij*g*4.*g* :*$éÈ*dee.
- - :':
iF.sfft
k:tuWfrx*, fid+&d?WÈ*w 'b€e$:i{H
**lxri&&*dd. &5.e+Fq
4lll ts*l€**
:rétrs* {ry+ *fgt,* *# fl&f*F-*ii q& .**tFCt {E!x *ldEF* *
I
*É- #+q*jgsi** "rÍl;F.í€a
Uno dei possibili modi di simulazione
S*S*'txrxre
Configurczione:DATOI, DATO2, DATO3
PB uscitq
moslro DATOI
ritordo lsg
moslro DATO2
rifordo lsg
mosfrtr DATO3
ritcrdo I sg
o3 +-DATOI
DATO2-"+-DATO3.
mostrc DAIOI
rirordo I sg
mostrq DATO2
ritr:rdo lsg
mosiro DAIO3
ritordo I sg
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-
Àr^r ---^.li orresto esercizio dobbiamoVldllllllO. l\Cl LC)U U' yuLJLv
I
ì
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-
-- -^-h^ -^ ^^+^,,r ^..^"^ -^ll^-.+. ^l- ^,,-l.i-.i .l+"-Itd, dILt tc )c puLcvd tr))crc LUiluLdLd ud L.ludr)rd)r dilrd
parte, tenendo sempre conto dell'ordine con cui si
eceorie il nronrammà notàte ehe donn l'rrltima chìa-
mata alla routine "ritardo" abbiamo un salto alla finede' nronr.1mrn.: ,al+rimenti tornerebbe ad escnrrrrsr
questa routine. li proqramma, come sempre, terminacon la direttiva El'lD.
I movlw
movwf
moviw
movwf
btiss
g0î0
teturn
Rouline di temportzzazione del TMR0
90t0
bcf
decfsz
d'15'
CONT
00
TMRO
INTCON,2
ctcL02
lNTCoN.2
CONTl
ctcL0l
;€ido esterno che si ripeterà 15 volte
;lnizializzaziore del cklo interno
;Ha finito di contare?
;No. (ontinua nel ciclo interno
;5i. Azzera il flag
;Decrementa il contatore del cielo esterno
;Dato che non è zero torna al riclo interno
;ll contatore esterno è arrivato a zero, esci dalla routine
Sqp$*x*rw*exx'.|l|...,.::.::.::|.'.|......1..1Nj1...::.j.:.jj.]]]i.lìN1,]i]]]]]]]:]]]]]]]::]lù!ì\|ì:::ìsi.*g
tlullNEn${l1fr1fssì
'l'&,,,1:&:.'.'.7
'ì'lìii:..,u1ì:i
::::::.:,1..:a.::;,
.,ìt:::t*rr::iF,l::.,:3
:::a:,,.,:&
,,'::,:l::::
,,a:a,a,a,a:a,i
tt',.?,'
LiST P=16F84 ;Definizione del processore
TMR0 EQU 0f ;Definizione delle varìabili
OPT EQU 81STATUS EOU 03PORTAB EOU 06INTCON EQU OB
DATO1 EOU OC
DATO2 EOU OD
DATO3 EQU OE
CONT EQU OF
ORG 0 ;Posizionamento della prima struzione
;all'indirizzo 0 della memoria di codice
bsf STATUS,5 ;Passaggio al banco 1
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ù
on2 tl8 0 000t1ú600ldth 00 B S0B0B0{ì0
rntc0n 2q 3ó 0$1 Í6.1 6B $Lr 14 20 [ùS1$iÉilt6Ère 81 1 úS0EBB01
;P"ogrm dli tratteètrto dlell,intetdpt.
goto SEEUIflEmuf r P0RIBxorlr b'3t8081 86'
;Ancora !o
ilnv€rti@ it bil 2
;Se è spetrto si acceode;Se Ào si speG€
mulf P0RTS
mulr -26mulf f,ontl ;IDizíalízziúo iI coEtl
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
subroutine dipende daltipo di programma
che vogliamo realizzare. Quando un'azio-
;Súbrùutlrt
,rtfll€' mr*f T'*0Èllr b'g6talJ91'*orf Pflf I4
*0tf€n-t ttfsi ll{tcofl,l0ltgoto nunl|z*-lbcf lt{ft8t{,f8lrretwc
t€Sfg* ssxf llsgselr t'tc8ú1111'@* P6nt*
9€SliÉ,1 btÍss IltTCBtl,IElFgotr t€Slf,*_1bcf lHTe0l,lClFretgrn
Carieè il lil*g
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
.nmllnnlro <A tiiliTT-+^ inLvrrrurrVuu uLilr44dlc lll
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.
Itoufreoto it aqarti
tira a destra
; Sulrsutin"
àlnflZf svef IHREfivanti-
tl.litl?A-.f ùtfss lìlTt8t{,l$rtgato A8àHZ$_1àcf IltTc0l{,IClFreturn
DESI in ffivsf TIiEBges t
!€Sî{n_1 btfss lill00Í,lglfgBto 9Fst8È*1brf IllTC0N,TBIrreturn
Carica lI TI4BS€ugrzaSoGú terRioati i passi?HO. e?ÀtirùaSi, Disettise il flaggitsrnà
Darica i1 l3ngCira a destraS060 te.niftati i passi?Hì. 0rntiruaSi- Disattiu8 it FlagRitorna
Sezione dello stesso programma, pero con l'utrlizzo di subroutine e di macro nella stesura
subroutine, pero rl tempo di ese-
cuzione sarà minore, perché non
ci saranno chiamate a subrouttne
durante l'esecuzione del pro-
gramma. Quando il codice da
includere in un modulo separato
dal programma principale è
molto grande, di solito si usano
le subroutine, quando dettocodice è molto piccolo, e meglio
utìlrzzare le macro.
PRffiffiLffiWX ru#LgJ#$*ffi*L&_ffi ffiefrffi#Non si può parlare di problemi
propriamente detti, ma di pre-
cauzioni e di norme dì buon-t^ Lt-^^^- -^"uso, cne orsogna conoscere e
applicare, perche questi non si
producano A causa della diffe-renza che esiste al momento di
assemblare, fra macro e subrou-
ne, il numero di istruzioni generate, e che piu tardì saran-
no scritte nella memoria del microcontroller, risulta lo stes-'so di quelle scritte nel programma al momento dell'edita-
zione. Quando si utilizzano macro, invece, ogni apparizio-
ne di un nome di macro è sostituito dal compilatore, da
tutte le istruzioni che formano la macro; questa operazio-
ne è chiamata espansione di una macro. ln questo modo
la quantità di istruzioni che saranno scritte nella memoria
di programma sarà maggiore che nel caso di utilizzo di
tine, l'inserimento dei cicli non si
or,ò realizzare nello stesso modo. Nel secondo pro-
gramma di esempio, sono state sostituite le subroutine
con le macro, definendole in modo errato.
Dato che tutte le istruzioni delle macro si ripetono
tante volte quante sono le chiamate, si verificherà
anche la ripetizione delle etichette che formano parte
di queste macro. Questo genera un problema, quando
un'istruzione, ad esempio una goto, fa riferimento ad
un'etichetta e questa etichetta appare duplicata nel
Generazione del codice nel proqramma scritto con subrouttne
Generazione del codice nel proqramma scritto con macro
mwf PonTieúnpe_1 ùtass tflrcoff,f8lf
goto l!f,Mt-1bcf lxTcol,Toif
ESlinRÙgf TM!mlls b 00!fi111'mlqf Pú81î
o€SlRi_1 òtf5e lfllc0l,T0lfgoto tEslnf_lbc, lNlc0N.lùlf
i Prograffi 9rincip3le
; Carlca il lB!
i son. tefúlnati I Pasri?
; Si- Dle.ttisa t1 lrÈg
; sóno tersinati i póssi?
ì Si, Disattfvó 1r Fì39
ÈlClO frllr oxFB ; ita8z. dl 25Ù M (7 pasli)t0iff?nÈlls ÙrfÙ ; 6ifa . destra di ió Pèssi0lsrnamvl{ gf1 ; llitz! dt 1à Pastia0htzi
ÉF
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
5i no
Allora
5e no
X=0
FACI0IIAL = 1
FAOORIAL = X t FACT0RIAL (X - 1)
Esempio di programma scritto in forma recursiva
mGromvwf llno ; grrlca 11 tíAgnov10 b'c88tll61.[Òvef F0nla
Sl. Disattlua ll Flòg
muuf îf{Fomvt.s b' 6BO6J11'' ,
meef p08înbtfss txtcoH,Totfgoto $-'rbcf tNf0frfi,f8lferdn
; Ffo$raM pflnrlpale
11toila
eartca ll lín8
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
S*SSweglwm
EQU &85EqU ar86
0nG 0goto rtlzto
Inlzro bsf sTeÌus, RPonóùlú B'A0!06A9!nóo{f fIISBnoul{ 8 00fi0!!t
$EAE bsf PoRlB,lEohcf IilTCoN,l0IFgoto UCLonI
€m
10 1ó C5flÉCgoqFe a7 7 09F4fi11
Scelta dell'introduzione di stimoli esternt
rrlrlÍ1ff]írìrìììììì::*w*j;ir]:rrrrrrt1tilr11ii1111ftfì*:rra,ìii!€i:?;1í$i|ruiìììììilf*gtirflÍ:f'r)t*trùìmi:::::&{@
pR*we ffitr1 pR{3&K&M$4&
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
iéx sec rrnafg6ú 3 046ú€ng8aó ó 4€6É3116
ion_r€g FF 255 11111111atù5 3a 5ó 0C111646
rr 00 0 sB6ú004cDrta c[ 0 co60606€
IfflcoN EQù gf0B0PlloN,R€c E{u 0x31lÎlsn €Qú 0xa5tntsB €Qú 0xa6
OBG O
goto IilIZt0
IilT2IO bgf STAIUS, sPOroulv 8 09ú00060'
òcf PoRts,LED
btfE5 ixlcoff,t0tF
qOtO ACCEilDERE
bsf P0BIB,LEoh.f lNtc0NtT0tF
€xD
Scelta per I'inserlone di impulsi su RA4
Scheda detle istruzioni :
f istruzione CLRW
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
Sm#sqerwrm
!'ifirnfi8 ! €Qu 0rcsÍocro F EQù 1!lrs!8to PCt EQù Ax@úúÍ11111 STaTUS EQù 6xB3!í!Ífr0íìr P0ITA EQU 0x61r11i111 PoATS EQU &ùÍiíj!90tr0 RP! EQù 0xs$Í0$!0t0 IRISA Equ *453flrqî3ii6 lFlss Equ oxaé
IflIZlo bsf Slnl0S,tP! : Pasllah al bancò IFvlr Ea!s40000 :P.rt.Bdsrit.xu* TnISB
tulHel
Configurazione dell' introduzione degli stimoli esterni
oBG A t 11 progranà iniziagoto lfffzlo ; a11 indirlzzó a
3i;3::il "6ee4ta1o Dvt' P0Al8 : Uii{irlzzlam 11 {órrlarr1l1 qot. GICIo : Si ripéte alt infini
RBO
RBIRB2RB3RB4RB5RBóRB7
RAO
RA]
RA2
RA3
Schema elettilco per l'utilizzo di diversi display.
Sch eda detle istr uzioni :l'istruzione ANDLW
uesta e la prima istruzione logica che trovia-mo. ll suo compito e realizzare la moltiplica-zione logica dei due valori: un valore lettera-
le e il contenuto del registro di lavoro W. ll
risuitato rimane sul registro di lavoro W.
Se il risultato delì'operazione è zero, si attiva il flagZ.
E considerato falso il vaìore 0, e vero tutto cio che
non è falso, cioè tutto cio che ha valore diverso da 0. In
alcuni linguaggi di programmazione, questa istruzione
puo avere più di due operandi. Se tutti isuoi operandi
sono veri darà come risultato un valore vero, e se uno di
essi è falso, anche il risultato sarà falso. Nella figura è
mostrato come funzionerebbe questa istruzione se lavo-
rasse sui registri, cosa che succede in alcuni linguaggi, e
come lo fa nel PlC, dove lavora sui bìt di un registro. La
prima tabella mostra il funzionamento generale e la
seconda un esemoio oarticoìare. Partendo da due valori
per un registro e per un letterale, se si lavora con il regi-
stro al completo, il risultato finale sarà 0 (falso) sola-
mente se uno dei due valori, o entrambi. sono 0. In tutti^li -l+.i ---i il "i-,,1+-+^gr drLr rLo)r r,)urrqLv sarà vero, però non ha nessun
senso dare un valore, infatti le istruzioni che operano in
questo modo non lo danno: lasciano solo un valore V in
una varrabile di tipo logico o booleano. Se si lavora con
i bit, avremo il risultato di ogni coppra di bit, e puo suc-
cedere, come nell'esempio, che due valori che in princì-
pio non hanno valore 0, diano questo risultato combi-
nandosi con una istruzione and loqica.
ffisffiffig3x{*F* tjg$Y$4#x,K#ruffi&Fdffi$_wMentre un'istruzione arit-metica uÍtlizza come unitàbase un registro completo,un'istruzione logica opera
con ognuno dei bit di que-
sto reoistro in modo indi-nanÀania \/arlirmn nr'^.+1pcllucllLc. vcuror ru l]tlr)ld
differenza con l'istrrzioneAt -,.1 -l -+:--^ ^--,,^^ndO.ut Lut Lr )Lrdr ru uLLuPo
fistruzione and, chiamata
anche moltiplicazione,suppone che ivalori con
cui si opera siano veri (V) o
falsi (F).
OPERANDOMNEMONICO FONTE
OPERANDODESTINAZIONE
it
:
Operazione: reslizzo l'operozione logico ANDfro un volore lefierqle
e un volore del reoistro di lovoro W.Cicli: I
Codice OP: 'l I l00l kkkk kkkk
Flog: Z
Caratlerisl.iche dell istruztone andlw.
Tabelh generule
**Js:*--* -M* "ii*:dn*-i**n"i -.---L--i"-*.t**l -""-".Y-.i "--.,'".-t.---"i**J_".iVFF
y"."".i -"--x*i " -""-"Y,-*.-i
Lsrcro con rcgistrÍ lsvlttmnbit i i
,ssx:k#ffi#--rti*s!t*"F."i "Hi*r";rj!Mt ."".-fi
-gl-qi-$3,:-llqjg$rs--.".--y*-*-:3l"qlq1srr,!sg!-q.!* -9ffio"-{nii
Fu nzi on a m ento d -^l I' t struzr o ne a nd lw
#q*##ews*ww
Scheda di istruzioni:l'istruzione ANDWF
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.
Ssw#swwyqxr,rrrfrrlrrrr{ìrìsÌr11:i:.::::.rl3ry(lÌl!l{i:ffiffi ,!trrl
Fi F
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.
movfandlw
Esempi con le istruzioni andlw e andwf
Applicazione pratica:scrivere chiavi netl,a EEPR0M
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
SIAfUS,BPB8' g8ABA66A'
TRISEsT*tus,RPs
83EEfiDR_USRLEGGI_EEPROIIEElnTn_ufiB,tfPOETBI}IIZIB
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
realizzazione della simulazìone.
Questa simulazione si puo fare con
l'opzione Debug>Run>Animate, o
Debug>Run>Run, infatti ci interessa
solo il risultato finale, dato che que-
sto programma è in pratica un ciclo
che realizza continuamente la stessa
funzione.
$w#*wwsw
, ,JEt4l.tSBinaru ^issos8i8o
= F
soggstuo -i FD
1i1'ti111 :BPc
BXtrlBX 6é
6:{ 68
BX 69
OXtr6X 60
6X8ó6X88
ilmff ==.r:..::.1SFS HaF H€x llec
tnr0 B0 6
pcl BÉ 6
eption_reg FF 255status 1B 2ilfsr 5B !porta Bs IlrisÉ 1F 31
psrtb B8 Itrisb iF 255Èedata FF ztteeclnl gB 0
eèadr 63 3
eec[n2 0S 0
pDlath 00 0
intcún Bg 0
sg53t8prF FF 259
bsf STf,lUS,nP0MUlr B'56606050'murf TRISBbcf SIATUS,RP8
mulu 63musf EEeDR_Ufif,call tEG[I_EEPn0fimuf EEDgfn_Ufin,UHurf P0BTB
goto IfllZI0
muf EEntR UAn,il
PassiaffiPorta I
taúio .
scriqiafin ufia IChianat;si uis!:sulla Pr
spo5tiar
qJ.:* = -ltrlr---- 3à Fl P fl 6à 65 s t7 S^TIET FI IT IT 35 FF FT FF Ff ffSfI! FF FI FF FT TF Ff fF FT
IEà FF FÈ FF FF 'F
FF IT F' FiC*I3 FI TF FF fF fF FF FI T5 F'
--zùc,Bkún:Sbt:.tl,lHz :Ed
Finestre preparate per la simulazione
lr** tA q*4 !Étrs Iosb Hid6# !+
Scriuiatir úna {
Chianatisi uisuisulÌa Pr
Ílouf EEADn_Uf,ft, S
muuf EEAllfi
bsf STeruS,fiP6bsf EEcoH-l,BD
bcf STATUS,fiFg
#fffl=;a:i:.1:,,r,'.::'':'' -ltrlt{}SF8 HaR Hex Dec Einarg ^tnrú 0S ! ù0SBCú06
lii i.! :; *'!i1ì95-topti.on_reg FF 255 11 111 i11stituE 18 2q !6fl11886fsr sE É 606S0800porta g0 0 B6ffS08gB
trisa 1F 31 06011111p*ril BS i31) 1tÉài$nfl:f::i !41 È 8$il8$5f3.rc;t: ti i.2í 1S8È-r*BS
ercBil1 ÈS S BA60SB06
Éeadr Bg 3 B6úBBII 1
escún2 65 ! 068008S0pclath S6 0 86!05S6g!:Ì1r.,:: lil I *:i**SgE1ir 6$ 13{ I g*g-i *i1F
tlSFrt 13 i7! 1 *.11 S*1j
---- !e fi e C! 3{ 85 S t7 !8^ltft tl ;f :i S8 :l ii l- i: Vt
33!! i:: ft iF ar i:t F,' rt Fr a
3&a ti FF at: rF if iF íi Ff rIts! rF FF tr ft ir FF ti fF Ff
Ek0n Sin {l'lHz Ed
Finestre dopo aver fermato la simulazione
sf,ffi33Y#ffi&ff#.1*;' Mffif,q#Pf,iffi*itrry#ffi ffirg m&?ill nrnro<<n .li q6pi11r rrr Àall:il PtvLgJJV Ur )!r rrLulc uEllo
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
bsf EEc0Hl,trBEH ; Perness0 dÍ scritturanoulu 0X55 ; Inizio della sequenzanouuf EECoH2 ; obbligatoria dinoqlu 6XÉA ; sicurezzanouuf EEC0H2bsf EEC0H1,I,|R ; 0rdine di scritturaret urn
FIHEEHD
Subroutine e programma per la scrittura della EEPROM dei dati.
Ede fuotwt ldit lebuq lploro lock Windw leb
ÉG-F*=1.Ií".Î.F.1:;t.l'i-. .-'-','r,'.t:.,,,':,,,,, :' =lgjèlEEDîTff,UAR EQU úXOD
IRISB EqU 0l(8óEECoN1 EqU 0X88
EECON2 EQU OXSC
l1 prograalf indir
I'lettiiftonsulr4 63
oouuf EES08_UA[noulu 27nouu,f EEDfiTA_UAR
call SCfiluI EEPR0tl
su di rnllettianùsu di unàChianata
spùstianosul suo rSpostianssul suo rPesseggioPernessolnizío deobbligatos i curezza
0rdíne di
SCRIUI EEPR('I4 núuf EEnDR_UÎR, !,Íìoeuf EEfiDBnouf EEDnTe_UnR,Unúuuf EEDATe
bsf STnIUS,RP0bsf EEC0N1,!,REllnoulr,, 0X55
nouúrf EEC0ll2noulu 6l{AÉ
nouuf EEC0N2
bsf EE[0H1,t,Bretur n
f ili!=l:li-. ::e;r4r:=SFB Hane llPx D8c ginargtnr0 A0 S oBBdnoSS
irì i3 1E f!8iÉt11rption_r?g FF 255 111 111 11
ststus 38 !ó 681 1 1 008fsr ú0 ú 0BB5ù060porta tlo 0 06900880trisa 1F 31 80011111portb 0(} I B00$0rrtlntrisb FF 255 11111111eÉdata 21 3S 6t!l t10111
eecnnl gó ó 0B0Bú11 B
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.
!Bì@r Edìt géus qdbF lmb
I HI Z I 0 bsf srfiTus, BP B
cITf TBISBnoulu 1Fnouuf TFISAbcf Slfilus,RPB
SCELIg btfss P0nTÉ,4goto SCRIUEfiEgoto LEGGEBE
SCRIUERE froulu 93nouuf EEADÉ_UÎBnouf PoBTA, l,ffroquf EEDNIÉ,UAÉcaII SCNIUI_EEFNOilgoto SCELIB
LEGGESE noulu 03Íouuf EEnDR_UÉRcaIl LEGEI_EEFRO}4múuf EEDf,Tn_USR,t,nou$f POBTBqoto SCELTA
LEGGI_EEPSOH nouf EEDNTh_UfiR,14nouuf EEDf,fnh<t qTÉtil( epf
Banco 1
Porta I ugcitaPorta A ingresso
Banco B
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
messo a zero il Watchdog (WDT) si mette
a zero anche il suo prescaler, o divisore di
Íroatonza rhe e rna risorsa utiltzzata dal,,rYvLl
\^/-+-1.!^^ ^^" "i+-"-l -fe UltefiOfmente ilvvd LLI ruu9 Ptrr I rLotuo
tempo di overflow, come avevamo già
visto per il TN/R0. I bit #TO e #PD, situati
nel registro di STATO, prenderanno valore
1. Verificando questi bit all'inizio del pro- Esempio di un programma che controlla il Watchdog
gramma; si potra sapere quale sia stata la
causa dell'ultimo reset,
ts{FrÈi}i {{:s L"ISì$,{*HE*};il {. t$qW*Tll Watchdog e una risorsa propria dei PIC per vigilare
che le istruzioni di un programma siano eseguite in
mndn :donrrato Frrnziona con Un clock interno di|||vuv uu!:,
PARAMETRO PARAMETRO
al sistema, il Program Counter vada a
puntare su un indirizzo di memoria
che non contiene nessuna istruzione.In questo caso il programma smettedi funzionare, però il Watchdog con-
tinuerà ad incrementarsi sino ad arri-
vare a FF e debordare, resettando il
sistema, e assolvendo così alla sua
f unzione. La f igura mostra un esem-
pio nel quale si controlla l'uso del
Watchdog. Quando il programma è
eseguito in modo corretto, il WDT
viene messo a zero all'esecuzionedell'apposita istruzione, altrimenti si
produrrà un reset.
WDT).
"_*J
$*SSq#ssws$
Sch eda dell,e istr uzioni :l'istruzione CLRWDT
MNEMONICO Il
..' l.--l-.Y 9 r..: .
Operozione: concellozionedel Wotchdog
Cicli: 1
Codice OP:Flog:
xI
!I
I
tipo RC, e si incrementa sino ad arrivare al valore FF,
per poi andare ìn overflow e resettare il sistema.
Questo non succede se fra le istruzioni del program-
ma se ne trova qualcuna in grado di cancellare ìl
Watchdog: la clrwdt, con cui il contatore ripartirà da
zero. Puo succedere che a causa del rumore esterno
00 0000 0r r 0 0l 00#TO, #PD
List P=1óFBl.include "P1óF84-IHC"
orq 0xg8goto IHIZI0
org 6xB5
THIZIO ClTf POBTSbsf Slnf[S,ÈP0clrf IRISBnoulu b' 06011 1-ll'mouuf lnlSAbcf sTnTUs,BP0
btfsc P0Rln,B ;festa Io stato di RÍagoto Rno-uala-1 ;RAB uale 1
btfsc PORTn,f ;RÉ6 uele 0' lesta 10 stato di RÉ1
goto Sono_a-1 6nouls b'181fifi4'ncusf p0FlB ;Sono a 60- Esci dalla sequenzagoto cIclo
Sono a lB nouls b'00091111'nouuf PofiTB ;Sono a 18- EsGi dalta sequenzagoto clcl0
;Tlpo di processore;Definizione dei registri interni
;Uector Reqet
;salqa i1 uector di interrupt
;Cancelta I latch di uscita;seleziona il banco I;configure ta porta E cone uscitè
;Configura la Porta fi cúnè ingresso;Sele?iona il banco 0
Caratteristiche dell' istruzrone clrwdt
Scheda detle istruzioni:f istruzione COMF
on quesla rslruzrone sr rea-
lizza il complemento a 'l del
valore di un registro. Questosi fa bit a bit, cioè ogni bit di
valore zero del registro vienecambiato con un uno e ogni bit che
vale uno si cambia con uno zero. ll
risultato di questa operazione si puo
memorizzare ne lo stesso registro dadnvp si nrpndp il v:lo1s iniziale Se il
parametro d ha valore 1, o nel regi-stro di lavoro W se il parametro d ha
valore 0. Inoltre nel caso che l'opera-zione dia come risultato 0, il flag Z
verrà messo a I. Questo significa che
il regLstro, prima dell'operazione,aveva valore FF
:rh :^l ao".; $'TÉ-Yq;!*{{'**::{*l*rl'rr<n di nro<tr ictrr rzinne ò <omnliro
-- -^*^li--+- ^^+.^L-L-^ ^-.^"^ lt^^f ro LUrrPilLoLo PULIcuuc c))cttr tdp-
OPERANDOMNEMONICO DEST'NAZIONE
Roim Eú Qebus Qpliffi lcols {irdw lelp
LISI P=1óF84 ; Definizione del processore
EqU Bg ; oefiîizione di uariabileEflU Bó
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.
.;:;:,;::l
,. a::a:
I ìii.:::
':;'::ì:.:r,iaa
't:ì:, ìl,rì:ì
:1r:i:.:l
l,:,:i!:
..:a.a:.,:.:;j
,: ,.il
.,,liltj
. :aa,
:l:1i
::,:,:î,L,:.
. ìt,ììììt
.:,4.a:.,.:aaaa
:,1,,,.t.,..:1,:;.11
':"::::{*
.r I -:1ì!ì
,.:$':'::'*:.;.:,:.:.al
.. :,:',:.;.:::i::
' ,rì iìì:ì,iill
'I r:ìl
':,i::i::
.r ìì':l':i. ..: ì.li.::,::::,i
:,:.'.',:,1..::!
:t:l:.::i
"Ll',;ll:.1
':,a:,:a!&
':.:.:::"t{t)
3L L&V#K* {#ruSe avete scelto di
lavorare con il
Watchdog, nelle pros-
cimo.rinho imn;roroto-i.'- "v'
come fare. Scriveremo
un primo programma
d'esernpio, molto<omnliro dnrro <i riodo
cnraramenle comefunziona ilWatchdog.Come dichiarato nel-
l'enunciato, realizze-
remo un'azione in
modo ripetitivo, owe-ro un ciclo infinito,
dopo l' inizializzazione
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
questo modo il programma
si resetterà quando andrà
in overflow il Watchdog.
l;l {=
rry2 0001 01só clrf gxó
3 CgsZ SqfF nouls 0xiFb 8093 8985 moesf ft5:,r,r:.:*::gg$l 3ss nouls $rS
,:,:,+..:lgg Smf Kvof 0!.17 900ó 1283 bcf fr3,&(5I C007 S18ó clrf Bxó9 0008 0905 cIcL0 coBf &(5,11
10 00Bq 088ó muqlf t*ó11 000n 2808 goto ClCt0tZ g00S SFFF addlB 9:{ff
,1:
,l
=.:.
:
".:.,:-:i'.i*'."::
-i
Finestre da utrlizzare per la simulazione
$w$ffwwre
\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
Cicli: I
Codice OP: 00 0000 0l l0 001 'l
Ffogs: #IO, #PD
Aeh4 Splil€ lcds Ehdm Help
LISÍ P=16F84 ; 'efinizione
del proeessore
SIAI0 EQU B3 ; Definizione delle variabitiPOFTAB EQU A6BPT EOU S1
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
;;":'; u-, " ì,,i^"t;,;;';"; ;;;;^;"- -" v' "- POSSlamO
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 .
ffiw#*wwww
Appli cazione pratica:I'interrupt arriva dall'esterno
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.
ll programma principale realizza
solo le configurazioni: imposta la
r sÈta08c6c ctBattcù
t55 1tlJ1r-rf24 S961tÉ08! o0ts98!at s6tùa9É0
31 $6$1Jl'rl! sostùtct
255 11 1'ttltt
ststuE f8Í5î 09
gÈ!8sio{&6t|e5ae9l8ls9*ef,ótto8c80aa&0s00ooatù0ttca*t9ù&osúaú009&
Ltsl P=1óF8{ ; oeFlnizlone del proce
EQn 8'r :
FEQUT.
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
úulr b'16a1cat€' ; Attiuazionr d*erf ll{fcol| ; trarite nBtal
i Proqramma di lraltamento della interruzione ; sind al Fross
Z€É0 s{Iu t€ ; Si sposta 10goto C{lt{fltltf
SFB NaR llex Dec 8ifiaru Ghùr -tÉ€ 3: 1 G€AgggSprt s 15 6{àS111-lùStisn_rÈg 1€ 54 *tèè8È45 &ciètus 1à :ú Agft*1€C
6g € &cca$€tga € e€€488È6s€ g a8àaa6€6€à E €ASAAAECaF 259 lltl11:l
ledatè ÈA S EEtntq€Ceeccql Èg g egg$eg8e€eadr Èe € C565C€8C€ecaF? *! 3 CggCg€A€Sclath *g à eSeàCS*€idtcar 9è lqà 16È1AA&€E *3 lqÀ 1g*lggegt{Ère 5g S 8ùSSCgg€
gffi=!:.::1a::-+'i::'lt leturr Èddress:2 66S {lnterrupt}
sr-f,Pl . sb?IFlStir l0 [Pl I 9b rl tPt
E ffi11"Fa---SFR ilam Hex Dec Biîary char:tRrS ll 5l ÉÈ€ì1111pc1 1è îA 9SÈ1 lge€ú$tiàs req 4S 6q 9i888Bge Estatls lll 26 48il Bl 88f5r 6d & BùEEEÈBEportè lF 3t 8851JJ'11trisa 0e I 8BB6ú86Èportb tr2 2 60884fi9t.ì5b FF 255 11'1.î1111eedata Eg I B60tlú68Peconl 68 C 0ù8CS668esadr BA I BqgE!308eecanS B8 ú AÈg6E{BApclath g0 S CgBgS&8oifttcnn 12 18 888198JSs lF 31 88811111tAFr€ *S E È€e$*€SÈ
; Si sposta La zero
; Si sposta uno
Un momento della simulazione eseouita oasso a oasso.
tttttttl t:- ::t :t tt tttttt:tttttttttttl
top related