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