Microrobotica Monty Peruzzo Editore - 09 C - Programmazione
-
Upload
monty-microrobot -
Category
Documents
-
view
239 -
download
12
description
Transcript of Microrobotica Monty Peruzzo Editore - 09 C - Programmazione
fistruzione IORLW
;; t istruzione "ior" o "or inclu-ilúffi Srva realtzza la sommamffi logica deoli ooerandi: il let-
nU terale che sr accompagna al
ffi codrce deil'rstruzrone e rl
contenuto del registro di lavoro W.
Come nelle altre istruzioni dello stes-
so formato. il risultato si lascia nel
registro di lavoro W.
Se il risultato dell'ooerazione è 0.
si attiva ll flag 7.
xsxwqxe#ru rIs?RilAX$Ns ISnLWCosì come I'istruzione andlw, anchela iorlw. è un'istruzione logica. quindiI'operazione che esegue si realizza bita bit e non prendendo come unità il
registro completo. In una sommalogica il risultato è sempre vero, cioè'1, quando almeno uno degli operandi lo è. Nel PIC que-
sta istruzione prende due unici operandi. però nel caso
ne prenda di più, come succede in altri linguaggi, il
risultato sarà vero se almeno uno di essi lo sarà. Nella
frgura si rappresenta la tabella della verità relativa all'i-struzione, e il suo modo di operare. L'esecuzione bit a
bit è quello che realmente fa questa istruzione all'inter-no del PlC. mentre I'esecuzione a livello di registri èquello che succederebbe se fosse possibile con questa
istruzione. Come si può osservare, a parte il fatto che
un'istruzione con queste caratteristiche sui registri nonfornisce un valore concreto ma solo vero (V) o falso (F),
TABEIIA GENERALE
RISUI-TATO
Funzionamento dell' istruzione iorlw
se valutiamo il risultato globale nonpotremo trovare differenze: indipen-dentemente dai registri iniziali, il risul-tato finale (V o F) sarà lo stesso in
entrambi r casi.
L"XSTRIJXS$MH X&KWTL'istruzione iorwf è il secondo mododi realizzare istruzioni di somma logi-ca. Come mostra la figura, e secondoil formato visto fino ad ora, l'opera-zione si fa con i valori contenuti nei
registri della memoria RAM e quellodel registro dr lavoro W. A seconda
OPERANDO OPERANDOMNEMONICO FONTE DES1N44ONE
io, r'l* l ; ..'.,1(
Operozione: reolizzo l'operozione logico OR
fro un volore letterole e il volore
del registro di lovoro W
Cicli: I
Codice OP: I I 1000 kkkk kkkk
Flogs: Z
Ca ratte ri sti ch e d e I l' i stru zi o n e io rl w.
Sw#*wrwre
Circu ito con interruttoriper rappresentare le istruzioni ior.
specifici come quelli che controllanole istruzioni, dove ogni bit deve
essere trattato rn modo indipenden-la ó nn n <i nr rn rrmhi:ra rr:lnra :ltr, C llul | )l Puw Lolllurdlr vdlulc d
trrttn il reoistro Se si tratta Solo di
',1:2.r..irì:ì::ìli
,,.$
.,:.:ì|F
.'::,:i:I,,':ì1::i::iì
:. ìiì:ìì
. , iì:ìi.iì
rìì:ì:
.'i:a. :l::ì:ìl
':::t\
:...1t:j
I r:ì'€
':,!
. :::.::,:rj
'::t::.11*i!
:..ì:i!:€=
. ,i::t:l{*
.:a:.::.',:ÍÍj
'::lir::}!
.:
t:l:: a:,:c
'..,,:.tt,::i.ti:,ìF
- ll:li'vt::j5
., ..:a:,:
tr;-.,!!:.::ì*
.:t::;,t1,€
.,:.::,::
. .::.:.|:
''tt:l,::Lii.,|
lìl"sg$
delvalore delrisultato puo essere influenzato ilflag Z. Se
rappresentiamo graficamenle la tabella della verità delle
istruzioni ior vedremo che e sufficiente che uno solo
degli'interruttori sia chiuso (valore vero) per fare in modo
che la corrente passi da un lato all'altro del circuito.
ffiStrffiffig fl#8!$ $i'g$Yffi#gg*ruffi K*RW$Parlando delle istruzioni andwf e andlw, abbiamo qtà
modificare il valore di un bit si puo
fare con l'istruzione "bsf ", pero quando il numero dei
bit aumenta, come nell'esempio dove vogliamo modi-fir^aro J dpnli R hit c nirr rnnvenicnle l'rrtilizzo dellevL:,|| v v|1, L |JIv
maschere. ln questo esempio modifichiamo uno dei
bit a 1 e il resto si lascia uguale.
Nel caso si desideri porre dei bit a 1 e altri a 0dovremo fare delle maschere successive con le istru-zioni "ior" e "and".
introdotto il concet-
to di maschere, e
abbiamo visto dueesempi. Però, a se-
conda di quello che
desideriamo ottene-re, dobbiamo appli-care una maschera oun'altra, quindi uti-li---.^ ,1i,,^"-^ ,-+", ,IIZZÓIE UIVCI)E I)LI U'
zinni Pon<:ta 2 nro-
sto nuovo esempio:vogliamo porre a 'l
una serie di bit di un-^^i-+-^ ^,,-l-i--iregr>u u rludr)rd)r,norn <én7: mndifi-
carne nessuno deglì
altri. Questo è nor-male con registri
Sw6*wwww
OPERANDO OPERANDOFONTE DESTINAZIONEMNEMONICO
i a r'w.fOperozione:
Cicli:
Codice OP:
Flogs:
r
realizza l'operozione logico ORfro il volore del regisfro f e ilvolore del registro di lovoro W.Se d=0 il risultoto si loscio nelregisiro di lovoro W e se d=Isi loscio nello stesso registro f.
I
00 0 t 00 dfff ffff
Z
Caratteristiche dell' istruzione iorwf.
ìTABELIA DETLA VERITA
1og*--i*'-il;-il:,
lmpostozionea-l dei 7 bit più..significElivi.di un registrosenzq influenzore quelli meno significotivi.
Senzq utilizzore lq funzione ior Utilizzondo lq funzione ior
bsf
bsf
bsf
bsf
bsf
bsf
bsf
REG,I
REG,2
REG,3
REG,4
REG,5
REG,ó
REG,7
movlw b'l1l I1l lo'iorwf REG,F
Esem p i del I' istruzione i orwf
Appli cazione pratica:quattro interrupt come uno solo
bbiamo già visto il primo dei quattro inter-rupt che si possono verificare in unPlC16FB4, quindi ne rimangono altri tre.Questa volta ne utilizzeremo uno moltoparticolare, dato che può essere generato
da diverse cause. Stiamo parlando dell'interrupt per
cambio di stato dei piedini più significativi della Porta B,
vale a dire R84-R87.
wx %YW* mx &&4*Rffi3Quando uno di questi piedini cambia stato, cioè pas-
sa da 0 a'1 o viceversa, si attiva il flag RBIF, e il PC
punta il Vector di lnterrupt. Nella Routine di Serviziodell'lnterrupt, se l'applicazione lo richiede, si dovràverificare quale delle quattro linee è quella che ha
cambiato di stato, e se il nuovo valore è 1 oppure 0.
Questo sarà ancora più complicato se le periferichecollegate alla porta B sono pulsanti anziché interrut-tori, dato che il loro valore torna allo stato inizialedopo che sono stati rilasciati. Comunque nell'esem-pio che stiamo per fare non ci preoccuperemo diquesta verrfica, ma tratteremo in egual modo l'insie-me delle quattro linee, senza verificare quale ha pro-vocato l'interrupt.
Si vuole proteggere una casa dall'ingresso di intrusi, quindi si montano quattro senso-
ri digitali: uno sulla porta e tre sulle finestre, Quando uno qualunque di questi si atti-va, si visualizza lo stato dei sensori in modo da conoscere la causa dell'allarme e si at.tiva un cicalino,
Enunciato per I'utilizzo dell'interrupt per cambio di RB4-R87.
INTCON
Registro importante nell'interrupt per cambio di stato di RB4-RB7
Anrho nro<+:
volta il program-ma principale è
utilizzato soloper le inizializza-zioni dei registri,infattirealizzere-mo tutte le altreoperazioni nellaroutine di inter-rupt.
l-nmo nnfoto
osservare, que-sta volta nell'or-ganigrammanon siamo scesi
a basso livello,-+-+^ l-)ut tu )Lo LE tó-
sciate le azionida realizzare inlinguaggio natu-rale. In seguito,al momento di metterlo in pratica, ci preoccuperemo di
vedere quali ìstruzioni o che tipo di elaborazione saran-no necessarie rn questo caso. Per lavorare con gli inter-
RSI
Moslro RB4-RBZ ',
Attivo cicolino
Resetto ilflog
Ritornq ,,
Organigramma della routine dell'interrupt
rupt, avremo nuovamente bisognodel registro INTCON, i bit coinvolti in
questo caso specifico sono riportatinella figura.
Come nel caso dell'interruptper RBO/INT, il bit 7 del registro INT-
CON dovrà essere messo a 1 per l'a-bilitazione generale degli interrupt,inoltre il suo bit specifico. il bit 3, do-vrà anch'esso valere 1. I rimanentiinterrupt dovranno essere disabilita-ti, dato che non sono contemplati. ll
flag RBIF (bit 0 del registro INTCON)passerà a 'l quando si verificheràl'interrupt.
#&w&*wwx*
tNtzl0
03
05
06
OB
0
0
0
tNtzt0
4
INT
5
5TATO,5
0xF0
PORTAB
PORTAA
5TATO,5
IQU
EQU
EQU
EQU
EQU
EQU
ORG
goto
ORG
g0r0
ORG
bsf
movlw
movwf
clrf
bcf
P=16F84
PORTAB
b'10001000'
INTCON
NIENTE
PORTAB,W
PORTAA
PORTM,4
; Definizione del processore
; Definizione di variabile
; Posizione del vector di interrupt
; Programma principale
; RB4-RB7 ingressi e il resto uscite
; Porta A uscita
; Cancellazione della P0RTAB
; Attivazione degli interrupt
; per RB4-RB7
; Mirroconfoller in stato di riposo
; Al rientro dall'intenupt
; ritorna in stato di riposo
; ma il cicalino continua a suonare
; Routine dedicata all'intenupt
; ll valore dei bit piir significativi
; passa ai bit meno
; significativi
; 5i passa il valore dell'allarme
;alla P0RTAA
; 5i attiva il cicalino, collegato a RA4
; Si resetta il flag di RB4-RB7
m0vtw
movwf
sreep
goto
NIENTE
INTCON,RBIF
retfie
Programma proposto
ììììiì:ì:
..,:: a:,:,:,:,:::i
ì,:::*t:at tiììì:ll
:ì:ìì
Sw$*x*r*xww
x*" pffi*ffiw&MM&fl*fl$$3*_ffiY#Come potrete verificare, il pro-gramma è simile a quello già vi-sto per l'interrupt RBO/INT. Nel-l- ^-"+^ ^":^-i^-l^ ..Jra pdrre pflncrpate, oopo averrealizzailo le configurazioni op-portune per questo caso, il pro-gramma entra in stato di ripo-so, e attende che si generi unintprrr rnt P:rto dplla oofta B si
configura come ingresso, per--1.-^ --.\ ^,,^il- ^ -,,icne sa[a queila a cut sarannocollegati i sensori. Sulla porta Avisualizzeremo l'informazionerelativa all'allarme attivato, e
sulla linea RA4 dovra essere col-legato un cicalino che si attiveracon l'interrupt. Per realizzarequanto detto, utilizzeremo l'i-struzione swapf per scambiare i
bit piu significativi - dove sonocollegati i sensori - con quelìi
meno signrficativi, dato che la porta A dispone solo di
5linee e non di 8 come la porta B. Al rientro dalla rou-tine di interrupt, il microcontroller tornerà in stato di ri-poso, pero grazie alle sue caratteristiche, questo cicali-
no rimarrà attivato anche se non si esegue nessuna
nuova istruzione, in questo modo l'allarme non si po-
trà scollegare, anche se i "supposti ladri" richiuderan-no la porta o la finestra da cui sono entrati, a meno che
non si resetti il sistema. Prima di
uscire dalla routine di interruptbisogna resettare il flag dell'in-torn rnf nrnÀnttn
$g$4qJL&trg#$\$ffi##L $}ffi##W&Mffi&Simuleremo il programma in mo-do continuo (Debug>Run>Ani-mate) e lo seorriremo tramite i
registri specifici (Window>Spe-
cial Functron Register) poi intro-durremo der valori tramite le Ii-nee R84-R87. Queste linee le
dovremo configurare con la fi-nestra Debug>Simulator Stimu-lus>Asynchronous Stimulus, per
simulare un interruttore (Toggle)
come nella figura, o un pulsante(Pulse).
Dopo aver attivato la simu-lazione, potremo, ad esempio,
Situazione della simulazione dopo aver attivato RB4
Er&4.:*4 9Èó = 'g*boÉ.It+'
-
.1la {,-il-l tn :h:tÉ'F"
:SFg l{ane Her Des glnarg ghar ,:Ètnro 68 0 0S066000 =,Pcl 0B 6 BgSgBBBg
optlún*reg FF 2SS 1 t1 t1111status 18 24 0úBl100B,fÈf 00 6 686906!0;parta 00 6 800SB609trisa 1F 31 00011i11portb 00 6 06060S66trisb FF 2SS 111 111 11eedata 60 0 60606060:eecsnl 86 0 00606000eeadr 06 0 06086660:eecon2 0B 0 g6!96800.pclath BB B 00600680intcon 00 0 00989006,u 05 0 086806$0tgpre 06 0 00050000
É=*gr1*d
LISÍ P.lóF84 ; Deflnlzlonè det prrj
:SrnrO E0U e3 ; Deflnlzlone rll uariPoFrîn EQU 05PoBffi8 EqU 0órHrcoil EQU eE:f,BIF EQU O
UEqUO
,one0oEG 4 ; Poslzlof,e del uectrgoto I Hlonc s
:; Programa prlnclpale :
IHIZI0 bsf Sfnl0,5troulu 0xF0 ; RBlr-887 lngressf e,: souuf P0nTA8
: clrÍ P0RTAn ; Porta R lsclta: bcf STfiTo ,5
ry crrÍ P0BTAE ; canceuazione delr,.lt I noutu b't00fise0' ; nttluaztone degtl:
tl I nouuf lilTcoil ; Per 8Bll-RÉ7JI1 J Je sfeep ; ttlcrocontrollore 1l
-- _l goto HIEHTE ; nl rlentro dall'ln| ; rltorna ln stato d,
.l tî.
*-ro f ryrl-i *"ur f tryttuÉfl I s'iÈffi i" ffil7F l_ e{ffi
Finestre necessarie per Ia simulazione
$w#sxxswww
attivare la linea RB4. Vedremo
che si produrrà un rapidocambìamento nelle linee dì
esecuzione del programma, e
che la linea che evidenzia le
istruzioni in corso tornerà nel-
la sua posizione di stato di ri-poso dopo aver eseguito la
Routine di Servizio all'lnter--,,^+ ^,,-l-^-- -^-,,rupr. QUarcosa comunque e
cambiato: nella porta A sonoora indicati i valori della porta
B, e si e attivata la linea RA4,
il cicalino.Anche se torneremo a clìc-
càre str R84 ne. rinorlarla alla
sua situazione iniziale, il cicali-
no non si disattiverà, anche se
il nuovo valore della porta B si
potrà vedere sulla porta A.
#YXA"ggX*ffiKtil'3NYmgffiqirupffiK ffis&-*s3In questo caso abbiamo utiliz-zato'l'inlerrrnt ner R84-RB7
TASTIERA
Collegamenti di una tastiera esadecimale per I'utilrzzo con interrupt
in un esempio semplice ed efficiente.Un utilizzo tipico di questo interruptè la rilevazione dell'attivazione di unnrrlsante di rrna tastiera matriciale.Orrpsf e tastierp noccono contenefeYvrJ!L
nrr:ntitì divor<o di nrrlq:nti nrrollo
piu comuni sono le esadecimali. Una+ac+iòrì n..r Inr lr n^r+: R :l rnmnlo-LO)LlEl O WLIUPO rO PWI Lu u ur LvrrrvrL
to: ibit piu significativi configuraticome ingressi sono queìli che utilizza-no l'interrupt per R84-R87, e i bit me-no significativi sono configurati comerrcrito Prompndn rrn nrrlcento qi nrn-,r, ".\ ,,^ i^+^"",,^+ -ìl,intefnO dellauutto utt il ttgtr UPL/ ol
routine bisognerà verificare di quale
^, l--^+^ -i +..++- ^^..^-li---.^ l^put)or LE )r Lro Lro, PEr rEoil44orc rc
operazioni opportune. Questo usoanrp le nortp ad rrn: moltitudine di-^^li---i^^i -L^ *.-mite I' ulilizzodppilLdzrurr, Lr rE Lro
delle tastiere, forniscono la possibilità
di introdurre dati in modo versatile, e
in modo familiare per l'utente.
I Prîgrarr priÍcipalr
,rlIZI0 bsf SIllù,5nelr ùrFailerf P0Írmelrt P0BTltbcf S1îI0,5
clfÍ P0*tCt
F{rlr l"lttrltlt'mu* llll0lltl
; nouti[r dcdf?eta óu'iritcrrúpt
ItlT sragf PfFfcS,g
; [8]-187 inqr*ssi e,
; Portr I usciti
; Cancelli;ionè úFIl
i fittiuaziom lenli; prr n8{"881
Il u.lor€ d?i tit I
Ir$rà ai bit rîosigniflcittui3i pigsa it ualorBiua Plt*IifSi àtti{a il .ieal:
SÍ rescttn lt flag
É ll cicalino rotr
ffn ila* ,tsr 0.stnr0 09 g
pcl ù€ J4 80981f18oFtiún_reg ff 2í5 1llllJJ1stèlus 1 rr ? S É881 61 0g
trisa €Bpsrtù €Btfirb F 0
esdata gB
eÉe6nl È0
e€*dr 8È
aers0a Sggclatb SS
lntfofi gB
s89tÉprf èrt
6$rtFt ì tr;t*t
-,É* | _ r*_l
Situazione della simulazione doao aver rioortato la lrnea RB4 come all'tnizio
$w$sxwwww
*Fj .,,
il#*ryr-
ffiry
Fu
r:' "
iì€ I
*atttt:
::'-" ,
;' ,
;Sír
:.
1., ,
!ry
#H:
#ffi|,w....r-ffi;'ffiffiT.a ::::'::'--..,,':."" '
àr.
;
ffii:''
Sgi_!g$ìliìtlì:ì.
Y.:l|LZ,,:,:.,?ì.:i;2::,::::-:-:
:: :;
I
fistruzione XORLW
sistono due istruzìo-
ni di somma logica:la inclusiva "ior" , di-,,i -t-Aì-,-^ ^;\ ^-.LUr CUUrdr ru 9rc Por-l-+^ ^ l- ^--1,,-i,,-tdLU c td ú)Ltu)tvd
"xor", a cui dedichiamo que-
ste pagrne.I l^- -^--1 t^^t-^ ^.-t' '.1u||d )uil il |d tu9tLd c)Ltu)t-
va f ra due operandi significache uno e solo uno di essi puo
I ^^- {-.^ '^ modoE))CtC O I pEr rdrc ilr
che lo sia anche il risultato.
Nel caso della xorlw, la
somma è realizzata fra i bitche compongono il registro di
lavoro W e quelli del letterale-t^^ -t ---^^^-^^- ^r codiceLt tc )r dLLUr rPo9ro ol
dell'istruzione. ll risultato si
carica nel registro di lavoro W,
e si attiva il llag Z nel caso
valga zero.
Funzionamentodell'istruzione xorlw
gsffi&,eFg
e*$'* L'í5?HL$r-g#ru ffi K# ffi *-W
L'operazione di somma logica esclusi-,^ l. +.k^ll. -l^ll-,,^"i+ì ^l^ll-vd >tr9uc ld Lduclld urild vcr ild uEild
figura.Nel caso di linguaggi che permet-
tano piu di due operandr, il risultato
sarà vero se esiste un numero dispari
di valori veri e sarà falso per un nume-
ro uguale a zero oppure pari di valori
veri.
E come se si realizzassero opera-
zioni concatenate di istruzioni xor fradue operandi.
Caratteristiche dell' istruzione xorlw.
S*,p$l$wwry*
fistruzione XORWF
a xorwf realizza la stessa f un-zione della xorlw però pren-
dendo i valori da locazionidiffpronti rinc d:l roni5166 lilavoro W e da un registro
della memoria RAM. Ancora una voltail risultato si puo scrivere nello stesso
registro oppure in W, attivando il flagZ in caso che sia zero.
#s##wpg fl#ru LTsTffi qix3*fl,*ffi
K*ffiWFIn questo caso utilizzeremo l'istruzio-ne xor per fare delle comparazioni.Approfitteremo del fatto che il flag Z
si attrva in presenza di un risultatorrorrale à Tero inoltre uti izzeremonuovamente le maschere.
OPERANDO OPERANDOMNEMONICO FONTE DESTINAZIONE
xorwf f d
il;;; ;;;;;l;*";; i;;;;;""'esclusivo fro un volore de,registro f e il volore del registrodi lovoro W. Se d=0 il risultoto si
loscio nel registrodi lovoro W e se d=lnello stesso registro f.
1
00 0t t 0 dfff ffffZ
Ca ratteri stich e del I' i struzi o ne xorwf .
:!'i*iì:ì:
ilsfrwpt {fl}rut:3s?tr#tr,g*rutr H*ftNell'esempio si mostranodue tipi di comparazioni,una fra registri e l'altraf ra un registro e un valo-re letterale.
Per entrambi si utiliz-za il registro di lavoro W- -,,i .i ^^"+- il ,,-l^"^d cur sr porta il varore Oel
nrimo rpoistro e in soqg j-
to dopo averlo compara-to con il valore letterale oaon lrn :ltrn rpnistrn si
salta nelcaso che tlflagZsi sia attivato, cioe nel
caso in cui il risultatovalga zero, il che significache entrambi i valorisono uguali.
loscio
Cicli:Codice OP:Flog:
Compara le uguaglianze fra due registri
movf REG1,W
xorwf REG2,W
btfss STAT0,Z
goto N0_UGUALE
goto UGUALE
5e REGI = REG2 il risultato sarà 0 e il flag Z passerà a I
Compara I'uguaglianza di un registro con un valore determinato
movf REGI,W
xorlw b'01010000'
bffs 5TAT0,Z
goto N0_UGUALE
goto UGUALE
5e REGI = 01010000 il risultato sarà 0 e il flag Z passerà a 'l
Esempi con l'istrulone xor.
#e+$i'&w,g*r*q*
Appli cazione pratica: [a EEPROM' a[ termine delta scritturaavusa
ome abbiamo visto nelle appli-
cazìonì mostrate sino ad ora, gli
interrupt ulilizzaÍi bene evitanodal l:rinrn:l nrnro<.^'^ l-wLr ruvvrv ur VrvlLJJUIC, ld-
sciandolo in stato di riposo o li-bero di dedicarsi ad altre cose. Questo e
utile con risorse che richiedono un deter-
minato tempo ma che possono funziona-re in modo autonomo. come nel caso del-
la memoria EEPROM dei dati. Come ricor-
derete questa memoria si legge e si scrive
elettricamente e i suoi dati non vanno per--: ^,,-^,r^ -i +^^ì;^ -rimentaZiOne. Se il)t L]uoruw )r LUvilE ql
processo di lettura è immediato, quello di
scrittura richiede diversi millisecondi per
essere rea izzafo, una volta dato l'ordine.
gru?frffiRt$FT trffi& rgruil*3ffi1 ilX{L* m3 Sfl$CgTY#ffieffiKt_L& ilffirffi*ffiQuando parlammo per la prima volta della
EEPRON/ costruimmo due subroutines, una
di lettura e una di scnttura. Ora modrfiche-
remo quest'ultima per fare in modo che si
produca un interrupt ogni volta che termina
la scrittura di un dato nella EEPROM. La su-
broutine di lettura non necessita di modifi-che, però il programma princrpale dove si
trova dovrà essere cambiato per adattarsi
agli interrupt.Nel programma della figura non e sta-
ta inclusa la subroutine di lettura per non
distrarre la nostra attenzione. La chiama-
ta all'etichetta della Routine di Serviziodpll'lnterrr rnt p stata rollocata nel Vector
di lnterrupt che e all'rnduizzo 4 della me-
morra di programma. Sceglieremo nuova-
mente i valori 03 e 27 come indirizzo del-
la memoria e dato da scrivere rrspettiva-
mente. Nel programma principale dob-
LIST
RADIX
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
FQU
EQU
EQU
u tfugotoORG
gotoORG
P=16I84HEX
; Utilizziamo il PlC16t84
; 5istema di numerazione esadecimale
WR
WREN
EEIT
RPO
GIE
It45
0x030x080x09OXOB
0x0cOXOD
0x880x89
0
tNtzt04INTER
5
STATUS
EEDATA
EEADR
INTCON
EEADR-VAR
EEDATA-VAR
EECONf
EECON2
; ll programma inizia all'indirizzo 0
; Vector di intenupt
tNrzt0 MOVIW
mow'rfmovlwmowvfmovlwmowrtfcall
9orc
movfmovwfmovfmovwfbsfbcfbdmovlwmowdmovlwmovwfbsfbsfsreep
relurn
03 ; Metto l'indirizzo da scrivereEEADR_VAR ; su una variabile ausiliaria27 ; Metto il dato da scrivereEEDATA_VAR ; su una variabile ausiliariab'11000000' ; Abilito gli interruptINTCON
SCR|V|_EEPROM ;Chiamo la toutineTINE
EEADR*VAR,W ; Porto l'indirizzo sul registroEEADR
EEDATA_VAR,W ; Porto il dato sul registroEEDATA
STATUS,RP0 ; Passo al banco fINTC0N,GIE ; Disabilito gli intenuptItcotlt.wRfU ;nUititolaslrittura0X55 ilnizio la sequenza obbligatoriaEECON2 : di scritturaOXAA
EECON2
EECON1,WR ;Ordine di scritturaINTC0N,GIE ;Abilito gli interrupt
; Entro in fato di riposo
; da cui uscirò con un intenupt
EECONI,EEIF ; Resetto il flagEEC0Nl,WREN ; Disabilito la scritturaSTATUS,RP0 ; Passo al banco 0
; Rientro dall'intenupt
SCRIVI EIPROM
INTER bcfbcfbcfretfie
n0pEND
FINE
Subroutine e programma per la scrittura della EEPROM dei dati con interrupt
Sqp$Ew*xs*
noPEND
Schema del processo che si esegue nel programma
se. Inoltre saranno molto utili la fi-nestra dello stack e il clock di siste-tttd.
Facendo la simulazione medianteanimazione (Debug>Run>Animate)
si vedono chiaramente i salti che si
producono lungo l'esecuzione, sia
per il movimento della linea-cursorelr rnnn Io i<trr rzinn i doI,, --, programma,sie npr nlí indirizzi di ritorno che si
biamo solo configurare gli interrupt che si possono pro-durre e chiamare la routine di scrittura prima di andarealla fine del programma.
Da parte sua la sua la subroutine di scrittura ha unan>rta rrtttr> l: crri++' '"a del reAiStrO FFCOI\12 SeCOndO
le specifiche del costruttore, durante la quale si deve
inibire l'accettazione di interrupt, cosa che si ottienemettendo a 0 il bit GIE di INTCON. Terminata questaprima scrittura si può tornare ad accettare gli interruptriportando a 1 questo stesso bit, e dare I'ordine discrit-tura. Quando termina la scrittura della EEPROM si
uscirà dallo stato di riposo grazie ad un interrupt, e si
passerà ad eseguire la corrispondente Routine di Servi-
zro dell'interrupt. In essa eseguiremo solamente il resetdpl fl:n di fina <rrittr rr: o dal hit rho normatro flro<r2
vrrrrrLLLL 9vuJru
scrittura, prima di rientrare. Usciti dalla routine di inter-rr rnt si eseore l'istrrrzione successiva alla "sleeo". la
"return" con cui si esce anche dalla subroutine e si va
alla fine del programma. Nello schema sono riportati i
salti che si producono lungo ìl programma. Al momen-to della simulazione dobbiamo aprire le finestre dei re-
gistri speciali, quella della EEPROVI e il programma in
memorizzano nello stack. Comunque, dato che si im-piegano almeno 10 ms per uscire dallo stato di riposo,questo tipo di simulazione può risultare tedìoso, anche
se è raccomandabile quando si sta iniziando.Inoltre si puo eseguire la simulazione con l'opzione
piu rapida (Debug>Run>Run) e fermarla quando il clockdi sistema segna un po'più di 10 ms, in quel momentoall'induizzo 03 della EEPROM dei dati deve aooarire il
valore 27.
&rF g_tf,éx:i*ru # pffi,eYxt&
Una volta visto come f unziona l'interruot oer fine scrit-tura della EEPRON/. integriamolo in un programma ri-
ferito ad un'applicazione concreta Come si puo vede-re tutto si complica poco a poco. Guardate l'organi-gramma nella pagina successiva.
Dopo la configurazione della porta B come uscitanor mn<tr2ro il v:lnro della EEPROM, della pOrta A CO-
me ingresso per inizializzare la EEPROM, quindi con la
somma di nuovivalori, e con l'abilitazione dell'interruptper fine della scrittura, si arriva al blocco principale delprogramma. ll passo seguente sarà mostrare il valore
-.r.....i4jli::
Preparazione delle finestre per la simulazione del programma Finestre dopo la simulazione del programma
Se*SÈwq*rcf
5i vuole utilizzare la memoria EEPROM
dei dati per memorizzare la raccolta
settimanale di un autobus.
All'inizio della settimana l'utente comanda
con un intenuttore l'inizializzazione
della memoria, A partire da questo
momento ogni impulso introdottoda un pulsante indicherà il pagamento
di un nuovo biglietto che si memorizzerà
nella EEPROM. Ad ogni inizio giornata
all'accensione del sistema venà mostratoper un periodo di tempo il valore
memorizzato all'interno della ElPROM,
famite deidiodi LED,
Enunciato del programma proposto
della EEPROM. A-^-^^,1- -^ .; À -l)cLU|Ud )C )t C Cr-
l'inizio della setti-mana o no, si ini-
zializzerà il valoredella EEPROM, il
rho <innifir: crri-
vere in essa un va-lnra zarn ln qonrrì-
to si entrerà in un
ciclo infinito cheincrementerà il va-
lore della EE-
PRON/ ad ogninuovo passeggero, sarebbe a dire ad ognr impulso su.,^- r;^^- r^il- ^^.+- ^ Si rrscirà da orresto ciclo con unUlld llllcd UCIIO pul Lo n. Jr yuLJtv !r\
reset di sistema, o quando si toglie alimentazione al
medesimo. Dato che ogni nuovo valore è scritto nella
EEPRON/, i dati non andranno persi togliendo alimen-
tazione.Passando al programma in assembler bisogna fare
attenzione a non perdersi, seguendo passo passo l'or-ganizzazione pensata nel l' orga n i g ram ma. Ricordate
che i rombi di solito si trasformano in domande che uti-Itzzano informazioni dì tipo salto: "btfss", "btfsc",..., e
Organigramma del programma proposto
i relativi rami sono istruzioni "goto". I riquadri sono di
solito gruppi di istruzionì, che potrebbero anche inclu-
dere subroutine.
LIST
RADIX
EQU
EQU
EQU
EqU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
ORG
gotoORG
g0r0ORG
bsfclrf
P=16F84
HEX
0
1
0
1
2
45
5
7
0x030x050x060x080x09OXOB
0x0cOXOD
0x850x860x880x890
tNtzt04INTER
5
STATUS,RPO
TRISB
: Utilizzo il PlC16t84
; Sistema di numerazione esadecimale
WF
RD
WR
WREN
EEIF
RPO
EEIE
GIE
STATUS
PORTA
PORTB
EEDATA
EEADR
INTCON
EEADR_VAR
EEDATA_VAR
TRISA
TRISB
EECONl
EECON2
; ll programma inizia all'indirizzo 0
; Vector di interrupt
lNtzr0 ; Banco I; Porta B usrita
Soluzione del programma proposto
Sw$sx*sw**vm
r--rrl>movlwmovwfbcf
m0vtwmovwf
call
btfssg0r0
90Ì0
btfssgotoincf
callgoto
drfcallg0l0
1F
TRISA
STATUS,RP(}
b'11000000'INTCON
LEGGERI
PORTA"O
SOMMARE
lNtztAUzzA
PORTA"I
SOMMARE
EEDATA-VAR,F
SCRIVERE
SOMMARE
EEDATA-VAR
SCRIVERE
SOMMARE
00
EEADR-VAR
TEGGI_EEPROM
EEDATA_VAR,W
PORTB
EEADR_VAR,W
EEADR
STATUS,RPO
EECONl,RD
STATUS,RPO
EEDATA,W
EEDATA-VAR
00
EEADR_VAR
SCRIVI_EEPROM
EEADR_VAR,W
EEADR
EEDATA_VAR,W
EEDATA
STATUS,RPO
INTCON,GIE
EECONl,WREN
0x55EECON2
OXMEECON2
EECONl,WR
INTCON,GIE
; Porta A ingresso
; Banco 0
; Abilito gli interrupt
; Legge la EEPR0M e la porta su PB
; Scelta da fare
; Se M4=0 non è inizio settimana
; 5e RA4=1 è I'inizio settimana
; Verifica sul pulsante
; Non è stato premuto
; Premuto, aumenta l'incasso e scrivi la EEPROM
; Continua l'incasso
; Inizializza l'incasso
; Inizia la raccolta
; Scriviamo l'indirizzo da leggere
; in una variabile ausiliaria
; Chiamata alla routine di lettura
; 5i visualizza il risultato
; sulla Porta B
; Spostiamo l'indirizzo da leggere
; sul suo registro
; Passiamo al banco 1
;Ordine di lettura
; Pasaggio al banco 0
; Spostiamo il dato sul
; registro ausiliario
; Spostiamo l'indirizzo da scrivere
; sul suo registro
; Chiamata alla routine di scrittura
; Porto l'indirizzo sul registro
; Porto il dato sul registro
; Passo al banco I; Disabilito gli intenupt
; Abilito la scrittura
; Inizio la sequenza obbligatoria
;di s*ittura
;Ordine di scrittura
;Abilito gli intenupt; Entro in stato di riposo
; da cui uscirò con un interrupt
; Resetto il flag
; Disabilito la scrittura
; Passo al banco 0
; Ritorno dall'intenupt
SCETTA
SOMMARE
tNtzlAilzzARE
LEGGERE m0vlwmowvfcallmovfmovwfreturn
movfmovwfbdbsf
bcf
movfmowvfreturn
movlwmowrrf
callreturn
movfmovwlmovfmovwfbsf
bcf
bsfmovlwmovwfmovlwmovwfbsf
bsfsleep
TEGGI EEPROM
SCRIVERE
SCRIVI EEPROM
INTER
return
bcf
bcf
bcfretfie
EECONl,EEIF
EECONl,WREN
STATUS,RPO
END
Soluzione del programma proposto. (continuazione)
Sw#*wwrx*
Àil"
w-;*-.".'#,,iffiffi1Lì:rl
3''-a:-1_i;
J-.ffi&*:l{.trI.q,r;
il..tr:'ffi*" ìwF.,ffiffi. ,
K1--' :
ffià.. ,
m:" l
ì\---.,s';,st:-"':{;M-EVT
ffi.ffiK&ì. -''wl1
wffi#1,, - :
W.:.ffil$&---:
iK:::::::ffi:,ffig;.. ,ffi..iil.:-" ,
s:9 '.
Ffgl:-::::,;ti- :'''n:ffi;ffi.ffiffi*"
H.:.ffi,-Ki"a& r-:
3t+:"-""ffiE"ì,,
ffiffi::::W+:RA:::ffi.F.-...ffi.:, "ff,:::
;'".{r-t-:P;. """ I
tg'-: r
*:-'l#,:Ltr: :
ffi',ffir:: r
ffit.ff:'#:,ff:'
ffiffi{, -
ffi
fistruzione RLF
obiettivo di questa ìstruzione è quello di ruo-tare verso sinistra il contenuto del registro f di
una posizione, cioè di un bit. ll bit che esce
dalla sinistra è il più significativo, verrà imma-gazzinalo nel bit di riporto (C) del registro di
STATO, e il bit che manca da destra, il meno significati-vo, sarà riempito con quello che era contenuto nel bitdi riporto.
Come si puo vedere nella figura del funzionamentodell'istruzione, se si esegue l'istruzione nove volte di
seguito sitorna alla situazione iniziale, qualunque sianoiv:lnri di n:rtanz:
ffiSffi$IgPX fl*ru ilJx$Yffi#Xxffiruffi ffiLW
ll primo esempro che ci viene in mente è di creare effet-
Caratteristiche del l' istruzione rlf
ti luminosi a
^-"+;.^ ,l-POTLilE UO
questa istru-zione: da
una luce cne
si va muo-venoo 0a-l^-+"- - -;^iuE)Ltc o )Uil-
stra, frno ad
una progres-
sione di luci-^^ -t ^--^^LI IC )I OLLEII-
dono sem-pre da.J^-+.- - -i^iuc)Ud d )ilil-
stra. Pero
oltre a tuttoquesto, la rlfrt nórmó++ó
vL, ,ì,r Lrr
di imple-menlare ra
moltiplica-zione dei
numeri bina-ri. Guardate
OPERANDO OPERANDOMNEMONICO FONTE DESTINAZIONE
:-tt;.- i, --:---"i*--*-*-Operozione rolozione d sinistro di un bit
del registro f, utilizzondo il bitdi riporlo C. Se d=O il risultoto si
loscio nel registro di lovoro W e se
d=I si loscio nello slesso reoistro f€icli: I
€odice OP: 00 I 101 dfff ffffFlogs: C
REGISTROf
Volore inizidle registro e
l0t I I101Volore inizioleC:
0Volore iniziole dopo I'istruzione rlf f, 1:
0l I I 10r0Volore di C dopo I'istruzione rlf f, 1:
I
F u nzi ona mento del l' istru zio ne rlf . Moltiplicazione a base di rotazioni
Sw$*wwwm
EFFETTO I
i bsfSTATO, C
# s * * & & s #[l:*?,Hg,JS S # # & & $ $rlfPoRTAB,F
S * S S S # &i *, rlrPoRTAB,F
S & S $ # * $ $rlfPoRTAB.r
*##*s#*srtfPoRTAB,F
EFFETTO 2
iì
j S # * I S S S #bsfsrAlo,ci rlf PORTAB, F
i # & * # S S S *bsrsrAro,c
# a s € * s * *il"t?llà?fTIfPORTAB, F
S # # S * # * Susrsnro,cTIfPORTAB, F
& & & * S * # #usrsraro,crlf PORTAB, F
Differenti effetti con l'istruzione rlf.
l'esempio seguente: moltiplicare per due un numero e
la stessa cosa che sommare questo numero a se stesso,
oppure ruotare a sinistra di un bit il registro introdu-cendo uno zero da destra. Provate ad implementare gli
esempi in MPLAB, e verificate come funzionano con laloro simulazione.
reql=OOtOlllO r 0OIOlllOx2 - oolottlo
otol I too
rlf reg I ,F
tlotor r 100
fistruzione RRF
e la rlf ruotava a sinistra di un bit in un regi-
stro, la rrf lo fa verso destra. La posizione che
rimane libera a sinìstra viene riempita con il
valore del bit di riporto, che prendera iì valore
del bit che esce da destra. A seconda del valo-
re del parametro d, il risultato si scriverà nel registro di
lavoro W o nello stesso registro che viene usato per la
rotazione. Così come con ì'istruzione rlf, eseguendo
nove volte la rrf si torna all'istruzione iniziale.
#sK$t$px fl#ru L*gsYffi$*$xx*Ng $cffifr
Gli effetti da realizzare con l'istruzione rrf sono simili a
quelli già visti con la rlf; l'interessante inizia con un mix
delle due. Giocate con il bit di riporto e con le istruzio-
ni di rotazione per ottenere gli effetti della figura e
inventarne altre nuovel'onerazione di divisione e niir diff icile da vedere
intuitivamente di quella della mo tiplicazione, pero fun-ziona in uguale modo, anche se all'inverso, cioè ruo-
tando un registro verso destra si ottiene di dìvidere il
numero per due.
EFFETTO I
:s**####*Fs*&s#s##s#s&s###&s**##*s&s*#&*#* Ì
iI
I:5
EFFETTO 2
{s8rssq8&+#:ff::]i;,;:
s#s8*#*#s*&#s*&#
SeRAO=OsPegnereun diodo.
EFFETTO 3
;#*#**###:w****#dFsi*w#**{**e!ww##*#**
!
Differenti effetti con le istruzioni di rotazione
OPERANDO OPERANDOÀANETAONICO FONTE DESTINAZIONE
ÍdOperozione: rotozione o destro di un bit
del registro f, ufilizzondo il bitdi riporto C. Se d=O il risultoio si
loscio nel registro di lovoro W e se
d='l si loscio nello stesso registro f .
Cicli: I
Codice OP: 00 1 100 dfff ffffFlogs: C
Caratteristiche dell' istruzrone rrf
REGISTRO f
Vqlore iniziole registro f:l0l t 1l0'l
Volore iniziole C:U
Volore iniziole dopo l'istruzione rrf f, l:0l0l l1l0
Vofore di C dopo l'istruzione rrl î, lz,l
Raaaresentazione del funzionamento dell' istruzione rrf
Sw#&wsxlwse
Appli cazione pratica: sim ulazionedel primo programma
upponiamo, a questo punto, di non averedubbi sull'utilità del TMR0, sia per il modotemporizzatore che per il modo contatore, ne
sull'uso di interrupt; vediamo quindi i vantag-gi derivanti dall'utilizzo contemporaneo di
entrambe queste due risorse. Qui sotto proponiamo unesercizio in cui, fra le altre cose, il TIVR0 provoca unrnterrupt quando termina la temporizzazione che avre-mo programmato per esso.
Sfl**trf4À f,LffiTTffiXfl*Lo schema elettrico è molto semplice: è-+-r-.-^l+- l- ^^.+- ^ ror rnllonero l,in_)L6rd )LCrLd rd put Ld A Pqr LwilqvorE | il t-
terruttore, e la porta B per i LED, anchese potrebbe essere al contrario, o unmix di entrambe le soluzioni. RBO sarà
.il diodo che si accende o si spegne a
seconda del valore dell'interruttore:l'interruttore a 'l fara accendere il LED,
mentre a 0 lo fara spegnere. RB'1 sara
la linea che supporta il diodo LED che
lampeggia. Le linee di alimentazione, del quarzo e delreset, non sono riportate perche si danno per scontate.
rffigFg# **q#erugffiffiÉqffi&3&Nell'enunciato dell'esercizio non si dice nulla sull'obbli-gatorietà di lavorare con l'interrupt del TMR0, peronelle figure seguenti ne dimostreremo la convenienza,confrontando lo stesso esempio senza interrupt.
5i tratta di simulare una macchina che ha
un interruttore e due LED. Uno dei LED indica
in ogni momento le variazioni che si
producono sull'interruttore, e l'aitro lampeggia
ad una frequenza costante di 50 ms.
En u ncialo dell' eserc izio propos t o
G'
Schema elettnco dell'esercizio proposto
€onfigurazioneTMROPA ingressoPB uscito
Spegni RBI
Rifordo 5O ms
Accendi RBI
Ritqrdo 5O ms
*ó.
Spegni RBO
RAO=l?
Accendi RBO
Pr i mo orga n ig ra m ma d el l' eserci zi o p ro posto.
Sqp$#www*
Come si può vedere, le azioni sono prodotte in
modo sequenziale. Un lampeggio corrisponde ad
accendere un LED, attendere un certo tempo, spegne-
re il LED, attendere nuovamente lo stesso tempo, tor-
nare ad accendere il LED e così via. Se il programma
dovesse solo far lampeggiare un LED, questa sarebbe la
sequenza infinita da realizzare. I ritardi sarebbero chta-
mate ad una subroutine realizzata dal TMR0, poì biso-
gnerebbe aspettare che termini il conteggio per conti-
nuare con il programma. Nel programma pero, si
richiede anche dr riflettere lo stato di un interruttoremediante l'accensrone o lo spegnimento di un LED, e
questo va fatto prima o dopo il lampeggio, ma in ogni
caso in un momento diverso. Se decidìamo di utìlizza-
re il TMR0 con interrupt, il prìmo organigramma si divi-
de in due: uno con le azioni che riguardano il pro-
gramma principale, e l'altro con le azioni da compiere
nella routine di interrupt, quando il TMR0 va in over-
flow. Secondo questo organigramma si verifica conti-nuamente il valore dell'interrupt per accendere o spe-
gnere il LED corrispondente, e nello stesso tempo il
TMRO conta, per far lampeggiare l'altro LED ogni 50
ms. Le azioni quindi non sono sequenziali, ma simulta-
nee. e solo ouando ilTN/R0 termina di contare siferma
l'esecuzione del programma principale
npr arrendere o snennere il LED che
lampeggia. Sono state implementate
entrambe le soluzioni, con e senza inter-
rupt, anche se in questo esemPio non
ne possìamo apprezzare la differenza,
dato che ìl tempo che si perde nel lam-
peggio è di soli 100 ms. Se invece di
cambiare stato ogni 50 ms. lo avessimo
fatto ogni ora, avremmo avuto un'ora in
cuì anche cambiando valore all'interrut-tore, questo cambio non si sarebbe
riflesso sul LED, dato che il processore
sarebbe stato occupato nella routine dr
ritardo, e le transazioni dell'interruttorenon sarebbero state raccolte. La verifìca
dell'interruttore per cambiare rl valore
del LED, se necessario, si avrebbe solo
ogni due ore.
flse$$:Ks&"$w&KK*NHsffis $qffisKsYffix
Dopo aver analizzato i vantaggi di
lavorare con interrupt, concentriamoct
RSI
Cqmbio ilvqlore del LED
lniziolizzo TMRO
Resettq il flog
RifornE
Organigramma della routine di interrupt.
ConfigurozioneTMROInterruplPA ingressoPB uscito
RAO=l?
Spegni RBO Accendi RBO
Secondo organtgramma dell'esercizio proposto
$wSSw*wvw
-*''"'l
TMRO
TOIF
sTATU5
PORTA
PORTB
RPO
INTCON
OPTION_REG
TRISA
TRISB
UST
RADIX
EQU
EQU
EQU
EQU
EQU
EQU
lQu
EQU
EQU
EQU
movf
xorlw
mowuf
movlw
mOVf,Vf
bcf
retiie
bsf
movlw
movwf
movlw
movwf
movlw
mowrrf
bcf
P=16F84
HEX;
PORTB,O
b'00000010'
PORTB
b'001 I 1101',
TMRO
INTCON,TOIF
STATUS,RPO
b'00000000'
TRISB
b'00000001'
TRISA
b'0000011r'
OMON_REG
STATUS,RM
b"t0100000'
INTCON
b'0011 1 101',
TMRO
PORTA,O
SPEGNERE
ACCENDERE
0x01
0x02
0x03
0x05
0x06
0x05
OXOB
0x81
0x85
0x86
0
tNtzt0
tN't
ORG
goto
0R6
gor0
; Utilizziamo il PlC16F84
; Sistema di numerazione esadecimale
;ll programma inízia
; all'indirizzo 0
; Vector di interrupt
; lnverte il valore del LED
; Carica di nuovo il TMR0
; Resetta il flag
; Rientra
; Passa al banco 'l
; Porta B uscita
; RAO ingresso, il resto uscita
; Configurazione del TMR0
; Passo al banco 0
; Attivo gli interrupt
; per TMR0
; Inizializzo il conteggio
; Verifica se RAO = I
; 5e n0, spegnere
; se sì, accendere
;Programma di elaborazione dell'intenupt,
tNtzt0
crcL0
SPEGNERE
ACCENDIRE
m0vtw
movwf
m0vtw
movwf
btfss
90î0g0t0
brf
goto
bsf
goto
END
PORTB,O
ctcL0
PORTB,O
ctcL0
Schema elettrico dell'esercizio Drolosto
$*$swrssww
INTCON
OPTION
CATCOLO DEt VALORE DEt TMRO
99",n:=*l-9","Q9.".o,ui*"*..*."",,-.-..-"-".-
50.000/25ó= I 95,3 I 25= I 95
l_L0"99".qu* _00t I r r00001I I l0l
Jrg:fgln-q:-ig"ls,J-n!sr"g-lg*d!,-.-..--.--..-.Volore che si vuole contqre.
Volore che si vuole conlore in binorio.
Complemento o 2 del volore do coniore,
do inserire nel TMRO.
Registri necessari nel programma, con i relativi valori
dello stato dì RAO; il programma
rimane all'interno di un ciclo infinito.
5g$4iliLSaH$*ruffi*flL Fà$q##ffi&$,tSiB&
Per la simulazione ricorreremo ad unnirrnlo tnÍ'co' ,anrite le finestre del
listato del programma, dei registri
specif ici, del clock e quella per l'intro-duzione di stimoli asincroni, quindi
configurate la linea RBO come inter-rr rrfnra (imrrl:to l'nnu i611g di anima-
zione e verificate che al variare del
valore di RAO, lo faccia anche il bit 0delìa porta B.
La verifica dell'interrupt nvece è
piu complicata: dopo un po'di
sulla realizzazione del programma. Nella figura sono
riportati i registri necessari e il valore che assumono.
Sarà necessario configurare l'rnterrupt del TMR0, abi-
litando il bit GIE e ilT0lE del registro INTCON. Se le tem-porizzazioni saranno di 50 ms, potremo caricare il divi-
sore di frequenza con un valore di 1'.256 e giocare con il
valore che deve contare il TN/R0, che sarà 195. Ricordate
che una cosa e quello che il TMRO conta, e un'altra e il
valore con cui bisogna caricarlo per farlo così contare.
Bisogna prestare attenzione agli altri parametri del regi-
stro OPTION. oer fare in modo che il TMR0 conti come
voglramo
ffffi#ffiffieffiffi&Dopo aver visto i preliminari, passia-
mo al programma in sé. Defrnite le.,-.i-t-iri ^ ^^-i-i^^îrO il VeCtOf divót tóurt I c PU)r4rur to L
interrupt, iniziamo con la routinededicata all'interrupt. Si utilizza l'istru-zione "xorlw", mettendo un 'l nella
posizione adeguata, per invertire il
valore del LED collegato a RB1 Prima
di rientrare dobbiamo caricare ilTMR0con il valore calcolato in precedenza,
per fare in modo che conti nuova-monto EO m< o nnrré : zarnil flen cho
indica che il TMRO è andato in over-
flow. Nel programma principale, dopola configurazione dei registri e il carì-
co del TMR0, controlliamo il valore
del LED montato su RB0, a seconda
tempo la finestra del clock indica
appena qualche m llisecondo, e come ricordiamo il
TMR0 è stato impostato per far variare RB'1 ogni 50 ms,
che a noi paiono pochissimi, ma per ìl simulatore signi-
ficano diversi minuti. Fermate quindi la simulazione e
utilizzate la finestra di "modify" per cambiare il valore
di TMR0, impostandolo vicino a l'overflow" Tornate a
simulare iì programma, e verificate che di lì a poco RB'1
cambi di valore.Tornate a modifrcare il TN/lR0 nello stesso modo se
volete far commutare nuovamente RB1, oppure arma-+^,,, ^ri ^--i^^-- ^ r-.-iltelO evOlvere da SOlo.LCVt Ut VOZtCtt4O E rO)Lr(
Per provare il programma dovremo ricorrere ad un piccolo trucco.
Se#sw"*swrw
lFl
n t tiuoper Tt'll
inizia-
Se BfiB5A nO,altrinl
ffifi'.=jF]= ::.'..,:...,' :, ::.=ltrJnJSFB Ndme Hex Dec Bitrary :tm-$ 1 g 1ó €861 8{69ù41 13 2? g6E"l-r911
DFlicî_reg !? ?siitug tB 24f5r 60 B
portò É0 6trisa 61 Jportb 69 Itrlsb 5B úeedrta Sfi É
eecon l gB B
eeadr 5g 5eecsnz Bg 6pclrth 6S Iitrtcúr É€ lé8 1€195É9És 3D éf BdJ!1íCllúpre É$ lì? 11slJg6'l
-- _ - - -: ::_-- I Cycler i1076ze10 I
Preelg Frewmt 4.ft0tlfil0 HHz
/ q|gar On Fe€{
Stbtr6lP' Shq 7
Slin 10 (Pl . Slin 11 fPl
ttat,all:aa,aaaaarallrNrAij';',f:::::::::;::;:ì:ì;:;llllllttatai,é&&atirflllllrrrlìììi11111r!1ììììììd;1irrrrril$lllrllììììrrìrì
,4.: ) .::::.;,:.:
,::a:.:.:.:...
'::::.,:"': '
::,,:'::',r::i,:. :.l'.i'.:..:.-' .:..
:ì:i:::ì1.::a:: ì
i::,,,.ì,Ul
opo aver visto tutte le istruzioni,
mento e il modo di utilizzarlenrespntramo rrn riassrlnto che
il loro funziona-correttamente,risulterà molto
utile al "nornento dr prograrnmare, dato che raccoglegli aspetti fondamentali di cui bisogna tenere assoluta-
menle conro.
SPIEGAZIONEATTIVAZIONE
DEf ,FLAGS
f\t^ -7
MNEMONICO: PARAMETRO
oddwfondwfclrfclrwcomfdecfi ncfiorwfmovf
mowvfrlfrrfsubwfswopf
t.lf,df
f,df ...1
ÍtfÀf,dfTAIJfJÍJ
lstruzioni che gestiscono regisiri
ì SOMMA W con fAND di W con fCANCELLAZIONE dif
: CANCETLAZIONE diW, COUPLET\AENTO di f] DECREMENTO di fI INCREMENTO di flORdiWconf] SPOSTAMENTO di f: SPOSTAMENTO do W o fì ROTAZIONE o sinistro con corry
KUlALlLJl\E o Oesîro con corry
I SOTTRAE W do f (f'W)i INTERSCAMBIO dei 4 bit +
, significotivi con i 4 - significoiivi
: OR esclusivo di W con flstruzioni che gestiscono i bit
r IMPOSTA o 0 il bit b di f: IMPOSTA o I il bit b di f
lstruzioni che gestiscono operondi immedioil: SOMMA di leiterole con W: AND di letterole con Wi OR di letterole con Wi SPOSTAMENTo di leiterole o wi SOTTRAE W do letterole {KW}I OR esclusivo di letterole con W
lstruzionidi soltoi TESTA bir b di f; sALTA se 0
: TESTA bit b di f; SALTA se I
, DECREMENTA f;
: SALTA se 0
I tNCnrurNtR f;: SALTA se I
lstruzioni di controllo e specioli. CHIAMATA o subroufine
CANCELLAZIoNE del WATCHDOGSALTO od un indirizzoNO OPERATION
RITORNO do interrupt
RITORNO losciondo un letterole in WRITORNO do subroutine
IMPOSTA il microprocessorein stondby o stoto di riposo
(-aL
Z
Z
ZZZL
L
(-(-
î f-\î 7
t .'l
thf,b
: bcf: bcf
b
b
xorwf
oddlwondlwiorlwmovlwsublwxoflw
btfsc
btfss
decfsz
incfsz
k
k
k
K
K
k
iC,tZIZ:
.C,:Z
DC, Z
ÙC, Z
TO#, PD#
TO#, PD#
f,d
' coll
I clrwdt
I goto
, noP
r retfie
r retlw
; return:l: Sleep
rk:,
"t-
lstruzioni del PlC l6FB4
Tffssfu m$$sa w$swss*s#*s$eew e*il,**& $m &w*was;sx*s* s
I momento di realizzare un particolare pro-gramma, i registri sono tanto importanti quan-to le istruzioni. Nella tabella pubblicata in
sono riassunti tutti iregistrr specificiRAM, con la situazione di ognuno dei
\_luc)Ld pdvil rd
della memorialoro bit
NOME BrT4 i tot ; Brr2 i err
ì OOh INDF
TMRO
PCL
STATO
FSR
PORTA A
PORTA B
EEDATA
EEADR
PCLATH
INTCON
INDF
OPTION
PCL
STATO
FSR
TRISA
TRISB
EECONI
EECON2
PCLATH
INICON
, 0rh
a2h
03h PD#
RA3
RB3
Z:
:
RA2 :
KÓIi
DC
RAI
RBI
C
05h
0óh
07h
08h
09h
0Ah
0Bh
B0h
Blh
ótn
óJn
B4h
B5h
Bóh
87h
8Bh
B9h
BAh
BBh
: RAO
:RBO/INI
trtrttr INTF RBIF
Dn++tvÍ DC C
_1l^rhVVK KU
:l;
INTFTOIF RBIF
Registri della memoia RAM.
Y*efuw$*w r&wsmaewss&xrw dq*$ ryww&mffw$ ds&Hm #s*#$&*#iir$#éì #e&ffi#&
Tutti gti interruptlnsleme
tiamo arrivando al punto culmi-
nante della programmazione
con i microcontroller; mancano
solo alcune piccole risorse per
conoscerne tutti t suoi segreti. In
questa occasione combineremo tutti gli
interrupt in un unico programma. Le appli-
cazioni che stiamo facendo sono sempre
più complicate e professionali. lmmaginate
il seguente esercizio implementato.
Schema elettricodel l' eserciz io p roposto
o
5i vuole simulare il funzionamento dell'allarme di una macchina.
5i utilizzeranno quattro sensori collegati ognuno ad una porta, un cicalino,
quattro LED e un pulsante. Aprendo una delle porte si attiverà un
cicalino a intervalli regolari, sino a che non venga premuto il puhante di stop.
lnoltre si accenderà un LED conispondente
alla porta aperta e si scriverà questa informazione sulla EEPROM.
Tutto il programma verrà fatto utilizzando gli interrupt.
Enunciato del programma proposto
s{F{ffiffie g,&-ffi?$qxfl#
Anche lo schema elettrico si sta complicando progressi-
vamente, in questo esercìzio si utilizza la quasi totalita
della Porta A e Ia maggior parte delle linee della porta B.
La loro scelta, come mostra la figura, non e casuale,
infatti, sugli ingressi da RB4 a RB7 dovranno essere col-
Iegati i sensori delle porte per generare interrupt; su RB0
invece collegheremo ìl pulsante di stop dell'allarme. I pin
da RAO a RA3 si utilizzano per mostrare lo stato dei sen-
sori delle porte: RAO mostrerà quello di RB4, RA1 quel-
lo di RB5 e cosìvia. Questa scelta, anche se non è obbli-gatoria, facilitera la programmazione. Collegando il
cicalino su RA4, potremo configurare la porta A come
uscita, e la porta B come ingresso, facilitano così ulte-
riormente le cose. Dovranno essere collegate anche le
linee di alimentazione. il cristallo di quarzo e il reset.
#ffi*eru€ffiffi&lb$rd&ffi tr{- trffi#ffi *a&ffi tu?& ÈFKg*$il3tr&LfrL'organigramma principale, come si puo verificare nelìa
figura a lato, è molto semplice, come accade quasi sem-
pre quando si lavora con interrupt, dato
che il peso del programma ricade su que-
sti ultimi. Uunìco interrupt che non e atti-
vato dall'inizio, e il TMR0. La traduzione
dell'organigramma in assembler sara
immediata. Uno degli interrupt porra a 1
l-,,-.i-Air^ ,,.-r',\,,,, ^,,-"rdo cambia il valo_td vdIduilc )Lr rvr quol
re dello stato dei sensori, indicando che
dobbiamo scrivere un nuovo valore nella
EEPRON/. ouindi ci sarà una chiamata ad
una subroutine che realizza questa funzione. In ogni caso
per risolvere questo esercizio, bisognerà pensare molto
bene a quale sarà il compito di ognuno degli interrupt
Lorganigramma che rappresenta la routine di servizio
all'interrupt, potrà servire da base per qualsiasi programma
che lavori con piu dì un interrupt, dato che e molto gene-
rale. Se si lavora con solo due interrupt, potremo soppri-
mere le richieste corrispondenti a quelli che non sono uti-
lizzali, e il resto sarà invariato. È importante rendersi conto
che ogni interrupt è
indipendente dagli
altri, e che quando se
no nrndraè rnaì nÒn
se ne possono pro-
durre altri sino a che
non sia terminato il
trattamento dei
primo. Saranno leazioni corrispondentiad ogni interrupt, a
---ki-"^ ,-l- ,,^/r^LdI tutdtc ud urr ov-
^li---;^^^ -,1 ,,^,-lpilLdztu|c du ur or-
tra. Vediamo l'or-ganigramma corrispondente ad ogni interrupt per il
nostro esercizio.
g&èY*:ffi&UPY fffi$q gtrPffi{3ffi
lnizieremo dall'interrupt per fine di scrittura nella
EEPROM, perché in questo caso e il piu semplice.
Quando si termìna di scrivere il valore dello stato delle
cdfiguEzionefMROInErrupt9A uscibPB ingrss
e s€Rrvl:l? O
Sclvo shto
Organigramma del programmap ri n cì pa I e d el l' esercizi o p roposto.
Sw6*wwryw
o "iTl- É
Per84-ù7 a '-l;! ÈÉ
'."T11,ff*' o ,ilià, ffi
Troft l'inÈnuÉ trofro l?i.tèrruprper TMRO pèr EIPNOM
Organigramma della routine di interrupt
Scrivi = O
Organigramma deltrattamentodel l' i nterru pt per E EPRO M
porte della macchina, aperte o chiuse, dobbiamosolo ritornare a impostare il valore della variabile"scrivi" a 0, per fare in modo che non avvenga unanuova scrittura del valore sino a che quest'ultimonon cambia.
g$\éYffi ffi $qaj pT ptrK ?$4 $q*
Per quanto riguarda il caso del TMR0, è già stato pre-sentato un esempio simile. Se vogliamo che il cicalino
Spegnete <icolino
Disdtfivore interruplIttRo
Di.qttivore interruptRB4-RB7
si accenda e si snenn;ad intervalli regolari,utilizzeremo il TMR0per controllare questo tempo, e al prodursi dell'inter-rupt invertiremo il valore del cicalino. Prima dì tornareal programma principale il TMR0 dovrà essere inizializ-zato nuovamente, rn modo che, quando andrà inoverflow, cambi un'altra volta il valore del cicalino.
gru?ffiffiffi{"3$3r pfr& ffiffi*Se l'utilizzatore attiva il pulsante collegato su RB0, signi-fica che vuole fermare l'allarme perché, ad esempio, è
Dovreno quindi disattivareper fare in modo che nonFaremo la stessa cosaper glr interrupt su
R84-RB7 per i sersoricollegati alle porte.L'allarme sarà disattiva-to sino a che non si
provochi un reset del
sistema.
gNYtrffiffiA"$PYpffiffi ffiw&-ffiffi7
Questo è l'interrupt più
complicato del nostroesempio, dato che e
quello che deve tenerconto di più cose. La
prima sarà di mostraremediante i LED il valoredelle porte: aperte o
chiuse. Per fare in
modo che il TMR0possa cambiare il valo-re del cicalino lo dovremo inizializzare, e attivarlo su
interrupt. Ponendo la variabile "scrivi" a 1 , si otterràche nel programma principale venga attivata la scrit-tura del nuovo valore delle porte nella EEPROM. Nelcaso non venga premuto RBO, qualsiasi cambio si
produca sulle porte, sia in apertura che in cnrusura,tornerà a far saltare all'interrupt, e a scrivere unnuovo valore nella EEPROM.
trffi#ffi$q&f.,$&$e
ll programma che risolve il nostro esercizio è una ricom-pilazione degli organigrammi commentati, una voltapassati in assembler. Dopo averlo risolto ci sembrerà la
piu logica delle soluzioni.
lnverti volore cicolino
lniziolìzzo TMRO
Organigramma per iltrattamentodel l' interru pt per TM R0
stato lui a provocarel'allarme, quindi spe-gnerà il cicalino. Nondobbiamo dimenticareche, se non facciamonulla, il TMR0 conti-nueraacontareeadandare in overflow,producendo interrupt e
tornando ad accenderee spegnere il cicalino.
gli interrupt per TMR0,se ne producano più.
Accendere LEDsecondo porte aperte
Iniziolizzore TMRO
Attivore interrupt IMRO
Scrivi = |
Accendere cicqlino
O rga n i g ram m a del tratta mentodell' interrupt per R84-R87.
O rga n ig ra m ma del tratta mentodel l' i nterru pt per RB).
Sw#*wwww
Lt5 | P=16F84
RADIX HEX
; Si utilizza il PlC16t84
; Sistema di numerazione esade(imale
WR
WRTNEEIF
UIE
RBIF
INTF
TOIF
RBIE
TOIE
WIRPO
EQU
IQUEQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
TMRO
STATUS
PORTA
PORfBEEDATA
EEADR
INTCON
OPTION_REG
TRISATRISB
EECONlEECON2
rQUEQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
IQU
ORG
gotoORG
goto
0x0t0x030x0s0x060x080x09OXOB
0x8'l0x8s0x850x880x89
0x0cOXOD
OXOE
0
tNtzt04INT
EEADR_VAR
IEDATA_VAR
SCRtVl
: ll oroqramma inizia al-
i l'ihuirizzo o
; Vector di intenupt
;Programma di trattamento dell'inten-uptINT
- btfscq0Io6tfsc00t06tfscgotog0r0
INTCON,RBIF
T_RB4_RB7
INTCON,INTFT_RBO
rNTC0N,T0ttT_TMRO
T_EEPROM
PORTS,W
b'00001 1 I 1'
PORTA
b'0011 1't0f'TMRO
INTCON,TOII5CRtVt,0
PORTA,4
TORNARE
PORTA,4
INTCON,TOIE
INTCON,RBIE
TORNARE
PORIA,W
b'00010000'PORTA
b'001 1 I 10'l'TMRO
TORNARE
5CRtVt,0TORNARE
T_R84-RB7 swapf
andlw
movwfMOVIW
mow'rfbtbsfbsfg0î0
bcfbcfbcfg0r0
movfxorlwmovwfmovlwmovwfgoto
; ll valore dei bit piu siqnificativi pasa
ia quelli meno siqnificàtivii si iancella il valóre dei bit meno
; siqnificativi; 5i passa il valore degli allarmi alla PORTA A; Si carica di nuovo il TlVlR0
; Si attiva l'interrupt del TMR0
;5i imposta SCRIVI a 1
; 5i attiva il cicalino collegato a RA4
T_RBO
T TMRO
; 5i inverte il valore del ckalino
; Si carita di nuovo il TMR0
T EEPROM bcfgoto
Soluzione del programma proposto
Sw$*qesqxvw
$3U Lr i""èAt*f1i il t3il g_ í?fr*sHe,&l.Ì.ÀNella simulazione, come sempre, dovremo aprire una
serie di f inestre per vedere come viene eseguito il pro-gramma. Utilizzeremo l'opzione di animazione per
poter simulare l'apertura di una porta e vedere comeviene mostrata l'informazrone istantaneamente sullaporta A, oltre all'attivazione del cicalino
Per verificare la scrìttura dell'informazione nerra
EEPROM, dovremo attendere piu tempo, cost come per
vedere cambiare valore al cicalino. Quando vorremo,
ootremo Oremere RBO e osservare come l'allarme cessi
di essere oneralivo anche se continueremo ad :nrire p
a chiudere le oorte.Un momento della simulazone
movfandlwmovwfhsfbcfbcfretfie
bsfmovlwmovwfmovlwmovwfmovlwmovwf
INTCON,Wb'11f10000'INTCONSTATUS,RPO
EECONI,EEITSTATU5,RPO
STATUS,RPO
OXFF
TRISB
00TRISAb'01000't r 1'OPTION_REG
b'1 r01 1000'INTCON
STATUS,RPO
5CRrVr,0
ctcL0SATVARE
00EEADR_VAR
PORTB,W
b'00001 1 1 1'
EEDATA_VAR
SCRIVI_EEPROM
crcL0
EEADR_VAR,WEIADREEDATA_VAR,wEEDATA
STATUS,RPO
INTCON,GIEEECONl,WREN0x55EECON2
OXAAEECON2
INTCON,GIEEECONl,WR
EECONl,WRENSTATUS,RPO
; Passo al banco 1
; Resetto il flaq; Passo al banó 0
; Passo al banco 1
; Porta B ingreso
; Porta A uscita
: Confiqurazione TMR0
I e fronie di interrupt
: Attivazione deqli intenuotI per RB4.R87
; Cambio al banco 0
SCRIVI EEPROM
movlwmovwf
bcf
btfssg0r0g0r0
movlwmovwfswapf
andlw
movwfcallg0r0
movfmowvfmovfmovwfbsfbcfbsfmovlwmovwfmovlwmovwfbsfbsfsreep
bcfbcfreturn
END
; 5i sposta l'indirizzo; al siro reqistro; 5i sposta il dato;al sùo reqifro; Passo al 6anco 1
; 5i disabilitano qli interrupt; Permesso di scrìttura; Inizio della sequenza
; obbligatoria dí; slcurezza
; 5i abilitano qli intenupti ordine di sciittura; 5i pone in stato di riposo; da cui si uscirà con ùn intenupt; Disabilito la scrittura; Torno al banco 0
Soluzione del programma proposto (continuazione)
Sw$*wwrsp
subroutines e degti interruptGti organigrammi delle
gni volta che si pianifica un nuovo program-ma, la prima cosa da fare è realizzare unnuovo programma. Alcune volte è statofatto quello generale, in modo piu o menodettagliato, altre volte quello delle routines
di servizio all'interrupt. Pero non è mai stato specificatonulla per quanto riguarda la realizzazione congiunta, né
sono stati fatti gli organigrammi delle subroutines. Ora
€onfigurozionePA ingressoPBO ingressoRBI -RB7 usciteinterrupt
blli RAO=l? NO goio
Mostro O su PB ccll disploy
Ritordo
btfss
RAI =l?
coll ritordo
NOs_919
Traduzione automattcadi un organigramma in codice assembler.
che abbiamo l'esperienza di diversi esempi, conosciamotutte le istruzioni e Ia struttura della programmazionecon rl PlC, possiamo arrivare sino rn fondo a questo utilestrumento che sono gli organigrammi.
fl*se f4&sfl*$i,g {3ffi t$ ru #ry#eeé3#ffi&r4ffieNella sua presentazione abbiamo già visto che un orga-nigramma è formato da rettangoli e rombi uniti da frec-ce, e che queste devono seguire delle norme perche il
tutto risulti sintatticamente corretto.
Questo pero non basta, perché a partire dall'organi-gramma principale, da quello delle subroutines e da
quello degli interrupt si dovrà poter passare al codiceassembler quasi automaticamente. Questo tipo di cor-rezione sarà la semantica.
Ogni rettangolo si trasformerà in diverse istruzioniassembler o in una sola istruzione "call", da cui deriveràuna subroutine.
La scelta fra una cosa e l'altra dipenderà dal livello di
complessità del programma, e dalla ripetitività o menodelle azioni da realizzare. Nel nostro esempio, mostrareun numero su un display o realizzare un ritardo sonoqtrnrltrn7p mnltn r iilizzale nlindi l'rrsn di sr tbroutine e
adeguato per presentare il programma in modo leggi-bile, e per risparmiare codice, evitando la ripetizionedelle istruzioni.
I rombi a loro volta si trasformano in istruzioni disalto condizionale: btfss, btfsc, incfsz, ecc. dopo le quali
si posizioneranno due istruzioni "goto", una per ogniramo del rombo. La presenza degli interrupt è dichiara-ta nel primo rettangolo, pero in nessuna parte dell'or-ganigramma troveremo la chiamata alla routine di ser-vizio dell'interrupt: ricordate che un interrupt non si
chrama.
ti#$q#r g &wet&{'& & #f €_1f s{.$ f ge#{.}Tgr f sA prima vista, l'organigramma principale e quello dellasubroutine sono simili.
Si differenziano solo nel primo e nell'ultimo rettan-golo.
S,ep#&e*e'www
€ONT- I 5
TMRO *OO
INTCON(2)= l?
INTQON(2) *O
CONI + CONT-I
CONT=O?
oTornq
Esempio di un organigramma di una subroutÌne
Nella subroutine normalmente non è necessario
configurare i registri e le altre risorse, pe'che questo è
già stato fatto nel programma principale; a volte pero,
quando si utilizzano le linee di ingresso/uscita per
molte periferiche, e necessario riconfigurare le linee
nella medesima subroutine. Lultimo riquadro di una
subroutine indrcherà il rrtorno al programma principa-
le. Sopra l'organigramma si riporterà il nome della
subroutine, così come viene chiamata dal programma
principale.
ll resto delle norme, come terminare in un unico
riquadro, o che i rombi abbrano due rami. sono le
$w$s'*wwtrw
medesime dell'organigramma principale. Possono
essere utilizzati sia gli organigrammi che le subroutines,
anche se non sempre sono necessarie.
$-"*Fqffi&ruxffi $a&e$ M& ff}trG$-a xrux"gffi mffi p€
Così come c'è un solo organìgramma princìpale, c'è
una sola routine di servizio per gli interrupt. Se lavoria-
mo con più di un rnterrupt, la prrma cosa da fare è veri-
ficare quale ne sia stata la causa, come abbiamo già
visto in precedenza. testando ad uno ad uno isuoiflagsino a trovarla. Ogni causa anche se non era di per se
una subroutrne, generava un organigramma che ne
spiegava il funzìonamento. A volte è necessario anche
realizzare delle operazioni in più, come scrivere i valori
di alcuni registri prima di risolvere l'interrupt, i quali
potrebbero essere modificati nel corso dell'interruptstesso.
RSI
Scrivere registrodq modificEre
Determinqre ls cousqe risolvere
RestourEre ivqloridei regisrri sqfusti
€oncellore flogdi inferrupt
Tornore
Organigramma generale della routine dedicata all'interrupt.
Applicazione pratica:uscita dal modo di riposo
ffi bbiamo gia dovuto,w.WW flcorrere a questa pre-
ffi ffi ziosa risorsa (il modo di
ffi riposo) quando abbia-
W %m mo lavorato con gli
interrupt, come modo miglrore per
lavorare con essi. Bastava porre l'i-struzìone "sleen" ner entrarci e ave-
vamo diverse forme per uscirne. Si
ulilizzava nei casi in cui il processore
doveva rimanere inattivo durante unperiodo indeterminato di tempo. In
questo caso ci occuperemo dei duebit situati nel registro di stato che
serviranno per determinare qual è
stata la causa che ha portato il pro-
cessore rn questo letargo.Schema elettrico dell'esercizio Droaosto
s{${rMA rg_fiYv&xfi#
L'unica cosa chiara oer il momento è il numero diingressi e di uscite che sono necessarie. Un sensoredovrà contare il numero di pezzi, ricordiamo che ilmodo mìgliore per farlo è utilizzando il TMR0, per
cui gli impulsi dovranno entrare tramite RA4. lnoltreavremo un pulsante per mettere in marcia il sistema
ogni volta che si completa un gruppo di pezzi.
Anche se non sappiamo ancora quale interrupt uti-lizzeremo, possiamo comunque prevedere RBO asse-gnato a questo pulsante. ll cicalino utilizzerà un'altralinea, questa volta di uscita. Le Iinee di alimentazio-ne, il quarzo e il reset si dovranno tenere in contonel montaggio finale.
$R&eNX&ffi&ffi ffi g A3KL PK#6&&M$'gAPrima di fare l'organigramma dobbiamo leggere conattenzione l'enunciato e pensare a quello che già cono-sciamo. Anche se ora sappiamo lavorare con gli inter-rupt, non è detto che debbano essere utilizzati in tutti i
programmi, né che si debba usare l'istruzione "sleep"
ogni volta che c'è un interrupt. in questo caso, ad
esempio, abbiamo pensato che non c'è ragione per
implementare l'interrupt del TRM0, perché non ha
ragione d'essere, inoltre dovremmo attendere all'inter-no di un ciclo che q:esto si produca: ricordate che nonpossiamo mettere in stato di riposo, perché il TRM0smetterebbe di funzionare. Dopo ogni gruppo di diecipezzi tl sistema deve rimanere fermo sino a che viene
5i vuole realizzare un pro(esso industriale che consiste
nel contare gruppi di l0 pezzi.
Ogni pezzo attiva un sensore al suo passaggio.
Quando ilgruppo è completo siferma la macchina,
fino a che non si preme un pulsante,
5e va in overflow il Watqhdog, si attiverà un cicalino,
ad indicare un'anomalia nel sistema,
En u nciato del I' esercizio p ro posto
SaS*wsr*
ConfigurozioneRA4 ingressoRBO ingressoRBTusciloTMROinferrupt RBOWDT
TO#=O? Accenderecicqlino
Spegnere cicolinoiniziolizzore TMR0
TOIF#=l?
TOIF=O
Riposo
Organigramma del programma principaledel I' esercizio proposto.
premuto un pulsante. Qui sì che possiamo
attendere con una "sleep", dato che l'in-terrupt tramite RBO ci toglierà da questo
stato. Nell'enunciato, inoltre, si dice che
dobbiamo indicare con l'attivazione di un
cicalino le anomalie del sistema, anomalie
Sw#swwws
che saranno rivelate quando il
Watchdog andrà in overfìow. Se all'i-nizio del programma si verificherà il
valore del bit TO#, ed esso corrispon-de a 1. sapremo che si è arrivati a que-qtÒ nrrnto ner rn overf low delWatchdog e non per l'evoluzione nor-male del programma. Nel nostro casocapiterà quando si tarda troppotempo a contare il gruppo di 10 pezzi,
oppure quando si tarda troppo a pre-mere il pulsante dopo aver terminatocon tale gruppo. Una volta attivato, il
cicalìno non si fermerà sino a che non
si inizializzera il sistema, e questo faràcambiare il bit TO#. Per quanto riguar-da l'interrupt di RB0, serve unicamenteper fare in modo che il sistema esca
dallo stato di riposo. quindi il suo orga-nigramma contiene solo le istruzioniprincipali. Visto che configuriamo soloquesto interrupt. quando si produce.
non dobbiamo ricercarne la causa.
ffi$q#ffiffiSe&4ffie
ll programma si risoìverà come ripor-tato nella figura. La configurazionerappresentata nel primo quadro del-l'organigramma si risolve con i corri-spondenti valori in TRISA e TRISB perlo nnrio rli innroccn,--- -f usctra, e con I
valori di registrì OPTION e INTCON.
Nel primo. il divisore di frequenza si
configura al massi-
mo, non per il
TMR0, ma per il\A/:frhdnn (i <no-
cifica, inoltre, cheil TMR0 si incre-menterà con gliimnrrl<i o<torni rho
arnvano tramrteRA4, e che il fronteattivo sarà il frontedi discesa, cioèquando il pezzo ha
Organigrammadella routine di interrupt
LIST
RADIX HEX
P=1 6t84 ; 5i utilizza il PlCl6t84
; Sistema dì numerazione esadecimale
;ll programma inizia
; all'indirizzo 0
; Vector di interrupt
; 5i passa al banco f; RBO ingreso, il resto uscita
; RA4 ingresso, il resto uscita
; Configurazione di TMR0 e WDT
; Attivazione dell'interrupt
; 5i pasa al banco 0
; Verifico il valore di T0#
; Sequenza normale
; ll WDT è andato in overflow
; Disattivo il ckalino
; Carico il complemento a 2
; del valore da contare
; Sono passati l0 pezzi?
; No, aspetta
; 5i, resetta il flag
; e metti in riposo
; Arcendi il cicalino
; Entra in un ciclo
; Resetta il flag
; Torna dall'intenupt
TMRO
T0rt
TO
STATUS
PORTB
RPO
INTCON
OPTION_REG
TRISA
TRISB
INTF
0x01
0x020x04
0x03
0x06
0x05
OXOB
0x81
0x850x86
0x01
0
tNtzt0
4
INTER
5
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
ORG
gotoORG
g0r0
ORG
btfsc
9010goto
bcfMOVIW
mowrrf
btfssgotobcf
sleep
goto
bsfgoto
bcf
retfie
END
bsf
movlwmovwfmovlwmowvfmovlwmowrrfm0vtwmowvfbcf
STATUS,RPO
b'00000001'
TRISB
b'00010000'
TRISA
b'If 1'Í000'OPTION-REG
b'f0010000'
INTCON
STATUS,RPO
5IATU5,TO
NORMALE
ATTIVARE
PORTB,T
0xF6
TMRO
INTCON,TOIF
crcL0INTCON,TOIT
ALTARME
PORIB,T
ALTARME
INTCON,INTT
Soluzione del programma proposto.
terminato di passare davanti al sensore. L'interruptner RB0 si confrorrra a sua volta con il fronte di
discesa, e si disattiveranno le resistenze di pull-up. llresto del programma e una traduzione quasi imme-^l; -+- -l^^li ^"^-^;^".urdrd ueqil orqdf ìrqrdmml.
SgSli Lè;.:** g ilsil1 F**Sffi&$j$ H&Per realizzare la simulazione in questo caso dobbiamoaprire le finestre degli stimoli asincroni, per simulare il
passaggio der pezzi e il pulsante di messa in marcia del
sistema; notate che abbiamo aggiunto anche la linea
di reset del microcontroller, per poter osservare una
cosa molto particolare che commenteremo più avanti.Tramite la finestra dei registri faremo attenzione al
vaìore che prenderanno i bit TO# e PD#, oltre all'evo-luzione del TMR0 e all'atiivazione del cicalino. Nondimenticate di assicurarvi che il Watchdog sia attivato.
Eseguite il programma con l'opzione di animazio-
li*$È:ars*r*
ne. Dopo la configurazione delle risorse. il
programma entrerà in un ciclo aspettandoche passino i 10 pezzi. Non uscirà da questo
ciclo fino a quando non faremo 10 doppi clic
sul pulsante RA4. Se si configura la linea
come pulsante, invece di interruttore, baste-
ranno la metà delle oulsazioni. Osservate che
ogni volta che si realizza una doppia pulsa-
zione si incrementa di 1 il fMR0. Si arriva così
allo stato di riposo, momento in cui cambia ilvalore del bit PD# (bit 3 del registro di STATO)
passando a 0. All'inizio del programma era a
1. Dopo breve tempo, cliccate RBO, vedrete
che il programma inizia di nuovo. Se oravogliamo verificare l'overflow del Watchdog,
dovremo, come gia altre volte, aspettaretroppo tempo, trattandosi di una simulazio-
ne. Per questo utilizzeremo un trucco: cam-bieremo il valore del divisore di frequenza,
mettendo in OPTION il valore ''l 1 1 1 1 000'.Dovremo nuovamente assemblare il pro-gramma. Eseguire un'altra volta I'applicazio-ne, però in modo rapido (Run) e questa voltanon cìiccare il pulsante RA4. ll Watchdog tar-derà l'aoorezzabile cifra di 1B ms ad andarern overflow. Prenderemo la finestra di clock efermeremo la simulazione, nuovamente, per
vedere i risultati. ll programma deve rimane-re nel primo ciclo, e se si manda di nuovo in
esecuzione con l'animazione vedremo che di
lì non esce. fO# (bìt 4 del registro di STATO)
Programma in stato di allarme, dopo che è andato in over-flow il Watchdog.
dovrà avere valore 0 per indicare cheè stato prodotto un nuovo overflow, e
il cicalino essere attivato. PulseremoMC LR oer resettare il sistema e vedre-mo che il programma prosegue rifa-cendo la stessa cosa. Questo perché si
verifica all'inizio il valore del bit TO#.ed esso non cambierà frno a che nonsi scollega I'alimentazione: non bastapulsare il reset. Nella simulazione,scollegare I'alimentazione equivale a
scegliere I'opzione Debug>SystemReset. Iniziare una nuova esecuzione.rntrodurre dieci pezzi però senza pre-mere il pulsante RB0. In circa 18 ms
dovrebbe rioetersi la stessa cosa.
Preparazione delle finestre per la simulazione
SbbrkFryÈkt ll H ltirùra jpcr 6ffi1ff rqEh_q € ?s rirrthstE € a ffin
a mFr.-affihlr. il rù
-lfiFs àa i* tm ::H$-tffirl*trtam::@i a a m
- a *N - a ffiFfl É
' ffi
shF ra r* tù.È* 9a l* rFEthrÈ s 5 ffi
i*d::-.-..:... ,. .:. : d.€
kC *n,l ì Ols-ttl- .
nd$ ùFa i q*ia. Èd rna i èl salsbEs lFl$,talf ituE.St. Èaclo ì h" -+tt:kf t*tq.tala ì s, Fs.ttaq
Ft. ùlÈ
#:
ntm!t E nl1htr 6 Ufillllt Îa 5n :::rtffi*4ffi,
isilaùn|m:Fbrarlfn,t$nrffi:ùtl:lmn':
nlmi.ìtffi,.tam:rtm:ra 1* rmta ìFt à ilttma rM14Sf
Ft
{A
slam.n : kifi6 ÌmE I s{ftr rmE i sltFÈa È::,antw : ll sl I i-=
nn,, ì las*tihsa iFl6il:lilt ; *l S*L
lr5 Ef ma.t i ed r
ih l[ff i Éttr. ùE l||tt{,lm : htt ll:
Programma in attesa che sia premuto RB)
$of*rrr:re
File di intestazione
file di intestazione sono uti-lizzati in forma di moduli da
includere aìl'interno di un
programma principale. I filedi intestazione standard
che fornisce Microchip definisconoi registri specifici di ogni microcon-trnllor n:rfirol:re a seconda del
file. Così, ad esempio, nel caso del
PIC'l6FB4, il suo file di intestazione
è il p16FB4.inc o il p16F84a.inc, a
seconda del modello.
eLfl#rux rg*_frffig Xà*Ytr$Y&Xg#f'*tr
Nel p'l6F84.inc, così come è
mostrato nella figura, appaiono le
definizioni sia dei registn specifici,
che dei bit particolari di questi regi-
stri. Si può vedere il contenutocompleto aprendo il registro trami-te MPLAB, come qualsiasi altro file.
L'uso dei file di intestazione ha il
vantaggio di risparmiarci il Iavoro
per definire le variabili più comuni^^^i ,,^l+^ -A^ -; +- ,,,ognr vorra cne sr ìd un pro9ramma,
ìnoltre migliora la chiarezza neìla
lettura. Con l'uso di file di intesta-
zione standard, si facilita ìa com-prensione da parte di un program-matore esterno, permettendoglipertanto di collaborare in un pro-
gramma non scritto da lui. Pero r
file di intestazione, oltre alla defini-zione delle variabili, possono con-
tenere subroutine o macro per il
funzionamento dei diversi elemen-
ti, come le tastiere o gli LCD.
L'utente puo fare dei propri file di
intestazione, anche se deve tenere
Un frammento del {ile di intestazione del p16FB4.tnc
; Bloócr d€l1s €tl,6h€tte
: c$Locx KEY-lrÈ& ; IrLzlo delle qariètlltTÉS1g
: kEY_1: REVz, t{Év_sE|.*9_1: xev-aEL*Y_2: IEMP,I
Elsc
,; BBstine di sÈansie.e d"]:.a tastiera:HE?-$c*fi bsf sfnrils,gPg ; Pès5o a1 banco I
Fosls b'OSS0C1t1'Eqvsf FOAIa ; ASt-nA7 !scl.te, 898-ng$ ilgr€s5iftsf IÌ?TIOH_REG,7 ; fittisa ptrU-sP intèrnibcf sT*fOS,nPg ; TorDq al bànca 1
B6uls 4Fo!9f fE9_1 ; H. delle fil€ dà esplorereEssl{ b'01't-t11'l l'Fsv€f ÍA3TO ; Fila dÀ ettitàre
[É?_SCAH_1 R.vf TrSlQ,HBousf Po*-lS ; *ttiuù SilanopfrcaF ?O*TS,UR^.rsJ
File di intestazione per l'utilizzazrone della tastiera
ffiw#&wwv*
conto, comunque, che nei file utilizzati nello stessoprogramma, non devono coincidere def inizione e
subroutine.
g-'#S* #il3 ilXL$r *X Xf*Yffi$Y&Xg*r4*iL'uso dei file di intestazione è semplice: dobbiamo soloporre una drrettiva INCLUDE nel programma principalee, in seguito, il nome del file fra virgolette doppie Nel
Esemoio di come si carica un INCLUDE
nella memoria di programma.
caso dei file di intestazione che definiscono i registri delmicrocontroller, prima di INCLUDE bisogna definire il
proprio PlC. Per fare in modo che il file venga trovatoal momento di assemblare il programma, deve essere
nella stessa directory. Se osserviamo come si carica il
file nella memoria di programma, vedremo che si ottie-ne lo stesso risultato copiando direttamente il fìle al
oosto della direttiva INCLUDE.
Uso dei file di intestazrone
j,iiÈ3$
. I .: .: i:i.tr,,:i..'
"::
: .:.:.:i3.,:::i:*S
. :.:.,ì::ara:ta
...;,;ali*.a.:a'.:..#,.'.:.:::.:ì
': r :::ìl*
:.::::i#
:.:,t:r,è:iì:]:!li!i':iNÈ
, ,:,::ì*
.:.;::;=]
:' :i:iil**
::.a.aa:,,+?l
'':"'r::"':
:t;i&:,.a,
::::ai::i
__ .iì:iìtl':iì:rr:iìri:ia:
...ti:ìÈ
::::::::-'l
'I 't.i:nì...:ì:iìr*
'. i::ii:.::€:...,. . .;j:r::
: l:::a.il
' ì..:::::ì:
:. ...:.,:ttaa
.'::::.:*
.ììt,,]rt::::it,.:::::::,::,,,:*
.,-a.:a:aa
l:
':a:aa:,4
I :,:ì;ii:
::t.:t:u:::
:'':ii:l$''. ìitììi.tiì
. a::::::..:.4.:a:a*i
..,. :.4..1:aia: .i::i3f. :::::5Ftrit:sl' 'lrl:::i:É:
'.,'.:,,:.tt:
' :ììììììiìir:tt' . ìììì:ìrìri:iul
.:*$i*
:-':'':l-
LISI e-l6Ft+*
caxt €{u ge
ffv_qnR EQr, 6s
o*f 6gote llJIZI0
; Eefinlziotre del procFÉssre
; Uàriablli detli tègtiera
; Ptsoqraffia prlilcipale
ItUll0 bsf SIeffS.SPAclrf P{,BIÍ ; Psrts À cotr uscitamute è'85684111' ; eorfigura nFtlgt{ per :l f|{$úmuBf t FTI0il_R€Sbcf SlÀtgs.RPa
bcf FgATe"$ : Disàttiua i.L Èicèli.no
_l*gfg càll gEg_geqll i Esegui u*: sc:oslone d€11à tÀstlèramuls gx8g
Sqw$$*lw*swsw
Apptica zione pratica: raccoltadei dati tramite la tastiera
e finora avete trovato nteressanti i
programmi con il PIC e iniziate ad
immaginare le possibili applrcazioni,questa periferica vi incanterà. ln alcu-ni reqi i cpmnliri te<ti 59p19 sufficienti
per introdurre dati in una applicazione, però
mano a mano che le applicazioni diventano più
complesse, avremo bisogno di sistemi più sofisti-cati, almeno in apparenza, dato che il loro uso ela programmazione continuano a rimanere sem-plici.
g_A g&s?gilffiA il#&$tr trilffi3flflffig{&ffià gru&ffi*"ss*
Dal punto di vista elettrico una tastiera è un mec-canismo in cui ognuno dei suoi tasti f unziona come un
.pulsante. Comunque la distribuzione di questi pulsanti,
insieme al modo con cui vengono gestiti dal program-ma, fa sì che l'uso della tastiera faciliti l'utente all'intro-duzione di dati tramite l'interfaccia piu intuitiva, oltre a
risparmiare linee dr ingresso/uscita rispetto all'uso di
tasti convenzionali. Così ad esempio una tastiera da 4x4
l:,,tt:.lt'ta:,.
'.:,.,.a.,
:L:l:):ltat'.::,:
irr,!i iÉjrr",jit,li e,j..f.'lini$f.lEr '.gj
nealoneslrRBó+ì
nezI t
RBo---Jlll llll--RB7RBI rll IILRBóRB2-l l-RB5RB3 ------J
L-- RB4
COTONNE FITE
{uscrTA (rNGREssoDEI TASTI) DEI TASTIì
TASIIÉRA
tttot t t+RBO RB] RB2 RB3
Schema dei collegamenti di una tèsltera da 4r4 16571
^,,1.-^+i ,,+il;--. .^l--onto nttn linoo nor fr rnzinnrrn rlpUldlìtl, UtlllLLCt )UldlllErlLs vLLv rlllEE VE lullZlUlldlC/ dl
posto delle l6 che sarebbero necessarie con pulsanti
indipendenti. Ci sono diversi modi di configurare una+rrfiarr -.^-^^.1-.li -nmo <nnn rnllon:fa lp li^^^ ^ -^Ld)tleld, d >eLUl lud Ul Lur rq )ur ru rvilqyqLc rq llllce C )C
si lavora o meno con interrupt. Per il momento dimen-tichiamoci di questo, per poter vedere in un modo più
semnlire il ronretto di funzionamento. Dato che una
tastiera esadecimale ha bisogno dr otto linee di ingres-
so/uscrta, scegliamo la porta B per il suo collegamento.Come possiamo osservare nella f igura, le quattro linee
meno signif icative (RB0-RB3) si conf igurano comeingressi verso il PlC, e le 4 pru srgnrfrcatrve (RB4-RB7)
come uscite dal PlC, anche se potrebbe essere il con-
trario. ll programma dovra porre sequenzialmente a
Tpro oonrrna dclle linpp di rtsrit: o lpnnoro le linee di
ingresso per rilevare i cambiamenti. Se non si preme
nessun tasto, ivalori raccolti dalle linee di ingresso
saranno dei livelli alti, mentre se si preme qualche tasto,la linea di ingresso associata prenderà un livello basso.
In questo modo ogni tasto ha associato un codice bina-rio, che identifichera in modo univoco la sua pulsazio-
ne, e che sarà formato dai 4 bit che escono dalle linee
R84-RB7 e dai quattro ricevutr da RB0-RB3. Ogni codr-
ce sarà formato da 6 livelli alti e 2 bassi, coincidendoquesti ultimi con la fila e colonna particolare d ogri
Tastiera modello ECO 16250 06realizzata dalla ditta ,ECME.
Se*S*n*sesr*
TAsTo RB7
tltr(lNc*Ess0 RM Rmcot*?)Nt$ìt*[o
i---0..: ò-'--i -".-í "-ì'-ì-'l-" ..l- - 0-- *î..:
1 I 0:I 0 li0 'l t:I I 0;I 0 t:
CODICE HEX
*'""7D--..'EE
ED
EB
DE
DD
DB
BE
BD
BB
7E
7B
7787D7E7
tl0lt0ri0ì0ì0ì0
I
0
0I
000I
I
I
0I
I
000I
lI
0000
Codice associato ad ogni tasto di una tastiera esadecimale.
subroutine, per attendere che il tasto venga rilascia-to. Nel nostro esempio non importa quale sia stato il
tasto premuto, dato che il procedimento sarà semprelo stesso: si attiverà il cicalino, per un periodo ditemno p noi si inizierà nuovamente con la stessa
seq uenza.
s{_ rx$_fr ffix €ffi&YY&rusruT#$3fr&-L& €&Sggft:$Cs
ll codice presentato nella figura, potrebbe apparirestrano se confrontato con i programmi visti fino a que-
sto momento: non ha direttive, né inizio, né fine.
Questo perche nor si tratta di un programma comple-to, ma di una serie di routines, nel nostro caso due, che
saranno memorizzate come un file a parte, e sarannoincluse nel programma principale.tasto. Nel programma di gestione della tastiera si avrà
un'esplorazione della tastiera approssi-mativamente ogni 20 ms anche se, sia
il tempo sia i codici, possono variare a
seconda del modello e della posizione
dei tasti.
p$a#ve ffix F{_$ g\$x$ffi fq&ffi ffi $\*Y*
L'uso della tastiera in un programma,
sebbene non comporti complicazioniuna.volta compreso il suo funziona-mento, implica l'apprendimento di
nuove funzioni specifiche per questo
compìto. Quindi concentriamoci su di
essa senza preoccuparci. per il momen-to, della scarsa utilità del programma
in sé. Nell'organigramma che rappre-
senta l'enunciato proposto, si possono
differenziare due parti: l'esplorazione
della tastiera e le azionr dopo la rileva-zione di un tasto. ll tasto si configureràcome e stato spiegato in precedenza,
inoltre si abiliterà una linea di uscita per
un cicalino. La scansione della tastieraverrà inserita in una subroutine. Nel
caso che questa fornisca una risposta
affermativa, e cioè che è stato premutoun tasto, si fara una chiamata a un'altra
Organigrammadel l' en u nciato proposto
Queste routines avranno bisognodi variabili ausiliarìe, Ia cui definizionesi fa all'inizio del file. Dato che si trat-ta di un file di carattere generale utiliz-zabile in qualsiasi programma che
impieghi una tastiera, non sl conoscela prima posizione libera del program-ma principale in cui collocare le varia-hili norriÀ <i tiilìzzo". l: nliratfirr:uilr, prrrrv Jr uLilr44clq Io ullgLtlvo
CBLOCK, che definisce un blocco, il
cui nome nel nostro caso è KEY_VAR
In senrritn ri nrpor.roeremo di collo-aArè dt ro<fn hlrìaaal
Le due routines principal realizza-
te sono KEY_SCAN e KEY_OFF. La
^"i*- ^.^l^"- l- +-.+i^"- ^^" {;l^;^pril rd c>prurd rd Ld>r-rcrd pcr illc il |
rorr> Ai rrn f îctn nrómr ri^ nor rr ri la|/s, !u, ìL
attiva una ad una e raccoglie il risulta-
to delle colonne. Se il risultato di quan-
to inviato e ricevuto è diverso, significache è stato premuto un pulsante, e laroutine fornirà il codice del pulsantepremuto. Se testando le quattro filenon si rileva nessun pulsante premuto,la routrne fornisce il codice OxBO.
L'altra routrne si assicura che sia
stato premuto solamente un pulsante.
Questo e necessario perche nel tempoin cui noi premramo una volta il pulsan-
te, il programma riesce ad esplorare
diverse volte la tastiera, rilevando quin-
di diverse volte il pulsante premuto, e
questo potrebbe generare degli errori.
Si tratta di verificare il corretto collegamento della tastiera.
Per questo ogni volta che si preme un pulsante si genera un bip tramite un cicalino piezoelettilco.
Enunciato per la orova della tastiera.
CONFIGURAZIONEPB ToslieroPo Cicalino
Esploro tostiero
F.&
Afiendi il riloscio
Attivo cicolino
Ritordo di I secondo
Disottivo cicolino
Swff*wswerw
; Blocco delle etichette
; Routine di scansione della tastiera
KEY SCAN
KEY SCAN 1
KEY_SCAN_2
KEY SCAN-3
KEY SCAN 4
TORNARE
; Routine che attende che il tafo sia rilasciato
KEY_OTF
KEY OIF NO
CBLOCK KEY VAR
TASTO
KEY_I
KEY_2
KEY-DELAY_I
KEY_DELAY_2
TEMP ,I
; Inizio delle variabili
; Passo al banco 1
; R84-R87 uscite, RB0-RB3 ingresi; Attiva pull-up interni
; Torno al banco 0
; N' delle file da esplorare
; Fila da attivare
;Attiva fila
; Legge le colonne
; Qualche pukante attivo?;5ì; No, non c'è niente in questa fila
; Seleziona la fila successiva
; Salta se sono terminate le file
; Restituisci il codice 0x80 (nesun puhante attivo)
; Ciclo di temporizzazione di 20ms
; per evitare i rimbalzi del pulsante
; Dopo la temporizzazlone si legge nuovamente
; se il tasto è lo stesso. Così si
; evitano i rimbalzi
; E' lo stesso?
; No, prosegui con l'esplorazione
; 5i scrive nella variabile di uscita TAST0
; il valore trovato
; Fine dell'esplorazione
; Memorizza prowisoriamente il valore del tasto
; Verifica che sia rilasriato
; Codice di nessun pulsante attivo
; Salta se il tasto è stato rilasciato
; 5i riprende il tasio
ENDC
bsfmovlwmovwfbsfbcfmovlwmovwfm0vtwmovwfmovfmovwfn0pmovfmovwfsubwfbtfssgotobsf
rrfdecfsz
gotoMOVIW
goto
MOVIW
movwfclrfclrwdtdecfsz
90î0decfszg0r0movfmovwfn0pmovfsubv'rfbtfssgotomovf
mow'rfretufn
movfmovwfcall
movlwsubwfbtfssg0r0movfmovwfrelurn
STATUS,RPO
b'00001 I t1'PORTAS
TMR0,0PT-7STATUS,RPO
KEY_1
b'0't111111'TASTO
TASTO,W
PORTAB
PORTAB,W
KEY-2
TASTO,W
5TATU5,Z
KEY_sCAN 2
5TATU5,C
TASTO,T
KEY,1,F
KEY_5CAN.1
0x80
TORNARE
.100
KEY_DEtAY-1
KEY DETAY_2
KEY_DELAY_2,F
KEY_SCAN-4
KEY_DELAY_1,F
KEY_5CAN,3
TASTO,W
PORTAB
PORfAB,W
KEY_2,W
STATUS,Z
KEY_SCAN_I
KEY_2,W
TASTO
TASTO,W
TEMP_I
KEY_5CAN
0x80
TASTO,W
5TATU5,Z
KEY_OIF NO
TEMP-1,WTASTO
,:::,1:,a
:t:ì:r::
:.:,l:ììil
aaì:,ìr'
:tìtì:ì;,1
-1.1::r:::
la,
:ìi:]::tì::
:ri:j.
a,
:,1t.
:.!a,.
:ìiìl:
ììì:i:
Rouline di Lralbmento della tastiera
Sw${*x*rm:;re*
5TATU5
PORTAA
PORTAB
TMRO,OPTINTCON
WF
zcRPO
c0NtKEY_VAR
; Programma principale
tNtzt0
INCLUDE "TASTIERA.INC"
bsfclrfm0vtwmovwfbd
bcf
callMOVIW
subwfbtfscgotocall
bsfcall
bcfgoto
movlwmovwfmovlwmovwfbtfssgotobcfdecfszg0î0return
LIST
EQU
EQU
EQU
EQU
TQU
EQU
IQUEQU
EQU
EQU
EQU
EQU
ORG
g0r0
P--16F844
03
0506
01
OB
0
II0
0cOD
0
tNtzt0
; Definizione del processore
; Definizione delle variabili
; Variabili della tastiera
; lnserisci il file di trattamento della tafiera
; Porta A come uscita
;Configura OPTION per il TMR0
; Disattiva il cicalino
; Esegui una scansione della tastiera
; 5i compara TAST0 con il valore 80 (nessuna puhazione)
; Non è stato premuto nessun tasto; Si, è stato premuto, Si attende il rilascio
; 5i attiva il cicalino
; 5i mantiene attivo per 1 secondo
; 5i disattiva il cicalino
; Si ricominria il ciclo
; Ciclo eferno rhe si ripeterà 15 volte
; Inizializzazione del ciclo interno
; Ha finito di contare?
; No, continua il ciclo interno; 5ì, resetta il flag; Decrementa il contatore del ciclo esterno
; Dato che non è 0, torna a ripetere il ciclo interno; ll contatore esterno è a 0. exi dalla routine
NO TASTO
RITARDO
crcL0l
ctcL02
STATUS,RPO
PORTAA
b'000001 t1'TMRO_OPT
5TATUS,RPO
PORTAA,O
KEY_SCAN
0x80
TASTO,W
STATUS,Z
NO_TA5TO
KIY OTF
PORTAA,O
RITARDO
PORTAA,O
NO,TASTO
d'15'CONT
00
TMRO_OPT
INTCON,2
CICLO2
rNTC0N,2
c0Nllclct0l
Programma completo dell'enunciato propostorl:)
[-..-,-:""11],: .t, : ..-. .""." d er': i"- -" ' '':' ,." }*Lll programma, una volta incluso nel nuovo file della
tastiera, risulta molto semplice. Dopo aver conf iguratol: nnrt: A nar l'rr<n dol rirslina o il Tl\/lRO <i. . r,, , ,_, ., esptora ta
tastiera. e nel caso si rileiii rrn nrrlsanîe nrpmrt[o si attr-ri: il ric:linn nor rn sornndn ner noi snponorln Si rinp-|'--',r-'rp il nrorpsso rn modo infintto.
,-,t"1," .,r-
Nel caso della tastiera non possiamo realizzare una
simulazione tramite MPLAB, dato che non esiste nes-cr rn dicnncitivn di inoroccn rhp < nn<c: rnnfinrrr:rocorle si farebbe co1 Lna rastiera, assoc;ata a due linee.
$****wssser
Port:ntn nér,,^"i+i--"^ ^, , -^vqr ilrLorc Iucrr-IO VTSIO, Vr SU9-
^^";-*^:; .^-gcr rorru ur rcd-
lizzare il mon-t:anin nprtrq-
sario sopra una
Y-' Y'"
IOUpr, O SU Una.-h^^. ,,^i,,^")LLtCUd Ut tivct--.1^ ll ^"^^..-*-,,i -i .+^.- -,,^"i{i--"^ -L^ L5dre. ll plogldmnld vl arJre'd d ver ilrLdre cile re connes-sìoni siano realizzale correttamente, dato che il cicalinosJonera premendo qualsiasi pulsante.
\r hpma r omnlpto elFll cserctzta
Direttive
lcune le abbiamo già viste, dato che neabbiamo avuto bisogno nei programmi cheabbramo realizzalo, però ora le tratteremoin modo approfondito, vedendo sino a chepunto oossono essere utili.
fl#rdeffiYYs ffis mxffisTYxw&Una direttiva è un comando assembler che si inseriscenel codice sorgente del programma, però non viene tra-dotto in codice macchina dal compilatore. Si utilizza perdiversi scopi, in relazione al posizionamento delle varia-bili, e al controllo degli ingressi e delle uscite nell'as-semblato. La maggioranza delle direttive ha diversinomi e formati, per preservare la compatibilità con Ie
versioni precedenti dei compilatori di Microchip, e perrendere compatibili i programmi realizzati da diversiutenti.
ll compilatore MPASM fornisce cinque tipi di direttive:. Direttive di Controllo, che permettono l'assembla-
mento di frammenti di codice secondo determinatecondizioni.
. Direttive di Dati, che controllano il posizionamen-to dei dati nella memoria e danno la possibilità di rife-rirsi ad essi con nomi significativi.
. Direttive di Listato, che servono per configurare la
forma in cui si presenterà il file assembler: titoli, impa-grnazrone, ecc.
r Direttive di Macro, che controllano l'esecuzione e
Le direttivenon vengonotradotte incodice macchinaquando siassemDEun programma.
Sw#*wwsw
ii posizionamento dei dati quando si utilizzano macro
nella programmazione.o Direttive di File Object, che si utilizzano quando si
vuole creare un file object.
u$# ffifi1Lffi #X$qflX-rxwffi
Nella maggioranza dei casi i programmatori devono
ultlizzare sempre le stesse direttive, dato che sono
molto specifiche quelle dei dati e delle macro, e solo inpresenza di situazioni speciali, come ad esempio se si
vuole stampare il Iistato di un file con dimensioni diffe-renti dallo standard, si prova a trovare una soluzione
con l'uso di altre direttive. Anche se ìn seguito non le
utilizzeremo, conviene fare un ripasso di tutte le diret-
tive esistenti, per questo le presentiamo nella tabella
con una breve descrizione oer oqnuna.
Esempio di un programmache utilizza diverse direttive meno frequentr
CODE
CONFIG
.DW
ruq0
!itìeevuote._un sottotitolo di un Ulqgfarn0lun titolo di un programma
una catena di caratteri
unlrUn
di sostituzionese la condizione è vera
Tabella di alcune direttive fornite dal MPASM
:rrla:
aaara
$m#*wwrm
Applicazione pratica:visualizzanone dei dati tramite LCD
^*^ l- +--+ì^.- ^
I- ^i, ,orTre rd rdsrera e ra ptu co-m I rna ir) lo noriforirho À irrrurru rru rL PLtilLttLt tg ut
inoresso nei nrooelti con
microcontrollel il display a
crsrailr ilqurot LLt-J e il ptu
comune tra le periferiche di uscita.
Come utenti lo potremo trovaresempre piu spesso sui dispositivicommerciali, come ad esempio,macchine distributrici di prodotti.
Quindi, non vi piacerebbe impararea programmarli per fornire messaggi
del tipo " introdurre l'importo","puo passare", ecc.? Questa e la nostra proposta.
- / a d'd *,qf' S'9f-F*?f f fi?1 " :!? . ?<*, " e!;.. r ':,3h. Hhffi{}kHÀ;",\ .H u}L;...ìUn LCD e un dispositivo molto potente, flessibile e faci-le da gestire. E capace di rappresertare lettere, numerie altri caratteri ASCll, o simboli specifici programmati
Collegamenti di un LCD da 2xl 6 caratteri
gliamo lavorare riceve I'informa-zione tramile 14 pin, otto deiqr:ali ricevono i dati o i codici di
controllo (D0/D7), a seconda del
momento, tre sono incaricati di
controllare il funzronamento del
modulo (RS, R/W#. E), e i tre ri-manenti sono per l'alimentazione(Vss, Vdd) e il contrasto (V0).
Quando il display LCD e collegatoa un PIC 16t84,le linee dei dati di
solito corrispondono con la portaB e le tre di controllo con le linee
meno sionificative dell,e nnrt: A R^n-R47. Le lineedei dati dovranno essere bidirezionali, cioè a votre tn-nressi p a volle rrsrile dato rhp nlestn tr neCeSSaf iOIL YULJLV L I
per passare dati all'LCD o per ricevere informazionisul suo stato interno. Le linee di controllo si confiqu-rano come uscite.
Display LCD modello WM-CI 602Mdella ditta WINTEK.
dall'rrtente trtto nrresto in Uno<n:zin :d ocomnin r'.li f l;n^^ ^^")vuLtvt uu !r!rrrprv, ul z lrllcu pcl'16 colonne, a seconda del modello.ll modulo LCD contiene un micro-rnntrnllpr rhc nc<ti<rq il suo fun-zionamento e ha il compito di tra-durre i comandi mandati tramrte il
programma in ordini compresi dal
display. ll display LCD con cui vo-
Sw$*'E*swryry|r|NÌNrl|''ffiHll::.:.:.)):..........tt t \\iùrraj,
DB2 DBt DBo Tempo.die5ecuzrÒRè
-o'- -'d-----1 -: i,?;A;;o I x i 1,64msI l/D S i 40msD C B i 40ms
R,/L X X i 40ms
OlDLNFXX'I INDIRIZZI DELLA CGRAM
INDIRIZZI DELLA CGRAM O DDRAM j 40 ms
CODICE ASCII PER LA RAM
CODICE MEMORIZZATO NEILA RAM
. READ BUSY FIAG O O ] BF
S ADDRESSjWRÌTiDATATO i 0 0 l,
CGODDREAD DATA TO O O I
CGODD* 5: Se uoie i. sposlo lo visuolizzozione ogni vohoche sl scrive un doto. Se vole O, funziona in modonormole. * l/D: Se vole I, sí incremento l'indirizzo del cursore; se vole 0. si decremento. * S/(: Sevole 1, sposfo lo visuolizzozione. se voie 0, sposla il cursore. * R/L; Se vole l, lo sposfomenfo è odesfro; se vole 0, o sinistro.' BF: Se vole I, il nodulo LCD è occupoto: se vole O, è disponibiie. * DL:Se vole l, si lovoro con 6us dei doti o I bit: se vole 0, con bus o 4 bit. * N: Se vole l, /opresenfozione si fo in due linee: se vole 0, in uno. * F; Se vole I , il corottere è di 5 x t O pixel; se voleO, di 5 x 7.'B: Se vole l,lonpeggio íl cursore (se è ONi. * e; Se vole I il cursore è ottivo /ON./.'D: Se vole l, ìl disploy è offivo. * X: lndeterminoto.
Tabella dei codici di controllo del display LCD
A seconda della combinazione dei dati delle linee dì
controllo, l'LCD capira se deve rappresentare un caratte-
re, cambiare la posizione del cursore (che gli si doman-
da se ha finito con quello che sta facendo)
ecc. Combinando tutte le opzioni si possono
ottenere effetti come il lampeggiamento dei
caratterì rappresentati, l'apparizione e spari-
zione dei caratteri dai lati del display, la rap-
presentazione di figure in movimento ecc.
tr$ffitrF9# *g 16.$&*xg*ru&ffi fi ruF*Il primo passo da fare quando si sta comin-ciando ad acquisire un nuovo linguaggio di
programmazione, e generare un messaggio
che dica "N/ONTY". Fino ad ora non aveva-
5i vuole verificare il funzionamento del display
LCD. Per questo si scriverà il messaggio "M0NTY".
Enunciato dell'esempio di funzionamento dell'LCD
mo questa possibilita, dato che l'unica pe-
rif erica ner rannresentare numeri e lettere
era il display a 7 segmenti, anche se in mo-
do abbastanza limitato. ll display LCD ci,-J--ì ^,,^-+îudrd r-1uc)Lo uv-portunità in modornmndn o <omnli-.ó l-nmo nnccir-sv, |,v HvJJs
mo osservare, l'or-ganrgramma è<omnliro Nlni dn-
vremo solo inviare
i dati all'LCD e ìn-
dicare dove met-terli, e lur si incari-
cherà del resto.
che, oltre alla dichiarazione delle variabili, abbiamo in-
trodotto le dichiarazioni di etichetta mediante ìa diret-
tiva " #def ine " .
€onfigurozionercD
lniziolizzo LCD
Scrivi"MONTY"
su L€D
arganigrammadell'enunciato dato
*-$: &t*YgruffiS #g **ruFtr#È-*-**Hà-g,-"Lf,*
Così come rl modulo della tastiera, il display
LCD ha bisogno di una serie di routines che
di solito vengono incluse come file indipen-denti del programma principale. Oltre a in-
cludere i file dovremo dichiarare le variabili
che verranno utilizzate, tenendo semprernnin rho lo nn<izinni,, non srano gla occu-
pate da altri file. Notate nella tavola a lato
Sw#*weww*
#define#deiine#define#define#definefdefine
UP_TCD
LCD BUSY
LCD BUSY 1
LCD-E
LCD_E_1
LCD DA]O
LCD_REG
tCD INI
ENABLE
DISABLETEGGERESCRIVERE
OFF COMANDOON_(OMANDO
cBt0cK
OFF COMANDOmovwfcallON-COMANDOgoto
OFF COMANDOmovwfcallg0r0
bsf PORTA,2bcf PORTA.2
bsf P0RTA;1bcf P0RTA,1bcf P0RTA,0bsf PORTA,0
Lcd varLcd-Temp Ikd_Temb_2
STATUS,RPOPORTBPORTA
STATUS,RPO
; Attiva seqnale E
ì Disattivaieonale E
i Pone LCD in-Modo RD
: Pone LCD in Modo WR: Disattiva R5 (modo comando); Attiva RS (modo dato)
lnizio delle variabili. Sarà il orimoindirizzo disponibile
STATUS,RPOh'tt'PORTBSTATUS.RPO
ENDC
bsfclrfclrfbcfOFT COMANDODISABLErelurn
LIGGEREbtm0vtwmowvfbcfENABLEn0pbtfscqotoDISABLE
bsfclrfbcfSCRIVERE
return
ENABLE
n0pDISABLE
movlwmovwfdecfszg0J0retufn
movlwcallcallm0vtwcallcallMOVIW
callcallmovlwcallfeturn
PORTB,TtCD_BU5Y_I
STATUS,RPOPORTB
STAIUS,RPO
Disabilita LCD
Porta B uscita
Pone LCD in Modo WR
Attiva I
Disattiva E
Codice di istruzioneTemporizza
Codice di istruzioneTemDorizzaCancella [CD e Home.
.14Lcd Temo Ikd_Temb_1,FLCDEl
PORTBLCD_BU5Y
LCD_E
PORTBLCD BUSY
LCD_E
b'00111000'LCD REG
LCD_DELAYb'001 f 1000'tCD REG
LCD_DELAYb'00-i f 1000'ICD REG
LCD_DELAYb'00000001'LCD_REG
; Perde 40 us per la costante dii tempo Tc dei nuovi moduli LCD diiWintek
Disattiva RS (modo comando)Valore ASCll da mettere sulla P0RTBAsoetta che si liberi LCD
Attiva RS (modo dato)Genera impulso di E
Disattiva R5 (modo comando)Codice di comandoLCD libero?5ì. Genera imouko di E
LCD DELAY drwdt- movlwmovwfclrf
LCD_DEIAY_I decfszqotodecfszgotoreturn
.10Lcd Temp 1
kd-Temb-2Lcd_Temb_2,ttCD DETAY 1
Lcd,Temp_[FLCD DELAY I
; Banco 1
i RB<0-7> uscite diqitaliI Porta A uscita; Banco 0
; R5=0
i E=0
Routine di trattamento dell'LCD
UP_LCD:
ICD,BUSY
LCD_E:
LCD_DATO:
LCD.RIG:
LCD_INI:
tCD DEIAY
Configurazione delle linee del PIC per LCD
Lettura del Flag Busy e indirizzo
lmpuho di tnable. Nei nuovi LCD questo segnale deve stare a "0",45 m5 prima di tornare ad essere attivato a "1"Soittura dei dati in DDRAM o CGRAM. lnvia dato presente in W
Scrittura dei comandi dell'LCD. Invia il comando presente in W
lnizializzazione dell'LCD inviando il tomando "Function Set" 3 volte consecutive con un intervallo di 5 m5. ICD rimane
cancellato e il cursore nella prima posizione
Routine di temporizzazione di 5 m5. 5i utilizzano le variabili Lcd_Temp_1 e LCD_Temp_2 al posto del TMR0.
Questo rimane libero per le applicazioni dell'utente.
Significato delle routines dell' LCD
Ogni volta che si utilizza, si fa corrispondere all'e-tichetta che segue il valore successivo. Così ad esem-pio, dopo questo #define, ogni volta che nel pro-gramma si scrive "ENABLE", è come se si ponesse"bsf PORTA,2". Questo avvicina un po' di piu l'as-sembler ai linguaggi di alto livello. Nella tabella alle-gata troviamo diverse routines implementate e le lorofunzioni. insieme al modo di utilizzarle. Le più impor-tanti sono: UP_LCD, LCD,lNl, LCD_REG, e LCD_DA-TO. Queste si richiamano alle altre per il loro funzio-namento, pero non e piu necessario che lo faccia an-che l'utente nelle sue aoolicazioni.
pffi*#ffie$4 f4& FffigFd fl atr&E_fr
Nel programma, per prima cosa bisogna configurare il
prendere una frase completa, invece di dare ordini per
il posizionamento del cursore per ogni lettera in modoindividuale, abbiamo realizzalo un ciclo che percorre la
tabella dei dati e ce li mostra.
Questo ciclo e implementato come routine (MENS)
e necessita, come parametro, dell'indirrzzo della catenache si vuole visualizzare.
Fffi#V&ll montaggio per la verifica di questo esercizio e mo-strato in figura, e segue la configurazione tipica usa-
ta per la maggior parte da ditte che utilizzano modu-li che integrano un display tCD. N/PLAB non disponedi risorse per simulare rl funzionamento di questo tipodi periferiche.
PIC per l'uso della tastiera: e questo
va fatto ognivolta che lavoriamo conil disnlav dato che e normale che,, v,JY'vlt
condivida le linee con le altre perife-riche e chp orresfe le rttilizzino in un
altro modo. In seguito dovremo ini-zializzare l'LCD. Questo processo ènecessario solo la prima volta che si
ulilizza un LCD nel programma. Do-po aver iniziato a mandare ordini oÀ1+i îll'l r'-n lr ^r^.^4trr: ò qomnrouCtl Oll LLUr ld PlULCtru'u L JLrrrprL
uguale. Quando si tratta di un ordi-ne, si deve introdurre il codice di
controllo in W e chiamare la routineLCD_REG, mentre se si tratta di undato si mefterà nrrest'gl{jppo in W esi chiamerà LCD_DATO. I comandipiu utilizzati, come ad esempio can-cella LCD e porta il cursore alla primaposizione, saranno introdotti a lorovolta in una subroutine, pero inter-namente faranno la stessa cosa. Nel
nostro caso, dato che vogliamo
'^ t lfll--'5 I'u'lfr+sv + +
-2rÈL?,EL
Sch ema co m p I eto d el l' esercizt o
$w$*.wwy*
LIST p=l5F84A ; Tipo di processore
INCLUDE P16F84A.|NC ; Definizione dei registri interni
Lcd var EQU 0x20 ; Inizio delle variabili delle routine LCD
Delay-var EQU 0x22 ; Variabili temporali per la temporizzazione
ORG 0x00 ; Vectot di Reset
goto lnizio
ORG 0x05 ; Salva il Vector di interrupt
INCLUDI LCD_CXX.INC ; lnclude le routine di gestione dell'LCD
Delay sleep
decfsz
goto
return
;Temporizza 36,4 ms sino a che il WDT vada in overflow
Delay-var,F ; È fato ripetuto il numero di volte desidetato?
Delay ; No. Attendi altri 18 ms
PORTB ; Cancella i latch di uscita
PORTA ; Cancella i latth di uscita
SIATUS,RP0 ; Seleziona il banco 1
TRISB ; Porta B configurata come uscita
TRISA ; Porta A configurata come uscita
b'0000r001'
OPTION REG ; Prescaler di 2 al WDT
STATUS,RP0 ; Seleziona il banco 0
;Programma principale
lnizio CITÎ
clrf
bsf
clrf
drfMOVIW
mowvf
bcf
call
call
m0vlw
call
chwdt
m0vlw
call
m0vlw
call
MOVIW
call
movlw
call
movlw
call
m0vlw
call
UP-LCD
LCD-INI
b'00001'100'
; Configura la porta per LCD
; Inizializza LCD
L00p
LCD_REG ; LCD 0N cursore e btink OFF
; Resetta il WDT
0x86
ICD_REG ; Pone il cursore nella 7" posizione,M,
LCD_DATO ; Visualizza "M",0,
LCD_DATO ; Visualizza "0"'It'LCD_DAT0 ; Visualizza "N",T,
LCD_DATO ; Visualizza "T"
LCD DATO ; Visualizza "Y"
movlw
movwf
call
.28
Delay,var
Delay
b'00000001'
;Temporizza '1"
movlw
call
movlw
movwf
call
g0r0
END
LCD_REG ; Cancella il display
,zo
Delay var
Delay
Ioop; Temporizza 1"
; tine del programma
Prog ra m m a com pl eto d el l' en u n ciato proposto
Sg*Ssss.-wryw ,,:iì
..:'::j:
. ,.,::::::.1
.:.t
',2:.:.::'':. r::ì::l:::.,.::::ì
'::':aa.,a;.: .t::t
a a::,::,:aa
,,,,:,:.it
:,.:::.:.a:a.a.a
;;;,::t::1
:::a,:,
..:.t::,.1
..t.:a:ì::
: a: .':l::
. :..4::a::,
.:.,:::.a.4: a.:::a,a,,.
':;11,.:.": a'::t:a
. ::i::
&
M
ffiffim'
ffiffii
Iffi.ffit"
ffi
ffi,
wfl
ffiffi: -;:fud--
ffi
H.ffi'..
ffi,
rr$M',.
ffi.ffi"
ry
t.:r:::::::::
Strumenti di lavoro:caratteristi ch e avanzatedi MPLAB (r)
uando abbiamo presenta-
to MPLAB, accennammoal fatto che era unambiente di sviluppo per illavoro integrato con i PlC,
dato che con lo stesso programma si
nossono realizzare îrrtte le funzioninecessarie allo sviluppo di un proget-
to, anche se alcune di esse necessita-
no di un hardware specifico.
Ora vediamo le caratteristiche più
interessanti di due dr questi moduliaddizionali, accessibili tramiteMPLAB.
Per lavorare con l'emulatore dovremocambiare I'ambiente di sviluppo.
Èiffiffi # $-rW#ffi#gt\ {trffifl {JXT# pXifbtASTKffi
Un emulatore è uno strumentoL--J...^-^ -r^ -^-..^ nor mAftoro :Itdtuvvdtc Lt tc >ctvc r,.punto programmi che funzionano
ci c+nccnrn o<onrrondn inLUI I lC )C )l )LC))ClU LJLVULT ruv il |
tempo reale. MPLAB dispone di stru-
menti software per poter ulilizzare,fragli altri, l'emulatore PICMASTER. Un
emulatore si accomuna e si differenzia
dal simulatore e daìla applicazionereale in dìverse cose:
. L'emulatore contiene linee diinnro<cn/r rcrit: o di<nnciti\ti r6,or v'JYvJ' \' v t,
ffiw$#wmss*,:taetlít gtfr$rtt:|1|l:at,'\1,:tai:*tì\ìììjìì!s!]ì!ij:ii:rilffitlutìu
Fotog raf i a del I' em u I atore Pl CM ASTE R
PICSTART ptusFffi.ffiffif r grtG*re
PICSTART Plus per la scritturadei microcontroller.
hanno la stessa f unzionalità del processore reale, men-tre il simulatore è un modello lrmitato delle caratteristi-che del microcontroller.
. La velocità di esecuzione dell'emulatore e la risoo-sta aglistimoli esterni, o eventi interni, è in tempo reale.
r ll vantaggio di utilizzare un emulatore rispetto al
circuito reale, e che il primo puo mostrare cio cle acca-
de all'interno del microcontroller in tempo reale; serveper mettere a punto il programma, potendo inoltreattivare dispositivi come un oscilloscopio a tale scopo.
r I a "testa di nrova" dell'emulatore è intercambia-bile a seconda del PIC da emulare, e si introduce nellozoccolo destinato al microcontroller come si farebbecon un PIC normale. Le linee addizionali che l'emulato-re porta all'esterno, si possono collegare alle periferi-che, per vedere il valore di determinate linee, o per l'in-troduzione di eventi esterni. Sarà necessario configura-re il PIC-N/ASTER seguendo le specifiche del fabbrican-te, che dipendono dal microcontroller da emulare.Bisognerà cambiare anche l'ambiente di sviluppo comegià abbiamo fatto iniziando a simulare i programmi,
configurare le porte, il clock, ecc. Per sapere se I'emu-latore funziona in modo adeguato, possiamo fare unaprova nell'opzione Tools>Verify PICMASTER.
g-# sfiffig"cY#ffiffi pxil$Y&ffiY g3L&is
Un altro hardware molto interessante, che si può anchegestire tramite N/PLAB, è lo scrittore PICSTART Plus.
Dopo le fasi di simulazione ed emulazione arriva il
momento di provare l'applicazione sull'hardware reale
e fra le molteplici offerte del mercato, esiste la possibi-
Dovremo scegliere il programmatore da utilizzare
lità di utilizzare lo scrittore che offreN,4irrnrhin F noncatn nor o<<oro rrti-"v'H"'lizzaf.o con prototipi o piccole serie,dato che per grandi produzioni, la
programmazione "in circuit" è piùcomoda. ll PICSTART Plus si collegaal computer con un'interfaccia<ori:lo nor nn+ar riratraro il nrn-P-'gramma tramrte lo stesso ambrentedi sviluppo.
. Nello stesso modo è possibile leg-gere l'informazione contenuta in un
microcontroller non protetto per met-terlo a punto, modificarlo o copiarneil codice. Dopo aver installato il dispo-sitivo dovremo sceglrere rl program-matore da utilizzare. Nella barra dei
menù ne apparirà uno nuovo per il
lavoro con il PICSTART Plus che per-moftorÀ rli <rrivoro lonnoro a.)n.Fta-
re i microcontroller.
Sw$#effiwww
Appti cazione pratica:un programma completo
giunto il momento di
mettere in pratica in un
unico programma tuttocio che abbiamo impara-
to. Uniremo l'introduzio-ne dei dati tramite la tastiera, con
la visualtzzazione deg i stessi trami-
te LCD e con le altre semPlici Pert-feriche che saranno necessarie. Per
quanto riguarda le subroutines ab-
biamo cercato un'applicazione in
cui ìa loro utilizzazione non solo ab-
bia senso, ma sia indispensabile per
un buon funzionamento.
5i vuole controllare l'accesso ad un recinto.
Per fare questo disponiamo di una tastiera,
in cui, dopo aver premuto il pulsante "4"di "accesso", si dovrà introdune un codice
formato da quattro digit. Se il codice
è conetto si attiverà un relè per due secondi,
il quale simulerà l'apertura di una porta.
5i daranno tre opportunità per l'introduzione
del codice. Questo sarà memorizzato
nella EEPR0M, e potrà essere tambiato
con un oulsante della tastiera "C" di'tambio".
Un cicalino piezoelettrico emetterà un "beep"
premendo ogni pulsante. Un display LCD,
da parte sua, genererà mesaggi
che guideranno l'utente nel suo compito.
E n u nci ato del I' eser< izi o p roposlo
s{#ilffietr{-ilT?KA**Leggendo l'e-nunciato dell'e-<orrizio p nnssi-
bile che abbiatenon(:tn "o dnvo
lr trovo io così
tanti piedini?" ln
effetti se contiamo il numero degli ingressi/uscite delle
periferiche da ulilizzare, ci sembrera che quelle offerte
dal nostro piccolo PIC'16F84 non siano sufficienti. ln
ogni caso grazie alle caratteristiche proprie dell'LCD e
della tastiera, avremo otto linee che si utilizzeranno a
volte come ingressi a volte come uscite, in altre parole
saranno condivise da entrambe le periferiche. Per fare
in modo che questo sia possibile, il programma dovra
configurare queste lrnee a seconda delle periferìche da
uliltzzare in quel determinato momento.
#ffiffi&rusffiK&F€ffieCome possiamo osservare dall'organigramma esposto,
il programma non è così semplice come quelli visti fi-
nora. Cìò è dovuto al fatto che sono contemplati di-
versi casi, e che in quaìsiasi momento è permessa l'op-
zione di cancellazione. Per arrivare a questo organi-
gramma prima abbiamo dovuto pensare molto bene
alle opzioni permesse, e fare un primo organigrammapiù semplice per complicarlo successivamente con l'in-
troduzione delle eccezioni. Quindi all'inizio è normale
pensare ad un codice di un solo digit, non permettere
più di un errore, e supporre che la EEPROM abbia sem-
pre un valore memorizzalo, ecc. In ogni caso, a di-
spetto della dimensione dell'organigramma, notate
che sono state rispettate le regole della struttura, e
non cisono diversi puntidifine, ingressia metà difun-zione, ecc. Per questa ragione la traduzione in pro-
gramma assembler non dovrebbe comportare alcun
problema.
ffiw$wwsexres
Schema elettrico dell'eserozio proposto
ConliguÉrione ICD M3, U4
D;i.onnenèF elè c.i.olirc
l€99eré ts3i&.e EIPROM
È!frli'2.r.? O
- (AltuètuÉvúudr4oÉ mènur
{cJ c;mbio.hidvè
*ordh toifierc
'* ui pukd^t.?
aCeneroE "baF" è orèndere,olb
Èrobp,€Fdo O
$
trò I ftb pEnuro"4"1
OvùuolL!. n€iù: {al coi.ellore rodnè?
il.evè..dk€
O Èshbp,.énub
r€
Vèdfi.. ie è .oreh
hFr..onrabÉ i.rè:.o q 3
vÈ&lÈa nénù {cl co..e[o (dte?
Ri.ovè.di.è
.X,'f" o{p
vérifi.. sé è.ordo
o OvLlqlù&ménù:(C)coi..llcnuoyo(odté visu.li'ld,,puòFsdre"
Rneve cdi.e
O È ftb p'end.
&vùuolirlo mènù: ((l Conello.!ilehd
Rneve.odi.e
O È lbro eEnú.
F9
* oxl
IoK 2.
rg digir?
a. ox3'rry digm
O
oK 4.89 digil?
offdorirro nqovo (di.e
Iniriolird.ontd.re interno
"':i$- B
a
Vi3u.lizo "A<€ss. rq.b',
tabella movwf
Mesag 1 equ
retlwretlwretlwretlwretlwretlwretlwfetlwretlwretlwretlwretlì/v
retlw
P{l ;Spostamento
, sulta tabella
I''A'
Ì';:!;
:i
:ia
0x00
Messag_l_l equ $
reflw I'retlw 'C'
retlw )'reilwretlw 'C'
retlw 'a'
fetlw 'm'retlw 'b'retlw 'i'retlwreflwretlw 'C'
retlw 'l'retlw 'a'
retlwretlw 'e'
retlw 0x00
pgq#s$q&P"'gÍ1,?-q
Questo programma risulta molto lungo.Inoltre notate che si parte da cio che si co-nosce e si hanno a disposizione tre file, di
cui due contengono le routines per il tratta-mento della tastiera e dell'LCD, ilterzo con-tiene la definizione dei registri del PlC. Di
questi abbiamo già parlato in precedenza.
La prima cosa che appare nel program-ma dopo la configurazione delle variabili,sono i messaggi che devono apparire sul-l'LCD Tutti i messaggi sono raggruppati in
una tabella simile a quella utilizzata con il
display a sette segmenti, ma presenta la ca-ratteristica di essere divisa in frammenti eper accedere ad ognuno dei messaggi indi-pendentemente, si assegna all'etichetta chesimbolizza il suo nome, il valore del PC inquella posizione. In questo modo, potremocambiare il testo dei messaggi o posizionar-lo da un'altra parte del codice, senza che in-fluenzi il programma che lo sta chiamando.lnoltre si dovranno ulilizzare Ie routines dilettura e scrittura della EEPROM per Iegge-re e scrivere la chiave. ln questo program-ma sono presentate in modo diverso dacome le abbiamo viste negli altri esercizi,quindi allo stesso modo delle routines del-l'l f l-l a Ànllr +rc+i^...i nntrohhorn inqoriroI L!y E Utrrro Ld)Lttrtd >t F_''in un file a parte. ll resto di domande efunzioni, si segue a partire dall'organi-gramma, che corrisponde con la parteprincipale del programma.
Esempio di come apparrranno i messaggi
O rg a n ig ra m m a del l' eserci zio p ro posto
$*p#*ws*e*!rlrllÍlrrrrrrrllf ilÍÍÍFlnr€ii!j;:;j:ffil::::1:l!,@\ìiuÌuuuiì;trlit!r!]!]!]iiiiìl|1ljl1']]@;uut!rl
P=16t844
0x11diqit I0tqìI IOIqII J
dióit 4diiem 1
di tem zdi,tem_3di_tem 4cont err(ont tastitemp_1temp,2Delay_1Delay_2Delay_3
_z
rd
,wrwfen
,eeif
0lN!zt05
PCL
$
"P16F84A.|NC" ; Definizione dei registri interni
.Tinn rli nrnra<<nro
; Variabili per i digit del codice
; Variabili temporaìi per i digit; Contatore di errori; Contatore tasti premuti
; Variabilì temporali
; Variabili per la temporizzazione
5TATUS,2
STATUS,5
EECONl,OEECON,I,,I
Etc0N'1,2EECON,I,4
; Vector di inizio
; Spostamento sulla tabella
INCLUDE
#DEFINE
#DEFINE
#DEFINE#DEFINE
#DEFINE
#DETINE
ORG
9OtoORG
tabella movwfMessag_1 equ
DT
lvlessag 1_1 equDT
Messag 2 equDT
Messag-2-1 equDT
Messag-3 equDT
lvlessag 4 equDT
Messag 5 equDT
Messaq 6 equ-Di
DelavDelal loop decfsz
"(A) Aoertura", 0x00b"(C) Cambio todice", 0x00
"Codi(e", 0x00
"(C) Can(ellare", 0x00
$
"Nuovo Codice", 0x00
"Confermare", 0x00
"Può Dassare", 0x00
"Accesso negato", 0x00
INCLUDE "tastìera,inc''INCLUDE "lcd-txx.int"
: Delav: Ouesta routine realizza una temporizzazione variabile, che dipende dal valore
; dell'ércúmulatore nel momento in cui sì legge.
movwf Delay 'l
Delav 3,footo Delav loopúecfsz Delai 2,footo Delav loopdecfsz Delai l,fgoto Delay_loopreturn
; lVlessaggio: Questa routine porta nell'LCD il messaggio il cui inizio è inditato: nelì'a(cumulatore
lVlessaqqio movwfNessallio 1 movf
cal I
movwfmovfbtfss
No_ultimo callincfgoto
Controllo
N tasto
movlwmovwfm0vtwmovwfcallmovlw
temp I ; Salva posizione della tabellatemb l,W ; Recupera posizione della tabellatabella ; Chiama carattere dì uscitatemp 2 ; lMemorizza il valore deìla tabellatemo 2,fz ; Guarda se è l'ultimogoto No ultimofeturnLCD_DATo ; Visualizza sull'LCDtemp 1,f ; Carattere seguentÉl\4essaggio.1 ; Ripete (on il carattere su((essivo
; Controllo: Attende che siano p,emuti i quattro digit del codice, li memorizza
; in digit_1 .. diqit 4 e visualizza
- sulI'LCD. ll talo C permette di cancellare
4cont tastìdigit-1F5R
KEY SCAN
0x80
; Inìzializza contatore
; Punta all'inizio del buffer della tastiera; Esplora Ia tastiera
,,- -- subwf. btîsc
N tasto,W
_zN_tasto
UP-tCD
goto(all
movlwcall
calì
catl
subwfbtfscgotog0t0
Si_canc bsfreturn
No can( bcf
movfmovwfincfdecfszgolo
Okey 1
; EE .Read: Legge un byte della EEPROIV
tÈ Keao
; EEWRite: S(rive un bvte neìla EEPRONII
EE Write
; Qualche pulsante premuto?
;N0; Riconflgura LCD
LCD DATO ; Visualizza il carattere -
KEY_oFF ; Genera Beep e aspetta che s! liberi
0x0C
N tasto,Wz ; controlla se è il tasto c (Cancellare)
Si canc
No canc
temp 1,1 ; Attiva flag dì cancellazione
temp 1,1 ; Disattiva il Flag di cancelìazione
N_tasto,W
INDF ; Scrivi il tasto nel buffer
FSR,Í ; Posizione successiva del buffercont tasti,f ; Aggiorna contatore dei tasti
N_tasto ; Ripete il processo
return
temp 1,0 ; Cancella il flag
4
cont tasti ; Numero di byte da verificaredigit 1
tSR ; Primo digitEEADR ; Prima posizione della EEPR0M
EE Read ; Legge il byte della EEPROM
EEDATA,W
0x0F
INDIW ; Lo compara con il bufferz ; Controlla 5e è uguale
temp_1,0 ; No, attiva il flag di errore
EfADR,f ; Posizione successiva deila EEPROIV
tsR,f ; Digit successivo(ont_tasti,f ; Ripete la verifìca0key-1
rpO ;Selezione del banco 1
_rd ;ordine di letturarpO ; Selezione del banco 0
:0kev: Verifica se il codice introdotto nel buffer coincide con quello della
; EEPROIM. In caso atfermativo il flag del cany va a 0 altrìmenti va a 1
0key bcf
movlwmovwfmovlwmovwfdrfcall
mol4an0 twsubwfbtfss
bslincfincfdecfszgotoreturn
btbsf
bcf
btbsf
movlwmovwfmovlwmovwfbsf
bcf
btfssgotobcfbcf
call
call
,rp0wren
0x55
EECON2
0xAAEECON2
wren
_eeifWait
-rp0
; Seleziona il banco 1
; Permesso di scrittura
; Sequenza secondo Microchip
;Ordine di scrittura
; Blocca ulteriori scritture
; Verifica la fine della scrittula
; Resetta flag di {ine scrittura; Seleziona il banco 0
movlwmovwf
clrfcall
movlwsubwfbtfssgoto
UP_LCD
LCD_lNl ; Inizializza LCD
DISPLAY-ON-CUR OFF
b'00011000'
PORTA ; Scollega relè e cicalino
EEADR ; Posizione iniziale della EEPROM
EE Read ; Legge byte dalla EEPRoM
0xffEEDATA,W
z ; Verifica se è utilizzato5i usata
Programma r60lto
: Carica nella EEPROM il codice 1234 per default
;:li.:,
No usata clrimovlwmovwf
No_usata_I incfcail
incfdecfsz
9ot0
EEDATA
4
temp_1
EEDATA,f
EE WriteEEADR,f
temp-1,fNo usata_1
UP_LCD
LCD_INI
Messag_2_1Messaggio
0xC0
LCD_REG
Messag-2
illessaggio(ontrollo
temp_1,1
Si usata
uKey
di_tem-1digit_2,Wdí_tem_2
digit 3,W
di tem 3
digit 4,W
di_tem 4
Controllo
temp 1,1
Si usata
drgit_1,Wdi-tem 1,W
Si-usata
dìgit_2,Wdi tem 2,W
5i usata
digit-3,Wdi tem_3,W
ai-usata
digit_4,Wdi-tem 4,W
ii,usata
Si_usata
No tast
(4il
movlwcall
m0vtwcall
movlwcail
callm0vtwsubwfbtf5cgorocallm0vtwsubwfbtfscg0r0movlwsubwfbtfssgoto
call
CAII
movlwcail
movlwcall
movtwcalt
call
cail
btfsc
9010call
cail
movlwcallm0vtwcall
movlw(atl
callbtfscgoto
cail(atl
movlwcallm0vtwcalt
movlwcallmovfmovwfmovfmowvfmovfmovwfmovfmovwf
; Numero di byte da scrivere
; Codice da scrivere
; Scrivi dato
LCD_lNl ; Inizializza ICDMessag_1 ;Offset del messaggio 1
Messaggio ; Visualizza "(A) Apertura"0xC0LCD_REG ; Regola posizione del messaggioMessag-l 'l ;offset del messaggio 1,1
Messaggio ; Visualizza "(C) Cambio Codice"KEY SCAN ; Esplora la tastiera0x80N tasto,W
_z ; C'è il tastoNo_tast
KEY OtF ; Genera beep e attende che si liberi0xoAN_tasto,W
_z i E' il tasto A (Apertura)?5i A0x0C
N_tasto,W
z i E'il tasto C (Cambio codice)?No tast
; Scrive nella E!PROM il nuovo codite
; Verifica il 1" digitUguale?No
; Numero di byte da scrivere
; Indire dei digit; Prima posizrone della EEPRoIVI
; Saive nella !EPROM
; Digit successivo
; Posizione successiva della EEPRoM
; Stabilisce il numero dei tentativi
; Riconfigura LCD
; Aggiorna;Offset del messaggio 2.'l
movfsubwfbtfssgoto
movfsubwfbtfssgor0
movfsubwfbtfssgoto
movfsubwfbtfssgoto
btfsrgoto
temp_1,0 ; E'valida?Si_usata
UP LCD
tcD tNt ; Cancella e inizializza LCD
Messag_2_l ;0ffset del messaggio 2.1
Messaggio ; Visualizza "(C) Cancella"0xC0 : Rinosiziona LCD
LCD.REG
Messag,3
Messaggio
Controllotemp_1,1
5i_usata
0xC0LCD REG
Messag_4 ;Offset del messaggio 4Messaggio ;Visualizza"Confermare"digit 1,W
UP_ICD ; Ri(onfigura ICDLCD_lNl ; Aggiorna LCD
Messag_2-l ;offset del messaggio 2.1Messaggio ; Visualizza "(C) Cancellare"
; Riconfigura LCD
; Aggiorna ICD
; Offset del messaggio 2.1
; Visualizza "(C) Cancellare"
; Riposiziona il cursore dell'LCD
; 0ffset del messaggio 2
; Visualizza "Codice"
; Aspetta rhe si introdura un codice valido
; Cancellazione avvenuta?;Si
; Verifica se è corretta
; Offset del messaggio 3
; Visualizza "Nuovo Codice"
; Attende il nuovo codire; Cancellazione awenuta?:tl
; Salva in modo temporaneo l" codice
; Legge il secondo codice
; Cancellazione awenuta?;5i
movlwmovwfmovlwmovwfdrf
Altro digit movfmovwfcallincfincfdecfszgotogoîo
Si_A novlwmovwf
Altro_ancora callcallmovlw
movlw(allmovlwcallcall
cailbtfs(g0r0callcallm0vlw(atlbcfbcfm0vtwcallbdbtdrl9oto
decfszgoto
movlwcallm0vtw(aII
goTo
cont tastidigit_1FSR
EEADR
INDF,W
EEDATA
EE_WriteF5R,f
EEADR,f(ont_tasti,f
Altro_digit5i usata
3
cont err
UP-tCDLCD-INIMessag 2 1
Messaggio0xC0I.CD.REG
Messag 2MessaggioControllo
temp_1,15i-usata
0keytemp 1,0
No 0kUP.LCDLCD INI
Messag_5MessaggioPORTA,4
PORTA,3
0x0ADelayPORTA,4
PORTA,3
cont errSi usata
; Visualízza "(C) Cancella"
; Riposiziona il cursore dell'LCD
; Offset del messaggio 2
; Visualizza "Codice"; Attende che si introduca il codice
; Verifica se è coretta
; Riconfigura LCD
; Aggiorna; 0ffset del messaggio 5
; Visualizza "Può passare"
; 5i attiva il relè
; Attiva beep
; Temporizza 2 sec.
; Disattiva il relè
; Disattiva beep
; Pone a zero il contatore di tentativi; Ripete il processo
btfscgoto
DISPIAY ON-CUR_OITmovtwcallreturn
END
cont err,f ; Prova fallitaAltro_ancora ; Ripete un altro tentativoUP-ICD ; Rjconfigura LCDLCD lNl ; Aggiornalvlessag -6 ; Offset del messaggio 6
lressaggio ; Vìsualizza "Ac(esso negato"0x10Delay ; TemporizzaSi_usata ; Ripete il processo
b'00001 100' ; LCD on cursore offLCD REG
CAII
btfscgoto
Programma r isolto kon tinuazione)
; Verifica il 3" diqit; Uguale?
;No
; Verifica il 4' diqit; Uguale?
;No
ffiw$*ewwr*
Strumenti di lavoro:
caratteristiche avanzate di MPLAB
er concludere questa sezione dedicata a
MPLAB, approfondiremo alcuni strumenti con
cui abbiamo già lavorato e vedremo così altre
possibilità previste in questo ambiente che
facilitano la oroqrammazione dei mtcrocon-
trolìer PlC.
$4p&sM effi $$ ffi &cfs ffi R&T*&frmx p4sm{jg-x
Conosciamo MPASM come un assemblatore che tra-
sforma il codice sorgente che intende l'utente, in un
codice adeguato al microcontroller. Però questo assem-
blatore usato con l'MPLINK, può generare moduli pre-
cedentemente compilati e situati ìn differenti parti del
programma. ll risultato di scrivere un
codice oggetto e di assemblarlo come
un modulo per unirlo successivamen-
te ad altri, o creare direttamente un
file HEX eseguibile, è leggermente dif-ferente.
ffiSMtjLX ffig il#SxflfrPossiamo definire come moduli diver-
se cose. Quando sono istruzioni della
memoria di codice dovranno essere
precedute dalla dichiarazione di una
sezione di codice come mostrato nella
figura. In aìcuni casi, è necessario spe-
cificare la sìtuazione fisica che occu-perà il codice, come ad esempio con il
vettore di interrupt.
r4ffiffiffiLX *gX ffi&YX
Anche i dati della memoria RAM pos-
sono dividersi in differenti sezioni,
disposte in cìnque tipi differenti:UDATA. UDATA-ACS, UDATA-OVR,
UDATA_SHR e IDATA. Nell'esempio si
mostra come sr possa operare una
dichiarazione dei dati nel modo in cui
(il)
Codice assoluto:
cmwOPTION
:
CLRW
OPIION
Codice nei moduli:
CODE
Start
Codice definito come modulo all'interno di un programma
Dati assolutir
cBL0c( 0x20
lnputGain, 0utputGain
HistoryVector
Tempf, Temp2, Temp3
; Controllo di citlo
; 5i deve inizializzare a 0
; Variabili temporali
ENDC
Dati in sezioni:
HistoryVector
lnputGain
0utputcain
IDATA
DBO
UDATA
REs 1
REs 1
UDATA_OVR
REs 1
REs 1
REs 1
; Dati inizializati
; Dati non inizializzati
; Dati temporali
Templ
lemp2
Temp3
Dati definiti in sezioni all'interno di un programma
Sw$sawwvw
siamo abituati e nelle differenti sezio-
ni, a seconda dell'uso che vogliamofare di ognuno, in modo che il pro-gramma li gestisca in modo differen-îe. Per oontrnà delle sezioni si usa untino di direttiva nor e<cmnin noli:IDATA sono permesse le direttive DB,
DW e DATA.
KSff#RY&KX***ffi $:gffi p#RYexg*$* g ffig tr&#*fi"3 {_g
Quando vogliamo che un'etichettadefinita in un modulo o routine si uti-lizzi in un altro, la si deve esportareutilizzando la direttiva GLOBAL, per
ciò è necessario averla dichiarata in
precedenza. A loro volta, i moduli cheutilizzano etichette dichiarate in altrimoduli dovranno essere importati conla direttiva EXTERN. Dato che si lavora
con differenti banchi di dati, dobbia-mo tenere presente in quale banco si alloggia ognunadelle variabili prima di fare riferimento ad esse. Questocompito pero può essere demandato all'assembler uti-
lizzando la direttiva BANKSEL seguita dal nome dellavariabile prima di fare qualcosa con essa, perche sia
l'assembler ad occuparsi di cambrare banco.
rffipesffi fr#ru wtrLKruKtr ffi$3$_5:t$
Una volta editato il modulo in oggetto, perassemblarlo si seleziona l'opzione "Object File"
e il file avra estensione .obj.
ll programma MPLINK si incaricherà di radu-nare e posizionare tutti i moduli realizzati, gene-rando l'eseguibile. ll vantaggio di un progettorealtzzalo in questo modo e la riutilizzazione delcodice con il conseguente risparmio di tempo erisorse.
Da parte sua, MPLIB aiuta anche il manteni-mento del codice, visto che permette di farelibrerie.
Una libreria è una collezione di moduliobject, normalmente con alcune caratteristichecomuni riunite in un unico file, come per esem-pio, la libreria "math.lib" per il lavoro con ope-razioni matematiche.
Per noter tiilizzarp in rrn nronptto diffcrcplimoduli di questo tipo al posto di uno solo, lodovremo indicare come opzione, in Option>Environment Setup, e all'interno di questo,noll: <rhod: Prniort
Sw$$wresse
Per poter utilizzare moduli in un progetto dobbiamo indicarlo in MPLAB
Definizioni delle variabili globali in un modulo:
lnput6ain
0utputGain
Filter
RES 1
RES f
UDATA
G!0BAL InputGain, 0utputcain
Global Filter
; Filter code
Utilizzo di variabili definite in un altro modulo:
EXTIRN lnputGain,0utputcain,tilter
UDATA
Reading RES 1
CODE
MOVLW GAIN1
MOVWF lnputGain
MOVLW GAIN2
M0\AI/F 0utputGain
MOVF Reading,W
CALL Filter
Dati e routine definiti in modo qenerale per essere utilizzati in altri moduli
tffstrfttÌìÙrrR*i
Strumenti di lavoro: caratteristiche
il
ffi'
tu
avanzate detfM PLAB-SIM I
ffiWM ata l'imPonanza che riveste
ffi W il provare un programma
W ffi dopo la sua compilazrone effi wffi ffi prima di programmarlo$W'-,,.--,,-.---.-,w dtrettamente sul mrcrocon-
troller; anche se abbiamo gia fatto i
primi passi in questo settore, crediamo
che il simulatore MPLAB-SlM, all'inter-no deglì strumenti supportati dall'am-biente di sviluppo MPLAB, meriti un
discorso a parte. Sino ad ora abbiamoeseguito un programma, abbiamointrodotto differenti valori sulle linee dir/A ^ -L.A;--^ ^,,-.rlto i risultati suit/v c duutdilru 9uorucregistri corrìspondentì. In definitivaabbiamo venficato che i programmi
andassero bene, e che facessero quel-
lo che ci si attendeva da loro. Pero,
avete provato voi a fare alcune delle
modifiche che vr abbiamo proposto?
E in caso affermativo, che cosa è
successo quando il programma non ha
f unzionato? Avete trovato la causa?
A volte orresto e diffirile nprchp p np.essalo cono-
scere le caratteristiche avanzate del simulatore che cì
aiutano nel nostro compito.Inizieremo vedendo quelle di cui dobbiamo tenere
conto al momento di lavorare con il simulatore e che
dipendono esclusivamente da questo, in altre parole,
quello che ci permette di fare e che restrizioni presenta
MPLAB-SIM.
Wffi *-*{gYe g}K *:Sffifl àitrg*ru ffi
tN/PLAB-SlM simula l'esecuzione di un microcontrol-ler e orrpllo deoli inn"^-'tt""t+^ '^rocita che-*J" " 'JIC))l/U)LILC' d UllO VEI
dipende dal computer su cui gira il programma. Di
rnnqpnronTÀ ncr In qtesqrì nrnnr:mm: si devonoconsiderare differenti opzioni, per fare in modo che
la simulazione non risulti ne troppo rapida, né trop-po lenta.
$3X$\$ XNSffi ffi$SglUSf,XYffi
MPLAB-SlM può lavorare con molti e diversi microcon-
troller, fra cui il PlC16F84 e, a seconda deì dispositivo
che si sta utilizzando, dobbiamo tenere conto di diver-
se cose.
Alcuni microcontrollel ad esempio, hanno multi-nlex:tp lp loro linee di inoressi/r rsciîe in modo che
ognuna realizzi diverse funzioni e per ognuna di esse
c'è un nome.
Per modificare queste linee, sia direttamente che
con l'opzione di introdurre stimoli esterni, si devono uti-lizzare i nomi proposti per esse, altrimenti il simulatore
non le riconoscerà.
gI\$Yffi$q.Rffi$}Y
Nel caso del PlC16F84 il simulatore supporta tutti gli
interrupt overflow del TMR0, cambio di 4 linee di mag-gior peso della porta B, interrupt esterno per RB0/lNT e
Dobbiamo chiamare ogni linea di ingressoluscita come propone il simulatore
tt tttttttt ::
Sw#sw*xww
Sono contemplate diverse cause di reset
termine della scrittura della EEPROM. Questo permet-
terà di ultlizzare la risorsa di "stato di riposo", da cui si
ócaó aAn rrn intarrr rnf
KffiSgYll srmulatore inoltre supporta tutte le condiztoni di
reset.
ll'reset tramite la linea MCLR si puo simulare con
l'introduzione di un livello basso. seguito da uno alto,nell'opzione di stimoli esterni, o direttamente nell'op-zione del reset dentro l'opzione Debug>Run. Inoltre
abbiamo il reset del sistpma e il reset npr connessione
dell'alimentazione.
Per utilizzare il Watchdogdobbiamo attivarlo come si farebbe per la scrittura del PIC
Scp#&eetrw*"wuiutltmlmtm@ffi
sw&Til*-$ffi*#Anch'esso e simulato nell'MPLAB-SlM, sempre e
quando sia stato attivato in Options>DevelopmentMode.
RffiSgS?eA Sptrflg&g"g
Lavorando con i PIC ci sono alcune risorse che, anchese devono essere prese in considerazione, non dispon-gono di una posizione all'interno della finestra dei regi-slri noirhe non sono recristri di ner se hensì bit all'in-tornn doi ionictri
Si dispone di questi tramite la finestra di registro di
funzioni speciali, come il T0PRE, per rappresentare il
prescaler del TMR0.ll reoistro di lavoro \A/ e rrn r:cn cnpri:lo rhe si trova
in questa finestra.
Ci sono alcune risorseche si possono solo osservare all'interno della finestrarlei rcni<tri di fi tn-ioni <nprtdlt.
#F*g ffig: # 3c'èd $:i hi\Àq tuF!&Lqàtu
Oltre alle linee di ingresso/uscita, all'interno del simula-tore sono disponibili le seguenti periferiche:
. TimerO.
Questa periferica, insieme agli interrupt che provo-
ca, e completamente implementata nel simulatore,potendosi incrementare con il clock interno o median-fo imnrrl<i octorni ln nrro<t'rrltimn r:<n il +on,lpo In cull- li^^- .i,--^^ - 1 ^ - n,l^,,^ ^--^.^ .J; -td il|ed |iltd|e d I e a u, oeve essere ol almeno un
ciclo, per essere tenuta in conto.. Memoria dei dati EEPROM.
Anche questa risorsa e simulata, insieme ai suoi cicli
di lettura e scrittura. E approssimativamente di 10 ms.
Le funzioni dei bit di controllo WRERR e WREN sono^^-r^t^--^ -i-,,l-+^cttLtI q))E )[ ttutoLE.
Strumenti di lavoro: caratteristiche
FS.t';ffip':c::::
w:-:'r.';tu
ffiffitr.È.i'
tu"
&il;ff'iU;::ll":''F^i
*Fr'
$;
ffi'
ffi.
ffiiw'
ffilffi-
ffiffi:
ffi'ff
ffi
ffiffi
ffiffi'
avanzAte del MPLAB.SIM II
e avete letto la scheda precedente, sapetegià cosa potete o non potete aspetlarvi dalsimulatore MPLAB-SlM. Vediamo ora comesfruttarlo al meglio, a seconda delle nostre
esigenze e in ogni occasione. Ricordate cheper avere accesso agli strumenti di simulazione, e
necessario cambiare l'ambiente di sviluppo.hr a,,aa+r -+^--- {i^^-+"- -i ^^+.-^^^ i^^l+"^ ,,^"iL-/d LlUC)Ld >LC>>d ||C)U d )r p\JLtdt il tU il rUil rC Vúr r-
ficare se esistono delle limitazioni nella simulazionedel disposltivo scelto, oltre ad ottenere "dettagli" sul
medesrmo.Se non si cambia l'ambiente di sviluppo, le opzio-
ni di simulazione appariranno disattivate.
h* g* &.1 i-4 f* f' $* [ !r ,f-trgfi,às{3 *.Fnm{-,\}
ll monrr Dahr rn rnntiano tr rfto lo nnzinni norocqerio' quando si sta simulando un programma per la sua messa
Se non si cambia l'ambientedi sviluppo le opzioni della simulazione-^^-;^^^ );.-++;,,^+^d pPa tvt t9 u/)dLtrvo(9.
a punto. Le opzionipiù importantisono rappresenta-
Ìe ancne In una
barra di icone
come quella ripor-
tata in figura.
Questa barra si
ottiene cliccando
sull'icona di sini--+.- -.1^ll-,,iJ^^+^)Lt d ucild vlucdLd.r\,,-^,.J^ -i ^----vuoruu )r po))csulle icone con il
mouse, sulla linea
inferiore di N/PLAB
appare il commen-ro per ognuna 0l
CSSC.
Cambiando l'ambiente di simulazione si possono chiedere" àa+f an I i " Aal Aic nn< iti,nvLr(uyí vL, v,JPvJ,(,vv.
#pxx*rdtr K#ruL'opzione Run permette di controllare l'esecuzione del
programma. Si puo eseguire in modo continuo (Run)
sino a che non si trova un "punto di rottura" o si clicca
l'opzione di fermata (Halt), evidenziando i valori der
registri durante l'esecuzione (Animate), o istruzione a
istruzione (Step). Si puo inoltre eseguire una subroutineda sola. e fermarsi subito dopo (Step Over). Per ferma-rp il nrnrpscnro ci nro ltsare l'onzione Halt con cut st
visualizzeranno le informazioni delle finestre corrispon-
denti. Un'altra opzione di fermata è Halt Trace, che fer-merà il "tracciato" del programma, però questo conti-nuera ad eseguirsi. I registri si possono inoltre rendere
visrbili con Update All Regìsters. Per iniziare nuovamen-
te si puo scegliere l'opzione Reset, che provoca una rei-
nizializzaztone del processore, come se si premesse il
pulsante N/CLR, oppure iniziare da un punto preciso,
altrimenti può essere interessante cambiare il valore del
PC (Change Program Courter).
Opzioni pu rmportanti del menu Debug
Sw#*ewwwm
Opzioni del menu Run
#Pffig*ruffi ffiKffiflLJYffi
Al momento di eseguire il programma, potrebbe esse-
re interessante non farlo girare completamente, maverificarlo fino ad una particolare istruzione (Execute an
Opcode), o eseguirlo fino al verificarsi di una determi-nata condizione (Conditional Break).
{.}pK€#*{ ffi sgr4 {,$ {_&Y#ffi sYge4 # L{JsOltre a generare stimoli per il simulatore in modo inte-rattivo (Asynchronous Stimulus), si possono descrivere i
segnali che arrivano ai pin di ingresso come file ditesto(Pin Stimulus), o ulilizzare i file di testo per introdurrevalori da B bit direttamente sui registrr (Register
Stimulus). Se gli impulsi devono essere periodici, come
Può essere interessante eseguire una sola rstruztone
Scs*Éwwril,
:',::l.l:
.:i:':,lt
)l:11&
l. l:r:aÌ::
..1::ì::.::::::li:i*
.);:;,...::L:.):
.:rì:ir.:t
:.:'.1:.1;*
,,,1i'*:::::lll;.:.ì::il:,:aZ
.:aa,:a::;).
,;,f4'.:,,tt)!*.::a:a.::.ffi
:..'::.a,a,i:l
:'aa:,1::.......4:a
':::::::ri
.a:a,aaa'.::.: ::,1
:ìIìÈ4:.i,:ìi:.}
:,::i*:L4
--a:al*, I t:,.:tj:
r. t:r
:ì$:r,::,:
.'::,:::7
:':,aL
.....::a:tt ,,:::='i :l::::,'t:ì,::ì,.:.,:.1)::::'
.: i+...:::-,?
:r::i:ìrlì.ì:ìrì::
i'ì
5i possono scegliere i valori dei regrstri dopo un reset
ad esempio un treno di impulsi, si utilizzerà l'opzioneClock Stimulus.
ffiffiffiAK P*K€4Y $: €W&{tr a3*gF*3
lpunti di rottura (Break Point)e ipunti di traccia (Trace
Point) sono due elementi fondamentali per mettere a
punto un programma. La definizione di un punto diroîtrrra nermette di rombinare i diversi modi di esecu-
zione, in modo che, ad esempio, il programma vengaeseguito in modo rapido (Run) sino ad un certo puntodi rottura, in cui il programma si ferma e si può simu-lare passo a passo. Se inoltre si definisce un range di
indirizzi di programma, si puo sapere in ogni momentoche valori hanno i registri quando sono eseguite quelle
istruzìoni. Entrambe le oozioni 0ermettono di visualiz-zare lo stato del nrrìrpssore. ouando si stanno cercan-do possibili cause di un mal funzionamento del pro-gramma. Queste funzioni si possono annullare facil-mente con Clear All Points.
&LgRil *trX3#r,jgEsistono altre opzioni che possono essere utili in deter-minati momenti; ad esempio simulare la cancellazionedel microcontroller con Clear Program Memory, reset-
tare il sistema completo come se iniziassimo in quelmomento a lavorare con MPLAB (System Reset), ogenerare un reset che ponga tutti iregistri con un valo-re determinato o casuale, a seconda di cosa si sceglie.l'onziono Confor f)ohrrn I nr:tinn normatta dr csonrrrro
un salto nella simulazione del programma, collocandoil contatore di programma alla metà del codice che si
sta verificando