Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

54
fistruzione IORLW ;; t istruzione "ior" o "or inclu- ilú ffi Srva realtzza la somma m ffi 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. xsxwqx e#ru rIs?RilAX$Ns ISnLW Così come I'istruzione andlw, anche la iorlw. è un'istruzione logica. quindi I'operazione che esegue si realizza bit a bit e non prendendo come unità il registro completo. In una somma logica 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 non fornisce un valore concreto ma solo vero (V) o falso (F), TABEIIA GENERALE RISUI-TATO Funzionamento dell' istruzione iorlw se valutiamo il risultato globale non potremo 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&KWT L'istruzione iorwf è il secondo modo di realizzare istruzioni di somma logi- ca. Come mostra la figura, e secondo il formato visto fino ad ora, l'opera- zione si fa con i valori contenuti nei registri della memoria RAM e quello del registro dr lavoro W. A seconda OPERANDO OPERANDO MNEMONICO 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

description

Tutta la raccolta in versione torrent al link: http://www.tntvillage.scambioetico.org/index.php?act=showrelease&id=192104 Su Issuu c'è la raccolta completa. Cerca "Monty Peruzzo Editore".

Transcript of Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

Page 1: 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

Page 2: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 3: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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*

Page 4: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 5: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 6: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 7: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

*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*

Page 8: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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*

Page 9: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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*

Page 10: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 11: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 12: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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*

Page 13: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

À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

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

Page 14: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 15: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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*

Page 16: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 17: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

-*''"'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

Page 18: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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ì

Page 19: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

,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

Page 20: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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#&

Page 21: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 22: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 23: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 24: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

$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

Page 25: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 26: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

€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.

Page 27: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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*

Page 28: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 29: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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*

Page 30: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 31: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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*

Page 32: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 33: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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*

Page 34: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 35: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

; 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*

Page 36: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 37: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 38: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 39: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 40: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 41: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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*

Page 42: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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::

Page 43: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

&

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

Page 44: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 45: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 46: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 47: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 48: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

;: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*

Page 49: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 50: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 51: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 52: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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.

Page 53: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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

Page 54: Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

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