Sei sulla pagina 1di 162

Programm azione:

principi generali

Per pater uttlizzare molli àppàròLi "intelligenti" e necessario che siano programmòti

ar tnilizzsra :l monlin mnlti<<rma :nn:rar- lln ul


rrnI lrl
linnrr:nnin rholq nro<tn rnmnranrio l-ncì nrr:nÀn
'-v'" '
l9uo99lw Ll 9uLJLv Lvr rrprL. ruL. !v)l 9uol luu
rhi:rrrre " intollinenti" e noro<<:rin nrnnr:m- premiamo il tasto play del video, le istruzioni che sono
--.1^ À
ror rE. rvrvrLr vrLLUrr
|| -^rarati elettronicr di uti_
A^t+t ^,.-^tt oPf state fornite relative a quel tasto specifrco, mettono in
lizzo comune, ad esempio un videoregistra- funzione il motore che trascrna la pellicola, leggono le
trrrp nor rpni<tr:rp l: nn<tr: <orio T\/ nroforii: nformazroni che questa contiene, ecc.
oppure un gioco all'interno del nostro computer, o la Y", .,, d::dpssn diventpremo rla semolici utiliz-
,A' n:rtirp
moltitudine degli apparati rntelligenti che abbiamo --+^"i -l^ll-
4OtUt tuEilo +^-^^l^^i-
LEL|tutuvto, a vrw9ro|iltroLv +^.i rLtrE
-L^.^-li--.^^
rcdil//drr(,
intorno a noi, devono essere dotati di un programma -^^r:--- Ur
oPPilLO4 ^^iil ^^.
Ptrr 9il
-r+.i O ner noi stessi Per orteStO dOb_
^ri OrLr I

per poter eseguire le loro funzioni. Programmare non è biamo strutturare il nostro pensiero e tradurlo in uno
altro che indicare a un orocessore ouello che deve fare dei molti linguaggi di programmazione esistenti. Un lin-

S*#*wwrs
da risolvere; si
' Chiedere chiave di vede che fun-
;-- accesso all'utente.
.Leggere chiave. Aona male e Organigramma

'Girare la chiave. che non dà i

. Se la chiave è giilsta rr:lnri <norrii Stesura del


aprire la porta. programma principale
.Se la chiave non è
però non indica
giusta. .. dove c'è l'erro-
Compìlazìone del
re. ll nostro caso pf0gramma
è aggravato dal
fatto che si trat-
Errore di
ta or un pro- sintassi?
gramma che
deve funzionare #
con un narowa- Simulazione del
pr0gramma
re, e non in un
aÒmn||tér nor
Le diverse fasi per la realizzazione di un programma cui l'errore Enore di
sintassi?
potrebbe non
guaggio di programmazione è un insieme di regole,
simboli e parole speciali per costruire un programma.
dinondorp del
cattrvo f u nzio-
#
Scrittura del
Come passo intermedio bisogna trasformare l'idea in namento del microprocessore
quello che viene chiamato pseudo-codice, che è la rap- programma, ma
presentazione del linguaggio che noi utilizziamo - il da problemi Prova con il sistema
di sviluppo
Linguaggio Naturale - ìn forma strutturata. ll risultato dell'hardware
finale è il programma. controllato.
Anrho <e l'a<no- Problemi
hardware?
Yflffifl4sru#L*#XÉs *g $*&S$: rienza f orn ita
Un programma scritto in pseudo-codice deve servire da J-ll- prdLrLd
udild ^"-+:-- cÀ l-
rd
base per la realizzazione del programma finale, quale migliore alleata
Monlaggio del
sia il linguaggio di programmazione che utilizzeremo. ;^ -^-ì
^,,^-+i Ld)t,
il t vuc)U
Per questo, in questa prima fase del programma, dob- noi drsponiamo
biamo avere un'idea chiara di quello che il programma di strumenti che
Problemi
stesso deve fare, per non generare errori di tipo logico ci facilitano hardware?
o semantico. nrra<tn lrrrnrn
Una volta scelto il linguaggio di programmazione, Nella figura ffi
bisognerà conoscerlo per non commettere errori di tipo sono rappresen-
Montaggio finale
sintattico. La conoscenza del programma è facile, basta +r+i ;
Lq Lr I ^-.-i
,-J-
uc
vo))t
seguire le norme che lo regolano. Dovremo conoscere segurre quando
la struttura del programma nel suo linguaggio, i tipi di un progello, Fs<i nar ._
._-,r-, .- _,
ls raalízzszinna di un progefto
dati che si possono ulilizzare e i loro possibili valori, l'in- come la pro-
sieme di istruzioni, la struttura di controllo, e tutte le grammazione
rnse rhe v I snipnhoromn
ru trt Jvrryr srrrroq<irrampnttr nor lz rnrrat
tq LUt tE(- del nostro microrobot, ha una parte software e una
ta programmazione di Monty. ll nostro linguaggio sarà ^-'+^ h-'!'^'-'^ | - !p<rrizinno di uyttUtru
nnnrrnn di nrro<ti
PdILE lldlUVVdlC. Ld ULJ!r r.rvrrs ut
l'Assembler, e sfateremo il tipico mito che sia uno dei passi verrà fatta nei fascrcoii seguenti. Osserviamo
linguaggi di programmazione piu difficili. attentamente le differenze dei testi all'interno dei ret-
tangoli, e all'interno dei rombi. Le etichette dei dati, la
$?.R*S*Sîí *3 treài*ffi* forma di rappresentazione delle azioni, sono tutti dati
ll primo caso e quello di un programma che funziona essenziali al momento di proqrammare e che meritano
male, però non presenta errori sintattici, ed è difficile ,,^-
u ro ^-^;^-
Pogil
î
rd d ^-r+^
pd r Lc.

$*S$e*es$w€P
:.:iili
ì.:ìi::-:l
Strumenti di lavoro:
i linguaggi di programm azione

La differenza fra il programmare con linguaggi


di dlto livello o con uno dt basso livello, e analoga ad
agg i u sta re u no stru me nto el ettro n rco
cambiando i suoi pezzi o aggiustare i pezzi
che compongono quello strumento.

ome gia abbiamo spiegato nelle pagire pre- linguaggio di alto liveìlo è più vicino al modo di pen-
cedenti, un linguaggto di programmazione è sare delle persone, mentre un linguaggio di basso
rrn insieme,,L v, rcnole simhnli c n:rnlo snprr:li
di ir\Jv,L, livello e piu vicino al tipo di dati che accetta ìl micro-
per la costruzione di un programma, Esistono nr.ìro<qr'ìro Fntr,amhp lo r:teoorie h:nno
,- \/'^+-^^;
,drLov9rtr^
molti linguaggi di programmazione, di svaria- svantaggi.
ti trni con caratteristiche a volte srmili e a volte molto
diverse fra di loro. 1r{fl9{_ffie$:i
I linguaggi di alto livello piu utilizzatr per programmare
ilL;{5*î fít&X:* l; ;: * il: Li"ru* :-r,&{"r*: i microprocessorì, sono il C e il Basic. Entrambi sono lin-
Una delle molte classificazioni che si possono fare guaggi di impiego generale, croe si utilizzano per appli-
con ilinguaggi di programmazione, differenzia la cazioni molto diverse fra loro. Questi lìnguaggi sono
loro similitudine dal codìce che è direttamente nrodotti d: divprse C:sp e orrr màntenendo trna strut-
'l|--',

accettato dal computer, cioe jl "codice macchina". tura fondamentalmente simile, possono presentare
Quindi, si è soliti dividere il settore in linguaggi di alcune differenze, anche se, come qualsiasi linguaggio
alto livello e in linguaggi di basso livello. Anche nel di programmaztone,la ioro efficacia dipende dal modo
lavoro con il PIC seguiremo questa distinzione. Un con cui il programmatore Ii ulilizza.

S***wcisr*
ì-tìtì:tì)r*r: : .:.:r. .:.ì : , .: ,.rr. iiii,rrl
.Ì ::
"-l
)$é
I

,1,,,'.i,$
:t
;. :

. r::iììi
ir:tliij

.::.:ììià!
'',t}i1,
,',:l liÍi:

'..:ì
main ( ) ,ì,:.ì::ii;
'l
{
set_bit (STATUS, RpO ) ;
oPTroN-REG = l; / / Assegna un divisore di L:256 :.::,.1€*

set_tris_b( 0 ); a.::',..,:t

clear_bit ( STATUS, Rp0 ) ; .'ììì:ilt


:ìì:t:::

oulput_porc_b( O ); ...:a:j:at

':.rr-:rìì

enable_ínterrupt ( Cfn ) ; r.ìi::t

enable_interrupt( T0IE ); // Abilita interrupt de1 TMRO 'uruìi::

.ììÈ
::,4

while( 1 ); / / Ciclo infinito a:.:::'atta

r :::ììì
:-,,::t;&

".,a,:,'.tl*
Frammento di un programma scritto in linguaggio C riì
:a,,:.:e

Nella frgura precedente è illustrato un esempio di fram- la "while" danno chiarezza al programma: in que- '-:
:il
mento di programma scritto in linguaggio C per il plC sto esempio è utilizzata per restare in un ciclo sino t. .::::t*
In esso si configura nel banco 1, la Porta B come usci- a che la condizione scritta all'interno delle parente- .l
;
ta, e si assegna un divisore per 256 alla frequenza di si e realizzata. In pratica si converte in un ciclo infi-
lavoro per il suo utilizzo con il timer TN/R0. Si continua nito sino a che un evento non modifichi la condi-
togliendo gli zeri dalla Porta B e si abilita l'rnterrupt zione scritta all'interno delle parentesi. '::
...1
all'attivazione del TMR0. Proseguendo, si entra dentro Se si volessero ripetere diverse istruzioni per il .-,::l::', j
ad un ciclo infinito che verrà forzalo solamente dal tempo in cui resta valrda una determinata condizio- :.:::a:.,i,:7,t
.4,.::::1

TMRO alla fine del suo conteggio. ne, basterebbe inserire queste rstruzioni fra le . .ì:ìùg
r,r;rl:"i$

A prima vista si possono notare alcune caratteri- parentesi. Trattandosi di un pezzo di programma
. :,:,4:&

stiche di questo programma, che sono quelle che non si puo apprezzare la seconda delle caratteristi- ':;is
$
hanno contribuito a renderlo uno dei linguaggi più che fondamentali: nonostante sia collegato al pro- -.r''

utilizzati. Le istruzioni di controllo strutturate. come gramma principale, e quindi s a stato abilitato da
un evento di interrupt, all'interno di questo spezzo- '.':lili
Li:ìr:ì:iili

ne potremmo inserire un altro richiamo ad un ulte-


riore pezzo di programma - anche quest'ultimo sarà l ,::.:::::
:'.:t:i]*
inserito all'interno di parentesi - e sara indipenden-
te dal programma principale, comunicando con
esso solo per lo scambio di parametri e risultati.
Oltre alle rstruzioni standard, il linguaggio C '.:.,;::'*.
.,..:,:,.tt

specifico per il PIC ne dispone di altre, che si pos- i:r,::a:::l


:.a,ar-:

sono considerare delle piccole funzioni di uso fre- . :a:.-t:i:.

quente: come il settaggio da'l a 0 di un registro : :::tr::l.ii

.:::,:a:'Ì.
specifico, o di un bit di un registro, o l'abilitazione . .',.:ìi::ii
.:t::,,itì
,:.:l:l
di un interrupt.
La differenza con iinguaggi come l'Assembler
non sta neila complessità del codice, inteso come :

chiarezza, ma nel minimo numero di funzionr utiliz- .::at i.;.

Vantaggt dell'uso dei ltnguaggi di alto livello


zate per dire quello che si deve fare Altre funzioni

Ss$*wctre-m -t

.;::;:,;,;i;.,1
tropartita, il programma scritto in
Assembler si traduce in tante
posizioni di memoria quante
sono le istruzioni utilizzate, nel
nostro caso nove (CICLO non è
doto
un'istruzione). Nel programma
scritto in C invece, ogni istruzio-

t#
rrumG-

nFffi 'o"@@
ne scritta - quelle dell'esempio
riportato sono sette piu la strut-
tura "while" - si tradurrà in una
-EffiT
m o piu istruzioni macchina (posi-
m
Ere

l5 ooto
o zioni di memoria), a seconda del
compilatore che verrà utilizzato.
colcolore I'oreo
@ Questo perche in Assembler ogni
istruzione si traduce con un solo
codice macchina, al contrarìo dei
linguaggi di alto livello. Possiamo
^,,^.+1 Pa
u))trr vdr tr quc)rd ^rrticolarità
nella figura della pagina seguen-
te, dove la seconda colonna della
finestra del programma (Program
Memory Wrndow) riflette la posi-
zione in cui si trova ognì istruzio-
ne. Benche la programmazione
in Assembler sia piu faticosa per
rhi l: o<onrre il rndiro nonorafrl
Convertire il doto in codice ASCII è ottimrzzato, con un constdere-
vole risparmio di spazio occupato
ll programma principale comunica normalmente con i vari procedrmenti dal programma, cosa molto
per lo scambio di parametri e risultatr. imnnrtanlp considerando le
restrizroni del PIC in quanto a
come la capacità di attendere un evento, facilitano capacità di memoria, che nel caso del PlC16FB4 è solo
l'uIil\zzo, a vantaggio della chiarezza. di 1024 posizioni. In ognì caso i compilatorì C di ultima

$_'essil*4ffi1trffi
CICLO
È il linguaggio denominato di basso 1-- €
UD! STATUS, RPO
lrvello ed e il piu vicrno al compuLer.
movlw a1
Nella figura a lato e illustrato il prece-
mOf,'Wf OPTIOI{_REG
dente programma redatto in
clrf TRISB
Assembler. ll programma scelto e
molto simile sia in un linguaggio che
bcf STATUS, RPO
nell'altro, e non presenta grandi com-
clrf PORTB
plicazioni. Senza dubbio, per chi non 1-^
UDL
r: INTCON, GItr
conosce nessuno der due lìnguaggi,
potrebbe risultare piu con,prensrbrle rl
bsf INTCON, TOItr
linguaggio scritto in C, dato che non
goto C]CLO
necessita della conoscenza dell'archi-
tettura del PIC per: realizzare le lstrr-t-
Frammento di programma tn lrnguaggro Assembler.
zioni, ed è p u intr:itivo. Come con-

Se€th*p*srym
ln Assembler ogni istruzione si traduce come un solo codice macchina

generazione producono un codjce ben ottimizzato. cedimenti, e nelle funzioni proprie dei linguaggi di alto
Come abbiamo detto, una delle caratteristiche che livello.
fanno sì che il linguaggio C sia uno
dei piu ulilizzati, e l'uso delle fun-
zioni. Nella figura a lato si mostrano
alcune funzioni di un compilatore
OUTPUT_HIGH-FOFIT_B
del C per il PlC. La maggior parte OUTPUT-LOLPORT_B
sono funzionì molto specifiche del INPUT PORT-B
-PORT-A
lavoro col PlC, che non si incontra- PIN PORT A INPUT PIN PORT B
no in compilatori di C standard. SET_OPTION
Per rnciso, dato che sono molto DELAY_MS DELAY US
specifici non apportano vantaggi DISABLE INTERRUPT

rispetto all'Assembler, se non per il CLEAR.BIT

fatto che utilizzano espressioni GETCHAR


CHAR |O-BED
molto più chiare.
Dove realmente si nota la poten-
za del C con i microprocessori, e
nella struttura di controllo, nei pro- Alcune funzioni di uno dei tanti compilatori C per il PIC

S.&6*ws#s*
Strumenti di lavoro:
installazione e uso del CD
I CD-ROM che com-
menteremo, è quello
allegato ai primo
f,acrirnln di nrre<t'o-
pera. E formato da
,,-";^ --.+^li^
VdJle Ldl ^ +i
telle e ^. CO[ì
llre5
divorci rnn-pnr rli rl.p ver-
.:n.Ò .lili, tat nol I lavO-
ro con rl nostro microro-
bot. Ora lo ana zzeremo
;^
il | -^,-l^.1^+r-^1,-+^
| rvuu uqLLcvlrc Lv.

Introducendo nel lettore il

CD e selezionandolo, s
tr-^A^ r,,n
dLLeue dile
-lln 5ue n,,r
qudì.Lro car-
telle, e ai quattro files, così
't
come indicato nelia figura in
L
basso ll CD non è autoinstallante Le

A destra il CD allegato al prrmo fascrcolo informazioni che troviamo nel file


''vv"" mi rvr descrivono il modo
lpnn
,f
di nstallazione e il contenuto
"a
-rsl
:fl
_J u
-J ^,,^-+^ .e're, rre
--.+^il^
que5re cd' -h^ sr posso-
'1'aqr la Inco |La ",
annul 1a nn : nriro ann a r r: lr rn n ra on r-
tor dr testo. Gl' altri 3 files, per
ts (E:) ora, non I prenOeremo rn con-
si derazr on e.
oimensione
I t/:
'l Q]:a |La prmd- caileild
- ^"i- --"+^ll- .l - esan"rnare
od ^.
JJ:i
.-. ,i
l -"t e la cartella "installa". Una
volt: ,anprt: s dorir: osocrriro il
I gl:
i file spr,ro exe cos si insraJlera il
I ft.ú
a:!,J.il
prograrrma robot.exe, che ci
1
normot+ori nli vi<r r:lr / t 1.^ +r1
Pg lrlgLLqro vr)uoil4Latct t a-

r:a:::':
ill.:ts -t
1 lLlrr,,
ur

mite ìl PC, r video dimostrativr


| ,aF) 1 +l:'L doLrohnt N,4on-ir p lc diffefentt
:i]:
'i
nrovo dei rn.rorqi di nicroro-
t
bots.
j:

Questa installazione, installa


..,i <nln d: n:rro indi<nonq'hilo 'lol
)vrv Pqr Lc il rurJPcr rJdr,llr url
Contenuto del CD
software, dato che il CD dovrà

$qp$Swwr*
Proseguendo nell'installazione, ci
verrà presentata la videata successiva,
nella quale dovremo decidere l'indi-
rizzo dove installare il software. Si
nrrn l:<ri:ra l'indirizzn niì nrodicnn-
sto in nIipqtn rasn (- \{p6livi\RObOt\
o cambiare indirizzo con un altro che
ci sembri piu adeguato.

fliqiitT"É:LL'q Vgffi##
Nella cartella video troveremo i video
dimostrativi, con prove di lotta e di
ricerca sui differenti tipi di microro-
bots, tra questi anche Monty. Per
vederli non dovremo entrare diretta-
Videata iniziale del Programma di installazione di Robots
m6n+ó
lgl ILE nall:
|| I lEllO r:r+allr
Lql LEIId/ m:
I ru o<onttiro
LJLyuil L iltl
'
programma Robot.exe dalla cartella
nrincinale rhe e oia stato corretta-
montè inct:llatn qp6lranÀn
JLyuEl luv Ii pd))l
nrcci
spiegati precedentemente. Apparirà
la videata di inizro.
: frur
|Lq r rnzinno nnni il +rc+a
di vyr
r4rvr rs ur Ld)LU cÀ ram
)Eil t-
plice, e ci ricorda quelli che sono nor-
malmente utilizzali negli apparecchi
musicali o video. All'inizio si potrà
solo attivare il pulsante superiore, che
ci
-, nermette
Y',,, di sreolie rp il video che si
vuole visualizzare.
Una volta selezionato un video
all'interno del menù, bisognerà aprir-
ScelLa della direclory di installazione
lo, questa operazione attiverà anche

essere nresente npl lettore al momen-


to dell'esecuzione dei video; in que-
sto modo i video non verranno copia-
îi srrl comnrrter nermettendoci
Y', di
risparmiare spazio.
Orresto nrooramma di visualizza-
zinne dai vidon ò ntrreolsposto per
lavorare con Windows 98. .:.'::.21
:l::.:E

Quando lo eseguiremo apparirà


:,,,ta.t
,:,,t:,,,:::

la schermata iniziale del program- 'at'a,.'::a

ma. .:ì
Se non si stanno eseguendo altri
programmi, si clicchera sul pulsante
"accetta", o al contrario si dovrà
uscrre dall'instarlazione e rientrare
dopo che si saranno chiusi gli altri
programmi. Schermata iniziale del video dimostrativo di Robots.

Sel*Sse*eecr*c
fl e$qYH *_$_e $:,$q#ffi ffi &ffi w g

Questa cartella contiene tre program-


mi esempio. che in seguito verranno
caricati sul nostro robot Monty per
fargli eseguire diverse operazioni.
Queste operazioni, sono quelle tipi-
che per iniziare la programmazione di
Robots: come seguire una traiettoria,
evitare degli ostacoli o percorrere un
determinato tracciato, e servono da
r.--^
uc)tr ^^- r- .^-r'---zione di altre
PEr to IcorLLo2
applicazioni molto più complesse.
La metodologia di esecuzione per
la programmazione del robot, sarà
tema dì studio in un fascicolo do
prossima pubblicazione.

fr&ffiYfrts_e ffirL&*$
Quest'ultima cartella contiene un
solo programma eseguibile per l'in-
Scelta del video da visualizzare
stallazione di un'applicazione, che
porta il medesimo nome della car-
gli altri tre tasti. Partendo dall'alto verso il basso le tella: MPLAB. In realtà è formato da vari programmi,
icone indicano la messa in marcia, la pausa, la nuova integrati in uno solo, che formano quello che viene
attivazione, e lo stop definitivo. La videata centrale sara comunemente chiamato "ambiente di sviluooo".
quella che ci mostra il video prescelto. Questo programma è indispensabile per le applica-
Per uscire dal programma divisualizzazione, bisognerà zioni con il PIC e dovrà essere studiato in modo la
cliccare sopra la parola Robots nell'an-
golo in aìto a sinistra del monitor
Se ri fossero dei nroblemi con la
visualizzazione dei video, si dovrà rein-
stallare Windows Media Player, che è
il <nftrnr:ro rho ri nérmotto rlro<to
visualizzazioni, lo faremo eseguendo il
programma mpfull.exe, che si trova
nella cartella "installa". Alla fine del-
l'installazione, verrà attivata la proce-
dura di connessione alla pagina web
di Windows Media Player, che si puo
canceilare senza nessun pro0rema,
perché non provoca nessun errore di
installazione. Inoltre, se il software di
accesso a Internet non fosse già ìnstal-
lato sul PC, si attiverà una finestra in
cui ci verrà chiesto se vogliamo instal-
lare questo tipo di software; a questo
punto sarà quindi necessaria un'altra
Esempio di visualizzazione di un video.
cancellazione.

Sry#ee*ce$rye
Le informazioni ci appariranno,
LUrtc |ltu)Ltd^ I-
td r:^ r:
il9ul-, dnnn :vor
aperto il fiie PDF corrispondente. Gli
archivi in formato PDF si leggono con
h{!: /llw.micrùchip coell0l1ítlplì{e/piwimlì'derhm
il programma Adobe Acrobat Reader
3.0 o superiore. Nel caso non lo
' avessimo sr puo scaricare dal sito di
li*Gf&tu#* , F1
, Adobe. Queste nformazioni posso-
no essere lette direttamente a video,
J fúicrochis la{ebsite Seardr optiore 4
' J Literature Text Search S oppure stampate, come qualsiasi file
J Microchip Producl Linm
É Plcmicrots DeviEs
di lesto Nella nanina sinistra del
video troviamo un piccolo indice che
About PlCmicro6 Devim
Microchip is a leaditr{ supplier ofB-bil micfùrontr0llers, wiìh 0ne ofthe
ri
L normotte
pErrrrELLc di
ur cnnct:rri
JvvJLqtLt nalla
itcilc r,:rio
vqttE
brcadesl produci 0feinqs Products range fromSp,[, 1? bii instruction
mrd to 66-pin, 16-bit instructi0n word deîices. Fa$t operation, lDw powÈf sezioni del documento in modo
and IDw qsst c0mbinÈ 1o make lhe hlicrùchip PlCmiEro familv one oflhe
mosl popular rrroducl lines n ìhe world
comodo e raprdo.
RefÈfeilce Manqals :
Oltro
vrLrL :iur mirrnnrnro<.nri
r.il!rvprvLLr)ul l, l\,4irrnrhin
lvlrLluLl lll-/
Fùllow ihls link ts dotrnload the latest teference msnuals. lhe manuals !

reliew architeÈl!re and peripiìeral múdules, bul does not cover thÈ sFecillcs fabbnca e commercializza anche altri
oi each CMúS device.
Plf,micro lltlClt Parametric Search
dispositivi:'nemorie, convertitori, kit
Quickly narrow lour search thf pi.mìcrù mictoÈontrollers wilh 0ut nÈ!v Ai .i.'
ur ,,1
)rLUrczlo, rmnli{irrtnri
orrPililLoruI nnorrzin-
uvctd/tu-
'r^
nali eccetera. Anche le informazioni
Come ottenere la ptù completa tnformazione sui PIC rol:+ir.,c : nrrccti rnmngpgp{i S trova-
nn c, tl <itn rnreh
vvLU e nn<<nnn
L PvJJvrtu accara liha
E))EtE tuc-
sua installazione sia per il suo ulilizzo. MPLAB e f or- rî"_^^+^ -^^-,,1+-+^
tot I tct tLc LUI t)utLd Lc
nito direttamente da N/icrochip, che è la Casa pro- Nelle prossime pagine utilizzeremo questo CD per
drrttrire dei mirrnnrocessori PlC. ll software lo tro- installare sul nostro computer gli strumenti software
viamo. solamente sul CD, però se si accede alla che ci fornìsce Microchip per il iavoro con i micropro-
pa g i n a we b http ://www. m icroch i p. com/1 0 /lit/ pline/ cessori Plc
picmicro/index.htm si otterranno
tutte le informazioni aggiornate
riferite ai PIC e ai prodotti ad essi
relativi. I file saranno sia in formato
PDF che in forma compressa ZlP, lfffiiliÉs/1 dftx/dalasirietl30430c

oppure come file di testo.


Trovererno inoltre diverse utility per d 1 0 General Descrpfon

lavorare con i microprocessori. =?


iai.'= ? 0 Plc l 6FBX DeYire vari
ts''B Owfries
Le informazioni piu complete
3.0 Architectural
i!''A 4.0 lìfemory orqaiizalion

riguardo il PIC'l 6F84, protagonista c'.ffi f .t uo Rorts


É-g 6.0 Timeú lvodule and T
IS-pin FlashlEf?R{}\! &Bit HiÈrocorlrùllem
della nostra onera si trovano nella *-$ t.o oata eeeRou tr,temo
EB 8.0 Epecial Features oft kbld*din6btuSH:
sezione "PlCmicro MCUs" di questa EE 9.0 Instruclion Set Summ m.*c
É-'€ I 0.0 Developmenl slpp ..*d:--q"b-*.
schermata. Ei-A 1 1.0 Etectricat charaitel . EEÉJdÈtsrryÀ€:,Àah
*-qi
*-r-q
.:D-r!
i3:O*r-\.,
,prc:6F5x ft:6LCR*l
Da qui in poi troveremo i PIC clas- E-A 12 0 Electrical Charaîlel i--q! 1* rpÈ.-
Hbi F*ffi@ f,ÉC SU Fsl!# )-=- Èa . E*,-,
@ t.o oc aec cnr -q-
-iȀq: i :B_!
sificati nelle diverse famiglie, e potre- E €l40Packaqinqh q-€Er-q- :jEr+ia
,.8-r..'
ffi tnoer
mo selezionare le informazioni che ci A 0n-Line 3!FFpol

interessano a partire dal PIC'16X8X, ;g Header Hesp0nsP

H Plcl 6F8X PrrrJuct ldE

che ci porterà nella pagina dove tro- g Worldwide gales and

veremo il file che ci serve. Navigando .1nb[se**ÈE


. Èrt*e*sfi
. !@tq5È&lrpÉÈffnnfr]6Ét
ó{ih#lùd;*#rtur
all'inîerno del sito notremo trovare
tutte le informazioni di cui avremo
Dati tecnici del PlCl6FB4 in formato PDF.
bisogno.

Sw$$wwrys
Programm azione:
gli organigrammi
e persone nanno ta neces-
sità di esprimere il
loro CODICE ISTRUZIONE
pensiero sotto forma di co- (letterale)
mrrnirazione rnn nli altri
Alcuni lo fanno attraverso
la pittura, altri attraverso la musica, la
t/
MEMORIA
scultura, la scrittura e il ballo. Gli or- DEI DATI

ffi
ganigrammi sono la forma di espres-
ri :irrt: r nlrcmrrn
,/
<inno rho
rrvr rL !r rL nirr
Viu Lr uru LO O plO)llldltr |l'i,-
inr rrtrr++r
Uecì dsLrdttd Ul 'Un '^ progfamma, In
'l; ^.^ Uîa
serie di decrsioni e azioni che vengo-
no riprodotte in forma logica e ordi- Controllo
nata. Così come nell'arte, esistono
molti modi di esprimere un'idea me-
diante un organigramma, è compito
dell'analista, cioe colui che compone
t/
8--. Segnalatore
l'organigramma, seguire una serie di
"norme d'uso" per far sì che cio che
' <i rir rnlo oqnrimoro rienn: intornroi:in
da tutti nello stesso modo
Considerazioni al momento di costruire un oroanioramma

f&etrtrffi*5ilfltTÀf.:*N*il
*:rfl,8\Tf?,'sj-i'4 *g tf tÍ rnmnloc<è rarno
-_.,,tr,___.- ,.-,,,_ "C l':ra: ut
alrnl:ro
rdtcd
*_,,urdrE r'li rrna ilgutd ..^l+-
uild Íia".^ :)LctLd
dall'utiìizzatore, e mostrarla nel video insieme ala sua
Un organigramma e formato da rettangoli e rombi che rannfesentazinnp " In nro<t^ .2<^ nrr^ óSsefe ne-
si uniscono tra di loro con le frecce. I rettangoli rappre- cessario un secondo organigramma, per realizzare me-
sentano azioni che vengono esegulte nel programma. glio le azioni. I rombi contengono domande che ven-
Possono essere semplici, come visualizzare un dato, o gono poste in base ai dati variabili all'interno del pro-
gramma: sensori che forniscono un
dato al sstema, opzioni dell'utilizza-
tore scelte attraverso interruttori, ta-
All'interno si descrivono le azioni
stiera, eccetera. A seconda della ri-
da eseguire nel programma
sposta a una specifica domanda, bi-
sognera prendere una decisione per
Dentro si inseriscono le domande l'azione successiva, Le frecce indicano
ROMBO per scegliere fra due possibilità
l'ordjne con cui sr devono eseguire le
azioni e le domande.
Indicano I'ordine con cui
FRECCE si devono realizzare le azioni {,e*&-í?9.ffi3:tru{94fl #fl*i-?
{}s*efdi,*&&i4fi;
Dobbiamo tenere conto che il lavoro
Sinboli di rappresentazione di un organigramma
con i mrcronrocessori Der la soluzione

S*Skesr*
dei proolemi e composto da varie fasi, che riguardano
<,.: ru
J.u l: SOftUlare -i-
e rvrrvvurL
n:11
purLL )lo ^,,^ll- t--",.J,^,-"^
9uEllo lloluvvolg. NOfmal_ Chiedere Chiedere
operando I operando 2
mente quando si realizza un progetto, soprattutto se
si lavora in un'equipe di sv luppo, la oersona che rea-
lizzal'analisi del sistema, non e la stessa che più tardi
stenderà il programma, né quella che veriftchera le
soluzroni, o ,:i,:'#ìîà +*tr
Chiedere
di nuovo operandi
{-";
tQta t^
tE ^"^,,^
,, vrwvE
s
, di funziona- a
z
lnizializzazione: mento. Così
Variabili di ingresso ln nrn:ni-
c Variabili di uscita
g Regístri gramma si
{
B
n
|.uv
rn
r r rtilizz: ro
I
Chiedere
in molte di Mostrare risultato
operando I ^,,^-+^ {^.i
9UE)Ls 1O)r, E
in nnnrrn: di
^--^ dvtd
E))E
l^il^
-,,"\ uc|c
Operando
ffi intfodotto? nÒrmo cnerifi-
Chiedere
dato C
E corretto?
Chiedffi
dato A
Togliere
salutg

che, comun-
^,^.^-^.^-l ''r'' -
Chiederé
l'interno di re- dato B
Chiedere gole base. Noi
operando 2
utilrzzeremo Dare

solo organr-
risultato

riÉ
Operando grammi che si
introdotto?
riferiscono alla
rî^^r^-^^+a arganigramma di un enuncrato,
rdvprc)Errc-
realizzato tn forma corretta e non corretta
zrone della
. .:,:.

struttura di un .:::$li
programma, .ll^ 'CLC))'Ld À^ll.
f-j|U' dlic -nra--,t.
^i' Uclld 61666:mm,azinno
Pr 6nl pl-
Lv, Aa+ar-
,l!, uqLqr-
l::ìa::!
: .:.,a:a,t:

.ra
^..J r^ ttELc))d-
fLl ^^-^.-^ m nata dal tipo d istruzioni, che al trpo di organigram-
rin rho nrrosti ma n se. Quando qua cuno disegna il suo organigram- r.:r:a
t
iI
siano molto ma ha bene in mente la sequenza esatta che il pro- . :.:,.),ta:a
::.::.
nrari<i nerrho gramra dovra eseguire, le allernative possib'li,re do- a.::a:,
i
r rhi nlr r t:rdr mande importanti eccetera, quindi si tende a dare per
i
sarà incaricato scontato il verso delle frecce, e a non disegnarle cor-
Meno cose si lasciano alla lrbera d Ìrealtzzare rettamente. Però bisogna pensare che chi dovrà tra-
interpretazione, meglto è. orrol nrnnr:m-
"Y'-' ',
durre la "nostra" idea, si baserà unicamente sul dise-
ma, non abbìa gno, e meno dali lasce"e.no alla libera interpretazione,
difficoltà al momento di tradurre in istruzioni rl pen- il-,^li^,^ >dtd |rr5urLdL().
r9ilure --"- ",-,,l+-+.
srero di un altro. Ecco alcune considerazioni impor- lr rertango o a, t\i/ialtzzaziore dei registrr e defini-
tanti al momento di costruire un organigramma. zioni delle variabili servira da promemor a al momento
Fissare un preciso punto d'intzio, è un buon modo di mettere in pratica la stesura del programma.
per non dinrentcare nulla, inoltre e molto difficile, so- Senrrcndo nresttr rons Cerazioni abbiamo realizza-
prattutto neì programmi che si dividono in piu alterna- to un organigramma che rappresenta ra richiesta dei
trve, term,nare con Ln urrco pJt^Io. Ouesto si ottiene dati per l'esecuzione dt u'a so'nn-a, e la presentazione
quando alla fine diognialternativa, si arnva ad un pun- del 'isultato. Nelle frgure in alto, vediamo ;r esempio
to comune denominato come Fine. di come nor si deve rappresentare rl medesino pro-
L'uso di alternative con due uniche scelte, risponde gramrna.

Sqe#**eswff*
Appti cazione pratica:
it pnmo programma
nche se rimane ancora molta teoria da i$- #i€]{il# i;i i"Í-è*#gefg*Fitffi ffi&Tg
vodoro in nrr:ntn : <tfuttufa e UtiliZZO del Per noter
I L'l.JvLrl
rnmnito il PIC h,a al suo inter-
realizzare il srrn
.-,, Jn pflmo programma,
Dlî rnmtnrr:m^ ,- a^n I
no la struttura mostrata nella figura seguente. Nella
con il quale ci addentreremo a poco a poco memoria dei dati a partire dall'indirizzo esadecìmale OC
nella programmazione e nel linguaggio possiamo immagazzinare i dati che ci interessano, per
---^-t-r^"
o))ct IutEt -h^ ^^^ q^ LUJI
- lt tE ttutl
.rìmnlir:tn
.n<t Lvt ttPilloLv rnmo
Lvt ttE tutti cre_ lavorare con essi come meglio ci conviene.
dono -, e più concretamente nell'assembler dei PlC. La ALU (Unita Aritmetico Logica) e incaricata di rea-
Cominceremo muovendo dati da un posto ad un altro. lizzare le onerazioni aritmeîiche e looiche e all'interno
Leggiamo con attenzione l'enunciato dell'esercizio. di queste, le operazionr di movimento che sono quelle
Nel grafico che accompagna l'enunciato, irettan- che ci interessano. W è un regìstro chiamato di lavoro
golr sono I perche interviene come appoggio alla memoria nella
reg istri entro i maggior parte delle operazionì che interessano la ALU.
Abbiamo tre posizioni che nrr:li o<onrrire ì
Quando un'operazione aritmetico-logica ufilizza
chiameremo DATO1, movimenti dei due operandi, uno di quest è sempre il registro W, l'al-
DATO2, DATO3.
dati, le frecce trn nro essere sia rrn reoistro della memoria dei dati
ln DATOI si vuole
r:nnro<ont2nn sia un valore letterale dato insieme al codice dell'istru-
immagazzinare il valore
esadecimale 03, il rrorcn di nrro- zione.
e in DATO3 il valore che sti movimenti; La discriminazìone tra i due è fatta grazie ad un mul-
abbiamo in DATO2. idatì all'inter- tiplexor (MPX) la cui linea di controllo avrà un vaiore o
no appaiono l'altro a seconda dell'istruzione che sta eseguendo in
nol nn<tn rho quel momento. ll risultato dell'operazione puo arrivare
avranno dopo al reqistro W o alla memoria deì dati. ll numero B che

LETTERALE

8-.. t/
ffi 8:-
ffi t/
MEMORIA
DEI DATI

CONTROLLO
Enunciato del programma da realizzare e
la sua rappresentaztone grafica.

l'esecuzione del programma, indi-


--+^ dllLllc
Lc|tu ^^-l-.^,l-ll-udllc ^,,^+.
I,Jullld ^J^ll^ {"^-
ucllc llcL-
ce. ll valore 03 esadecimale è un
valore letterale e la X rappresenta
qualsiasi valore, visto che non
conosciamo il valore iniziale del
Percorso che seguono i dati quando si esegue un'btru1one
registro DATO2.

Sw#sxs*rsxss*
l

,:.'la
:'a:t:..:a
.::,a:aL:,..:

::,..;ti
::.:74
l'irl:l:::
: rlr:1.ì

zioni, la parte sinistra . l::.:


rr:,r:ì
a movt tvt-y9-ve
if yatore
letterale k
1l
resi$ro ditavoro,W del quadro è quella
che ci dice i tipo di
a
T--_o-..v.,y Muove il valore contenuto in W al registro f istruzione che si sta
movf f, Muove_il valore contenuto in f alla destinazione d, eseguendo, quella che
che può essere il medesimo viene dopo e gli ope-
registro f (d=l) o registro di lavoro W (d=0)
randi che intervengo-
nn in nrro<t: nnor:zin-
ne; generaimente si
Tavola con le possibili istruzionr
di movimento del PlCl 6F84. LÉTTERALE

MEMORIA
appare nel grafico ha un suo signif i- ,DEI:,D.ATI
cato: indica che tutti idati con i

quali lavora il PIC 16F84 sono da B MOVIMENTO


DI UN VALORE
bit, sarebbe a dire che sia i registri LETTERALE
_oB
che i dati con quali opera la ALU, oc AW
sia i risultati che genera, inclusr i dati
che puo contenere il registro di lavo-
ro W, sono a B bit.
Allo stesso modo, se al posto di
un B appare un '1 , o qualunque altro
numero, significa che il dato che LETTERALE
passa per quella linea, e composto
da quel numero di bit. La ALU, rea-
lizzando alcune operazioni, oltre ad
un risultato, fornisce anche una MOVIMENTO
DI UN DATO
segnalazione, di cui parleremo in QUALUNQUE
seg u ito. AW

gsYffi#x5*F,{t
*3 N#Vs$$ilNY*
Nel PIC esistono tre istruzioni per
muovere i dati. Tutte cominciano
nAr mn\/ e rnntonnnnO a COntinUa-
LETTERALE
zione altre lettpre ner indicare da
dove a dove si muovono i dati. Così
MEMORIA

:ffi;
si puo muovere un valore letterale al DEI DATI
registro di lavoro W, o muovere un
valore dal registro di lavoro ad un MOVIMENTO
DI UN DATO
registro della memoria dei dati o DAW
CONTROLLO _o3 AD UN ALTRO
viceversa, muovere un valore dal oc REGISTRO ì

registro della memoria al registro di


lavoro W, o da W a se stesso.
Le tre istruzioni che appaiono
nella figura saranno trattate in una
scheda individuale più avanti, pero
Percorso dei dati, con drfferenti istruzioni in esecuzione
vi anticipiamo che per tutte le istru-

$wSsxwwww
LETTERALE

,/

ffi'/ t/
MEMORIA
DEI DATI

OB
_oc
_oD
OE
SEGNALAZIONE
t/

Blocco di elaborazione dati dopo aver eseguito il programma

rappresenta sempre con una lettera legata al tipo di $}W*S K&914 &4& &SSfr W &$
g-fi ffi

istruzione. ll programma assembler risultante è illustrato nella


Possiamoì |v seouire
Jg:jv|| il f lrrsso nercorso dai dati nella pagina seguente. nella prima linea con la direttiva LlSl,
figura della pagina precedente. La prima rappresenta il si indica il tipo di PIC che sì vuole ulilizzare, nel nostro
movimento di un valore letterale a un registro, che e la caso il 16F84. Nel caso in cui volessimo utilizzarne un
parte del nostro compito nell'enunciato numero 'l , altro, cambieremo il parametro che segue P=. È obbli-
muovere un valore letterale a W. Per portarlo poi da W gatorio usare questa direttiva, perche tutti i nostri pro-
al registro DATO1, dobbiamo seguire il cammino grammi cominceranno neìla medesima forma
segnato dalla terza figura. Nella seconda parte dell'e- Nelle linee 2,3 e 4 si usa la direttiva EQU per defi-
nunciato del programma dobbiamo muovere un dato nire le variabili. Nell'esercizio si chiede di muovere dati
da un registro ad un altro. nelle differenti posizioni di memoria, senza specificare
Anche se non esiste alcuna istruzione per muovere quali, la prima posizione a disposizione dell'utilizzalore
un dato all'interno dei registri, questo si puo fare con è la posizione OC. Per questo si hanno codici a tre posi-
la combinazione di due istruzioni: muovendo prima un zioni consecutive, a partire da 0C, al posto di lavorare
dato da un registro qualunque a W e dopo da W al direttamente con gli tndiizzi, la direttiva EQU ci per-
secondo registro. Questo viene illustrato nella seconda mette di dar loro un nome per far sì che l'uso sia più
e terza figura. Dobbiamo considerare che il registro dì sig icativo.
n if

lavoro W è l'unico che non fa parte della memoria dei La lrnea 5 è di nuovo un'istruzione, la ORG. Questa
dati, per cui non viene trattato come gli altri, e per uti- direttiva dice all'assembler che l'istruzione che seguirà,
lizzarlo bisogna fare riferimento ad esso tramite il (nel nostro caso la movlw 03) è messa nella posizione
nome dell'istruzione. di memoria che è indicata dal oarametro (nel nostro

Sw$*swws"m
o8

f l'enunciato. Per .nuovere I

dato contenuto in DATO2 al


I LIST P='16F84
registro DATO3 si usa come
2 DATO 1 EQU 0c regrstro intermedio W (rstru-
3 DATO 2 EQU OD zronr B e 9).
4 DATO 3 EOU OE
Nella linea 10 si termina il
5 ORG 0 programna con l'islruzrone
6 movlw 03 END.
7 movwf DATO 1 Questa istruzione e sern-
8 movf DATO 2.0
I movwf DATO 3 pre obbligatoria
Una volta eseguito il pro-
10 END ; Fine del programma gramma ii blocco di eiabora-
zione dati del PIC restera
come segue, tenendo conto
Programma assembler dell'enunctato proposto della posi,,ione d, re'noria
che gl abbiarno asseg^ato

caso 0). Questa istruzione, inoltre, e sempre obbligato- ?:1"!1.,1:,1:1r: a: I :,: r,i :l l lri:lii:
ria, dato che e la prima istruzione del programma (fino 1.i lt flti.: f', rl :.i ; rÌ :::i,r:,r
aila movlw non sono istruzioni) deve essere nella posi- N'4olti lettor s staranno chredendo perche alcune cose
zione 0 delìa memoria di programma, dato che e lt che sono sul margine sinistro e altre sono tabulate, se i

viene ndir zzalo il puntatore al reset del PlC. cambi tra maruscole e minuscole hanno significato
Comincia così ii programma tn sé. Nella linea 6, si eccetera. Ecco qui delle norme, alcune obbligatorie,
muove jl valore letterale 03 a W per proseguire col altre solo come raccomandazioni, da seguire al
va ore al regrsrr-o DATO I , cosr come abbiamo derro re,- momento dì scrivere un programma per tl PIC

r Le etichette e i nomi divariabili {LIST, DAfOi) di solito si scrivono in maiuscolo. Non succede niente
se vengono scritte in minuscolo, però così si distinguono meglio dalle istruzioni. Dobbiamo ricordarci
di scrivere le etichette in forma sempre uguale, dato che lnassembler è sensibile a maiuscole e
minuscole.

' I nomi (mnemonici) delle istruzioni si scrivono in minuscolo. Non accade nulla nello scriverle in
maiuscolo, però si stanca di più la vista e sifa più fatica a leggerli.

' I programmi devono essere tabulati e ben allineati per vedere rapidamente la struttura del programma
stesso' Le uniche cose che si scrivono nel margine sinistro sono le definizioni delle variabili {DATOI,
EQU, OC) e le etichette (che vedremo in seguito). Aiutano nella presentazione di questa struttura gli
spazi bianchi che si lasciano tra le parti del programma.

' L'utilizzo di commenti per spiegare le istruzioni o parte di queste, aiuta nell'elaborazione e nella
successiva modifiea o riutilizzazione di un programma. Per questo si utilizza il punto e virgola (;) e in
seguito il commento che si intende inserire {; Fine del programma).

Norme dl scrittura del programma rn assembler per il PIC

Sap$&rrmr'qr
Schede dette istruzioni:
concetti generali
oco a poco vi mostreremo
le differenti istruzioni che wf f,d *addwf
formano il repertorro del
PIC 16F84. Per questo e
necessdilo Utdilre
^^-^--^",^-l^i-":"^^ prlma
una serie di termini, che saranno MNEMONICO coDrcE oP
DELL'ISTRUZIONE
quelli che utilizzeremo d'ora in poi
nol rnr<n Àoll'nnor:
vvLru.

Esempio di alcuni dei termini spiegati

Mnemonico:
è il nome dell'istruzione che noi useremo per ordinare al microcontroller cosa deve fare. Dobbiamo scriverio tale quale
senza cambiarlo.
Parametri:
operandi che necessita l'istruzione per essere eseguita. Per entrare nei dettagli di un'istruzione si specificano i
parametri che essa ammette che dovranno essere poi sostituiti da valori reali.
Parametro f: rappresenta un registro della memoria dei dati, operando originato da un'istruzione.
Parametro d: rappresenta un registro, operando destinatario di un'operazione, con due possibili valori.
Se si sostìtuisce con uno 0 significa che il registro di destinazione è il registro di lavoro W o accumulatore e se è
sostituito da un 1 significa che è il medesimo operando originato dall'istruzione.
Parametro b: rappresenta un valore (da 0 a 7) di un registro.
Parametro k rappresenta un valore letterale, sarebbe a dire, un valore riferito al mnemonico dell'istruzione.
Registro di lavoro o àccumslatore W:
registro speciale che non fa parte della memoria dei dati, e che si utilizza nella maggior pade delle operazioni aritmetico-
logiche.
Giclo di istruzione:
è il tempo base che impiega un'istruzione ad essere eseguita. Per il PlC16F84, funzionante a4MHz, questo ciclo vale 1

microsecondo (prs).
Unità Aritmètíco-Logical
è incaricata di realizzare Ie operazioni aritmetiche e logiche del PlC.
Blocco di elaborazione dati:
insieme dei registri che eseguono le istruzioni.
Flage:
bits contenuti in determinati registri che servono come segnalatori di eventi nell'esecuzione delle operazioni.
Codice OP:
traduzione di un'istruzione realizzala dall'assembler, perché possa essere compresa dal PlC, che non lavora con codici
mnemonici, ma con 1 e 0. La longitudine dei codici OP in un PlC16F84 è di 14 bits"

Termini utilizzati parlando di istruzioni

$*#*xwmry*
a

Schede dette istr uzioni:


l'istruzione movlw
'isl.-rzione "mov" e tiptca ,d']-ffij

ir îutîi i nrocessorr dato


che e sempre necessario MNEMONICO OPERANDO OPERANDO I
I

FONTE DESTINAZIONE
movimento di dat da un
posto ad un a rro, siano
o-esti de risultaLi, valori f ra registri o movlw k
vaiori immediati
Consta dr due operandi, dove il
drtn LUrrrcrruLU
uorw rnnionrrin nol nrimn
rrqr o lrzcfar't.
Pril rlv q Lt o)tqtt_
OPERAZIONE: Movimento del valore letterale k
to, o soostato al secondo. Con que- al registro di lavoro W
sta istruzione si realizza una copra der CICLI: 1
dati, poiche non sr cancella il dato
orig inale. GODICE OP: 1 1 00xx kkkkk kkkk
Ci sono tre tipi di istruzioni FLAGS: Nessuno
" mov", le quali si differenziaro rei
loro operandi di orrgine e deslinaz o-
ne Nel caso della movlw, l'origine è !*,**'-",****,.*"-
un val'ore letrerale e la destinazione e Ca ratte ri stiche del I' i struzr o ne movl w.
il rpniqtrn di l:rinrn \A/

[5fr i4ilt il*# t'951",{{"3ríq:$il v,sto che la programmaz one n assembler e pi;'acile dr
i**vì..it, nrrel rhp :nnàre C)r: r,pdrpmn nrrplln rho succede in
Questa istruzione è stata ulilizzafa precedentemente nra<tn o<omnin n:c<n
Y---- a passo.
nella realizzazione di un programma, dove abbtamo Si n zia mrove^do il valore letterale 5 nel regi5tpe li
avo.o W e si nroseorre muovendo il valo-
re letterale 3 al medesimo registro W.
: {inr'r:
|LO rr9UrO O: l:+n r:q66p(ont:
rqLVrOFr-.-,- il y:lnro
rhe rssrrme \A/ dono l'esecuzione
valore iniziale xxxxxxxx nnn rn: dollo i<trr rzinn
di

All' nizio il valore di W sara indeter-


minato, e quindi si rappresenta median-
te "x". Dopo la prima istruzione avremo
movlw 5 00000 1 0 I caricato in W il valore 5, il cui codice
h.nalo si r:nnrpsent: con "'1 0'l " Dato
che i registri del PIC hanno una dimen-
sione di B unità (bits), le celle non diret-
movlw 3: 000000 1
J
+16^n+^
.dilìerLe '^+^.^--^+^
InreressdLe, -.50no messe a zero,
iniziando da sinistra. Dopo la seconda
istruzione il valore di W varia, cancellan-
dn il nrimn v:lorp o nassando ad essere
Valore di W all'interno di ogni isLr,tzione movlw.
"0000001 1 "

$sa*S$qryqsre*
Strumenti di lavoro:
I'ambiente MPLAB
'MPLAB è un ambiente dr
sviluppo integrato per il
lavoro con la famiglia
PlC16/17 di Microch p.
Fsspre inteorato sionifica
che dal suo interno si puo editare un
programma, compilarlo, tradurlo in
linguaggio per il microcontroller,
simulare il suo funzionamento, emu-
larlo su un hardware, che abbia le
funzio'ti del sistema reale, e anche
scriverlo rel microcontroller, anche se
nar flrro<to dr.a rrltimo nnc<ihrlit: é
necessario disoorre dr t-,n hardware
-r^^, -+^ urLrE
,
duf9uotv, -ll,-^îliCaZiOne.
^r+"^ oil oPP

gr'1is?&g_il,&at*ru # #g &4 r*-effi


f ambiente MPLAB si trova in una car-
tella con lo stesso nome nel CD di

Finestra di inizio dell'installazione di


MPLAB.

Robots, che vi abbiamo fornito. Per


E)CVUil rira
o<onr q l'in<r:ll:zinnp rrraÀaramn
I r rJLO ro-rVr rq d( l -uclcl l lu d:

questa cartella, dove troveremo un


file che dovremo eseorlire.
F:rondn
r ulur ruv n1a<tn
VULJLv
qj
rr 2nrir:
oPl llo 'n: fina-
,ul lo
lll lE-
(tr: .nmo nrroll: doll: finttre 16,o ei
comunichera che stiamo per procede-
re all'installazione di N/PLAB.
Accettando (Next) apparirà una
<.ornnd,a finecfr: r'îor '-^^tt^'^ ^ '-tl
)LCVrlClC \-'luOll
componenti vogliamo rnstallare.
I rnmnonenti che selezioneremo
corispondono ai programr.r,, ai files e
alle loro funzroni relative che utilizze-
remo:
MPLAB IDE Files: sono i frles
Finestra di selezione dei componenti da installare
relatrvi all'ambiente di sviluppo in

Sep##wwr*
sé, a cui si fa riferimento con la sigla
IDE (lntegrated Development
Environment).
MPASM/MPLINK/MPLIB Files:
sono il compilatore, i linker e i files di
libreria accessibili tramite MPLAB. ll
compilatore sara necessario per tra-
durre i programmi che editeremo in
linguaggio macchina, in questo caso
quello del microcontroller. Se il pro-
gramma è realizzato in diversi files
tra loro relazionati, ed ognuno di essi
contiene vari sottoprogrammi, sarà
necessario il linker per renderli una
sola unità coerente. I f iles di libreria,
dal canto loro, facilitano il lavoro di
programmazione fornendo "fram-
menti" di programmi già elaborati e
molto utilizzati che potremo include-
re all'interno del nostro codice.
Finestra di selezione dell'ambiente dei componenti
MPLAB-SIM: è il simulatore
software che fornisce Microchio. Con
esso si puo verificare il corretto fun-
zionamento delle istruzioni del pro-
gramma che si sta eseguendo, vedere
come'risponde agli ingressi del siste-
ma, così come le uscite esterne che
questo genera.
MPLAB-ICD Debugger Support
Files: come indica il suo nome non si
tratta di un'applicazione in sé, ma di
files di supporto necessari per la fun-
zinna
zrur Ài "nlahrrn"
rc
ur utruu9 n u r'trarr- a,';e+'
rLcrLd 9ud>t-t.
Questa funzione permette, non solo
di vedere i risultati finali di un oro-
gramma, come farebbe l'utiltzzatore,
ma di accedere ai registri del sistema
mentre si sta eseguendo l'applicazio-
no ocanrondn Io i<tr uztont passo a
n:<<n aaaatar: Î rttn nro(fn ln rror{ro-
mo in maniera piu dettagliata trattan-
do questi strumenti cosi importanti.
Help Files: sono i files che ci per- Finestra di selezione dell'ubicazione del linker.
metteranno di ottenere aiuto dalle
f unzioni, menu, finestre eccetera, che

inteqrano MPLAB. non disponiamo, per cui al momento non parleremo di


I restanti componenti danno supporto software a loro. La programmazione del PIC nei programmi che
strumenti hardware per emulare e scrivere i programmi realizzeremo si farà con il software e l'hardware speci-
commercializzati dalla stessa ditta N/icrochip, dei quali fico in ouest'ooera.

Ssflr*rsre
Una volta scelti i componenti,
continuando (Next) apparirà una
spconda finestra ner selezionare
l|||LJ!|9
F\

l'ambiente nel quale si eseguiranno i

programmi. Noi abbiamo scelto


l'ambiente Windows perché in que-
sto momento è il più diffuso sul mer-
cato.
In seorrito verra chiesto un indi-
rizzo per l'installazione. Si puo sce-
gliere quello proposto, oppure uno
che vi sembra più adeguato all'orga-
nizzazione del nostro disco fisso,
dato che oresto non influira in
seguito sull'esecuzione dell'applìca-
zione Nplla seorrente f ineStra è
offerta l'opzione di fare una copia di
<ictrezza dpi files oià esistenti sul
nostro computer che saranno sosti-
tuiti, e in seguito introdurre nel
Menù di Inizio di Windows l'accesso
Durante l'installazione sono mostrate una serie di caratteristiche dell'applicazrone
rapido all'applicazione in modo che
non sìa necessario entrare nelle sot-
tocartelle o nei f iles per ricercarla. FI"J NffiSNX
r- finestra ner sg f4pLAs
^',-^r^
vudl sreoliere
luu oPvoltr lq il rLrLr u vLr rLLyilLr!
r I'indlrizzo
'del linker, dovremo selezionare una delle due possibili Possiamo già eseguire un programma, aprendolo appa-
opzioni. Se avremo installato una versione precedente rirà una fìnestra come quella della figura riprodotta qui
di MPLAB, la scelta sarà fatta di conseguenza, per ren- In basso.
dere compatibili i vecchi progetti con quelli nuovi. Come si puo osservare l'aspetto e come quello
Comunque per un utrlrzzatore nuovo
si raccomanda di installare il linker in
MPLAB\Lkr.
In seguito dovremo scegliere dove
installare gli archivi di sistema. Se
lavoreremo in Rete le scelte verranno
fatte di conseguenza.
l-lnnn
vvvv trrv rfia
r!! nr ro<to SCelte iniZia l'in-

stallazione di MPLAB. Durante il pro-


cesso di installazione appariranno una
serie di caratteristiche nel video, oltre
alla barra di stato dell'installazione.
Una volta terminata l'installazio-
nó ci
Irsr Jr nntr:nnn
pvLrorilrv l666,nrn Ii{il^.
rsygElE lllc) Ài
Ul
testo associati ai componenti instal-
lati, oppure lasciarli per la fase suc-
cessiva.
Tutti questi passi del programma
MPLAB si trovano nella cartella
Finestra di inizìo di MPLAB alla sua esecuztone.
" C :\Archivio di programma\Mplab".

Sa**nrara
.,,a,:a,,:.&
'.'.Ìa:-':?&È
'r...::-,:i*

.::::::1ffi
,,,,:::Liff

;3.
. .l:t
"s4
,.-ffi
ffi
1::€

della maggior parte dei programmi che funzionano "Aiuto" e altri che, invece, sono specifici di questa
ffi
nell'ambiente Windows. Nella parte superiore della particolare applicazione. ffi
finestra appariranno diversi menù dentro iquali Sotto i menù le icone che raooresentano le fun- ,:#
-":'.Ea
-::::x
incontreremo i tipici "Files", "Modifica", "Finestra", zioni oiù utilizzate. Se si seleziona l'icona di sinistra --iffi
-:w
il gruppo di icone varierà. "Èffi
All'interno di questo ambiente si
"w
potra:
w
'E€
ffi
Organizzare codici di una e
-l*
applicazione in progetto. I
Editare i programmi
:.:,,aa&
fonte per il PIC 16/17 così :,;:1|ll&
come altri flles di testo di cui iìè
potremo aver bisogno. :::lr:;:*
:.t:&
Compilare i codici
fonte ottenendo i files
da memorizzare
".-,.}
sul microcontroller. &:

ln Assembler ogni istruzione si traduce come un solo codice macchina. Simulare icodici "E
una volta compilati e prima ,,,,ì1ffi
di memorizzarli ,,'::a::#
nel microcontroller, .::-:..ix
r:ìi::il::!A
verificare che il lavoro
realizzato ffi
'::,::t:atffi
sia adeguato.
:ìa:::11i9;!
Grupfii di icone che rappresentano le funzioni più comuni
Tabella delle funzioni da realizzare ,:*$ffi
nell'ambiente MPLAB.
"qffiw
4tr
.11,11:,::,74&&

ffi
Pnro : norn vod;911o come Si .

***rì******t**.$***r*r**dtt*Iq*r****i**rì.*r .iss
;
realizzano queste opzioni. Per il
r*r*r*È*r+**,
i*r*ú******r****
;* Hlcr0chlp lechn0l0gg IncorForated momento diamo un'occhiata alla ..*#
* 16 0ecenber 1998 (anronta finrrr: nor vorifir:ro il f inn
* hssenùtÈrt ulth l4Pfisl'l u2,?8 :i
***it*it*t**t*iÈ*tr*r**t****i*i**t***$**r*H{
;r lhls proqrafi conflgures the n,/ù ilúdulÈ t0 r di informazione che ci permette di
;i l/D channel 0 (the potentllneter) and dlspl "*ffi
;r rÈsúlts on thÉ LE0S on PoRTC. ìlak€ sure tl vedere l'applicazione, e cominciamo 'ffi
r sÍltch SSg has all ssltches ln tha 0H posll l*q
':;t
- :T: F;0ú 01 02 03 64 05 06 07
cF Fr rE FF r_ tF !t
08 09 0n !8 0C ^i^--"^ur I PU LUr
o- gruLorE -^^idiversi
| | menu.
tr FF;F rl il
- FtÉ
ld.f6 FF FF FF FF rÈ L, rF tt
g&!.f
t, FF EE tt 'l la finestra srrnpriore a sinistra :,à
':#
fr fF FF FE ,! FF Ft rr Ft fF t, rf
Egg! FF El lr Jf rl cf Fl fF F. FF FF l,- r
'
mostra l'edizione del programma in ...1#
corso. Sopra di essa, in un'altra
Hex Dec 81n3f9 orX
96 B BBSSBBBB
OB B 588ÙBÙ68
finestra si nrro vedere il valore di
FF ?55 11111111
'18 24
BS B
IrJù11888
BSBB6BOB
oonrnn dci renrstri sDecifiCi del PIC
6B B BB6ÙB8BB
1F 3t ggg1t.i11 nel loro formato esadecimale, deci-
B! &
male e brnario. Nelle finestre di
86800080
FF ?55 i1111111 I +:000S
B 0003 SFFF
SFFF €ddlw orFf w
ig
69 B 6OB86O68 i oooq
+ q!!-', arrr
litl eddtu oxff
a0 B 00866800 -ù 0009 aFFF àddlu 0xff destra, cominciando dall'alto verso '4
06 0 06860666
05 B 86068880 il basso, troveremo la finestra dello ,::j!.?}*;

' ::*
Stack delle istruzioni del PlC, la ,{4
$fi*
EEPRON,l dei dati e la memoria di w
Finestra che mostra i differenti titti di tnformazioni fornite da MPLAB.
programma. ffi
':ts
:,.ff
,ffi
":ff
9à'w&%*xww* 'ffi
---é,9
!i{g
t3&
.

ìir':::ir1,

i?:,:,::':ìr.:.
..
:-::iii

^..
".
'

*.::r:lll',,,,
Schede dette istr uzioni :
'''
:aìr.ìl:ìlì:ì :

]iaa-
'
l'istruzione movwf
la seconda variante dell'i- I
aaa::.::::: -:::
struzione "mov" In essa
,1L1;1::l;1:,:,,,,

ì:ii:,:i::,':
l"
rl datocontenuto nel OPERANDO OPERANDO
FONTE DESTINAZIONE
:ìiììì:r:ì::

registro di lavoro W è MNEMONICO


.. trasferito a1 registro f, che qui
L,,t,,
l;:L;',::,
appare come parametro, in m o.v t
- modo che si cancelli da W
at,:.:,,
Dobbiamo solo indicare qual
è l'operando di destinazione, Operazione: movimento del contenuto del
visto che quello d'origine, W, e registro di lavoro W al registro f
implicito nel codice di istruzione. Cicli: I

;1$l1r!;;ìl ii1!i Codice OP: 00 0000 1 fff ffff


l. tit,ii *i.ìì-; Î í:': ;ri :ji'i ijqi l; Flags: NESSUNO
4,,^-+- ,,^l+-
vulLd ,,^^li--^
vu9llol lv (-^.,-^"^
dl l\ dlú 'lll
vuc)Ld I

valore de recistro rl crri indirizzo


e 0E (ricordramoci che a partire Ca ratte risti c he de I l' i struzi o ne movwf
,'lr
ud nfuL Ài.n^ni.mn
ur)purror rw doi
uLr ranictri
rLyrJrrl
generali che possiamo utiìizzare come ci conviene), e : lregistri, all'inizio, si considerano con valore indetermr-
chechiameremooPERANDo,conva|oredectma|eB' nato, X e Y. Notramo che al momento di utilizzare le
Per questo dovremo impiegare le due istruzioni che gia istruzroni il valore letterale non viene sempre rappre-
conosciamo: movlw e movwf . sentato nello stesso modo; dipenderà dalle situazioni o
Nella figura si vedono i passi da realizzare. l dall'utilìzzatore, comunque al momento di memorizza-
re i dati nei registri e quando
'a
Í, lavora la ALU la base utilizzata
I sara la binaria ll codice esade-
OPERANDO w I
rimale e orrello che si usa nor-
malmente, in assenza di altre
XXXXXXXX
:
t Y.YYYYYYY . snec if iche e com nre nd e i

.'
' . . '. : .
... ì.]ì.ì:ì: ìì :...'.'.... :':.1 ::. '' : 1',. ]. valori da 0 alla f . Per utilizzare
ari '.--l
€t,rn
lfjt riF;.,
ì.:i'
gl altri codici dovremo espri-
a mere rl numero entro "virgole
m OV lwdi I xxxxxxxx : 0000 r 000 :
semnliri" e nrerpderlo da una
lettera che indichi il codice in
ru cui si trova. In questo modo,
avremo diversì codici molto
impiegati, come ad esemp'o il
decimale e il brnario. Dopo le
nnor:zinni pntr:mhì i roni<tri
'-v'-"'
hanno il medesimo dato, visto
rhA jp6prL r:nrol-
\'rL nt tA<ln nnn
9ULJLV 17 \ d lLcl-
Passi da realizzare aer Cart(ÀrF il rpni<rro aPFRAIIDO COn il valore deCimale B
l:rn noJ ronictrn nli nrir
-, -,,Jrne.

$s*$*sws*etr
Schede delte istruzioni:
f istruzione movf
%
W la terza e ultima variante
ffi*
w dell'istruzione " mov". In OPERANDO OPERANDO DI
ffi questo caso rl contenuto
fu Oet registro f, che e l'ope-
MNEMONICO FONTE DESTINAZIONE
rando fonte, si puo trasferire nel
movf d
registro di lavoro W, o al medesimo ^;
renistro f :
sorond: del valore dr
Operazione: movimento del contenuto
"d" F necessario snecificare tanto
l'origine come la destinazione. del registro f alla destinazione d.
Muovere un dato da un registro Sed=0si muove
al registro di lavoro W ha senso, il registro di lavoro W e se d = 1 si muove
d:rn
vo Lv rho
Lr rq l'nhioftirin
I uurqtLtvv nr rÀ nccnrn trr
vuv c))ctc Ltd-
sferirlo ad un secondo registro
allo stesso registro f
partire da W, o operare nel medesr-
a
Cicli: 1

mo registro di lavoro, pero muove- Codice OP: 00 1000 dfff ffff


ro urr
rs ttn uqlv
d:tn
so regrstro, sem0ra non
d: urr
uo ttn rEyr)trv :lln cfac
roni<+"n qilu )Lc)-
avere
Flags: Z
senso. Tutto ha una ragione, ed e
che quando si realizza questa ope- Caratteristiche dell' istruzione movf.

razione resta coinvolto un segnala-


tore, o flag, chiamato Z. ll flagZè un bit del registro di nato numero di volte, si puo caricare il valore in un regi-
STATO che viene messo a I se il risultato di una opera- stro e decrementarlo fino a che questo raggiunga 0.
zione è 0. Così, muovendo un registro a sé medesimo e
verificando il valore del flag Z, possiamo sapere se que- frsfre4px il*** #xsgffià$trg#$€g &4#w$:
sto registro ha valore 0, o no, visto che Z sarà messo a '1
Nella f igura sono rappresentati i valori che prenderan-
nel caso che questo valga O. Cio e molto utile, e si vedra, no i registri all'esecuzione dell'istruzione movf nei due
parlando di cicli, che per ripetere un'azione un determi- diversi casi, dipendendo dal valore degli operandi di
destinazione. Questo ci darà
OPERANDO STATO due combin azioni, però se
uniamo il valore del flag Z
Valore iniziale
movf openaruoo,l
t "ìr:**Y,*i
;-
J?-:YI : otterremo quattro casi distin-
ti. Nei primi due avremo
I
yyyyyyy m.)qq.l il rpnictrnv q1 qa\.+^..^
si opeRlruoo= 0
l- )z=1t . -l Ju Jú )LE))U

e Z si sara attivato, o no, a


si oprRnuoo+0 vvvvvvv L
movf openaruoo,O
t _ _t*z=gt
I seconda che il valore del regi-
stro sia 0 nel momento del
I
si openaruoo= 0 yyyyyyy vvyyyyyy movimento. Negli ultimi due
^-.12.=11 '*l esemni oltre :ll',aftivazione
si opeRnuoo+0 yyyyyyyy vvvvyyv tz=ol .J !J!| | |H|,

del f lao 7 il rcnistrn dr ravoro


W ha alla fine dell'istruzione,
Valori dei registri nei differenti casi con esecuzione dell'istruzione movf
il medesimo valore dell'ope-
rando fonte.

Sw#sweqwwqp
]dll@lì\]]ìiìWs'ì''ì]i]ìù]$ì]Wls'''''[W!]l!]l!.ìrìsW*]sl!l*lW\ll|wilìììììr]]{l*lf1ffi:è.ì:ì:ìììì]]]]l]\*:\wqfr,']|
Strumenti di lavoro:
it compitatore MPASM
MPASM è un compilato-
ro npr PIC Delle l-rc ver-
sioni che esistono attual-
File
mente, noi utiiizzeremo A5M
quella per Windows, che
-r^r-i--^
ouuior --"i--+^ installando
^i- LorLoLw
rw 9ro
MPLAB. Questo offre il vantaggio
di noter romnil,arc senza uScire Compilozione
dall'ambiente di sviluppo, cosa con MPASM
che risulta molto comoda, oltre a
fornire un'interfaccia molto piu
nradpvnle risnetto alla versione Errore di
per MS-DOS. sintossi?
*ri.
f MPASM oeve iavorare con file
con estensione ASM, li compilerà
e, se non sono staîr cornmessl
errori, darà come risultato altri File File
fiies orresta volta co. estensione ERR HEX
HEX. ll codice HEX e qL,ello che
nntr: pqqorp nronr:rrmato nel PIC
per essere eseguito. Se I orog'am- Files più importanti in relaziane all'MPASM

ma contrene error srnta'ttr-


ci ,ad csomnio sp p Stata
scritta maie un'istruzione, o
nnn
l,Ull \/ennnnn
vcl'VU ,U riqnó++:r^
ITJPqLLoLC
l^
lC
nnrmp dpl rnmnil:lnro
' '|./iluLvrE/
rl
ql

nnqtn
PUJLv
dol
vL fila
rr'L oq:dori*.lo
LruuLL lldlr

riorrÀ nrnoolln irn tile d


e"ore FRR che sara nossi-
Ait^
uiltr :^^^^.^
r199crc c^ rc
^^t ^,, -t^
\luartr
saranno contenuti i codici
nlonl
vrvl arrar't frnr,:1-i Che
dn\/rp'nn rnrrenctrrtr nr Tla
di oroseor,ire lo schema
della fiarira
"v-'- rinrodotl-o in
'

,altn rrnstr: i: sonrrg1173


segu ta e i files co nvohi,
nrio(tn cr
9ULJLV iLr hom:
r! rrrU :nrho
Ur rLr rL <a
JE h
I lor

forma srmile non deve


!à versione di MPASM per MS-DaS ha quesro òspa|7o
essere confuso con un

s--
bq;}trYt";q*P*
organigramma, perché in questo nuovo schema sono il# gi;f
*rg# # ffi &f.X* ru f ffi tr L n*-ffi tr&SÍv?
mescolati differenti tipi di dati. f MPASN/ che utilizzeremo è parte dell'ambiente di svi-
I f iles mostrati nella figura sono i più importan- luppo di MPLAB, per cui parlando del primo dobbiamo
ti,ma non gli unici, dato che vengono generati continuamente far riferimento a quest'ultimo. Così,
anche altri tipi di file che per il momento non men- per esempio, in MPLAB tutto è basato sui progetti, i

zioneremo. files si chìamano nodi (nodes), e sono raggruppati per


Ovviamente le finestre che ìllustrano questo formare il progetto, così MPASM si dovrà configurare in
capitolo di "Programmazione" non le troverete h:<o:llo o<inonzo di ,Jnt progeîto.
_, nr
sul CD, ma servono unicamente come esempio di Per configurare MPASM per poterlo utilizzare in
nrocpdttre d: sporriro ner rcalizzaro il vn(trn nrn- MPLAB bisogna seguire i seguenti passi:
gerro. 1. Si creerà un nuovo progetto (Project>New
Project), dopo di che appa-
rirà una finestra di dialogo
come quella nella figura.
2. Si dovrà riempire il
Ldil rpu ;^^;--+^
il rurLd ro Lor
-^^,, nome

.$ c:\ file" (File Name)con il nome


* che vogliamo assegnare al
;l archiv*l
progetto lad es. "prova") e
ffi mplab
cliccare OK Apparirà una
If er*ample
seconda finestra con le
I template
opzronr.
3. All'inizio il modo di
sviluppo (Development
,li*.ljE '*r :,.:,:.,:,,: Sri1e*:
Mode) sara di sola scrittura
lProiect File+ ['.pitf j r -"*
l'#s (Editor Only 16F84). Per il
momento e su'f iciente,
Finestra di dialogo che appare quando si crea un nuovo progetta pero possiamo ugualmente
provare a cambiarlo, con il
pulsante "Change", sele-
zioniano il modo simulazio-
f,anfigurdbn i :"+wt+ ] rinu ] EreaL tlptiun* ne (MPLAB-SIM Simulator),
Tsol* é.
3
:'"++ !t I fu""r H*r+:*:g os5ervan0o quanlt
^.-^",,-^,1^ ^,,-^+i parame-
^-,
tri dovremo tenere in consi-
"--.'"-'"*"" -r.:
: derazione al momento di
llone [Editor Bnlyl :Proce*sor: Ptc16Ffr{ ?
simulare il nostro program-
ilirlrF-flt! ot all peliphelal* have $uFFort for ma.

srl*lt} {{}:: simulation. 4. Torniamo pero alla


ial l/tl
is nnt simulated" fines'ra 11o11o n6zinr., d€l
f:tll:lffi,tli ì 1:.1:l Ii.++r:Ì+l+r 'Details' for additional progetLo nella parte infe-
information an Flfl EF8{. riore dei a fineslra trov a"no
t q. î: f'Ì 1.
attivo il pulsante per
l'lPLAB-lCD Debugger ir:**iií:,t aEgiungere un nodo (Add
Nocie), clrccandolo farà
apparrre una f inestra che ci
r--------------t{rper.metteràdi realizzare
| 0K | f,ancel |r $rply { l-l.elp
-- I I
I
o'-lesta OggraTione.
Una vclta selezicnato il
F er carlbio rt .lmb,e e,1:r:t:i,
lestra 1i .1i1oa : ::ryla1tan1 fil-., c rccare su "OK" llel

:li f li ,,;,1 r* i, g,',


'l;:
ia::::
iiirr

l::ll:::':,
'.:,a,,::,::::

,,.:tt:a:t',:',

:a:a,:,.:,::::

:t:titìit:.:

'l'tllLli:ll:

t:.,,::.:::'

$l,,,,

t:,::.:a,::
caso che nessuno dei files già editati faccia al caso Properties), che, di conseguenza dovremo cliccare.
;4,4,a,,,:

nnctro np nnsqiàmn creare Uno nUovo con l'onzionp 6 ln nrroct: finoctr-


rilrLJ(ro
l- -^--
lo Lv)o ^:,, i-^^.+-n+a a )ElC-
cala
l.JlU llllPUl LolltC E

File>New. zionare MPASM come linguaggio di programmazione


5. Se si seleziona ìl nome del progetto, \ LOt t9UO9E T^^r\
/r -^^,,-^^ -rr,i^+prno
tUUt// Oil dplle pUJ)rUilr
[ tLsr I rU UCilq srelte. FattO
nossihili )Lr
(prova.hex), del riquadro Project File, si attivera questo, cliccheremo OK. Tornera la finestra delle
anche il pulsante di proprietà del nodo (Node nnzinni dol nrnnotln

PKid s

TudFi*as
i;-*d"h*
*-------:---l EE:F.i
c*u:]ì -t-S:- ..- ,*1'" Ir *
l-:---]-= È iEonfiq.ndion 3 ' '=-.
i.....-......-.=.- ] rin*:
lldp -'.-.....-..-'.-.iq
I;

I *FÈiffi"1*;6,16;1',
{snc .
l'
i: :.* '
.St*rr.rr'.+nk+H,*r
i
Dae@extrode: Fdibo'tt6F81 -___l qle4Ei...l
I :' gef f*r*P,F*+et Énah*e Mk=+pr+r.'+,r++r
-
rure"4ol*j.5oìio |;;g"
Plr4É{{ Éùer
,*= :, .: f*qf 3r+* Etable l:.yt *t+tktí Í* i+.'* +++rttr +Íì+;+

tdd li6de--- 1 ,IrritT'ri ff"#:


{
l , :$# + llll
la..a:.:':.,'::'-a tr

f ''ir,:
r.ll:::: {

.:t.: t .- i f.qil cryrd


'
I aar | t:
490 |

nn-ostra per inserire le opztoni del pragetto Alcuni parametri da tenere rn constderaztone quando si símulera tl programma

File Name: Directories OK


e!.dmFle.ósm c:lalchir*l lmplab
";! c:\
d archiv*l
hala.a+m
idasml E-asm
j mplah |.:IP I

idasml tr-asm j e*ample


mulSxfi-arm I template
teÉdme-asm

List Files of Type

|
5 uur** f iles [". c;-. msml :i
Ab'iamo quindi definito
MPASN/ come compilatore per
flrpsto nrnnpttn All'interno dt
^,,^-+- -+^--- {i^^-+--
quesra sressa Trnestra posstamo
)na^r2 <ronlioro :lrr rnr,-r opztont,
cnme il tino di e rrorp di cui vor-
remmo essere avvisati dall'as-
sembler, il sistema di numera-
ziana arc a L ttzrizro
vur rutL iI n:r:mairi
POlOlllELl I

rhe rimannono Ie nnzioni scel-


te sono mostrate nella linea di
comando (Command Line).

il*ffitrxLexH*ru*
f$Fg
M ks ilxr
I À*nL
i:{ --.

Finp<tra rlello nronricra dct 1166c 7. Una volta definite le pro-


prieta del progetto e r suoi frles,
per compilarlo dovremo scegltere
Suildíng EI(*HPLE.HEX... l'opzione Project>Make Project,
-t
tr:mitp l: nrr:lp sp nOn SOnO
Cùnpiling EXÉ|4PLE . fiSl'l:
comnand linÉ: "c:\AR[HIU-'l\HplÉE\l'tFfiSl'lt,lH.Et(E le+ lL+ Íx- lt,+ tqlíFgtt /q 0:\f; ci:ii rnmmoc<i donli orr 'or|, verra
cpneràlo il file HFX da caricare
Euild completed successfullg.
..Jì
^^il- Irle'rì(Jrld
Ilellcl -^-^"i- U litOg'Amî4.
^"^^",
R Drrr,rntp l,r noneraTjglg lgl
{ile HFX il ro.nnil,atore N,lPASN,4
r, nrro .rrniiq,lrp dr t.p tint di even-
ti: errori (errors), awisr (warnings)
c^ -^.craai rmnrc rnnc\
llc))d99r ^, -li
I L.lud'l
'lllc)>d9c)//
possono impedire che si crei il f ile
HEX. Nell'help in linea dì NIPLAB
sono descrittr ad uno ad uno
nrro<ii tini di arronir
Questa finestra indica che non sana stati commessi errori durante la comptlazione

alrf 8e12
3 AB82 8193 clrf gk11
! Bg63 3008 úouls 6t8
Buílrting El(AHPLE.HEX. - . ùg84 B09t mu6f Brl4
e 8065 881 C mvf 6x10,1
Co&piling EXfi HPLE.É$h: 7 BB6ó 1665 bcf 6x3,888
rrF gx1l
Conmafidline : "C :\*BCHtU*1U,lFLAS\l,lPf,5l,lltIt{-E,(E /e+ /L+ fx- ft+ lp16F84 /q C:\g E a6a7
80s8
8C91
.t8m btfec 8x3,grg
t'rarning[295] C:\f,FCHIU*1\l'lPLf,E\EX*],|FLE.frS]4 4 Found rlireetiue iÍ co1ufin 1. { t5 OEB9 9792 aódwÍ 6xlz
irarning[267] C:\ÉECHIU-1\l4FLf,El EXf,l'IPLE-ASl,t ó Found lahel after cúlunn 1. (L 1l 60ca gc$2 f.f 6x12
Error['t131 C:\AnúHtU*1!]{PLnE\E$Él,lPLE-fi511 12 : Sgmbúl not pr€uiouslg defined +2 6úM gctS rrÍ Sx13
1A 666C gB94 dscfsz 8114
ttarnlng [ 2 07 I
C : \AECH I U-1 \l'lPLfi S\ EXfi f,lFLE. A$l't 1 6 : Found label after column 1 - ( '14 6E5t 2897 gsto looP
ErrrrÍ1191 È;\RRCHIU-1\l,lPLAS\El{Él4PLE.FSll 17 : $gfibo1 not preuiouEly dÉfined 19 66# 34C0 retlF gxB
Errúrf1227 C:\ftRCHI$-1\tlPLRB\Et(ÉllPLE.ASJ,I 2g : llLegal. opcode {stop} 1ú B06f
î:
8J B3 clrs
dsùls
Errúrf"1257 0:\ÉnCHIU-I\t'fFLAB\EI{*HPLE"frSrf 22 : Ill-egal condftiDn (E0F Éncoun î*
661 B
60rJ
3t15
d691
ErgS
Éúosf gfJl
-fq g81' 3MÙ aoúls E*20
l,lPLf,E is uÍablP tú fínd úutorrt .,EI{f,HFLE"HEX", ?t 6413 909 0 mvof ù<16
sB14 2 6ù'f call nplt_S
Bull-d fallÉó. cB19 281b goto min
6Bló AFFF àddl$ 6rff
,b 8417 SFFF addlw hrff
ti s818 3'FF èdrt1( Bxff
z6 E61C SFFF rddlw kff

Memoria di programrna con il file


Finestra chc >; genera se ci sono orrori di tomptlaZtaFa HEX caricato.

3*fswwsm
Scheda delle istruzioni:
l'istruzione bsf
i puo dire che insieme alla
" bcf " e una delle istruzioni PARAMETRO PARAMETRO
plu ,,+il;,--+^
^i,, uriltlòte ^^ll-
rera pro-
grammazione del PlC. ll suo
MNEMONICO I 2
ohieltivo è di norre a'l un
bit di un registro. ll nome o la posi- bsf Ít
**",
b
zione del reoistro all'interno della
memoria dei dati, sarà fornito come Operozione: ;;;;,,di un registro. f
primo parametro di istruzione, e il
numero del bit come secondo para- Cicli: t

metro. Sia uno che l'altro iniziano a Codice OP: 0t 0t bb bfff ffff
contare da 0.
Flogs: Nessuno.
ffissMpx# flseé
$-'3$gffiiliXg#*l$ fi lìxs$
Caratteristiche dell' istruzione bsf.
A differenza delle istruzioni di movi-
mento ouesta istruzione non varia
rnmnlotempntc il rgplenutO di Un
registro, dato che serve per modifi-
care bits individuali, lasciando il
resto così com'è.
Questo è molto utile nell'uso di
alcuni registri specifici, dove ogni bit
h: rrn sinnif ir:tn p deve essere trat-
tato in modo singolo, al momento
giusto, senza che gli altri debbano
variare. Un esempio tipico e il cam-
bio di banco; normalmente si lavora
nel banco 0, pero nella maggior
parte dei programmi e necessario
accedere al banco 1 per configurare
rrn: <ario di ronictri ,, e oopo lornare
al banco 0 per lavorare. ll cambio f ra
questi banchi si realizza modif ican-
do il bit 5 del registro STATO (regi-
stro che occupa la posizione 03 della
memoria dei dati). ll bit è conoscru- Uso dell'btruzbne bsf per il cambio di banco
to come RPO e, dato che la numera-
zione dei bits inizia da 0 da destra verso sinistra, vede questo cambio di banco; Ia linea dr istruzione
occupa la posizione del sesto bit. Nell'esempio si bsf è stata evidenziata in un altro colore.

$c$flwsxra
.rì
tììì

Scheda delte istr uzioni :


l'istruzione bcf
ffi.ffi
uesta istrrrzione realizza l'operazione con- zioni non sono solo utilizzate oer ouello e non è detto
ffi' ffi traria alla "bsf "; pone a 0 un bit di un regi- che debbano essere utilizzate insieme. Per esempio un
ffi ffi stro. ll nome o la posizione del registro
ffig#
altro uso molto importante che si puo fare con l'istru-
^-+ c^ l.ld llle>>d dr A
u n
u rnrn+ utrr .^^^.1.+^';
lc>cL -l^i {1.^.
W ffi all'interno della memoria dei dati e anche
'%.fornito
-i^^^
zlulle uLl -^... )cgrdrdr-uil/ lldg)
come prim.o parametro
dell'istruZione, e il numero del bit all'interno PARAMETRO PARAMETRO
dol reniqtrn aaìmo (oaaìndn n:r:mptro l p
vL|
'
l:,IJL'

sue caratteristiche sono illustrate nella figu-


2
ra a f ianco.
Cnmc ci nrn
vuv
nqsorvare
vJJr' il mnemonico di
ambedue le istruzioni si differenzia solo da
una lettera, la "s" della bsf è sostituita dalla
"c" della bcf . Entrambe le lettere indicano il
cambio di comportamento delle istruzioni,
dato che il loro significato è porre a uno
tset) e porre a zero (clear) rispettivamente,
in questo caso un bit (b) del registro (f).
Caratteristiche dell' istruzione bcf
Questo modo dì nominare le istruzioni lo
troveremo molto spesso nelì'utilizzo del PlC.
o bandiere, quando queste si attivano. Normalmente
W%XWWX t"*w
*X%YW*KK*WW. tu€x questi segnalatori si attivano in modo singolo, quan-
Rtguardo l'istruzione bsf abbiamo già presentato un do
uv si
J, nrodLtce
vl un evenln r^hc notrehhe pssere il ter-
esempio, in cui entrambe le istruzioni si utilizzano in mine di un'operazione, il salto ad un'interrupt, ecce-
maniera congiunta, una per passare al banco 1 della tera. Questo viene detto attivazione via hardware,
pelu t- lulu
^^.À ld t^"n ric.++i,,^-i^-^ !^.,^ c>)clc
ul>dl-Llvdzruilc ucvc ^^^^"^ fatta Via
memoria dei dati e l'altra per tornare al banco 0.
Poro :nrho ctr nrpsta combinazione si trova nella software, sarebbe a dire, noi dovremo mettere a 0
maggior parte dei programmi con il PlC, queste istru- questi flags tramite un'istruzione.
Per esempio, all'attivarsi del contatore
j*j'iY':.Y*l"-l TMR0, avremo un bit all'interno del registro

STATO
ffi bcf
bcf
STATO, Z
STATO,2
INTCON che si pone a 1 per avvisarci di que-
sto fatto. Se vogliamo utilizzare il TMR0 più
volte all'interno di un programma, dobbia-
mo rimettere a 0 questo segnalatore ogni
INTCON bcf INTCON, TOIF
bcf INTCON,2 volta che si attiva, in questo modo tornerà
ad avvertirci della sua messa a '1 quando il
nrnaoq<n (t nnoté
EECONI bcf EECONI, EEIF
bcf EECONI,4 Questo si fa con l'istruzione bcf, all'inter-
no del programma, dove il registro INTCON
sarà il prrmo parametro e il bit di attivazio-
Un uso molto comune dell'istruzione bcf è il reset dei seqnalatori
ne TMR0 il secondo.

S*#*wessw
Appti cazione pratica:
compilazione det primo programma

na volta visto rl primo programma e l'uso flffifrsbHgq}ru# ffig aisé pffi*#ffiT?#


del rnmnil:tnro N/lPA(l\,4 nalfo <ozinni nro- 1. Eseguire l'ambiente di sviluppo MPLAB, e creare un
rodonti J!:rv,iL,,,v
ccnrrirpmn nra
v,L le faSi Che abbiamO progetto di nome primo.pjt
do<rrittn nor l'ol:hnr:zinno di rn nraìnottrì 2. Selezionare il nome del progetto in modo che si atti-
a lrrc:n- vi il pulsante di proprietà del nodo.
E lr
tq rnmnil:zinno
Lvrrrvilqzrvrrq nli 1n
ur urlPlU9ldllllrlo,
^r^^rammr uú)qll-
doci su un esempio concreto 3. Entrare nella fìnestra di proprietà del nodo

Creazione di un progetto

Attivazione del pulsante di proprietà del nodo

f-inestra di propriela del nodo

SwSSwswww
Assicurarsi qui, che il linguaggio scelto ${ffixYY$"3ffi& #tr$_ tr$A##ffieffi *4e
(Language Tool) sia MPASN/. Dato che non abbiamo 4. Creare un nuovo file (File>New).
e(lrrdio ilil programma
^-l;+-+^ ^"^^"-,-,- non posstamo sommare nes- 5. Scrivere nella finestra corrispondente il programma
sun nodo da assemblare. Uscire dalla f inestra di Edit che diamo come esempio di primo programma in
Project. assembler.

Finestra del nuovo file

Scrittura del programma.

Assegnazione di ,Ln nome al programma

Somma di un file al progetto

Sw$swessw
urluìÌrtjÌtl;]j::1::]::]ffi:!t
Questo sarà il programma che più tardi sommere- emp4trxL-&Kx*rum ffi ffig Fg$-il
mo al progetto. #g $"$** pw**ffiYY*
6. Salvatelo (File>Save As...) con il nome di primo.asm B. Ora manderemo a comporre progetto (Pro-il
nella directory dove avete installato MPLAB. ject>Make Project), mentre il software compila tutti i

7. Ora che disponiamo di un file (nodo), possiamo apri- f ile del progetto, nel nostro caso uno solo; apparirà una
re la finestra dr opzioni del progetto (Project>Edit finestra di comunicazione.
Project) per aggiungerlo. 9. Se non sono stati commessi errori nella scrittura del

Compilazione dei file

conpilinq FnIH0.nSí:
comand line: "C:\AFCHIu"1\t4PLAB\flPnSfiilItl"ExE le+ l1+ /x- /c* lp1óF8|| /q c:\g

Fuild cospleted 5uccessfuI19.

Finestra di progetto compilato con successo.

SwW&Eeswww
nrnnr:mm: deve,ann36jpe una finestra como nrétt: memoria di programma sono 17, vengono caricate
della figura, che ci informa della compilazione conclu- solo le istruzioni, sarebbe a dire quattro indirizzi di
sa con succesSo. memoria. A partire dalla linea 5 (indirizzo 0004 di
memoria) quello che appare ha un codice fisso, per
*ssgffiwex3#ru3 se"$L il*ffigfl il *à:ruf, ffiey* senn,rl,rre chp non r'e alCUn codice caricato.
'10. Se si apre la memoria di programma (Win- 1 1 . All'interno del menù Window possono essere aper-

dow>Program Memory), si puo osservare come verra te altre frnestre che forniscono diverse informazioni sul
caricato ilfile nel PlC. Anche se le linee compilate nella progetto e sui file.

Finestra della memoia delle istruzioni con il arooramma caricato

Altre finestre che ci forniscono dati sul progetto

Sw$*wwrm
Schede di istruzioni:
f istruzione addlw
ffi d
ffi
istruzione "add" è una delle
ffi
ffi
due istruzioni aritmetiche OPERANDO OPERANDO
ffi che puo eseguire un
ffi PIC'16F84: la somma. L'altra MNEMONICO FONTE DESTINMIONE
ffi è la sottrazione. ll PIC'16F84
non sa moltiplicare, ne dividere, ne
tanto meno puo fare radici quadrate,
oddlw i
potenze; nulla di tutto questo. Questo
'.
e dovuto ad una delle caratteristiche Operozione: Sommo del volore letterole k
essenziali del suo insieme d'istruzioni:
r- r^.^ )crrpILrLor Lr
ol registro di lovoro W
td rutu -^*^r:-i+\ -^frt fa Si Che SianO
molto raoide nell'esecuzione. Nono- Cicli: I
<t:nta arro<tn qé <i do<idor: oqonrriro
alcune di queste istruzioni complesse, CodiceOP: I I I I lx kkkk kkkk
<i nn<<nnn
)r vv)Jvr ru Lv)rr
i<trr rzinni <omnliri
E q: n:rf
rncirr uilriro ira d:lla
Pqr Lrr E vollq
Flogs: C, DC, Z
' La somma nel PIC ha due modalità:
"addlw" e "addwf ". La "addlw" Caratteristiche dell' istruzione addlw.
somma un valore letterale al contenu-
to del registro di lavoro W, e lascia il risultato in que- valore che puo contenere è FF (255). Quando dopo
st'ultimo. un'operazione come rn questo caso il risultato è mag-
giore del suddetto numero, si genera quello che si
#%frF4Fg {*ru rs%€ffi€jtrg*ruil &ffiffiLw conosce come riporto o carry, e per avvisare di questo
Supponiamo che il registro di lavoro W contenga I valo- fatto sr attiva un flag chiamato nel medesimo modo (C).
re 05 prima di realizzare
roperazione,esi vuoreÈ .ESADECIMAIE" BINARIO DECIMALE
sommare
JVr |ilrrqrL ilrl valore
vurvrL esadeci-
LJUwLll
:: |r ì Il .
.
meto FF \/odi:mn,,- n'oiln ;
vqlore lnlzlole
vqlore rnrzrole u)
-Jellu
che srrccedera dono l'ese- , ffi
cuzione dell'istruzione. i W
Nella seguente figura si
rappresentaqr.rtotuìto f; oddlwFF "+ FF i llllllll 255
mostrando i valori in il
drversi codici numerici, al $ Y
fine
trne di tacilitarne la
dr facilitarne L'
Ia com- - l;
prensrone W
vqlore finqle W 04 OOOOO t O0
ll registro di lavoro, così ?

come gti attrr regrstri dei A ffi

ffim$*e*remw*
t@lb.rt&taaaaaltt l^)::::))::::::)):::|))::::t:
::....:
,a:::,1

'a,::l

,::'l:.:l

Schede di istruzioni:
l'istruzione addwf
istruzione addwf e la secon- REGISTRO- I REGISTRO-2 REGISÎRO - 3
da modalita di somma esi- :W (contiene il digit MSB) (contiene il digit LSBI

sîenfe nel renertorio delle volore inizi ole, OI 0000 00r r oooo ol0l 0000 llll
;
1

istruzioni del PlC16FB4. La :

somma st realizza fra il con- E


lónrrln
LCt tu LU rli
Ur rrn
Ur r ranici66
rc9r)Lrw ^' 'rlci.ci
L.1udl)ld)l Ànllr
uúlld
memoria dei dati, e il registro di lavo-
t
ro W. &
ll ri<rrlt:fn doll'nr
-,,, -Jerazrone puo oddwf 3,1 0l oooo o0rr ; oo0o olo! , oo@oooo
^.-^"^ l^.-,^+^ lllcuEJilrV roni<lrn
^^l -^...loqimn
e>>ele ld>LldLU lìcl rEgr)Lrv fi +l+J DC=l
v
o nel registro di lavoro W, secondo il ol OOOO OOt I , OOOO Ol lO :
:

OOOO OOOO
ri:lnro dol n:r:motrn d 5e DC è messo
Così corne con l'istruzione addlw o I dovremo
sono interessati i flags C, DC e Z.
correggere
i digits

I lrilizza rlal 1t|/y


iltn urf)î uvYv
rJana I anars zìana di <amms

Y;% {,: {:tt'i:' i {i. \,',.i Yi 1.,,,"r"1::,'7" Y.l} 7-l * ?}'{.


OPERANDO
- OPERANDO
I MNEMoNlco io-NrÈ DEsTtNAzór.rr i
{:,'1,.}1|j\g'rl i;:

I fl:nc I o 7 sono- qtà+r +--++-+i I rfvrl


- --.Lr Lrdt LdLr ^^^ri

qddwf , f d
altri esempi, per cui rìmane solo da
spiegare il co"nooruamento del flag
DC. Questo flag va a 1 quando si pro-
Operozione: Sommo del contenufo del registro f duce un riporto nel 4' bit, anziché
nell'8", come succede con i flag C
con il contenuio del registro Viene utilizzato, se necessario, quan-
di lovoro W. Se d=0 il risultqto do bisogna tener conÌo in un regrstro,
il superamento del valore massimo di
si loscio nel registro di lovoro W, un digit.
e se d=l si loscio nello stesso Per esenpio, se un numero e
<rnmnnqtn in tro dinit< pc:dprim:li p
registro f ogni drgit e nemorizzato rn un regi-
Cicli: I )U U, LIUO| rUU c;
'rnÀn ) nrnrlrrro rrn rinnrtn :l
PTVUULE Ur | | rPWr LW ql
superamento del valore F, ìl flag DC
Codice OP: 00 0t I I dfff ffff verra messo a 1; it che sign rica che
Flogs: C, DC, Z dovremo mettere a 0 il registro e
'1
sommare al digìt seguente. Questo
e mosTrato graficamerte nella figura
Ca ratte r isti ch e d el I' i str u zr o ne a ddwf .

In aito.

';,?',1
Strumenti di lavoro:
il simulatore MPLAB-SIM

ambiente di sviluppo
MPLAB possiede tra i suoi
strumenti un srmulatore, il GIi stimoli esterni nel MPTAB-SIM sono elaborati una voha ogni ciclo d'istruzione, perciò i segnali di durata

N/PLAB-SIM. Un simulatore inferiore non possono essere captati, e pertanto simulati, cosa che è permessa dagli emulatori in circuito.

nprmettp di pspnrriro pgl


computer il programma che piu tardi
sarà registrato nel microcontroller. Si La velo<ità dei simulatori software è sempre minore rispetto a quella degli emulatori. Questo può
nrrn rrpdpro rn<ì <o il,, programma sr essere un vantaggio o uno svantaggio al momento di programmare, dipende dal programma e dall'utente.
ln MPLAB-SIM si possono eseguire istruzioni ad una velocità dell'ordine del millisecondo per istruzione,
comporta come noi pensiamo, il
mentre I'esecuzione reale di un'istruzione nel PIC è di un microsecondo.
valore dei registri in ogni momento,
p in
- ,,, npnor:lo
y', tr rttn nlellO Che SUCCe-
de dentro il microcontroller al
momento di eseguire il programma. I simulatori hanno il vantaggio di non necestitare di hardware esterno al PC per il loro utilizzo,
per questo se non è necessaria un'esecuzione in tempo reale, di solito sono sufficienti per trovare
ll in part colare, è pro-
MPLAB-SIM,
e coneggere gli errori della maggioranza dei programmi.
oettato npr drp fr rnziont che sono
illustrate nel riquadro seguente. Differenze fondamentali tra i simulatori e qli emulatorì in circuito.
,,',' Nonostante questo, non dobbia-
mo confondere un simulatore con un
emulatore in circuito. I simulatori
rappresentano la situazione ideale e
non un'esecuzione reale al 100% di
un programma, ed hanno delle limi-
tazioni. Permettono di eseguire un
codrce, modrficarlo, ed eseguirlo
nuovamente, simulare gli input sulle
linee d'ingresso, seguire l'esecuzione
linea a linea del programma e i suoi
registri. . .., pero si differenziano dagli
emulatori come il MPLAB-ICE in tre
cose fondamentali:

Assistere l'utente nella verifica dei programmi.

Funzioni realizzabili con MPLAB-S|M Opzioni per cambiare I'ambiente di sviluppo.

Sqw##wsmwq*
.:::4,.:,:,aa

:a;,,::*.
,::,:::::.::::
:::4.:t

il**urg##*q&ffi*ru*
#ng- ffiF$-&ffi trffiffi g-&v*$c&ffiffi
f,#ru ffipL&#-$sffi
Aprendo MPLAB, il modo di sviluppo
standard è di scrittura. Questo significa
che dobbiamo configurarlo prima di
fare una simulazione, altrimenti le
opzioni non saranno accessibiìi. La pro-
cedura per cambiare il modo di lavoro è
contenuta nel menù opzioni (Options>
Development Mode). Eseguendolo, a
seconda del programma installato,
deve apparire una finestra con ìn parte
opzioni accessìbili, così com'è mostrato
rrella figura della pagina precedente.

Permette solo la scrittura e la compilazione dei


programmi, e le funzioni di progetto. si sta lavorando
Finestra della memoria d'istruzioni con caricato il programma con il quale

In questo caso L'N/PLAB-lCD Debugger si vede evidenziato, per-


Permette la simulazione dei programmi possiamo sce- ché è stato installato sul software come componente
oltre la s(rittura e la compilazione. Dobbiamo
scegliere il microcontrollore che si va a simulare
gliere fra diffe- di MPLAB (vedere fascicolo dedicato a MPLAB), se
nella parte destra della medesima finestra. renti modi, se- proviamo a selezionarlo ci apparirà un errore dovuto
condo le neces- al fatto che non abbiamo hardware associato. Inoltre,
CaraLteristiche dei modi disponibilr
sità. tra i microcontrollori che ammettono questa opzione
non appare il PlC16FB4.
Gli altri modi non sono sele-
zionabili, dato che non sono
stati installati nel software, e
nel caso lo fossero non potreb-
hero essere scelli noiche non
disponiamo dell'hardware.
Per realizzare delle simula-
zioni dobbiamo selezionare la
<arnnrl: nnzinno n-^^^-+-
)LLvrruu vp.rvrrL HIUPU)Ld.
Possiamo effettuare una prova
e verificare, per ognuna delle
opzioni, le possibilità che ci
off rono i menu di Debug e
Window.

YZ?LW%T W#" &:{{X%%KffiK*H


34ffiL Wffiffiffi
%KWWL{vTKZWWW

Durante la simulazione del


programma puo essere inte-
Messaggio d'errore che appare selezionando il MPLAB-ICD Debugger. rnccrnin,/^À^r^
lc))dl lLc vcucrc ilinr Lr
rhorE nn<i-
vw)l-

Sw$swwrye tsffi::t:;;z::;:@stúll;frswaarlttwffiltwlllyl2t8:wllùuuktw, &r4t..n.,..rr:lllltL:,lrrt


!1020t&090ó07 EOD OE

liq:06 10s613600S0ú -
lllq 33 00 03 0g 00 s& 00 [{ 00 06 úù 30
@c 0[ 00 63 66 00 00 00 ù6
.!ts$: sr 6A 6! !3 03 06 30 09
6ú 6ú 0A BC 00 ù0 0c 3f
..,f.:""

Nak Her Dèú 8inèr! clar


1ó t93lt00ù
pcl 0B 3 00003000
rPtioú r,aq Ft 255 11111111
itètle 11 24 00011ú69 ,
5 ú000009s
lorta 36 0 03Ù0Ù066
trisi 1F 31 000i1111
óftb 06 | 06003s6s
fisb ÉF 255 11111111
D0 0 g9Í03303
00 0 00500s3c
e.on2 6! 6 90036000
cìrth 31 6 30ù30Ù60
ntcon 06 0 6000000ú
0s 0 !0643003
09re 60 C 3360306U

Finestra di memoria EEPROM Finestre dei registri


tramite la quale si modifica un valore con un dato appena modificato.

zione si trovano le istruzioni che si stanno esequen- Dall'opzione Window>Modify potremo modificare
do. il valore degli indirizzi della EEPROM che ci interessano,
C)rrestn
YVLJLV
e nossihile attraverso la Finestra di per fare la simulazione.
Memoria del Programma (Program Memory Nella figura corrispondente abbiamo modificato il
Window). valore della posizione 0B rntroducendo il valore '12 esa-
Le informazioni disponibili si possono ottenere in decimale.
differenti formati, da scegliere cliccando nell'angolo rr^,-l+.-
\Jll dltld ^^..ihìli+- p dpridcrc sp il nrnnramma
)E lr Che
PU))lulllLo E uEllvslc Prvyra
superiore sinistro della finestra. vogliamo simulare deve essere visualizzato così come lo
Questi formati sono quelli che ci mostrano il codice abbiamo scritto o con informazioni addizionali che for-
delle istruzioni in esadecimale oppure così com'e stato nisce il simulatore alla compilazione, come gli indirizzi
scritto, facilitandone la verifica. lnoltre, appaiono infor- d'ogni istruzione, le etichette definite. il numero d'in-
mazioni addizionali sul numero d'ogni istruzione e sulla dirizzì della memoria d'istruzione non utilizzati, ecc.
posizione all'interno deìla memoria dr programma. Se il Questa informazione è disponibile nella finestra del
nostro programma lavora con la memoria EEPRON/ dei listato (Absolute Listing).
dati, possiamo vederne ivalori che contiene nella La finestra generale dei registrì (Fìle Register
EEPROM Window. Window) e quella dei registri speciali (Special Funtion

E+4 Ee 0à4 tudq Id

02.40 neleased EJtXPL0.eSh 2-2 2EC1 22145.51 PîGf 1


02.40 Rereased EJEilPLo.nsl 2-2-2861 22:4st51 PnGE

OBJEEI COOE LIffE SOUNCE IEXT


IC OBJECT CúDE LìNE SOURCE IEXT
UNLUE

00004 ;r.**E***t*,r
80005:
0000ó ; The 1ó bit result is stored in 2 bltes
00067 i
00568 ; Before callinq the subroùtin€ " npy , the nult
0!609 ; be loaded in location nulplr ", and the nulti
09810 : nulDnd " The 1ó bit resurt is stored in 1oc
06ú11;H,ÒJte&L_byte.
HCr: . | . i :

w3'i .'. .j , . tr " rrrr r.


p=1ór84 ; PlClóf8!! is the tarqet
00016
0ú017 Sinclude 'P1óF84.1flc ; Include header fi 'l.:.!l:l
00!61 tlsf --:; 00 61 82 03 94 05 & B7 08 c9 0t CB 8C
08602 ; P1óF84.lNC Stnndard Header Fi1e, Uersi0n 2-00 16tr 08 10 00 lt 00 8! 0ú 60 6t t0 0ù c!
0013ó LISr asf !6 0t !6 0g 08 8B 00 00 08 08 00 6& 00
88018 E6?a 00 !8 00 Ù0 ú0 0Ù 0B 60 09 08 0B !0 [6
00019 cblock 0110 i lenooraru storaae 6&t B0 ú0 80 0ú 00 90 00 80 9ú !6 00 n0 00

lnformazioni addizionali del proqramma assemblato fornito. Alcune finestre utili per realizzare la simulazione

Ssp$fuwwsw
Register Window) generalmente è
molto utile durante una simulaztone.
La finestra dei registri speciali con-
tiene solo quelli specif ici, mentre
quella generale riunisce sia r registri
specifici sia i generali. Un cambia-
mento di valore all'interno di una
finestra, Window > Modify, influenza
ambo le finestre se gli rndirizzi esisto-
no rn entrambe.
Sono interessanti anche altre
opzioni come lo stack delle istruzioni
(Stack Window) o informazionr del

Finestra per I'abilitazione del Watchdog

modo sviluppo, per vedere che tipo


d'oscillatore è stato utilizzato e per
determinare la velocità del processo-
re, l'abilitazione o no delWatchdog, o
il modo di collocare i punti in cui
vogliamo fermare la simulazione
(break points).

Finestra per la determinazione del tipo


di oscillatore.

progetto (Project Window). Normal-


mente si tengono aperte diverse fine-
stre nello stesso tempo. Le utilizzere-
mo, così come i diversi modi d'esecu-
zione di un programma (menù
Debug), a seconda di come procede-
remo con i concetti e la programma-
zrone.

&rxr*wx m& wewT&&w


y"&wLL& %KW**&XXffiy"&W
Prima di realizzare delle simulazioni,
Differenti opzioni dei break points
dobbiamo tornare alle finestre del

Sm$*swwre
fistruzione INCF

UCSTA ISTTUZIONC
può considerasi
un caso speciale
dell'istruzione
add, dato che
somma I al
lncremento di
ilfiifi'[i',.j
t
contenuto di un registro, cioè
in.rcoNTAToRE,r :jj},StrruroRE,r
incrementa di una unità il con-
tenuto del medesimo. ll risul-
tato puo essere portato nel -::s:*-19IH9Ti
Incremenlo
--* ...-. .-* *i . --, ..i
i

registro di ìavoro W al posto


del registro di origine, in di re in rre unirò i::[ ::li]î]:[:,1 "*k q1 _
modo che quest'ultimo non
venga modificato. Questo
dinpndp anmp qemnrtr o:l
qer
rer''* i ;[[33N]î13[E ] ' "JJ*r
óóNrnronr,t

valore del parametro d.


Osserviamo che l'unico Comparazione dell'uso dell'istruzione di somma e incremento
flan interessato a ouesta
istruzione è Z, per cui se ci interessa controllare i f lag $:SsffiPA fl#ru $js$"l|"ffiUtrX#rutr gN*r
C ola lC n^n n^trom -,,,o usare quesra ts{ruzrone. L'uso oiù comune di ouesta istruzione è nei contatori.
i
Normalmente contatori si incre-
mentano di una unità per volta, per
rr ri nttoct'ictrr rzinno nermorro rn
OPERANDO OPERANDO sostanzrale risparmio di tempo se la
MNEMONICO FONTE DESTINAZIONE compariamo con quella di somma,
poiché ogni incremento comporta
incf -*i solo un'istruzione (un ciclo di istru-

Operozione:
-*J------:r*--ir--*.*"g zione). Infatti per la stessa operazio-
incremento di uno unitò ne di incremento realizzata con ì'i-
del contenuto del registro f. Se d=O struzione di somma, è necessario
il risultoto si loscio nel registro caricare un vaìore (un 1) nel registro
di lovoro W e se d= | si loscio di lavoro W, e poi sommare il regi-
nello stesso registro f. stro utilizzato come contatore, al

Cicli: registro di lavoro W. ll risultato sono


l
due istruzioni, per cui il tempo sarà
Codice OP: 00 I0t0dfff ffff il doppio.
Flog: Z Se rl contatore che vogliamo
imnlpmcnt:rp dpvp essere incre-
mentato di piu di un'unita per
volta, è meglio impiegare istruzio-
Ca ratteristi che del l' istru zio n e i ncf
ni di somma.
.

Sw$swwryw
fistruzione DECF

uesta istruzione è
quella opposta alla
"incf". Con essa si OPERANDO OPERANDO
può decrementare il MNEMONICO FONTE DESTINAZIONE
valore di un registro
e portare il risultato
al ronictrn qto<<^ n:l roni<trn di
**.-:J***,i***--f*. -- l-r:-*-* :""*-- i
ll suo flag associato
lavoro W. e Operozione: decremento di un'unitò
nuovamente Z, che andrà a 'l
del contenuto del registro f.
nrr:ndn il roni<+rn in nrroctinno
arriva a O.
Se d=0 il risultoto si loscio
Anche qui, come con l'opera- nel registro di lovoro W e se d=l
zione di
incremento, quando si si loscio nello stesso registro f.
deve decrementare di più di un'u-
nità un registro, è meglio farlo con
Cicli: 1

un'altra istruzione, in questo caso Codice OP: 00 00.| I dfff ffff


la sottrazrone. Flog: Z
er$fle4Pg fl**\$
AjgSYR{"*trX*ruffi *ffiflr Caratteristiche dell' rstruzione decf.
L'uso di questa istruzione è simile
all'istruzione " tncf " , per cur non verrà ripetuta. In ogni nome, e non con l'indirizzo che occupa dentro la
caso, parleremo ancora dell'utilizzo di questi parame- memoria di programma. ln realtà e la stessa cosa,
tri in altre istruzioni. Normalmente quando impieghia- dato che abbiamo dovuto "indicare" al compilatore
mo un registro, faccramo riferimento a questo con un che sono uguali. Questo è possibile grazie alle diretti-
ve EQU, che fanno
rn rri< nn n doro
W EOU 0
I rn

F EQU I nome o
un'etrchetta
CONTATORE EQU 0c con un valore numefl-
co. Quindi, dovremo
decf CONTATORE,W ; Decremenlo del registro contotore portondo {--^
tdtc d-++^^-i^^^ -11,,,u-
Ltút tztut tu dil
; il risultoto ol registro di lovoro W
decf Decremenio del regisiro contotore portondo
so che faremo in
CONTATORE.F ; <anrritn .li nrro<ti
; il risultoto ollo stesso regisiro F
"nomi", dato che, a
decf tCoNTATORE ; Coso erroto, doto che CONTATORE non
; corrisponde con 0 o con un l, che è il seconda dell'ambien-
; poromeho che serve oll'istruzione decf te in cui li utilizzere-
decf WF ; Decremento del registro che occupo lo mo, cioè: il parametro
; posizione 0 dello memorio dei doti (non W) di istruzioni a cui fare-
; portondo il risultoto ollo stesso registro 0 mo riferimento, signi-
ficheranno una cosa
Differenti significati di etichetta a seconda del luogo dove si utilizzano.
o l'altra.

ffie*S*www*
Appli cazione pratica: si m ulazione
del primo programma
opo aver vrsto In cosa con-
siste il simulatore integra-
to N/PLAB, è arrivato il
momento di simulare il
primo programma che
abbiamo fatto e che è stato compila-
to con MPASN,4. Ora diamo un'oc-
rhir+r c: ^llò.+^ cazinni
LllldLd nor rirard,aro
rrLvruors
9uc)ttr )EZlvril vsr
l'enunciato del programma, i passi e
gli aspetti di cui tenere conto. Fatto
questo saremo pronti per cominciare
la simulazione.

fl&$axfleffi tr x$_ $3$c*sKTT*


1 o Una volta dentro a MPLAB, la prima
-^..
L\J)d Ud {ar^
ldlC î^rìr^
^C Opl ìlE il
il nrnnottn
LLv rho
!r rL
^a lJrvyL
abbiamo realizzafo, primo.asm, cosa
che si fa mediante il menu di progetto Finestre utili per la simulazione.
( Project>Open Prolect).

2 . ln seguito, se non I'ha fatto


l'apertura del progetto, apriremo i
file o nodi associati al progetto tra-
mite il menù dei file (File>Open).

rxruffi$Y$q$; #Y3*-xpgK
ffiè,$ssYe $xMe$L&xx*ruK
Ppr onni nroncfto dovfemO SCe-
gliere quali finestre sono utili per
lerri traÀara nrrolln rho
-,,- il program-
ma sta facendo e quali rappresen-
tano solo una distrazione, non for-
nendo informazioni essenziali.
Alcune opzioni possono dipendere
d:llo
uoils nroforonTa psrJul ldll, ^c carì
pr srqrsr r4E nor<^^îli )old
proprio l'utilizzatore che determi-
nera ron l'cs,nerienza iì suo modo
di lavorc.
3 . Per prima cosa dovremo sce-
Limitazioni di MPLAB-SIM per tl PlCl 6FB4
gliere come modo di sviluppo

Sw$&wwss'**
gramma. Potrebbe interes-
sarci solamente il risultato
finale di un registro oppu-
re vedere lo sviluppo di un
pezzo del programma su
cui abbiamo dei dubbi sul
funzionamento, o vedere
+' '++î
pd))u d pd)>u
^a..^ LULLd u ^ pdr
^ar+^Lc

dpll'pse r^r rzione dcl oro-I

grarnma. Vedremo alcune


di nrrpsfp onzioni rnn il
nostro prmo esempro.
5 o Prima di eseguire il
programma faremo un
Reset del sistema con l'op-
zione Debug>Run>Reset.
n^^i ,,^l+-
\J9ilr -^^ +^.-i-
VUrLd (-ile rdL(rdmo
una simulazione e voglia-
mo reinizializzare il siste-
ma, dovremo eff ettuare
questo Reset. ..,,,Í
6 . Iniziamo con la prima
5i deve fare un Reset ogni volta che si desidera iniziare una srmulazione . . ,.ì-'

simulazione. Selezioniamo ':l.r::


......1|.

la simulazione, opzione inclusa dentro a Animate all'interno del menu Debug>Run. Come si
Options>Development N,4ode. All'interno della finestra puo vedere, questa opzione non è di grande utilita,
che ci appare selezionando Details, potremo vedere le almeno in questo esempio, dato che le nostre tre istru-
limitazioni che ha MPLAB-SIM per il PIC che vogliamo zinni <i oconrrn nn rrnid:monto a nni il ar rr(nro nr^<o-
' ..i::::i
simulare, nel nostro caso ìl

PIC 16F84.
4 . Dopo aver scelto il modo,
sono già disponibili diverse
fino<tra fr:
,,q nrre<to
YSLJLL
<ronlioro-
JLLY"T'r

mn di lasriare anprte solo


.:....::..
quella del programma, quella
riai ronictri nonor:li o nrar;
dei registri specifici. Ora dob- r::*
i:iil:-
biamo disporre le finestre sullo :'.:a;

crhprmn So l,a disnnsizione si .,::1:;:

effettua tram ite Wi ndows>Ti le


Horizontal dobbiamo ottene-
re una serie di finestre dove : , ..:::ara:.

noler vprifirarp i dati fonda-


mentali. : :
t:'::lj,

#PXg#8dg #gn-Léq ,).::'.,,,1


.::a::9

%xp.$#Lexg*ru9
Le opzioni della simulazione
.:..,aaatÉ

scelta dipendono da cosa ci : ,:,:a,tij


Terminato il nostro programma, si prosegue eseguendo posizioni non valide
interessa ottenere dal pro-

-.ú
-v
ffiwf:*wwww
gue per il resto della
memoria di programma,
che non conttene valort
validi. Nella figura prece-
dente sono visibili le fine-
stre rhe s nossono vedere
con questa simulazione.
7 o Utilizzare Debug>Run>Halt
npr fermare la simrrlazio-
ne. Ora possiamo verifica-
re che il valore dei registri
corrisponda con l'enuncia-
to del programma: il regi-
stro OC contiene il dato 03
e i registri 0D e 0E conten-
,^,,.t^"^,,^,,-t^
9Ullu ull vdrurc uvudlc.
\/prifir:rp nr reqfe irrforma-
zioni spostandosi all'irter-
no delle varie finestre.
$ o Ripetiamo la stessa
simulazione, prima pero Modifica del valore di un registro
cambiamo il valore del
regrslro nn
-^^:-+.^ u, con, -,1 esem-
-^^ ao ^,
pio,07. Così, eseguendo il programma, noteremo stra Window>Modify. Dovremo scrivere I'indtrizzo
meglio che i registri 0D e 0E prendono lo stesso valore. (Address)e il dato (Data)che si desiderano, e cliccare tl
ll cambio del valore di un reqistro, si fa tramite la fine- pulsante di scrittura (Write) per far sì che la variazione
abbia effetto.
9.ll seguente tipo di
simulazione lo troviamo ìn
Debug>Run>Run. Per no-
tare l'eff etto dobbiamo
tornare a mettere OO nei
registri 0C e 0E, seguendo
i passi del punto preceden-
te di modifica dei registri,
poi eseguiremo il program-
ma (Debug>Run>Run) e lo
fermeremo (Debug>Run>
Halt). Ci appariranno i regi-
stri secondo quanto predi-
sposto dal programma. La
differenza con il tipo di
sim u Iazione precedente,
Animate, sta nel fatto che
noi non vediamo come si
modif icano i registri,
anche se internamente il

0rocesso e lo stesso. e il
Scelta del modo di simulazione passo a passo
PC, eseguito il nostro codi-

ffiw#srurwww
::,:.:4,

:',,1,

,i*

,
.:,)1.;

ce continua con gìi indirizzi :rì::


:tl:
successivi della memoria dì
programma.
10 o In ultimo eseguiamo il
programma istruzione per
istruzione. Questo modo viene
anche detto tracciare, dall'in-
glese "to trace". lnizializ-
Tcrpmo i renistri rome nel caso
nrorpdpntp oltro: ros,ettare il
sistema. Andiamo all'opzione
Debug>Run>Step. Notiamo
che il tasto funzione è F7.
11 . Ogni volta che premiamo
F7 verrà eseguita una sola ' 't'':

tstruzrone e potremo o5servare


il ri:lnra nroqn d:i rani<tri .li
volta in volta. Le variazioni
all'interno dei registri sono
segnaìate dal coìore rosso, cosl
lnformazioni ottenute con I'esecuzione passo a passo
come l'istruzione che sara ese-
guita in seguito. La figura
mostra il processo dopo l'esecuzione della seconda istruzione, che sara la prossima ad essere eseguita.
istruzione; a DATOl è gia stato spostato il valore 03, 12 . Se in un determinato momento ci interessa vedere
il PC (pcl) punta ancora la seconda posizione della solo quello che succede passo a passo in una parte del pro-
meùoria delle istruzioni, e appare evidenziata la terza gramma, e non nel programma completo, si puo modifi-
r,are il valorp dpl PC ner farlo
iniziare dal punto che ci inte-
ressa. Questo si fa con l'op-
zione Debug>Run>Change
Program Counter.
l'rso di oilesta onzione
è tipico in programmi molto
lunghi, dove la simulazione
-^-^l^+-
comprera pdsso d pa55O
risulterebbe molto noiosa.
l'onzione di simr rlazione
passo a passo, generalmen-
te e la piu usata quando si

intzta a programmare, per


collaudare le nuove funzioni
delle istruzìoni Introducete
ora in questo stesso pro-
gramma le istruzioni appre-
se sinora, assemblatele e
realizzale la loro simulazio-
Ino
rc/ riodrota 6|16
vLurL LL Lr rL il15| 566hicci
vvll ll))l-
mo tempo dominerete il
Moditica del PC per iniziare la stmulaziane da un òltro punla
loro funzionamento.

F es$Fqe* {:* re
fistruzione G0T0

iamo arrivati all'istruzione tabù della mag-


gior parte dei linguaggi di programmazione PARAMETRO PARAMETRO
che la possiedono. Molti libri di program- MNEMONICO I 2
mazione strutturata, hanno naturalmente goto I
rn r:nitnln rho cnion:: fnndn nro<ta
istruzione, alla f ine del quale si raccomanda di utiliz- Operozione; solto incondizionoto oll'indirizzo
zarla il meno possibile. Noi non abbiamo altra scelta segnoto come k, che potrebbe
che utilrzzarla, dato che nel PIC è l'unico modo per essere un'elichetto.
fare un salto incondizionato, cioè, andare ad un'altra Cicli: 2
parte del programma in modo incondizionato, inoltre Codice OP: l0 I kkk kkkk kkkk
è la base principale dei salti condizionati, come vedre- Flogs: nessuno
mo piu avanti. Pertanto, vale la pena imparare l'uso
Caratteristiche dell' istruzione goto
corretto di questa istruzione, per non dover poi escla-
mare: "chiaro! quando si usa questa istruzione nessun
programma gira". ffiSffi *$ $3K fl#fd L*XSY${X.$Xg#N ffi ffi #K{3
ll ciclo di esecuzione di questa istruzione, sarebbe Nella fìgura possiamo osservare due usi dell'istruzione
a dire il tempo necessario ad essere eseguita, è | dop- goto, il primo corretto e il secondo sbagliato. Come si
pio di quello normale, questo signifìca che un PIC fun- ouo vedere nel ouadro delle caratterrstiche dell'istru-
zionante a 4 Mllz impiega 2 ms al posto di uno. zione, dopo il mnemonico della medesima si mette un
Questo perché l'architettura segmentata del PIC men- parametro, che è indicato come letterale, e che nor-
tre esegue un'istruzione punta alla prossima da ese- malmente è un'etichetta che raporesenta I'indirizzo di
nrrira rho I- ^^+^
-"'-'--rr sr rnnonp <i: .,,
in ,,:--,,--.
spnupnTe Po'^ destinazione: dove si desidera andare. La programma-
q.i
J-"'' -lu ld 9uLU
salta da un'altra parte del programma, rompendo Ia zione strutturata, dice che se si salta da una subrouti-
senlenza ner crri l'istrrzione senrrente non e cono- ne a un'altra, bisogna andare all'inizio di questa e non
sciuta, e si impiega un altro ciclo per ottenere la nuova a una parte interna della medesima, per non rompere
rstruzrone. la struttura del programma rappresentato dall'organr-
nr2mm: l- n<ì <a

golo inizio - modulo I golo mezzo-modulo


...........................-.-.-.-....-...-,,.. .J
i si considera il

se* ,9ltS nrimn o<omntn

inizio-modulo I islruzione I inizio-modulo I is*ruzione I dove l'etichetta


istruzione 2 istruzione 2 1è all'inizio di
islruzione 3 islruzione 3 una subroutine
metà-modulo I islruzione 4 metù-modulo I islruzione 4 non c e ne5sun
islruzione 5 islruzione 5 problema; il pro-
goto meto-modulo I soro i{:!g.:r-:*!-"-."1--=_i
kt^*- -,À -^ -^
islrvzione 7 islruzione 7 me net seconOo
istruzione 8 soto !ni:i-"---n,9-d-U|-"'.!- .. I pcemnin l'oti-
goto inizio-modulo I soto '-'t":_ta:n..S{qJg. !-.. .. .ì -l^^++-'t
Lr rcLLd I g
^ ^-.+^
porLc
di un'altra sub-
Utilizzo corretto ed errato dell'istruzione qoto
routine.

Sep$&ewwrq*
fistruzione NOP

ffi
ffi d rstruzione nop e una delle
W qomnliri
nir r JEr
Pru rvilLr À.
uo uLilr41drc,
' '+ili..-"^ c
^ ORG 0 ORG 0
ffiffi
goto rNrzro goio tNtzto
ffi nello stesso tempo e quel-
ffi
ffiffi
la meno ulilizzala E sem- ORG 4 nop
lW plice perche non ha para- goto INTER nop
metri, e quindi non puo essere impie- nop
gata male, ed anche se fosse ulilizza- goto INTER
ta in modo indebito, l'unico inconve-
nipntp r-hc notrphho nrovocare Sareb- MEMORIA DI PROGRAMMA MEMORIA DI PROGRAMMA
be una perdita di tempo equivalente
00 00
ad un ciclo di istruzione, dato che non
fa niente e non varia nessun f lag. Nel 0l 0l
suo codice OP le due x indicano che
in orrella nosizione si oossono ave.e 02 02
zeri o uno indistintamente. 03 03

fi5fleqF$; 04 04
{*ru à.'gsYkr.jr3#Fi f, ru#s 05 05
La natura stessa dell'istruzione rende
difficile immaginare un caso in cuisia
necessario il suo utilizzo. Alcuni pro- Modi diversi di posizronare le rstruztoni nella memcria di programma
granrmdtor
^"-,---+^.; l-,,+ili---
ra uuilzzano In sosltlU-
zione della direttiva ORG che, come ricordiamo, manda metro. Come abbiamo gra visto, in questo modo si
al compilatore l'indicazione che la posizione de l'istru-
ottiene di mettere all'induizzo 0 la prima istruzione del
zione successiva è all'indirizzo indicato dal suo para- programma, cosa necessaria, dato che quando ìnizierà
l'esecuzione dei proqramma, è lì che si deve
lrovare la nr,ma istrr rzigng. Abbiamo anche
PARAMETRO PARAMETRO rrn altro indirizzo sneciale nella memoria dej
MNEMONICO t2 codici. l'induizzo 04. ln questa posizione, il
nrn.trqqrìrtr \/À À .o(.Are la rouiine di Servizio
nop dall'iniarrr rnt nrr:ndn <o no
r! nrnnlrr.a
vrvuuLL
rrnA
urrv,
in mndn rho il srn nÒ<ln nón nnq(a o((oro
Operozione: è un'operozione che non occupato da nessun'altra istruzione.
Nell'esemnio si
-' mostrano due modi di rea-
fo nullo. ' 'Y'"

1
lizzare questo, utilizzando l'istruzione nop e
Cicli: I
con la direttiva ORG. Anche se il risultato
Codice OP: 00 0000 0xx0 0000 nella memoria dei codici può apparire
diverso, l'esecuzione del programma e la
Flogs: nessuno
stessa. In alcuni casi, inoltre, si utilizza que-
sta istruzione nei cicli, cone metodo per
Ca ratteri sti ch e del I' istruzi on e no p
costruire delle routine di temporizzazione.

Sw$$wsww*
Programm azione:
struttura di un programma
.:,zi$Èi*,, uando si affronta la realizzazione di un pro- :
ramente differenziate. La tabella mostra in modo sche-
.: granî"na, sia esso in assembler o in o.ra siasr mat co queste parti. Spregheremo per prima cosa alcu-
gd
.'""."-... ahro linguaggro di orogranrmazione, molte ne convenzioni utilizzate nella realizzazione di queste
À1+ volte non si sa bene da dove iniziare, soprat- :
ni.rntinp lrlpll.. rninnna di sinistra scriveremo le eti-
-!t:::
chette delle rouiine e delie subroutine, nella colonna
essere molto ;tile
d' piantina che ci
creare una specie ranl-rrla
lEt tLrorg c.r,\tòrò6^
)L j vgrgr ru la
rc icl-r rzinniil \/oró
r)Li uzrur vqrs ó nar nrn-
^rAnriors usr P' v
s PrwPr
faciiitii||avoro,perevitareerroriodomrssioniindeside- gramma, che devono rispet"tare l'esatta nomenclatura
rate. prevista per il nostro microcontroller. Infine, neìla
Orro<t:
YriLJLu
ni:ntin: ", Ottiene faCilmente, datO
Y's' I r,, ,u Che Un colonna di destra, scriveremo i commenti ed i nomi
programma assembler, e composto da varie parti chìa- che vorremo dare alle varìe sezioni del oroqramma.
,,
i
: ilsI P=tip di procesore
,.

:: RADIX Sistemo di numerozione


È

c
volore Elichette
!l

ORG 0 Configurozioni
goto etichetto inizio
ORG 4
g0f0 rouline-inler
ORG

eftheilo-inizio istruzioni

Configurozione

i ciclo Progrommo principole

Progrommo principole

Rouline interrupt

r0uflne-rnîer Rouline di hotlomenfo dell'intenupt


a

,
Fine
L

Direttivo di fine progrommo

parte di LulLo tl progrdm*2 ,s,-pilatore per il PIC obbligatorio opzìonale e mullrplo

{ì:.,:r. .:.i:- .:l.r.,I.r; q.


ìì-t, ìì,ì, t..,.,r,.,..u.,,t..i-'
,:',':'

:raìiìtì

':,ii
.ì:ìììì

tl *
l 1;r{j lÌì:i
il5t P=lót84 i:i !,-il
INCTUDE "Regx84.inc" (i inizi: rnn dirottivo nor il nrnroc(^ra
INCI.UDE "Mocros.inc" in pratica, "ordini" che il comprlatore
dovrà tenere conto ai momento di
IED EQU I
"^-1,--^"^ c |llil^
t(ót)LLdt |tc ^.-'-l^-i'-.1^|dtc/
c)dueLil d. ^-.+;"^
iJdt Lrtc
IAMPEGGIAIORE EQU 6
0R0 0
dalle so"genti. Queste direttive non si

g0î0 rNrzt0 traducono in istruzioni, dato che non


ORG 4 vot il tu -r
ou uLLuPctc indirizzi della
golo INTER memoria di programma. Nello sche-
tNtzto ma appajono due dirett;ve molto fre-
coll CONTIGU nrrpnti :nrhp sp np esistono molte
ovonti
altre: la prima informa del tipo di PlC,
e la seconda determina il codice stan-
crcL0
dard dei dati, cioe se i dati saranno in
GOTO ctcto ficlo infinilo
CONIIGU
esadecimale, decimale o in binario.... ',::l:

bsf STATUS,RPO
Cone abbiamo visro in arcuni ese'npi,
movlw b'0000000t' di sonrritn :rriri:nn ic definizronr delle
movw{ TRISB otirhottp nor riforirei: roni<rri rho
movw b'10000' sono valori, con un nome al posto di
movwf TRISA
un numero.
movw b't0t | 0000' ;INTERRUPI TMRO E RBO ABILIAN Nella zora di configurazione si in,-
movwf rN1CoN
zializzano i renisîri cl-e si utilizzeranno
movlw b'01 I t000' ;TMRO RA4;INTEFRONTE Dl SAUTA
nel nrnnramma Orrc5f6 si fa nella
;IMR0 SENZA PRESCATER

movwf OPTION.REG
zona chiamata "etichetta inizio" e
kf STAIUS,RPO
quesra configurazrone si realizza con
bcf PORTB,IAMPEGGIAIORE ;Cl ASSlCURl/ritO CHE SIA SPENIO
istruzioni normali. Prima di questo,
bcf PORTB,IED considerata anche come conf ig urazio-
movlw ró ;10 lMPUl.Sl PER lL I|MER ne, la direttiva ORG indica al compila-
movwf TMRO
tore, con differenti parametri, dove
refurn
deve collocare ie d''ferenti parti del
INTER sl0p ;ROUTINE Dl INTERRUPT. 5e chiomofq
programma nella memoria dei codice.
btfsc tNTCoN,T0tt
Nella posizione 0 e obbligatorio met-
g0f0 IMPUISI

btfsc INTCON,INTT
tere la nrima istrr rzione che dovra
t,,l,l,
,l+- ltu||diltrcILc
c)>ctc c)cguttd, ^^"--l-^^+^,,^/^+iut' cLt-
reilie
chetta come inizio, start, etc., o ia
BUMPER Lr ilor rdLo oa ^,,^-+1
-l^i-*-+- Liuc)Lc.
bsf PORTB,I.ED ;ATIIVIAM0 lt LAMPEGGIATORE Nella posizione 4, come vedremo
kf INTCON,INTT ;CANCEttllrlvl0 lt ttAG Dl INTERRUPT ^i,, -.,-^+i t-i-^^^- PU l,in,zio della
Pru cvol rLr, ur)w9r ro ^^rre
retfie
rorrtino rhp no<tir: l'intorrr rnt il vpttn-
re di interrupt.
|MPUr.Sr

bsf PORTB,IAMPEGGIATORE
ll modo ideale per progettare un
;AfTlVlhlv{O IL I.AMPEGGIATORE
r aE ci+r
)lLUClC nlnnn fLULLv
uvvv rrtfn
kf INTCON,TOIT ;CANCEII|AMOlL FIAG Dl IMERRUPT P,U9lOllllllO
n, rln+^
rLU Imonzinnrtn
I rcr r4rvr rqLv in| nrarodanzr rzq
il
re#ie vuqr PrqLcuqr -
un ciclo da cui si chiamano le routines
TND che realmente real,zzano il lavoro,

a
normalmente in modo ciclico.
Questo è cro che normalmente è
Programma esempta che mostra diver>e parti Lipiche
otirhott:tn.^mo nr^r
-Jramma pflncr-

6+*$*****1.*
figurazioni, il programma principale e
la direttiva di fine programma. Le uni-
LffiffilT- * ::#.':":
esg,4;trtrllffi!;J!iriFè1É-H6&d.-r4-!ir-r:ea€3?q+l:?Éi;a "' -róril che parti che devono essere uniche,
ISfEn stop ;RAUTINE Ol IilTEBnUZt0HE-Se p
sono: il programma principale, la rou-
tine di trattamento dell'interrupt e la

Coúpilirg ESEIiFI0 -ÉSl,l:


fine del programma.
Connand line: "C:\ARCHIU^1\flPLCB\WASflUIH-EXE lp16îA4 lq C:\AfiCHIU-1\flPLAB\ESEHPIO-ASl"
Uarninq[285] C:\CECHIU-1\HPLAB\ESEHPI0"ASil 4
Uarning[285] 4 : Found directiue
directiue in
in coluan
coluan 1- (LISI)
1- (LISI) l
Sarning[287]
ErrBrlll3l
ErrBra113l
C:\0BCHI{r1\flPLAB\ESEf{PI0.ASl'l 6 : Found label after coluno 1. {LED)
C:\AECflIU-1\HPLSB\ESEHPI0-ÉSX 12
C:\AECÍIU-1\ilPtgB\ESFHPI0-ASx 12 : synbal
îilnhnl not
not preuiouslg dFfinpd (IílEfl)
nrFuinr<lrr defined lTllFflì fl:trffiF{# ffffi&?}"il*
tarniîg[267] C:\nÉCHIU-1\HPLîB\ESEhPI0,ASr l6 : Fsund 1abe1 after colunn 1- (auaoti]
Error[113]
Errgrfl22l
C:\nBCHIU-1\ilPLAB\ESEHPI0.AS]l 17 : Sgnbol not preuiouqlg defined (8ucle]
C:\AfiC$IU 1\HFLÉÉ\ESEHPIo,ASfl 2s : Ilfegal opcsde (stop)
ll programma compilatore mostrato
ErrorÍ125f (f0F encountprecl before EHD .AmarrE a<amnin
sjs rrPrv rnntiano
lvr rLrgr rE trLurtti
LLt nli ola-
C:\neCHIU-1\ilPLAE\ESEHPI0-ASf 22 I I lcgal condition ol LVr vil Etc-
I4PLAB is unable to find output file "ESEhPl0-HÉX"- menti visti, anche se la sua struttura
Build failed -
non è perfettamente uguale allo
schema iniziale - così come abbiamo
detto - la soluzione ad un problema
non è unica. Si inizia con tre direttive
una di queste ripetuta. In seguito ven-
Uir;adl ' l1E :
gono le definizioni delle due etichet-
+^
LE. tr--^^^l^ l- LUr il ìVUrO4rUr rC, dUUrd-
I OLqr rUU rO -^^{i^,,"--:^^^ -Al,-;-
mo una parte che non effettua diret-
Modo di awiso degli errori da pane dell'assembler.
tamente fino a quando non si chiama
una routine per realizzarla (CONFI-
pale; anche se e una buona forma di programmazione, GU), nella quale si configurano 4 registri, e si inizializ-
non è l'unica, e comunque, non è obbligatoria. -îh^ +r^
ZOIIV
.,-"i-t-;li |LE^ ^lrole ,,avanti,, e
LIC VOlloulll. L
,,StOn,,
rLvV SOnO Una
PqrvrL
ln seguito troveremo le differenti subroutines, da cui specie di subroutine chiamate macro, che si studieran-
si rientra con l'istruzione retlw o return, a seconda del no in sezioni successive. ll programma principale consi-
caso, e anche la routine di trattamento dell'interrupt. Si ste unicamente in un ciclo infinito da cui si aspetta ad
termina con la direttiva di fine del orooramma END. uscire mediante interrupt.
f interrupt inizia con l'etichetta INTER, dove, al con-
trffi #fr ffi eiljli Í4 e ;?i g tr€
g}1$#
trario di cosa puo apparire, si lavora con una sola rou-
Tuttavia, non tutte le parti sono obblìgatorie, per cui tine di trattamento dell'interrupt anche se e divrsa in
puo succedere che qualcuna non ci sia. Aì limite pos- vari rami dovuti al fatto che possono esistere diverse
siamo iniziare con la direttiva LIST, non definire etichet- cause che la provocano. La fine del programma è
te, lavorare con gli induizzi, mettere solo una ORG con segnata dalla direttiva END.
parametro 0, che non configuri nulla e non utilizzare Se siete stati canari di idpntilir:ro nnngnS lgllp
subroutines. Obbligatoriamente dovremo terminare n:rti :nche se ron oralcuna di esse non abbiamo mai
l-,.^--+^ i^
con la direttiva END. ldVUIdLU, -:^+^
>lete ^::
9ld lll .,-À^
9ldUU
Ài
Ul r^ali??ar^
ledllLLdle llil ,,aqf
V(rJLrv66 566_
prv

Comunque questo non e abituale, poiche lo sche- gramma, che sara sempre piu complesso, man mano
ma in genere viene utilizzato al completo e molte di che andremo avanti.
queste parti si ripetono diverse volte. L'organigramma
mostra oltre all'ordine delle differenti parti di un pro- {rqJ' .'}i i**! *q#SffiiÀf-:i.l1
gramma, quelle che possono essere saltatg g 6rrrollo rho I programmi sorgente possono essere scritti con qua-
oossono essere rioetute. lunque editor di testo a caratteri ASCll.
Se SentriamO le {1p6ra rrodiemn rho nr rallg 691{;6lj Guardando nella struttura che segue, vedremo le
indicano la sequenza delle diverse parti. Le f recce a sini- divprcp n:rti rhp
rr nÒqcono
PvJJv formarlo.
stra indicano la possibilita disaltare il quadro a cui gira- Classificheremo ora il suo contenuto in altro modo,
no intorno, passando alla parte seguente. Le frecce di rinò rnmo finn nli d:ti rho n^((^nn.^nîonor ,-, e ognuna
destra, che puntano verso l'alto, indicano che la parte di queste parti. Così il compiìatore, durante I'esecuzio-
ouò essere rioetuta tutte le volte necessarie. Così vedia- ne, verificherà che idati ditutte le linee delfile siano di
mo che sono obbligatorie alcune direttive, alcune con- uno di questi quattro tipi: etichette, mnemonici, ope-

SwS4*ealus*w*e
randì o commenti. Questi dati devo-
no assecondare a norme di scrittura e movf movf
a norme di posizione relativa che U5T U5T
ovonli ovonti
occupano gli uni rispetto agli altri.
l-nma rannl: nonor:lo nor 1r rtli eticheito I movf Etichetto5movf
Etichetto2:movf
ouesti la loro scrittura non deve
iI LJ)
4trtr tót _etichetto3? Movf
^--^.J^-^
CLLCUCff dLLCt| -,,11-
--"^++^.i )Uild -+^---
)LE))O
Eticheilo 4
lrnea.

ilYgfrsil3"Yffi Mnemonici, direttive e chramate a macro corrette e sbagliate


Una etichetta deve iniziare nella
colonna 1 e puo essere seguita da
due punti (:), spazi, tabulazioni e salti
in linea. Possono contenere fino a 32 movf STATO,W movf STATO,W
caratteri, che possono essere alfanu- etichetlol movf STATO,W STATO,W
EiichetÌo2:movlw 9 eticheftoó movf ESTADOW
merici, e includere un tratto basso e
tl segno di punto interrogativo. Però
il primo carattere non puo essere Operandi formulati in maniera corretta e scorretta
nrrmorirn no di connn
Come standard si differenziano le maiuscole e le dalla colonna 2. Se l'istruzione segue una etichetta
minuscole, di modo che l'etichetta "ciclo" e "ClCLO" nella medesima linea, deve essere messa tra due punti,
siano differenti, a meno che non si affermi il contrario spazi in bianco o tabulati. Si possono scrivere in minu-
mediante un comando speciale. Se si utilizzano i due scolo o maiuscolo indistintamente.
punti per terminare una dichiarazione di una etichetta,
nrro<f
vuLJr,
i nnn (nnn nrpci rnmp n:rtp doll'ofirhorr,a m:
I
*Fíf{i\ri *9
come un operatore. Nella figura le etichette definite Devono essere separati dai mnemonici da uno o piu
(o ul lo icl-rr
alla sinistra sono corrette, e quelle a destra sono sba- cn:zi I u
)pdz tóuuloLlvl ll. Jc rrn:
n trhrrlrzinni rzinnolg h:
l)Ll uzlvl I lo nirrdi rrn
Pru ul ul I vPq-
^nó-
nli:to | <fo(<n <i nrrn diro dol roctn donli ocr
-'r" --''ffiPl rrndn nrrocii dorinnn a<(aro qol12r:r n: rrn: v rnnl:
^

li:$g:ffi##:{-i .... lltsi.


'''lfs

Gli mnemonici delle istruzioni, le direttive del compila- rttn nrrolln rhp ci nnno dnnO- rjn
Tr nlnt6
r
p,,irnnl:
vll9wlo /\r/\
-
tore e le chiamate alle macro devono inrziare a partire è trattato come un commento fino alla fine della
linea. Se il commento occupa più
di una linea dovremo mettere un
eiicheilo I Etichetto5 punto e virgola all'inizio di ognu-
elichetto2: ?etichettoó n: nli
Itd ut a<<o (eamo
c))E rLvI nncci:mn rrado-
tq pu))ratrr(/ vcuc-
Tetichetto ra nonli o<omni n ir:fi\
_etichetto3? rrLVil LJL',ry, i lLoLl/.

Etichetto 4 Quando il compiiatore incontra


prrori di nrresto tinn ci avvisa e
ì1'."-..--..-* ,.*;.-*.. ,,*-.......,*.."*.,.",*'.,.,,,,,,J
I
non nonpre il filo che doveva
Etichette formulate in maniera corretta e scorretta
^-^^,,i+^

eticheilol movf STATO,W ;movimenlo STATO,W mnemonrco


Etichettq2:movlw I ;movimento di un etichettoó movf STATOW ;tutfo
;volore letterole sboglioto

Commenti formulati bene e formulati male

Sw#*:sqr{:svaF
Scheda detle istruzioni :
f istruzione BTFSC

M$%, uesta e una delle istruzioni chiamate "istru-


ffi 'ffi zioni di salto condizionato" che ha il PlC.
ffi

ffi ffi Anche se tante consonanti di seguito scit* fu:*


W ffi appaiono difficili da ricordare dato che non
qffieei#W&b
s+
s! csegu* s* b= I
hanno significato, in realtà rispondono alle
sigle di quello che fa: testa (t) un bit (b) di registro (f e
la denominazione che stiamo dando ai registri in gene-
rale. prima di sostituirla con il vaìore corretto caso per
---^\ C^ )dlLd
Ld)U,/ --r+- \)/ -^ C: ZCrv
/-\ )U -.ro (c)
\!/. Ouesto
\<ULJLv L niuttosto
salto e
JurLv V un
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.

PARAMETRO PARAMETRO
MNEMONICO I 2 Schema del comportamento dell' istruzione btfsc
a seconda del valore di un bit.

.--l-.:l".:":"""--i""-r . ""!"-,-.-".-i
tr$*:ffi$3X il*ru fK-Y*tUXg#rufr #?$:Sfl
Operozione: nel coso che il bit segnoloto dol
registro obbio volore 0 l'istruzione Dobbiamo tenere conto che quando si
compie la condizione e si esegue il salto, si
seguente è ignoroto e nel coso
esegue un'unica istruzione, pero se la con-
confrorio no.
Cicli: 1-2
dizione non si compie, si eseguono
entrambe le istruzioni perche dopo la
OP:
Codice 0l lObb bfff ffff prina arriva la seconda. Questo e indicato
Flogs: nessuno
nello schema generaìe della frgura, dove le
lrareo r:nnro<ont:n, ta sequenza cne
, -rr, ---,,.-,,o

senronÒ le ìsf rr rzioni in entrambi i casi. ì

due grafici mostrano la stessa cosa, il


prìmo nella forma che avrà il programma e
Caratteristiche dell' istruzione btfsc
il secondo in forma grafica.

$w$*wwww
Sch eda delte istr uzioni :
f istruzione BTFSS

$ analoga alla precedente. Seguendo dì


nuovo la sua sigla vediamo che cambia solo
l'ultima lettera, questa istruzione testa (t) un brlss STATUS Z
--
( ETICHETIA | si esegue se b-o
bit (b) di un registro (f) e salta (s) se è un uno solto se b='t
\-
(s e l'iniziale in inoìese della narola "set" o "oto ETICHETIA 2 -
goro

mettere a uno). ETICHETTAI decf CONTATORE,F


goto ETICHETTA 3
Per quanto riguarda i cicli di istruzione si comporta
come l'istruzione orecedente. ETICHETTA 2 incf CONTATORE,F
goto ETICHETTA 3

fl5*iffi pg **r* ilxsY$cqixg{:*h$ffi $3sFss ETICHETTA 3

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 variato
in modo sostanziale risoetto al caso orecedente.

PARAMETRO PARAMETRO
Schema del comportamento dell' istruzione btfss,

btfss :j, -..- ..... - -,! ..:. *,.-. - i .-., .. .. ..-l- ---..-"i
a seconda del valore
di un bit, mostrato con un csempro.

nel cqso che il bit segnololo


dol registro obbio volore l Questo non è dovuto alla funzione che
l'istruzione seguente è ignoroto realizza l'istruzione btfss tpotrebbe essere
e nel coso controrio no. così anche per la btfsc), ma dal fatto che
f ra tutte le istruzioni che si potevano utiliz-
1-2 dana l: htf<< lo htf<r) o qtat: qrclt; la
zaro uvyv
ot 1 l bb bfff ffff
4q,r

goto.
nessuno 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
Ca ratte r i sti c h e d e I I' istru z i o n e btf ss
delle istruzioni btfsc e btfss.

Sw**q*wwrm
Programm azione:
strutture di control,lo
a programmazione modulare e strutturata
diminuisce il costo dt realizzazione e manteni-
mento dei programmi, e aumenta la sua affi-
Dcre mes:oggi di benvenuto
dabilita e leggibilita. Per questo si costruisco-
no moduli o pezzi di programmi seguendo
certe regole. I moduli a loro volta, sono formati da €hiedere N" degli olunni

strutture, le quali possono essere di tre tipi: sequenzia-


li, condizionali e ripetitive. L'organigramma della figura
a lato, rappresenta un programma con tre tipi di strut-
ture, che sono quelle abituali.
O ff"18'L No

Vo ollo finerlro Prende il N' degli olunni


$Yffi #YT9J ffi €: Sil*tj ile*HX&Lg "Non si DUò fore lo medio"

Le strutture sequenziali, o concatenate, si costruiscono


Chiede il voto medio del corso
scrivendo le istruzioni nell'ordine in cui piu tardi saran- ln(rmenlq il (onl,otore delle medie

no eseguite, sarebbe a dire una dietro l'altra.


Graficamente si puo rappresentare come una serie Contq*ore delle medie = Confqtore
r{i nrr:dri in <o- delle medie / N' degli olurni

quenza, ognuno
istruzione I dei quali e un'i- Vq qllq finestrcr
"ll voto medio dello clqsse èr"
struzione. vqfore del <onlotore di nedio

istruzione 2
Le frecce di
unione segnano
Ia sequenza logi- Dore mes:oggio di uscifo
islruzione.. ca di esecuzione,
nella quaìe non
istruzione n possiamo omet-
+^r^
LUtC ttc))utto Organigramma di un programma con tre tipi
[.]lì.r,ì x 6 i strutture di LUr
di 5LruLLuteut
ur controllo.
ìììrì,ììì.
:ììiìì l azlone. J -___,-*
P annra<Ònfa7i^na

delle strutture sequenziali in forma grafica

fo lso vero
condizione

$€$q ilJY-r'à$ w$i fl # ru ffi xxx* rueLs


Se lo condizione è vero
blocco di blxco di
Normalmente non e sufficiente porre istruzioni 2 istruzioni I A,LLORA eseguire il blocco I ii
ALTRIMENTI eseguire il blocco 2
le istruzioni una dietro l'altra, nel caso
1

in cui esse dipendano da eventi ester-


ni hisnnna notpr nrendere una deci- blocco di
isiruzioni 3
sione e sceoliere- -"
un tr'
nercorso fra due
nossibili F orrello che viene denomi-
Ra a a resentazio ne del le struttu re co nd izi o n a l i I F-TH EN- ELS E.
nato struttura condizionale o alterna-

Ssp$$wwr**
cur dobbiamo evitare questo schema,
condizione e per questo la cosa migliore e tra-
sformarlo in una struttura condiziona-
bl*co di SE lo condizione è vero l le gia vista, pero in forma annidata.
istruzioni I
- ii'i,T:::':::l::.::' . .i Nella figura corrispondente viene
rndicato questo annidamento con un
blocco di esempio. Si vuole determinare qual e
islruzioni 2
il colore scelto fra tre possibili. ll

primo impulso è chiedere direttamen-


Rappresentazione della struttura condizionale IF-THEN-ELSE con un solo ramo
te qual è il colore, restando alla prima
figura.
tiva. che in pseudocodice si conosce come lF-THEN- Se al posto di questo immaginiamo il gioco del
ELSE se la condizione ha solo due ramificazioni, o "vero o falso", dove Ie sole risposte alle domande pos-
CASE, se la scelta è multipla. La decisione puo essere sono essere "si" o "no" , andiamo alla seconda strut-
determinata dal valore di una variabile, per una chia- tura, in cui il risultatofinale è lo stesso. Anche se abbia-
mata di un evento esterno, ecc. mo fatto due domande, l'annidamento puo essere
ll grafico indica i due cammini possibili di una lF- largo quanto vogliamc.
THEN-ELSE. Come possiamo vedere
all' nterno di una struttura condizio-
nale puo esistere, a sua volta, una gngro
struttura sequenziale, che possiamo
sostituirla con il suo schema. nero

A seconda del valore della condi-


blocco di blocco di blocco di
zione, si eseguirà il blocco di istruzio- isiruzioni I isfruzioni 2 istruzioni 3
ni 1 o 2, però mai entrambe. Anche
se l'esecuzione del blocco di istruzio-
blqco di
ni 3 non e pertinente alla struttura istrszioni 4
condizionale in sé, è stato introdotto
nel grafico perche dopo una biforca-
zrone si ritorna sempre ad ;n pro-
gramma comune, anche se alla fine, colore bisnco Ir.b
per termínare in un unico punto.
Potrebbe succedere che manchi blocco di
istruzioni I
uno dei blocchi di istruzioni, in que- colore nero Hg colore grigio
sto caso, a seconda della condizione,
si escnrrir: rrn hlorro di istruzioni o blocco di blocco di
istruzioni 2 isiruzioni 3
non si farà nulla. Nella figura in alto,
e stata rappresentata la mancanza
del blocco di istruzione, nel caso di
"condizione falsa", pero potrebbe blcco di
Ístruzioni 4
verificarsi anche il caso contrario: non
fare nulla se si compie tale condizio-
ne. Se lo condizione I è vero
'i
ALLORA eseguire blocco
Potrebbe succedere che la decisio- ALTRIMENTI
no uu
rrL ri: nrondoro <i: lan
nnnrrro r+r d
lcgcto r uuc
Àr rn
vrLrruLrL rrvr Se lo condizìone 2 è vero

,_., ..-r_,-_
<olo ricnó<tp m: :d Jn nun'ero ptu
I
ALLORA eseguire blocco 2
ALÌRIMENT| eseguire blocco 3
alto, come succede nel CASE. In que- :

sto caso non abbiamo una traduzione


Esempio di trasformazione di una struttura CASE in varie IF-THEN-ELSE annidate
immediata nell'assembler del PlC, per

Ss#kwww
m,
F,:-,
W:iai..:

ì!::lìat:ia :,1

l11
d;:: -

&it. .
&F
íi.
m:
ffi*.'
F. FlSF annidate e nrran619 si vuole ana-
lizzare un blocco di istruzioni solo se
À1,* è giorno
Ng fo bello si compiono alcune condizioni nello
#H_:
stesso tempo. In questo caso, come
tr: nel precedente, dobbiamo evitare oi
Wb,' rímongo o coso vodo o posseggio
fare una domanda, e al posto di que-
ffi. sta, una volta verificata la veridicità di
R}:
ff.'
w; una condizione, formulare la doman-
!::{'-
fl: uc
-J - -^^, ,^^+^
)cgucrLc. ,^-+
rluc>rO
^, fappfeSenta
t l'implementazione di una AND logi-
.,: ca, Le altre operazioni logiche, inol-
a
T".,* NO e grorno tre, possono anche essere rappresen-
Í$..
k"' tate con strutture annidate.
s{,
*&{il,t:,:::. SYffi &JYYIJ ffi K ffiXPffiYXYXVg
;

ùto fo bello Come indica il nome stesso, le strut-


w"" ture ripetitive servono per ripetere un
w\
lss!*i:: .
determinato numero di volte un bloc-
$95:l::ì:l rimcngo o coso vodo c posseggio
co di istruzioni. Nuovamente, quindi,
*tìrì'::.
À!ùì:::irìì :.'
all'interno di esse devono essere con-
ffilì,.', tenute le strutture sequenziali. ll
#ffii:'., numero di volte che si ripete il blocco
ffi}li:,.r,
puo essere noto, o dipendente da
ffiq{li:
::-::t:- - :
Se lo condizione 'l è vero una variabile o da un evento. A
:: ALLORA
seconda dell'autore consultato, o del
Se lo condizione 2 è vero
; ALLORAeseguire blocco I linguaggio di programmazione che si
H
w{
ALIRIMENTI eseguire blocco 2 prende come riferimento, il nome di
.1 ALTRIMENTI eseguire blocco 2
*.,aa:a:::,,: questo trpo di struttura varia, di
ilà:ì:ì,',: modo che conviene f issarci sull'essen-
ffii;l;i' za di ouello che fa niuttosto che sul
ttt.:.:a:,-, lmplementazione dell'operatore logrco AND con strutture IF-THEN-ELSE annidate
nome che riceve. Se il numero di
volte che deve essere eseguita un'i-
*iìa,.,..
Osserviamo che in questa occasione le alternative struzione e fisso, stiamo parlando di un ciclo, previsto
ffif:'.
4glifl. vere si trovano alla sinistra della figura, perche lo sche- nella maggior parte dei linguaggi di programmazione,
w-...
w: ma ristrltarte e nirrrnrpglo da vedere e da realizzare. e che di solito si chiama FOR; si ripete qualcosa per un
ffi.i...
L'altro caso in cui sono necessarie le strutture lF-THEN- numero di volte Anche all'interno delle strutture ripe-
ffi;
àli'''rì:::l:.'
?ìl!$iì::l Strutturo l Strutturo odottoto Shutturo Shutluro
&:ri:::' in pseudocodic" i per il compilobre del
à.
6t:
::-"rvl-:-*::: _..i . ..t_:::::_T:::":::".*l T _
PIC

ruK numero vofé uu Contolore = numero di volîe


dàl; lslruzione 1 Etichefo lstruzìone l WHILE condizione vero D0 Chiedere Se lo condizione è verq
i: lslruzione 2 lstruzione I Isfruzione I ALLORA ondore o Etichetto
lstruzione 3 lslruzione 2 lstruzione 2 ALTRIMENTI ondore ollo Fine
F"-
lstruzione 3 lstruzione 3 Etichetto lstruzione 1

irtrr.ion. n lstruzione 2
{..':. END FOR iriru.ion. n iitrurion" n lstruzione 3
&.: Decremenlo conlolore
:3:: Se il volore del contotore è 0
.
tsruztone n
ALLORA vo ollo Fine
ALTRIMENTI vo q Etichetio Andore o Chìedere
*{| Fi ne ENDWHILE Fine

w{ Struttura FOR con Struttura WHILE-DO


91"
ffi
&€i,
' pseudocodice e suo adattamento per il compilatore del PIC in pseudocodice e suo adattamento per il compilatore del PIC

ffi
ffi
$E*..
S*$&nrwre
&r":
ffii..
@'
Slrutlurq i Strutturo odqltqfq
Strulturo
in pseudocodice
: Strutturq odqllqtq
il compilorore del PIC r t"l::'
i
"". "-:::-t""d:-"
i:
REPFAT
i
i
T: :l ::-":1"::"
Eliche*o
DO I Eiichetto
i lstruzione I
lslruzione l lstruzìone I lstruzionef I lstruzione2
lslruzione 2 lstruzione 2 fslruzione2 i lstruzione3
lstruzione 3 lstruzione 3 lslruzione 3 ...
lstruzionen
irìr".i."" iiirr=io.". rstruzione. i
" Chiedere Se lo condizione è vers Ch;"d"." Se lo condizione è
'ero
WHILE condizione vero UNTIL condizione vero
ALLORA ondore o Etichefro ; ALLORA ondore o Eticheito
ALTRIMENTI ondore ollo Fine ; ALTRIMENTI ondore ollo Fine
F ine
: Fine

Struttura DO-WHILE Struttu ra RE PEAT-U NTIL


in pseudocodice e suo adattamento per il compilatore del PlC. in pseudocodtce e suo adattamento per il compilatore del PIC

titive si ulllizza una condizione oer controllare la fine WHILE è che nella prima se non si compie la condizio-
del ciclo, ma non deve essere confusa con le strutture ne, le istruzioni non si eseguono. Nella DO-WHILE inve-
condizionali. Quando si deve compiere una condizione J-i^^i l-
ra qi oqonrrnnn lo iqtfl-ztonr pilmd ,,^l+-
ra ^.;-- vorrd, e^ se sl com-
per uscire dal ciclo si dice che è una WHILE-DO (men- pie la condizione, si continuano ad eseguire. La
tre si compie una condizione fare qualcosa), o una DO- REPEAT-UNTIL è simile alla DO-WHlLE, dato che il bloc-
WHILE (fare qualcosa mentre si compie una condizio- co di istruzioni si ripete almeno una volta, e continua a
ne) oppure una REPEAT-UNTIL (fare qualcosa fino a che ripetersi fino a che non si compie la condizione. Come
si compie la condizione). E infrequente che i linguaggi possiamo osservare, se si comparano gli schemi, le dif-
di programmazione abbiano le tre varianti allo stesso ferenze sono nella negazione della condizione, dato
tempo, dato che una si può trasformare in un'altra. I che nella DO-WHILE si suooone che sia vera e si esce
tre tipi di cicli possono tradursi facilmente nell'assem- quando si converte in falsa, e nella REPEAT-UNTIL si
bler deì PlC. La differenza fra la WHILE-DO e la DO- considera falsa e si esce 0uando dìventa vera

blocco blocco
di islruzioni di 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 compongono
il mnemonico di questa istruzione ci indica- z- decfsz Í, d
'
no la funzione che realizza. La decfsz \\-*
I '- ---
ictr rzìana" I
isiruzione 2
*-l s eseqr,r si; f i:0

decrementa (dec) un registro lf) e salta (s) :


:
se il risultato è zero (z). ll risultato del
decremento può essere memorizzato nello stesso regi- f-t +w
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. È o
Forse ricorderete un'istruzione simile chiamata btfsc,
in quell'istruzione per fare riferimento allo zero si ulilizza
la c al posto della z. Questo perche esiste una differenza
sostanziale, 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 Schema di come si comporta l'istruzione decfsz, a seconda
istruzione, e nel caso in cui il salto venga eseguito, la d el ri su ltato del l' operaz ion e,
prendendo come secondo parametro il valore d = 0.
sua esecuzione imoieqherà due cicli anziché uno.

€:%ffi$!qPg
il#ru $-'gsT$ail$Kx#rdffi #ffiilflsx
OPERANDO OPERANDO
MNEMONICO FONTE DESTINAZIONE Lo schema rappresentato ricorda
quello gia visto per l'istruzione btfsc,
decfsz anche se con sostanziali differenze. La
piu importante, per quanto ci riguar-
Operozione: decremenlo di uno unitò il
da, è che l'istruzione non solo verifica
contenuto del reqistro f. Nel coso
rrnI rr:lnro
ur nor uELtuEtE
vorvrq pgr ca )ctLdtc
r]oridoro )c .:l+..^ u
^
in cui il risultoto"di ouesto
oecremento sio 0 l'istruzione meno, ma realizza anche un'opera-
seguente è ignoroto, e nel coso zione, il decremento, e salta a secon-
controrio no. Se d= 0 il risultoto da dpl ricr rltato .ronor:tn JLSo VL'
npr l:
'u
del decremento si memorizzo nel funzionalità del programma, ci inte-
registro di lovoro W e se d-l si ressa solo l'operazione di salto, non è
memorizzo nello stesso registro f. necessario memorizzare il risultato,
Cicli: 1-2 quindi lo porteremo nel registro di
CodiceOP: 00 I0l I dfff ffff lavoro, senza eseguire ulteriori opera-
Flog: nessuno zioni su di esso. La stessa funzione
che compie questa operazione si può
realizzare mediante la combinazione
delle istruzioni decf e la successiva
Ca ratteristi che del I' istruzi on e decfsz.
verifir: dol flen 7 ron 16 [1f56

$$w#sxesclwxrw
Scheda detle istruzioni:
l'istruzione INCFSZ

ffi
ffi
d istruzione e simile alla
-;-
ffi Prece0enle, sld ^^l-
llelrd
ffi struttura che nell'uso,
Strutturo di
pseudocodice Strutturo utilizzondo decfsz i S*r*ro ufilizondo incfsz
ffi
ffi anche se al posto del FOR numero di volte DO movlw NUMERO I movìw C2 (NUMERO)
W decremento di un lstruzione'l ETICHETTA
mowf CONTATORE I
lstruzione 1 I
mowf
ETICHETTA lstruzione
CONTATORE
'l

registro questa realizza il suo lstruzione 2 lstruzione 2 lstruzione 2


lstruzione 3 lsiruzione 3 lstruzìone 3
incremento, e in ugual modo
iri.r.;on. n lstruzione n
salta se il risultato è zero. Nel ENDFOR decfsz CONTATORE incfsz CONTATORE
rrcn dalle dorf<z nrr,' goro ETICHETTA goto ETICHETTA
Y-J apparlre goto FINE goto FINE

piu chiaro, pero anche incre-


mentando un registro si puo
neqs:rp npr lo zero dato che
Traduzione della struttura FOR mediante le istruzioni decfsz e incfsz
dopo il valore massimo (FF) si

passa al minimo (00) con l'incremento


successivo,

OPERANDO OPERANDO flsgffipx


f, #f'é *iXSTRL$AX#ru tr Xrufl rSX
MNEMONICO FONTE DESTINAZIONE
Lo schema di funzionamento di questa
istruzione e lo stesso di quello per la
decfsz anche se al nosto delle sottra-
Operozione:
- incremenfo di uno unitò il conienulo zioni abbiamo le somme. Entrambe le
del regislro f. Nel coso in cui il risuhoto
di que"sto incremento sio O l'istruzione istruzioni si utilizzano nella costruzione
seguente è ignoroto, e nel coso confrorio dei cicli in cui si deve ripetere un insie-
no. Se d=O il risultolo dell'incremen?o si me di istruzioni un determinato numero
memori-.o nel registro di lovoro W e se di volte.
d=l si memorizzo nello stesso reqistro f.
Nella figura è mostrata la traduzione
Cicli: 1-2 della struttura FOR a istruzioni del PlC,
CodiceoP: 00 llll dfff ffff impiegando la incfsz e la decfsz. Notare
Flog: nessuno che l'unica differenza, a parte il cambio
di un'istruzione con L;n'altra, e r^el valo-
-^ Llltr
lC
.J^.
-L ^ UCVC .^ t:))flC
^--^-^ i^trndnttn
lllLrvuvLrv nol rLyl
rLr roni-
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
Caratteristiche dell'istruzione incfsz.
detto valore.

$*S*xrwr*
Applicazion e pntica: visu aLizzazion e
dei dati det primo programma
questo purto abbiamo imparato a realtzza- mo dedurre che si

re tutte le fasi che comporta un program- utilizzeranno tre


ma sino al momento della simulazione. radr<irr o rrn2 n^r- Configurozione:
Complìcheremo ora un po' il prtmo pro- ta, che verrà con- DATOI, DATO2, DATO3
nramma nronosfo e faremo tutte le fasi figurata come PB uscito

una dopo l'altra. uscrta, per mo-


Modificheremo l'enunciato dell'esercizio nel se- strare i dati. Da-
guente modo. to che r reg t- mostrq DATOI
stri hanno otto
bit e delìe due
nnrto pcictenti nol
Abbiomo tre posizioni di memorio che
chiomeremo DATOI, DATO2 e DATO3" PlC16FB4 solo la moslrq DATO2
nnrte R a nli ntin
Nel DATOI si vuole scrivere il volore
esodecimole O3 e nel DATO3 il volore l
l;^^^ -,
^
--^l+-

che si lrovovo nel DATO2. i q u esta.


5i mosfreronno frqmile i diodi LED i volori ,
ll programma mostro DATOS
dei registri primo e dopo le operozioni
di movimenro dei doti. consisterà in una
,
serie di istruzioni
diqnn<to in fnrm:

[nunciato òmpliato del prtmo programma propasto -^^,,^^-i-l^ 03 DATOI


questo sr puo ve- -+
dere nell'organi-
L'applicazione dell'esercizio suppone di vedere i dati, dt gramma per l'as-
modo che l'utìlizzatore possa osservare cosa sta succe- senza dei rombi DATO2..+ DATO3
dendo all'interno del microcontroller. rha frnnn nranr]a-

re una decisione in
l"'l'-; rj.*í{'.'t ', ' base a un dato.
mosfro DATOI
Quando parliamo dei passr per la realizzazione di un All'interno del-
progetto, abbiamo gia visto che la prima cosa da fa- l'organig ramma,
re e plasmare l'enunciato dell'esercizio in un organi- il modo di rappre-
grarnma, Quanto piu preciso e l'enunciato, tanto piu sentare la visualiz-
mostro DATO2
facile sara questa trasformazione, e meno ambigr,,ita zazione di un da-
esisteranno al momento di interpretarlo. 5e si vuole to si puo ridurre
fare un organigramma dell'enunciato precedente do- )Lt tvtrt tuu t-
--.1,,^^.t^ rd ^-.^
poru-
vrebbe risultare come quello della f igura a f ianco. ìa "DATO", senza mostro DATO3
,^-"-i-^ or r-
Nel fare un organigramma, il primo riquadro deve prfuLLUPdrLr
A, ^, ,.li rJLr
-^"^ Ut i.+",U-
corrispondere alla definizione e alla configurazione dei LUtO 9UOil
,

registri Anche se non e obbligatorìo decidere ìn prece- zìoni si utilizze-


a de I l' en u n c i ato
denza qualì risorse si utilizzeranno, facilita il lavoro suc- ranno per que- O rg a n ig ra m m
proposto.
cessivo di programmazione. Dal nostro enunciato possia- sto.

$w$#e*ewre
S{KXXY*JKE che occupa la stessa posizione. Questi registri si po-
SHL PRS&K&MPdX& S#Rffi mruYK trebbero chiamare rispettivamente PORTAB e TRISB,
Fatto l'organigramma, dobbiamo tradurlo in istruzioni oppure si possono chiamare entrambi nello stesso mo-
per rl PlC. do (PORTAB), così come abbiamo fatto noi, tenendo
Dopo la direttiva LIST si definiscono i registri che vo- conto però che significano cose diverse, a seconda del
gliamo usare. Nell'organigramma apparivano già i regi- banco in cui le stiamo utilizzando. DAfOl, DATO2 e
stri dei dati e la porta B. Nel realizzare il programma ve- DATO3 sono registr di utilizzo generale che possono
diamo che abbiamo bisogno anche del registro di STA- essere impiegati sia nel banco 0 che nel banco '1.
TO. ll bit 5 di questo registro ci permette di muoverci dal Dopo la definizione delle variabili, si deve posizio-
banco 0 al banco 'l . Nel banco 0 avremo la porta B, che nare una prima istruzione del programma alla posizio-
sitrova all'indirizzo 06 dì questo banco, e nel banco 1 il ne 0 della memoria di istruzioni. Questo si fa attraver-
registro di configurazione di questa porta B (TRISB) so la direttiva ORG con il parametro 0.

P=16F84 ;Definizione del processore

STATUS EQu o3 ;Definizione delle variabili


PORTAB EQu o6
DATOl EQU 0c
DATO2 EQu OD
DATO3 EQu OE

ORG 0 ;posizionamento della prima istruzione


;all'indirizzo O della memoria di codice

bsf STATUS,5 ;Passaggio al banco f


movlw oo ;Configurazione della poÉa B come
mowvf PORTAB ;uscita
bcf sTATUS,5 ;Passaggio al banco O

movf DATOl,O ;Visualizzazione dei dati prima del


mowvf PORTAB ;movimento dei dati
movf DATO2,O
movwf PORTAB
movf DATO3,O
movwf PORTAB

movlw o3 ;Movimento di un valore a W


movwf DATOI ;MovimentodiWaDATOí
movf DATO2, O ;Movimento di DATO2 a W
:

movwf DATO3 ;MovimentodiWaDATO3

movf DATOI,O ;Visualizzazione dei dati dopo il


movwf PORTAB ;movimento dei dati
movf DATO2,O
movwf PORTAB
movf DATO3,O
movwf PORTAB

END ;Fine del programma

Programma in assembler dell'enunciato proposto.

$w**wwrs
Normalmente, prima di cominciare il programma si c{3ffi pxL&xg#Nm mffi L $3ffiffi ffi R,eMM&
devono configurare i registri prima definiti. ll nostro pro- ll programma che abbiamo appena visto dovremo edi-
gramma non fa eccezione. I registri che dobbiamo confi- tarlo in MPLAB per poterlo poi in seguito compilare. Si
gurare sono quelli specifici, e questa configurazione de- può creare un progetto e un file nuovo o aprire quello
terminerà il comportamento successivo del PlC. Per uti- che avevamo già fatto con il nome "primo".
lizzarli correftamente dobbiamo conoscere bene le carat- Entrando in N/PLAB ci verrà chiesto se dobbiamo
teristiche 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 spiegato
precedentemente, in PORTAB sapen-
do che siamo nel banco 1. Dopo
questo si torna al banco O.
La visualizzazione dei dati e sem-
plice tanto come muovere il valore
che 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 vede
rncì rho l: nnrt: R /a ln cfoqcn nor l: Apertura di un progetto che abbiamo già e che è stato l'ultimo utilizzato
nnrt: A) :nrhe <o o (peciale perche
nermette l'inorpsso e l'uscita dei dati
d: p nor l'o<fornn dol Pll- <i no<ti<ra
in eguale modo di tutti gli altri registri
ll 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 sono
state spiegate per realizzare il primo.
ll programma, inoltre, contiene tutte
le parti che ogni programma di com-
prlazione richiede, anche se non sono
Apertura di un progetto che abbramo già, però non è stato l'ultimo ad essere utilizzato.
tutte utilizzate.

SwSkwsw
vvUvl ion srpflliprpmo
Onf il modo
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^Lw.
qPql IPor
gr riodaro
vgugrL 1;tf
fLullc a la
lc {i-
ll-

nestre nello stesso tempo, le


ordineremo verticalmente (Ti-
le Vertical). Potremo in segui-
to regolare la loro dimensione
a piacere.
Dopo aver fatto un Reset
del sistema introdurremo un
v:lorp nel reoistro etichettato
come DATO2, ad esempro il
valore esadecimale FA, e tra
le nossihili azioni di simula-
ziono srpnlicremo nuella di
evidenziare. Cliccando suc-
Compilazione del programma cessive volte F7 resteranno
evidenziate le ìstruzioni che
aprire l'ultimo progetto che è stato in uso, in modo entreranno ìn esecuzione e ivalori che prenderanno
che, se coincide con il progetto "primo" basterà ri- i registri. Alla f ine verif icheremo che rl valore conte-
spondere affermatìvamente. Si apriranno in seguito i nuto in essi sia corretto.
{iloc:(<^.;:ti
rrrqJ oJJvLruLì : nro(t^
u vuLJLv
nr^-
vrv
getto e nel nostro caso file il
con lo stesso nome.
Nel caso che non sia stato
:SFR Hane Hex 0ec Binary 0't d2 03 6rr 95 66
l'ultimo progetto utilizzato, 6E 8 8O68B6B8 8s 6g 60 tB 6B 00 60 ' LIST P=16F8{
ÉE 6 o0 06 0B 0B 00 56 6B
possiamo rispondere no, e qstisr*rrq Ff :55
B0BB5C0g
1.,|J11111 56 66 58 0B 00 B5 B0 .slnTUS Equ 03
status 1B 2s BC 66 0B C0 B6 86 rP0fiTnB EqU 6ó
aprire il progetto tramite il
BSÈ1'lBBg
oB 6 86066889 BO BB 66 BO 6O 6B .DAIO1 EqU BC
&g B 80698000 ,Dsl02 Equ
menù principale di MPLAB.
BD
1F 31 86B1111 l 103 EQU BE
80 6 0ú6066C0
Allo stesso modo si apriranno FF ?55 JlJ11l11
i f iles associati. Nell'u no o BB O O8B88696

bsf STnTus,5
nell'altro caso si puo ampliare noulu SB
nouuf
drrettamente I programma
P0RIAB
bcf STATUS,5

che abbìamo gia visto per 66 6 606ú6680 nouf DAT0-I , B


frou{f P0ETAB
adattarlo ai nuovi requisiti. nouf DAl02,6
ftovuf F0RTAB
Una volta salvato il f ile e som- novf DAl03,6
nouuf P0RTAE
mato al progetto, si passera
noulu 03
alla sua compilazione nouuf DAT0I
nouf DAT02, B
Dopo aver verrficato che frouuf DAT03

non ci siano errori di sintassi noqf DAT01 ,6


novuf PIIRTAB
procederemo a realizzare la
simulazione per vedere se il
programma esegue quel o
Finestre necessarie per la simulazione del programma
che vogliamo Nella finestra

Sw#sesesxsw
1t:aa:a:ia..::::::!'Nt{..:::::.....ì:ì::::::.1:1.......ii:r,r1,rrì::ììrr,f-!ìì:rìrrììì.,ìììÌ,ììr;l:jr{1
Scheda detle istruzioni :
f istruzione CALL

ffi uando abbiamo spiegato le strutture di cui i ciclr di istruzione so-


coll configurozione
ffi ffi controllo, abbiamo visto che un program- no due. coll roccolto-doti
ma non puo essere composto solamente coll visuolizzo-doti
ffi ffi ffisffi&4$39 il#ru
coll sommo-doti
ffi W da istruzioni disposte in forma sequenzia- coll visuolizzo-doti
'E{W le, dato che la normalità è introdurre strut- E--'gSYffi#Xg#$\$ffi coll soitrozione-doli
fl&*_*" coll visuolizzo-doti
ture cne rompano quesra sequenza, reailzzanoo un sal-
to all'interno del programma per eseguire parti distinte, I a e\,iare zza inI v,,rrn nro-
Yl

secondo la convenienza. gramma e una qualrtà


In questo caso rompiamo la sequenza con la quale moltn annrezz:ta sne- configurozione

si eseguono le istruzioni, non a causa del valore di una cialmente quando il lin-
,,+ili---+^ À l,-
condizione, ma per rendere la struttura del programma 9Ud99rO ULilZldr(-) e ras-
^,,-^^i^
piu chiara. Quando abbiamo visto le parti di cui si com- sembler, che necessita di rqccoltq-dqti
poneva questa struttura, abbiamo già parlato di sub- moltp islrr rzioni ner rea-
routines, anche se non le abbiamo trattate in profon- lizzaro nnprazioni cpm-
dità. Per realizzare questa subroutine si utilizza l'istru- plici. La bravura consiste wisuolizzo-doli

zione call. Questa istruzione fa sì che il puntatore salti nel pensare ad una strut-
ad un'altra parte del programma, etichettato col nome tura del programma cosl
che accompagna l'istruzione come parametro. Questa come se si trattasse di sommq-dqti

chiamata, o salto è incondizionato, come l'istruzione una sequenza di moduli,


goto, pero non si comporta come questa. All'arrivo di -^h,î ^^+/-"^
icr r4o cr rLr or s I^^;
rqr l^
rUIO
un'istruzione call, prima di produrre il salto, sì porta au- dettagli interni. Quanto wissolizzo-doti

tomaticamente allo Stack del PIC il valore del PC, in mo- più complesso sarà il
do che, una volta conclusa la subroutine, si possa tor- modulo, e più frammen-
nare alla parte di programma da cuie stata fatta la chra- ti ripetuti contiene, tanto softrqzione-dati
mata, e continuare con l'esecuzione normale. Poiché più sarà necessario fare
non si conosce ilvalore del PC sino a che non si esegue uso di subroutine.
l'istruzione, non si è potuto calcolare in precedenza, per La trad uzione del- visuolizzo-doti
l'organrgramma, che
PARAMETRO PARAMETRO rannresenfa il flrrsso
MN EMONICO I principale del program- Sequenza dei passi durante Ia
chiamata a subroutine.
ma nrrò essere imme-
C
:,r.1-- -*L k
diata utilizzando le su-
Operozione: chiomoto od uno subroutine broutines. Se si ritiene necessario si possono fare al-
il cui nome oppore come porometro tri organigrammi indipendenti per ognuno dei mo-
dell'istruzione. duli. Trasoortando ouesto in codice assembler si con-
Cicli: 2
verte in una seouenza di istruzioni call che si ese-
Codice OP: I O Okkk kkkk kkkk
Flog: nessuno guono una dopo l'altra, e formano la parte principa-
le del programma. Al termine di questa parte
principale subentra lo sviluppo di ognuna deìle sub-
Caratteristiche dell'istruzione call
routines.

Smfrswssre
Sch eda delte istr uzioni :
l'istruzione RETURN
@
l'istruzione di complemento
alla call. Mentre la call si uti-
li--- ^^. l-
rzza per -l^;-*-+-
ra cnramala a su- ì
broutine, l'istruzione return 2
3
comanda il ritorno dalla su- 4
broutine, una volta terminata la sua ,.-"- 0 coll configurozione -.--' 5

esecuzione. Per il ritorno non è neces- ,.' I coll roccolto-doti =-


ó
7
2
sario nessun parametro, dato che l'in- 8
dirizzo si trova già nella prima posizio- -i n configurozione btf SfnfUS,S
ne dello Stack, memorizzalo al mo- n+l movlw 00
n+2 mowvf PORTA B
mento dell'esecuzione dell'istruzione n+3 bcf STATUS,S
call. Per questo motivo bisogna fare n+4 refu rn

attenzione a non utilizzare l'istruzione


return senza aver preventivamente Seouenza dei passi durante Ia chiamata a subroutine
usato l'istruzione call, altrimenti non
avremo nessun indirizzo di ritorno
nello Stack, oppure finiremmo per utilizzare I'indirizzo mo una serie di chiamate a subroutine e lo sviluooo di
di ritorno di un'aìtra istruzione. una di esse. Possiamo supporre che la prima istruzio-
ne inizi nella oosizione 0 delìa memoria di codice e le
KsX$,{PX C**$ L"XSYRL$XXffi h{ffi KffiY{jffiN seguenti occupino posizioni successive a partire da
Nella figura possiamo osservare parte di un program- questa. La scheda rappresenta la sequenza di esecu-
ma che ulilizza delle subroutines, e come funziona il zione delle istruzioni del programma e quello che
PIC internamente quando le esegue. A sinistra abbia- comportano, e i numeri sopra le frecce, l'ordine di
questa sequenza. Quando si esegue
la prima istruzione, si tratta di una
PARAMETRO PARAMETRO call, si scrive nello Stack l'indirizzo
MNEMONICO I 2 dell'istruzione (la 0), per poi poter
ritornare. Nel PC si carica I'induizzo
dell'etichetta che accompagna la
call, in questo caso "configurazio-
Operozione: ritorno do subroutine. ne", in modo che l'istruzione che si
trova in questo indirizzo sarà la se-
Cicli: 2 ,. (,r segue In or-
oronta d: o(onrriro
Codice OP: 00 0000 0000 r 000 dine la subroutine fino ad arrivare
all'istruzione return, che farà sì che
Flog: nessuno si torni a caricare nel PC I'indirizzo
memorizzato in cima allo Stack, che
permette di tornare ad eseguire I'i-
struzione successiva alla prima chia-
Ca ratteri sti ch e d el I' istru z ion e retu rn.
mata a subroutine.

$qrftultlre
Applicaúone pratica:
contando il tempo
uando abbiamo modtficato il primo pro- Così come succedeva eseguendo il primo program-
gramma per visualizzare i registri prima e ma in questo modo, al termine delle nostre istruzioni il
dopo il movimento dei dati, proponem- Program Counter (PC) continua ad incrementarsi, e
mo di fare una simulazione del tioo istru- dobbiamo fermarlo con Debug>Run>Halt. La velocità
ziano nor i<trrrzinno nor \/anora .^mo dipenderà dal computer su cui si sta eseguendo il pro-
veniva eseguita; avete provato a fare una simula- gramma, ma. quasi certamente, sarà troppo alta per
zione del programma in modo completo, per vede- poter vedere adeguatamente come variano i registri. La
re come cambiano i registri nel momento in cui stessa cosa succederà quando il programma invece di
avviene? Questo è proprio il momento. Apriamo il essere simulato, sarà eseguito nel microcontroller con
progetto e ci apparrranno le finestre così come le hardware reale: la visualizzazione dei dati che ci inte-
abbiamo Iasciate. Facciamo un reset del sistema e ressano sarà appena apprezzabile. Lunico dato che si
introduciamo il valore FA nella posizione 0D della potrà vedere chiaramente sarà I'ultimo che rimane nella
memoria dei dati. Quando saremo pronti per fare Porta B come neìla simulazione. Quindi sarà necessario
questo tipo di simulazione, dovremo selezionare introdurre alcuni tipi di ritardo, che ci permetteranno.
I'opzione Animate all'interno del menù quando saremo nei panni dell'utilizzatore, di interagire
Debuq>Run. Fatelo ora. con il sistema.

&KffiA$dX&K&ffiffi&
i;*é ffi èÉse. Xffi# r_{'
Qualsiasi cambio che faremo
nel programma dovrà essere
i,iiÉ***ss*i*iàffi
riportato anche all'inizio, cioè
4lll ts*l€**
j*g*4.*g* :* dovrà essere inserito nell'orga-
:rétrs* {ry+ *
$éÈ*dee.
-- fgt,* *# fl& nigramma.
:' f*F-*ii q& .*
:
*tFCt {E!x * L'idea è che i dati che dob-
iF.sfft ldEF* * biamo vedere mediante i diodi
I LED, siano visualrzzati per il
k:tuWfrx*, fid+&d? tempo sufficiente ad essere
WÈ*w 'b€e$:i{H
visti. Questo si ottiene introdu-
**lxri&&*dd. &5.e+Fq
cendo una routine di ritardo
*É- #+q*jgs
i** "rÍl;F.í€a dopo aver spostato ogni dato
sulla Porta B. Per fare in modo
che ogni dato sia visualizzato
per circa 1 secondo sarà suffi-
ciente per raggiungere il nostro
obiettivo. Modifichiamo anche
l'organigramma.
Quello che è stato intro-
dotto nell'organigramma che
già abbiamo, è una specie di
Uno dei possibili modi di simulazione
piccolo programma indipen-

S*S*'txrxre
dente all'interno che il PIC'l6FB4 ha solo una caoacità di 1024 istruzio-
oer programma ni. La seconda opzione è eseguire cicli all'interno di altri
Configurczione: nrinrinelo ad ò
DATOI, DATO2, DATO3 cicli, in modo che una ripetizione dietro l'altra fornisca
PB uscitq chiamato routine, il valore desiderato. Considerata la struttura di control-
o subroutine, e si lo dedicata alla programmazione del PlC, avremo biso-
ulilizza quando un gno di un contatore a cui far decrementare un valore,
moslro DATOI pezzo di program- e dato che i registri sono a B bit, il valore massimo che
ma deve essere si puo ottenere è 255, quindi il valore totale da conta-
ripetuto varie volte. re si divide in gruppi da 256 (da 0 a 255). I cicli propo-
ritordo lsg
In questo caso sti realizzano 256x256x15 = 983.040 istruzioni noo.
quesro pezzo al che si awicina al valore cercato.

moslro DATO2
programma si Questo modo di lavorare è valido, anche se non e il
ripete 6 volte, migliore. Quando ci serve contare il tempo, conviene
<pmnro nolln (to(- fare ricorso ad una risorsa del PIC che è il temporizza-
rifordo lsg so modo. L ultimo tore TimerO (TMR0) Questo temporizzatore, una volta
ritardo non sareb- configurato, è capace di contare un valore determina-
be necessario, dato to (256 x 256 come valore massimo), in modo indipen-
mosfrtr DATO3 che come abbia- dente da quello che si sta facendo con la CPU del PlC.
mo potuto verifi- Alla fine ci awiserà. Così, in questo caso dobbiamo fare
care nella simula- un unico ciclo in cui il TMRO conterà 15 volte il valore
ritcrdo I sg zione, il dato finale
narmano o ln <i
puo osservare senza
+-DATOI
o3 problemi.
FOR 256 DO
Xt YE$K* FOR 256 DO
DATO2-"+-DATO3. I metodi per otte- FOR 15 DO
nere un ritardo, Nop
" una perdita di
mostrc DAIOI ENDFOR
tempo", sono mol-
to vari. ll primo ENDIOR
che ci viene in ENDFOR
rirordo I sg montó À nnrro rrn:
f ila d i istruzion i

mostrq DATO2
n op na c relro
u Con un ciclo all'interno dell'altro
.- .--:,.--^ dild ,^*^--Utaztone
:ll':ltr: norn qp )l-: lJuu
^ alt tvdlc -il. Lcl t tlJvt
) desiderata.
\/nnlrlmn nttonoro

ritr:rdo lsg una temporizza- massimo. ll modo di configurare il TMR0 e il suo regi-
zione di un secon- slro
cir^ d55ocidt() per q-r-.-
rccari r+n n^r
^troqt: :nnirr:zinno ,l regl5lro i

rin o nnni i<tri rzin- OPTìON, e rllustrato nella figura.


mosiro DAIO3 ne impiega 1 ps Metteremo il valore 00h nel TN/R0, il quale si incre-
:d o<<ora a<onrri- menterà ad ogni ciclo sino ad arrivare a FFh, da dove
ta, dovremmo utr- îornpra,r O0h nrodrrrpndn orrpllo che viene chtamato
ritordo I sg ltzzare ptù o meno overflow con il quale si attiverà un flag per indicare
un milione di istru- che ha finito di contare. Questo flag e il bit 2 del regi-
ziani .li nroct.l stro INTCON.
iinn il rho nlfro Per quanto riguarda la configurazione del registro
O rga n ma del I' en u nciato con
ig ra m che assurdo è OPTION, questa deve essere fatta all'inizio del pro-
I' i nseri mento dei rita rd i.
impossibile, dato VldllllllO.
Àr^r
l\Cl ---^.li
LC)U U' orresto
yuLJLv esercizio dobbiamo

Sw#*vrwwe
I
dobbramo inizializzare i contatori
associati; verificando il valore del bit
ì 2 del registro INTCON, si sa se il

TMR0 ha terminato il conteggio, nel


nrr:l luJv
Vuur r:<n VuLrLv urr
hit pd))tjld -,,*^
n--.^-- dULU-
^lo<t^
maticamente a 1 e noi lo dovremo
rimettere a zero. Al termine di
entrambi i cicli si esce dalla routine.

*{* S $il{ \1 .;\ T,|}T. L{ PS


Una volta visto perche si fa cosr,
Configurazione del registro OPTIAN e del TMR0 per contare 256x256
rama ranl'nr rrero il fl4R0 e il fegi-
stro OPTION, e come rimane la
inserire il valore indicato nella figura in alto. Le x routine di temporizzazione, andiamo ad integrare tutto
sono valori che in questo specifico caso possono questo nel programma che vogliamo modificare.
essere'l' onnrrre
"rr'' 0 indifferentemente. ltre bit meno Le iinee in neretto sono quelle nuove aggiunte nel
sionifrcativi (0-2) messi a'l indicano un divisore di nronr:mmà rnmp si nrro vedpre tr rtti i renistri che uti-
roattanzz .li CA î qUC)Ld
ralr+f ^ d ^,,^.+- tomnnriz_
f 7
-, 172lara
.-lUlC dUdLLU LLrrrpvrrl lizzeremo in seguito devono essere definiti. Nella con-
zazione. ll bit 3 assegna questo divisore al TMR0. ll figurazione delle variabili abbiamo assegnato nuovi
bit 5 a zero fa si che ilTN/R0, dei due modi in cui puo ri:lnri ._..t regtstro
nltro : nrrollì rha ni:
o<ictov:nn I

contare, lo faccia utilizzando gli impulsi deì clock OPTION lo abbiamo definito come OPT perche la paro-
i nterno. 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
| : rorrtinp di Iemnorizzazione f unzionerà come "rìtardo di 1 s", ora sono stati convertiti in chiamate
mostrato nella frgura. Inizia con il nome della routine, ad una routine di ritardo. Ouesta routine. di cui abbìa-
*^ : -+-+- -l +^.*i^^
che abbiamo chiamato "ritardo". Come abbiamo spie- mo gra paflaro, e
^i; ^-.1-+^ posia ar
sTaTa ^^-+- ^l^l program-
rermrne oer
n:tn in nrcredenz: il îemno desiderato si otterra con Itd,
-- -^-h^ tc -^
dILt )c ^^+^,,r
puLcvd ^..^"^
tr))crc -^ll^-.+.
LUiluLdLd ^l- L.ludr)rd)r
ud ^,,-l.i-.i .l+"-
dilrd
un ciclo all'interno di un altro, con quello rnterno che parte, tenendo sempre conto dell'ordine con cui si
realizza una temporizzaztone di 256x256 ms, grazie al eceorie il nronrammà notàte ehe donn l'rrltima chìa-
TN/R0, e un altro esterno che fa ripetere 15 volte quel- mata alla routine "ritardo" abbiamo un salto alla fine
lo interno. L introduzione del valore 15 fra virgolette de' nronr.1mrn.: ,al+rimenti tornerebbe ad escnrrrrsr
semplici, e con Lrna'd'davantr, fa sì che lvalore sia questa routine. li proqramma, come sempre, termina
considerato come decirirale. All'inizlo di ogn ciclo con la direttiva El'lD.

I movlw d'15' ;€ido esterno che si ripeterà 15 volte


movwf CONT

moviw 00 ;lnizializzaziore del cklo interno


movwf TMRO

btiss INTCON,2 ;Ha finito di contare?

90t0 ctcL02 ;No. (ontinua nel ciclo interno

bcf lNTCoN.2 ;5i. Azzera il flag

decfsz CONTl ;Decrementa il contatore del cielo esterno

g0î0 ctcL0l ;Dato che non è zero torna al riclo interno

teturn ;ll contatore esterno è arrivato a zero, esci dalla routine

Rouline di temportzzazione del TMR0

Sqp$*x*rw*exx
tlullNEn${l1fr1fssì
'.|l|...,.::.::.::|.'.|......1..1Nj1...::.j.:.jj.]]]i.lìN1,]i]]]]]]]:]]]]]]]::]lù!ì\|ì:::ìsi.*g
'l'&
,,,1:&:
.'.'.7

'ì'lìii:
..,u1ì:i

LiST P=16F84 ;Definizione del processore

TMR0 EQU 0f ;Definizione delle varìabili


OPT EQU 81
STATUS EOU 03
PORTAB EOU 06
INTCON 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


::::::.:
,1..:a.::;,

movlw 00 ;Configurazione della porta B come


mo!$'f PORTAB ;uscita :t*
.,ìt::

rr::iF
movlw b'00000f tl' ;Configurazione di OPTION per il TMR0 ,l::.,:3

movwf OPT
:::a:,,.,:&

bcf STATUS,5 ;Passaggio al banco 0


,,'::,:l::::

,,a:a,a,a,a:a,i

mov'f DAT01,0 ,Vjsualizzazione deidatiprima del


tt',.?,'

movwf PORTAB ;movimento dei dati


call RITARDO ;Chiamata alla routine di ritardo
mov'f DAT02,0
movwf PORTAB
call RITARDO ;Chiamata alla routine di ritardo
movf DAT03,0
movw,f PORTAB
call RITARDO ;Chiamata alla routine di ritardo

movlw 03 ;Movimento di un valore a W


mowvf DAT01 ;Movimento da W a DATO1
movf DAT02,0 ;Movimento del DATO2 a W
mowvf 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 ritardo
movf DAT02,0
movwf PORTAB
call RIIARDO ;Chiamata alla routine di ritardo
movf DAT03,0
movwf PORTAB
call RIIARDO ;Chiamata alla routine di ritardo
goto FlilE ;Terminare programma

RITARDO movlw d'15' ;Ciclo esterno che si ripeterà f 5 volte


mowvf CONT
CICLO1 movlw 00 ;lnizializzazione del ciclo interno
movwf TMRO
CICLO2 btfss INTCON,2 ;Ha finito di contare?
goto CICLO2 ;No. Continua nel ciclo interno
bcf INTCON,2 ;Si, Azzera il flag
decfsz CONLT ;Decrementa il contatore del ciclo esterno
goto CICLOI ;Dato che non è zero torna al ciclo interno
return ;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 è molto TABELLA Dotol Doto2 Doto3 Doto4 DqtoN


comune in qualsiasi pro- ,.., , :,.ìì
n-l
I z
gramma del PlC. Deidue tipi
di subroutine che possiamo
Array di nome "Tabella" con indice da 0 a N
distinguere, a seconda delle
istruzioni di chiamata e ritorno, abbia-
mo già visto quella che corrisponde alle istruzioni call e poi si esegue una chiamata alla tabella come se fosse una
return. L'istruzione con la quale lavoreremo in questa normale subroutine. Tornando dalla subroutine, in W
sezione, la retìw. è anche un'istruzione di ritorno, che rimarrà caricato il dato che corrisponde all'indice fornito.
ha similitudini e differenze rispetto all'istruzione return, Per costruire una tabella dobbiamo porre il nome della
pertanto si usa in differenti tipi dì subroutine, a cui si medesima, una prima istruzione addwf con i parametri
accede sempre con l'istruzione call. Quando si torna da PCL e 0 e tante istruzioni retlw quanti indici ha ìa tabel-
la, ognuna con il parametro associato all'indice. La prima
PARAMETRO PARAMETRO istruzione, che è obbligatoria. fa sìche alPC (la sua parte
MNEMONICO 1 2 bassa PCL), venga sommato ilvalore che in quel momen-
to si trova scritto in W così da provocare un salto all'indi-
: :-llv--*-J-"*-:-*-"--.L" ce adeguato. Di tutte le istruzioni retlw, ad ogni chiama-
Operozione: ritorno dollo subroutine ta alla tabeìla se ne eseguirà solo una, quella corrispon-
losciondo un volore letterole in W. dente all'indice utilizzato. Prendiamo l'esempio della figu-
Cicli: 2 ra: se prima di esegurre la chiamata alla tabella si carica il
I
€odice OP: I 0l xx kkkk kkkk
registro W con valore 1, al PC, che a causa della chiama-

Flog: nessuno ta alla subroutine stava puntando all'istruzione addwf.


verrà sommato 1 sulla sua parte bassa; questo ptù I'au-
Ca ratte ri sti ch e d e I l' i stru zi o n e retlw toincremento normale che caratterizza questa risorsa del
PlC, portano il PC a puntare all'ìstruzione retlw
una subroutine con l'istruzione return, il valore che si b'00001111'che è quella che si stava cercando.
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 tobello
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. robello oddwf PCL,O

xsKeapgffi fl*ru L'gs?Raixxsr-é ffi mffiY$-w


Questa istruzione si utilizza per formare le tabelle, negli redw b'OOOOI I l t' i
altri linguaggi di programmazione si chiamano array, con
retlw 5ó i
indicì consecutivi che iniziano la loro numerazione da 0,
così come mostrato nell'immagine in alto. Per accedere
Frammento di programma
ad un dato dell'array dobbiamo conoscere l'indìce: il regi-
nel quale si mostra l'utilizzo delle tabelle.
stro di lavoro W viene caricato con il valore dell'indice, e

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 utilizzo
appare simile a quello dell'i- R llaE Hex Dec Binar! Char
struzione return. in questo caso quan- ;P"ogrm dli tratteètrto dlell,intetdpt. i0 il 1 000[0001
pcl 85 5 80tJ0tìl 01
do il processore ritorna al flusso prin- optifin_r€g 0ú 2BB 11[18868
stJtus 1C 2B 06S1110ú
cipale del programma, recuperando fsr UB Í 00880890
goto SEEUIflE ;Ancora !o p0rta 80 0 06i188006
I'indirizzo memorizzato nello Stack, muf r P0RIB tri5è 1t 3l 0ú01111J
xorlr b'3t8081 86' ilnv€rti@ it bil 2 pOftb ffS g S{'BBSSBù
pone il bit GIE del registro INTCON a ;Se è spetrto si acceode trisb [ù I 05ù06060
;Se Ào si speG€ Èedèta gS g Bú0S0080
valore 1 . mulf P0RTS elconl ffù B 86866[[ú
mulr -26 Peèdr 0S ù 0B0SSBBù
Questo bit che abilita il microcon- mulf f,ontl ;IDizíalízziúo iI coEtl on2 tl8 0 000t1ú600
ldth 00 B
troller ad accettare gli interrupt, e IlfiC0ll,T0IF iRèsètti@ i1 flag del rntc0n 2q 3ó
S0B0B0{ì0
0$1 Í6.1 6B $
h'111111.11' rcarichi@ di nuovo il Lr 14 20 [ùS1$iÉil
^^.+^ a Lctv ou
pwrrv -' ';LOflìattcament€ TllS! ;dla cootale t6Ère 81 1 úS0EBB01

entrando nella routìne di servizio


all'interrupt. per fare in modo che
durante la sua esecuzione non ne ven- tffi#
.: .'l: Beturn Addres5:
gano accettati altri. Mettendo di .2 96-tC {Interrupt)
nuovo il bit GIE a 1 si torna a permet-
tora nli inforrr
rsrs yil rnf qo
il rrEr I upr. Js c; 'l- ul
^.-^ ud
)l c>Lc ' '^-
ld
routine di servizio all'interrupt con
return, invece che con retfie, questa
Programma esempto per I'uso dell'istruzione retfie.
possibilità viene annullata.

$i$swPs
PARAMETRO PARAMETRO il*ru $i3SY$e#X3*S*il KffY$;Xfi
MNEMONICO 1 2 Nella figura abbiamo tre finestre aperte:

.--::*t*li-: , "i--..- . .- ""*i


quella del codice del programma, quella
dei reoistri snprifiri e nuella dello Stack.
E stato eseguito il programma passo a
Operozione: ritorno dollo subroutine n:qqÒ è l'imm:nino a qtaf: nro<: nol
di servizio dell'interrupt. momento in cui si entra nell'interrupt.

Cicli: 2
Nello Stack è rimasto l'indirizzo di ritor-
no, per quanto riguarda i registri specifi-
Codice oP: 00 0000 0000 I 001 ci, possiamo notare che nel registro INT-
Flog: nessuno coN, e più esattamente il bit 7 o bit GtE,
e appena stato messo a zerc, per non
permettere altri interrupt. Come ultima
istruzione nelle subroutine dedicate agli
Ca ratter i sti c h e del I' i stru z i o n e retf i e
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-"^
rcrc À
c .+-+-
)LoLd .^i^^-+.
)Prc9drd ^^ll-
rEild
sezione precedente, così
come le strutture che forma-
no parte di questi moduli. Ora trattere-
mo idifferenti moduli esistenti, e quali
sono le differenze fra di loro. In ogni ;Súbrùutlrt

caso la modularità deve sempre per- ,rtfll€' mr*f


Èllr
T'*0
b'g6talJ91'
Carieè il lil*g
*orf Pflf I4
mettere che un programma da princi- *0tf€n-t ttfsi ll{tcofl,l0lt Sotq terÈirati ; Fógii?
goto nunl|z*-l llo" Ccatidúa
pio complesso, si divida in parti piu bcf
retwc
lt{ft8t{,f8lr Si. ti5attira it tlrq
n1tcrra
semplici, riutilizzabili, e pertanto piu t€Sfg* ssxf llsg Cariea il fB*
selr t'tc8ú1111'
f:rili d: mtrttprc ,a nUnto e da mOdifi- @* P6nt*
9€SliÉ,1 btÍss IltTCBtl,IElF scúo terrArati i pèssi?
ca re. gotr t€Slf,*_1 tb " Codtituè
bcf lHTe0l,lClF Si. oisat?lsa 1l fl*g
retgrn Iittr*s

5t$ffiffi*8"$TXF$il
La decisione di ulilizzare o meno le
subroutine dipende daltipo di programma
ll programma precedente, sciltto senza l'utilizzo dei moduli
che vogliamo realizzare. Quando un'azio-

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 subroutine
Proeramma che utilizza moduli nella stesura
comporta una perdita di tempo,

Sw*fuswxw
.nmllnnlro
LvrrrurrVuu <A uLilr44dlc
tiiliTT-+^ in
lll
macto
modo coerente, i vantaggi Nome_macro
lstruzione-1
sono maggiori degli svan- lstruzione-2
tagg r. lstruzione-3
Normalmente una sub-
lstruzione-{n-l)
routrne comunrca con rl pro- lstruzione-n
gramma principale median- endm
te lo scambio di una sene di
valorr. Quando si chiama il Avanti macr0
movlw b'0000rî01'
subprogramma, questo rice- movwf PORTA
ve gli argomenti necessari endm
-ll- -,, ,-,^^^
ì,,ts ^ .^-+,
ts tu)U-
tuisce dei risultati. È consi- Struttura di una macro ed esempio del suo uttlizzo.
gliabile che le variabili a cui
accedono sia il programma che il subprogramma 9rorilro ^-i^-i^'r^
prrLrporE hasterà
L inserire iì nome della
siano indipendenti, cioè di ambito locale, di modo marro nel nrrnfo che ri interessa e lp istrrrzioni che la
|,L' Pvl

che al momento della chiamata al procedimento, compongono saranno eseguite.


siano le uniche variabili interessate. Pero questo non Nome_macro esprime il nome della macro che in
e possibile con il compilatore del PlC, dato che la seguito verra inserita nel programma prrncipale per
chiamata a subroutine (istruzione call) ammette aggiungere tutte le istruzioni che appaiono sotto que-
come parametro solo il nome della subroutine stes- sto nomtr fr: le n:rolc chiave maCro e endm.
sa. Una soluzione intermedia fra lo scambio di oara-
metri e la non comunicazione fra programma e sub- ffigrrtr${{r,iffff rffi& ffieflft* # s#ffiR*{jYi{$\é#
programma, consiste nell'utilizzo di variabili globali, Nonostante I'ulilizzo delle macro e delle subroutine si
d. LUI
-',i pU))OllU
^^c.îna
trraAaTp
OLLCULT antr:mhi l-nqj nri-:
Prlllld
Àoll:
\lrlld assomiglino, fra loro c'è una differenza fondamentale.
chiamata ad una subroutine, verranno introdotti nei n,,-^.1^
vuottuu -i
)t -^-^il
LU|tPilo uttPrw9rorrilro *- {-++^ -^^ SUbfOUti-
rotLv LUrl
rpnic,tri nrodisnncti i valOri
da utilizzare con le subrouti-
ne, e prima di ritornare dalla
subroutine, saranno aggror-
nati iregistri che devono
contenere irisultati del lavo- Itoufreoto it aqarti
ro svolto onnrrre entrambe
le cose se sono necessarie. tira a destra
I ln o<omnin tinirn eli nrro<tn
e l'uso delle tabelle, che
-l^r-i--^ ,,i-+^ ^- ; Sulrsutin"
a00ramo 9rd vrsLo pdrlan0o
^i.
dell'istruzione retlw. In que- àlnflZf svef IHRE Carica lI TI4BS
fivanti- €ugrza
qtn càsn il reoistro che f un- tl.litl?A-.f ùtfss lìlTt8t{,l$rt SoGú terRioati i passi?
gato A8àHZ$_1 HO. e?Àtirùa
zionava da intermediario era àcf IltTc0l{,IClF Si, Disettise il flag
return gitsrnà
il registro di lavoro W. in
DESI ffivsf TIiEB Darica i1 l3ng
ges t Cira a destra
!€Sî{n_1 btfss lill00Í,lglf S060 te.niftati i passi?
r'{ i; r* €}S*
f il:L:\'J gBto 9Fst8È*1 Hì. 0rntirua
brf IllTC0N,TBIr Si- Disattiu8 it Flag
Un altro modo di semplifica- return Ritorna

re un programma consrste
nell'utilizzare delle macro.
Una macro definisce un
insieme di istruzioni a cui si
Sezione dello stesso programma, pero con l'utrlizzo di subroutine e di macro nella stesura
assegna un nome. Nel pro-

Sw$*xeswrw
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 detto
codice è 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
Lt-^^^-
uso, cne
-t^ -^"
orsogna conoscere e
applicare, perche questi non si
producano A causa della diffe-
renza che esiste al momento di
Generazione del codice nel proqramma scritto con subrouttne
assemblare, fra macro e subrou-
tine, l'inserimento dei cicli non si
ne, il numero di istruzioni generate, e che piu tardì saran- or,ò realizzare nello stesso modo. Nel secondo pro-
no scritte nella memoria del microcontroller, risulta lo stes- gramma di esempio, sono state sostituite le subroutine
'so di quelle scritte nel programma al momento dell'edita- con le macro, definendole in modo errato.
zione. Quando si utilizzano macro, invece, ogni apparizio- Dato che tutte le istruzioni delle macro si ripetono
ne di un nome di macro è sostituito dal compilatore, da tante volte quante sono le chiamate, si verificherà
tutte le istruzioni che formano la macro; questa operazio- anche la ripetizione delle etichette che formano parte
ne è chiamata espansione di una macro. ln questo modo di queste macro. Questo genera un problema, quando
la quantità di istruzioni che saranno scritte nella memoria un'istruzione, ad esempio una goto, fa riferimento ad
di programma sarà maggiore che nel caso di utilizzo di un'etichetta e questa etichetta appare duplicata nel

; Carlca il lB!
mwf PonTi
eúnpe_1 ùtass tflrcoff,f8lf i son. tefúlnati I Pasri?
goto l!f,Mt-1
bcf lxTcol,Toif ; Si- Dle.ttisa t1 lrÈg
ESlin
RÙgf TM!
mlls b 00!fi111'
mlqf Pú81î
o€SlRi_1 òtf5e lfllc0l,T0lf ; sóno tersinati i póssi?
goto tEslnf_l
bc, lNlc0N.lùlf ì Si, Disattfvó 1r Fì39

i Prograffi 9rincip3le
ÈlClO frllr oxFB ; ita8z. dl 25Ù M (7 pasli)
t0iff?n
Èlls ÙrfÙ ; 6ifa . destra di ió Pèssi
0lsrna
mvl{ gf1 ; llitz! dt 1à Pasti
a0htzi
ÉF

Generazione del codice nel proqramma scritto con macro Secondo programma esempio con le macro defintte in modo errato.

Sw#*wexre
sarà traslata in anticipo o in ritar-
do del valore che ha in quel
momento il PC. Visto che ogni
chramata a macro verrà sostitui-
ta -datutte le istruzioni che la
compongono, ogni istruzione
verrà collocata in indirizzi diversi
della memoria di programma.
per cui il PC al momento di ese-
guirle avrà un valore diverso, e
gli induizzi che ne risulteranno
per incremento o decremento
anche. Se isalti sono realizzati
"verso l'esterno" della macro, si
noqsono riilizzaro ptirhafto
dato che queste non saranno
considerate ripetute.

ef;e uesxvxTe
La recursività è definita come la
Errore che genera MPASM cercando di assemblare il secondo proqramma
capacità di un subprogramma

codice compilato. Una soluzrone


5i no X=0
a questo inconveniente, la tro-
viamo utilizzando gli indiizzi Allora FACI0IIAL = 1

relativi. Invece di saltare verso 5e no FAOORIAL = X t FACT0RIAL (X - 1)

l' induizzo esatto di un'etichetta,


Esempio di programma scritto in forma recursiva
si salta verso una posizione che

di auto-chramarsi. Al momento
di dichiararla, bisogna identifica-
re bene il caso base per cui il
proced imento terminerà.
mGro
mvwf llno
nov10 b'c88tll61.
; grrlca 11 tíAg Non tutti i problemi possono
[Òvef F0nla essere definiti in base alla recur-
Sl. Disattlua ll Flòg srvità, e
generalmente una è
11toila
delle cose più difficili da capire e
muuf îf{Fo eartca ll lín8
mvt.s
meef
b' 6BO6J11''
p08în
,
applicare nella programmazio-
btfss txtcoH,Totf Soro tarnlnitl I passl? ne. In ogni caso con il PIC potre-
goto $-'r tllt. Cortinut
bcf tNf0frfi,f8lf 31. tisótttca 11 Flag mo ulilizzarla poco, perche con
erdn Rlt6roó
; Ffo$raM pflnrlpale la recursività si generano indiriz-
*viozó dl 2gS w l7 Oasst, zi di ritorno ogni volta che la
dlra i destra dl tó paÉ51. subroutine si "auto-chiama", e
guanza úl It paesl nel PlC16F84 abbiamo solo 8
inditzzi di ritorno, tanti quanti
ne puo contenere lo Stack,
numero che è molto basso per la
Forma corretta di fare i salti nelle macro.
maggior parte dei programmi
recursrvr.

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 l-Éffi,r'=:.,irr- : -lBld
SF* ll* llar Ìc g:^l
letterale meno il valore del registro W. ll risul- tBrB [8 enf
lÈ s
t
cffYF&
@lr QSf ; Pottr B

tato rimane in quest'ultimo. I flag che vengo- oDtion req lF 254 l! ffiìÈ !O ; ltrtà a
istatuE- -
1
1F It Hr* 6
I rs. l2 htf *t,G : Ps$ al àaF
no attivati sono gli stessi che nel caso delìa somma, iporta
{lo
0€ l3
! trisr
t* elÈ S ; Si sp"4w i
però, dato che l'operazione si realizza med ante il : prrtb
B0
6t 15 Frs 6
trisb FF *É ú!f s,l ; le3{o li p&ta
metodo del complemento a due, il flag di carry, invece eedata go 7î
tl
ssùli
btfs
G
(É,2
; |lcro m cEi
€econJ St
di attivarsi quando c'è riporto, lo fa quando non c'è. €eèir
€econ2
3B
BS

tclath BB
intcsn 6B

OPERANDO 2t agsal! hif f6,l ; tccÉdt iì tE!


DESTINAZIONE gste riR
ff
Esemaio tiaico dell'uso dell'rstruzione sublw.

Operozione: Sottrozione del volore letterole k


ol volore del registro W {k-W) Così come ci mostra ì'esempio, vediamo che quando il
Cicli: I risultato di un'operazione e un valore negatlvo, quello
Codice oP: I I I lOx kkkk kkkk che si scrive in W non è il valore, ma il suo comple-
mento a due, e il fatto che sia negativo viene segnala-
Flog: C, DC, Z
to da uno zero nel bit del carry.
Caratteristiche dell' istruzione sublw. g$frffirr. {*f,f &.'XS?ffi1}X5#ruffi S#ffiLW
Oltre alla funzìone classica di eseguire la sottrazione, l'i-
struzione sublw si ufilizza per fare le comparazioni.
v:hr-:
-9i.Y.eli ry: i:ll li:1r".:i.:r:- .q-o.-q_"9o9-t-1
lmmaginiamo di aver formato un numero con gli inter-
Volore letierole do cui soltrorre oooooloo ruttori, e che questi siano collegati, ad esempio, alla
Complemenloo 2diW lMlt0l porta B. Questo numero può essere il numero di una
lqrole chiave, ed è necessario sapere se esso possiede un valo-
,gomg-femlto o
sommg 2 {|!v oo-o9:1o_o_l
-c91 !t
-d9l
re determinato per convalidarla, e accendere un LED
Doto che c'è riporto nello sommo si ottivo it flog C
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 ivalori
comparati erano uguali oppure no, a seconda che il flag
Esecuzi one de I I' i str uzi o n.. su b lw
Zvalga 1 o 0 rispettivamente.

$q*{i$wsxw*
::::::aa:a:tt:a::aaaaat*la,?taaa,lL,tl::::::i:;\i
Scheda delte istruzioni:
fistruzione SUBWF

la seconda istruzione
di sottrazione e sot- El*is :{€úÈ !Eà1es leb
lraa ad I rn ron i<trn
chramato "f " il valore
che contiene il regi-
LIST P=1éF8à ; Defini:i3ne d"t procass$ra
stro di lavoro W. ll risultato di
questa operazione rimane in f CR* O ; Posizionafiento dell.a pri$à istruaione
; all'indirj.zzo B della sì*ncria {ti pro$raRfla
o in W a seconda del valore
del parametro d.
;Cst arazion* con i ualori letterali
Così come I'istruzione pre-
rcdpnto \/onnnnn rninvOlti i muf AC,O ; Sl mtte in S iL uetorg d1 rÈgistro gC
subl's 94 ; ffurmro con cui si uuole far"e La conparazitne
flag C, DC e Z nella forma già
fioulù, g{ ; NUR€ro con cui si vusl"e fars la canparazione
descritta. subsf 6t,S : Sl ps"gue la sattrazione ccn il registro da

ffi$ffie$trx fl#ru
;Carvàrazione Sra registri
$-*XSTffi WtrX# $q ]l: S t* **W $:

|'uso di nreqta istrr r7i61'19 g na'Jf Bs,a ; Si &ettè in !, il ual3re d"l registra BC
subnf S',€ : Regi.stro con cui si uùol* far€ La coaparazi
simile ,a nrrelln dpll'istruzione
sublw, che abbiamo appena
Esempio di comparazrone con le istruzioni sublw e subwf
visto. Entrambe servono per

sottrarre valori' p oer fare com-


" Y-' '

OPERANDO OPERANDO pa razron r.

MNEMONICO FONTE DESTINAZIONE Comttnnrro ,a <crgnda del


+i^^
upo (lr odro Lìa
^li ^l-+^ ^l- fomparare, non
subwf f d sempre sr puo ulilizzare la
sL-rblw, a rneno di casi semprici,
r'l:tn
uoLU rhp
Lrrc nor o<adrrirn
q)Eguilc Ànlln
uc tE
Operozione: Sottroe ol contenuto del registro f PEr
comparazioni la subwf e piu
il contenuto del registro di lovoro W. comnieta Ner caso della com-
Se d=0 il risultoto si porto nel parazione fra il valore di un
registro di lovoro W, e se d=l si regrsîro e un vatore costante
loscio nello stesso reoistro f. determinato, sarebbe a dire
con un valore letterale, è indif-
Cicli: I
ferente l'uso di una o dell'altra
Codice OP: )0 0010 dfff ffff istruzione, ma nel caso di com-
Flog: ., DC, Z parazione fra registri è necessa-

Ca ra L teris ù c he d el I' istru z io n e su bwf


rio I'ulilizzo dell'istruzione
subwf .

Sw6*ses*wss*
Appli cazione pratica:
un altro programma con it TMR0
poco a poco stiamo conoscendo l'uso delle
varie risorse del PlC. Abbiamo studiato i

registri, le porte di ingresso/uscita e nell'ulti- Configurozione:


CONTATORÉ
mo esercizio proposto abbiamo parlato del RAO ingresso
TMR0. Però il TMRO si può utilizzare in due RBO uscito
modi: uno come temporizzalore, e l'altro come conta-
tore di impulsi esterni. In questo esercizio lo utilizzere-
mo nel secondo modo
spegnere il LED
Leggete con attenzione l'enunciato dell'esercizio
proposto e pensate a come risolverlo.

RAO=I?
Abbiomo un nostro trosportotore sul quole
siqnno possondo i pe:ni che vogliomo conlqre.
Per contore il numero dei pzzi posizioneremo
un pulsonle che sorà oftivoto dol possoggio
di ogni singolo pezzo. Per ogni
gruppo di lO pezzi otliveremo un diodo IED
che ci owiserà, od esempio,
che i pezzi possono essere impocchettoti. RAO=O?

En u nciato del l' eserci zi o proposto

CONTATORE = CONTATORE +I
r{qx{\$# #KseN$sffi&&4ffi&
La prima idea ootrebbe essere I'utilizzo di un contatore
da incrementare tramite il programma, ogni volta che
rileveremo un impulso (passaggio da 0 a 1 e nuova- CONTATORE = lO?
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-
occendere il LED
to in modo soddisfacente già con il primo organigram-
ma esposto. Dato che il nostro programma deve solo
svolgere una funzione, non importa se impiega tutto il
tomn^ nol foqt:ro rrn i;16;pqq6 increment:re Un COnta-
Primo organigramma dell'esercizio proposto.
tore, e compararlo con un valore dato; però se oltre a

sl:èì::Wrrrrrrrrlu,url
Sw#*wwvw
€onfigurozione:
RAA ingresso
RBI usrito
TIARO

OPTION

spegnere LED
iniziqlizore TMRO

Configurazione del registro OPTION per questo esercizio

questo dovesse l'hardware del TMR0 - ad eccezione del suo termine;


controlìare an- questo controllo è realizzato verificando il valore del
rho rho i nozzi rhp nasspr: aUtomaticamente a 1 al termine
fl:r^r T0lF
non siano di- del conteggio, e che dovrà essere rimesso a zero per un
occeîdere LED
fettosi, il movi- nuovo conteggio"
TOIF=O
l-^h+^ a
IlEttLU uEt
^^l ^tto-

stro trasporta- {sru Fgffi tiffiexg{.}ruffi *ffi L ffififfigsYK#


+^v^
LLrr c -,,
)u Lu
-,,, r pd>-
^^- $p?x**d
<:nn i nozzi a In uno dei capitoli precedenti, abbiamo visto come con-
il braccio del figurare ìl registro OPTION per realizzare un determina-
Secondo organ
proposto.
ig ra m ma del l' eserci zio robot che li to conteggio.
prende, questo Dovremo impostare questo registro ogni volta che
sottrarrebbe desideriamo lavorare con il TMR0. Per l'esercizio in
tempo al processore, dato che ci sono modi migliori di corso, in cui ilTMR0 dovrà contare gruppi di 10, non è
fare la stessa cosa

*ffi*&ruXffiffi&Mffi&
VATORE DELTMRO
MffiTXruXTX\g#
tl pur5anTe
ll ^,,1--^+^ aluvaro
-++i,,-+^ -l-
oòt pezzt, sl puo
o00000r r Volore che si vuole contore
collegare al piedino RA4, il quale si
puo configurare per introdurre impul- III!tIO0 Complemenf,o o I del volore do conlore
si nel TN/R0. Ogni volta che arriva un
fronte di salita o di discesa, il TMRO si lIIltI0l Complemenfo o 2 del volore dq conlore,
auroincreme^ra senza la necessita di che è quello che si deve metlere nel TMR0
eseguire alcuna ist'-z one. 'r- Pi-,
confÌgurando ll TNIR0 Ln modo ade- lllllll0 Volore che si incremento nel TMRO,
con il primo impulso o istruzione
guato, potremo essere avvisati del
termine del contegg o delie 10 unità.
illiltìl Vqlore che si incremento nel TMRO
A^che se o-trsto qccordo rodo d con il secondo impulso o istruzione
procedere e rnigliore del primo, non e
ancora quello ott ma e, pero non 00000000 Volore che si incremento nel TMRO
potremo migliorare ulteriormente il con il ferzo impulso o istruzione.
programma senza l'ulilizzo degli A questo punlo owiene l'overflow e si oftivo
un flog per owisorci di questo
interru pt.
Come vedremo, abbiamo elimina-
to tutti i riferimenti al conreggio -
Esempio del valore che dobbiamo introdurre nel TMR0
che e controllato dìrettamente dal-

Sw#Swwrs*
necessario il divisore di frequenza, e dobbìamo confi- Con i valori dei bit 5 e 4 impostiamo rispettivamen-
gurare il contatore in modo che gli incrementi siano te l'incremento del TMR0 mediante impulsi, ed il fron-
prodotti con gli impulsi che arrivano dall'esterno e non te di discesa per questi impulsi. Le X riflettono valori
con gli impulsi interni del clock. che non hanno alcuna influenza sul risultato di questo
I primi tre bit (0-2) rappresentano il valore del dìvi- esercizro.
sore. Come abbiamo già detto, per questo esercizio
non è richiesto nessun divisore di frequenza, però asse- bóe$-#$qg: ffiffi&- Ytu$ffi#
gnando il valore "000" al divisore per il TMRO, risulte- Un altro importante dato da considerare quando si
rebbe di 1:2. Pertanto dobbiamo combinare questo lavora con iì TN/R0, è il valore con cui viene carìcato.
dato insieme al bit 3, che avendo valore 'l assegna il Per non creare equivoci è necessario conoscere come
divisore al Watchdog in modo 1:1. lavora il TMR0; ouesto contatore si autoincrementa ad
ogni istruzione o impulso esterno,
oppure ogni due o tre istruzioni o
imnrrlsi estprni sino ad arrivare al
H
suo valore massimo, che vale FF,
E'ù.i dato che sì tratta di un registro a B
H,'rJ
E,ú,:
bit, per poi passare dal valore massi-
C14l mo al valore minimo, a 00.
q,sr-r
A, ,^-+^ ----^^i^ e conosciuto
vuc)rv ^Pd))d99ru
H E'I
con il nome di overflow, e ci awisa
fccl HsI
CEE che il conteggio è terminato, anche
REù
I'EÉ H Eil se in realtà il conteggio non si ferma
EB?
*uo ma prosegue. rmparato queslo, se
UBt' HE1
-{
E ETIIHT vogliamo che il TMRO conti fino a

Ftr IEFII4 "3" non possiamo caricare questo


valore direttamente, altrimenti
otterremmo un conteggio di
Schema elettrtco dell'esercizio proposto
3,4,5,6,7 ,8..., sino a FF, avverrebbe
l'overflow e ne saremmo avvisati.
^^^i .,^r+-
\-/9 | il-t^rC ,,^^riamO
VUr Ld Lr vU9 Contafe
|

un valore dobbiamo introdurre il


rnmnlomonfn : 7 di nrroctn v:lorc
!v,,,P,Ll

Nl^ll-
l\Clld {in,
ll9uld rllnnr+rLo/ o
'rr dllc9d L rinnrt:fn
I rpvl rrn

0fiG E ; Il programa inizia ,.,


esempio per il valore 3, in cui si vede
goto IHIZIo : alf indirizzo U ,.,
'n modo semplice e rapido come si
tBfZIo bsf SIAîUS, fiPB ; Si passa aI banco I :
rnmnio nrael: nnrm:
noulu 8'866808ù6' ; Porta E uscita
nDuuf TnISB
noulu E'38È16806' ; Bg4 inqr€sso" if resto uscite La stessa tecnrca si aoplichera oer
fiùu0f TRISn
nouls B'081-llBBB' ; Configuraziùne de1 THnB numeri p ùr grandi.
nouuf llPfloH_REG
bcf SÍRIùS,RFB ; Si passa a1 banco B
I bcf
nouls
PùfiTS,LFD
0*F6
; Disattiua LED
; Carica il TNBo con il cohplemîto ${F$SeÌé! gLffiryffigil*
ftousf IHRB :a2di1ú
Nella f gura e r ooriato io schema
CLo btfss INICOil,Í0IF ; Sono pèssati 10 pezzi?
goto
goto
clcltl
nCCENDEÈÉ
; Ho, attendere
; si, auuisè cor iI LÉD
eettrico sempirficato. \,4ontandolo
dov'e-o coilegare oltre al 'al:ren-
,.

IIDERE bsf PORTB,LED ; ÉCcENdèTÉ iI LED


: nzzera lt +lèq per Ia prossina
bcf
goto
IHICoN,IBIF
unL0RI ; Torna alf inizio
tenp
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<<oraI nrnnrin <tt nttoqt:
f,r vl./r
Programma finale dell enunciato proposlo.
'il rLu/ VL !r rL L I urilLU Ll lq o
ino: norrho o l'r rnir: rha E rnllan:-
LVllqyo-

Sw$*wwsw
ta internamente con il TMR0, per fare in modo che si pR*we ffitr1 pR{3&K&M$4&
incrementi. ll LED è stato collegato al piedino RB1, La simulazione del programma precedente ci pone una
ma potrebbe essere collegato a qualsiasi altro piedi- nuova sfida, dobbiamo introdurre impulsi tramite RA4
no di l/O. in modo che il TMR0 si incrementi.
Se proviamo a farlo con I'opzione Window>Modify,
Pffi##ffi&f-$fv$e vedremo che è imoossibile.
ll programma, dopo aver considerato tutti i passi pre- Lo dobbiamo fare con l'opzione Debug>Simulator
cedenti, apparirà come mostrato nella figura. Come Stimulus>Asynchronous Stimulus. Da qui si aprirà una
novità, è possibile notare il nome assegnato ai registri finestra in cui fare la scelta dei pin da utilizzare per
e ai bit. introdurre tutti i dati necessari, e la forma di questi dati:
Anche se potremmo chiamarli come vogliamo, impulso, livello basso, livello alto, o zero e uno alterna-
ferma restando la funzione di ognuno e il modo di tivamente.
utilizzarli, normalmente hanno nomi che si possono Nel nostro caso sceglieremo gli impulsitramite RA4.
consrderare universali, in modo che tutti quelli che In seguito mostreremo lo stato della simulazione, subi-
utilizzano l'assembler del PIC abbiano un linguaggio to prima che il TMRO vada in overflow, e poi dopo l'o-
comune. verflow, al momento dell'accensione del LED

iéx sec rrnafg IfflcoN EQù gf0B


6ú 3 046ú€ng8 0PlloN,R€c E{u 0x31
EQU &85 aó ó 4€6É3116 lÎlsn €Qú 0xa5
EqU ar86 ion_r€g FF 255 11111111 tntsB €Qú 0xa6
atù5 3a 5ó 0C111646
0nG 0 rr 00 0 sB6ú004c OBG O
goto rtlzto Drta c[ 0 co60606€ goto IilIZt0
Inlzro bsf sTeÌus, RPo IilT2IO bgf STAIUS, sPO
nóùlú B'A0!06A9! roulv 8 09ú00060'
nóo{f fIISB
noul{ 8 00fi0!!t

10 1ó C5flÉCgo
qFe a7 7 09F4fi11 òcf PoRts,LED

btfE5 ixlcoff,t0tF
qOtO ACCEilDERE
$EAE bsf PoRlB,lEo bsf P0BIB,LEo
hcf IilTCoN,l0IF h.f lNtc0NtT0tF
goto UCLonI

€m €xD

Scelta dell'introduzione di stimoli esternt Scelta per I'inserlone di impulsi su RA4

Stato del I a si m u lazio n e Stato d el I a si m u lazi o ne


subito prima dell'overflow del TMR0 dopo I'overflow del TMR0 e accensione del LED

S*SSweglwm
rrlrlÍ1ff]írìrìììììì::*w*j;ir]:rrrrrrt1tilr11ii1111ftfì*:rra,ìii!€i:?;1í$i|ruiìììììilf*gtirflÍ:f'r)t*trùìmi:::::&{@
Scheda detle istruzioni :
f istruzione CLRW
uesta è un'altra istruzione
..- dai
nor l: no<tinno --, rr,Jgt- PARAMETRO PARAMETRO
stri, anche se questa volta
si tr:tfa del renistro fli
MNEMONICO I 2
lavoro W. L'operazione
che comnip non e altro
clrw
che la cancellazione (clear) del conte- Operozione: il registro di lqvoro W viene
nuto del registro, ossia la sostituzione
del valore del registro con 0. Come coricoto con il volore 00.
per molte altre istruzioni, producendo Cicli: I
questo risultato si attiva il flag Z. Codice OP: 00 0001 0000 00] 1
Dato che sì agisce sul registro W
non sono necessari ulteriori parametri
Flog: Z
addìzionali.

Caratteristiche dell' istruzione clrw.


$:Sffi $-*PK fl*N gJ gSYffi $Kg#f\$ ffi
{$_ffiw
Come si puo osservare nelle due figure seguenti, l'uso variano i registri si raccomanda di cambiare i valori dei
dell'istruzione clrw è simile a quello dell'istruzione registri STATUS e W prima dell'esecuzione di ogni istru-
movlw 00. L'unica differenza sta nel fatto che dopo zrone. Vì suggeriamo di introdurre nel registro STATUS
clrw si attiva il flag Z, dato che il risultato presente W ilvalore 00, anche se in pratica i bit 3 e 4 non si posso-
sarà 0, mentre dopo l'istruzione movlw 00 questo flag no cambiare, e nel registro W il valore FF. Osserviamo
non viene attivato. che eseguendo l'ultima istruzione la riga evidenziata in
Per fare la prova con MPLAB e vedere bene quando nero non si modifica.

Valore dei registri STATUS e W dopo I'esecuzrone Valore dei regisrri STATUS e W dopo I'e>ecuzione
dell'istruzione movlw 00 dell'istruzione clrw.

Sw#&e*ewwep
Scheda delte istruzioni:
f istruzione CLRF
Mru ome l'istruzione precedente,
anche questa realizza la cancel- OPERANDO OPERANDO
ffi lazione di un registro, in questo
MNEMONICO FONTE DESTINMIONE
caso della memoria RAM dei
WM
-^^-tÍt
dati. L'indirizzo del registro si
-^ come parametro. ll suo flag
>pcLil rLd
clrf f
assoctato è nuovamente Z, che verrà
messo a 1 dato che il risultato sarà 0. Operozione: il registro f viene coricoto con
il volore 00.
K$*&q PK fi #ru L*gSYffiWXg#
CL&P
gd
ffi
Cicli: I
Lavorando con le porte di ingresso e usci- Codice oP: 00 000.| I fff ffff
ta. sovente è stato necessario inizializzare
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-
:r.Ì20 ùdo ót tnt:iart:zèzto
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
Valore dei registri STATUS provare adeguatamente i differenti casi, dovremo ini-
e TRISB dopo I'esecuzione della prima opzione zializzare prima di ogni blocco i registri STATUS (00), W
(FF) e TRISB
(FF)
Nel prrmo
caso non si
orLrvo il ilo9 L
per nessuna

qrP
delle due
iFln. del p.ogr.h istruzioni, nel
seconOo caso
si modif ica
con la terza
istruzione,
Valore dei registri STATUS Valore dei registri STATUS così come nel
e TRISB dopo I'esecuzione della seconda opzione e TRISB dopo I'esecuzione della terza opzione
terzo blocco.

$c#!wsre
Appli cazione pratica:
rappresentazione dei dati
suldisplayaTsegmenti
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 di
innresso 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!vJr/ nerò Jrse
v!,v

la sua interfaccia è complicata da utilizzare o richiede


molte conoscenze, azioni ripetitive, ecc. è condannato
all'insuccesso.
Non bisogna però conf ondere le interf acce di
o di uscita piu adatte, con le piu moderne; il
ingresso
miglior modo per introdurre caratteri in un programma
resta 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
Rappresentazione del display a 7 segmenti
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 xL $}KStr$_&Y &3 Sffiffiei$ffiFdYg
*-^^;^"-^--
maggloranza ,.Jior ,,^;
vor avra ,,+ili---+^
uLrtttàLo quesì.o
-,,"- ^,,^-+^ elemenTo Quando abbiamo bisogno di rappresentare dei numeri,
come utente. E quello che indica il turno in pescheria o la soluzione più semplice ed economica è il display a 7
al supermercato, pero ora saremo noi a programmarlo segmenti. Come indica il suo nome è un dispositivo for-
affinche gli altri lo utilizzino. mato da 7 segmenti che non sono altro che diodi LED

COfiIPUIER

INGRESSI usctrt

It t | .--
1+lì\tt
rtlrll.l

L'interfaccia uomo macchina è sempre più importante.

$*#*wwm*w
Volore Volore
dP b;
i
ql i \loloe
i"crt"n"ti a".irol" S f eqdeimte
i

*i*"0 -:--*o -':-*-o


d **]*"4' * i
l
j

o
l

0 1-*: 1: 3F
n I ri0Ì0 0 1 1j 0l 0ó
n I 2 i o i1 0 I I 0 l! I 5B
0 I 1 3:Ot] 0 n I 1 rÌ I 4F
I 0 0 4a0tr l rì 0 I l; 0 oo
I 0 I 5:Oil I 0 1 I oi I óD
I 1 0 ójorl I l I I 0i l 7D
1 I I 710:0 0 0 tì I 07

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 ri degli interruttori potranno variare da 000 a 111.
numero 8. Questi segmenti sono numerati, come Prima di fare la tabella corrispondente dobbiamo cono-
mostra la figura, con lettere consecutive dalla 'a' alla scere un dato in piu sul display. Tutti sappìamo che un
'g' iniziando dal segmento superiore e continuando in diodo LED ha due terminali, conosciuti come anodo e
senso orario per terminare con il segmento centrale. catodo, e che se colleghramo il catodo a terra e l'ano-
Oltre ai 7 segmenti c'e un punto decimale nella parte do a un PIC dobbiamo far uscire dal piedino del PIC un
inferiore destra, indicato come dp, che a volte si ripete 1 logico per accenderlo, al contrario se l'anodo è colle-
anche nella oarte sinistra. gato a 5 V e il catodo al PlC, dobbiamo fornire uno 0
logico per accenderlo. Con i display succede la stessa
ffi ru# ruflg&Yffi *KLei"g$mKflXXX* cosa, solo che tutti i segmenti (LED interni) sono uniti
Lesercizio che ora vr proponiamo non ha grandi prete- fra loro per l'anodo o per il catodo, dando quindi il
se, vuole solo aiutare a comprendere il funzionamento nome al display che potrà essere di anodo comune o di
del display a 7 segmenti per il suo uso in progetti più catodo comune rispettivamente. In un display di anodo
ambiziosi. Leggiamo pertanto l'enunciato e mettiamo- comune, si dovranno mandare degli zero per accende-
ci al lavoro. re i differenti segmenti, e in un display a catodo comu-
Quello che si richiede è di trasformare ilvalore bina- ne ogni segmento si accenderà con il suo 1 corrispon-
rio che un utente introduce tramite gli interruttori in un dente. In questo esercizio simulramo il display che si
codice nuovo, in modo che si illuminino i differenti accende con uscita a 'l , cioè un display a catodo comu-
display a seconda del numero che si vuole rappresen- ne. Vedr tabella in alto
tare. I numeri possibili sono dallo 0 al 7, dato che i valo- 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

Si vuole roppresenfore per mezzo di un disploy o Z segmenti il punto decimale, questo rimarra
il volore introdotto tromite
(non+^ ., nor
ll mntivn r-. cur 5r pa55a al
lre interrutlori, in modo che il volore binorio di questi ultimi valori esadecimali e che si possono
sio visuqlizzoto in decimole. maneggiare più efficacemente i dati,
Questo può essere uno piccolo porte di un progetto più gronde, mpnfrp nnfrohhpro eSSere confusi
in cui un fottore importonte sio facilmente con tanti 1 e 0.
lo roppresenlozione dei numeri - doto che non tutti gli utenti
potrebbero non essere o conoscenzo *ffi#eruxffiR&ffiffi&
del sistemq binorio, come succederebbe se si visuolizzossero L'organigramma per questo esercizio
le informozioni tromite i diodi LED. è molto semplice, visto il modo con
cui utilizzeremo il display a 7 segmen-
tì. Forse qualcuno starà pensando che
En u nciato del I' eserci zio proposto
bisognerà testare il valore degli inter-

$e$trnrsre
Configurozione:
RAO-2 ingressi
RBO-ó uscite
Fo+
i:o+
>o+
Roccogli volore

ConYeÉi
vqlore in
codice 7 segmenfi

Visuolizzo numero

Organ ig ra m ma del l' eserc izi o p roposto

ruttori, ea seconda di questo,


mostrare i differenti valori sul display,
però per questa simulazione non sarà
necessaflo.
Disploy o cotodo comune :
Confìgureremo la porta B come
uscita, per collegare ad essa il display,
e la porta A come ingresso per gli Schema elettrico dell'esercizio Droposto.
interruttori. Dopo aver raccolto il ""--"-"-"-
valore degli interruttori si realizzerà una conversione, istruzioni tipiche di configurazione delle porte, di un
secondo la tabella vista in precedenza, e si visualizzera ciclo principale che corrisponde con i passi visti nell'or-
il risultato sul display a 7 segmenti. ganigramma e che è ripetuto all'infinito Per ultimo, la
subroutine di conversione dei valori binari al codice per
S{$"$flr*qe m$-ffiYYffiX{# i 7 segmenti, che abbiamo già spiegato parlando dell'r-
Nella figura dello schema elettrico mostriamo la con- struzione retlw.
nessione degli elementi da utilizzare.
Non sono riportati i collegamenti del- $sffi#v'e ffiffi*-
pR#*ffi&ffiF$&
I'alimentazione positiva e negativa, il
quarzo né iì pulsante di reset. ll ÌtIzt0
rl 9rograR in12ia
La simulazione del
nrrntn usL[rors
purrLU dorim:lo usr r.li.^l-,, À
dol ul)Pldy C e+r+a
)LdtU Passiar aÌ àaîco 1
programma non
lasciato in aria. Se si volesse collegar- B 000ad1r'
sarà semplice, dato
lo, si dovrebbe fare con la linea RB7. tèggìar ll larorè dèg1l lîtèrrúttori
che non abbiamo
0niaÈta allà roútìae ri trèsfo.Èriún€
Gli inter.uttori sono collegati alle
atN_tsE6

CICLO
uisuèriz.iah il !.lorè sùl distìag
st rtpètq aD tnflntto
nel sìmulatore un
linee meno significative della porta Si srN il ualorÈ dell'indlcè
display a 7 segmen-
sl rèstitùls.e il ùrÌ.ru úi a tr.sforÈtò
A nor rondoro niir comnliro l: rnn- 50
31 restltùis.e i1 uèhre dt 1 trasrorÈto
si rèstltùis.e iÌ oèlora di 2 trasforDto
ti, su cui vedere i

versione.
si rcstitùl5ce il u.l.r. dì 3 trasrorsto
si restitúiscè il !ùlore dì | tràsFùrEto
sì .èstltúlscè ll ùaÌù.e di 5 tiast.rDt.
sl r.stitúisc. lì calorè dt 6 trèscèrÈt.
valori convertiti.
si restltùisc. ù !òÌo.è di I trasforÉt. Dovremo accon-
ED
PM*GRAMM& tentarci di vedere i

llprogramma risultante è illustrato valori che ottenia-


Prog ra m ma del I' en u nciato proposto
nella frgura: si compone, oltre alle mo dalla tabella. sul

Sw$*wr*xse
valore degli interruttori, e al registro PORTB che contie-
ne il valore convertito. I valori devono coincidere con la
tabella che abbiamo visto.
!'ifirnfi8 ! €Qu 0
rcsÍocro F EQù
*
1
!lrs!8to PCt EQù Ax@
pà_xfl
úúÍ11111
3!í!Ífr0íìr
STaTUS
P0ITA
EQù
EQU
6xB
0x6
fl #ffi F$ s&$w $Jffi ru
q"$ pé
fl.l{&?*
1r11i111 PoATS EQU &ù
Íiíj!90tr0
$Í0$!0t0
RP!
IRISA
EQù
Equ
0xs
*45 Che cosa ne dite se vi oroooniamo di ulilizzare non un
3flrqî3ii6 lFlss Equ oxaé
solo display, ma diversi, per rappresentare numeri con
più di un digit? Di sicuro starete pensando: impossibi-
IflIZlo bsf Slnl0S,tP! : Pasllah al I
le, il PIC 'l6FB4 ha solo 13 Iinee di ingresso/uscita e
bancò
Fvlr Ea!s40000 :P.rt.Bdsrit.
xu* TnISB

ogni display ne utrlizza B I

Arioto r:ninno norl


H-,J Sr puo sempre ncorrere a quar-
tulHel
che piccolo trucco. In questo caso collegheremo diver-
si display in parallelo, in modo che I'rnformazione man-
Configurazione dell' introduzione degli stimoli esterni 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
oBG
goto
A t 11 progranà inizia display, che li attiveranno in modo consecutivo tramite
lfffzlo ; a11 indirlzzó a
dei 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 cOnOSCiutO
3i;3::il "
YVLJLV

6ee4ta1o Dvt' P0Al8 : Uii{irlzzlam 11 {ór


rlarr1l1 qot. GICIo : Si ripéte alt infini 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
Un momento della simulazone il proprio dato.
Per realizzare questa simulazione pero, servirebbe
registro PORTB. ll valore mostrato dipenderà dal valore qualcosa in piu dell'immaginazione.
introdotto sulle linee RAO-RA2.
Ricordate che il modo di introdur-
ro
ru nr ro<ti d:ti qi rnnfil in'
VuLrLr -ll'^^-i^-
'.. Àuoll
ryulo UP4IU-
ne Debug>Simulator Strmulus>Asyn-
chronous Stimulus. RBO
RBI
Abbiamo sceìto l'opzione Toggle, RB2

rho p nrrolla in nr,ado di simulare


RB3
RB4
RB5
RBó
meglio il funzionamento degli inter- RB7

ruttofl.
Ogni impulso che introdurremo
tramrte una linea fara in modo che RAO

questa cambi il suo valore, cioè se è a RA]

n ^---^.- - II c)ced
\JPd))Crdd ^-^ À - II pd))crddv.
^--.^"ì - n RA2

La simulazrone si realizzerà con


l'opzione Debug>Run>Animate.
RA3

Nella frgura è riportato un momento


di questa simulazione. Fate attenzio-
Schema elettilco per l'utilizzo di diversi display.
ne al registro PORTA, che contiene il

Sm#sqerwrm
Sch eda detle istr uzioni :
l'istruzione ANDLW
uesta e la prima istruzione logica che trovia- E considerato falso il vaìore 0, e vero tutto cio che
mo. ll suo compito e realizzare la moltiplica- non è falso, cioè tutto cio che ha valore diverso da 0. In
zione logica dei due valori: un valore lettera- alcuni linguaggi di programmazione, questa istruzione
le e il contenuto del registro di lavoro W. ll puo avere più di due operandi. Se tutti isuoi operandi
risuitato rimane sul registro di lavoro W. sono veri darà come risultato un valore vero, e se uno di
Se il risultato delì'operazione è zero, si attiva il flagZ. 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
OPERANDO OPERANDO come lo fa nel PlC, dove lavora sui bìt di un registro. La
MNEMONICO FONTE DESTINAZIONE prima tabella mostra il funzionamento generale e la
i
t
seconda un esemoio oarticoìare. Partendo da due valori
: per un registro e per un letterale, se si lavora con il regi-
Operazione: reslizzo l'operozione logico AND stro al completo, il risultato finale sarà 0 (falso) sola-
fro un volore lefierqle mente se uno dei due valori, o entrambi. sono 0. In tutti
gr
^li ---i ilr,)urrqLv
-l+.i
rLo)r "i-,,1+-+^ sarà vero, però non ha nessun
e un volore del reoistro di lovoro W. drLr

Cicli: I senso dare un valore, infatti le istruzioni che operano in


Codice OP: I l00l
'l
kkkk kkkk questo modo non lo danno: lasciano solo un valore V in
Flog: Z 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-
Caratlerisl.iche dell istruztone andlw.
nandosi con una istruzione and loqica.

ffisffiffig3x
{*F* tjg$Y$4#x,K#ruffi Tabelh generule
&Fdffi$_w

**n"i-M* "ii*:dn*-i
Mentre un'istruzione arit- **Js:*--*
metica uÍtlizza come unità
base un registro completo,
-.---L--i
un'istruzione logica opera "-*.t**l -""-".Y-.i "--.,'".-t.---"i
con ognuno dei bit di que-
VFF
**J_".i
sto reoistro in modo indi- y"."".i
nanÀania \/arlirmn
-"--x*i " -""-"Y,-*.-i
pcllucllLc. vcuror ru nr'^.+1
l]tlr)ld
differenza con l'istrrzione Lsrcro con rcgistrÍ lsvlttmnbit i i
At Lut -l -+:--^
-,.1 Lr ^--,,^^ndO.
)Lrdr ru uLLuPo
ut
fistruzione and, chiamata
anche moltiplicazione,
,ssx:k#ffi#--rti*s!t*"F."i "Hi*r";rj!Mt
-gl-qi-$3,:-llqjg$rs--.".--y*-*-:3l"qlq1srr,!sg!-q.!* -9ffio"-{nii
."".-fi

suppone che ivalori con


cui si opera siano veri (V) o
Fu nzi on a m ento d -^l I' t struzr o ne a nd lw
falsi (F).

#q*##ews*ww
Scheda di istruzioni:
l'istruzione ANDWF
ino a questo momento la maggior parte delle
istruzioni viste hanno due modalità, per quanto Fi F
riguarda gli operandi con cui lavorano; in que-
sto caso, anche l'istruzione and ha questa
l*1,
seconda forma: la andwf. Come si può immaginare, Circuito con interruttori per rappresentare I'istruzione and
per comparazione con le altre istruzioni, la differenza
sta nel fatto che le operazionr si realizzano fra il valore
del registro di lavoro W e il valore del registro f, lascian- yvlJLvÀ rriilo nrrrnn{n
Orroctn ,-- rrn ranic+rn 5t
un regr5rro ci uI'|tzza
"+ili--- per
" otverse
do il risuitato in uno o nell'altro, a seconda del valore rnco:lln <ttr(q^ tomn^
I rvv. PcrLl
pqpmnin noi nrnnr3pprylj 163{-
'
del secondo parametro. lnoitre verra coinvolto il flaq Z. lali finn.ì orestÒ mompnlo lp norte A p R si ulllizzava-
no come ingressi o come uscite, pero mai con le due fun-
I
f zioni allo stesso tempo; non perche non sia possibile, ma
OPERANDO OPERANDO
MNEMONICO FONTE DESTINAZIONE per maggior comodità. lmmaginiamo ora che la porta B
sia collegata a quattro interruttori e quattro diodi LED: si
ondwf tratta di conoscere il valore di questa porta per realizzare
Operozione: reolizza l'operozione logico AND nrpqt: n nrroll: nnor:zionp o di :nire sr ri LED Senza
fro il volore del registro f e il interferire con il valore degli ingressi. Per non falsare i

contenuto del registro di lovoro W


Se d = 0 il risultoto si loscio
dati, dovremo realizzare differenti maschere. Nella figura
nel regisfro di lovoro W e se d = l si esegue quest'operazione con l'istruzione andlw o con
si loscio nel medesimo registro f. la andwf. essendo 0ueste intercambiabili.
Cicli: I
Codice OP:
Flog: Annullamento dei bit più significativi della Porta B, rimanendo con i valori
degli intenuttori situati sui quattro bit meno signifkativi.
Ca ratte risti che d e I I' i stru zion e a n dwf
movf PORTB,W
andlw b'00001 I I 1'
Nella figura corlspondente si realizza la rappresenta-
zione grafica dell'istruzione and mediante un circuito
5e PORTB = 0,|101100, dopo l'operazione avremo che W = 00001100, dato che
formato da alcunr interruttori. È sufficiente che un solo gli zero del letterale fanno in modo che qualsiasi valore diventi zero, mentre
intorrt rttnro
ilrLErruLLvrs <i: :norin Lv /r,:lnra
)ro qpEr \vorutq {rlcnt
tcì>ur nnrrh^
pctL|c dr lrmn'Ài
tdItpdul- il valore I lascia che il risultato dipenda dall'ahro bit.

na non si accenda (valore falso).

Azzeramento dei ted della Porta B senza coinvolgere gli interruttori.


il$;*.${ tr.Y *fr L!*'i.STffi #X,h3fd tr . S $}bd$r
f istruzione andwf opera nello stesso modo della andlw, movlw 0t
cioe bit a bit, per cui l'esempio già esposto serve anche andwf PORTB,F

per questa istruzione. Così l'esempio che vedremo ora, Anche se l'operazione sembra la stessa del caso precedente,
sara simile per enrrambe le istruzionr. Queste, e tutte le nel primo caso awiene in W. per cui la Porta B non viene modificata, mentre
logiche in generale, si utilizzano per fare quelle che ven- nel secondo caso si realizza direttamente sulla porta, cambiandone il valore.

gono chiamate maschere. Una maschera permette di


Esempi con le istruzioni andlw e andwf
operare su diversi bit di un registro senza alterare il resto.

Ssw#swwyqx
r,rrrfrrlrrrr{ìrìsÌr11:i:.::::.rl3ry(lÌl!l{i:ffiffi ,!trrl
Applicazione pratica:
scrivere chiavi netl,a EEPR0M
-re- n numerose applicazioni è
ffi
ffi necessario scrivere una serie
g&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- Specificore indirizzo dq leggere.
gramma, possono essere scritti nella
memoria RAN/ che, anche se volatile, Dore I'ordine di letturo.
non perde le informazioni sino a che
non si spegne il sistema.
Pensate ad esempio a una sveglia: Roccogliere il doto lefto.
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 carta
di credito, i cu j dati sono scritti grazie Passi per la lettura della EEPROM dei dati.
a un'alimentazione esterna nel
momento in cui viene introdotta nel
lptlore' in altre narole dato che non ge ge8us qÉiffi Ift& !g;*A 4+
nn<<iodo :limont: .-zrone propfla,
ntt:ndn ò
q nol
rrgt lotinra
rgLtvrg À rnllan:f
E twilE9qto/ : a
E
vuorruv
quando non e inserita è scollegata.
In oresto raso se si utilizzasse lo
stesso tipo di memoria, la RAM, ogni
SIAfUS,BPB Passiam al bancc -l
volta si dovrebbero configurare alcu- 8'g8ABA66A' Porta I sgcita
TRISE
ni dati dell'utente, ad esempio il codi- sT*tus,RPs 8adóio al banco E

ao nercnn:lo d:tn -l^^ gUdt)td)l


_,-J LtìE ^,,-l-i--: muls 83 scriuièm l'irdirizeo da leggere
Fus€ EEfiDR_USR in ùna uariàbile ausiliaria
modifica andrebbe persa togliendo la call LEGGI_EEPROII Chia€ta alla roútine ói lettsra
Muf EElnTn_ufiB,tf si ùistralizzù it risrltito
scheda dal lettore. ll tipo di memoria muuf POETB sulìa PortB g
gsto I}IIZIB
adenrrato in nrresto ca5o e la LEGAI EEFROII muf EEADE_UàS,t4 SpostiÈE I'iodirizzo da leggere
nÚuíf EEADÎ ssl sro registro
EEPROM. bsf slATrrs,qP8 PassiaE al banee I
bsf EEColft,BD llrdine di lettura
Questa memoria si scrive e si can- bcf STATtS,SFt Passaggis al banco 5
[ouf EED6TC,t sprstia* il dato sul
cella elettricamente, e i suoi dati non 60u*F EIDSTR UAB registro aúsiliEris
returo
vanno persi togliendo l'alimentazio-
ne. Ora impareremo a leggere e scri-
vere in questa memoria, e applichere-
mo tale metodo in un primo esempio
Subroutine e programma per la lettura della EEPROM dei dati
molto semplice.

Sqp$&wwrsp
*-ilYYài Ke ffi tr*-L& 14 sM*ffig&
ffiffipffi*$r4 gSKX ffi&YX
ll nrocesso di lettrrra della memoria ilmff , ,JEt4l.tS
EEPROM dei dati richiede solo di HaF
SFS H€x llec
==.r:..::.1 Binaru ^i
tnr0 B0 6 ssos8i8o F

seguire i passi che sono elencati nella pcl BÉ 6 soggstuo -i


= FD
eption_reg FF 255 1i1'ti111 :BPc
rt^,.--
il9Utd -rr^^-+- {^-^tdO
cilE9OLO, rqLEl USO della status 1B 2il
fsr 5B ! BXtrl
RAM dei dati. porta Bs I BX 6é

lrisÉ 1F 31 6:{ 68
ll nrimo nàqsn p snecificare l'indi- psrtb B8 I BX 69

trisb iF 255 OXtr


rizzo che si vuole leggere. Dato che la Èedata FF ztt 6X 60

eeclnl gB 0 6X8ó
EEPROM dei dati nel PlC16FB4 ha 64 eèadr 63 3 6X88

byte, questo indirizzo deve essere eec[n2 0S 0


pDlath 00 0
compreso fra rvalori 00h e 3Fh. intcún
sg53
Bg 0
Questo valore deve essere introdotto t8prF FF 259
bsf STf,lUS,nP0 Passiaffi
nel registro EEADR, ubicato nella posi- MUlr B'56606050' Porta I
murf TRISB
zione 09h del banco O. L'ordine di let- bcf SIATUS,RP8 taúio .
qJ.:* = -ltrlr
tura si dà ponendo a 1 il bit 0 (bit RD) ---- 3à Fl P fl 6à 65 s t7 S^ mulu 63 scriqiaf
FI IT IT 35 FF FT FF Ff ff musf EEeDR_Ufif, in ufia I
del registro EECONl, che occupa I'in- TIET
SfI! FF FI FF FT TF Ff fF FT
call tEG[I_EEPn0fi Chianat;
IEà FF FÈ FF FF FF IT F' Fi
muf EEDgfn_Ufin,U si uis!:
dirizzo 08h del banco 1 nella memoria Hurf P0BTB sulla Pr
C*I3 FI TF FF fF 'F
fF FF FI T5 F' goto IfllZI0
RAM. A quel punto il dato letto appa-
rirà nel registro EEDATA, posto all'indi- muf EEntR UAn,il spo5tiar

rizzo 08h del banco 0. Questi passi --zùc,Bkún:Sbt:.tl,lHz :Ed

sono stati scritti in una subroutine chia-


Finestre preparate per la simulazione
mata LEGGI-EEPROM, la quale vtene utiliz-
zata per leggere un dato a un determinato
indvizzo e mostrarlo sulla porta B. lr** tA q*4 !Étrs Iosb Hid6# !+
Cambrando il valore del registro
EEADR-VAR, si realizzerà la lettura di
#fffl=;a:i:.1:,,r,'.::'':'' -ltrlt{}
un altro indirizzo. Per fare la simula- SF8 HaR Hex Dec Einarg ^
tnrú 0S ! ù0SBCú06 Scriuiat
zione di questo primo programma i.! :; *'!i1ì95-t ir úna {
lii
dovremo prendere, oltre al file dei opti.on_reg FF 255 11 111 i11 Chianati
si uisui
stituE 18 2q !6fl11886
registri specifici, come abbiamo già fsr sE É 606S0800 sulÌa Pr

porta g0 0 B6ffS08gB
fatto altre volte, anche i registri della trisa 1F 31 06011111
porta EEPROM dei dati. Inoltre se p*ril BS i31) 1tÉài$nf Ílouf EEADn_Uf,ft, S
l:f::i !41 È 8$il8$5f3 muuf EEAllfi
vogliamo che neìla porta B si veda il .rc;t: ti i.2í 1S8È-r*BS bsf STeruS,fiP6
ercBil1 ÈS S BA60SB06 bsf EEcoH-l,BD
valore dell'in dvizzo della EEPROM, Éeadr Bg 3 B6úBBII 1 bcf STATUS,fiFg

prima dovremo mettere in quell'indi- escún2 65 ! 068008S0


pclath S6 0 86!05S6g
rizzo un valore, dato che per default !:Ì1r.,:: lil I *:i**SgE1
ir 6$ 13{ I g*g-i *i1F
hanno tutti valore FF. Questo si ottie- tlSFrt 13 i7! *.11 S*1j
1

ne con l'opzione Window>Modify.


Nelle due figure sono riportate
queste finestre, prima e dopo la
realizzazione della simulazìone. ---- !e fi e C! 3{ 85 S t7 !8^
ltft tl ;f :i S8 :l ii l- i: Vt
Questa simulazione si puo fare con 33!! i:: ft iF ar i:t F,' rt Fr a

l'opzione Debug>Run>Animate, o 3&a ti FF at: if iF íi Ff


rF rI
ts! rF FF tr ft ir FF ti fF Ff
Debug>Run>Run, infatti ci interessa
solo il risultato finale, dato che que-
sto programma è in pratica un ciclo Ek0n Sin {l'lHz Ed

che realizza continuamente la stessa


Finestre dopo aver fermato la simulazione
funzione.

$w#*wwsw
sf,ffi33Y#ffi&
Ed
ff#.1*;' Mffif,q#Pf,i Etu Prottrt 0.en"S lptore ]oois Wìndou Eeh

ffi*itrry#ffi ffirg m&?i


illl nrnro<<n
PtvLgJJV
.li
Ur rrLulcrrr
q6pi11r
)!r Àall:
uEllo

EEPROM è un po' più complesso


: I1 orooranna inizia
di quello della lettura. Questo
ncrrhp mtrntro l: lottr rr3 e imme-
IHIZI0 noulu 03 ; HEttiano I'indirizzo in cui scriuere
diata, la scrittura non lo è. La mouuf EEADB_UAE ; su di una u3riabite ausiliaria
scrittura impiega un tempo mini- noulu 27 ; l4ettiano il dato da scriuere
frouuf EEDATA_unR ; su di utra uariabite ausiliaria
mo di alcuni millisecondi. lnoltre, call SCRIUI_EEPR0}| ; úhianata alla routine
goto FIHE
affinché non si producano scrit-
iure errate, bisogna rispettare SCBIuI-EEPR0ì| nouf EEnDfi-Ufi8,1,1 ; spostiano I'indirizzo da scriuere I
alrrrnp nrnrodrrrp di sicurezza frouuf ETADR ; sul suo registro
nouf EEDAfn_unR,ll ; spostiano il dato rla scriuere
nrodi<nncté d:l .Òstr rttore nouúf EEDATA ; sul suo registro
bsf STÉTUS,BPO ; Passaggio aI barco 1
N/icrochip. Così dopo aver speci- bsf EEc0Hl,trBEH ; Perness0 dÍ scrittura
noulu 0X55 ; Inizio della sequenza
ficato I'indirizzo dt scrittura del nouuf EECoH2 ; obbligatoria di
noqlu 6XÉA ; sicurezza
dato e abilitata la scrittura, dob- nouuf EEC0H2
bsf EEC0H1,I,|R ; 0rdine di scrittura
biamo caricare nel registro ret urn
EECON2 due valori reali: 55h e FIHE
AAh. Questi registri non sono EHD

implementati fisicanente e si
ulilizzano solo in questo proces-
so di scrittura.
Subroutine e programma per la scrittura della EEPROM dei dati.
Oltre a questi, si utilizzano glì
stessi registri che servono per la
lettura; infatti sono stati inclusi
ldit lebuq lploro lock Windw leb
in una subroutine chiamata Ede fuotwt

SCRIVERE_EEPROM, che si usa f ili!=l:li-. :: :'


e;r4r:= ÉG-F*=1.Ií".Î.F.1:;t.l'i-. .-'-','r,'.t:.,,,':,,,,, =lgjèl
nel programma della figura per SFB Hane llPx D8c ginarg EEDîTff,UAR EQU úXOD
tnr0 A0 S oBBdnoSS IRISB EqU
scrivere il dato 27 all'induizzo
0l(8ó
irì i3 1E f!8iÉt11 EECoN1 EqU 0X88

03. Cambiando il valore dei regi- rption_r?g FF 255 111 111 11 EECON2 EQU OXSC
ststus 38 !ó 681 1 008
1

stri EEDATA_VAR ed EEADR_VAR fsr ú0 ú 0BB5ù060


porta tlo 0 06900880 l1 progra
si realizzerà la scrittura di altri trisa 1F 31 80011111 alf indir
portb 0(} I B00$0rrtln
dati, in altri indirizzr. Per la simu- trisb FF 255 11111111
eÉdata 21 3S 6t!l t10111 nsulr4 63 I'lettiifto
lazione di questo secondo pro- eecnnl gó ó 0B0Bú11 B oouuf EES08_UA[ su di rn
gramma, utilizzeremo gli stessi eeidf ú3 3 00ú0ù911 noulu 27 llettianù
eeccn2 Èn 170 10101816 nouu,f EEDfiTA_UAR su di unà
reoistri del r-aso nrecedente.
r pcldth B0 B 00008000 call SCfiluI EEPR0tl Chianata
irìtcon 68 B 8000ùS60
Realizzate la simulazione con $
t Siìr?
iìfi
1'!
17S 1S101010
tl S681 ùÌ J 1

l'opzione Debug>Run>Step e SCRIUI EEPR('I4 núuf EEnDR_UÎR, !, spùstiano


Íìoeuf EEfiDB sul suo r
fermate nell'uìtima istruzione il nouf EEDnTe_UnR,U Spostians
programma, arrivando all'eti- núuuf EEDATe sul suo r
bsf STnIUS,RP0 Pesseggio
chetta fine, cosi come e mostra- bsf EEC0N1,!,REll Pernesso
---- 06 B2 03 94 05 0ó 07 Bf.
6l noulr,, 0X55 lnizío de
to nella f igura. Come si puo SCÉS FF TF FF F' FF FF FI FF FI
5810 Fr FF Ft Ft Ff FF tf rF ti
nouúrf
noulu
EEC0ll2
6l{AÉ
obbligato
s i curezza
osservare non e stato scntto È@$ iT FI FF FI FF FF FI FF FI
Sffiq FF FF FF FF FF F!: FF IF FI
nouuf EEC0N2
bsf EE[0H1,t,B 0rdíne di
nulla nella EEPROM dei dati. retur n

Questa scrittura non si produrrà


fino a che non utilizzeremo rc:&r13 w.&4.-zdcc Bk0n 5h thlHz Edt

ancora diverse volte l'opzione


Finestre al momento dell'ultima istruzÌone
Step (F7). Questo è dovuto al

Sw#swwryw
sa Íettieno f indlrizzo ln cui scrluere
EEÉDB-UfiB su di una uariabire àusiliarte Vogliomo ufilizzore
27 Eettlàmo il dato da scriuere
EEDÉTÉ-UÉg
SCBIUI.EEPROI
su dl una uartàbire ausiliarta
chlamata alla routine
lo EEPROM
FIHE
per scrivere un codice di un
SCB I U I-EEPAOH EE nD
EEfiDfi
R_!fÉ ,U sDostiano L'indírizzo
sul suo registro
da scriuere solo digit che può essere
EEDÉfÉ-U6n,0 SDostiano il data da scriuere
EEO9fA sul súo registro letto, visuolizzoto o combioto.
bsf slfiTUS,8PO PeEsagglo al banco 1
bsf EECOill,#REH Pernesso di scrittura lJopzione dipenderù dol
gt55 Inlzfo della seouenza
EECOH2 obblígatoria di
ax A6
EECON2
volore di un segnole
d'ingresso, e ilvolore do
modificore si introdurrà
tromite quottro piedini del PlC.

Subroutine di scrittura della EEPROM dei dati modificata. En u n ciato del l' esercizio proposto.

tempo che impiega la EEPROM per scriversi, per cui, tura che la lettura della EEPROM. Leggete l'enunciato
se si uscisse dalla subroutine immediatamente dopo che vi proponiamo. Utilizzeremo i quattro bit meno
l'ordine di scrittura, questo tempo non sarebbe anco- significativi della porta A per introdurre i valori da scri-
ra trascorso. Se dopo aver chiamato questa subrouti- vere nella EEPROM e la porta B per mostrare questo
ne si proseguisse con il resto del programma, dopo un valore. La quinta linea della porta A sarà quella che
certo numero di cicli riusciremmo a realizzare la scrit- determina se si legge la EEPROM o se si scrive in essa
tura, però se subito dopo ilciclo discrittura siva a leg- un nuovo valore, a seconda che abbia valore 1 o 0
oere o si nretende di scrivere consecutivamente diver- rispettivamente. Seguite le istruzioni del programma
si dati in differenti indirizzi, il programma non funzio- principale. Le chiamate alle subroutines le abbiamo grà
nerà, dato che non ha avuto tempo sufficiente per viste e commentate.
realizzare la scrittura. Dovremo quin-
di modificare la subroutine di scrittu- !Bì@r Edìt géus qdbF lmb

ra. La modifica consiste nell'attende-


re che la scrittura del dato sia termi-
nata, croè verificando quando viene
I HI I 0 bsf srfiTus,
Z Banco BP B 1
messo di nuovo a 0 il bit WR o quan- cITf TBISB Porta I ugcita
noulu Porta A ingresso
do il bit 4 del registro
(bit 1F
EEIF nouuf TFISA
bcf Slfilus,RPB Banco
EECON 1) viene messo a . Dopo
B

1
SCELIg btfss P0nTÉ,4 opzione da scegliere
dovremo resettare via software que- goto SCRIUEfiE Se 884=B si scriue
goto LEGGEBE Se BA4=l si leqge
.+^ {lrn
>LU lld9. Inr
Iulld h' rnnrld f666i62
UUUI LL!ril!u di nrn-
vr prv SCRIUERE froulu 93 Hettiano 1'ínrtirizzo in cui scriuere
nouuf EEADÉ_UÎB su di una uarirbile alsíliaria
grammazione consiste nel verificare nouf PoBTA, l,f íettiano il dato da scriuere
froquf 5u di una uariabile ausiliaria
che il dato scritto sia veramente il
EEDNIÉ,UAÉ
caII SCNIUI_EEFNOil Chianata alla routine
goto SCELIB si torna a scegliere
dato che volevamo scrivere, leggen- LEGGESE noulu 03 Scriuiano f indiri?zo da leggere
dolo e comparandolo con l'originale. Íouuf EEnDR_UÉR in una uariabile aùsiliaria
caIl LEGEI_EEFRO}4 Dhianata aIIa routine di letturi
ll bit 3 del registro WERR verrà messo múuf EEDf,Tn_USR,t, Si uiEualizza il risultato
nou$f POBTB sul1a Porta B
qoto SCELTA si torna a scegliere
a 1 in caso di errore.
LEGGI_EEPSOH nouf EEDNTh_UfiR,14 spostíamo l'indirizzo da leggere
nouuf EEDf,fn su di un registro
h<t qTÉtil( epf P:<<i:nn rl h:nrn I
e_ffiYT#ffi& m sflffi]i?Y*ffie
fl*î4ffi3qJruYil
fìi
ut <onrriin I r rv)LtEtEr I tv r'n:
)E9utLv mncfrorom^ ur to nirrnl:
PtLlwto
Terminato il nostro programma, si prosegue eseguendo posizioni non valide
applicazione dove si ulilizza sia la scrit-

Sw$swwrm
Sch eda dell,e istr uzioni :
l'istruzione CLRWDT
istruzione clrwdt (clear wat-
rhnlnn\ r:nrall:
il ton
,, .-,,rporzza-
tore chiamato Watchdog, evi-
;Tlpo di processore
tando In questo modo cne List
include
P=1óFBl.
"P1óF84-IHC" ;Definizione dei registri interni

raggiunga il suo valore massi- orq


goto
0xg8
IHIZI0
;Uector Reqet

mo (FF) e vada in overflow, cosa che org 6xB5 ;salqa i1 uector di interrupt
farebbe resettare il sistema. Non ha THIZIO ClTf POBTS ;Cancelta I latch di uscita
bsf Slnf[S,ÈP0 ;seleziona il banco I
nessun parametro, quindi il suo uso è clrf
noulu
IRISB
b' 06011 1-ll'
;configure ta porta E cone uscitè
mouuf lnlSA ;Configura la Porta fi cúnè ingresso
semolice
'-"'r"-- come scrivere il suo nome. bcf sTnTUs,BP0 ;Sele?iona il banco 0
Nello stesso momento in cui viene btfsc P0Rln,B ;festa Io stato di RÍa
messo a zero il Watchdog (WDT) si mette goto Rno-uala-1 ;RAB uale 1
btfsc PORTn,f ;RÉ6 uele 0' lesta 10 stato di RÉ1
goto Sono_a-1 6
a zero anche il suo prescaler, o divisore di nouls b'181fifi4'
p0FlB
ncusf ;Sono a 60- Esci dalla sequenza
Íroatonza
,,rYvLl rhe e rna risorsa utiltzzata dal goto cIclo
\^/-+-1.!^^
vvd LLI ruu9 ^^" -fe UltefiOfmente il Sono a lB nouls b'00091111'
Ptrr "i+-"-l
I rLotuo nouuf PofiTB ;Sono a 18- EsGi dalta sequenza
goto clcl0
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, tipo RC, e si incrementa sino ad arrivare al valore FF,
per poi andare ìn overflow e resettare il sistema.
ts{FrÈi}i {{:s L"ISì$,{*HE*};il {. t$qW*T Questo non succede se fra le istruzioni del program-
ll Watchdog e una risorsa propria dei PIC per vigilare ma se ne trova qualcuna in grado di cancellare ìl
che le istruzioni di un programma siano eseguite in Watchdog: la clrwdt, con cui il contatore ripartirà da
:donrrato Frrnziona con Un clock interno di
mndn uu!:,
|||vuv zero. Puo succedere che a causa del rumore esterno
al sistema, il Program Counter vada
x I puntare su un indirizzo memoria di
a

che non contiene nessuna istruzione.


PARAMETRO PARAMETRO !
I
In questo caso il programma smette
MNEMONICO I
I di funzionare, però il Watchdog con-
l

..' l.--l-.Y 9 r..: .


tinuerà ad incrementarsi sino ad arri-
vare a FF e debordare, resettando il
Operozione: concellozione sistema, e assolvendo così alla sua
del Wotchdog WDT). f unzione. La f igura mostra un esem-

Cicli: 1
pio nel quale si controlla l'uso del
00 0000 0r r 0 0l 00 Watchdog. Quando il programma è
Codice OP:
eseguito in modo corretto, il WDT
Flog: #TO, #PD
viene messo a zero all'esecuzione
"_*J dell'apposita istruzione, altrimenti si
Caratteristiche dell' istruzrone clrwdt produrrà un reset.

$*SSq#ssws$
Scheda detle istruzioni:
f istruzione COMF

on quesla rslruzrone sr rea-


Roim Eú Qpliffi lcols {irdw lelp
lizza il complemento a 'l del
Qebus

valore di un registro. Questo


si fa bit a bit, cioè ogni bit di
valore zero del registro viene
LISI P=1óF84 ; Definizione del processore
cambiato con un uno e ogni bit che
EqU Bg ; oefiîizione di uariabile
vale uno si cambia con uno zero. ll EflU Bó

risultato di questa operazione si puo OBG 6 ; Posizionanento della prina istruzione


memorizzare ne lo stesso registro da ; all'indirizzo 0 della mensria di prcgranna

dnvp si nrpndp il v:lo1s iniziale Se il '11 clrÍ P0ftlfiE ; Iúposto la Porta B cone uscitd
parametro d ha valore 1, o nel regi- 12 bcf STAT0,5 ; Passaggio dl bdnco 6
t3
14 noulu b'01 ' ; Houinento deÌ uilore iniziale
stro di lavoro W se il parametro d ha nosuf PoBIAB
61 81 01
; sulla porta I
16
valore 0. Inoltre nel caso che l'opera- 17 8ICL0 conf PBBTg8,l ; Conplenento a I del ualore della porta B
1f goto
zione dia come risultato 0, il flag Z t9
CICL0

verrà messo a I. Questo significa che ?! EHD ; Fine del progrÈnna

il regLstro, prima dell'operazione,


aveva valore FF

:rh :^l ao".; $'TÉ-Yq;!*{{'**::


{*l*r
l'rr<n di nro<tr ictrr rzinne ò <omnliro
lt^^ Programma di simulazione delle luci di Natale
f--ro -^*^li--+-
LUrrPilLoLo ^^+.^L-L-^
PULIcuuc ^-.^"^
c))cttr tdp-

plicazione dove la si vuole utilizzare. Per il


I OPERANDO OPERANDO
OPERANDO * vooliamo limitarci ad
momento vogliamo rsarla in un
acl usarla rrn
MNEMONICO DEST'NAZIONE programma cne la vede prolagonrsta.

: e r-:-"""-i. " l ": "-g* i


lmmaginiamo per esempio le luci di un albe-
ro di Natale. Possono seguire differenti
Operozione: complemento oI
del contenuto sequenze, pero la maggior parte delle volte
del registro f bit o bit. Se d=0 il si accendono e si spengono formando drse-
risultoto si loscio nel registro di gni in cui ognuna di esse si complementa
lovoro W. se d=l si loscio nello con l'altra. Digitate sul PC il programma
.-l^ll- fi^'
UEIIC llVUld rrrÀrta
U 9UdlUdtC nall:
rrLilu nnrt:
pvrLu u mentro
R tttLttrtL
stesso registro f.
viene eseguito con l'opzione "animate".
€icli: I
\/nlcfc nrÒ\/Aro:d in5gflpg Un inteffuttofe
oP: 00 l00l
Codice dfff ffff che, a seconda del suo valore, faccia esegui-
Flog: Z re una sequenza oppure un'altra inventata
d: riniT F norrho nnn mottorln in nr:tir: nor
Caratteristiche dell'istruzione comf
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.
Finestra di configuraztone del Watchdog in MPLAB
La zona cerchiata in rosso è l'opzione

rhe dovremo
.,,'" nrendere
Y, in conside-
razione in questo caso: impostar-
do NO il Watchdog rimarra disabr-
litato, al contrario, ìmpostando Sl
lo abiliteremo Se in seguito desi-
derassimo utrlizzarlo, dovremo
riprogrammare il microcontroller
con 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, se
t,^^-;^^^ -^^l+^ ---ì,,None,,
I upztut rc )LcrLd )drd il
La disattivazione del Watchdog si fa tramite il software di scrittura
Watchdog rimarrà disabiliiato.

Sss#*qwwwres
Si vuole visualizzare sulla porta B

il valore complementato introdotto sulla porta A, Configurozione:


PB uscito
in modo ciclico, Inizialmente la porta A avrà valore 0, PA ingresso
5i controllerà l'uso del Watchdog, OPTION

Questa scelta equivale a mettere NO nella videata del


OO+ PORIA B
software di scrittura. Per l'opzione Sl abbiamo due possi-
bilità: una equivale a quella del software di scrittura, vale
.;:;:,;::l
a dire abilitare il Reset del PIC all'overflow del Watchdog ,. a::a:

ìii.:::
(WDT Chip Reset Enable), e l'altra consiste nella possibi- I

lità di fermare il sistema quando sr produce l'overflow *W ':;'::ì:


.:r,iaa
C {PORTA A) 't:ì:
(WDT Break Enable). L opzione del Prescale del , ìl,rì:ì

Watchdog (WDT Prescale) durante la memorizzazione, :1r:i:.:l

non serve quando si lavora con un PIC'I6FB4, quindi l,:,:i!


:

appare disabilitata anche se si seleziona una delle due W+ PORIA B ..:a.a:.,:.:;j

,: ,.il
opzioni relative. La selezione del Prescale per il
Watchdog, in modo che ritardi il momento dell'overflow .,,liltj
va fatta via software.
. :aa,
O rgan i g ra m ma del l' en u nci ato p roposto. :l:1i
3L L&V#K* {#ru KL WeTfl*{ ffi#ffi
Se avete scelto di ::,:,:î,L,:.

lavorare con il

Watchdog, nelle pros-


cimo.rinho
-i.'- "v'
imn;roroto
come fare. Scriveremo
un primo programma
d'esernpio, molto
<omnliro dnrro <i riodo . ìt,ììììt

cnraramenle come
.:,4
funziona ilWatchdog. .a:.,.:aaaa

:,1,,,.t.,.
Come dichiarato nel- .:1,:;.11

l'enunciato, realizze- ':"::::{*

-:1ì!ì
remo un'azione
.r I

in
,.:$
modo ripetitivo, owe- ':'::'*
ro un ciclo infinito, :.;.:,:.:.al

dopo l' inizializzazione .. :,:',:.;


.:::i::
delle variabili. fazione
,rì
' iìì:ì,iill
da compiere consiste 'I r:ìl
nal nronriora il nlrin
':,i::i::
che si trova sulla porla .r ìì':l':i

A
n, -h^iE
Lr ^^+"ì
Lr o ^--^.^ c
E))ct
.
..: ì.li
.::,
Pv
::::,i
variato dall'utente
esterno, complemen- :,:.'.',:,1..::!

:t:l:.::i

tarlo, e mostrarlo sulla "Ll',;ll:.1

porta B.
':,a:,:a!&

Come sempre,
Organigramma tradotto in programma ':.:.:::"t{t)
per prima cosa fa-

Sw#sEwcxww
remo l'organigramma dell'enunciato proposto. Dato che stiamo eseguendo una simulazione, se sce-
Come possiamo osservare si prevede l'uso del glieremo le l'opzioni Animate, potrebbe passare diver-
Watchdog, anche se non del suo controllo, dato che so tempo prima che si verifichi l'overflow , quindi apri-
l'unico riferimento fatto al Watchdog è la sua confi- remo alcune finestre per farlo in un altro modo, senza
gurazione nel registro OPTION. Inoltre possiamo perdere dettagli.
vedere che il nostro organigramma si avvicina molto Da un lato attiveremo una finestra che ci indichi
a. queilo cne SarannL
^"^ll^ .h^ ..r-^^a lo i<trr rzinni,, dol nrr
--, r,Jgramma, in ogni momento il tempo trascorso: è la finestra
d,atn rhp i tro rinrradri :rrrchhcrn nntrto contenefe Window>Stopwatch. Ad una f requenza di 4 MHz, il
affermazioni del tipo: "inizializzare porta B a zero" , tempo che deve passare prima che il Watchdog vada
" Complementare porta A" e " Passare complemento in overflow sara di '1 B ms, pero saremo capaci di fer-
della oorta A sulla oorta 8". mare la simulazione in quel momento, per vedere in
Nel listato del programma si possono vedere che modo il programma inizia nuovamente?
chiaramente ognuna delle parti riflesse in preceden- Sicuramente no. Per questo utilizzeremo anche la
za nell'organigramma. Nella configurazione del finestra per tracciare il programma; in altre parole,
registro OPTION, gli unici valori che sono significati- questa finestra ci permette di vedere quando il pro-
vi sono ibit da 0 a 2, che pongono il prescale a 0, e 9rdililro po))o ptrr |
Iistruzione che ci interessa. Per
|

il bit 3 che assegna questo predivisore al Watchdog. fare questo utilizzeremo Window>Trace Memory e
ln conseguenza di questo, il Watchdog impiegherà Window>Program Memory. Nella finestra di memoria
circa'l B ms ad andare in overflow e a resettare il del programma dovremo selezionare il codice che
sistema. Dopo aver editato e assemblato il pro- vogliamo mettere sotto controllo, ad esempio la prima
gramma, faremo una prima simulazione, con il istruzione del programma "bsf STATO,5".
\^/-+-L,l^^ ur>or'uato (Options>Development
vv6LLruwg -ll--++i,, Cliccheremo poi con il pulsante destro del muose,
Mode>Configuration>None) per vedere meglio la ^^' {^'^
pcr -^^-'i'^ ur
rorc opvorrc "^ rlrenù contestuale. All'interno di
d iff erenza. questo menù sceglieremo la funzione di tracciatura

sge$ài$_&gx#*$*
*ffiL pffi*&$4&ffiM& l;l {=
Utilizzare l'opzione
Debug>Run>Animate per rry
simrrlarlo e senTa nreoccu- 2 0001 01só clrf gxó
3 CgsZ SqfF nouls 0xiF
parci dei valori che assume- b 8093 8985
:,r,r:.:*::gg$l 3ss
moesf ft5
nouls $rS
ranno i renistri osservare ,:,:,+..:lgg Smf
7 900ó 1283
Kvof 0!.1
bcf fr3,&(5
come vengono eseguite le I C007 S18ó clrf Bxó
ictrr rzinniil. 61656 616 9 0008 0905 cIcL0 coBf &(5,11
r)tr u4lvr uuvv Lr rE an+rr
cl lt l o 10 00Bq 088ó muqlf t*ó
nel cìclo, il programma con- 11 000n 2808 goto ClCt0
tZ g00S SFFF addlB 9:{ff
tinua a girare lì all'infinito.
,1:
Configureremo ora il -i
,l
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 ,:-:i'.i*
".:.
'.":
Options>Development :

Mode>Configuration>
WDT Chip Reset Enable. In
questo modo il programma
si resetterà quando andrà
Finestre da utrlizzare per la simulazione
in overflow il Watchdog.

$w$ffwwre
il#pég$q#il1#
ffiffiL W&Yflffi**ffi
Ora controlleremo il
Watchdog, in modo che non
provochi questi reset del
prog ra î ma. Per fa re
ouesto rtilizzeremo
l'istruzione "clrwdt": essa
cdrceild il \^/-+-l-J^^
--^-^ll- il
vvdrLnoog ognl
,,nl+r
vurLo -h^
Lr rE ',;^^^
vrcrE ^.^^' 'i+-
E)cvutLd/
evitando che arrivi al limite e
vada in overflow, menoa
che il programma sfugga dal
controllo in orresîo .aso il

WDT resetterà dawero il


sistema. Questa istruzione di
solito si mette all'inizio dei
cicli, e in sequenze di
programma molto lunghe.
Provate a rnserire questa
istruzione come nella figura,
e ripetete la simulazione: ha

\tatn rlplle fine<trp rlnnn sygl'fermato la simulazione


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ù rapida
sarà Debug>Run>Run
Nella finestra Trace
Memory apparirà nella
parte sinistra l'istruzio-
ne messa sotto control-
lo, e nella parte destra il
tomn^ fr2<rnr<^ ll
primo tempo è quello
trascorso dall'inizio del
programma, dato che
si tratta della prima
istruzione, ogni appari-
zione successiva invece
indicherà il susseguirs,
dpn li ovorf Inrnr dpl
Inserimento dell'rstrulone per il controllo del Watchdog.
Watchdog.

%w#@wwww
Scheda dell,e istruzioni:
l'istruzione SLEEP

uesta istruzione oone il microcontroller in 1 e se erano a 0 anche. Nemmeno il TMR0 funziona,


stato di riposo o di basso consumo. È suffi- ouìndi non arriva all'overflow.
ciente scrivere il mnemonico dell'istruzione, Questo è lo stato tipico di un telecomando; rimane
dato che si utilizza senza nessun parametro, in stato di riposo sìno a che qualcuno decide di utiliz-
per fermare il sistema. ll flag #PD (Power zarlo e preme un pulsante.
Down) si pone a 0 e il fìag #TO (Timer Out) si pone a '1

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
PARAMETRO PARAMETRO N/CLR#, oppure mediante il Watchdog.
MNEMONICO 12 In quest'ultimo caso, entrando in sleep, il Watchdog
s.l .e e p si azzera, però dato che funziona con un oscillatore
Operozione: Porto il microcontroller nello indipendente, può continuare a incrementarsi e arriva-
stoio di riposo re all'overflow. orovocando un reset. Si tratta comun-
Cicli: I que di un reset speciale, dato che non si riparte dall'ini-
'l
Codice OP: 00 0000 0l l0 001 zio del programma, ma dall'istruzione successiva allo
Ffogs: #IO, #PD
sleep.
Copiate il programma della figura e simulatelo con
il WDT attivato e poi senza attivarlo. Attendete almeno
Cara tteristiche del I' istruzione sleep
1 B ms ner vedere cosa succede.

Questo tipo di funzionamento è con- Aeh4 Splil€ lcds Ehdm Help

sigliato per applicazioni in cuì ci siano


lunghi periodi di inattività, nei quali il
microcontroller debba comunque LISÍ P=16F84 ; del proeessore
'efinizione
sorvegliare il valore degli ingressi. SIAI0 EQU B3 ; Definizione delle variabiti
POFTAB EQU A6
BPT EOU S1

ffism$dètrx oBG B i PosizioBatrento della prina istruzÍùne


: alf indirizzo B della @mria di progrannà
fr#ru e--xsK$q#xg*rutr sLHtrp
Quando si esegue l'istruzione, l'oscil- clrl PoBfnB
noulD b'68681860'
; Porta B cone uscita
; confiqurazione di 0PTI6H per il fDT
latore del sistema si ferma. nouuf oPT
bcf SIfiTo,5 ; Passaqgio àl banco g

Dato che il ritmo, o velocità delle noulu 6xFF ; llovinento .lel ualúre iniziale
istruzioni, è scandito dall'oscillatore, n0!uf PoETAB : sulla Forta I

e nresto p fermo le istruzioni si fer- fICLB sleep ; I1 ricrocontroller entrà in stato di riposo
conf PoEfnB,l ; Si canbia il salore della Porta B
qoto CICLo
mano anch'esse, cioè non sono piu
EllD ; Fine del progranBa
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
,,.1^"^. r I rnc+nrrnnn r Programma che permane in stato di riposo
^i,,
Ptu votwiE, )E Etqttv o I rcJrcrorilr\/ d

S*#swswwe
Scheda detle istruzioni:
f istruzione SWAPF

on questa istruzione si cambiano i quattro bit {5{?rz]lr'î {*ru


# g$?ffi *J.:*i, il Sii,i,& fir
piu significativi di un registro con i quattro Questa istruzione e piu importante di quanto sem-
bit meno significativi dello stesso registro. ll bri; come avrete già notato, i dati normalmente sono
risultato si memorizza nello stesso registro o raggruppati in byte, cioe in gruppi da B bit, per poi rap-
nel registro di lavoro W, come sempre a presentare questi bit in binario o in esadecimale. Così B
seconda del valore del parametro d. Nella figura e rap- bit si dividono in due digit esadecimali, o se vogliamo
presentato il modo in cur è eseguito questo cambio. rappresentare il dato in decimale, in due digit decimali.
Dato che il registro si divide in due si cambierà una Quindi in un solo registro possiamo scrivere due digit, e
parte con I'altra. uo Lo l-
..r-+- ---.-t+^
to )Ldt r^: -^îi<tr;
)tLd uEt tEL di rr ri di<nnno ;l Plf 16F84,
;;":'; - -"" ì,,i^"t;,;;';";
u-, v' ;;;;^;" "- POSSlamO
OPERANDO OPEMNDO fare, se, ad esempio, vogliamo sommare i due numeri
MNEMONICO FONTE DESTINAZIONE
che sono scritti nello stesso registro? Ecco che entra in
-. -:--y--e*-?
f i -", .r --.,"-,j g . i gioco la nostra istruzione. Lidea è schematizzata nella
Operozione: scombio dei quotiro bit figura; dobbiamo annullare i bit più significativi e
più significotivi del regislro f memorizzare il
con i quottro meno
dato su un altro
significotivi dello slesso regisfro.
ronicfrn <i nttio-
Se d=0 il risultoto
resto nel registro di lovoro W ne così il primo
e se d=l il risultoto si loscio nello valore.
stesso regislro f
Si utilizza in
Cicli: 1
<onrrifn l'i<trr r-
Codice oP: 00 I I 10 dfff ffff
Flog: nessuno zione swapf per
scambiare i bit
Caratteristiche dell' istruzione swapf.
più significativi
con quelli meno
significativi, e si
torna ad annul-
lare i bit più si-
gnificativi (quelli
che erano I

meno signif ica-


DOPO t'ISTRUZIONE
tivi), e si memo-
rizza il risultato
SU UN NUOVO
regrstro.
Dopo aver
ottenuto i due
dati si puo ese- Schema esplicativo di
Rappresentazione del funzionamento dell' istruzione swapf un esempio che utilizza I'istrulone swapf
guire la somma. .

ffiw#*wwww
Appli cazione pratica:
I'interrupt arriva dall'esterno
uando si impara a programmare bene con di due registri
i microcontroller, è normale utilizzare una molto impor- RSI
struttura in cui il programma principale tantr In questo
compia solo l'inizializzazione delle risorse, caso: INTCON
mentre nella routine di servizio all'inter- e OPTION. ùb RBt=l O
rupt si realizzi solo cio che si desidera dal pro-
(RSl) Nlal ronictrn
gramma. ll difficile non è utilizzare gli interrupt, ma sa- INTCON si ese- (X)-w lF-w
pere cosa fare quando sono generati. Pero e meglio guono le abili-
procedere a poco a poco, per il momento è sufficien- tazioni ai di-
w
te vedere un primo esempio di routine applicato ad un versr InferrupL -PA
orooramma. Noi lavorere- INTF=O
mo soto con
g*dYffiffim&ipY ffi& ffiffi*lxruY RB0/lNT. quin-
Torno
tultlizzo dell'interruot evita di dover testare continua- di dovremo
mente se si è verificato un determinato evento. Così il nrnihira irrtf i

Organigramma della routine di interrupt


microcontroller puo restare in stato dr riposo e risve- gli altri. ll bir 4
'gliarsi in caso si produca un interrupt, ad esempio uno è quelìo che
esterno tramite RBO/INT. dovremo mettere a 1 in questo caso, inoltre il bit 7 è l'a-
Se si analizza I'enunciato orooosto si arriva alla con- bilitazione generale degli interrupt, e se non è a 1 non
clusione che nel programma principale non si fa niente; sarà possibile utilizzare nessun tipo di interrupt. Per
tutto parte dall'interrupt. Nella subroutine dedicata, ogni tipo di interrupt quindi, deve essere messo a 1 il bit
dopo aver verificato il valore di un bit si esegue qualsia- che gli corrisponde, più il bit di abilitazione generale.
sr operazrone. Dopo aver prodotto l'interrupt, si attiverà un flag, per
Lorganigramma rappresenta le operazioni che si fa- RBO/INT sarà il bit 1 di questo stesso registro. Per quan-
ranno nella Routine di Servizio all'lnterrupt. L'organi- to riguarda il registro OPTION solo un bit è significativo
gramma principale non è stato disegnato, perché è so- per il nostro esempio: il 6. Con esso specifichiamo se il
lamente di configurazione. Prima di trasformare l'orga- fronte attivo sarà quello di salita o di discesa, a secon-
nigramma rn programma vediamo il significato dei bit da che il suo valore sia 1 o 0 rispettivamente.

Abbiamo un dispositivo
che permane in stato di
riposo sino a che un INTCON
utente non lo risveglia
premendo RB0/|NT.
Al risveglio, a seconda OPTION
del valore di RB1, si pone
laportaAa0oppureal.
Enunciato per I'uso di un interrupt Registri coinvolti nell' interrupt RB)/INT

$s#*wwr*
I

LIST P='l 6F84 Definizione del processore

STATO EQU 03 Definizione di variabili


PORTAA EQU 05
PORTAB EQU 06
INTCON EQU OB
OPT EQU 81
INTF EQU 1

ORG 0
goro lNtzto
ORG 4 lndirizzo del Vector di interrupt
goto tNr
ORG 5

Programma princlpale

tNtzto bsf 5TATO,5


MOVIW 0xFF Porta B come ingresso
movwf PORTAB
cl rf PORTAA Porta A come uscita
movlw b'01 000000' Configurazione del fronte attivo per l'interrupt
movwf OPT
bcf STATO,5

movlw b'10010000' Attivazione dell'interrupt


movwf INTCON tramite RB0ilNT

RIPOSO sleep Si pone in stato di riposo


goro RIPOSO Ritornando dalla subroutine di
!nterrupt si passa in stato di riposo
sino al prossimo interrupt

btfss PORTAB,l Verifica il valore del bit RB j


goto ZERO È zero
9oto UNO È uno

movlw 00 5i sposta lo zero


goto CONTINUA

movlw b'00011111', Si sposta uno


goto CONTINUA

CONTINUA movwf PORTAA sulla Porta A


bcf INTCON,INTF 5i resetta il flag di RB0/INT
retfie

END

Programma proposto

$ep$Swrwryes
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 degli
interrupt e selezionare il fronte con
cui si produrranno. ll microcontroller
viene poi messo in stato di riposo
dall'istruzione sleep, e rimane lì, sen-
za eseguire l'istruzione successiva, si-
no a che si sveglia, al verificarsi di un
rnterrupt.
Un interrupt e un avvenimento
asincrono, quindi non si conosce il
momento in cui awerrà. Nel nostro
caso l'interrupt si produce grazie al-
l'attivazione del piedino RB0/lNI,
quindi sarà provocato dall'utente
lndirizzi delle istruzioni nella memoria di oroqramma esterno premendo un pulsante. ll PC
punterà all'indirizzo 4 e inizierà la
La novità è nel modo in cui il programma è orga- routine dedicata all'interruot. In essa si verifica rl valore
nizzalo, anche se di questo abbiamo già parlato nella del bit 'l della porta B, configurata come ingresso, e a
parte dedicata alla struttura generale di un program- seconda del suo valore, carica nel registro di lavoro W
ma. Per prima cosa, come sempre, bisogna decidere il dato 00 oppure 'l F, per poi passarlo alla porta A e vi-
che microcontroller vogliamo usare, e definirne le va- sualizzarlo. Prima di uscire dalla routine con I'istruzione
riabili. La prima istruzione del programma si posiziona retfie bisogna resettare il flag di questo interrupt a 0.
all'induizzo 0 della memoria di programma grazie alla 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 trovare
un'istruzione della Routine di Servi-
zio all'lnterrupt (RSl). Per questo mo-
tivo dobbiamo mettere la prima r
c
sÈta08c6
ctBattcù
Ltsl P=1óF8{ ; oeFlnizlone del proce

istruzione della routine all'indirizzo t55 1tlJ1r-rf


ststuE f8 24 S961tÉ08
4, e lo facciamo utilizzando nuova- Í5î 09 ! o0ts98!a
t s6tùa9É0
31 $6$1Jl'rl EQn 8'r :
mente la direttiva ORG. Nella figura ! sostùtct FEQUT
255 11 1'ttltt .
l
in alto possiamo vedere come resta- gÈ!8sio{ ftnc o
&6t|e5ae goto INIZI0 :
no localizzate le istruzioni nella me- 9l8ls9*e 0FÈ 4 ; Indirlzzo del ùèctor .

f,ótto8c8 gotú lt{t I


moria del programma, dopo averlo 0aa&0s00 of,G S :.

ooatù0tt
assemblato. Notate che negli indiriz- ca*t9ù&o
súaú009&
zi da 1a 3 si trova il valore 3FFF, cio r S.fF i lorta B co* lngres
l:: : ::::'.. ::.,:. :: ..: :.,ìir.rl
significa che non ci sono istruzioni.
ll programma principale realizza
Finestre necessarie per la simulazione.
solo le configurazioni: imposta la

Swf*wmre
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-
sr-rsfr sr-rrft gle).
Simuleremo ora il programma in for-
ma di animazione. ll programma avan-
SFB NaR llex Dec 8ifiaru Ghùr - ; Porta î con
tÉ€ 3: 1 G€AgggS mulr È'fit8t!6€' ; Configorazioo zerà sino ad arrivare all'istruzione sleep,
prt s 15 6{àS111-l mqrf OPT
ùStisn_rÈg 1€ 54 *tèè8È45 & bcf STfiT0,s la eseguirà e si fermerà aspettando che
ciètus 1à :ú Agft*1€C
6g € &cca$€t úulr b'16a1cat€' ; Attiuazionr d si produca l'interrupt, mentre punta al-
ga € e€€488È6 *erf ll{fcol| ; trarite nBtal
s€ g a8àaa6€6
€à E €ASAAAEC l'istruzione successiva.
aF 259 lltl11:l
ledatè ÈA S EEtntq€C Prima di premere qualsiasi pulsante
eeccql Èg g egg$eg8e i Proqramma di lraltamento della interruzione ; sind al Fross
€eadr Èe € C565C€8C guardate il valore della linea RB1, e del-
€ecaF? *! 3 CggCg€A€
Sclath
idtcar
*g
9è lqà
à eSeàCS*€
16È1AA&€
la porta A, entrambi nella finestra dei
E
t{Ère
*3
5g
lqÀ
S
1g*lggeg
8ùSSCgg€ Z€É0 s{Iu t€ ; Si sposta 10
roni<tri qnorif iri Prpmotp il nrrlc:nfo
goto C{lt{fltltf
RB1 della finestra Stimulus e verificate
che ilvalore cambi. Se ha valore 1, pre-
mendo RBO, la porta A assumerà valo-
ll microcontrollore permane in stato di riposo in attesa di un interrupt
re 1 e se ha valore 0, premendo RB0,
assumerà valore zero.
verificato l'interrupt, così nel caso fossero previsti Premete ancora RBO. Vedrete che nella finestra di
anche interrupt di diverso tipo, consultando i f lag si programma verranno eseguite rapidamente le altre
saprà quale di questi si è verificato, dato che solo un istruzroni, pero non potremo verificare quali, comun-
flag sarà a 1. Inoltre quando si verifica un interrupt, orre vedremo che nella norta A si carirheranno va- Fv'
!v
'

l'abilitazione generale (bit 7 di INTCON) viene messa lori diversi. Per verificare isalti all'interrupt ferma-
a 0 automaticamente, e sino a che stiamo esequen- te la simulazione ed eseguitela passo a passo
do la subroutine del primo, non se ne potranno ge- (Debug>Ru n>Step). l

nerare alîri Fseorrendo I'istruzione di


ritorno dall'interrupt questo bit viene
nuovamente messo a 1, e l'istruzione
"goto NIENTE" fa sì che il microcon- gffi=!:.::1a::-+'i::'l
t leturr Èddress:
troller torni in stato di riposo. 2 66S {lnterrupt}
sr-f,Pl . sb?IFl
I 9b rl tPt
Stir l0 [Pl
sg*iBt3*_&xx#ru$:
ffitr1 trffi#ffiffi&&?&,t&
Per simulare il programma avremo bi- E ffi11"Fa---
SFR ilam Hex Dec Biîary char:
qonnn di rrn: sprio di f inestre che ci tRrS ll 5l ÉÈ€ì1111
pc1 1è îA 9SÈ1 lge€ ; Si sposta La zero
permettano di osservare quello che av- ú$tiàs req 4S 6q 9i888Bge E
statls lll 26 48il Bl 88
viene all'interno del microcontroller. f5r 6d & BùEEEÈBE ; Si sposta uno
portè lF 3t 8851JJ'11
trisa 0e I 8BB6ú86È
Queste finestre sono: quella dei registri portb tr2 2 60884fi9
t.ì5b FF 255 11'1.î1111
specifici (Window>Special Function eedata Eg I B60tlú68
Peconl 68 C 0ù8CS668
Ronistpr)
/, ner
Y!'
vedpre
Yrv!rr se le funzioni si esadr BA I BqgE!308
eecanS B8 ú AÈg6E{BA
compiono, lo stack (Window>Stack) pclath g0 S CgBgS&8o
ifttcnn 12 18 888198JS
npr vpdprp ali indirizz.i di ritorno che s
tAFr€
lF
*S
31 88811111
E È€e$*€SÈ
vengono memorizzati, e il programma
vero e propflo, per vedere la sua evolu-
zione. Inoltre avremo bisogno della fi-
Un momento della simulazione eseouita oasso a oasso.
nestra che simula l'introduzione dei

Sm$&wsxpm
tttttttl t:- ::t :t tt tttttt:tttttttttttl
fistruzione IORLW

;;
ilú
t istruzione "ior" o "or inclu-
ffi Srva realtzza la somma OPERANDO OPERANDO
m
ffi logica deoli ooerandi: il let- MNEMONICO FONTE DES1N44ONE
nU terale che sr accompagna al
ffi codrce deil'rstruzrone e rl
contenuto del registro di lavoro W. io, r'l* l ; ..'.,1(
Come nelle altre istruzioni dello stes-
so formato. il risultato si lascia nel Operozione: reolizzo l'operozione logico OR
registro di lavoro W.
Se il risultato dell'ooerazione è 0. fro un volore letterole e il volore
si attiva ll flag 7.
del registro di lovoro W
xsxwqx
e#ru rIs?RilAX$Ns ISnLW
Cicli: I

Così come I'istruzione andlw, anche OP: I I 1000 kkkk kkkk


Codice
la iorlw. è un'istruzione logica. quindi
I'operazione che esegue si realizza bit
Flogs: Z
a bit e non prendendo come unità il
Ca ratte ri sti ch e d e I l' istru zi o n e io rl w.
registro completo. In una somma
logica il risultato è sempre vero, cioè
'1,quando almeno uno degli operandi lo è. Nel PIC que- bit è quello che realmente fa questa istruzione all'inter-
sta istruzione prende due unici operandi. però nel caso no del PlC. mentre I'esecuzione a livello di registri è
ne prenda di più, come succede in altri linguaggi, il quello che succederebbe se fosse possibile con questa
risultato sarà vero se almeno uno di essi lo sarà. Nella istruzione. Come si può osservare, a parte il fatto che
frgura si rappresenta la tabella della verità relativa all'i- un'istruzione con queste caratteristiche sui registri non
struzione, e il suo modo di operare. L'esecuzione bit a fornisce un valore concreto ma solo vero (V) o falso (F),
se valutiamo il risultato globale non
TABEIIA GENERALE
potremo trovare differenze: indipen-
dentemente dai registri iniziali, il risul-
RISUI-TATO
tato finale (V o F) sarà lo stesso in
entrambi r casi.

L"XSTRIJXS$MH X&KWT
L'istruzione iorwf è il secondo modo
di realizzare istruzioni di somma logi-
ca. Come mostra la figura, e secondo
il formato visto fino ad ora, l'opera-
zione si fa con i valori contenuti nei
registri della memoria RAM e quello
Funzionamento dell' istruzione iorlw del registro dr lavoro W. A seconda

Sw#*wrwre
',1:2
.r..irì:ì::ìli

,,.$

OPERANDO OPERANDO .,:.:ì|F


.'::,:i:I

MNEMONICO FONTE DESTINAZIONE


,,':ì1
::i::iì
:. ìiì:ìì

. iì:ìi.iì

i a r'w.f
,

r rìì:ì:
.'i:a
. :l::ì:ìl

ìTABELIA DETLA VERITA ':::t\


Operozione: realizza l'operozione logico OR :...1t:j

fro il volore del regisfro f e il


volore del registro di lovoro W.
1o
g*--i*'- I r:ì'€

Se d=0 il risultoto si loscio nel


regisiro di lovoro W e se d=I
il;-
il:,
si loscio nello stesso registro f.
':,!
Circu ito con interruttori
Cicli: I per rappresentare le istruzioni ior.

Codice OP: 00 0t 00 dfff ffff specifici come quelli che controllano


.
:::.::,:rj

Flogs: Z le istruzioni, dove ogni bit deve


'::t::.11*
essere trattato rn modo indipenden- i!
la ó llul
ltr, C nn n| )l
<i nr rn Lolllurdlr
rrmhi:ra rr:lnra
vdlulc d:
Puw
Caratteristiche dell' istruzione iorwf. trrttn il reoistro Se si tratta Solo di
:..ì:i!:€=
modificare il valore di un bit si puo . ,i::t:l{*

delvalore delrisultato puo essere influenzato ilflag Z. Se fare con l'istruzione "bsf ", pero quando il numero dei .:
rappresentiamo graficamenle la tabella della verità delle bit aumenta, come nell'esempio dove vogliamo modi- a:.::.',:ÍÍj

istruzioni ior vedremo che e sufficiente che uno solo fir^aro J dpnli
vL:,|| R
v hit
v|1, cL nirr
|JIv
rnnvenicnle l'rrtilizzo delle '::lir::}!
.:

degli'interruttori sia chiuso (valore vero) per fare in modo maschere. ln questo esempio modifichiamo uno dei
che la corrente passi da un lato all'altro del circuito. bit a 1 e il resto si lascia uguale. t:l
:: a:,:c
Nel caso si desideri porre dei bit a 1 e altri a 0
ffiStrffiffig fl#8!$ $i'g$Yffi#gg*ruffi K*RW$ dovremo fare delle maschere successive con le istru-
Parlando delle istruzioni andwf e andlw, abbiamo qtà zioni "ior" e "and". '..,,:.tt
,::i.t
introdotto il concet- i:,ìF
-'vt::j5ll:li
to di maschere, e
abbiamo visto due
lmpostozionea-l dei 7 bit più..significElivi.di un registro
esempi. Però, a se- senzq influenzore quelli meno significotivi. ., ..:a:,:

conda di quello che


tr;-.,!!
desideriamo ottene- Senzq utilizzore lq funzione ior Utilizzondo lq funzione ior :.::ì*
re, dobbiamo appli-
care una maschera o bsf REG,I movlw b'l1l I1l lo' t1,€
.:t::;,

un'altra, quindi uti-


li---.^
IIZZÓIE ,1i,,^"-^
UIVCI)E ,-+",
I)LI U',
bsf REG,2 iorwf REG,F
zinni Pon<:ta 2 nro- bsf REG,3
sto nuovo esempio: REG,4
.,:.::,::
bsf
vogliamo porre a 'l . .::.:.|:

una serie di bit di un bsf REG,5 ''tt:l


-^^i-+-^
regr>u u rludr)rd)r,
^,,-l-i--i ,::Lii.,|

norn <én7: mndifi-


bsf REG,ó
carne nessuno deglì bsf REG,7
altri. Questo è nor-
Esem p i del istruzione i orwf
male con registri
I'

lìl"sg$

Sw6*wwww
Appli cazione pratica:
quattro interrupt come uno solo
bbiamo già visto il primo dei quattro inter- Anrho nro<+:
rupt che si possono verificare in un volta il program-
PlC16FB4, quindi ne rimangono altri tre. ma principale è RSI

Questa volta ne utilizzeremo uno molto utilizzato solo


particolare, dato che può essere generato per le inizializza-
da diverse cause. Stiamo parlando dell'interrupt per zioni dei registri,
Moslro RB4-RBZ
cambio di stato dei piedini più significativi della Porta infattirealizzere-
',

B,
vale a dire R84-R87. mo tutte le altre
operazioni nella
routine di inter- Attivo cicolino
wx %YW* mx &&4*Rffi3 rupt.
Quando uno di questi piedini cambia stato, cioè pas- l-nmo nnfoto
sa da 0 a'1 o viceversa, si attiva il flag RBIF, e il PC osservare, que-
punta il Vector di lnterrupt. Nella Routine di Servizio sta volta nell'or- Resetto ilflog
dell'lnterrupt, se l'applicazione lo richiede, si dovrà ganigramma
verificare quale delle quattro linee è quella che ha non siamo scesi
cambiato di stato, e se il nuovo valore è 1 oppure 0. a basso livello,
Questo sarà ancora più complicato se le periferiche )ut tu -+-+^LE l-
)Lo tó- Ritornq ,,

collegate alla porta B sono pulsanti anziché interrut- sciate le azioni


tori, dato che il loro valore torna allo stato iniziale da realizzare in
dopo che sono stati rilasciati. Comunque nell'esem- linguaggio natu- Organigramma della routine dell'interrupt
pio che stiamo per fare non ci preoccuperemo di rale. In seguito,
questa verrfica, ma tratteremo in egual modo l'insie- al momento di metterlo in pratica, ci preoccuperemo di
me delle quattro linee, senza verificare quale ha pro- vedere quali ìstruzioni o che tipo di elaborazione saran-
vocato l'interrupt. no necessarie rn questo caso. Per lavorare con gli inter-
rupt, avremo nuovamente bisogno
del registro INTCON, i bit coinvolti in
Si vuole proteggere una casa dall'ingresso di intrusi, quindi si montano quattro senso- questo caso specifico sono riportati
ri digitali: uno sullaporta e tre sulle finestre, Quando uno qualunque di questi si atti-
nella figura.
va, si visualizza lo stato dei sensori in modo da conoscere la causa dell'allarme e si at.
Come nel caso dell'interrupt
tiva un cicalino,
per RBO/INT, il bit 7 del registro INT-
CON dovrà essere messo a 1 per l'a-
Enunciato per I'utilizzo dell'interrupt per cambio di RB4-R87.
bilitazione generale degli interrupt,
inoltre il suo bit specifico. il bit 3, do-
vrà anch'esso valere 1. I rimanenti
interrupt dovranno essere disabilita-
INTCON ti, dato che non sono contemplati. ll
flag RBIF (bit 0 del registro INTCON)
passerà a 'l quando si verificherà
Registro importante nell'interrupt per cambio di stato di RB4-RB7
l'interrupt.

#&w&*wwx*
P=16F84 ; Definizione del processore

IQU 03 ; Definizione di variabile


EQU 05

EQU 06

EQU OB

EQU 0

EQU 0

ORG 0

goto tNtzt0
ORG 4 ; Posizione del vector di interrupt
g0r0 INT

ORG 5 ; Programma principale

tNtzl0 bsf 5TATO,5

movlw 0xF0 ; RB4-RB7 ingressi e il resto uscite


movwf PORTAB

clrf PORTAA ; Porta A uscita

bcf 5TATO,5

PORTAB ; Cancellazione della P0RTAB

m0vtw b'10001000' ; Attivazione degli interrupt

movwf INTCON ; per RB4-RB7

NIENTE sreep ; Mirroconfoller in stato di riposo


goto NIENTE ; Al rientro dall'intenupt
; ritorna in stato di riposo
; ma il cicalino continua a suonare

; Routine dedicata all'intenupt

PORTAB,W ; ll valore dei bit piir significativi


; passa ai bit meno
; significativi
PORTAA ; 5i passa il valore dell'allarme

;alla P0RTAA

PORTM,4 ; 5i attiva il cicalino, collegato a RA4

INTCON,RBIF ; Si resetta il flag di RB4-RB7

retfie

Programma proposto
ììììiì:ì:
..,:: a:,:
,:,:,:::i

ì,:::*
Sw$*x*r*xww t:at t
iììì:ll
:ì:ìì
x*" pffi*ffiw&MM&
fl*fl$$3*_ffiY#
Come potrete verificare, il pro-
gramma è simile a quello già vi-
sto per l'interrupt RBO/INT. Nel-
l- ^-"+^
ra pdrre pflncrpate,
^":^-i^-l^ oopo aver
..J

realizzailo le configurazioni op-


portune per questo caso, il pro-
gramma entra in stato di ripo-
so, e attende che si generi un
intprrr rnt P:rto dplla oofta B si
configura come ingresso, per-
cne --.\
-1.-^ queila a
sa[a ^,,^il- ^ cut
-,,i saranno
collegati i sensori. Sulla porta A
visualizzeremo l'informazione
relativa all'allarme attivato, e
sulla linea RA4 dovra essere col-
legato un cicalino che si attivera
con l'interrupt. Per realizzare
quanto detto, utilizzeremo l'i-
struzione swapf per scambiare i
Situazione della simulazione dopo aver attivato RB4
bit piu significativi - dove sono
collegati i sensori - con quelìi
meno signrficativi, dato che la porta A dispone solo di no rimarrà attivato anche se non si esegue nessuna
5linee e non di 8 come la porta B. Al rientro dalla rou- nuova istruzione, in questo modo l'allarme non si po-
tine di interrupt, il microcontroller tornerà in stato di ri- trà scollegare, anche se i "supposti ladri" richiuderan-
poso, pero grazie alle sue caratteristiche, questo cicali- no la porta o la finestra da cui sono entrati, a meno che
non si resetti il sistema. Prima di
Er&4.:*4 9Èó 'g*boÉ.It+'
= 'F" uscire dalla routine di interrupt
.1la {,-il-l tn :h:tÉ
bisogna resettare il flag dell'in-
torn rnf nrnÀnttn
:SFg l{ane Her Des glnarg ghar ,:È LISÍ P.lóF84 ; Deflnlzlonè det prrj
tnro 68 0 0S066000
,Pcl 0B 6 BgSgBBBg = :SrnrO E0U e3 ; Deflnlzlone rll uari
optlún*reg FF 2SS 1 t1 t1111 PoFrîn EQU 05 $g$4qJL&trg#$\$ffi
status 18 24 0úBl100B PoBffi8 EqU 0ó
,fÈf 00 6 686906!0 rHrcoil EQU eE
:f,BIF EQU
##L $}ffi##W&Mffi&
;parta 00 6 800SB609 O
trisa 1F 31 00011i11 UEqUO Simuleremo il programma in mo-
portb 00 6 06060S66
-
trisb
eedata
FF
60
2SS 111 111 11
0 60606060
,one0 do continuo (Debug>Run>Ani-
:eecsnl 86 0 00606000 oEG 4 ; Poslzlof,e del uectr mate) e lo seorriremo tramite
eeadr 06 0 06086660 goto I Hl i

:eecon2 0B 0 g6!96800 onc s registri specifici (Window>Spe-


.pclath BB B 00600680
intcon 00 0 00989006 :; Programa prlnclpale :
cial Functron Register) poi intro-
,u 05 0 086806$0
tgpre 06 0 00050000 IHIZI0 bsf Sfnl0,5 durremo der valori tramite le Ii-
troulu 0xF0 ; RBlr-887 lngressf e,
: souuf P0nTA8
É= : clrÍ P0RTAn ; Porta R lsclta nee R84-R87. Queste linee le
r1*d *g : bcf STfiTo ,5
dovremo configurare con la fi-
ry crrÍ P0BTAE ; canceuazione delr, nestra Debug>Simulator Stimu-
*-ro f ryrl-i *"ur tryt t.l I noutu
f b't00fise0' ; nttluaztone degtl: lus>Asynchronous Stimulus, per
tuÉfl I s'iÈffi i" ffil7F l_ e{ tlJI I nouuf lilTcoil ;

ffi
Per 8Bll-RÉ7

1 J Je sfeep ; ttlcrocontrollore 1l
simulare un interruttore (Toggle)
goto HIEHTE ; nl rlentro dall'ln
-- _l | ; rltorna ln stato d, come nella figura, o un pulsante
.l tî. (Pulse).
Dopo aver attivato la simu-
Finestre necessarie per Ia simulazione
lazione, potremo, ad esempio,

$w#sxxswww
attivare la linea RB4. Vedremo
che si produrrà un rapido
cambìamento nelle linee dì
esecuzione del programma, e
che la linea che evidenzia le
istruzioni in corso tornerà nel-
la sua posizione di stato di ri-
poso dopo aver eseguito la
Routine di Servizio all'lnter-
-,,^+
rupr. -^-,,
comunque e
QUarcosa
^,,-l-^--
cambiato: nella porta A sono
ora indicati i valori della porta
B, e si e attivata la linea RA4,
il cicalino.
Anche se torneremo a clìc-
càre str R84 ne. rinorlarla alla
sua situazione iniziale, il cicali-
no non si disattiverà, anche se
il nuovo valore della porta B si
potrà vedere sulla porta A.

#YXA"ggX*
ffiKtil'3NYmgffiqiru
pffiK ffis&-*s3 TASTIERA

In questo caso abbiamo utiliz-


Collegamenti di una tastiera esadecimale per I'utilrzzo con interrupt
zato'l'inlerrrnt ner R84-RB7

in un esempio semplice ed efficiente.


Un utilizzo tipico di questo interrupt
è la rilevazione dell'attivazione di un
ffnila* ,tsr 0.s I Prîgrarr priÍcipalr nrrlsante di rrna tastiera matriciale.
tnr0 09 g
Orrpsf e tastierp noccono contenefe
pcl ù€ J4 80981f18 ,rlIZI0 bsf SIllù,5 YvrJ!L
oFtiún_reg ff 2í5 1llllJJ1 nelr ùrFa ; [8]-187 inqr*ssi e,
nrr:ntitì divor<o di nrrlq:nti nrrollo
stèlus rr ? S É881 61 0g
1 ilerf P0Írm
elrt P0BTlt ; Portr I usciti
bcf S1îI0,5 piu comuni sono le esadecimali. Una
trisa €B
+ac+iòrì
psrtù €B clfÍ P0*tCt ; Cancelli;ionè úFIl LO)LlEl O n..r Inr lr
WLIUPO rO n^r+: R :l rnmnlo-
PWI Lu u ur LvrrrvrL
tfirb
esdata
F0
gB F{rlr l"lttrltlt' i fittiuaziom lenli to: ibit piu significativi configurati
eÉe6nl È0 mu* llll0lltl ; prr n8{"881
e€*dr 8È come ingressi sono queìli che utilizza-
aers0a Sg
gclatb SS no l'interrupt per R84-R87, e i bit me-
lntfofi gB
s89 É ll cicalino rotr no significativi sono configurati come
tÉprf èrt
rrcrito Prompndn rrn nrrlcento qi nrn-
; nouti[r dcdf?eta óu'iritcrrúpt
ItlT sragf PfFfcS,g Il u.lor€ d?i tit I uutto ,,^ ili^+^"",,^+
,r, ".\ utt -ìl,intefnO della
ttgtr UPL/ ol
Ir$rà ai bit rîo
signiflcittui routine bisognerà verificare di quale
3i pigsa it ualorB
iua Plt*Iif ^, l--^+^LE -i
put)or )r +..++- ^^..^-li---.^
Lro Lro, PEr rEoil44orc l^
rc
Si àtti{a il .ieal:
operazioni opportune. Questo uso
6$rtFt ì tr;t*t SÍ rescttn lt flag
anrp le nortp ad rrn: moltitudine di
rE *.-mite
-^^li---i^^i Lr-L^
-,É* | _ r*_l dppilLdzrurr, Lro I' ulilizzo

delle tastiere, forniscono la possibilità


di introdurre dati in modo versatile, e
Situazione della simulazione doao aver rioortato la lrnea RB4 come all'tnizio
in modo familiare per l'utente.

$w$sxwwww
*
Fj .,,

il
#*
ry
r- fistruzione XORLW
ffi
ry
F
u
sistono due istruzìo-
r:' "
ni di somma logica:
iì€ I la inclusiva "ior" , di
-,,i -t-Aì-,-^ ru ^;\ ^-.
LUr CUUrdr
*atttt: 9rc Por-
l-+^
tdLU c^ l- ^--1,,-i,,-
td ú)Ltu)tvd
::'-" , "xor", a cui dedichiamo que-
ste pagrne.
;' ,
I l^-
)uil il |d t^^t-^
u||d -^--1 ^.-t' '.1
tu9tLd c)Ltu)t-
;Sír va f ra due operandi significa
che uno e solo uno di essi puo
:. I{-.^ ilr'^ modo
E))CtC O I ^^-
pEr rdrc
che lo sia anche il risultato.
1., ,

Nel caso della xorlw, la


! somma è realizzata fra i bit
che compongono il registro di
ry lavoro W e quelli del letterale
-t^^
Lt -t dLLUr
tc )r ---^^^-^^- ^r codice
rPo9ro ol
dell'istruzione. ll risultato si
# carica nel registro di lavoro W,
H:
e si attiva il llag Z nel caso
#
ffi|,
valga zero.

r-
w....

ffi
Funzionamento
dell'istruzione xorlw

;' gsffi&,eFg
ffi e*$'* L'í5?HL$r-g#ru ffi K# ffi *-W
ffi
T.
L'operazione di somma logica esclusi-
a :::
:'::'- vd >tr9uc,^ ld
l. +.k^ll.
Lduclld -l^ll-,,^"i+ì
urild vcr ild ^l^ll-
uEild
-.. figura.
,,
':."" ' Nel caso di linguaggi che permet-
àr. tano piu di due operandr, il risultato
; sarà vero se esiste un numero dispari
di valori veri e sarà falso per un nume-
ffii ro uguale a zero oppure pari di valori
:'' veri.
E come se si realizzassero opera-
Sgi_!g$ìliìtlì:ì. zioni concatenate di istruzioni xor fra
Y.:l|LZ,,:,:., Caratteristiche dell' istruzione xorlw.
?ì.:i;2::,:: due operandi.
::-:-:
:: :
;
S*,p$l$wwry*
I
fistruzione XORWF

:!
'i*
iì:ì:

a xorwf realizza la stessa f un-


zione della xorlw però pren- Compara le uguaglianze fra due registri

i
dendo valori da locazioni movf REG1,W

diffpronti rinc d:l roni5166 li xorwf REG2,W

lavoro W e da un registro btfss STAT0,Z

della memoria RAM. Ancora una volta goto N0_UGUALE

il risultato si puo scrivere nello stesso goto UGUALE

registro oppure in W, attivando il flag 5e REGI = REG2 il risultato sarà 0 e il flag Z passerà a I
Z in caso che sia zero.
Compara I'uguaglianza di un registro con un valore determinato

#s##wpg fl#ru LTsTffi qix3*fl,*ffi movf REGI,W


K*ffiWF xorlw b'01010000'

In questo caso utilizzeremo l'istruzio- bffs 5TAT0,Z

ne xor per fare delle comparazioni. goto N0_UGUALE

Approfitteremo del fatto che il flag Z goto UGUALE


5e REGI = 01010000 il risultato sarà 0 e il flag Z passerà a 'l
si attrva in presenza di un risultato
rrorrale à Tero inoltre uti izzeremo
Esempi con l'istrulone xor.
nuovamente le maschere.

ilsfrwpt {fl}ru
t:3s?tr#tr,g*rutr H*ft
OPERANDO OPERANDO
MNEMONICO FONTE DESTINAZIONE Nell'esempio si mostrano
due tipi di comparazioni,
xorwf f d una fra registri e l'altra
il;;; ;;;;;l;*";; i;;;;;""' esclusivo fro un volore de,
f ra un registro e un valo-

re letterale.
Per entrambi si utiliz-
registro f e il volore del registro
za il registro di lavoro W
di lovoro W. Se d=0 il risultoto si .i porta
- cur
d -,,i sr ^^"+- ilil varore
,,-l^"^ Oel
loscio nel registro
nrimo rpoistro e in soqg j-
di lovoro W e se d=l loscio
to dopo averlo compara-
nello stesso registro f.
to con il valore letterale o
aon lrn :ltrn rpnistrn si
Cicli: 1
salta nelcaso che tlflagZ
Codice OP: 00 0t t 0 dfff ffff si sia attivato, cioe nel
Flog: Z caso in cui il risultato
valga zero, il che significa

Ca ratteri stich e del I' i struzi o ne xorwf .


che entrambi i valori
sono uguali.

#e+$i'&w,g*r*q*
Appli cazione pratica: [a EEPROM
'
avusa a[ termine delta scrittura
ome abbiamo visto nelle appli-
cazìonì mostrate sino ad ora, gli LIST P=16I84 ; Utilizziamo il PlC16t84
RADIX HEX ; 5istema di numerazione esadecimale
interrupt ulilizzaÍi bene evitano
dal ruvvrv
wLr l:rinrn:l ur nrnro<.^'^ l-
ld-
WR EQU I
VrvlLJJUIC, WREN EQU
t
sciandolo in stato di riposo o li- EEIT EQU 4
RPO EQU 5
bero di dedicarsi ad altre cose. Questo e GIE EQU

utile con risorse che richiedono un deter-


STATUS EQU 0x03
minato tempo ma che possono funziona- EEDATA EQU 0x08
EEADR EQU 0x09
re in modo autonomo. come nel caso del- INTCON EQU OXOB
la memoria EEPROM dei dati. Come ricor- EEADR-VAR EQU 0x0c
EEDATA-VAR FQU OXOD
derete questa memoria si legge e si scrive EECONf EQU 0x88
elettricamente e i suoi dati non vanno per- EECON2 EQU 0x89

-: ^,,-^,r^ )r-i +^^ì;^


)t L]uoruw -rimentaZiOne.
LUvilE ql Se il u tfu 0 ; ll programma inizia all'indirizzo 0
goto tNtzt0
processo di lettura è immediato, quello di
ORG 4 ; Vector di intenupt
scrittura richiede diversi millisecondi per goto INTER
ORG 5
essere rea izzafo, una volta dato l'ordine.
tNrzt0 MOVIW 03 ; Metto l'indirizzo da scrivere
gru?frffiRt$FT trffi& rgruil mow'rf EEADR_VAR ; su una variabile ausiliaria
movlw 27 ; Metto il dato da scrivere
*3ffi1 ilX{L* m3 Sfl$CgTY#ffie mowvf EEDATA_VAR ; su una variabile ausiliaria
movlw b'11000000' ; Abilito gli interrupt
ffiKt_L& ilffirffi*ffi mowrtf INTCON
call SCR|V|_EEPROM ;Chiamo la toutine
Quando parlammo per la prima volta della 9orc TINE
EEPRON/ costruimmo due subroutines, una
SCRIVI EIPROM
di lettura e una di scnttura. Ora modrfiche- movf EEADR*VAR,W ; Porto l'indirizzo sul registro
remo quest'ultima per fare in modo che si movwf EEADR
movf EEDATA_VAR,W ; Porto il dato sul registro
produca un interrupt ogni volta che termina movwf EEDATA
bsf STATUS,RP0 ; Passo al banco f
la scrittura di un dato nella EEPROM. La su- INTC0N,GIE
bcf ; Disabilito gli intenupt
broutine di lettura non necessita di modifi- bd Itcotlt.wRfU ;nUititolaslrittura

che, però il programma princrpale dove si


movlw 0X55 ilnizio la sequenza obbligatoria
mowd EECON2 : di scrittura

trova dovrà essere cambiato per adattarsi movlw OXAA


movwf EECON2
agli interrupt. bsf EECON1,WR ;Ordine di scrittura
Nel programma della figura non e sta- bsf INTC0N,GIE ;Abilito gli interrupt
sreep ; Entro in fato di riposo
ta inclusa la subroutine di lettura per non ; da cui uscirò con un intenupt
relurn
distrarre la nostra attenzione. La chiama-
ta all'etichetta della Routine di Servizio INTER bcf EECONI,EEIF ; Resetto il flag
bcf EEC0Nl,WREN ; Disabilito la scrittura
dpll'lnterrr rnt p stata rollocata nel Vector bcf STATUS,RP0 ; Passo al banco 0
retfie Rientro dall'intenupt
di lnterrupt che e all'rnduizzo 4 della me- ;

morra di programma. Sceglieremo nuova- FINE n0p


END
mente i valori 03 e 27 come indirizzo del-
la memoria e dato da scrivere rrspettiva-
Subroutine e programma per la scrittura della EEPROM dei dati con interrupt
mente. Nel programma principale dob-

Sqp$Ew*xs*
se. Inoltre saranno molto utili la fi-
nestra dello stack e il clock di siste-
tttd.

Facendo la simulazione mediante


animazione (Debug>Run>Animate)
noP
END si vedono chiaramente i salti che si
producono lungo l'esecuzione, sia
per il movimento della linea-cursore
Schema del processo che si esegue nel programma
i doI
lr rnnn Io i<trr rzinn ,,
--, programma,
sie npr nlí indirizzi di ritorno che si
biamo solo configurare gli interrupt che si possono pro- memorizzano nello stack. Comunque, dato che si im-
durre e chiamare la routine di scrittura prima di andare piegano almeno 10 ms per uscire dallo stato di riposo,
alla fine del programma. questo tipo di simulazione può risultare tedìoso, anche
Da parte sua la sua la subroutine di scrittura ha una se è raccomandabile quando si sta iniziando. -.r.....i4
n>rta rrtttr> l: crri++' '"a del reAiStrO FFCOI\12 SeCOndO Inoltre si puo eseguire la simulazione con l'opzione jli::

le specifiche del costruttore, durante la quale si deve piu rapida (Debug>Run>Run) e fermarla quando il clock
inibire l'accettazione di interrupt, cosa che si ottiene di sistema segna un po'più di 10 ms, in quel momento
mettendo a 0 il bit GIE di INTCON. Terminata questa all'induizzo 03 della EEPROM dei dati deve aooarire il
prima scrittura si può tornare ad accettare gli interrupt valore 27.
riportando a 1 questo stesso bit, e dare I'ordine discrit-
tura. Quando termina la scrittura della EEPROM si &rF g_tf,éx:i*ru # pffi,eYxt&
uscirà dallo stato di riposo grazie ad un interrupt, e si Una volta visto come f unziona l'interruot oer fine scrit-
passerà ad eseguire la corrispondente Routine di Servi- tura della EEPRON/. integriamolo in un programma ri-
zro dell'interrupt. In essa eseguiremo solamente il reset ferito ad un'applicazione concreta Come si puo vede-
dpl fl:n di fina <rrittr rr: o dal hit rho normatro
vrrrrrLLLL
flro<r2
9vuJru re tutto si complica poco a poco. Guardate l'organi-
scrittura, prima di rientrare. Usciti dalla routine di inter- gramma nella pagina successiva.
rr rnt si eseore l'istrrrzione successiva alla "sleeo". la Dopo la configurazione della porta B come uscita
"return" con cui si esce anche dalla subroutine e si va nor mn<tr2ro il v:lnro della EEPROM, della pOrta A CO-
alla fine del programma. Nello schema sono riportati i me ingresso per inizializzare la EEPROM, quindi con la
salti che si producono lungo ìl programma. Al momen- somma di nuovivalori, e con l'abilitazione dell'interrupt
to della simulazione dobbiamo aprire le finestre dei re- per fine della scrittura, si arriva al blocco principale del
gistri speciali, quella della EEPROVI e il programma in programma. ll passo seguente sarà mostrare il valore

Preparazione delle finestre per la simulazione del programma Finestre dopo la simulazione del programma

Se*SÈwq*rcf
della EEPROM. A
5i vuole utilizzare la memoria EEPROM -^-^^,1-
)cLU|Ud -^ .;
)C )t À -l
C Cr-
dei dati per memorizzare la raccolta
settimanale di un autobus. l'inizio della setti-
All'inizio della settimana l'utente comanda mana o no, si ini-
con un intenuttore l'inizializzazione
della memoria, A partire da questo
zializzerà il valore
momento ogni impulso introdotto della EEPROM, il
da un pulsante indicherà il pagamento rho <innifir: crri-
di un nuovo biglietto che si memorizzerà
nella EEPROM. Ad ogni inizio giornata vere in essa un va-
all'accensione del sistema venà mostrato lnra zarn ln qonrrì-
per un periodo di tempo il valore
to si entrerà in un
memorizzato all'interno della ElPROM,
famite deidiodi LED, ciclo infinito che
incrementerà il va-
Enunciato del programma proposto lore della EE-
PRON/ ad ogni
nuovo passeggero, sarebbe a dire ad ognr impulso su
.,^-
Ulld llllcd
r^il- pul
r;^^- UCIIO ^^.+- ^
Si rrscirà da yuLJtv
Lo n. Jr orresto !r\
ciclo con un
reset di sistema, o quando si toglie alimentazione al
medesimo. Dato che ogni nuovo valore è scritto nella
EEPRON/, i dati non andranno persi togliendo alimen-
tazione.
Passando al programma in assembler bisogna fare Organigramma del programma proposto

attenzione a non perdersi, seguendo passo passo l'or-


ganizzazione pensata nel l' orga n i g ram ma. Ricordate i relativi rami sono istruzioni "goto". I riquadri sono di
che i rombi di solito si trasformano in domande che uti- solito gruppi di istruzionì, che potrebbero anche inclu-
Itzzano informazioni dì tipo salto: "btfss", "btfsc",..., e dere subroutine.

LIST P=16F84 : Utilizzo il PlC16t84


RADIX HEX ; Sistema di numerazione esadecimale

W EQU 0
F EQU 1

RD EQU 0
WR EqU 1

WREN EQU 2
EEIF EQU 4
RPO EQU 5
EEIE EQU 5
GIE EQU 7
STATUS EQU 0x03
PORTA EQU 0x05
PORTB EQU 0x06
EEDATA EQU 0x08
EEADR EQU 0x09
INTCON EQU OXOB
EEADR_VAR EQU 0x0c
EEDATA_VAR EQU OXOD
TRISA EQU 0x85
TRISB EQU 0x86
EECONl EQU 0x88
EECON2 EQU 0x89
ORG 0 ; ll programma inizia all'indirizzo 0
goto tNtzt0
ORG 4 ; Vector di interrupt
g0r0 INTER
ORG 5
lNtzr0 bsf STATUS,RPO ; Banco I
clrf TRISB ; Porta B usrita

Soluzione del programma proposto

Sw$sx*sw**vm
r--rrl>
movlw 1F ; Porta A ingresso
movwf TRISA
bcf STATUS,RP(} ; Banco 0
m0vtw b'11000000' ; Abilito gli interrupt
movwf INTCON

call LEGGERI ; Legge la EEPR0M e la porta su PB

SCETTA btfss PORTA"O ; Scelta da fare


g0r0 SOMMARE ; Se M4=0 non è inizio settimana
90Ì0 lNtztAUzzA ; 5e RA4=1 è I'inizio settimana

SOMMARE btfss PORTA"I ; Verifica sul pulsante


goto SOMMARE ; Non è stato premuto
incf EEDATA-VAR,F ; Premuto, aumenta l'incasso e scrivi la EEPROM
call SCRIVERE
goto SOMMARE ; Continua l'incasso

tNtzlAilzzARE drf EEDATA-VAR ; Inizializza l'incasso


call SCRIVERE
g0l0 SOMMARE ; Inizia la raccolta

LEGGERE m0vlw 00 ; Scriviamo l'indirizzo da leggere


mowvf EEADR-VAR ; in una variabile ausiliaria
call TEGGI_EEPROM ; Chiamata alla routine di lettura
movf EEDATA_VAR,W ; 5i visualizza il risultato
movwf PORTB ; sulla Porta B
return

TEGGI EEPROM movf EEADR_VAR,W ; Spostiamo l'indirizzo da leggere


movwf EEADR ; sul suo registro
bd STATUS,RPO ; Passiamo al banco 1
bsf EECONl,RD ;Ordine di lettura
bcf STATUS,RPO ; Pasaggio al banco 0
movf EEDATA,W ; Spostiamo il dato sul
mowvf EEDATA-VAR ; registro ausiliario
return

SCRIVERE movlw 00 ; Spostiamo l'indirizzo da scrivere


mowrrf EEADR_VAR ; sul suo registro
call SCRIVI_EEPROM ; Chiamata alla routine di scrittura
return

SCRIVI EEPROM
movf EEADR_VAR,W ; Porto l'indirizzo sul registro
movwl EEADR
movf EEDATA_VAR,W ; Porto il dato sul registro
movwf EEDATA
bsf STATUS,RPO ; Passo al banco I
bcf INTCON,GIE ; Disabilito gli intenupt
bsf EECONl,WREN ; Abilito la scrittura
movlw 0x55 ; Inizio la sequenza obbligatoria
movwf EECON2 ;di s*ittura
movlw OXM
movwf EECON2
bsf EECONl,WR ;Ordine di scrittura
bsf INTCON,GIE ;Abilito gli intenupt
sleep ; Entro in stato di riposo
; da cui uscirò con un interrupt
return

INTER bcf EECONl,EEIF ; Resetto il flag


bcf EECONl,WREN ; Disabilito la scrittura
bcf STATUS,RPO ; Passo al banco 0
retfie ; Ritorno dall'intenupt

END

Soluzione del programma proposto. (continuazione)

Sw#*wwrx*
Àil"

w-
;*
#,,
-.".'
iffi
ffi1Lì:rl

3''-
a:-
1_i;
J-.
ffi&
*:l{.
fistruzione RLF
trI.
q,r;
il..
tr:'
ffi*"
w
ì

F.,
ffiffi. ,

K1--' :
ffià.. ,

m:"
ì\---.,
l

obiettivo di questa ìstruzione è quello di ruo-


s';, tare verso sinistra il contenuto del registro f di
:{;
st:-"' EFFETTO I
una posizione, cioè di un bit. ll bit che esce
i bsfSTATO, C
M-
EVT dalla sinistra è il più significativo, verrà imma-
gazzinalo nel bit di riporto (C) del registro di
#s* * &&s #[l:*?,Hg,J
ffi. S S # # & & $ $rlfPoRTAB,F
bit che manca da destra, il meno significati-
ffi -''
K&ì.
STATO, e il
vo, sarà riempito con quello che era contenuto nel bit S * S S S # &i *, rlrPoRTAB,F
wl1 di riporto. S & S $ # * $ $rlfPoRTAB.r i

w Come si puo vedere nella figura del funzionamento *##*s#*srtfPoRTAB,F ì

ffi dell'istruzione, se si esegue l'istruzione nove volte di


#1,, - :
seguito sitorna alla situazione iniziale, qualunque siano
W.:. iv:lnri di n:rtanz: EFFETTO 2
ffil
$&---:
jS# * I SSS #bsfsrAlo,c
ffiSffi$IgPX fl*ru ilJx$Yffi#Xxffiruffi ffiLW i rlf PORTAB, F
iK:::::::
ffi:, i# &* # SSS *bsrsrAro,c
ffig;..
ffi..
iil.:-"
, ll primo esempro che ci viene in mente è di creare effet-
ti luminosi a
#as€*s * *il"t?llà?f
TIfPORTAB, F
s:9 '.
,

OPERANDO OPERANDO ^-"+;.^


POTLilE UO
,l- S##S* #* Susrsnro,c
TIfPORTAB, F
MNEMONICO FONTE
Ff:'''
DESTINAZIONE
questa istru- &&&* S* # #usrsraro,c
gl:-::::,
;ti-
n:
:-tt;.- i, --:---"i*--*-*- zione: da
rlf PORTAB, F

ffi; Operozione rolozione d sinistro di un bit una luce cne


ffi. del registro f, utilizzondo il bit
si va muo-
ffi
ffi*"
di riporlo C. Se d=O il risultoto si
loscio nel registro di lovoro W e se venoo 0a Differenti effetti con l'istruzione rlf.
d=I si loscio nello slesso reoistro f -l^-+"-
uE)Ltc o- -;^i
)Uil-
H.:. €icli: I

ffi,- OP:
€odice 00 I 101 dfff ffff stra, frno ad l'esempio seguente: moltiplicare per due un numero e
Ki" Flogs: C
una progres- la stessa cosa che sommare questo numero a se stesso,
a& r-:
3t+:"-""
sione di luci oppure ruotare a sinistra di un bit il registro introdu-
ffiE"ì,,
Caratteristiche del l' istruzione rlf LI
-^^ -t
IC )I OLLEII-
^--^^ cendo uno zero da destra. Provate ad implementare gli
dono
ffi
ffi:::: pre
sem-
da
esempi in MPLAB, e verificate come funzionano con la
loro simulazione.
W+
:RA:::
REGISTROf .J^-+.-
uc)Ud d- -i^i
)ilil-
ffi. stra. Pero
F.-... "
ffi.:,
ff,::: oltre a tutto reql=OOtOlllO r 0OIOlllO
;'". Volore inizidle registro e
l0t I I101
questo, la rlf x2 - oolottlo
{r-t-:
P;. """ I Volore inizioleC:
rt nórmó++ó
vL, ,ì,r Lrr otol I too
tg'-: r
*:-'l 0 di imple-
tl
#, Volore iniziole dopo I'istruzione rlf f, menlare ra
tr:
:L 1:
0l I I 10r0 rlf reg I ,F otor r 100
moltiplica-
:

ffi',
ffir::
ffit.
r
Volore di C dopo I'istruzione rlf f,
I
1:

zione dei
ff:' numeri bina-
#:, Fu nzi ona mento del l' istru zio ne rlf .
ri. Guardate
Moltiplicazione a base di rotazioni

ff:'

ffi
ffi{, -
Sw$*wwwm
ffi
fistruzione RRF

e la rlf ruotava a sinistra di un bit in un regi-


EFFETTO I
stro, la rrf lo fa verso destra. La posizione che
rimane libera a sinìstra viene riempita con il :s**####*F
valore del bit di riporto, che prendera iì valore
s*&s#s##
del bit che esce da destra. A seconda del valo-
re del parametro d, il risultato si scriverà nel registro di
s#s&s###
lavoro W o nello stesso registro che viene usato per la &s**##*s
rotazione. Così come con ì'istruzione rlf, eseguendo &s*#&*#* Ì

i
nove volte la rrf si torna all'istruzione iniziale. I

#sK$t$px fl#ru L*gsYffi$*$xx*Ng $cffifr EFFETTO 2 I


:
5

Gli effetti da realizzare con l'istruzione rrf sono simili a


quelli già visti con la rlf; l'interessante inizia con un mix
{s8rssq8&+#:ff::]i;,;:
OPERANDO OPERANDO
ÀANETAONICO FONTE DESTINAZIONE
Íd
s#s8*#*# SeRAO=O
sPegnere

Operozione: rotozione o destro di un bit


s*&#s*&# un diodo.

del registro f, ufilizzondo il bit


di riporto C. Se d=O il risultoio si
loscio nel registro di lovoro W e se
d='l si loscio nello stesso registro f . EFFETTO 3
Cicli: I
OP:
Codice 00 1 100 dfff ffff
Flogs: C ;#*#**###
:w****#dFs
Caratteristiche dell' istruzrone rrf
i*w#**{**e
!ww##*#**
REGISTRO f !

Differenti effetti con le istruzioni di rotazione

Vqlore iniziole registro f:


l0l t 1l0'l delle due. Giocate con il bit di riporto e con le istruzio-
Volore iniziole C: ni di rotazione per ottenere gli effetti della figura e
U
inventarne altre nuove
Volore iniziole dopo l'istruzione rrf f, l: l'onerazione di divisione e niir diff icile da vedere
0l0l l1l0
Vofore di C dopo,l l'istruzione rrl î, lz intuitivamente di quella della mo tiplicazione, pero fun-
ziona in uguale modo, anche se all'inverso, cioè ruo-
tando un registro verso destra si ottiene di dìvidere il
Raaaresentazione del funzionamento dell' istruzione rrf
numero per due.

Sw#&wsxlwse
Appli cazione pratica: sim ulazione
del primo programma
upponiamo, a questo punto, di non avere lampeggia. Le linee di alimentazione, del quarzo e del
dubbi sull'utilità del TMR0, sia per il modo reset, non sono riportate perche si danno per scontate.
temporizzatore che per il modo contatore, ne
sull'uso di interrupt; vediamo quindi i vantag- rffigFg# **q#erugffiffiÉqffi&3&
gi derivanti dall'utilizzo contemporaneo di Nell'enunciato dell'esercizio non si dice nulla sull'obbli-
entrambe queste due risorse. Qui sotto proponiamo un gatorietà di lavorare con l'interrupt del TMR0, pero
esercizio in cui, fra le altre cose, il TIVR0 provoca un nelle figure seguenti ne dimostreremo la convenienza,
rnterrupt quando termina la temporizzazione che avre- confrontando lo stesso esempio senza interrupt.
mo programmato per esso.

Sfl**trf4À f,LffiTTffiXfl* €onfigurazione


TMRO
Lo schema elettrico è molto semplice: è
PA ingresso
)L6rd )LCrLd l-
-+-r-.-^l+- rd ^^.+- ^ ror
put Ld A Pqr rnllonero
LwilqvorE l,in_
| il t- PB uscito
terruttore, e la porta B per i LED, anche
se potrebbe essere al contrario, o un
mix di entrambe le soluzioni. RBO sarà
.il diodo che si accende o si spegne a Spegni RBI
seconda del valore dell'interruttore:
l'interruttore a 'l fara accendere il LED,
mentre a 0 lo fara spegnere. RB'1 sara
Rifordo 5O ms
la linea che supporta il diodo LED che

5i tratta di simulare una macchina che ha


Accendi RBI
un interruttore e due LED. Uno dei LED indica
in ogni momento le variazioni che si
producono sull'interruttore, e l'aitro lampeggia
ad una frequenza costante di 50 ms. Ritqrdo 5O ms

En u ncialo dell' eserc izio propos t o

*ó. RAO=l?

G' Spegni RBO Accendi RBO

Schema elettnco dell'esercizio proposto Pr i mo orga n ig ra m ma d el l' eserci zi o p ro posto.

Sqp$#www*
Come si può vedere, le azioni sono prodotte in
modo sequenziale. Un lampeggio corrisponde ad
accendere un LED, attendere un certo tempo, spegne- RSI
re il LED, attendere nuovamente lo stesso tempo, tor-
nare ad accendere il LED e così via. Se il programma
dovesse solo far lampeggiare un LED, questa sarebbe la
sequenza infinita da realizzare. I ritardi sarebbero chta- Cqmbio il
mate ad una subroutine realizzata dal TMR0, poì biso- vqlore del LED
gnerebbe aspettare che termini il conteggio per conti-
nuare con ilprogramma. Nel programma pero, si
richiede anche dr riflettere lo stato di un interruttore
mediante l'accensrone o lo spegnimento di un LED, e lniziolizzo TMRO
questo va fatto prima o dopo il lampeggio, ma in ogni
caso in un momento diverso. Se decidìamo di utìlizza-
re il TMR0 con interrupt, il prìmo organigramma si divi-
de in due: uno con le azioni che riguardano il pro- Resettq il flog
gramma principale, e l'altro con le azioni da compiere
nella routine di interrupt, quando il TMR0 va in over-
flow. Secondo questo organigramma si verifica conti-
nuamente il valore dell'interrupt per accendere o spe-
RifornE
gnere il LED corrispondente, e nello stesso tempo il
TMRO conta, per far lampeggiare l'altro LED ogni 50
ms. Le azioni quindi non sono sequenziali, ma simulta-
Organigramma della routine di interrupt.
nee. e solo ouando ilTN/R0 termina di contare siferma

l'esecuzione del programma principale


npr arrendere o snennere il LED che
Configurozione lampeggia. Sono state implementate
TMRO entrambe le soluzioni, con e senza inter-
Interrupl rupt, anche se in questo esemPio non
PA ingresso
ne possìamo apprezzare la differenza,
PB uscito
dato che ìl tempo che si perde nel lam-
peggio è di soli 100 ms. Se invece di
cambiare stato ogni 50 ms. lo avessimo
fatto ogni ora, avremmo avuto un'ora in
cuì anche cambiando valore all'interrut-
tore, questo cambio non si sarebbe
RAO=l?
riflesso sul LED, dato che il processore
sarebbe stato occupato nella routine dr
ritardo, e le transazioni dell'interruttore
Spegni RBO Accendi RBO
non sarebbero state raccolte. La verifìca
dell'interruttore per cambiare rl valore
del LED, se necessario, si avrebbe solo
ogni due ore.

flse$$:Ks&"$w&KK*NH
sffis $qffisKsYffix
Dopo aver analizzato i vantaggi di
Secondo organtgramma dell'esercizio proposto
lavorare con interrupt, concentriamoct

$wSSw*wvw
-*''"'l
UST P=16F84 ; Utilizziamo il PlC16F84
RADIX HEX; ; Sistema di numerazione esadecimale

TMRO EQU 0x01


TOIF EQU 0x02
sTATU5 EQU 0x03
PORTA EQU 0x05
PORTB EQU 0x06
RPO EQU 0x05
INTCON lQu OXOB

OPTION_REG EQU 0x81


TRISA EQU 0x85
TRISB EQU 0x86

ORG 0 ;ll programma inízia


goto tNtzt0 ; all'indirizzo 0
0R6 ; Vector di interrupt
gor0 tN't

;Programma di elaborazione dell'intenupt,

movf PORTB,O

xorlw b'00000010' ; lnverte il valore del LED


mowuf PORTB

movlw b'001 I 1101', ; Carica di nuovo il TMR0


mOVf,Vf TMRO

bcf INTCON,TOIF ; Resetta il flag


retiie ; Rientra

tNtzt0 bsf STATUS,RPO ; Passa al banco 'l


movlw b'00000000' ; Porta B uscita
movwf TRISB

movlw b'00000001' ; RAO ingresso, il resto uscita


movwf TRISA

movlw b'0000011r' ; Configurazione del TMR0


mowrrf OMON_REG
bcf STATUS,RM ; Passo al banco 0

m0vtw b"t0100000' ; Attivo gli interrupt


movwf INTCON ; per TMR0
m0vtw b'0011 1 101',

movwf TMRO ; Inizializzo il conteggio

crcL0 btfss PORTA,O ; Verifica se RAO = I


90î0 SPEGNERE ; 5e n0, spegnere
g0t0 ACCENDERE ; se sì, accendere

SPEGNERE brf PORTB,O

goto ctcL0

ACCENDIRE bsf PORTB,O

goto ctcL0

END

Schema elettrico dell'esercizio Drolosto

$*$swrssww
dello stato dì RAO; il programma
rimane all'interno di un ciclo infinito.
INTCON
5g$4iliLSaH$*ruffi
OPTION
*flL Fà$q##ffi&$,tSiB&
Per la simulazione ricorreremo ad un
CATCOLO DEt VALORE DEt TMRO
nirrnlo tnÍ'co' ,anrite le finestre del
listato del programma, dei registri
99",n:=*l-9","Q9.".o,ui*"*..*."",,-.-..-"-".- Jrg:fgln-q:-ig"ls,J-n!sr"g-lg*d!,-.-..--.--..-. specif ici, del clock e quella per l'intro-
50.000/25ó= I 95,3 I 25= I 95 Volore che si vuole contqre. duzione di stimoli asincroni, quindi
l_L0"99".qu* _ Volore che si vuole conlore in binorio. configurate la linea RBO come inter-
rr rrfnra (imrrl:to l'nnu i611g di anima-
00t I r r00 Complemento o 2 del volore do coniore,
001I I l0l do inserire nel TMRO. zione e verificate che al variare del
valore di RAO, lo faccia anche il bit 0
delìa porta B.
La verifica dell'interrupt nvece è
Registri necessari nel programma, con i relativi valori piu complicata: dopo un po'di
tempo la finestra del clock indica
sulla realizzazione del programma. Nella figura sono appena qualche m llisecondo, e come ricordiamo il
riportati i registri necessari e il valore che assumono. TMR0 è stato impostato per far variare RB'1 ogni 50 ms,
Sarà necessario configurare l'rnterrupt del TMR0, abi- che a noi paiono pochissimi, ma per ìl simulatore signi-
litando il bit GIE e ilT0lE del registro INTCON. Se le tem- ficano diversi minuti. Fermate quindi la simulazione e
porizzazioni saranno di 50 ms, potremo caricare il divi- utilizzate la finestra di "modify" per cambiare il valore
sore di frequenza con un valore di 1'.256 e giocare con il di TMR0, impostandolo vicino a l'overflow" Tornate a
valore che deve contare il TN/R0, che sarà 195. Ricordate simulare iì programma, e verificate che di lì a poco RB'1
che una cosa e quello che il TMRO conta, e un'altra e il cambi di valore.
valore con cui bisogna caricarlo per farlo così contare. Tornate a modifrcare il TN/lR0 nello stesso modo se
Bisogna prestare attenzione agli altri parametri del regi- volete far commutare nuovamente RB1, oppure arma-
stro OPTION. oer fare in modo che il TMR0 conti come +^,,, ^--i^^-- E^ r-.-iltelO
^ri VOZtCtt4O
LCVt Ut rO)Lr( evOlvere da SOlo.
voglramo

ffffi#ffiffieffiffi& ffifi'.=jF]=
SFB Ndme
::.'..,:...,' ::.=ltrJnJ
Hex Dec Bitrary :
:,
n
lFl
t tiuo
Dopo aver visto i preliminari, passia- tm-$
ù41
1g
13

2?
€861 8{69
g6E"l-r911
per Tt'll

mo al programma in sé. Defrnite le DFlicî_reg !? ? inizia-


siitug tB 24
.,-.i-t-iri
vót tóurt I c^ PU)r4rur
^^-i-i^^îrO
to il VeCtOf di
L
f5r 60 B Se BfiB
portò É0 6 5A nO,
interrupt, iniziamo con la routine trisa 61 J altrinl
portb 69 I
trlsb 5B
dedicata all'interrupt. Si utilizza l'istru- eedrta Sfi
ú

zione "xorlw", mettendo un 'l nella


É
eecon l gB B
eeadr 5g 5
eecsnz Bg
posizione adeguata, per invertire il pclrth 6S
6
I
itrtcúr É€ lé8 1€195É9É
valore del LED collegato a RB1 Prima s 3D éf BdJ!1íCl
lúpre É$ lì? 11slJg6'l
di rientrare dobbiamo caricare ilTMR0
con il valore calcolato in precedenza,
per fare in modo che conti nuova-
monto EO m< o nnrré : zarnil flen cho --
Cycler
_ - - -: ::_-
-
ze10 II i1076

indica che il TMRO è andato in over- Stbtr6lP' Shq 7


Slin 10 (Pl . Slin 11 fPl Preelg Frewmt 4.ft0tlfil0 HHz
flow. Nel programma principale, dopo
/ q|gar On Fe€{
la configurazione dei registri e il carì-
co del TMR0, controlliamo il valore
Per provare il programma dovremo ricorrere ad un piccolo trucco.
del LED montato su RB0, a seconda

Se#sw"*swrw ttat,all:aa,aaaaarallrNrAij';',f:::::::::;::;:ì:ì;:;llllllttatai,é&&atirflllllrrrlìììi11111r!1ììììììd;1irrrrril$lllrllììììrrìrì
,4.: ) .:::
:.;,:.:

,::a:.:.:.:...

'::::.,:"': '
opo aver visto tutte le istruzioni, il loro funziona- utile al "nornento dr prograrnmare, dato che raccogle
::,,:'::',
r::i,:. :. mento e il modo di utilizzarle correttamente, gli aspetti fondamentali di cui bisogna tenere assoluta-
l'.i'.:..
:.-' .:..
nrespntramo rrn riassrlnto che risulterà molto menle conro.

ATTIVAZIONE
:ì:i:
::ì1.::a:: ì
MNEMONICO: PARAMETRO SPIEGAZIONE
DEf
,FLAGS
i::,,,.ì,Ul
lstruzioni che gestiscono regisiri
oddwf t.l ì SOMMA W con f (- f\t^ -7

ondwf f,d AND di W con f La


clrf f CANCELLAZIONE dif Z
clrw : CANCETLAZIONE diW Z
comf f,d , COUPLET\AENTO di f Z
decf f ...1 ] DECREMENTO di f Z
i ncf Ít I INCREMENTO di f Z
iorwf fÀ lORdiWconf L
movf f,d ] SPOSTAMENTO di f L
mowvf f : SPOSTAMENTO do W o f
rlf TA ì ROTAZIONE o sinistro con corry (-
IJ KUlALlLJl\E o Oesîro con corry (-
rrf
subwf fJ I SOTTRAE W do f (f'W) î f-\î 7
swopf ÍJ i INTERSCAMBIO dei 4 bit +
, significotivi con i 4 - significoiivi
xorwf t .'l : OR esclusivo di W con f
lstruzioni che gestiscono i bit
: bcf th r IMPOSTA o 0 il bit b di f
: bcf f,b : IMPOSTA o I il bit b di f
lstruzioni che gestiscono operondi immedioil
oddlw k : SOMMA di leiterole con W iC, DC, Z
ondlw k : AND di letterole con W tZ
iorlw k i OR di letterole con W IZ
movlw K i SPOSTAMENTo di leiterole o w :

sublw K i SOTTRAE W do letterole {KW} .C, ÙC, Z


xoflw k I OR esclusivo di letterole con W :Z
lstruzionidi solto
btfsc b i TESTA bir b di f; sALTA se 0
btfss b : TESTA bit b di f; SALTA se I
decfsz , DECREMENTA f;
: SALTA se 0
incfsz f,d I tNCnrurNtR f;
: SALTA se I
lstruzioni di controllo e specioli
' coll rk . CHIAMATA o subroufine
I clrwdt :, CANCELLAZIoNE del WATCHDOG TO#, PD#
I goto "t- SALTO od un indirizzo
, noP NO OPERATION
r retfie RITORNO do interrupt
r retlw RITORNO losciondo un letterole in W
; return RITORNO do subroutine
:l
: Sleep IMPOSTA il microprocessore
in stondby o stoto di riposo TO#, PD#

lstruzioni del PlC l6FB4

Tffssfu m$$sa w$swss*s#*s$eew e*il,**& $m &w*was;sx*s* s


I momento di realizzare un particolare pro- sono riassunti tutti iregistrr specifici
\_luc)Ld pdvil rd
gramma, i registri sono tanto importanti quan- della memoria RAM, con la situazione di ognuno dei
to le istruzioni. Nella tabella pubblicata in loro bit

NOME BrT4 i tot ; Brr2 i err

ì OOh INDF

, 0rh TMRO

a2h PCL

03h STATO PD# Z: DC C

FSR
:

05h PORTA A RA3 RA2 :


RAI : RAO

0óh PORTA B RB3 KÓI RBI :RBO/INI


i

07h
08h EEDATA

09h EEADR

0Ah PCLATH

0Bh INTCON trtrttr INTF RBIF

B0h INDF

Blh OPTION

ótn PCL

óJn STATO Dn++


tvÍ DC C

B4h FSR

B5h TRISA

Bóh TRISB

87h
_1
l^rh
8Bh EECONI VVK KU
:l
B9h EECON2 ;

BAh PCLATH

BBh INICON TOIF INTF RBIF

Registri della memoia RAM.

Y*efuw$*w r&wsmaewss&xrw dq*$ ryww&mffw$ ds&Hm #s*#$&*#iir$#éì #e&ffi#&


Tutti gti interrupt
o
lnsleme
tiamo arrivando al punto culmi- pre quando si lavora con interrupt, dato
nante della programmazione che il peso del programma ricade su que-
con i microcontroller; mancano sti ultimi. Uunìco interrupt che non e atti-
solo alcune piccole risorse per vato dall'inizio, e il TMR0. La traduzione
conoscerne tutti t suoi segreti. In dell'organigramma in assembler sara
questa occasione combineremo tutti gli immediata. Uno degli interrupt porra a 1

interrupt in un unico programma. Le appli-


l-,,-.i-Air^
td vdIduilc
,,.-r',\,,,, ^,,-"rdo
)Lr rvr quol cambia il valo_
cazioni che stiamo facendo sono sempre Schema elettrico re dello stato dei sensori, indicando che
più complicate e professionali. lmmaginate del l' eserciz io p roposto dobbiamo scrivere un nuovo valore nella
il seguente esercizio implementato. EEPRON/. ouindi ci sarà una chiamata ad
una subroutine che realizza questa funzione. In ogni caso
5i vuole simulare il funzionamento dell'allarme di una macchina. per risolvere questo esercizio, bisognerà pensare molto
5i utilizzeranno quattro sensori collegati ognuno ad una porta, un cicalino,
quattro LED e un pulsante. Aprendo una delle porte si attiverà un bene a quale sarà il compito di ognuno degli interrupt
cicalino a intervalli regolari, sino a che non venga premuto il puhante di stop. Lorganigramma che rappresenta la routine di servizio
lnoltre si accenderà un LED conispondente
alla porta aperta e si scriverà questa informazione sulla EEPROM.
all'interrupt, potrà servire da base per qualsiasi programma
Tutto il programma verrà fatto utilizzando gli interrupt. che lavori con piu dì un interrupt, dato che e molto gene-
rale. Se si lavora con solo due interrupt, potremo soppri-
Enunciato del programma proposto
mere le richieste corrispondenti a quelli che non sono uti-
lizzali, e il resto sarà invariato. È importante rendersi conto
s{F{ffiffie g,&-ffi?$qxfl# che ogni interrupt è
Anche lo schema elettrico si sta complicando progressi- indipendente dagli cdfiguEzione
fMRO
vamente, in questo esercìzio si utilizza la quasi totalita altri, e che quando se InErrupt
9A uscib
della Porta A e Ia maggior parte delle linee della porta B. no nrndraè rnaì nÒn PB ingrss

La loro scelta, come mostra la figura, non e casuale, se ne possono pro-


infatti, sugli ingressi da RB4 a RB7 dovranno essere col- durre altri sino a che
non sia terminato e s€Rrvl:l? O
Iegati i sensori delle porte per generare interrupt; su RB0 il

invece collegheremo ìl pulsante di stop dell'allarme. I pin trattamento dei


da RAO a RA3 si utilizzano per mostrare lo stato dei sen- primo. Saranno le Sclvo shto

sori delle porte: RAO mostrerà quello di RB4, RA1 quel- azioni corrispondenti
lo di RB5 e cosìvia. Questa scelta, anche se non è obbli- ad ogni interrupt, a
,-l-
ud ,,^/r^
gatoria, facilitera la programmazione. Collegando il ---ki-"^
LdI tutdtc urr ov- Organigramma del programma
cicalino su RA4, potremo configurare la porta A come ^li---;^^^
pilLdztu|c -,1 ,,^,-l
du ur or- pri n cì pa I e d el l' esercizi o p roposto.

uscita, e la porta B come ingresso, facilitano così ulte- tra. Vediamo l'or-
riormente le cose. Dovranno essere collegate anche le ganigramma corrispondente ad ogni interrupt per il

linee di alimentazione. il cristallo di quarzo e il reset. nostro esercizio.

g&èY*:ffi&UPY fffi$q gtrPffi{3ffi


#ffi*eru€ffiffi&lb$rd&
ffi tr{- trffi#ffi *a&ffi tu?& ÈFKg*$il3tr&Lfr lnizieremo dall'interrupt per fine di scrittura nella
L'organigramma principale, come si puo verificare nelìa EEPROM, perché in questo caso e il piu semplice.
figura a lato, è molto semplice, come accade quasi sem- Quando si termìna di scrivere il valore dello stato delle

Sw6*wwryw
stato lui a provocare
lnverti volore cicolino l'allarme, quindi spe-
gnerà il cicalino. Non
o "iTl- É dobbiamo dimenticare
Per84-ù7 lniziolìzzo TMRO
che, se non facciamo
a '-l;! ÈÉ
nulla, il TMR0 conti-
nueraacontareead
'."T11,ff*' o ,ilià, ffi Organigramma per il andare in overflow,
trattamento
pt per
producendo interrupt e
del l' interru TM R0
Troft l'inÈnuÉ
per TMRO
trofro l?i.tèrrupr
pèr EIPNOM tornando ad accendere
e spegnere il cicalino.
Dovreno quindi disattivare gli interrupt per TMR0,
per fare in modo che non se ne producano più.
Faremo la stessa cosa
per glr interrupt su

Organigramma della routine di interrupt


R84-RB7 per i sersori
collegati alle porte. Accendere LED
secondo porte aperte
L'allarme sarà disattiva-
porte della macchina, aperte o chiuse, dobbiamo to sino a che non si
solo ritornare a impostare il valore della variabile provochi un reset del
"scrivi" a 0, per fare in modo che non avvenga una Iniziolizzore TMRO
sistema.
nuova scrittura del valore sino a che quest'ultimo
non cambia. gNYtrffiffiA"$PY
pffiffi ffiw&-ffiffi7 Attivore interrupt IMRO
g$\éYffi
ffi $qaj pT ptrK ?$4 $q* Questo è l'interrupt più
Per quanto riguarda il caso del TMR0, è già stato pre- complicato del nostro
Scrivi = |
sentato un esempio simile. Se vogliamo che il cicalino esempio, dato che e
quello che deve tener
conto di più cose. La
Accendere cicqlino
Spegnete <icolino prima sarà di mostrare
Scrivi = O
mediante i LED il valore
delle porte: aperte o
Disdtfivore interrupl
Organigramma del IttRo chiuse. Per fare in O rga n i g ram m a del tratta mento
dell' interrupt per R84-R87.
trattamento modo che il TMR0
del l' i nterru pt per E EPRO M possa cambiare il valo-
Di.qttivore interrupt
RB4-RB7 re del cicalino lo dovremo inizializzare, e attivarlo su
interrupt. Ponendo la variabile "scrivi" a 1 , si otterrà
si accenda e si snenn; O rga n ig ra m ma del tratta mento che nel programma principale venga attivata la scrit-
ad intervalli regolari, del l' i nterru pt per RB). tura del nuovo valore delle porte nella EEPROM. Nel
utilizzeremo il TMR0 caso non venga premuto RBO, qualsiasi cambio si
per controllare questo tempo, e al prodursi dell'inter- produca sulle porte, sia in apertura che in cnrusura,
rupt invertiremo il valore del cicalino. Prima dì tornare tornerà a far saltare all'interrupt, e a scrivere un
al programma principale il TMR0 dovrà essere inizializ- nuovo valore nella EEPROM.
zato nuovamente, rn modo che, quando andrà in
overflow, cambi un'altra volta il valore del cicalino. trffi#ffi$q&f.,$&$e
ll programma che risolve il nostro esercizio è una ricom-
gru?ffiffiffi{"3$3r pfr& ffiffi* pilazione degli organigrammi commentati, una volta
Se l'utilizzatore attiva il pulsante collegato su RB0, signi- passati in assembler. Dopo averlo risolto ci sembrerà la
fica che vuole fermare l'allarme perché, ad esempio, è piu logica delle soluzioni.

Sw#*wwww
Lt5 | P=16F84 ; Si utilizza il PlC16t84
RADIX HEX ; Sistema di numerazione esade(imale

WR EQU
WRTN IQU
EEIF EQU
UIE EQU

RBIF EQU
INTF EQU
TOIF EQU
RBIE EQU
TOIE EQU

W EQU
I EQU
RPO EQU

TMRO rQU 0x0t


STATUS EQU 0x03
PORTA EQU 0x0s
PORfB EQU 0x06
EEDATA EQU 0x08
EEADR EQU 0x09
INTCON EQU OXOB
OPTION_REG EQU 0x8'l
TRISA EQU 0x8s
TRISB EQU 0x85
EECONl EQU 0x88
EECON2 EQU 0x89

EEADR_VAR EQU 0x0c


IEDATA_VAR EQU OXOD
SCRtVl IQU OXOE

ORG 0 : ll oroqramma inizia al-


goto tNtzt0 i l'ihuirizzo o
ORG 4 ; Vector di intenupt
goto INT

INT
-
;Programma di trattamento dell'inten-upt
btfsc INTCON,RBIF
q0Io T_RB4_RB7
6tfsc INTCON,INTF
00t0 T_RBO
6tfsc rNTC0N,T0tt
goto T_TMRO
g0r0 T_EEPROM

T_R84-RB7 swapf PORTS,W ; ll valore dei bit piu siqnificativi pasa


ia quelli meno siqnificàtivi
andlw b'00001 1 I 1' i si iancella il valóre dei bit meno
; siqnificativi
movwf PORTA ; 5i passa il valore degli allarmi alla PORTA A
MOVIW b'0011 1't0f' ; Si carica di nuovo il TlVlR0
mow'rf TMRO
bt INTCON,TOII ; Si attiva l'interrupt del TMR0
bsf 5CRtVt,0 ;5i imposta SCRIVI a 1
bsf PORTA,4 ; 5i attiva il cicalino collegato a RA4
g0î0 TORNARE

T_RBO bcf PORTA,4


bcf INTCON,TOIE
bcf INTCON,RBIE
g0r0 TORNARE

T TMRO movf PORIA,W


xorlw b'00010000' ; 5i inverte il valore del ckalino
movwf PORTA
movlw b'001 1 I 10'l' ; Si carita di nuovo il TMR0
movwf TMRO
goto TORNARE

T EEPROM bcf 5CRtVt,0


goto TORNARE

Soluzione del programma proposto

Sw$*qesqxvw
$3U Lr i""èAt*f1i il t3il g_ í?fr*sHe,&l.Ì.À
Nella simulazione, come sempre, dovremo aprire una
serie di f inestre per vedere come viene eseguito il pro-
gramma. Utilizzeremo l'opzione di animazione per
poter simulare l'apertura di una porta e vedere come
viene mostrata l'informazrone istantaneamente sulla
porta A, oltre all'attivazione del cicalino
Per verificare la scrìttura dell'informazione nerra
EEPROM, dovremo attendere piu tempo, cost come per
vedere cambiare valore al cicalino. Quando vorremo,
ootremo Oremere RBO e osservare come l'allarme cessi
di essere oneralivo anche se continueremo ad :nrire p
Un momento della simulazone
a chiudere le oorte.

movf INTCON,W
andlw b'11f10000'
movwf INTCON
hsf STATUS,RPO ; Passo al banco 1
bcf EECONI,EEIT ; Resetto il flaq
bcf STATU5,RPO ; Passo al banó 0
retfie

bsf STATUS,RPO ; Passo al banco 1


movlw OXFF ; Porta B ingreso
movwf TRISB
movlw 00 ; Porta A uscita
movwf TRISA
movlw b'01000't r 1' : Confiqurazione TMR0
movwf OPTION_REG I e fronie di interrupt

movlw b'1 r01 1000' : Attivazione deqli intenuot


movwf INTCON I per RB4.R87

bcf STATUS,RPO ; Cambio al banco 0

btfss 5CRrVr,0
g0r0 ctcL0
g0r0 SATVARE

movlw 00
movwf EEADR_VAR
swapf PORTB,W

andlw b'00001 1 1 1'

movwf EEDATA_VAR
call SCRIVI_EEPROM
g0r0 crcL0

SCRIVI EEPROM movf EEADR_VAR,W ; 5i sposta l'indirizzo


mowvf EIADR ; al siro reqistro
movf EEDATA_VAR,w ; 5i sposta il dato
movwf EEDATA ;al sùo reqifro
bsf STATUS,RPO ; Passo al 6anco 1
bcf INTCON,GIE ; 5i disabilitano qli interrupt
bsf EECONl,WREN ; Permesso di scrìttura
movlw 0x55 ; Inizio della sequenza
movwf EECON2 ; obbligatoria dí
movlw OXAA ; slcurezza
movwf EECON2
bsf INTCON,GIE ; 5i abilitano qli intenupt
bsf EECONl,WR i ordine di sciittura
sreep ; 5i pone in stato di riposo
; da cui si uscirà con ùn intenupt
bcf EECONl,WREN ; Disabilito la scrittura
bcf STATUS,RPO ; Torno al banco 0
return

END

Soluzione del programma proposto (continuazione)

Sw$*wwrsp
Gti organigrammi delle
subroutines e degti interrupt
gni volta che si pianifica un nuovo program- che abbiamo l'esperienza di diversi esempi, conosciamo
ma, la prima cosa da fare è realizzare un tutte le istruzioni e Ia struttura della programmazione
nuovo programma. Alcune volte è stato con rl PlC, possiamo arrivare sino rn fondo a questo utile
fatto quello generale, in modo piu o meno strumento che sono gli organigrammi.
dettagliato, altre volte quello delle routines
di servizio all'interrupt. Pero non è mai stato specificato fl*se f4&sfl*$i,g {3ffi t$ ru #ry#eeé3#ffi&r4ffie
nulla per quanto riguarda la realizzazione congiunta, né Nella sua presentazione abbiamo già visto che un orga-
sono stati fatti gli organigrammi delle subroutines. Ora nigramma è formato da rettangoli e rombi uniti da frec-
ce, e che queste devono seguire delle norme perche il
tutto risulti sintatticamente corretto.
Questo pero non basta, perché a partire dall'organi-
€onfigurozione gramma principale, da quello delle subroutines e da
PA ingresso quello degli interrupt si dovrà poter passare al codice
PBO ingresso
RBI -RB7 uscite
assembler quasi automaticamente. Questo tipo di cor-
interrupt rezione sarà la semantica.
Ogni rettangolo si trasformerà in diverse istruzioni
assembler o in una sola istruzione "call", da cui deriverà
una subroutine.
La scelta fra una cosa e l'altra dipenderà dal livello di
blli RAO=l? NO goio complessità del programma, e dalla ripetitività o meno
delle azioni da realizzare. Nel nostro esempio, mostrare
un numero su un display o realizzare un ritardo sono
qtrnrltrn7p mnltn r iilizzale nlindi l'rrsn di sr tbroutine e
adeguato per presentare il programma in modo leggi-
bile, e per risparmiare codice, evitando la ripetizione
Mostro O su PB ccll disploy delle istruzioni.
I rombi a loro volta si trasformano in istruzioni di
salto condizionale: btfss, btfsc, incfsz, ecc. dopo le quali
Ritordo coll ritordo si posizioneranno due istruzioni "goto", una per ogni
ramo del rombo. La presenza degli interrupt è dichiara-
ta nel primo rettangolo, pero in nessuna parte dell'or-
btfss ganigramma troveremo la chiamata alla routine di ser-
vizio dell'interrupt: ricordate che un interrupt non si
RAI =l? NO chrama.
s_919

ti#$q#r g
&wet&{'& & #f €_1f s{.$ f ge#{.}Tgr f s
A prima vista, l'organigramma principale e quello della
subroutine sono simili.
Traduzione automattca
Si differenziano solo nel primo e nell'ultimo rettan-
di un organigramma in codice assembler.
golo.

S,ep#&e*e'www
medesime dell'organigramma principale. Possono
essere utilizzati sia gli organigrammi che le subroutines,
€ONT- I5
anche se non sempre sono necessarie.

$-"*Fqffi&ruxffi $a&e$ M& ff}trG$-a xrux"gffi mffi p€


Così come c'è un solo organìgramma princìpale, c'è
TMRO *OO una sola routine di servizio per gli interrupt. Se lavoria-
mo con più di un rnterrupt, la prrma cosa da fare è veri-
ficare quale ne sia stata la causa, come abbiamo già
visto in precedenza. testando ad uno ad uno isuoiflag
sino a trovarla. Ogni causa anche se non era di per se
una subroutrne, generava un organigramma che ne
INTCON(2)= l? spiegava il funzìonamento. A volte è necessario anche
realizzare delle operazioni in più, come scrivere i valori
di alcuni registri prima di risolvere l'interrupt, i quali
potrebbero essere modificati nel corso dell'interrupt
stesso.

INTQON(2) *O
RSI

CONI + CONT-I

Scrivere registro
dq modificEre
CONT=O?

o Determinqre ls cousq
e risolvere
Tornq

Esempio di un organigramma di una subroutÌne RestourEre ivqlori


dei regisrri sqfusti

Nella subroutine normalmente non è necessario


configurare i registri e le altre risorse, pe'che questo è
già stato fatto nel programma principale; a volte pero,
€oncellore flog
quando si utilizzano le linee di ingresso/uscita per di inferrupt
molte periferiche, e necessario riconfigurare le linee
nella medesima subroutine. Lultimo riquadro di una
subroutine indrcherà il rrtorno al programma principa-
le. Sopra l'organigramma si riporterà il nome della
Tornore
subroutine, così come viene chiamata dal programma
principale.
ll resto delle norme, come terminare in un unico
Organigramma generale della routine dedicata all'interrupt.
riquadro, o che i rombi abbrano due rami. sono le

$w$s'*wwtrw
Applicazione pratica:
uscita dal modo di riposo
ffi bbiamo gia dovuto
,w.
WW flcorrere a questa pre-
ffi ffi ziosa risorsa (il modo di
riposo) quando abbia-
ffi
W %m mo lavorato con gli
interrupt, come modo miglrore per
lavorare con essi. Bastava porre l'i-
struzìone "sleen" ner entrarci e ave-
vamo diverse forme per uscirne. Si
ulilizzava nei casi in cui il processore
doveva rimanere inattivo durante un
periodo indeterminato di tempo. In
questo caso ci occuperemo dei due
bit situati nel registro di stato che
serviranno per determinare qual è
stata la causa che ha portato il pro-
Schema elettrico dell'esercizio Droaosto
cessore rn questo letargo.

ogni volta che si completa un gruppo di pezzi.


Anche se non sappiamo ancora quale interrupt uti-
5i vuole realizzare un pro(esso industriale che consiste lizzeremo, possiamo comunque prevedere RBO asse-
nel contare gruppi di l0 pezzi. gnato a questo pulsante. ll cicalino utilizzerà un'altra
Ogni pezzo attiva un sensore al suo passaggio. linea, questa volta di uscita. Le Iinee di alimentazio-
ne, il quarzo e il reset si dovranno tenere in conto
Quando ilgruppo è completo siferma la macchina,
nel montaggio finale.
fino a che non si preme un pulsante,
5e va in overflow il Watqhdog, si attiverà un cicalino, $R&eNX&ffi&ffi ffi g A3KL PK#6&&M$'gA
ad indicare un'anomalia nel sistema, Prima di fare l'organigramma dobbiamo leggere con
attenzione l'enunciato e pensare a quello che già cono-
sciamo. Anche se ora sappiamo lavorare con gli inter-
En u nciato del I' esercizio p ro posto rupt, non è detto che debbano essere utilizzati in tutti
i

programmi, né che si debba usare l'istruzione "sleep"


ogni volta che c'è un interrupt. in questo caso, ad
s{${rMA rg_fiYv&xfi# esempio, abbiamo pensato che non c'è ragione per
L'unica cosa chiara oer il momento è il numero di implementare l'interrupt del TRM0, perché non ha
ingressi e di uscite che sono necessarie. Un sensore ragione d'essere, inoltre dovremmo attendere all'inter-
dovrà contare il numero di pezzi, ricordiamo che il no di un ciclo che q:esto si produca: ricordate che non
modo mìgliore per farlo è utilizzando il TMR0, per possiamo mettere in stato di riposo, perché il TRM0
cui gli impulsi dovranno entrare tramite RA4. lnoltre smetterebbe di funzionare. Dopo ogni gruppo di dieci
avremo un pulsante per mettere in marcia il sistema pezzi tl sistema deve rimanere fermo sino a che viene

SaS*wsr*
che saranno rivelate quando il

Configurozione
Watchdog andrà in overfìow. Se all'i-
RA4 ingresso nizio del programma si verificherà il
RBO ingresso valore del bit TO#, ed esso corrispon-
RBTuscilo de a 1. sapremo che si è arrivati a que-
TMRO
inferrupt RBO
qtÒ nrrnto ner rn overf low del
WDT Watchdog e non per l'evoluzione nor-
male del programma. Nel nostro caso
capiterà quando si tarda troppo
tempo a contare il gruppo di 10 pezzi,
oppure quando si tarda troppo a pre-
mere il pulsante dopo aver terminato
TO#=O? Accendere con tale gruppo. Una volta attivato, il
cicqlino
cicalìno non si fermerà sino a che non
si inizializzera il sistema, e questo farà
cambiare il bit TO#. Per quanto riguar-
da l'interrupt di RB0, serve unicamente
per fare in modo che il sistema esca
dallo stato di riposo. quindi il suo orga-
Spegnere cicolino nigramma contiene solo le istruzioni
iniziolizzore TMR0
principali. Visto che configuriamo solo
questo interrupt. quando si produce.
non dobbiamo ricercarne la causa.

ffi$q#ffiffiSe&4ffie
TOIF#=l? ll programma si risoìverà come ripor-
tato nella figura. La configurazione
rappresentata nel primo quadro del-
l'organigramma si risolve con i corri-
spondenti valori in TRISA e TRISB per
,--- -f usctra, e con
lo nnrio rli innroccn I

valori di registrì OPTION e INTCON.


TOIF=O Nel primo. il divisore di frequenza si
configura al massi-
mo, non per il
TMR0, ma per il
Riposo \A/:frhdnn (i <no-
cifica, inoltre, che
il TMR0 si incre-
menterà con gli
Organigramma del programma principale imnrrl<i o<torni rho
del I' esercizio proposto.
arnvano tramrte
RA4, e che il fronte
premuto un pulsante. Qui sì che possiamo attivo sarà il fronte
attendere con una "sleep", dato che l'in- di discesa, cioè
terrupt tramite RBO ci toglierà da questo quando il pezzo ha
stato. Nell'enunciato, inoltre, si dice che
Organigramma
dobbiamo indicare con l'attivazione di un
della routine di interrupt
cicalino le anomalie del sistema, anomalie

Sw#swwws
LIST P=1 6t84 ; 5i utilizza il PlCl6t84
RADIX HEX ; Sistema dì numerazione esadecimale

TMRO EQU 0x01


T0rt EQU 0x02
TO EQU 0x04
STATUS EQU 0x03
PORTB EQU 0x06
RPO EQU 0x05
INTCON EQU OXOB
OPTION_REG EQU 0x81
TRISA EQU 0x85
TRISB EQU 0x86
INTF EQU 0x01

ORG 0 ;ll programma inizia


goto tNtzt0 ; all'indirizzo 0
ORG 4 ; Vector di interrupt
g0r0 INTER
ORG 5

bsf STATUS,RPO ; 5i passa al banco f


movlw b'00000001' ; RBO ingreso, il resto uscita
movwf TRISB
movlw b'00010000' ; RA4 ingresso, il resto uscita
mowvf TRISA
movlw b'If 1'Í000' ; Configurazione di TMR0 e WDT
mowrrf OPTION-REG
m0vtw b'f0010000' ; Attivazione dell'interrupt
mowvf INTCON
bcf STATUS,RPO ; 5i pasa al banco 0

btfsc 5IATU5,TO ; Verifico il valore di T0#


9010 NORMALE ; Sequenza normale
goto ATTIVARE ; ll WDT è andato in overflow

bcf PORTB,T ; Disattivo il ckalino


MOVIW 0xF6 ; Carico il complemento a 2
mowrrf TMRO ; del valore da contare

btfss INTCON,TOIF ; Sono passati l0 pezzi?


goto crcL0 ; No, aspetta
bcf INTCON,TOIT ; 5i, resetta il flag
sleep ; e metti in riposo

goto ALTARME

bsf PORIB,T ; Arcendi il cicalino


goto ALTARME ; Entra in un ciclo

bcf INTCON,INTT ; Resetta il flag


retfie ; Torna dall'intenupt

END

Soluzione del programma proposto.

terminato di passare davanti al sensore. L'interrupt passaggio der pezzi e il pulsante di messa in marcia del
ner RB0 si confrorrra a sua volta con il fronte di sistema; notate che abbiamo aggiunto anche la linea
discesa, e si disattiveranno le resistenze di pull-up. ll di reset del microcontroller, per poter osservare una
resto del programma e una traduzione quasi imme- cosa molto particolare che commenteremo più avanti.
^l; -+- -l^^li
urdrd ueqil orqdf
^"^-^;^".ìrqrdmml. Tramite la finestra dei registri faremo attenzione al
vaìore che prenderanno i bit TO# e PD#, oltre all'evo-
SgSli Lè;.:** g ilsil1 F**Sffi&$j$ H& luzione del TMR0 e all'atiivazione del cicalino. Non
Per realizzare la simulazione in questo caso dobbiamo dimenticate di assicurarvi che il Watchdog sia attivato.
aprire le finestre degli stimoli asincroni, per simulare il Eseguite il programma con l'opzione di animazio-

li*$È:ars*r*
dovremo, come gia altre volte, aspettare
troppo tempo, trattandosi di una simulazio-
ne. Per questo utilizzeremo un trucco: cam-
bieremo il valore del divisore di frequenza,
mettendo in OPTION il valore ''l 1 1 1 1 000'.
Dovremo nuovamente assemblare il pro-
gramma. Eseguire un'altra volta I'applicazio-
ne, però in modo rapido (Run) e questa volta
non cìiccare il pulsante RA4. ll Watchdog tar-
derà l'aoorezzabile cifra di 1B ms ad andare
rn overflow. Prenderemo la finestra di clock e
fermeremo la simulazione, nuovamente, per
vedere i risultati. ll programma deve rimane-
re nel primo ciclo, e se si manda di nuovo in
esecuzione con l'animazione vedremo che di
Preparazione delle finestre per la simulazione
lì non esce. fO# (bìt 4 del registro di STATO)

ne. Dopo la configurazione delle risorse. il


programma entrerà in un ciclo aspettando
che passino i 10 pezzi. Non
uscirà da questo SbbrkFryÈ
kt
pcr
ll H ltirùra j
6ffi1ff r kC *n,l ì Ols-ttl- .

ciclo fino a quando non faremo 10 doppi clic qEh_q € ?s rirrth nd$ ùFa i q*ia. È
stE € a ffin d rna i èl sals
a m
sul pulsante RA4. Se si configura la linea Fr.-affi
hlr.
Fs
il
àa i*

tm
bEs
St.
kf
lFl$,talf
Èaclo
t*tq.tala
ituE.
ì h" -+tt:
ì s, Fs.tt
H$-tffirl -lfi ::
aq
come pulsante, invece di interruttore, baste- *trtam::
@i a a m ùlÈ
Ft.
a *
ranno la metà delle oulsazioni. Osservate che N
Ffl
shF
-

ra
a
r* '
ffi
ffi
tù.È
#:
ogni volta che si realizza una doppia pulsa- *
thrÈ
9a
s
l*
5
rFE
ffi
zione si incrementa di 1 il fMR0. Si arriva così
i*d::-.-..:... ,. .:. : d.€
allo stato di riposo, momento in cui cambia il
valore del bit PD# (bit 3 del registro di STATO)
passando a 0. All'inizio del programma era a
1. Dopo breve tempo, cliccate RBO, vedrete
che il programma inizia di nuovo. Se ora
Programma in stato di allarme, dopo che è andato in over-flow il Watchdog.
vogliamo verificare l'overflow del Watchdog,

dovrà avere valore 0 per indicare che


è stato prodotto un nuovo overflow, e
ntm slam.n : kifi6 Ì
il cicalino essere attivato. Pulseremo
!t E nl1h
tr 6 Ufilll
Ft mE
antw
iI sltFÈa
s{ftr r
È::,
: ll sl I i-= MC LR oer resettare il sistema e vedre-
lt Îa 5n
rtffi
*4ffi,
:::
nn,,
sa
ì las*tih
iFl6il:
mo che il programma prosegue rifa-
isilaùn|m: lilt ; *l S*L
Fbrarlfn,
t$nrffi:
cendo la stessa cosa. Questo perché si
ùtl:lmn':
nlmi.
ìtffi,. {A
verifica all'inizio il valore del bit TO#.
tam:
rtm: ed esso non cambierà frno a che non
ra 1* rmta ì
Ft à
M14Sf
ilttma r lr5 Ef
ih
ma.t
l[ff
i ed
i Éttr. ù
r
si scollega I'alimentazione: non basta
E l||tt{,lm : htt ll: pulsare il reset. Nella simulazione,
scollegare I'alimentazione equivale a
scegliere I'opzione Debug>System
Reset. Iniziare una nuova esecuzione.
rntrodurre dieci pezzi però senza pre-
mere il pulsante RB0. In circa 18 ms
Programma in attesa che sia premuto RB)
dovrebbe rioetersi la stessa cosa.

$of*rrr:re
File di intestazione

file di intestazione sono uti-


lizzati in forma di moduli da
includere aìl'interno di un
programma principale. I file
di intestazione standard
che fornisce Microchip definiscono
i registri specifici di ogni microcon-
trnllor n:rfirol:re a seconda del
file. Così, ad esempio, nel caso del
PIC'l6FB4, il suo file di intestazione
è il p16FB4.inc o il p16F84a.inc, a
seconda del modello.

eLfl#rux rg*_fr
ffig Xà*Ytr$Y&Xg#f'*tr
Nel p'l6F84.inc, così come è
mostrato nella figura, appaiono le
definizioni sia dei registn specifici,
che dei bit particolari di questi regi- Un frammento del {ile di intestazione del p16FB4.tnc
stri. Si può vedere il contenuto
completo aprendo il registro trami-
te MPLAB, come qualsiasi altro file.
L'uso dei file di intestazione ha il
vantaggio di risparmiarci il Iavoro
per definire le variabili più comuni ; Bloócr d€l1s €tl,6h€tte
^^^i ,,^l+^
ognr vorra cne sr +-
-A^ -; ìd ,,,
un pro9ramma, : c$Locx KEY-lrÈ& ; IrLzlo delle qariètllt
TÉS1g
ìnoltre migliora la chiarezza neìla :
:
kEY_1
REVz
, t{Év_sE|.*9_1
lettura. Con l'uso di file di intesta- :
:
xev-aEL*Y_2
IEMP,I
zione standard, si facilita ìa com- Elsc

prensione da parte di un program- ,; BBstine di sÈansie.e d"]:.a tastiera


:HE?-$c*fi bsf sfnrils,gPg ; Pès5o a1 banco I
matore esterno, permettendogli Fosls b'OSS0C1t1'
Eqvsf FOAIa ; ASt-nA7 !scl.te, 898-ng$ ilgr€s5i
pertanto di collaborare in un pro- ftsf IÌ?TIOH_REG,7 ; fittisa ptrU-sP intèrni
bcf sT*fOS,nPg ; TorDq al bànca 1
gramma non scritto da lui. Pero B6uls 4
r
Fo!9f fE9_1 ; H. delle fil€ dà esplorere
Essl{ b'01't-t11'l l'
file di intestazione, oltre alla defini- Fsv€f ÍA3TO ; Fila dÀ ettitàre
[É?_SCAH_1 R.vf TrSlQ,H
zione delle variabili, possono con- Bousf
nop
Po*-lS ; *ttiuù Sila

tenere subroutine o macro per il frcaF


R^.rsJ
?O*TS,U

funzionamento dei diversi elemen-


ti, come le tastiere o gli LCD.
L'utente puo fare dei propri file di
File di intestazione per l'utilizzazrone della tastiera
intestazione, anche se deve tenere

ffiw#&wwv*
j,iiÈ3$
. .: .: i:i.tr,,:i

..'
I

"::

: .:.:.:i3
.,:::i:*S

. :.:.,ì:
conto, comunque, che nei file utilizzati nello stesso caso dei file di intestazione che definiscono i registri del ...;,;ali*
:ara:ta

programma, non devono coincidere def inizione e microcontroller, prima di INCLUDE bisogna definire il
.a.:a'.:..#
,.'.:.:::.:ì

subroutine. proprio PlC. Per fare in modo che il file venga trovato ': r :::ìl*

:.::::i#
al momento di assemblare il programma, deve essere
g-'#S* #il3 ilXL$r *X Xf*Yffi$Y&Xg*r4*i nella stessa directory. Se osserviamo come si carica il
:.:,t:r,è
:iì:]:!li!i
':iNÈ
L'uso dei file di intestazione è semplice: dobbiamo solo file nella memoria di programma, vedremo che si ottie- , ,:,::ì*
porre una drrettiva INCLUDE nel programma principale ne lo stesso risultato copiando direttamente il fìle al
.:.;
::
e, in seguito, il nome del file fra virgolette doppie Nel oosto della direttiva INCLUDE. ;=]
:' :i:iil**

::.a.aa:,,+?l

'':"'r::"':

:t;i&
:,.a,
::::a
LISI e-l6Ft+* ; Eefinlziotre del procFÉssre i::i
__ .iì:iìtl
caxt €{u ge ':iì:rr:iìri:ia:
...ti:ìÈ
ffv_qnR EQr, 6s ; Uàriablli detli tègtiera
o*f 6
gote llJIZI0
:
:::::::
; Ptsoqraffia prlilcipale -'l
'I 't.i:nì
...:ì:iìr*
i::ii:
.::€:
'.

ItUll0 bsf SIeffS.SPA ...,. .


.;j:r::
clrf P{,BIÍ ; Psrts À cotr uscita
mute è'85684111' ; eorfigura nFtlgt{ per :l f|{$ú
muBf t FTI0il_R€S
bcf SlÀtgs.RPa : l:::a.il
bcf FgATe"$ : Disàttiua i.L Èicèli.no
_l*gfg càll gEg_geqll i Esegui u*: sc:oslone d€11à tÀstlèra ' ì..:::::ì:
muls gx8g

:. ...:.,:ttaa

.'::::.:*

Uso dei file di intestazrone

.ììt,,]rt::::it
,.:::::::,::,,,:*

.,-a
.:a:aa

: l

':a:aa:,4

I :,:ì;ii:

::t.:t:u:::
:
'':ii:l$
''. ìitììi.tiì

. a::::::
..:.4.:a:a*i

. :.4..1:aia
..,
: .i::i3f
:::::5F
. trit:sl
' 'lrl:::i:É:
Esemoio di come si carica un INCLUDE
'.,'.:,,:.tt:
nella memoria di programma.

' :ììììììiìir:tt
' . ìììì:ìrìri:iul

Sqw$$*lw*swsw .:*$i*
-':'':l- :
Apptica zione pratica: raccolta
dei dati tramite la tastiera
e finora avete trovato nteressanti i

programmi con il PIC e iniziate ad


immaginare le possibili applrcazioni,
irr,!i iÉj nealo
questa periferica vi incanterà. ln alcu- rr",jit,li e,j..f
ni reqi i cpmnliri te<ti 59p19 sufficienti .'lini$f.l neslr
per introdurre dati in una applicazione, però Er '.gj RBó+ì
mano a mano che le applicazioni diventano più nezI t
TASIIÉRA
complesse, avremo bisogno di sistemi più sofisti-
cati, almeno in apparenza, dato che il loro uso e
la programmazione continuano a rimanere sem-
RBo---Jlll
RBI rll
RB2-l
RB3
llll--RB7
IILRBó
l-RB5
L-- RB4
t t t+
ttto

RBO RB] RB2 RB3

------J
plici. COTONNE FITE
{uscrTA (rNGREsso
DEI TASTI) DEI TASTIì

g_A g&s?gilffiA il#&$tr trilffi3flflffig{&


ffià gru&ffi*"ss* Schema dei collegamenti di una tèsltera da 4r4 16571

Dal punto di vista elettrico una tastiera è un mec-


canismo in cui ognuno dei suoi tasti f unziona come un ^,,1.-^+i
pUldlìtl,
,,+il;--. .^l--onto nttn rlllEE
linoo nor fr rnzinnrrn rl
UtlllLLCt )UldlllErlLs vLLv VE lullZlUlldlC/ dl
.pulsante. Comunque la distribuzione di questi pulsanti, posto delle l6 che sarebbero necessarie con pulsanti
insieme al modo con cui vengono gestiti dal program- indipendenti. Ci sono diversi modi di configurare una
ma, fa sì che l'uso della tastiera faciliti l'utente all'intro- +rrfiarr
Ld)tleld, d-.^-^^.1-.li -nmo
>eLUl lud Ul Lur rq <nnn
)ur ru rnllon:fa
rvilqyqLc rq li^^^
lp llllce ^ -^
C )C
duzione di dati tramite l'interfaccia piu intuitiva, oltre a si lavora o meno con interrupt. Per il momento dimen-
risparmiare linee dr ingresso/uscita rispetto all'uso di tichiamoci di questo, per poter vedere in un modo più
tasti convenzionali. Così ad esempio una tastiera da 4x4 semnlire il ronretto di funzionamento. Dato che una
tastiera esadecimale ha bisogno dr otto linee di ingres-
so/uscrta, scegliamo la porta B per il suo collegamento.
Come possiamo osservare nella f igura, le quattro linee
meno signif icative (RB0-RB3) si conf igurano come
ingressi verso il PlC, e le 4 pru srgnrfrcatrve (RB4-RB7)
come uscite dal PlC, anche se potrebbe essere il con-
trario. ll programma dovra porre sequenzialmente a
Tpro oonrrna dclle linpp di rtsrit: o lpnnoro le linee di
ingresso per rilevare i cambiamenti. Se non si preme
nessun tasto, ivalori raccolti dalle linee di ingresso
saranno dei livelli alti, mentre se si preme qualche tasto,
l:,,tt:. la linea di ingresso associata prenderà un livello basso.
lt'ta:,.
In questo modo ogni tasto ha associato un codice bina-
'.:,.,.a.,
:L:l:):l
rio, che identifichera in modo univoco la sua pulsazio-
tat'.::,:
ne, e che sarà formato dai 4 bit che escono dalle linee
R84-RB7 e dai quattro ricevutr da RB0-RB3. Ogni codr-
Tastiera modello ECO 16250 06 ce sarà formato da 6 livelli alti e 2 bassi, coincidendo
realizzata dalla ditta ,ECME.
questi ultimi con la fila e colonna particolare d ogri

Se*S*n*sesr*
tltr(lNc*Ess0 subroutine, per attendere che il tasto venga rilascia-
TAsTo RM Rmcot*?)Nt$ìt*[o CODICE HEX
RB7
"-ì'-ì-'l-" ..l- - 0-- *î..: *'""7D--..' to. Nel nostro esempio non importa quale sia stato il
i---0..: ò-'--i -".-í
tl0 1 I 0: EE
tasto premuto, dato che il procedimento sarà sempre
lt0 I 0'l li ED lo stesso: si attiverà il cicalino, per un periodo di
ri0 0 t:
temno p noi si inizierà nuovamente con la stessa
EB
ì0 I I 0; DE
ì0 I 0 t: DD
ì0 DB
seq uenza.
0 BE
0 BD
0 I BB s{_ rx$_fr ffix €ffi&YY&rusruT#
0 I 0
0 I
7E
7B
$3fr&-L& €&Sggft:$Cs
0
I
I
0
0
0
77
87
ll codice presentato nella figura, potrebbe apparire
l I 0 0 D7 strano se confrontato con i programmi visti fino a que-
I I I 0 E7
sto momento: non ha direttive, né inizio, né fine.
Codice associato ad ogni tasto di una tastiera esadecimale. Questo perche nor si tratta di un programma comple-
to, ma di una serie di routines, nel nostro caso due, che
saranno memorizzate come un file a parte, e saranno
tasto. Nel programma di gestione della tastiera si avrà incluse nel programma principale.
un'esplorazione della tastiera approssi- Queste routines avranno bisogno
mativamente ogni 20 ms anche se, sia di variabili ausiliarìe, Ia cui definizione
CONFIGURAZIONE
il tempo sia i codici, possono variare a PB Tosliero si fa all'inizio del file. Dato che si trat-
seconda del modello e della posizione Po Cicalino ta di un file di carattere generale utiliz-
dei tasti. zabile in qualsiasi programma che
impieghi una tastiera, non sl conosce
p$a#ve ffix F{_$
g\$x$ffi fq&ffi ffi $\*Y* la prima posizione libera del program-
Esploro tostiero
L'uso della tastiera in un programma, ma principale in cui collocare le varia-
sebbene non comporti complicazioni hili
uilr, norriÀ
prrrrv <i
Jr tiilìzzo".
uLilr44clq l:Io nliratfirr:
ullgLtlvo

una.volta compreso il suo funziona- CBLOCK, che definisce un blocco, il


F.&
mento, implica l'apprendimento di cui nome nel nostro caso è KEY_VAR
nuove funzioni specifiche per questo In senrritn ri nrpor.roeremo di collo-
compìto. Quindi concentriamoci su di aArè dt ro<fn hlrìaaal
essa senza preoccuparci. per il momen- Le due routines principal realizza-
to, della scarsa utilità del programma Afiendi il riloscio te sono KEY_SCAN e KEY_OFF. La
in sé. Nell'organigramma che rappre- ^.^l^"- l-
^"i*-rd c>prurd
pril rd +-.+i^"- ^^" {;l^;^
Ld>r-rcrd pcr illc il |

senta l'enunciato proposto, si possono rorr> Ai rrn f îctn nrómr ri^ nor
|/s,
rr ri ìLla
!u,
Attivo cicolino
differenziare due parti: l'esplorazione attiva una ad una e raccoglie il risulta-
della tastiera e le azionr dopo la rileva- to delle colonne. Se il risultato di quan-
zione di un tasto. ll tasto si configurerà Ritordo di I secondo to inviato e ricevuto è diverso, significa
come e stato spiegato in precedenza, che è stato premuto un pulsante, e la
inoltre si abiliterà una linea di uscita per Disottivo cicolino routine fornirà il codice del pulsante
un cicalino. La scansione della tastiera premuto. Se testando le quattro file
verrà inserita in una subroutine. Nel non si rileva nessun pulsante premuto,
caso che questa fornisca una risposta la routrne fornisce il codice OxBO.
Organigramma
affermativa, e cioè che è stato premuto u nciato proposto
del l' en
L'altra routrne si assicura che sia
un tasto, si fara una chiamata a un'altra stato premuto solamente un pulsante.
Questo e necessario perche nel tempo
in cui noi premramo una volta il pulsan-
tratta di verificare il corretto collegamento della tastiera.
Si
Per questo ogni volta che si preme un pulsante si genera un bip tramite un cicalino piezoelettilco.
te, il programma riesce ad esplorare
diverse volte la tastiera, rilevando quin-
di diverse volte il pulsante premuto, e
Enunciato per la orova della tastiera.
questo potrebbe generare degli errori.

Swff*wswerw
; Blocco delle etichette

CBLOCK KEY VAR ; Inizio delle variabili


TASTO
KEY_I
KEY_2
KEY-DELAY_I
KEY_DELAY_2
,I
TEMP
ENDC

; Routine di scansione della tastiera

KEY SCAN bsf STATUS,RPO ; Passo al banco 1

movlw b'00001 I t1'


movwf PORTAS ; R84-R87 uscite, RB0-RB3 ingresi
bsf TMR0,0PT-7 ; Attiva pull-up interni
bcf STATUS,RPO ; Torno al banco 0
movlw
movwf KEY_1 ; N' delle file da esplorare
m0vtw b'0't111111'
movwf TASTO ; Fila da attivare
KEY SCAN 1 movf TASTO,W
movwf PORTAB ;Attiva fila
,:::,1:,a n0p
:t:ì:r::
movf PORTAB,W
movwf KEY-2
:.:,l:ììil subwf TASTO,W ; Legge le colonne
aaì:,ìr'
btfss 5TATU5,Z ; Qualche pukante attivo?
:tìtì:ì;,1
goto KEY_sCAN 2 ;5ì
bsf 5TATU5,C ; No, non c'è niente in questa fila
-1.1::r:::
rrf TASTO,T ; Seleziona la fila successiva
decfsz KEY,1,F ; Salta se sono terminate le file
goto KEY_5CAN.1
MOVIW 0x80
goto TORNARE ; Restituisci il codice 0x80 (nesun puhante attivo)

KEY_SCAN_2 MOVIW .100 ; Ciclo di temporizzazione di 20ms


movwf KEY_DEtAY-1 ; per evitare i rimbalzi del pulsante
KEY SCAN-3 clrf KEY DETAY_2
clrwdt
KEY SCAN 4 decfsz KEY_DELAY_2,F

90î0 KEY_SCAN-4
decfsz KEY_DELAY_1,F
g0r0 KEY_5CAN,3
movf TASTO,W ; Dopo la temporizzazlone si legge nuovamente
movwf PORTAB ; se il tasto è lo stesso. Così si
n0p ; evitano i rimbalzi
movf PORfAB,W
subv'rf KEY_2,W
la,

:ìi:]: btfss STATUS,Z ; E' lo stesso?


:tì:: goto KEY_SCAN_I ; No, prosegui con l'esplorazione
:ri:j.
movf KEY_2,W ; 5i scrive nella variabile di uscita TAST0
a,
; il valore trovato
TORNARE mow'rf TASTO
retufn ; Fine dell'esplorazione

; Routine che attende che il tafo sia rilasciato

KEY_OTF movf TASTO,W


:,1t. movwf TEMP_I ; Memorizza prowisoriamente il valore del tasto
KEY OIF NO ; Verifica che sia rilasriato
:.!a,.
call KEY_5CAN
:ìiìl:
movlw 0x80 ; Codice di nessun pulsante attivo
subwf TASTO,W
ììì:i:
btfss 5TATU5,Z ; Salta se il tasto è stato rilasciato
g0r0 KEY_OIF NO
movf TEMP-1,W
movwf TASTO ; 5i riprende il tasio
relurn

Rouline di Lralbmento della tastiera

Sw${*x*rm:;re*
LIST P--16F844 ; Definizione del processore

5TATU5 EQU 03 ; Definizione delle variabili


PORTAA EQU 05
PORTAB EQU 06
TMRO,OPT EQU 01
INTCON TQU OB
W EQU 0
F IQU I
z EQU I
c EQU 0
RPO EQU
c0Nt EQU 0c
KEY_VAR EQU OD ; Variabili della tastiera

ORG 0
g0r0 tNtzt0

; Programma principale

INCLUDE "TASTIERA.INC" ; lnserisci il file di trattamento della tafiera


tNtzt0 bsf STATUS,RPO
clrf PORTAA ; Porta A come uscita
m0vtw b'000001 t1' ;Configura OPTION per il TMR0
movwf TMRO_OPT
bd 5TATUS,RPO

bcf PORTAA,O ; Disattiva il cicalino

NO TASTO call KEY_SCAN ; Esegui una scansione della tastiera


MOVIW 0x80
subwf TASTO,W ; 5i compara TAST0 con il valore 80 (nessuna puhazione)
btfsc STATUS,Z
goto NO_TA5TO ; Non è stato premuto nessun tasto
call KIY OTF ; Si, è stato premuto, Si attende il rilascio
bsf PORTAA,O ; 5i attiva il cicalino
call RITARDO ; 5i mantiene attivo per 1 secondo
bcf PORTAA,O ; 5i disattiva il cicalino
goto NO,TASTO ; Si ricominria il ciclo

RITARDO movlw d'15' ; Ciclo eferno rhe si ripeterà 15 volte


movwf CONT
crcL0l movlw 00 ; Inizializzazione del ciclo interno
movwf TMRO_OPT
ctcL02 btfss INTCON,2 ; Ha finito di contare?
goto CICLO2 ; No, continua il ciclo interno
bcf rNTC0N,2 ; 5ì, resetta il flag
decfsz c0Nll ; Decrementa il contatore del ciclo esterno
g0î0 clct0l ; Dato che non è 0, torna a ripetere il ciclo interno
return ; ll contatore esterno è a 0. exi dalla routine

rl
Programma completo dell'enunciato proposto :)

[-..-,-:""11],: ..-. .""." d e


r': i"- -" ' .t,'':': ,." }*L Port:ntn nér
ll programma, una volta incluso nel nuovo file della ,,^"i+i--"^ ^, , -^
vqr ilrLorc Iucrr-
tastiera, risulta molto semplice. Dopo aver conf igurato IO VTSIO, Vr SU9-
nar ,l'rr<n dol rirslina o il Tl\/lRO
l: nnrt: .A. r,, ,_, .,
<i esptora ta gcr rorru ur .^-
^^";-*^:; rcd-
tastiera. e nel caso si rileiii rrn nrrlsanîe nrpmrt[o si attr- lizzare il mon-
ri: il ric:linn nor rn sornndn ner noi snponorln Si rinp-
|'--',r-' t:anin nprtrq-
rp il nrorpsso rn modo infintto. sario sopra una
Y-' Y'"
\r hpma r omnlpto elFll cserctzta

,-,t"1," .,r- IOUpr, O SU Una


Nel caso della tastiera non possiamo realizzare una .-h^^.
)LLtCUd ,,^i,,^"
Ut tivct-
simulazione tramite MPLAB, dato che non esiste nes- 5dre. llll plogldmnld
-.1^ -i .+^.- d
vl arJre'd
^"^^..-*-,,i -,,^"i{i--"^ -L^ Lre connes-
ver ilrLdre cile
cr rn dicnncitivn di inoroccn rhp < nn<c: rnnfinrrr:ro sìoni siano realizzale correttamente, dato che il cicalino
corle si farebbe co1 Lna rastiera, assoc;ata a due linee. sJonera premendo qualsiasi pulsante.

$****wssser
Direttive

lcune le abbiamo già viste, dato che ne versioni precedenti dei compilatori di Microchip, e per
abbiamo avuto bisogno nei programmi che rendere compatibili i programmi realizzati da diversi
abbramo realizzalo, però ora le tratteremo utenti.
in modo approfondito, vedendo sino a che ll compilatore MPASM fornisce cinque tipi di direttive:
punto oossono essere utili. . Direttive di Controllo, che permettono l'assembla-
mento di frammenti di codice secondo determinate
fl#rdeffiYYs ffis mxffisTYxw& condizioni.
Una direttiva è un comando assembler che si inserisce . Direttive di Dati, che controllano il posizionamen-
nel codice sorgente del programma, però non viene tra- to dei dati nella memoria e danno la possibilità di rife-
dotto in codice macchina dal compilatore. Si utilizza per rirsi ad essi con nomi significativi.
diversi scopi, in relazione al posizionamento delle varia- . Direttive di Listato, che servono per configurare la
bili, e al controllo degli ingressi e delle uscite nell'as- forma in cui si presenterà il file assembler: titoli, impa-
semblato. La maggioranza delle direttive ha diversi grnazrone, ecc.
nomi e formati, per preservare la compatibilità con Ie r Direttive di Macro, che controllano l'esecuzione e

Le direttive
non vengono
tradotte in
codice macchina
quando si
assemDE
un programma.

Sw#*wwsw
ii posizionamento dei dati quando si utilizzano macro
nella programmazione.
o Direttive di File Object, che si utilizzano quando si

vuole creare un file object.

u$# ffifi1Lffi #X$qflX-rxwffi


Nella maggioranza dei casi i programmatori devono
ultlizzare sempre le stesse direttive, dato che sono
molto specifiche quelle dei dati e delle macro, e solo in
presenza di situazioni speciali, come ad esempio se si
vuole stampare il Iistato di un file con dimensioni diffe-
renti dallo standard, si prova a trovare una soluzione
con l'uso di altre direttive. Anche se ìn seguito non le
utilizzeremo, conviene fare un ripasso di tutte le diret-
Esempio di un programma
tive esistenti, per questo le presentiamo nella tabella
che utilizza diverse direttive meno frequentr
con una breve descrizione oer oqnuna.

CODE
CONFIG

una catena di caratteri

unl
rUn

.DW

ruq0

!itìeevuote._
un sottotitolo di un Ulqgfarn0l
un titolo di un programma
di sostituzione
se la condizione è vera

Tabella di alcune direttive fornite dal MPASM

$m#*wwrm :rrla:
aaara
Applicazione pratica:
visualizzanone dei dati tramite LCD

l- +--+ì^.- I- ^i,
orTre rd rdsrera e^ ra ptu co- gliamo lavorare riceve I'informa-
,
^*^

m I rna ir)
rrrurru rru lo noriforirho
rL Ài
tg ut zione tramile 14 pin, otto dei
PLtilLttLt
inoresso nei nrooelti con qr:ali ricevono i dati o i codici di
microcontrollel il display a controllo (D0/D7), a seconda del
crsrailr ilqurot LLt-J e il ptu momento, tre sono incaricati di
comune tra le periferiche di uscita. controllare il funzronamento del
Come utenti lo potremo trovare modulo (RS, R/W#. E), e i tre ri-
sempre piu spesso sui dispositivi manenti sono per l'alimentazione
commerciali, come ad esempio, (Vss, Vdd) e il contrasto (V0).
macchine distributrici di prodotti. Quando il display LCD e collegato
Quindi, non vi piacerebbe imparare a un PIC 16t84,le linee dei dati di
Collegamenti di un LCD da 2xl 6 caratteri
a programmarli per fornire messaggi solito corrispondono con la porta
del tipo " introdurre l'importo", B e le tre di controllo con le linee
"puo passare", ecc.? Questa e la nostra proposta. meno sionificative dell,e nnrt: A R^n-R47. Le linee
dei dati dovranno essere bidirezionali, cioè a votre tn-
- ;.. r ':,3h.
/ a d'd *,qf' S'9f-F*?f f fi?1
Hhffi{}kHÀ;",\ .H . ?<*, " e!
" :!?
u}L;...ì nressi p a volle rrsrile dato rhpIL nlestn tr neCeSSaf iO
L
YULJLV I

Un LCD e un dispositivo molto potente, flessibile e faci- per passare dati all'LCD o per ricevere informazioni
le da gestire. E capace di rappresertare lettere, numeri sul suo stato interno. Le linee di controllo si confiqu-
e altri caratteri ASCll, o simboli specifici programmati rano come uscite.

DB2 DBt DBo Tempo.di


-o'- -'d-----1
e5ecuzrÒRè
-: i,?;A;;
o I x i 1,64ms
I l/D S i 40ms
D C B i 40ms
R,/L X X i 40ms

OlDLNFXX
'I INDIRIZZI DELLA CGRAM

Display LCD modello WM-CI 602M


della ditta WINTEK. FIAG O O j
. READ BUSY ] BF INDIRIZZI DELLA CGRAM O DDRAM 40 ms
S ADDRESS
jWRÌTiDATATO i 0 0 l, CODICE ASCII PER LA RAM
dall'rrtente trtto nrresto in Uno
CGODD
READ DATA TO O O I CODICE MEMORIZZATO NEILA RAM
<n:zin uu
)vuLtvt :d ocomnin f lrllcu
r'.li z
!r!rrrprv, ul l;n^^ pcl
^^" CGODD
'16 * 5: Se uoiei. sposlo lo visuolizzozione ogni vohoche sl scrive un doto. Se vole O, funziona in modo
colonne, a seconda del modello. normole. * l/D: Se vole I, sí incremento l'indirizzo del cursore; se vole 0. si decremento. * S/(: Se
ll modulo LCD contiene un micro- vole 1, sposfo lo visuolizzozione. se voie 0, sposla il cursore. * R/L; Se vole l, lo sposfomenfo è o
desfro; se vole 0, o sinistro.' BF: Se vole I, il nodulo LCD è occupoto: se vole O, è disponibiie. * DL:
rnntrnllpr rhc nc<ti<rq il suo fun- Se vole l, si lovoro con 6us dei doti o I bit: se vole 0, con bus o 4 bit. * N: Se vole l, /o
zionamento e ha il compito di tra- presenfozione si fo in due linee: se vole 0, in uno. * F; Se vole I , il corottere è di 5 x t O pixel; se vole
O, di 5 x 7.'B: Se vole l,lonpeggio íl cursore (se è ONi. * e; Se vole I il cursore è ottivo /ON./.'
durre i comandi mandati tramrte il D: Se vole l, ìl disploy è offivo. * X: lndeterminoto.
programma in ordini compresi dal
Tabella dei codici di controllo del display LCD
display. ll display LCD con cui vo-

Sw$*'E*swryry
|r|NÌNrl|''ffiHll::.:.:.)):..........tt t \\iùrraj,
A seconda della combinazione dei dati delle linee dì che, oltre alla dichiarazione delle variabili, abbiamo in-
controllo, l'LCD capira se deve rappresentare un caratte- trodotto le dichiarazioni di etichetta mediante ìa diret-
re, cambiare la posizione del cursore (che gli si doman- tiva " #def ine " .

da se ha finito con quello che sta facendo)


#define ENABLE bsf PORTA,2 ; Attiva seqnale E
ecc. Combinando tutte le opzioni si possono #deiine DISABLE bcf PORTA.2 ì Disattivaieonale E
bsf i Pone LCD in-Modo RD
ottenere effetti come il lampeggiamento dei #define
#define
TEGGERE
SCRIVERE bcf
P0RTA;1
P0RTA,1 : Pone LCD in Modo WR
caratterì rappresentati, l'apparizione e spari- #define OFF COMANDO bcf P0RTA,0 : Disattiva R5 (modo comando)
fdefine ON_(OMANDO bsf PORTA,0 ; Attiva RS (modo dato)
zione dei caratteri dai lati del display, la rap-
cBt0cK Lcd var lnizio delle variabili. Sarà il orimo
presentazione di figure in movimento ecc. Lcd-Temp I indirizzo disponibile
kd_Temb_2
ENDC

tr$ffitrF9# *g 16.$&*xg*ru&ffi fi ruF* UP_TCD bsf STATUS,RPO ; Banco 1

clrf i RB<0-7> uscite diqitali


Il primo passo da fare quando si sta comin- clrf
PORTB
PORTA I Porta A uscita
ciando ad acquisire un nuovo linguaggio di bcf STATUS,RPO ; Banco 0
OFT COMANDO ; R5=0
programmazione, e generare un messaggio DISABLE i E=0
relurn
che dica "N/ONTY". Fino ad ora non aveva-
LCD BUSY LIGGERE
bt STATUS,RPO
m0vtw h'tt'
mowvf PORTB
5i vuole verificare il funzionamento del display bcf STATUS.RPO
ENABLE
LCD. Per questo si scriverà il messaggio "M0NTY". n0p
LCD BUSY 1 btfsc PORTB,T
qoto tCD_BU5Y_I
DISABLE Disabilita LCD
Enunciato dell'esempio di funzionamento dell'LCD bsf STATUS,RPO
clrf PORTB Porta B uscita
bcf STAIUS,RPO
Pone LCD in Modo WR
mo questa possibilita, dato che l'unica pe- SCRIVERE
return
rif erica ner rannresentare numeri e lettere
LCD-E ENABLE Attiva I
era il display a 7 segmenti, anche se in mo- n0p
DISABLE Disattiva E
do abbastanza limitato. ll display LCD ci movlw .14
,-J--ì movwf Lcd Temo I
udrd ^,,^-+î
r-1uc)Lo uv- LCD_E_1 decfsz kd_Temb_1,F ; Perde 40 us per la costante di
portunità in modo g0J0 LCDEl i tempo Tc dei nuovi moduli LCD di
€onfigurozione retufn iWintek
rcD rnmndn o <omnli-
LCD DA]O OFF COMANDO Disattiva RS (modo comando)
.ó l-nmo
sv, |,v nnccir-
HvJJs
movwf PORTB Valore ASCll da mettere sulla P0RTB
call LCD_BU5Y Asoetta che si liberi LCD
lniziolizzo LCD mo osservare, l'or- ON-COMANDO Attiva RS (modo dato)
goto LCD_E Genera impulso di E
ganrgramma è
LCD_REG OFF COMANDO Disattiva R5 (modo comando)
<omnliro Nlni dn- movwf PORTB Codice di comando
Scrivi call LCD BUSY LCD libero?
vremo solo inviare g0r0 LCD_E 5ì. Genera imouko di E
"MONTY"
su L€D i dati all'LCD e ìn- tCD INI movlw b'00111000'
dicare dove met- call LCD REG
call LCD_DELAY
arganigramma terli, e lur si incari- m0vtw b'001 f 1000'
dell'enunciato dato call tCD REG Codice di istruzione
cherà del resto. call LCD_DELAY Temporizza
MOVIW b'00-i f 1000'
call ICD REG Codice di istruzione
*-$: &t*YgruffiS #g **ruFtr#È-*-* call
movlw
LCD_DELAY
b'00000001'
TemDorizza
Cancella [CD e Home.
*Hà-g,-"Lf,* call LCD_REG
feturn
Così come rl modulo della tastiera, il display
LCD ha bisogno di una serie di routines che
LCD
-DELAY drwdt
movlw .10
movwf Lcd Temp 1
di solito vengono incluse come file indipen- clrf kd-Temb-2
LCD_DEIAY_I decfsz Lcd_Temb_2,t
denti del programma principale. Oltre a in- qoto tCD DETAY 1
cludere i file dovremo dichiarare le variabili decfsz
goto
Lcd,Temp_[F
LCD DELAY I
che verranno utilizzate, tenendo sempre return
rnnin rho lo nn<izinni,, non srano gla occu-
Routine di trattamento dell'LCD
pate da altri file. Notate nella tavola a lato

Sw#*weww*
UP_LCD: Configurazione delle linee del PIC per LCD
ICD,BUSY Lettura del Flag Busy e indirizzo
LCD_E: lmpuho di tnable. Nei nuovi LCD questo segnale deve stare a "0",45 m5 prima di tornare ad essere attivato a "1"
LCD_DATO: Soittura dei dati in DDRAM o CGRAM. lnvia dato presente in W
LCD.RIG: Scrittura dei comandi dell'LCD. Invia il comando presente in W
LCD_INI: lnizializzazione dell'LCD inviando il tomando "Function Set" 3 volte consecutive con un intervallo di 5 m5. ICD rimane
cancellato e il cursore nella prima posizione
tCD DEIAY Routine di temporizzazione di 5 m5. 5i utilizzano le variabili Lcd_Temp_1 e LCD_Temp_2 al posto del TMR0.
Questo rimane libero per le applicazioni dell'utente.

Significato delle routines dell' LCD

Ogni volta che si utilizza, si fa corrispondere all'e- prendere una frase completa, invece di dare ordini per
tichetta che segue il valore successivo. Così ad esem- il posizionamento del cursore per ogni lettera in modo
pio, dopo questo #define, ogni volta che nel pro- individuale, abbiamo realizzalo un ciclo che percorre la
gramma si scrive "ENABLE", è come se si ponesse tabella dei dati e ce li mostra.
"bsf PORTA,2". Questo avvicina un po' di piu l'as- Questo ciclo e implementato come routine (MENS)
sembler ai linguaggi di alto livello. Nella tabella alle- e necessita, come parametro, dell'indirrzzo della catena
gata troviamo diverse routines implementate e le loro che si vuole visualizzare.
funzioni. insieme al modo di utilizzarle. Le più impor-
tanti sono: UP_LCD, LCD,lNl, LCD_REG, e LCD_DA- Fffi#V&
TO. Queste si richiamano alle altre per il loro funzio- ll montaggio per la verifica di questo esercizio e mo-
namento, pero non e piu necessario che lo faccia an- strato in figura, e segue la configurazione tipica usa-
che l'utente nelle sue aoolicazioni. ta per la maggior parte da ditte che utilizzano modu-
li che integrano un display tCD. N/PLAB non dispone
pffi*#ffie$4 f4& FffigFd fl atr&E_fr di risorse per simulare rl funzionamento di questo tipo
Nel programma, per prima cosa bisogna configurare il di periferiche.
PIC per l'uso della tastiera: e questo
va fatto ognivolta che lavoriamo con
il disnlav dato che e
,, v,JY'vlt normale che
condivida le linee con le altre perife-
riche e chp orresfe le rttilizzino in un
altro modo. In seguito dovremo ini-
zializzare l'LCD. Questo processo è
necessario solo la prima volta che si
ulilizza un LCD nel programma. Do-
po aver iniziato a mandare ordini o
À1+i
uCtl îll'l LLUr
Oll r'-n lr ^r^.^4trr:
ld PlULCtru'u L
qomnro
ò JLrrrprL
uguale. Quando si tratta di un ordi-
ne, si deve introdurre il codice di
controllo in W e chiamare la routine
LCD_REG, mentre se si tratta di un '^ t lfll--
dato si mefterà nrrest'gl{jppo in W e '5
fr+sv +I'u'l +
si chiamerà LCD_DATO. I comandi
piu utilizzati, come ad esempio can- -2rÈL?,EL
cella LCD e porta il cursore alla prima
posizione, saranno introdotti a loro
volta in una subroutine, pero inter-
namente faranno la stessa cosa. Nel
Sch ema co m p eto d el l' esercizt o
nostro caso, dato che vogliamo I

$w$*.wwy*
LIST p=l5F84A ; Tipo di processore
INCLUDE P16F84A.|NC ; Definizione dei registri interni
. ,.,::::::.1

var
Lcd EQU 0x20 ; Inizio delle variabili delle routine LCD .:.t
Delay-var EQU 0x22 ; Variabili temporali per la temporizzazione

:.:.::'':
',2
ORG 0x00 ; Vectot di Reset . r::ì::l::
goto lnizio :.,.::::ì

ORG 0x05 ; Salva il Vector di interrupt


'::':aa.,a;.
: .t::t
a::,::,:aa

INCLUDI
a

LCD_CXX.INC ; lnclude le routine di gestione dell'LCD ,,,,:,:.it


:,.:::.:.a:a.a.a

;;;,::t::1

Delay sleep ;Temporizza 36,4 ms sino a che il WDT vada in overflow


decfsz Delay-var,F ; È fato ripetuto il numero di volte desidetato?
goto Delay ; No. Attendi altri 18 ms :::a,:,

return
..:.t::,.1

;Programma principale ..t.:a:ì::

: a: .':l::

lnizio CITÎ PORTB ; Cancella i latch di uscita


clrf PORTA ; Cancella i latth di uscita . :..4::a::,

bsf SIATUS,RP0 ; Seleziona il banco 1


clrf TRISB ; Porta B configurata come uscita .:.,:::.a.4
drf TRISA ; Porta A configurata come uscita
: a.:::a,a,,.

':;11,.:.
MOVIW b'0000r001' ": a'::t:a

mowvf REG
OPTION ; Prescaler di 2 al WDT
::i::
bcf STATUS,RP0 ; Seleziona il banco 0
.

call UP-LCD ; Configura la porta per LCD


call LCD-INI ; Inizializza LCD
m0vlw b'00001'100'
call LCD_REG ; LCD 0N cursore e btink OFF

L00p chwdt ; Resetta il WDT


m0vlw 0x86
call ICD_REG
,M,
; Pone il cursore nella 7" posizione
m0vlw
call LCD_DATO
,0,
; Visualizza "M"
MOVIW
call LCD_DATO ; Visualizza "0"
movlw 'It'
call LCD_DAT0
,T,
; Visualizza "N"
movlw
call LCD_DATO ; Visualizza "T"
m0vlw
call LCD DATO ; Visualizza "Y"

movlw .28
movwf Delay,var
call Delay ;Temporizza '1"

movlw b'00000001'
call LCD_REG ; Cancella il display
movlw ,zo
movwf Delay var
call Delay ; Temporizza 1"
g0r0 Ioop

END ; tine del programma

Prog ra m m a com pl eto d el l' en u n ciato proposto

Sg*Ssss.-wryw ,,:iì
..:'::j:
&
Strumenti di lavoro:
M
caratteristi ch e avanzate
ffi
ffi di MPLAB (r)
m'
uando abbiamo presenta-
ffi to MPLAB, accennammo
al fatto che era un
ffii ambiente di sviluppo per il

I lavoro integrato con i PlC,


dato che con lo stesso programma si
nossono realizzare îrrtte le funzioni
ffi.
ffit" necessarie allo sviluppo di un proget-
to, anche se alcune di esse necessita-
ffi no di un hardware specifico.
Ora vediamo le caratteristiche più
ffi, interessanti di due dr questi moduli
addizionali, accessibili tramite
MPLAB.
w
fl

ffi
ffi: - Per lavorare con l'emulatore dovremo
;: cambiare I'ambiente di sviluppo.
fud--

ffi Èiffiffi # $-rW#ffi#


gt\ {trffifl {JXT# pXifbtASTKffi
H.
ffi'.. Un emulatore è uno strumento
L--J...^-^ -r^tc >ctvc
-^-..^ nor
Itdtuvvdtc Lt r,. mAftoro :
punto programmi che funzionano
ffi, LUI I lC )C ci
)l c+nccnrn
)LC))ClU o<onrrondn
LJLVULT ruv in
il |

r
tempo reale. MPLAB dispone di stru-
menti software per poter ulilizzare,fra
gli altri, l'emulatore PICMASTER. Un

r emulatore si accomuna e si differenzia


dal simulatore e daìla applicazione
$M',. reale in dìverse cose:
ffi. . L'emulatore contiene linee di
Fotog raf i a del I' em uI atore Pl CM ASTE R
innro<cn/r rcrit: o di<nnciti\ti r6,o
ffi" r v'JYvJ' \' v t,

ry
ffiw$#wmss*
,:taetlít gtfr$rtt:|1|l:at,'\1,:tai:*tì\ìììjìì!s!]ì!ij:ii:rilffitlutìu
t.
:r:::::::::
. La velocità di esecuzione dell'emulatore e la risoo-
sta aglistimoli esterni, o eventi interni, è in tempo reale.
PICSTART ptus r ll vantaggio di utilizzare un emulatore rispetto al
Fffi.ffiffif r grtG*re
circuito reale, e che il primo puo mostrare cio cle acca-
de all'interno del microcontroller in tempo reale; serve
per mettere a punto il programma, potendo inoltre
attivare dispositivi come un oscilloscopio a tale scopo.
r I a "testa di nrova" dell'emulatore è intercambia-
bile a seconda del PIC da emulare, e si introduce nello
zoccolo destinato al microcontroller come si farebbe
con un PIC normale. Le linee addizionali che l'emulato-
re porta all'esterno, si possono collegare alle periferi-
che, per vedere il valore di determinate linee, o per l'in-
troduzione di eventi esterni. Sarà necessario configura-
re il PIC-N/ASTER seguendo le specifiche del fabbrican-
te, che dipendono dal microcontroller da emulare.
Bisognerà cambiare anche l'ambiente di sviluppo come
già abbiamo fatto iniziando a simulare i programmi,
configurare le porte, il clock, ecc. Per sapere se I'emu-
latore funziona in modo adeguato, possiamo fare una
prova nell'opzione Tools>Verify PICMASTER.

PICSTART Plus per la scrittura g-# sfiffig"cY#ffiffi pxil$Y&ffiY g3L&is


dei microcontroller.
Un altro hardware molto interessante, che si può anche
gestire tramite N/PLAB, è lo scrittore PICSTART Plus.
hanno la stessa f unzionalità del processore reale, men- Dopo le fasi di simulazione ed emulazione arriva il
tre il simulatore è un modello lrmitato delle caratteristi- momento di provare l'applicazione sull'hardware reale
che del microcontroller. e fra le molteplici offerte del mercato, esiste la possibi-
lità di utilizzare lo scrittore che offre
N,4irrnrhin
"v'H"'
F noncatn nor o<<oro rrti-
lizzaf.o con prototipi o piccole serie,
dato che per grandi produzioni, la
programmazione "in circuit" è più
comoda. ll PICSTART Plus si collega
al computer con un'interfaccia
<ori:lo nor
P-' nn+ar riratraro il nrn-
gramma tramrte lo stesso ambrente
di sviluppo.
. Nello stesso modo è possibile leg-
gere l'informazione contenuta in un
microcontroller non protetto per met-
terlo a punto, modificarlo o copiarne
il codice. Dopo aver installato il dispo-
sitivo dovremo sceglrere rl program-
matore da utilizzare. Nella barra dei
menù ne apparirà uno nuovo per il
lavoro con il PICSTART Plus che per-
moftorÀ rli <rrivoro lonnoro a.)n.Fta-
Dovremo scegliere il programmatore da utilizzare
re i microcontroller.

Sw$#effiwww
Appti cazione pratica:
un programma completo
giunto il momento di
mettere in pratica in un
unico programma tutto
cio che abbiamo impara-
to. Uniremo l'introduzio-
ne dei dati tramite la tastiera, con
la visualtzzazione deg i stessi trami-
te LCD e con le altre semPlici Pert-
feriche che saranno necessarie. Per
quanto riguarda le subroutines ab-
biamo cercato un'applicazione in
cui ìa loro utilizzazione non solo ab-
bia senso, ma sia indispensabile per
un buon funzionamento.

5i vuole controllare l'accesso ad un recinto.


Per fare questo disponiamo di una tastiera,
in cui, dopo aver premuto il pulsante "4"
di "accesso", si dovrà introdune un codice
formato da quattro digit. Se il codice Schema elettrico dell'eserozio proposto
è conetto si attiverà un relè per due secondi,
il quale simulerà l'apertura di una porta.
5i daranno tre opportunità per l'introduzione s{#ilffie #ffiffi&rusffiK&F€ffie
del codice. Questo sarà memorizzato
tr{-ilT?KA** Come possiamo osservare dall'organigramma esposto,
nella EEPR0M, e potrà essere tambiato
con un oulsante della tastiera "C" di'tambio". Leggendo l'e- il programma non è così semplice come quelli visti fi-
Un cicalino piezoelettrico emetterà un "beep" nunciato dell'e- nora. Cìò è dovuto al fatto che sono contemplati di-
premendo ogni pulsante. Un display LCD,
<orrizio p nnssi- versi casi, e che in quaìsiasi momento è permessa l'op-
da parte sua, genererà mesaggi
che guideranno l'utente nel suo compito. bile che abbiate zione di cancellazione. Per arrivare a questo organi-
non(:tn "o dnvo gramma prima abbiamo dovuto pensare molto bene
nci ato del I' eser< izi o p roposlo
E n u
lr trovo io così alle opzioni permesse, e fare un primo organigramma
tanti piedini?" ln più semplice per complicarlo successivamente con l'in-
effetti se contiamo il numero degli ingressi/uscite delle troduzione delle eccezioni. Quindi all'inizio è normale
periferiche da ulilizzare, ci sembrera che quelle offerte pensare ad un codice di un solo digit, non permettere
dal nostro piccolo PIC'16F84 non siano sufficienti. ln più di un errore, e supporre che la EEPROM abbia sem-
ogni caso grazie alle caratteristiche proprie dell'LCD e pre un valore memorizzalo, ecc. In ogni caso, a di-
della tastiera, avremo otto linee che si utilizzeranno a spetto della dimensione dell'organigramma, notate
volte come ingressi a volte come uscite, in altre parole che sono state rispettate le regole della struttura, e
saranno condivise da entrambe le periferiche. Per fare non cisono diversi puntidifine, ingressia metà difun-
in modo che questo sia possibile, il programma dovra zione, ecc. Per questa ragione la traduzione in pro-
configurare queste lrnee a seconda delle periferìche da gramma assembler non dovrebbe comportare alcun
uliltzzare in quel determinato momento. problema.

ffiw$wwsexres
pgq#s$q&P"'gÍ1,?-q
ConliguÉrione ICD M3, U4

Questo programma risulta molto lungo.


Inoltre notate che si parte da cio che si co-
D;i.onnenèF elè c.i.olirc
nosce e si hanno a disposizione tre file, di
l€99eré ts3i&.e EIPROM cui due contengono le routines per il tratta-
mento della tastiera e dell'LCD, ilterzo con-
È!frli'2.r.? O
tiene la definizione dei registri del PlC. Di
questi abbiamo già parlato in precedenza.
vúudr4oÉ mènur
- (AltuètuÉ
{cJ c;mbio.hidvè
La prima cosa che appare nel program-
*ordh toifierc
ma dopo la configurazione delle variabili,
sono i messaggi che devono apparire sul-
'* ui pukd^t.? l'LCD Tutti i messaggi sono raggruppati in
a una tabella simile a quella utilizzata con il
CeneroE "baF" è orèndere,olb
display a sette segmenti, ma presenta la ca-
Èrobp,€Fdo O ratteristica di essere divisa in frammenti e
$ per accedere ad ognuno dei messaggi indi-
trò I ftb pEnuro hFr..onrabÉ i.rè:.o q 3
pendentemente, si assegna all'etichetta che
"4"1

O simbolizza il suo nome, il valore del PC in


vùuolL!. n€iù: {al coi.ellore rodnè? vÈ&lÈa nénù {cl co..e[o (dte? quella posizione. In questo modo, potremo
il.evè..dk€ Ri.ovè.di.è cambiare il testo dei messaggi o posizionar-
lo da un'altra parte del codice, senza che in-
O
Èshbp,.énub
.X,'f" o fluenzi il programma che lo sta chiamando.
r€ {p
Vèdfi.. ie è .oreh vérifi.. sé è.ordo
lnoltre si dovranno ulilizzare Ie routines di
lettura e scrittura della EEPROM per Iegge-
re e scrivere la chiave. ln questo program-
o O ma sono presentate in modo diverso da
vLlqlù&ménù:(C)coi..llcnuoyo(odté visu.li'ld,,puòFsdre"
come le abbiamo viste negli altri esercizi,
Rneve cdi.e
"':i$- B quindi allo stesso modo delle routines del-
Il'lL!y
f l-l E
a Utrrro
Ànllr +rc+i^...i
Ld)Lttrtd >t nntrohhorn
F_'' inqoriro
O È ftb p'end. a
in un file a parte. ll resto di domande e
&
vùuolirlo mènù: ((l Conello.!ilehd
Vi3u.lizo "A<€ss. rq.b',
funzioni, si segue a partire dall'organi-
gramma, che corrisponde con la parte
Rneve.odi.e
principale del programma.
Iniriolird.ontd.re interno
È lbro eEnú.
O
F9 Esempio di come apparrranno i messaggi

* oxl
tabella movwf P{l ;Spostamento Messag_l_l equ $

I sulta tabella reflw I'


Mesag 1 equ , retlw 'C'
rg
oK 2.
digir? retlw I' retlw )'
retlw 'A' reilw
a retlw Ì retlw 'C'
.
rry ox3' retlw retlw 'a'
digm
retlw '; fetlw 'm'
O retlw retlw 'b'

89
oK 4.
digil?
retlw
:!;
retlw 'i'
fetlw retlw
o retlw reflw
ffdorirro nqovo (di.e retlw
:i retlw 'C'
retlw
:ia
retlw 'l'
retlì/v retlw 'a'
retlw 0x00 retlw
retlw 'e'
O rg an ig ra m m a del l' eserci zio p ro posto retlw 0x00

$*p#*ws*e* !rlrllÍlrrrrrrrllf ilÍÍÍFlnr€ii!j;:;j:ffil::::1:l!,@\ìiuÌuuuiì;trlit!r!]!]!]iiiiìl|1ljl1']]@;uut!rl


P=16t844
.Tinn rli nrnra<<nro ,,-
. --
subwf N tasto,W
btîsc _z ; Qualche pulsante premuto?
0x11 goto N_tasto ;N0
diqit I (all UP-tCD ; Riconflgura LCD
0tqìI I movlw
OIqII J
dióit 4 ; Variabili per i digit del codice
call LCD DATO ; Visualizza il carattere -

diiem 1
calì KEY_oFF ; Genera Beep e aspetta che s! liberi
di tem z catl 0x0C
di,tem_3 subwf N tasto,W
di_tem 4 ; Variabili temporaìi per i digit btfsc z ; controlla se è il tasto c (Cancellare)
cont err ; Contatore di errori goto Si canc
(ont tasti ; Contatore tasti premuti g0t0 No canc
temp_1
temporali
Si_canc bsf temp 1,1 ; Attiva flag dì cancellazione
temp,2 ; Variabilì return
Delay_1
Delay_2
Delay_3 ; Variabili per la temporizzazione No can( bcf temp 1,1 ; Disattiva il Flag di cancelìazione
movf N_tasto,W
movwf INDF ; Scrivi il tasto nel buffer
INCLUDE "P16F84A.|NC" ; Definizione dei registri interni incf FSR,Í ; Posizione successiva del buffer
decfsz cont tasti,f ; Aggiorna contatore dei tasti
#DEFINE _z 5TATUS,2
STATUS,5
golo N_tasto ; Ripete il processo
#DEFINE return
#DEFINE rd EECONl,O
#DEFINE ,wr EECON,I,,I
:0kev: Verifica se il codice introdotto nel buffer coincide con quello della
#DEFINE wfen Etc0N'1,2
#DETINE ,eeif EECON,I,4 ; EEPROIM. In caso atfermativo il flag del cany va a 0 altrìmenti va a 1

ORG 0 ; Vector di inizio 0key bcf temp 1,0 ; Cancella il flag


9Oto lN!zt0 movlw 4
ORG 5 movwf cont tasti ; Numero di byte da verificare
movlw digit 1
tabella movwf PCL ; Spostamento sulla tabella movwf tSR ; Primo digit
Messag_1 equ $
drf EEADR ; Prima posizione della EEPR0M
"(A) Aoertura", 0x00
EE Read
DT
1_1 equ Okey 1 call ; Legge il byte della EEPROM
lvlessag b
DT "(C) Cambio todice", 0x00 mol4 EEDATA,W
Messag 2 equ an0tw 0x0F
DT "Codi(e", 0x00 subwf INDIW ; Lo compara con il buffer
Messag-2-1 equ btfss z ; Controlla 5e è uguale
DT "(C) Can(ellare", 0x00 bsl temp_1,0 ; No, attiva il flag di errore
Messag-3 equ $ incf EfADR,f ; Posizione successiva deila EEPROIV

4
DT "Nuovo Codice", 0x00
incf tsR,f ; Digit successivo
lvlessag equ
DT "Confermare", 0x00 decfsz (ont_tasti,f ; Ripete la verifìca
Messag 5 equ goto 0key-1
DT "Può Dassare", 0x00 return
Messaq 6
-Di equ
"Accesso negato", 0x00 ; EE .Read: Legge un byte della EEPROIV

INCLUDE "tastìera,inc'' tÈ Keao bt rpO ;Selezione del banco 1


INCLUDE "lcd-txx.int"
bsf _rd ;ordine di lettura
: Delav: Ouesta routine realizza una temporizzazione variabile, che dipende dal valore
bcf rpO ; Selezione del banco 0
; dell'ércúmulatore nel momento in cui sì legge.
; EEWRite: S(rive un bvte neìla EEPRONII

Delav movwf Delay 'l

Delal loop decfsz Delav 3,f EE Write bt ,rp0 ; Seleziona il banco 1


ooto Delav loop bsf wren ; Permesso di scrittura
úecfsz Delai 2,f movlw 0x55
ooto Delav loop
movwf EECON2
decfsz Delai l,f
goto Delay_loop
movlw
movwf
0xAA
EECON2 ; Sequenza secondo Microchip
return
bsf ;Ordine di scrittura
; lVlessaggio: Questa routine porta nell'LCD il messaggio il cui inizio è inditato bcf wren ; Blocca ulteriori scritture
: nelì'a(cumulatore btfss _eeif ; Verifica la fine della scrittula
goto Wait
lVlessaqqio movwf temp I ; Salva posizione della tabella bcf ; Resetta flag di {ine scrittura
Nessallio 1
movf temb l,W ; Recupera posizione della tabella bcf ; Seleziona il banco 0
cal I tabella ; Chiama carattere dì uscita -rp0
movwf temp 2 ; lMemorizza il valore deìla tabella
UP_LCD
movf temo 2,f
btfss z ; Guarda se è l'ultimo call LCD_lNl ; Inizializza LCD

goto No ultimo call DISPLAY-ON-CUR OFF

feturn
No_ultimo call LCD_DATo ; Visualizza sull'LCD movlw b'00011000'
incf temp 1,f ; Carattere seguentÉ movwf PORTA ; Scollega relè e cicalino
goto l\4essaggio.1 ; Ripete (on il carattere su((essivo
clrf EEADR ; Posizione iniziale della EEPROM
; Controllo: Attende che siano p,emuti i quattro digit del codice, li memorizza
EE Read
talo permette di cancellare call ; Legge byte dalla EEPRoM
; in digit_1 .. diqit 4 e visualizza sulI'LCD. ll C
movlw 0xff
-4 subwf EEDATA,W
Controllo movlw
movwf cont tastì ; Inìzializza contatore btfss z ; Verifica se è utilizzato
m0vtw digit-1 goto 5i usata
movwf F5R ; Punta all'inizio del buffer della tastiera
N tasto call KEY SCAN ; Esplora Ia tastiera : Carica nella EEPROM il codice 1234 per default
movlw 0x80

Programma r60lto
;:li.:,

No usata clri EEDATA movf drgit_1,W


movlw 4 ; Numero di byte da scrivere subwf di-tem 1,W ; Verifica il 1" digit
movwf temp_1 btfss Uguale?
No_usata_I incf EEDATA,f ; Codice da scrivere goto Si-usata No
cail EE Write ; Scrivi dato
incf EEADR,f movf dìgit_2,W
decfsz temp-1,f subwf di tem 2,W
9ot0 No usata_1 btfss
gor0 5i usata
Si_usata (4il LCD_lNl ; Inizializza ICD
movlw Messag_1 ;Offset del messaggio 1
movf digit-3,W
call Messaggio subwf di tem_3,W ; Verifica il 3" diqit
; Visualizza "(A) Apertura"
btfss ; Uguale?
m0vtw 0xC0
goto ai-usata
call LCD_REG ; Regola posizione del messaggio
;No
movlw Messag-l 'l ;offset del messaggio 1,1 movf digit_4,W
cail Messaggio ; Visualizza "(C) Cambio Codice" subwf di-tem 4,W ; Verifica il 4' diqit
No tast call KEY SCAN ; Esplora la tastiera btfss ; Uguale?
m0vtw 0x80 goto ii,usata ;No
subwf N tasto,W
btf5c _z ; C'è il tasto ; Scrive nella E!PROM il nuovo codite
goro No_tast
call KEY OtF ; Genera beep e attende che si liberi movlw
m0vtw 0xoA movwf cont tasti ; Numero di byte da scrivere
subwf N_tasto,W movlw digit_1
btfsc _z i E' il tasto A (Apertura)? movwf FSR ; Indire dei digit
g0r0 5i A drf EEADR ; Prima posizrone della EEPRoIVI
movlw 0x0C Altro digit movf INDF,W
subwf N_tasto,W movwf EEDATA
btfss z i E'il tasto C (Cambio codice)? call EE_Write ; Saive nella !EPROM
goto No tast incf F5R,f ; Digit successivo
incf EEADR,f ; Posizione successiva della EEPRoM
decfsz (ont_tasti,f
call UP_LCD ; Riconfigura LCD
goto Altro_digit
CAII LCD_INI ; Aggiorna ICD
goîo 5i usata
movlw Messag_2_1 ; Offset del messaggio 2.1
cail
movlw
Messaggio
0xC0
; Visualizza "(C) Cancellare" Si_A novlw 3
movwf cont err ; Stabilisce il numero dei tentativi
call LCD_REG ; Riposiziona il cursore dell'LCD
movtw Messag-2 ; 0ffset del messaggio 2 Altro_ancora call UP-tCD ; Riconfigura LCD
calt illessaggio ; Visualizza "Codice" call LCD-INI ; Aggiorna
call (ontrollo ; Aspetta rhe si introdura un codice valido movlw Messag 2 1 ;Offset del messaggio 2.'l
Messaggio ; Visualízza "(C) Cancella"
btfsr temp_1,1 ; Cancellazione avvenuta? movlw 0xC0
goto Si usata ;Si (all I.CD.REG ; Riposiziona il cursore dell'LCD
movlw Messag 2 ; Offset del messaggio 2
cail uKey ; Verifica se è corretta call Messaggio ; Visualizza "Codice"
btfsc temp_1,0 ; E'valida? call Controllo ; Attende che si introduca il codice
9010 Si_usata
call UP LCD btfsc temp_1,1
cail tcD tNt ; Cancella e inizializza LCD goto 5i-usata
movlw Messag_2_l ;0ffset del messaggio 2.1
call Messaggio ; Visualizza "(C) Cancella"
cail 0key ; Verifica se è coretta
m0vtw 0xC0 : Rinosiziona LCD
btfs(
g0r0
temp 1,0
No 0k
call LCD.REG
call UP.LCD ; Riconfigura LCD
movlw Messag,3 ; Offset del messaggio 3
call LCD INI ; Aggiorna
(atl Messaggio ; Visualizza "Nuovo Codice" m0vlw Messag_5 ; 0ffset del messaggio 5
call Controllo ; Attende il nuovo codire (atl Messaggio ; Visualizza "Può passare"
btfsc temp_1,1 ; Cancellazione awenuta? bcf PORTA,4 ; 5i attiva il relè
goto 5i_usata :tl bcf PORTA,3 ; Attiva beep
m0vtw 0x0A
cail UP_ICD ; Ri(onfigura ICD call Delay ; Temporizza 2 sec.
(atl LCD_lNl ; Aggiorna LCD bd PORTA,4 ; Disattiva il relè
movlw Messag_2-l ;offset del messaggio 2.1 bt PORTA,3 ; Disattiva beep
call Messaggio ; Visualizza "(C) Cancellare" drl cont err ; Pone a zero il contatore di tentativi
m0vtw 0xC0 9oto Si usata ; Ripete il processo
calt LCD REG
movlw Messag_4 ;Offset del messaggio 4 decfsz cont err,f ; Prova fallita
call Messaggio ;Visualizza"Confermare" goto Altro_ancora ; Ripete un altro tentativo
movf digit 1,W UP-ICD ; Rjconfigura LCD
movwf di_tem-1 LCD lNl ; Aggiorna
movf digit_2,W movlw lvlessag -6 ; Offset del messaggio 6
mowvf dí_tem_2 call lressaggio ; Vìsualizza "Ac(esso negato"
movf digit 3,W m0vtw 0x10
movwf di tem
(aII Delay ; Temporizza
movf digit 4,W
3
goTo Si_usata ; Ripete il processo
movwf di_tem 4 ; Salva in modo temporaneo l" codice DISPIAY ON-CUR_OIT

CAII Controllo ; Legge il secondo codice


movtw b'00001 100' ; LCD on cursore off
call LCD REG
return
btfsc temp 1,1 ; Cancellazione awenuta?
goto Si usata ;5i END

Programma r isolto kon tinuazione)

ffiw$*ewwr*
Strumenti di lavoro:
caratteristiche avanzate di MPLAB (il)
er concludere questa sezione dedicata a
MPLAB, approfondiremo alcuni strumenti con Codice assoluto:
cui abbiamo già lavorato e vedremo così altre
possibilità previste in questo ambiente che cmw
OPTION
facilitano la oroqrammazione dei mtcrocon- :
trolìer PlC.

$4p&sM effi $$ ffi &cfs ffi R&T*&fr Codice nei moduli:

mx p4sm{jg-x CODE

Conosciamo MPASM come un assemblatore che tra- Start CLRW

sforma il codice sorgente che intende l'utente, in un OPIION

codice adeguato al microcontroller. Però questo assem-


blatore usato con l'MPLINK, può generare moduli pre-
Codice definito come modulo all'interno di un programma
cedentemente compilati e situati ìn differenti parti del
programma. ll risultato di scrivere un
codice oggetto e di assemblarlo come
un modulo per unirlo successivamen- Dati assolutir

te ad altri, o creare direttamente un


file HEX eseguibile, è leggermente dif- cBL0c( 0x20

ferente.
lnputGain, 0utputGain ; Controllo di citlo
HistoryVector ; 5i deve inizializzare a 0
ffiSMtjLX ffig il#Sxflfr
Tempf, Temp2, Temp3 ; Variabili temporali
Possiamo definire come moduli diver-
ENDC
se cose. Quando sono istruzioni della
memoria di codice dovranno essere
precedute dalla dichiarazione di una Dati in sezioni:
sezione di codice come mostrato nella
figura. In aìcuni casi, è necessario spe- IDATA ; Dati inizializati

cificare la sìtuazione fisica che occu- HistoryVector DBO

perà il codice, come ad esempio con il


UDATA ; Dati non inizializzati
vettore di interrupt.
lnputGain REs 1

r4ffiffiffiLX *gX ffi&YX 0utputcain REs 1

Anche i dati della memoria RAM pos-


UDATA_OVR ; Dati temporali
sono dividersi in differenti sezioni, Templ REs 1

disposte in cìnque tipi differenti: lemp2 REs 1

UDATA. UDATA-ACS, UDATA-OVR, Temp3 REs 1

UDATA_SHR e IDATA. Nell'esempio si


mostra come sr possa operare una
Dati definiti in sezioni all'interno di un programma
dichiarazione dei dati nel modo in cui

Sw$sawwvw
siamo abituati e nelle differenti sezio-
ni, a seconda dell'uso che vogliamo
fare di ognuno, in modo che il pro-
gramma li gestisca in modo differen-
îe. Per oontrnà delle sezioni si usa un
tino di direttiva nor e<cmnin noli:
IDATA sono permesse le direttive DB,
DW e DATA.

KSff#RY&KX***ffi $:
gffip#RYexg*$* g ffig tr&#*fi"3 {_g
Quando vogliamo che un'etichetta
definita in un modulo o routine si uti-
lizzi in un altro, la si deve esportare
utilizzando la direttiva GLOBAL, per
ciò è necessario averla dichiarata in
precedenza. A loro volta, i moduli che
utilizzano etichette dichiarate in altri
moduli dovranno essere importati con
Per poter utilizzare moduli in un progetto dobbiamo indicarlo in MPLAB
la direttiva EXTERN. Dato che si lavora
con differenti banchi di dati, dobbia-
mo tenere presente in quale banco si alloggia ognuna lizzando la direttiva BANKSEL seguita dal nome della
delle variabili prima di fare riferimento ad esse. Questo variabile prima di fare qualcosa con essa, perche sia
compito pero può essere demandato all'assembler uti- l'assembler ad occuparsi di cambrare banco.

Definizioni delle variabili globali in un modulo: rffipesffi fr#ru wtrLKruK


tr ffi$3$_5:t$
UDATA Una volta editato il modulo in oggetto, per
lnput6ain RES 1
assemblarlo si seleziona l'opzione "Object File"
0utputGain RES f e il file avra estensione .obj.
G!0BAL InputGain, 0utputcain
ll programma MPLINK si incaricherà di radu-
Filter
nare e posizionare tutti i moduli realizzati, gene-
Global Filter
rando l'eseguibile. ll vantaggio di un progetto
; Filter code
realtzzalo in questo modo e la riutilizzazione del
codice con il conseguente risparmio di tempo e
Utilizzo di variabili definite in un altro modulo:
risorse.
EXTIRN lnputGain,0utputcain,tilter Da parte sua, MPLIB aiuta anche il manteni-
UDATA mento del codice, visto che permette di fare
Reading RES 1
librerie.
CODE Una libreria è una collezione di moduli
object, normalmente con alcune caratteristiche
MOVLW GAIN1 comuni riunite in un unico file, come per esem-
MOVWF lnputGain pio, la libreria "math.lib" per il lavoro con ope-
MOVLW GAIN2 razioni matematiche.
M0\AI/F 0utputGain Per noter tiilizzarp in rrn nronptto diffcrcpli
MOVF Reading,W moduli di questo tipo al posto di uno solo, lo
CALL Filter dovremo indicare come opzione, in Option
>Environment Setup, e all'interno di questo,
Dati e routine definiti in modo qenerale per essere utilizzati in altri moduli
noll: <rhod: Prniort

Sw$$wresse
tffstrfttÌìÙrrR*i
Strumenti di lavoro: caratteristiche
avanzate detfM PLAB-SIM I
l'imPonanza che riveste
ffiWM ata
il
ffi W provare un programma
il W
ffi
ffi
ffi dopo
w
la sua compilazrone e
ffi prima di programmarlo
$W'-,,.--,,-.---.-,
w dtrettamente sul mrcrocon-
troller; anche se abbiamo gia fatto i

primi passi in questo settore, crediamo


che il simulatore MPLAB-SlM, all'inter-
no deglì strumenti supportati dall'am-
biente di sviluppo MPLAB, meriti un
discorso a parte. Sino ad ora abbiamo
eseguito un programma, abbiamo
introdotto differenti valori sulle linee di
r/A -L.A;--^ 9uoruc
t/v c^ duutdilru ^,,-.rlto i risultati sui
registri corrìspondentì. In definitiva
abbiamo venficato che i programmi
andassero bene, e che facessero quel-
lo che ci si attendeva da loro. Pero,
avete provato voi a fare alcune delle
modifiche che vr abbiamo proposto?
Dobbiamo chiamare ogni linea di ingressoluscita come propone il simulatore
E in caso affermativo, che cosa è
successo quando il programma non ha
$3X$\$ XNSffi ffi$SglUSf,XYffi
f unzionato? Avete trovato la causa?
p
A volte orresto e diffirile nprchp np.essalo cono- MPLAB-SlM può lavorare con molti e diversi microcon-
scere le caratteristiche avanzate del simulatore che cì troller, fra cui il PlC16F84 e, a seconda deì dispositivo
aiutano nel nostro compito. che si sta utilizzando, dobbiamo tenere conto di diver-
Inizieremo vedendo quelle di cui dobbiamo tenere se cose.
conto al momento di lavorare con il simulatore e che Alcuni microcontrollel ad esempio, hanno multi-
dipendono esclusivamente da questo, in altre parole, nlex:tp lp loro linee di inoressi/r rsciîe in modo che
quello che ci permette di fare e che restrizioni presenta ognuna realizzi diverse funzioni e per ognuna di esse
MPLAB-SIM. c'è un nome.
Per modificare queste linee, sia direttamente che
Wffi *-*{gYe g}K *:Sffifl àitrg*ru ffi con l'opzione di introdurre stimoli esterni, si devono uti-
tN/PLAB-SlM simula l'esecuzione di un microcontrol- lizzare i nomi proposti per esse, altrimenti il simulatore
ler e orrpllo deoli inn"^-'tt""t+^
" 'JIC))l/U)LILC' d UllO '^rocita che
VEI non le riconoscerà.
ffi' -*J"
dipende dal computer su cui gira il programma. Di
rnnqpnronTÀ ncr In qtesqrì nrnnr:mm: si devono gI\$Yffi$q.Rffi$}Y

considerare differenti opzioni, per fare in modo che Nel caso del PlC16F84 il simulatore supporta tutti gli
la simulazione non risulti ne troppo rapida, né trop- interrupt overflow del TMR0, cambio di 4 linee di mag-
po lenta. gior peso della porta B, interrupt esterno per RB0/lNT e

Sw#sw*xww
tu tt tttttttt ::
sw&Til*-$ffi*#
Anch'esso e simulato nell'MPLAB-SlM, sempre e
quando sia stato attivato in Options>Development
Mode.

RffiSgS?eA Sptrflg&g"g
Lavorando con i PIC ci sono alcune risorse che, anche
se devono essere prese in considerazione, non dispon-
gono di una posizione all'interno della finestra dei regi-
slri noirhe non sono recristri di ner se hensì bit all'in-
tornn doi ionictri
Si dispone di questi tramite la finestra di registro di
funzioni speciali, come il T0PRE, per rappresentare il
prescaler del TMR0.
ll reoistro di lavoro \A/ e rrn r:cn cnpri:lo rhe si trova
in questa finestra.
Sono contemplate diverse cause di reset

termine della scrittura della EEPROM. Questo permet-


terà di ultlizzare la risorsa di "stato di riposo", da cui si
ócaó aAn rrn intarrr rnf

KffiSgY
llsrmulatore inoltre supporta tutte le condiztoni di
reset.
ll'reset tramite la linea MCLR si puo simulare con
l'introduzione di un livello basso. seguito da uno alto,
nell'opzione di stimoli esterni, o direttamente nell'op-
zione del reset dentro l'opzione Debug>Run. Inoltre
abbiamo il reset del sistpma e il reset npr connessione
dell'alimentazione. Ci sono alcune risorse
che si possono solo osservare all'interno della finestra
rlei rcni<tri di fi tn-ioni <nprtdlt.

#F*g
i hi\Àq ffig: # 3c'èd $:
tuF!&Lqàtu
Oltre alle linee di ingresso/uscita, all'interno del simula-
tore sono disponibili le seguenti periferiche:
. TimerO.
Questa periferica, insieme agli interrupt che provo-
ca, e completamente implementata nel simulatore,
potendosi incrementare con il clock interno o median-
fo imnrrl<i octorni ln nrro<t'rrltimn r:<n il +on,lpo In cul
l- li^^-
td il|ed .i,--^^
|iltd|e d- 1I e^ a- n,l^,,^
u, oeve essere
^--^.^ .J; almeno
ol - un
ciclo, per essere tenuta in conto.
. Memoria dei dati EEPROM.
Anche questa risorsa e simulata, insieme ai suoi cicli
di lettura e scrittura. E approssimativamente di 10 ms.
il Watchdog
Per utilizzare Le funzioni dei bit di controllo WRERR e WREN sono
dobbiamo attivarlo come si farebbe per la scrittura del PIC
cttLtI q))E -i-,,l-+^
^^-r^t^--^ )[ ttutoLE.

Scp#&eetrw*"w
uiutltmlmtm@ffi
FS.
t';
ffi
p'
:c::::

w
:-:'
r.'
;
tu Strumenti di lavoro: caratteristiche
ffi
ffi
tr.
È.i'
avanzAte del MPLAB.SIM II
tu"

&
e avete letto la scheda precedente, sapete
il; già cosa potete o non potete aspetlarvi dal
simulatore MPLAB-SlM. Vediamo ora come
ff'
iU;:: sfruttarlo al meglio, a seconda delle nostre
ll":''
F^i esigenze e in ogni occasione. Ricordate che
* per avere accesso agli strumenti di simulazione, e
Fr' necessario cambiare l'ambiente di sviluppo.
hr a,,aa+r -+^---
L-/d LlUC)Ld >LC>>d {i^^-+"-
||C)U d -i p\JLtdt il tU i^^l+"^
)r ^^+.-^^^ il rUil rC ,,^"i
Vúr r-
$;
ficare se esistono delle limitazioni nella simulazione
ffi'
del disposltivo scelto, oltre ad ottenere "dettagli" sul
medesrmo.
Se non si cambia l'ambiente di sviluppo, le opzio-
ffi. ni di simulazione appariranno disattivate.

ffii h* g* &.1 i-4 f* f'


trgfi,às{3 *.Fnm{-,\}
$* [ !r ,f-
Cambiando l'ambiente di simulazione si possono chiedere
àa+f
" vLr(uyí an I i " Aal
vL, Aic nn< iti,n
v,JPvJ,(,vv.

ll monrr Dahr rn rnntiano tr rfto lo nnzinni norocqerio


' quando si sta simulando un programma per la sua messa
w' #pxx*rdtr K#ru
a punto. Le opzioni L'opzione Run permette di controllare l'esecuzione del
più importanti programma. Si puo eseguire in modo continuo (Run)
ffil
ffi-
sono rappresenta-
Ìe ancne In una
sino a che non si trova un "punto di rottura" o si clicca
l'opzione di fermata (Halt), evidenziando i valori der
ffi barra di icone registri durante l'esecuzione (Animate), o istruzione a
come quella ripor- istruzione (Step). Si puo inoltre eseguire una subroutine
ffi: tata in figura. da sola. e fermarsi subito dopo (Step Over). Per ferma-
Questa barra si rp il nrnrpscnro ci nro ltsare l'onzione Halt con cut st
ottiene cliccando visualizzeranno le informazioni delle finestre corrispon-
ffi' sull'icona di sini- denti. Un'altra opzione di fermata è Halt Trace, che fer-
ff -+.-
)Lt d -.1^ll-,,iJ^^+^
ucild vlucdLd. merà il "tracciato" del programma, però questo conti-
r\,,-^,.J^ -i po))c
)r nuera ad eseguirsi. I registri si possono inoltre rendere
vuoruu ^----
sulle icone con il visrbili con Update All Regìsters. Per iniziare nuovamen-
mouse, sulla linea te si puo scegliere l'opzione Reset, che provoca una rei-
ffi inferiore di N/PLAB nizializzaztone del processore, come se si premesse il
Se non si cambia l'ambiente appare il commen- pulsante N/CLR, oppure iniziare da un punto preciso,
di sviluppo le opzioni della simulazione ro per ognuna 0l altrimenti può essere interessante cambiare il valore del
ffi -^^-;^^^
d
);.-++;,,^+^
pPa tvt t9 u/)dLtrvo(9.
CSSC. PC (Change Program Courter).

ffi

Opzioni pu rmportanti del menu Debug

ffi
Sw#*ewwwm
ffi'
:',::l.l:

.:i:':,lt

)l:11&

l. l:r:aÌ::

..1::ì::.::
::::li:i*

.);:;,.
..::L:.):
.:rì:ir.:t

:.:'.1:.1;*

,,,1i'*
:::::lll;
.:.ì::il
:,:aZ

.:aa,:a::;).

,;,f4
'.:,,tt)!*
.::a:a.::.ffi

:..'::.a,a,i:l
:'aa:,1::
.......4:a
':::::::ri
.a:a,aaa
'.::.: ::,1

:ìIìÈ4
:.i,:ìi:.}

:,::i*:L4

--a:al*
Opzioni del menu Run 5i possono scegliere i valori dei regrstri dopo un reset , I t:,.:tj:

r. t:r
#Pffig*ruffi ffiKffiflLJYffi ad esempio un treno di impulsi, si utilizzerà l'opzione
Al momento di eseguire il programma, potrebbe esse- Clock Stimulus.
re interessante non farlo girare completamente, ma
verificarlo fino ad una particolare istruzione (Execute an ffiffiffiAK P*K€4Y $: €W&{tr a3*gF*3 :ì$
:r,::,:
Opcode), o eseguirlo fino al verificarsi di una determi- lpunti di rottura (Break Point)e ipunti di traccia (Trace .'::,:::7
nata condizione (Conditional Break). Point) sono due elementi fondamentali per mettere a
:':,aL
punto un programma. La definizione di un punto di .....::a:t
t ,,:::=
{.}pK€#*{ ffi sgr4 {_&Y#ffi sYge4 # L{Js
{,$ roîtrrra nermette di rombinare i diversi modi di esecu- 'i :l::::
,'t:ì
Oltre a generare stimoli per il simulatore in modo inte- zione, in modo che, ad esempio, il programma venga ,::ì
,.:.,:.1)
rattivo (Asynchronous Stimulus), si possono descrivere eseguito in modo rapido (Run) sino ad un certo punto ::::'
i .: i+
segnali che arrivano ai pin di ingresso come file ditesto di rottura, in cui il programma si ferma e si può simu- ...:::-,?
:r::i:ì
(Pin Stimulus), o ulilizzare i file di testo per introdurre lare passo a passo. Se inoltre si definisce un range di rlì.ì:ì
rì::
valori da B bit direttamente sui registrr (Register indirizzi di programma, si puo sapere in ogni momento i'ì
Stimulus). Se gli impulsi devono essere periodici, come che valori hanno i registri quando sono eseguite quelle
istruzìoni. Entrambe le oozioni 0ermettono di visualiz-
zare lo stato del nrrìrpssore. ouando si stanno cercan-
do possibili cause di un mal funzionamento del pro-
gramma. Queste funzioni si possono annullare facil-
mente con Clear All Points.

&LgRil *trX3#r,jg
Esistono altre opzioni che possono essere utili in deter-
minati momenti; ad esempio simulare la cancellazione
del microcontroller con Clear Program Memory, reset-
tare il sistema completo come se iniziassimo in quel
momento a lavorare con MPLAB (System Reset), o
generare un reset che ponga tutti iregistri con un valo-
re determinato o casuale, a seconda di cosa si sceglie.
l'onziono Confor f)ohrrn I nr:tinn normatta dr csonrrrro
un salto nella simulazione del programma, collocando
il contatore di programma alla metà del codice che si
Può essere interessante eseguire una sola rstruztone
sta verificando

Scs*Éwwril,

Potrebbero piacerti anche