Microrobotica Monty Peruzzo Editore - 09 C - Programmazione

Page 1

fistruzione ;; ilú

ffi m

ffi nU ffi

t

IORLW

istruzione "ior" o "or inclu-

Srva realtzza la

OPERANDO

somma

MNEMONICO FONTE

logica deoli ooerandi: il letterale che sr accompagna al

codrce deil'rstruzrone e rl contenuto del registro di lavoro W. Come nelle altre istruzioni dello stesso formato. il risultato si lascia nel registro di lavoro W. Se il risultato dell'ooerazione è 0.

l ;

io, r'l* Operozione:

OPERANDO

DES1N44ONE

..'.,1(

reolizzo l'operozione logico OR

fro un volore letterole e il volore

si attiva ll flag 7.

del registro di lovoro W

xsxwqx e#ru rIs?RilAX$Ns ISnLW

Cicli:

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

Codice

registro completo. In una somma logica il risultato è sempre vero, cioè

I

OP: I I 1000 kkkk kkkk Flogs: Z

Ca

ratte ri sti ch e d e I l' istru zi o n e

'1,

quando almeno uno degli operandi lo è. Nel PIC questa 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'istruzione, e il suo modo di operare. L'esecuzione bit a TABEIIA GENERALE

io rl w.

bit è quello che realmente fa questa istruzione all'interno 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), se valutiamo il risultato globale non potremo trovare differenze: indipendentemente dai registri iniziali, il risulRISUI-TATO tato finale (V o F) sarà lo stesso in entrambi r casi.

L"XSTRIJXS$MH X&KWT L'istruzione iorwf è il secondo modo

di realizzare istruzioni di somma logica. Come mostra la figura, e secondo

Funzionamento dell' istruzione iorlw

il formato visto fino ad ora, l'operazione si fa con i valori contenuti nei registri della memoria RAM e quello del registro dr lavoro W. A seconda

Sw#*wrwre


',1:2 .r..irì:ì::ìli

,,.$

OPERANDO

FONTE

MNEMONICO

OPERANDO DESTINAZIONE

.,:.:ì|F

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

::i::iì :. ìiì:ìì

.

i a r'w.f

r

Operozione: realizza l'operozione logico OR fro il volore del regisfro f e il volore del registro di lovoro W. Se d=0 il risultoto si loscio nel regisiro di lovoro W e se d=I

ìTABELIA DETLA VERITA

Codice OP:

00

Flogs:

Z

0t

00 dfff ffff

le istruzioni, dove ogni bit la <i nr rn rrmhi:ra ltr, ó C nn llul n| )l Puw Lolllurdlr

zinni

Pon<:ta

,-+",U' I)LI ,

2 nro-

sto nuovo esempio: vogliamo porre a 'l una serie di bit di un -^^i-+-^ regr>u

^,,-l-i--i u rludr)rd)r, norn <én7: mndificarne nessuno deglì altri. Questo è nor-

male con

registri

qtà

.

:::.::,:rj

deve

essere trattato rn modo indipenden-

ffiStrffiffig fl#8!$ $i'g$Yffi#gg*ruffi K*RW$ Parlando delle istruzioni andwf e andlw, abbiamo

li---.^ ,1i,,^"-^ IIZZÓIE UIVCI)E

':,!

ito con interruttori

specifici come quelli che controllano

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.

desideriamo ottenere, dobbiamo applicare una maschera o un'altra, quindi uti-

I r:ì'€

per rappresentare le istruzioni ior.

Caratteristiche dell' istruzione iorwf.

introdotto il concetto di maschere, e abbiamo visto due esempi. Però, a seconda di quello che

:...1t:j

il;il:, Circu

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

':::t\

1o g*--i*'-

si loscio nello stesso registro f. I

iì:ìi.iì

rìì:ì: .

Cicli:

,

rr:lnra vdlulc

'::t::.11*

i!

d:

trrttn il reoistro Se si tratta Solo di 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 modirnnvenicnle l'rrtilizzo delle fir^aro J vL:,|| dpnli vR v|1, hit Lc nirr |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 0 dovremo fare delle maschere successive con le istruzioni "ior" e "and".

:..ì:i!:€= . ,i::t:l{*

.:

a:.::.',:ÍÍj

'::lir::}!

.:

t:l a:,:c

::

'..,,:.tt ,::i.t

i:,ìF

lmpostozionea-l dei 7 bit più..significElivi.di un registro

-'vt::j5ll:li

senzq influenzore quelli meno significotivi. Senzq utilizzore lq funzione ior REG,I REG,2 REG,3 REG,4 REG,5 REG,ó REG,7

bsf bsf bsf bsf bsf bsf bsf Esem p

i

del

I'

Utilizzondo lq funzione ior

movlw b'l1l I1l lo'

iorwf

., ..:a:,:

tr;-.,!!

:.::ì*

.:t::;,

t1,€

REG,F

.,:.::,:: .

.::.:.|:

''tt:l ,::Lii.,|

istruzione i orwf

lìl"sg$

Sw6*wwww


Appli cazione pratica: quattro interrupt come uno solo bbiamo già visto il primo dei quattro inter-

rupt che si possono verificare in un PlC16FB4, quindi ne rimangono altri tre. Questa volta ne utilizzeremo uno molto particolare, dato che può essere generato da diverse cause. Stiamo parlando dell'interrupt per cambio di stato dei piedini più significativi della Porta vale a dire R84-R87.

B,

wx %YW* mx &&4*Rffi3 Quando uno di questi piedini cambia stato, cioè passa da 0 a'1 o viceversa, si attiva il flag RBIF, e il PC punta il Vector di lnterrupt. Nella Routine di Servizio dell'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 periferiche collegate alla porta B sono pulsanti anziché interruttori, dato che il loro valore torna allo stato iniziale dopo che sono stati rilasciati. Comunque nell'esempio che stiamo per fare non ci preoccuperemo di questa verrfica, ma tratteremo in egual modo l'insieme delle quattro linee, senza verificare quale ha provocato l'interrupt.

Si vuole proteggere

Anrho

nro<+:

volta il program-

ma principale

utilizzato

è

RSI

solo

per le inizializzazioni dei registri, infattirealizzeremo tutte le altre

operazioni nella routine di inter-

Moslro RB4-RBZ

',

Attivo cicolino

rupt. l-nmo nnfoto

osservare, questa volta nell'or-

Resetto

ilflog

ganigramma non siamo

scesi

a basso livello, )ut tu

-+-+^ )Lo LE ltó-

Ritornq

,,

sciate le azioni da realizzare in

linguaggio natu- Organigramma della routine dell'interrupt rale. In seguito, al momento di metterlo in pratica, ci preoccuperemo di vedere quali ìstruzioni o che tipo di elaborazione saranno necessarie rn questo caso. Per lavorare con gli interrupt, avremo nuovamente bisogno del registro INTCON, i bit coinvolti in una casa dall'ingresso di intrusi, quindi si montano quattro sensoquesto caso specifico sono riportati porta e tre sulle finestre, Quando uno qualunque di questi si attinella figura.

ri digitali: uno sulla 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

Come nel caso dell'interrupt per RBO/INT, il bit 7 del registro INTCON dovrà essere messo a 1 per l'abilitazione generale degli interrupt, inoltre il suo bit specifico. il bit 3, dovrà anch'esso valere 1. I rimanenti interrupt dovranno essere disabilitati, dato che non sono contemplati. ll flag RBIF (bit 0 del registro INTCON) passerà a 'l quando si verificherà l'interrupt.

#&w&*wwx*


tNtzl0

NIENTE

P=16F84

; Definizione del processore

IQU

03

; Definizione di variabile

EQU

05

EQU

06

EQU

OB

EQU

0

EQU

0

ORG

0

goto

tNtzt0

ORG

4

g0r0

INT

ORG

5

bsf

5TATO,5

movlw

0xF0

movwf

PORTAB

clrf

PORTAA

bcf

5TATO,5

; Posizione del vector di interrupt

; Programma principale

; RB4-RB7 ingressi e il resto uscite

; Porta A uscita

PORTAB

; Cancellazione della P0RTAB

m0vtw

b'10001000'

; Attivazione degli interrupt

movwf

INTCON

; per RB4-RB7

; Mirroconfoller in stato di riposo

sreep

goto

NIENTE

;

Al rientro dall'intenupt

; ritorna in stato di riposo ; ma il cicalino continua a suonare

; Routine dedicata all'intenupt

PORTAB,W

; ll valore dei bit piir significativi ; passa ai bit meno ; significativi

PORTAA

; 5i passa il valore dell'allarme

;alla

P0RTAA

PORTM,4

; 5i attiva il cicalino, collegato a RA4

INTCON,RBIF

; Si resetta il flag di RB4-RB7

retfie

Programma proposto ììììiì:ì:

..,:: a:,:

,:,:,:::i

ì,:::*

Sw$*x*r*xww

t:at

t

iììì:ll

:ì:ìì


x*" pffi*ffiw&MM& fl*fl$$3*_ffiY#

Come potrete verificare, il programma è simile a quello già vi-

sto per l'interrupt RBO/INT. Nell^":^-i^-l^ ra ^-"+^ pdrre pflncrpate, oopo aver realizzailo le configurazioni op..J

portune per questo caso, il programma entra in stato di ripo-

so, e attende che si generi un intprrr rnt P:rto dplla oofta B si configura come ingresso, per-1.-^ -,,i saranno queila a ^ cut cne --.\ sa[a ^,,^ilcollegati i sensori. Sulla porta A

visualizzeremo l'informazione relativa all'allarme attivato, e sulla linea RA4 dovra essere collegato un cicalino che si attivera con l'interrupt. Per realizzare

quanto detto, utilizzeremo l'istruzione swapf per scambiare Situazione della simulazione dopo aver attivato RB4 bit piu significativi - dove sono collegati i sensori - con quelìi meno signrficativi, dato che la porta A dispone solo di no rimarrà attivato anche se non si esegue nessuna 5linee e non di 8 come la porta B. Al rientro dalla rounuova istruzione, in questo modo l'allarme non si potine di interrupt, il microcontroller tornerà in stato di ritrà scollegare, anche se i "supposti ladri" richiuderanposo, pero grazie alle sue caratteristiche, questo cicalino la porta o la finestra da cui sono entrati, a meno che non si resetti il sistema. Prima di uscire dalla routine di interrupt Er&4.:*4 9Èó 'g*boÉ.It+' 'F" .1la {,-il-l tn :h:tÉ bisogna resettare il flag dell'ini

=

l{ane tnro ,Pcl optlún*reg status ,fÈf ;parta trisa portb trisb eedata :eecsnl eeadr :eecon2 .pclath intcon ,u tgpre :SFg

-

Her Des glnarg

r1*d

*-ro

f ryrl-i

tuÉfl I

ffi

ghar ,:È LISÍ P.lóF84 0 0S066000 = :SrnrO E0U e3 6 BgSgBBBg PoFrîn EQU 05 2SS 1 t1 t1111 24 0úBl100B PoBffi8 EqU 0ó rHrcoil EQU eE 6 686906!0 :f,BIF EQU 6 800SB609 31 00011i11 UEqUO 6 06060S66 2SS 111 111 11 ,one0 0 60606060 0 00606000 oEG 4 goto I Hl 0 06086660 0 g6!96800 onc s B 00600680 :; 0 00989006 Programa prlnclpale 0 086806$0 0 00050000 IHIZI0 bsf Sfnl0,5 troulu 0xF0 : souuf P0nTA8 clrÍ P0RTAn É= : bcf STfiTo ,5 *g : crrÍ P0BTAE ry .l *"ur tryt t I noutu b't00fise0' s'iÈffi i" ffil7F l_ e{ tlJI I nouuf lilTcoil 1 J Je sfeep goto HIEHTE -- _l | .l

68 0B FF 18 00 00 1F 00 FF 60 86 06 0B BB 00 05 06

; Deflnlzlonè det prrj ; Deflnlzlone rll uari

torn rnf nrnÀnttn

$g$4qJL&trg#$\$ffi

##L $}ffi##W&Mffi&

O

f

Finestre necessarie per Ia simulazione

Simuleremo il programma in mo;

do continuo (Debug>Run>Animate) e lo seorriremo tramite

Poslzlof,e del uectr

:

; RBlr-887 lngressf ; Porta R lsclta ; ; ; ; ; ;

e,

canceuazione delr,

nttluaztone degtl: Per

8Bll-RÉ7

ttlcrocontrollore

1l

nl rlentro dall'ln rltorna ln stato d, tî.

i

registri specifici (Window>Special Functron Register) poi introdurremo der valori tramite le Iinee R84-R87. Queste linee le dovremo configurare con la finestra Debug>Simulator Stimulus>Asynchronous Stimulus, per simulare un interruttore (Toggle) come nella figura, o un pulsante (Pulse).

Dopo aver attivato la simu-

lazione, potremo, ad esempio,

$w#sxxswww


attivare la linea RB4. Vedremo che si produrrà un rapido

cambìamento nelle linee

esecuzione del programma, e

che la linea che evidenzia

le

istruzioni in corso tornerà nella sua posizione di stato di ri-

poso dopo aver eseguito la Routine di Servizio all'lnter-,,^+ -^-,, rupr. comunque e QUarcosa ^,,-l-^-porta nella A cambiato: sono ora indicati i valori della porta B, e si e attivata la linea RA4, il cicalino. Anche se torneremo a clìccàre str R84 ne. rinorlarla alla sua situazione iniziale, il cicali-

no non si disattiverà, anche se il nuovo valore della porta B si potrà vedere sulla porta A.

#YXA"ggX*

ffiKtil'3NYmgffiqiru pffiK ffis&-*s3

TASTIERA

In questo caso abbiamo utilizzato'l'inlerrrnt ner R84-RB7

Collegamenti di una tastiera esadecimale per I'utilrzzo con interrupt

in un esempio semplice ed efficiente. Un utilizzo tipico di questo interrupt

ila* tnr0

ffn

,tsr

09

I Prîgrarr priÍcipalr

0.s g

pcl ù€ J4 80981f18 oFtiún_reg ff 2í5 1llllJJ1 rr ? S É881 61 0g stèlus 1

trisa psrtù tfirb esdata eÉe6nl e€*dr aers0a gclatb lntfofi s89 tÉprf

€B €B F0 gB È0 8È Sg

,rlIZI0 bsf

SIllù,5

nelr ùrFa ilerf P0Írm elrt P0BTlt bcf S1îI0,5 clfÍ P0*tCt F{rlr l"lttrltlt' mu* llll0lltl

; [8]-187 inqr*ssi ; Portr I usciti

e,

piu comuni sono le esadecimali. Una +ac+iòrì Inr lr R :l rnmnlorO n^r+: LO)LlEl O n..r WLIUPO PWI Lu u ur LvrrrvrL

; Cancelli;ionè úFIl i fittiuaziom lenli ; prr n8{"881

to: ibit piu significativi configurati come ingressi sono queìli che utilizzano l'interrupt per R84-R87, e i bit meno significativi sono configurati come

SS

gB

É ll cicalino

èrt

; nouti[r

dcdf?eta

ItlT sragf

rotr

óu'iritcrrúpt

PfFfcS,g

Il u.lor€ d?i tit

Ir$rà ai bit rîo

signiflcittui 3i pigsa it ualorB

6$rtFt

-,É*

|

ì tr;t*t _

Situazione della simulazione doao aver rioortato la lrnea RB4 come all'tnizio

$w$sxwwww

I

iua Plt*Iif Si àtti{a il .ieal: SÍ rescttn lt flag

r*_l

è la rilevazione dell'attivazione di un nrrlsante di rrna tastiera matriciale. Orrpsf e tastierp noccono contenefe YvrJ!L nrr:ntitì divor<o di nrrlq:nti nrrollo

rrcrito Prompndn rrn nrrlcento qi nrn,,^ -ìl,intefnO della utt i^+^"",,^+ il ttgtr UPL/ ol

,r, ".\ uutto

routine bisognerà verificare di quale ^, l--^+^LE -i ^^..^-li---.^ put)or Lro Lro, PEr rEoil44orc )r +..++-

l^ rc

operazioni opportune. Questo uso anrp le nortp ad rrn: moltitudine di -^^li---i^^i Lr-L^ rE *.-mite I' ulilizzo dppilLdzrurr, Lro delle tastiere, forniscono la possibilità

di introdurre dati in modo versatile, in modo familiare per l'utente.

e


* Fj

.,,

il #* ry

fistruzione XORLW

rffi ry

F u sistono due istruzìo-

r:'

ni di somma logica: la inclusiva "ior" , di

"

iì€

I

-t-Aì-,-^ ru ^;\ ^-. -,,i LUr CUUrdr 9rc Porl-+^ ^--1,,-i,,tdLU c^ ltd ú)Ltu)tvd

*atttt:

::'-"

;' ;Sír

,

,

"xor", a cui dedichiamo queste pagrne. I l^-

'.1 tu9tLd ^.-t' c)Ltu)tu||d -^--1 )uil il |d t^^t-^

va f ra due operandi significa che uno e solo uno di essi puo

:.

1.,

,

!

ry

I

{-.^ ilr'^ modo che lo sia anche il risultato. Nel caso della xorlw, la somma è realizzata fra i bit E))CtC

^^- rdrc O I pEr

che compongono il registro di lavoro W e quelli del letterale -t^^ ---^^^-^^^r codice rPo9ro ol Lt tc -t )r dLLUr

dell'istruzione.

#

ll

risultato

si

carica nel registro di lavoro W,

H:

e si attiva il llag Z nel caso

# ffi|,

valga zero.

rffi w....

Funzionamento dell'istruzione xorlw

;'

gsffi&,eFg

ffi

e*$'* L'í5?HL$r-g#ru

ffi T.

L'operazione di somma logica esclusiLduclld vd >tr9uc,^ l.ld +.k^ll.

a ::: :'::'-

-.. ,, ':.""

ffi K#

ffi

-l^ll-,,^"i+ì vcr ild urild

*-W ^l^lluEild

figura. Nel caso di linguaggi che permettano piu di due operandr, il risultato sarà vero se esiste un numero dispari di valori veri e sarà falso per un numero uguale a zero oppure pari di valori

'

àr.

;

ffii

:''

veri.

Sgi_!g$ìliìtlì:ì.

E come se si realizzassero operazioni concatenate di istruzioni xor fra due operandi.

Y.:l|LZ,,:,:.,

?ì.:i;2::,::

::-:-:

::

; I

Caratteristiche dell' istruzione xorlw.

:

S*,p$l$wwry*


fistruzione XORWF :! 'i* iì:ì:

a xorwf realizza la stessa f unzione della xorlw però prendendo valori da locazioni

Compara le uguaglianze fra due registri

movf xorwf btfss goto goto

i

diffpronti rinc d:l roni5166 li lavoro W e da un registro della memoria RAM. Ancora una volta il risultato si puo scrivere nello stesso

REG1,W REG2,W STAT0,Z

N0_UGUALE UGUALE

5e REGI = REG2 il risultato sarà 0 e il flag Z passerà a

registro oppure in W, attivando il flag Z in caso che sia zero.

I

Compara I'uguaglianza di un registro con un valore determinato

#s##wpg fl#ru

movf xorlw bffs goto goto

LTsTffi qix3*fl,*ffi

K*ffiWF In questo caso utilizzeremo l'istruzio-

ne xor per fare delle comparazioni. Approfitteremo del fatto che il flag Z si attrva in presenza di un risultato rrorrale à Tero inoltre uti izzeremo nuovamente le maschere.

REGI,W b'01010000' 5TAT0,Z N0_UGUALE UGUALE

5e REGI = 01010000 il risultato sarà 0 e il flag Z passerà a Esempi con

l'istrulone

'l

xor.

ilsfrwpt OPERANDO OPERANDO

MNEMONICO FONTE

xorwf

f

DESTINAZIONE d

il;;; ;;;;;l;*";; i;;;;;""' esclusivo fro un volore de, registro f e il volore del registro di lovoro W. Se d=0 il risultoto si loscio nel registro di lovoro W e se d=l loscio nello stesso registro f.

Cicli:

1

00 0t t 0 dfff ffff

Codice OP: Flog:

Z

{fl}ru

t:3s?tr#tr,g*rutr H*ft Nell'esempio si mostrano due tipi di comparazioni, una fra registri e l'altra f ra un registro e un valore letterale. Per entrambi si utilizza il registro di lavoro W - cur -,,i .isr porta ^^"+- ilil ,,-l^"^ d varore Oel nrimo rpoistro e in soqg jto dopo averlo comparato con il valore letterale o

aon lrn :ltrn rpnistrn si salta nelcaso che tlflagZ si sia attivato, cioe nel caso in cui il risultato valga zero, il che significa

Ca

ratteri stich e del I' i struzi

#e+$i'&w,g*r*q*

o

ne xorwf

che entrambi .

sono uguali.

i

valori


Appli cazione pratica: [a EEPROM avusa a[ termine delta scrittura

'

ome abbiamo visto nelle applicazìonì mostrate sino ad ora, gli interrupt ulilizzaÍi bene evitano ldal ruvvrv l:rinrn:l ur nrnro<.^'^ ldwLr VrvlLJJUIC, sciandolo in stato di riposo o libero di dedicarsi ad altre cose. Questo e utile con risorse che richiedono un determinato tempo ma che possono funzionare in modo autonomo. come nel caso della memoria EEPROM dei dati. Come ricorderete questa memoria si legge e si scrive elettricamente e i suoi dati non vanno per-

LIST

P=16I84

RADIX

HEX

WR WREN

EQU EQU

t

EEIT

EQU

4

RPO

EQU

5

GIE

EQU

STATUS

EQU

EEDATA

EQU

EEADR

EQU

0x03 0x08 0x09

INTCON EEADR-VAR EEDATA-VAR

EQU

OXOB

EQU

0x0c

FQU

OXOD

EECONf

EQU

EECON2

EQU

0x88 0x89

-: -rimentaZiOne. ^,,-^,r^ )r-i +^^ì;^ LUvilE ql )t L]uoruw

Se il processo di lettura è immediato, quello di scrittura richiede diversi millisecondi per essere rea izzafo, una volta dato l'ordine.

I

0

; ll programma inizia all'indirizzo 0

ORG

tNtzt0 4

;

goto

INTER

ORG

5

u

tfu

goto

tNrzt0

; Utilizziamo il PlC16t84 ; 5istema di numerazione esadecimale

MOVIW

03 EEADR_VAR 27

Vector di intenupt

; Metto l'indirizzo da scrivere ; su una variabile ausiliaria ; Metto il dato da scrivere ; su una variabile ausiliaria

gru?frffiRt$FT trffi& rgruil *3ffi1 ilX{L* m3 Sfl$CgTY#ffie ffiKt_L& ilffirffi*ffi

mow'rf movlw mowvf movlw mowrtf

Quando parlammo per la prima volta della

call

SCR|V|_EEPROM ;Chiamo la toutine

9orc

TINE

movf movwf movf movwf

EEADR*VAR,W

bsf bcf

STATUS,RP0

costruimmo due subroutines, una di lettura e una di scnttura. Ora modrficheremo quest'ultima per fare in modo che si produca un interrupt ogni volta che termina la scrittura di un dato nella EEPROM. La su-

EEDATA_VAR

b'11000000'

; Abilito gli interrupt

INTCON

EEPRON/

SCRIVI EIPROM

broutine di lettura non necessita di modifiche, però il programma princrpale dove si trova dovrà essere cambiato per adattarsi agli interrupt. Nel programma della figura non e stata inclusa la subroutine di lettura per non distrarre la nostra attenzione. La chiamata all'etichetta della Routine di Servizio dpll'lnterrr rnt p stata rollocata nel Vector di lnterrupt che e all'rnduizzo 4 della memorra di programma. Sceglieremo nuovamente i valori 03 e 27 come indirizzo della memoria e dato da scrivere rrspettiva-

mente. Nel programma principale dob-

bd movlw

mowd

; Porto l'indirizzo sul registro

EEADR

EEDATA_VAR,W ; Porto il dato sul registro EEDATA

INTC0N,GIE

Itcotlt.wRfU

0X55

EECON2

movlw movwf

OXAA

bsf bsf

EECON1,WR

; Passo al banco f ; Disabilito gli intenupt

;nUititolaslrittura ilnizio la sequenza obbligatoria : di scrittura

EECON2

INTC0N,GIE

sreep

;Ordine di scrittura ;Abilito gli interrupt ; Entro in fato di riposo ; da cui uscirò con un

intenupt

relurn INTER

bcf bcf bcf

retfie FINE

EECONI,EEIF EEC0Nl,WREN

STATUS,RP0

; ; ; ;

Resetto il flag Disabilito la scrittura Passo al banco 0 Rientro dall'intenupt

n0p END

Subroutine e programma per la scrittura della EEPROM dei dati con interrupt

Sqp$Ew*xs*


se. Inoltre saranno molto utili la finestra dello stack e il clock di sistetttd.

noP END

Schema del processo che si esegue nel programma

biamo solo configurare gli interrupt che si possono produrre e chiamare la routine di scrittura prima di andare alla fine del programma. Da parte sua la sua la subroutine di scrittura ha una n>rta rrtttr> l: crri++' '"a del reAiStrO FFCOI\12 SeCOndO

Facendo la simulazione mediante animazione (Debug>Run>Animate) si vedono chiaramente i salti che si producono lungo l'esecuzione, sia per il movimento della linea-cursore lr rnnn Io i<trr rzinn ,, i doI --, programma, sie npr nlí indirizzi di ritorno che si memorizzano nello stack. Comunque, dato che si impiegano 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 clock di sistema segna un po'più di 10 ms, in quel momento all'induizzo 03 della EEPROM dei dati deve aooarire il

le specifiche del costruttore, durante la quale si deve inibire l'accettazione di interrupt, cosa che si ottiene mettendo a 0 il bit GIE di INTCON. Terminata questa prima scrittura si può tornare ad accettare gli interrupt riportando a 1 questo stesso bit, e dare I'ordine discrittura. 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 Servizro dell'interrupt. In essa eseguiremo solamente il reset dpl fl:n di fina <rrittr rr: o dal hit rho normatro flro<r2 vrrrrrLLLL 9vuJru

tura della EEPRON/. integriamolo in un programma riferito ad un'applicazione concreta Come si puo vedere tutto si complica poco a poco. Guardate l'organi-

scrittura, prima di rientrare. Usciti dalla routine di interrr 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 salti che si producono lungo ìl programma. Al momento della simulazione dobbiamo aprire le finestre dei registri speciali, quella della EEPROVI e il programma in

gramma nella pagina successiva. Dopo la configurazione della porta B come uscita nor mn<tr2ro il v:lnro della EEPROM, della pOrta A COme ingresso per inizializzare la EEPROM, quindi con la somma di nuovivalori, e con l'abilitazione dell'interrupt per fine della scrittura, si arriva al blocco principale del programma. ll passo seguente sarà mostrare il valore

Preparazione delle finestre per la simulazione del programma

Finestre dopo la simulazione del programma

i

Se*SÈwq*rcf

valore 27.

&rF g_tf,éx:i*ru # pffi,eYxt& Una volta visto come f unziona l'interruot oer fine scrit-

-.r.....i4

jli::


della EEPROM. A 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 introdotto da un pulsante indicherà il pagamento di un nuovo biglietto che si memorizzerà nella EEPROM. Ad ogni inizio giornata all'accensione del sistema venà mostrato per un periodo di tempo il valore memorizzato all'interno della ElPROM,

famite deidiodi

LED,

-^-^^,1)cLU|Ud

-^ .; -l )C )t À C Cr-

l'inizio della settimana o no, si inizializzerà il valore

della EEPROM,

il

rho <innifir: crrivere in essa un valnra zarn ln qonrrì-

to si entrerà in un ciclo infinito che incrementerà il va-

Enunciato del programma proposto

lore della EEPRON/ ad ogni

nuovo passeggero, sarebbe a dire ad ognr impulso su .,^r;^^- UCIIO r^il- pul ^^.+Si rrscirà da yuLJtv orresto !r\ ciclo con un Lo n. Jr Ulld llllcd

^

reset di sistema, o quando si toglie alimentazione al medesimo. Dato che ogni nuovo valore è scritto nella EEPRON/, i dati non andranno persi togliendo alimentazione. Passando al programma in assembler bisogna fare

Organigramma del programma proposto

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

ganizzazione pensata

nel l' orga n i g ram

ma. Ricordate

che i rombi di solito si trasformano in domande che utiItzzano informazioni dì tipo salto: "btfss", "btfsc",..., e

LIST

P=16F84

RADIX

HEX

W

EQU

0

F

EQU

1

RD

EQU

0

WR

EqU

1

WREN

EQU

2

EEIF

EQU

4

RPO

EQU

5

EEIE

EQU

5

GIE

EQU

7

STATUS

EQU

PORTA

EQU

PORTB

EQU

EEDATA

EQU

EEADR

EQU

0x03 0x05 0x06 0x08 0x09

INTCON

EQU

OXOB

EEADR_VAR

EQU

0x0c

EEDATA_VAR

EQU

OXOD

TRISA

EQU

TRISB

EQU

EECONl

EQU

EECON2

lNtzr0

i relativi rami sono istruzioni "goto". I riquadri sono di solito gruppi di istruzionì, che potrebbero anche includere subroutine.

: Utilizzo il PlC16t84 ; Sistema di numerazione esadecimale

EQU

0x85 0x86 0x88 0x89

ORG

0

; ll programma inizia all'indirizzo 0

goto

; Vector di interrupt

ORG

tNtzt0 4

g0r0

INTER

ORG

5

bsf

STATUS,RPO

clrf

TRISB

; Banco I ; Porta B usrita

Soluzione del programma proposto

Sw$sx*sw**vm


r--rrl>

SCETTA

SOMMARE

tNtzlAilzzARE

LEGGERE

TEGGI EEPROM

SCRIVERE

movlw movwf

1F

; Porta A ingresso

TRISA

bcf

STATUS,RP(}

; Banco 0

m0vtw movwf

b'11000000'

; Abilito gli interrupt

call

LEGGERI

; Legge la EEPR0M e la porta su PB ; Scelta da fare ; Se M4=0 non è inizio settimana ; 5e RA4=1 è I'inizio settimana

INTCON

btfss

PORTA"O

g0r0

SOMMARE

90Ì0

lNtztAUzzA

btfss

PORTA"I

goto

SOMMARE

; Verifica sul pulsante ; Non è stato premuto

; Premuto, aumenta l'incasso e scrivi la EEPROM

incf

EEDATA-VAR,F

call

SCRIVERE

goto

SOMMARE

; Continua l'incasso

; Inizializza l'incasso

drf

EEDATA-VAR

call

SCRIVERE

g0l0

SOMMARE

; Inizia la raccolta

m0vlw mowvf

00

call

TEGGI_EEPROM

movf movwf return

EEDATA_VAR,W

; Scriviamo l'indirizzo da leggere ; in una variabile ausiliaria ; Chiamata alla routine di lettura ; 5i visualizza il risultato ; sulla Porta B

EEADR-VAR

PORTB

movf movwf

EEADR

EEADR_VAR,W

; Spostiamo l'indirizzo da leggere ; sul suo registro ; Passiamo al banco 1

bd

STATUS,RPO

bsf

EECONl,RD

bcf

STATUS,RPO

movf mowvf return

EEDATA,W

;Ordine di lettura ; Pasaggio al banco 0 ; Spostiamo il dato sul

EEDATA-VAR

; registro ausiliario

movlw

00

mowrrf

EEADR_VAR

; Spostiamo l'indirizzo da scrivere ; sul suo registro

call

SCRIVI_EEPROM

; Chiamata alla routine di scrittura

EEADR_VAR,W

; Porto l'indirizzo sul registro

return SCRIVI EEPROM

movf movwl movf movwf

EEDATA

EEADR

EEDATA_VAR,W

; Porto il dato sul registro

bsf

STATUS,RPO

bcf bsf

INTCON,GIE

movlw movwf movlw movwf

0x55

; Passo al banco I ; Disabilito gli intenupt ; Abilito la scrittura ; Inizio la sequenza obbligatoria

EECON2

;di s*ittura

bsf bsf sleep

EECONl,WREN

OXM EECON2

EECONl,WR

;Ordine di scrittura

INTCON,GIE

;Abilito gli intenupt ; Entro in stato di riposo ; da cui uscirò con un interrupt

return INTER

bcf bcf

EECONl,EEIF

bcf

STATUS,RPO

retfie END

Soluzione del programma proposto. (continuazione)

Sw#*wwrx*

EECONl,WREN

; Resetto il flag ; Disabilito la scrittura ; Passo al banco 0 ; Ritorno dall'intenupt


Àil"

w-

;*

#,,

-.".'

iffi

ffi1Lì:rl

3''a:-

fistruzione RLF

1_i;

J-. ffi& *:l{.

trI. q,r;

il.. tr:'

ffi*"

w F.,

ì

ffiffi. K1--' ffià..

,

: ,

m:" ì\---.,

l

obiettivo di questa ìstruzione è quello di ruotare verso sinistra il contenuto del registro f di

s';, st:-"'

:{;

una posizione, cioè di un bit. ll bit che

MEVT

dalla sinistra è il più significativo, verrà immagazzinalo nel bit di riporto (C) del registro di

ffi.

ffi -'' K&ì.

wl1

w ffi #1,,

-

:

bit che manca da destra, il meno significativo, sarà riempito con quello che era contenuto nel bit di riporto. Come si puo vedere nella figura del funzionamento dell'istruzione, se si esegue l'istruzione nove volte di seguito sitorna alla situazione iniziale, qualunque siano STATO, e il

W.:.

iv:lnri

iK:::::::

ffiSffi$IgPX

ffil $&---:

ffi:, ffig;..

ffi.. iil.:-"

,

s:9 '.

fl*ru

ilJx$Yffi#Xxffiruffi ffiLW

ti OPERANDO OPERANDO

MNEMONICO FONTE

DESTINAZIONE

:-tt;.- i, --:---"i*--*-*-

;ti-

n: ffi;

Operozione

ffi. ffi ffi*"

€icli:

H.:.

€odice

Ki"

rolozione d sinistro di un bit del registro f, utilizzondo il bit di riporlo C. Se d=O il risultoto si loscio nel registro di lovoro W e se d=I si loscio nello slesso reoistro f I

OP: Flogs:

ffi,-

,l^-"+;.^ POTLilE UO questa istru-

zione: venoo

di

dono

W+ :RA::: ffi.

pre

REGISTROf

Volore inizidle registro e

l0t

I I101

rt

Volore inizioleC:

di

0

#, :L

tr: ffi', ffit.

Volore iniziole dopo I'istruzione rlf f,

0l I I 10r0

:

Volore di

dopo I'istruzione rlf f, I

r

ff:'

#:,

C

Fu

nzi ona mento del l' istru zio ne rlf .

1:

1:

ì

2

jS# * I SSS i i# &* # SSS

#as€*s

i

*

S##S* #* &&&* S* #

#bsfsrAlo,c rlf PORTAB,

F

*bsrsrAro,c

*il"t?llà?f TIfPORTAB, F

Susrsnro,c TIfPORTAB, F #usrsraro,c rlf

PORTAB, F

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 introducendo uno zero da destra. Provate ad implementare gli esempi in MPLAB, e verificate come funzionano con la loro simulazione.

Pero

nórmó++ó vL, ,ì,r Lrr

reql=OOtOlllO r

x2 -

imple-

menlare ra moltiplica-

zione

0OIOlllO

oolottlo otol I too

tl rlf reg

I ,F

otor

r 100

dei

numeri bina-

ri.

Differenti effetti con l'istruzione rlf.

d- -i^i )ilil-

oltre a tutto questo, la rlf

ff,:::

I

luci

sem-

stra.

ffi.:,

{r-t-: """ tg'-: r *:-'l

0a

da

.J^-+.uc)Ud

F.-... "

P;.

S S # # & & $ $rlfPoRTAB,F S * S S S # &i *, rlrPoRTAB,F S & S $ # * $ $rlfPoRTAB.r *##*s#*srtfPoRTAB,F

o- -;^i )Uil-

-l^-+"uE)Ltc

-^^ ^--^^ LI IC -t)I OLLEII-

ffi

#[l:*?,Hg,J

una luce cne muo-

una progresrlf

bsfSTATO, C

si va

sione

;'".

#s* * &&s

da

stra, frno ad

Caratteristiche del l' istruzione

ffi::::

a

C

r-:

ffir::

luminosi

00 I 101 dfff ffff

3t+:"-""

ffiE"ì,,

i

EFFETTO

ll primo esempro che ci viene in mente è di creare effet-

gl:-::::,

EFFETTO I

di n:rtanz:

,

Ff:'''

a&

esce

Guardate

Moltiplicazione a base di rotazioni

ff:'

ffi ffi{, ffi

-

Sw$*wwwm


fistruzione RRF e la rlf ruotava a sinistra di un bit in un registro, 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 valore 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 OPERANDO OPERANDO ÀANETAONICO FONTE DESTINAZIONE

Cicli:

OP: Flogs: Codice

rotozione o destro di un bit del registro f, ufilizzondo il bit di riporto C. Se d=O il risultoio

:s**####*F

s*&s#s## s#s&s### &s**##*s &s*#&*#*

Ì

i I

EFFETTO

2

I : 5

{s8rssq8&+#:ff::]i;,;: SeRAO=O sPegnere un diodo.

si

loscio nel registro di lovoro W e se d='l si loscio nello stesso registro f .

EFFETTO

I

00 1 100 dfff ffff

3

;#*#**### :w****#dFs

C

i*w#**{**e !ww##*#**

Caratteristiche dell' istruzrone rrf

REGISTRO

I

s#s8*#*# s*&#s*&#

Íd Operozione:

EFFETTO

f

!

Differenti effetti con le istruzioni di rotazione

Vqlore iniziole registro f: l0l t 1l0'l Volore iniziole C:

delle due. Giocate con il bit di riporto e con le istruzio-

ni di rotazione per ottenere gli effetti della figura

U

Volore iniziole dopo l'istruzione rrf

0l0l l1l0

Vofore di C dopo,l l'istruzione rrl

î, lz

Raaaresentazione del funzionamento dell' istruzione

Sw#&wsxlwse

f, l:

rrf

e

inventarne altre nuove l'onerazione di divisione e niir diff icile da vedere intuitivamente di quella della mo tiplicazione, pero funziona in uguale modo, anche se all'inverso, cioè ruotando un registro verso destra si ottiene di dìvidere il numero per due.


Appli cazione pratica: sim ulazione del primo programma upponiamo, a questo punto, di non avere dubbi sull'utilità del TMR0, sia per il modo

lampeggia. Le linee di alimentazione, del quarzo e del reset, non sono riportate perche si danno per scontate.

temporizzatore che per il modo contatore, ne sull'uso di interrupt; vediamo quindi i vantag-

rffigFg# **q#erugffiffiÉqffi&3&

gi

derivanti dall'utilizzo contemporaneo di queste entrambe due risorse. Qui sotto proponiamo un esercizio in cui, fra le altre cose, il TIVR0 provoca un rnterrupt quando termina la temporizzazione che avre-

Nell'enunciato dell'esercizio non si dice nulla sull'obbli-

gatorietà di lavorare con l'interrupt del TMR0, pero nelle figure seguenti ne dimostreremo la convenienza, confrontando lo stesso esempio senza interrupt.

mo programmato per esso.

Sfl**trf4À f,LffiTTffiXfl*

€onfigurazione TMRO

Lo schema elettrico è molto semplice: è -+-r-.-^l+rnllonero |l,in_ ^^.+-Ld A^ ror )L6rd )LCrLd lrd put il tPqr LwilqvorE

PA ingresso PB uscito

terruttore, e la porta B per i LED, anche se potrebbe essere al contrario, o un mix di entrambe le soluzioni. RBO sarà .il diodo che si accende o si spegne a 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

Spegni RBI

Rifordo 5O ms

5i tratta di simulare una macchina che ha

Accendi RBI

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

En u

Ritqrdo 5O ms

ncialo dell' eserc izio propos t o

*ó.

G'

Schema elettnco dell'esercizio proposto

RAO=l?

Spegni RBO

Pr i mo orga n ig ra m

ma

d el l' eserci zi

Accendi

o

p ro

RBO

posto.

Sqp$#www*


Come si può vedere, le azioni sono prodotte in modo sequenziale. Un lampeggio corrisponde ad accendere un LED, attendere un certo tempo, spegnere il LED, attendere nuovamente lo stesso tempo, tornare ad accendere il LED e così via. Se il programma

RSI

dovesse solo far lampeggiare un LED, questa sarebbe la sequenza infinita da realizzare. I ritardi sarebbero chtamate ad una subroutine realizzata dal TMR0, poì bisognerebbe aspettare che termini il conteggio per conti-

nuare con

il

programma. Nel programma pero,

Cqmbio il vqlore del LED

si

richiede anche dr riflettere lo stato di un interruttore mediante 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ìlizzare il TMR0 con interrupt, il prìmo organigramma si divi-

lniziolizzo

de in due: uno con le azioni che riguardano il programma principale, e l'altro con le azioni da compiere nella routine di interrupt, quando il TMR0 va in overflow. Secondo questo organigramma si verifica continuamente il valore dell'interrupt per accendere o spegnere 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 simultanee. e solo ouando ilTN/R0 termina di contare siferma

Resettq il flog

RifornE

Organigramma della routine di interrupt.

l'esecuzione del programma principale npr arrendere o snennere il LED che lampeggia. Sono state implementate entrambe le soluzioni, con e senza interrupt, anche se in questo esemPio non ne possìamo apprezzare la differenza, dato che ìl tempo che si perde nel lampeggio è 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-

Configurozione TMRO

Interrupl PA ingresso PB uscito

tore, questo cambio non si sarebbe riflesso sul LED, dato che il processore

RAO=l?

Spegni

RBO

TMRO

Accendi

RBO

sarebbe stato occupato nella routine dr ritardo, e le transazioni dell'interruttore non sarebbero state raccolte. La verifìca

dell'interruttore per cambiare rl valore del LED, se necessario, si avrebbe solo ogni due ore.

flse$$:Ks&"$w&KK*NH

sffis Secondo organtgramma dell'esercizio proposto

$wSSw*wvw

$qffisKsYffix

Dopo aver analizzato i vantaggi di lavorare con interrupt, concentriamoct


-*''"'l UST

P=16F84

; Utilizziamo il PlC16F84

RADIX

HEX;

; Sistema di numerazione esadecimale

TMRO

EQU

0x01

TOIF

EQU

0x02

sTATU5

EQU

0x03

PORTA

EQU

0x05

PORTB

EQU

0x06

RPO

EQU

0x05

INTCON

lQu

OXOB

OPTION_REG

EQU

0x81

TRISA

EQU

0x85

TRISB

EQU

0x86

ORG

0

;ll

goto

tNtzt0

; all'indirizzo 0

0R6 gor0

programma inízia

; Vector di interrupt

tN't

;Programma di elaborazione dell'intenupt,

movf

PORTB,O

xorlw

b'00000010'

mowuf

PORTB

movlw

b'001 I 1101',

mOVf,Vf

TMRO

bcf

INTCON,TOIF

retiie tNtzt0

crcL0

SPEGNERE

ACCENDIRE

; lnverte il valore del LED

; Carica di nuovo il TMR0

; Resetta il flag ; Rientra

bsf

STATUS,RPO

; Passa al banco 'l

movlw

b'00000000'

; Porta B uscita

movwf

TRISB

movlw

b'00000001'

movwf

TRISA

; RAO ingresso, il resto uscita

movlw

b'0000011r'

mowrrf

OMON_REG

bcf

STATUS,RM

; Passo al banco 0

m0vtw

b"t0100000'

; Attivo gli interrupt

movwf

INTCON

; per TMR0

m0vtw

b'0011 1 101',

movwf

TMRO

; Inizializzo il conteggio

; Configurazione del TMR0

btfss

PORTA,O

90î0 g0t0

SPEGNERE

; Verifica se RAO = ; 5e n0, spegnere

ACCENDERE

; se sì, accendere

brf

PORTB,O

goto

ctcL0

bsf

PORTB,O

goto

ctcL0

I

END

Schema elettrico dell'esercizio Drolosto

$*$swrssww


il

dello stato dì RAO;

programma

rimane all'interno di un ciclo infinito. INTCON

5g$4iliLSaH$*ruffi

*flL

OPTION

Fà$q##ffi&$,tSiB&

Per la simulazione ricorreremo ad un

nirrnlo tnÍ'co' ,anrite le finestre del listato del programma, dei registri

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 r00 001I I l0l

specif ici, del clock e quella per

Jrg:fgln-q:-ig"ls,J-n!sr"g-lg*d!,-.-..--.--..-.

duzione di stimoli asincroni, quindi configurate la linea RBO come interrr rrfnra (imrrl:to l'nnu i611g di animazione e verificate che al variare del valore di RAO, lo faccia anche il bit 0 delìa porta B.

Volore che si vuole contqre. Volore che si vuole conlore in binorio. Complemento o 2 del volore do coniore,

do inserire nel

l'intro-

TMRO.

La verifica dell'interrupt nvece Registri necessari nel programma, con i relativi valori

sulla realizzazione del programma. Nella figura sono riportati i registri necessari e il valore che assumono.

appena

è

piu complicata: dopo un po'di tempo la finestra del clock indica 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 significano diversi minuti. Fermate quindi la simulazione e utilizzate la finestra di "modify" per cambiare il valore

Sarà necessario configurare l'rnterrupt del TMR0, abilitando il bit GIE e ilT0lE del registro INTCON. Se le temporizzazioni saranno di 50 ms, potremo caricare il divisore di frequenza con un valore di 1'.256 e giocare con il

di TMR0, impostandolo vicino a l'overflow" Tornate a simulare iì programma, e verificate che di lì a poco RB'1

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 registro OPTION. oer fare in modo che il TMR0 conti come

cambi di valore. Tornate a modifrcare il TN/lR0 nello stesso modo se volete far commutare nuovamente RB1, oppure arma+^,,, ^ri VOZtCtt4O ^--i^^-- E^ r-.-iltelO rO)Lr( evOlvere da SOlo. LCVt Ut

voglramo

ffffi#ffiffieffiffi&

lFl

:,

Dopo aver visto i preliminari, passiamo al programma in sé. Defrnite le

.,-.i-t-iri il VeCtOf di vót tóurt I c^ ^^-i-i^^îrO PU)r4rur to interrupt, iniziamo con la routine dedicata all'interrupt. Si utilizza l'istruzione "xorlw", mettendo un 'l nella posizione adeguata, per invertire il valore del LED collegato a RB1 Prima L

di rientrare dobbiamo caricare ilTMR0 con il valore calcolato in precedenza,

per fare in modo che conti nuovamonto EO m< o nnrré : zarnil flen cho indica che il TMRO è andato in overflow. Nel programma principale, dopo la configurazione dei registri e il carìco del TMR0, controlliamo il valore del LED montato su RB0, a seconda

Se#sw"*swrw

::.'..,:...,' ::.=ltrJnJ ffifi'.=jF]= Hex Dec Bitrary : SFB Ndme

tm-$ ù41 DFlicî_reg siitug f5r portò trisa portb trlsb eedrta eecon l eeadr eecsnz pclrth itrtcúr s lúpre

g 1ó 2? 13 !? ? tB 24 B 60 É0 6 61 J I 69 5B ú Sfi É gB B 5 5g 6 Bg I 6S É€ lé8 3D éf É$ lì? 1

t tiuo per Tt'll

n

€861 8{69 g6E"l-r911

iniziaSe BfiB 5A nO,

altrinl

1€195É9É

BdJ!1íCl 11slJg6'l

--

II ze10 Stbtr6lP' Slin 10 (Pl

Cycler

_

-

- -: ::_i1076

Shq 7

.

Slin 11 fPl

Preelg Frewmt / q|gar On Fe€{

Per provare il programma dovremo ricorrere ad un piccolo trucco.

ttat,all:aa,aaaaarallrNrAij';',f:::::::::;::;:ì:ì;:;llllllttatai,é&&atirflllllrrrlìììi11111r!1ììììììd;1irrrrril$lllrllììììrrìrì

4.ft0tlfil0 HHz


,4.:

) .:::

:.;,:.:

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

'::::.,:"':

opo aver visto tutte le istruzioni, il loro funzionamento e il modo di utilizzarle correttamente, nrespntramo rrn riassrlnto che risulterà molto

'

::,,:'::',

r::i,:. :. l'.i'.:.. .:..

:.-'

:ì:i: ::ì1.::a::

MNEMONICO:

utile al "nornento dr prograrnmare, dato che raccogle gli aspetti fondamentali di cui bisogna tenere assolutamenle conro.

ATTIVAZIONE

SPIEGAZIONE

PARAMETRO

DEf

ì

,FLAGS

lstruzioni che gestiscono regisiri

i::,,,.ì,Ul

oddwf ondwf clrf clrw

t.l

comf decf

f,d f Ít fÀ f,d

i

f,d f

ncf

iorwf

dif diW

Z Z Z Z

, COUPLET\AENTO di f ] DECREMENTO di f I INCREMENTO di f

Z L

lORdiWconf

mowvf rlf rrf subwf swopf

f

TA

ì ROTAZIONE o sinistro con corry

xorwf

t

IJ fJ ÍJ .'l

th

bcf bcf

f,b

SPOSTAMENTO di f SPOSTAMENTO do W o f

L

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 f lstruzioni 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 W

oddlw ondlw

k

iorlw movlw sublw

k

K

i OR di letterole con W i SPOSTAMENTo di leiterole o w i SOTTRAE W do letterole {KW}

xoflw

k

I

OR esclusivo di letterole con

i

TESTA bir

:

TESTA

k

K

-7

La

] :

movf

: :

CANCELLAZIONE : CANCETLAZIONE ...1

(- f\t^

ì SOMMA W con f AND di W con f

W

((-

î

iC, tZ IZ

f-\î 7

DC, Z

:

.C, :Z

ÙC, Z

lstruzionidi solto b b

btfsc btfss

decfsz

f,d

incfsz

b di f; sALTA se 0 bit b di f; SALTA se I

,

DECREMENTA f;

:

SALTA se 0

I tNCnrurNtR f; : SALTA se I lstruzioni di controllo e specioli

'

coll

I clrwdt I goto , noP r retfie r retlw ; return :l

:

Sleep

rk :,

"t-

. CHIAMATA o subroufine CANCELLAZIoNE del WATCHDOG SALTO od un indirizzo

TO#, PD#

NO OPERATION RITORNO do interrupt RITORNO losciondo un letterole in W RITORNO do subroutine IMPOSTA il microprocessore in stondby o stoto di riposo

TO#, PD#

lstruzioni del PlC l6FB4

Tffssfu

m$$sa w$swss*s#*s$eew

e*il,**&

$m &w*was;sx*s*

s


I momento di realizzare un particolare programma, i registri sono tanto importanti quanto le istruzioni. Nella tabella pubblicata

OOh

INDF

, 0rh

TMRO

a2h

PCL

03h

STATO

sono riassunti tutti iregistrr specifici

della memoria RAM, con la situazione di ognuno dei loro bit

BrT4

NOME

ì

in

\_luc)Ld pdvil rd

i tot

;

Brr2

PD#

Z:

RA3

RA2

i

err

DC

C

FSR

05h

PORTA A

:

RAI

:

RBI

:RBO/INI

INTF

RBIF

DC

C

:

0óh

PORTA B

RB3

KÓI i

RAO

07h 08h

EEDATA

09h

EEADR

0Ah

PCLATH

0Bh

INTCON

B0h

INDF

Blh

OPTION

ótn

PCL

óJn

STATO

B4h

FSR

B5h

TRISA

Bóh

TRISB

trtrttr

Dn++ tvÍ

87h _1

8Bh

EECONI

B9h

EECON2

BAh

PCLATH

BBh

INICON

Registri della

l^rh

VVK

KU ;

TOIF

memoia RAM.

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

:l

#e&ffi#&

INTF

RBIF


Tutti gti interrupt o

lnsleme pre quando si lavora con interrupt, dato che il peso del programma ricade su questi ultimi. Uunìco interrupt che non e attivato dall'inizio, e il TMR0. La traduzione

tiamo arrivando al punto culmi-

nante della programmazione con i microcontroller; mancano solo alcune piccole risorse per conoscerne tutti t suoi segreti. In

dell'organigramma

in

assembler

sara

immediata. Uno degli interrupt porra a ,,.-r',\,,,, ^,,-"rdo l-,,-.i-Air^ cambia il valo_ )Lr rvr quol td vdIduilc programma. Le appliinterrupt in un unico indicando che re dello stato dei sensori, Schema elettrico cazioni che stiamo facendo sono sempre p roposto io l' eserciz del dobbiamo scrivere un nuovo valore nella più complicate e professionali. lmmaginate EEPRON/. ouindi ci sarà una chiamata ad il seguente esercizio implementato. una subroutine che realizza questa funzione. In ogni caso 5i vuole simulare il funzionamento dell'allarme di una macchina. per risolvere questo esercizio, bisognerà pensare molto 5i utilizzeranno quattro sensori collegati ognuno ad una porta, un cicalino, bene a quale sarà il compito di ognuno degli interrupt 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. Lorganigramma che rappresenta la routine di servizio lnoltre si accenderà un LED conispondente all'interrupt, potrà servire da base per qualsiasi programma

questa occasione combineremo

tutti

gli

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 progressivamente, 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 colIegati 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 sensori delle porte: RAO mostrerà quello di RB4, RA1 quello 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ì ulteriormente 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&Lfr L'organigramma principale, come si puo verificare nelìa figura a lato, è molto semplice, come accade quasi sem-

1

che lavori con piu dì un interrupt, dato che e molto generale. Se si lavora con solo due interrupt, potremo sopprimere le richieste corrispondenti a quelli che non sono utilizzali, e il resto sarà invariato. È importante rendersi conto

che ogni interrupt

è

indipendente dagli

cdfiguEzione fMRO

altri, e che quando se no nrndraè rnaì nÒn

InErrupt 9A uscib PB

ingrss

se ne possono produrre altri sino a che

non sia terminato

trattamento

e

il

s€Rrvl:l?

O

dei

primo. Saranno le

Sclvo

shto

azioni corrispondenti ad ogni interrupt, a ---ki-"^ LdI tutdtc ^li---;^^^ pilLdztu|c

,-lud ,,^/r^ urr ov-,1 ,,^,-l du ur or-

Organigramma del programma ri n cì pa I e d el l' esercizi o p roposto.

p

tra. Vediamo l'organigramma 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

Sw6*wwryw


stato lui a provocare l'allarme, quindi spegnerà il cicalino. Non

lnverti volore cicolino

o "iTlPer84-ù7

É '-l;!

a

lniziolìzzo

ÈÉ

'."T11,ff*' o

,ilià,

TMRO

nueraacontareead andare in overflow,

Organigramma per il trattamento del l' interru

Troft l'inÈnuÉ per

ffi

dobbiamo dimenticare che, se non facciamo nulla, il TMR0 conti-

pt per

producendo interrupt e tornando ad accendere e spegnere il cicalino.

TM R0

trofro l?i.tèrrupr

TMRO

pèr EIPNOM

Dovreno quindi disattivare gli interrupt per TMR0, per fare in modo che non se ne producano più. Faremo la stessa cosa

per glr interrupt

su

R84-RB7 per i sersori collegati alle porte.

Organigramma della routine di interrupt

Accendere LED secondo porte aperte

L'allarme sarà disattiva-

porte della macchina, aperte o chiuse, dobbiamo solo ritornare a impostare il valore della variabile "scrivi" a 0, per fare in modo che non avvenga una nuova scrittura del valore sino a che quest'ultimo

to sino a che non si

non cambia.

gNYtrffiffiA"$PY

g$\éYffi

ffi $qaj pT ptrK

?$4 $q*

Per quanto riguarda il caso del TMR0, è già stato presentato un esempio simile. Se vogliamo che il cicalino

Spegnete <icolino

Scrivi = O

Disdtfivore interrupl

Di.qttivore interrupt RB4-RB7

si accenda e si snenn; ad intervalli regolari,

O rga n ig ra m

del l' i nterru

ma del tratta mento

pt per RB).

utilizzeremo il TMR0 per controllare questo tempo, e al prodursi dell'interrupt invertiremo il valore del cicalino. Prima dì tornare al programma principale il TMR0 dovrà essere inizializ-

zato nuovamente, rn modo che, quando andrà

pfr& ffiffi*

Se l'utilizzatore attiva il pulsante collegato su RB0, significa che vuole fermare l'allarme perché, ad esempio, è

Sw#*wwww

pffiffi ffiw&-ffiffi7 Questo è l'interrupt più complicato del nostro esempio, dato che e quello che deve tener conto di più cose. La prima sarà di mostrare mediante i LED il valore delle porte: aperte o

Attivore interrupt IMRO

Scrivi =

|

Accendere cicqlino

O

rga

dell'

n i g ram

m

a del tratta mento

interrupt per R84-R87.

possa cambiare il valore del cicalino lo dovremo inizializzare, e attivarlo su interrupt. Ponendo la variabile "scrivi" a 1 , si otterrà che nel programma principale venga attivata la scrittura del nuovo valore delle porte nella EEPROM. Nel

caso 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 un nuovo valore nella EEPROM.

in

overflow, cambi un'altra volta il valore del cicalino. gru?ffiffiffi{"3$3r

Iniziolizzore TMRO

sistema.

chiuse. Per fare in modo che il TMR0

IttRo

Organigramma del trattamento del l' i nterru pt per E EPRO M

provochi un reset del

trffi#ffi$q&f.,$&$e ll programma che risolve il nostro esercizio è una ricom-

pilazione degli organigrammi commentati, una volta passati in assembler. Dopo averlo risolto ci sembrerà la piu logica delle soluzioni.


Lt5 |

P=16F84 RADIX HEX

WR WRTN

EQU

EEIF

EQU

UIE

EQU

RBIF

EQU

INTF

EQU

TOIF

EQU

RBIE

EQU

TOIE

EQU

W

EQU

I

EQU

RPO

EQU

TMRO

rQU

0x0t

STATUS

EQU

PORTA

EQU

PORfB

EQU

EEDATA

EQU

EEADR

EQU

0x03 0x0s 0x06 0x08 0x09

INTCON

EQU

OXOB

OPTION_REG

EQU

TRISA

EQU

TRISB

EQU

EECONl

EQU

EECON2

EQU

0x8'l 0x8s 0x85 0x88 0x89

EEADR_VAR

EQU

0x0c

IEDATA_VAR

EQU

OXOD

SCRtVl

IQU

OXOE

ORG

0

goto ORG

tNtzt0 4

goto

INT

IQU

-

;Programma di trattamento dell'inten-upt btfsc INT

q0Io

T_R84-RB7

T

TMRO

EEPROM

INTCON,RBIF T_RB4_RB7

INTCON,INTF

00t0

T_RBO

6tfsc

rNTC0N,T0tt

goto

T_TMRO

g0r0

T_EEPROM

swapf

PORTS,W

andlw

b'00001

movwf

PORTA

1

I 1'

MOVIW

b'0011 1't0f'

mow'rf

TMRO

bsf bsf

T

: ll oroqramma inizia ali l'ihuirizzo o ; Vector di intenupt

6tfsc

bt

T_RBO

; Si utilizza il PlC16t84 ; Sistema di numerazione esade(imale

INTCON,TOII 5CRtVt,0 PORTA,4

g0î0

TORNARE

bcf bcf bcf g0r0

PORTA,4

movf xorlw movwf movlw movwf goto

; ll valore dei bit piu siqnificativi pasa ia quelli meno siqnificàtivi i 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

INTCON,TOIE INTCON,RBIE

TORNARE PORIA,W

b'00010000'

; 5i inverte il valore del ckalino

PORTA

b'001 1 I 10'l'

; Si carita di nuovo il TMR0

TMRO TORNARE

bcf

5CRtVt,0

goto

TORNARE

Soluzione del programma proposto

Sw$*qesqxvw


$3U

Lr

i""èAt*f1i

il t3il g_ í?fr*sHe,&l.Ì.À

Nella simulazione, come sempre, dovremo aprire una serie di f inestre per vedere come viene eseguito il pro-

gramma. Utilizzeremo l'opzione di animazione per poter simulare l'apertura di una porta e vedere come viene mostrata l'informazrone istantaneamente sulla porta A, oltre all'attivazione del cicalino Per verificare la scrìttura dell'informazione nerra EEPROM, dovremo attendere piu tempo, cost come per

vedere cambiare valore al cicalino. Quando vorremo, ootremo Oremere RBO e osservare come l'allarme cessi di essere oneralivo anche se continueremo ad :nrire p a chiudere le oorte. movf andlw movwf

INTCON,W

hsf bcf bcf

STATUS,RPO

Un momento della simulazone

b'11f10000' INTCON EECONI,EEIT STATU5,RPO

; Passo al banco 1 ; Resetto il flaq ; Passo al banó 0

retfie

SCRIVI EEPROM

bsf

STATUS,RPO

movlw movwf movlw movwf movlw movwf

OXFF

TRISB

00 TRISA b'01000't r 1'

; Porta A uscita

OPTION_REG

: Confiqurazione TMR0 I e fronie di interrupt

movlw movwf

b'1 r01 1000'

: Attivazione deqli

INTCON

I per RB4.R87

bcf

STATUS,RPO

; Cambio al banco 0

btfss g0r0 g0r0

ctcL0 SATVARE

movlw movwf swapf

00

andlw

b'00001

EEADR_VAR

PORTB,W 1 1

1'

movwf

EEDATA_VAR

call

SCRIVI_EEPROM

g0r0

crcL0

movf mowvf movf movwf

EEADR_VAR,W

bsf bcf bsf

STATUS,RPO

movlw movwf movlw movwf

0x55

bsf bsf

INTCON,GIE EECONl,WR

bcf bcf return END

Soluzione del programma proposto (continuazione)

intenuot

5CRrVr,0

EIADR EEDATA_VAR,w EEDATA

INTCON,GIE EECONl,WREN EECON2

OXAA

; 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

EECON2

sreep

Sw$*wwrsp

; Passo al banco 1 ; Porta B ingreso

EECONl,WREN STATUS,RPO

; 5i abilitano qli intenupt i ordine di sciittura ; 5i pone in stato di riposo ; da cui si uscirà con ùn intenupt ; Disabilito la scrittura ; Torno al banco 0


Gti organigrammi delle subroutines e degti interrupt gni volta che si pianifica un nuovo programma, la prima cosa da fare è realizzare un

che abbiamo l'esperienza di diversi esempi, conosciamo

tutte le istruzioni e Ia struttura della programmazione

nuovo programma. Alcune volte è stato fatto quello generale, in modo piu o meno dettagliato, altre volte quello delle routines di servizio all'interrupt. Pero non è mai stato specificato

con rl PlC, possiamo arrivare sino rn fondo a questo utile strumento che sono gli organigrammi.

nulla per quanto riguarda la realizzazione congiunta, né sono stati fatti gli organigrammi delle subroutines. Ora

Nella sua presentazione abbiamo già visto che un organigramma è formato da rettangoli e rombi uniti da frecce, e che queste devono seguire delle norme perche il

fl*se

f4&sfl*$i,g {3ffi

t$

ru #ry#eeé3#ffi&r4ffie

tutto risulti sintatticamente corretto. Questo pero non basta, perché a partire dall'organi-

RBI -RB7 uscite

gramma principale, da quello delle subroutines e da quello degli interrupt si dovrà poter passare al codice assembler quasi automaticamente. Questo tipo di cor-

interrupt

rezione sarà la semantica.

€onfigurozione PA ingresso PBO

blli

ingresso

RAO=l?

Mostro O su PB

NO

goio

ccll disploy

Ogni rettangolo si trasformerà in diverse istruzioni assembler o in una sola istruzione "call", da cui deriverà una subroutine. La scelta fra una cosa e l'altra dipenderà dal livello di complessità del programma, e dalla ripetitività o meno delle azioni da realizzare. Nel nostro esempio, mostrare un numero su un display o realizzare un ritardo sono qtrnrltrn7p mnltn r iilizzale nlindi l'rrsn di sr tbroutine e adeguato per presentare il programma in modo leggibile, e per risparmiare codice, evitando la ripetizione delle istruzioni.

I rombi a loro volta si trasformano in istruzioni di Ritordo

coll ritordo

btfss

salto condizionale: btfss, btfsc, incfsz, ecc. dopo le quali si posizioneranno due istruzioni "goto", una per ogni ramo del rombo. La presenza degli interrupt è dichiarata nel primo rettangolo, pero in nessuna parte dell'organigramma troveremo la chiamata alla routine di ser-

vizio dell'interrupt: ricordate che un interrupt non RAI

=l?

NO

si

chrama. s_919

ti#$q#r

Traduzione automattca di un organigramma in codice assembler.

&wet&{'& & #f €_1f s{.$ f ge#{.}Tgr f s A prima vista, l'organigramma principale e quello della subroutine sono simili. Si differenziano solo nel primo e nell'ultimo rettang

golo.

S,ep#&e*e'www


medesime dell'organigramma principale. Possono

€ONT-

essere utilizzati sia gli organigrammi che le subroutines, anche se non sempre sono necessarie.

I5

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

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

TMRO *OO

INTCON(2)=

p€

l?

stesso. INTQON(2)

*O RSI

CONI

+

CONT-I

Scrivere registro dq modificEre CONT=O?

o

Determinqre ls cousq e risolvere

Tornq

RestourEre ivqlori dei regisrri sqfusti

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 principale. Sopra l'organigramma si riporterà il nome della subroutine, così come viene chiamata dal programma

€oncellore flog di inferrupt

Tornore

principale.

ll

resto delle norme, come terminare in un unico

riquadro,

o che i rombi abbrano due

$w$s'*wwtrw

rami. sono

le

Organigramma generale della routine dedicata all'interrupt.


Applicazione pratica: uscita dal modo di riposo ffi ,w.

bbiamo gia dovuto flcorrere a questa pre-

WW ffi ffi ziosa risorsa (il modo di riposo) quando abbiaffi W %m mo lavorato con gli

interrupt, come modo miglrore per lavorare con essi. Bastava porre l'istruzìone "sleen" ner entrarci e avevamo diverse forme per uscirne. Si ulilizzava nei casi in cui il processore doveva rimanere inattivo durante un

periodo indeterminato di tempo. In questo caso ci occuperemo dei due bit situati nel registro di stato che serviranno per determinare qual è stata la causa che ha portato il processore rn questo letargo.

Schema elettrico dell'esercizio Droaosto

ogni volta che si completa un gruppo di 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

s{${rMA

p ro posto

rg_fiYv&xfi#

L'unica cosa chiara oer il momento è il numero di ingressi e di uscite che sono necessarie. Un sensore dovrà contare il numero di pezzi, ricordiamo che il modo mìgliore per farlo è utilizzando il TMR0, per cui gli impulsi dovranno entrare tramite RA4. lnoltre avremo un pulsante per mettere in marcia il sistema

pezzi.

Anche se non sappiamo ancora quale interrupt utilizzeremo, possiamo comunque prevedere RBO assegnato a questo pulsante. ll cicalino utilizzerà un'altra linea, questa volta di uscita. Le Iinee di alimentazione, il quarzo e il reset si dovranno tenere in conto nel montaggio finale.

$R&eNX&ffi&ffi ffi g A3KL PK#6&&M$'gA Prima di fare l'organigramma dobbiamo leggere con attenzione l'enunciato e pensare a quello che già conosciamo. Anche se ora sappiamo lavorare con gli interrupt, non è detto che debbano essere utilizzati in tutti 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 i

implementare l'interrupt del TRM0, perché non

ha

ragione d'essere, inoltre dovremmo attendere all'interno di un ciclo che q:esto si produca: ricordate che non possiamo mettere in stato di riposo, perché il TRM0 smetterebbe di funzionare. Dopo ogni gruppo di dieci pezzi tl sistema deve rimanere fermo sino a che viene

SaS*wsr*


che saranno rivelate quando

Watchdog andrà in overfìow. Se all'i-

Configurozione RA4 ingresso RBO ingresso

nizio del programma si verificherà

RBTuscilo

qtÒ nrrnto ner

RBO

rn

overf

low

del

Watchdog e non per l'evoluzione normale del programma. Nel nostro caso

WDT

capiterà quando

TO#=O?

il

valore del bit TO#, ed esso corrisponde a 1. sapremo che si è arrivati a que-

TMRO

inferrupt

il

Accendere cicqlino

si tarda

troppo

tempo a contare il gruppo di 10 pezzi, oppure quando si tarda troppo a premere il pulsante dopo aver terminato con 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 riguarda l'interrupt di RB0, serve unicamente

per fare in modo che il sistema esca dallo stato di riposo. quindi il suo orgaSpegnere cicolino

iniziolizzore TMR0

nigramma contiene solo le istruzioni principali. Visto che configuriamo solo questo interrupt. quando si produce. non dobbiamo ricercarne la causa. ffi$q#ffiffiSe&4ffie

TOIF#=l?

ll programma si risoìverà come riportato nella figura. La configurazione rappresentata nel primo quadro dell'organigramma si risolve con i corrispondenti valori in TRISA e TRISB per lo nnrio rli innroccn ,--- -f usctra, e con I

TOIF=O

Riposo

valori di registrì OPTION e INTCON. Nel primo. il divisore di frequenza si configura al massi-

mo, non per

il

TMR0, ma per

il

(i <no-

\A/:frhdnn

cifica, inoltre, che il TMR0 si increOrganigramma del programma principale del I' esercizio proposto.

menterà con

gli

imnrrl<i o<torni rho

arnvano

tramrte

RA4, e che il fronte

premuto un pulsante. Qui sì che possiamo attendere con una "sleep", dato che l'interrupt 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

attivo sarà il fronte

di

discesa, cioè

quando il pezzo ha Organigramma della routine di interrupt


LIST

P=1

6t84

; 5i utilizza il PlCl6t84 ; Sistema dì numerazione esadecimale

RADIX HEX TMRO

EQU

0x01

T0rt

EQU

TO

EQU

STATUS

EQU

PORTB

EQU

RPO

EQU

0x02 0x04 0x03 0x06 0x05

INTCON

EQU

OXOB

OPTION_REG

EQU

TRISA

EQU

TRISB

EQU

0x81 0x85 0x86

INTF

EQU

0x01

ORG

0

goto ORG

tNtzt0 4

g0r0

INTER

ORG

5

;ll programma inizia ; all'indirizzo 0 ; Vector di interrupt

bsf

STATUS,RPO

movlw movwf movlw mowvf movlw mowrrf m0vtw mowvf

b'00000001'

; 5i passa al banco f ; RBO ingreso, il resto uscita

TRISB

b'00010000'

; RA4 ingresso, il resto uscita

TRISA

b'If 1'Í000'

; Configurazione di TMR0 e WDT

OPTION-REG

b'f0010000'

; Attivazione dell'interrupt

INTCON

bcf

STATUS,RPO

; 5i pasa al banco 0

btfsc

5IATU5,TO

; Verifico il valore di T0#

9010

NORMALE

goto

ATTIVARE

; Sequenza normale ; ll WDT è andato in overflow

bcf

PORTB,T

MOVIW

0xF6

mowrrf

TMRO

; Disattivo il ckalino ; Carico il complemento a 2 ; del valore da contare

btfss

INTCON,TOIF

goto

crcL0

bcf sleep

INTCON,TOIT

goto

ALTARME

; ; ; ;

Sono passati l0 pezzi? No, aspetta 5i, resetta il flag e metti in riposo

bsf

PORIB,T

goto

ALTARME

; Arcendi il cicalino ; Entra in un ciclo

bcf

INTCON,INTT

; Resetta il flag

retfie

; Torna dall'intenupt

END

Soluzione del programma proposto.

terminato di passare davanti al sensore. L'interrupt ner RB0 si confrorrra a sua volta con il fronte di discesa, e si disattiveranno le resistenze di pull-up. ll resto del programma e una traduzione quasi imme^l; -+- -l^^li ^"^-^;^".ìrqrdmml. urdrd ueqil orqdf

SgSli

Lè;.:** g ilsil1 F**Sffi&$j$ H&

Per realizzare la simulazione in questo caso dobbiamo

aprire 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'evoluzione del TMR0 e all'atiivazione del cicalino. Non dimenticate di assicurarvi che il Watchdog sia attivato. Eseguite il programma con l'opzione di animazio-

li*$È:ars*r*


dovremo, come gia altre volte, aspettare troppo tempo, trattandosi di una simulazione. Per questo utilizzeremo un trucco: cambieremo il valore del divisore di frequenza, mettendo in OPTION il valore ''l 1 1 1 1 000'. Dovremo nuovamente assemblare il programma. Eseguire un'altra volta I'applicazione, però in modo rapido (Run) e questa volta non cìiccare il pulsante RA4. ll Watchdog tarderà l'aoorezzabile cifra di 1B ms ad andare rn overflow. Prenderemo la finestra di clock e fermeremo la simulazione, nuovamente, per vedere i risultati. ll programma deve rimanere 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)

Preparazione delle finestre per la simulazione

ne. Dopo la configurazione delle risorse. il programma entrerà in un ciclo aspettando che passino

i 10 pezzi. Non

uscirà da questo ciclo fino a quando non faremo 10 doppi clic

SbbrkFryÈ kt pcr qEh_q stE

sul pulsante RA4. Se si configura la linea come pulsante, invece di interruttore, baste-

Fr.-affi hlr. Fs H$-tffirl *trtam:: @i N Ffl shF * thrÈ

ranno la metà delle oulsazioni. Osservate che ogni volta che si realizza una doppia pulsazione si incrementa di 1 il fMR0. Si arriva così allo stato di riposo, momento in cui cambia il valore del bit PD# (bit 3 del registro di STATO) passando a 0. All'inizio del programma era a 1. Dopo breve tempo, cliccate RBO, vedrete

il

programma inizia di nuovo. Se ora vogliamo verificare l'overflow del Watchdog,

che

ntm !t E nl1h

tr 6 lt Îa rtffi *4ffi, isilaùn|m: Fbrarlfn, t$nrffi: ùtl:lmn': nlmi. ìtffi,. tam: rtm: ra 1* Ft à M14Sf

Ufilll 5n

Ft :::

ltirùra 6ffi1ff rirrth ffin m

il àa

H ?s a a rù i*

tm -lfi

a -É ra 9a s

a a a r* ' l* 5

m * ffi ffi tù.È rFE ffi

,.

.:.

:

Ì : kifi6 s{ftr r È::, iI sltFÈa : ll sl I i-= ì las*tih iFl6il:

ma.t l[ff l||tt{,lm

r i ed i Éttr. ù ll: htt :

; *l

S*L

{A rmta ilttma

ì

r

lr5

Ef ih E

r

j

::

kC nd$ d bEs St. kf aq

*n,l ùFa rna lFl$,talf Èaclo t*tq.tala

Ft.

ùlÈ

ì Ols-ttli q*ia. È i èl sals ituE. ì h" -+tt: ì s, Fs.tt

.

#: d.€

Programma in stato di allarme, dopo che è andato in over-flow il Watchdog.

slam.n mE antw nn,, sa lilt

Programma in attesa che sia premuto RB)

$of*rrr:re

i*d::-.-..:...

ll € €

dovrà avere valore 0 per indicare che è stato prodotto un nuovo overflow, e il cicalino essere attivato. Pulseremo MC LR oer resettare il sistema e vedremo che il programma prosegue rifacendo la stessa cosa. Questo perché si verifica all'inizio il valore del bit TO#. ed esso non cambierà frno a che non si scollega I'alimentazione: non basta pulsare il reset. Nella simulazione, scollegare I'alimentazione equivale a scegliere I'opzione Debug>System Reset. Iniziare una nuova esecuzione. rntrodurre dieci pezzi però senza premere il pulsante RB0. In circa 18 ms dovrebbe rioetersi la stessa cosa.


File di intestazione file di intestazione sono utilizzati in forma di moduli da

includere aìl'interno

di un

programma principale. I file di intestazione standard che fornisce Microchip definiscono i registri specifici di ogni microcon-

trnllor n:rfirol:re a seconda del file. Così, ad esempio, nel caso del PIC'l6FB4, il suo file di intestazione è il p16FB4.inc o il p16F84a.inc, a seconda del modello.

eLfl#rux

rg*_fr

ffig Xà*Ytr$Y&Xg#f'*tr Nel p'l6F84.inc, così come è mostrato nella figura, appaiono le definizioni sia dei registn specifici, che dei bit particolari di questi regi-

Un frammento del {ile di intestazione del p16FB4.tnc

stri. Si può vedere il contenuto completo aprendo il registro tramite MPLAB, come qualsiasi altro file. L'uso dei file di intestazione ha il vantaggio di risparmiarci il Iavoro per definire le variabili più comuni

; Bloócr d€l1s €tl,6h€tte : c$Locx KEY-lrÈ&

-A^ -; ^^^i ,,^l+^ ìd ,,, un pro9ramma, ognr vorra cne sr +-

ìnoltre migliora la chiarezza neìla lettura. Con l'uso di file di intestazione standard, si facilita ìa comprensione da parte di un programmatore esterno, permettendogli pertanto di collaborare in un programma non scritto da lui. Pero file di intestazione, oltre alla definizione delle variabili, possono contenere subroutine o macro per il

TÉS1g kEY_1

: : , : :

REVz t{Év_sE|.*9_1

Elsc

xev-aEL*Y_2 IEMP,I

,; BBstine di sÈansie.e d"]:.a tastiera :HE?-$c*fi bsf sfnrils,gPg Fosls b'OSS0C1t1' Eqvsf FOAIa IÌ?TIOH_REG,7 ftsf bcf sT*fOS,nPg B6uls 4

r

; IrLzlo delle qariètllt

[É?_SCAH_1

Fo!9f Essl{ Fsv€f R.vf Bousf

fE9_1 b'01't-t11'l l' ÍA3TO TrSlQ,H Po*-lS

;

Pès5o a1 banco

I

; ASt-nA7 !scl.te, 898-ng$ ilgr€s5i ; fittisa ptrU-sP intèrni ; TorDq al bànca 1 ; H. delle ; Fila ; *ttiuù

fil€

dà esplorere

dÀ ettitàre Sila

nop

frcaF

R^.rsJ

?O*TS,U

funzionamento dei diversi elemen-

ti, come le tastiere o gli LCD. L'utente puo fare dei propri file di intestazione, anche se deve tenere

File

di intestazione per l'utilizzazrone della tastiera

ffiw#&wwv*


j,iiÈ3$ .

.: .: i:i.tr,,:i

..'

I

"::

:

.:.:.:i3 .,:::i:*S

conto, comunque, che nei file utilizzati nello stesso programma, non devono coincidere def inizione e subroutine.

g-'#S* #il3

ilXL$r *X Xf*Yffi$Y&Xg*r4*i L'uso dei file di intestazione è semplice: dobbiamo solo porre una drrettiva INCLUDE nel programma principale e, in seguito, il nome del file fra virgolette doppie Nel

:.:.,ì:

.

caso dei file di intestazione che definiscono i registri del

:ara:ta

...;,;ali*

microcontroller, prima di INCLUDE bisogna definire il proprio PlC. Per fare in modo che il file venga trovato al momento di assemblare il programma, deve essere nella stessa directory. Se osserviamo come si carica il file nella memoria di programma, vedremo che si ottiene lo stesso risultato copiando direttamente il fìle al

.a.:a'.:..# ,.'.:.:::.:ì

:::ìl*

': r

:.::::i# :.:,t:r,è

:iì:]:!li!i ':iNÈ

,

,:,::ì*

.:.; ::

oosto della direttiva INCLUDE.

;=]

:i:iil**

:'

::.a.aa:,,+?l

'':"'r::"':

:t;i&

:,.a,

LISI

caxt ffv_qnR

€{u EQr, o*f gote

e-l6Ft+*

::::a

; Eefinlziotre del procFÉssre

i::i

.iì:iìtl __ ':iì:rr:iìri:ia:

ge

6s

...ti:ìÈ

; Uàriablli detli tègtiera

6

llJIZI0

:

:::::::

-'l

; Ptsoqraffia prlilcipale

'I 't.i:nì ...:ì:iìr*

i::ii: .::€: '.

ItUll0

_l*gfg

bsf clrf mute muBf bcf

SIeffS.SPA

bcf

FgATe"$ gEg_geqll

càll muls

P{,BIÍ è'85684111' t FTI0il_R€S

...,. .

SlÀtgs.RPa

gx8g

.;j:r::

; Psrts À cotr uscita ; eorfigura nFtlgt{ per :l f|{$ú :

l:::a.il

'

ì..:::::ì:

: Disàttiua i.L Èicèli.no i Esegui u*: sc:oslone d€11à tÀstlèra

:.

...:.,:ttaa

.'::::.:*

Uso dei file di intestazrone

.ììt,,]rt::::it ,.:::::::,::,,,:*

.,-a

.:a:aa

:

l

':a:aa:,4

I

:,:ì;ii:

::t.:t:u:::

: '':ii:l$ ''. ìitììi.tiì

.

a::::::

..:.4.:a:a*i

.

..,

:.4..1:aia

: .i::i3f :::::5F . trit:sl '

Esemoio di come si carica un INCLUDE

'lrl:::i:É:

'.,'.:,,:.tt:

nella memoria di programma.

' :ììììììiìir:tt '

Sqw$$*lw*swsw

.

ìììì:ìrìri:iul

.:*$i* -':'':l-

:


Apptica zione pratica: raccolta

dei dati tramite la tastiera e finora avete trovato

nteressanti programmi con il PIC e iniziate ad immaginare le possibili applrcazioni, questa periferica vi incanterà. ln alcuni reqi i cpmnliri te<ti 59p19 sufficienti per introdurre dati in una applicazione, però mano a mano che le applicazioni diventano più

i

irr,!i iÉj rr",jit,li e,j..f .'lini$f.l Er '.gj

RBó+ì

nezI

complesse, avremo bisogno di sistemi più sofisticati, almeno in apparenza, dato che il loro uso e la programmazione continuano a rimanere semplici.

t

RBo---Jlll llll--RB7 RBI rll IILRBó RB2-l l-RB5 L-RB3 RB4 ------J COTONNE FITE

{uscrTA TASTI)

TASIIÉRA

t t t+ ttto

DEI

g&s?gilffiA il#&$tr trilffi3flflffig{& gru&ffi*"ss* ffià

nealo neslr

RBO RB]

RB2

RB3

(rNGREsso DEI TASTIì

g_A

Schema dei collegamenti di una tèsltera da

Dal punto di vista elettrico una tastiera è un meccanismo 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 programma, fa sì che l'uso della tastiera faciliti l'utente all'introduzione 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:):l tat'.::,:

Tastiera modello ECO 16250 06 realizzata dalla ditta ,ECME.

^,,1.-^+i pUldlìtl,

,,+il;--. .^l--onto UtlllLLCt )UldlllErlLs

4r4

16571

rl nttn fr rnzinnrrn dl rlllEE nor vLLv linoo VE lullZlUlldlC/

posto delle l6 che sarebbero necessarie con pulsanti indipendenti. Ci sono diversi modi di configurare una +rrfiarr Ld)tleld,

-nmo rq <nnn )ur ru rnllon:fa d-.^-^^.1-.li >eLUl lud Ul Lur rvilqyqLc

lp rq li^^^ 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 ingresso/uscrta, scegliamo la porta B per il suo collegamento. Come possiamo osservare nella f igura, le quattro linee meno signif icative (RB0-RB3) si conf igurano come ingressi verso il PlC, e le 4 pru srgnrfrcatrve (RB4-RB7) come uscite dal PlC, anche se potrebbe essere il contrario. 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 binario, che identifichera in modo univoco la sua pulsazione, e che sarà formato dai 4 bit che escono dalle linee R84-RB7 e dai quattro ricevutr da RB0-RB3. Ogni codrce sarà formato da 6 livelli alti e 2 bassi, coincidendo questi ultimi con la fila e colonna particolare d ogri

Se*S*n*sesr*


TAsTo

tltr(lNc*Ess0 RB7

i---0..: ò-'--i -".-í

tl0 lt0 ri0 ì0 ì0 ì0

RM Rmcot*?)Nt$ìt*[o CODICE HEX "-ì'-ì-'l-" ..l- - 0-- *î..: *'""7D--..'

1 I 0 I I

I 0'l I 0

0: li t: 0; t:

EE

ED EB

DE DD

I

BB

0 0 0

I

0

7E

I

0

l I

I I

tasto premuto, dato che il procedimento sarà sempre lo stesso: si attiverà il cicalino, per un periodo di temno p noi si inizierà nuovamente con la stessa seq

DB

0 0 0

subroutine, per attendere che il tasto venga rilasciato. Nel nostro esempio non importa quale sia stato il

uenza.

BE

BD

I

s{_ rx$_fr ffix €ffi&YY&rusruT# $3fr&-L& €&Sggft:$Cs

7B

0 0 0 0

I

0 I

ll

77 87 D7 E7

Codice associato ad ogni tasto di una tastiera esadecimale.

tasto. Nel programma di gestione della tastiera si avrà un'esplorazione della tastiera approssimativamente ogni 20 ms anche se, sia il tempo sia i codici, possono variare a seconda del modello e della posizione

codice presentato nella figura, potrebbe apparire

strano se confrontato con i programmi visti fino a questo momento: non ha direttive, né inizio, né fine. Questo perche nor si tratta di un programma completo, ma di una serie di routines, nel nostro caso due, che saranno memorizzate come un file a parte, e saranno incluse nel programma principale.

Queste routines avranno bisogno di variabili ausiliarìe, Ia cui definizione si fa all'inizio del file. Dato che si tratta di un file di carattere generale utilizzabile in qualsiasi programma che impieghi una tastiera, non sl conosce

CONFIGURAZIONE PB Tosliero Po Cicalino

dei tasti.

p$a#ve ffix

F{_$

g\$x$ffi

fq&ffi

ffi

$\*Y*

la prima posizione libera del programma principale in cui collocare le varia-

Esploro tostiero

L'uso della tastiera in un programma, sebbene non comporti complicazioni

hili uilr,

una.volta compreso il suo funziona-

mento, implica l'apprendimento

F.&

di

nuove funzioni specifiche per questo compìto. Quindi concentriamoci su di

to, della scarsa utilità del programma in sé. Nell'organigramma che rappre-

Afiendi il riloscio

Si

Attivo cicolino

Ritordo

di I secondo

Disottivo cicolino

Organigramma u nciato proposto

del l' en

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.

Swff*wswerw

tiilìzzo". uLilr44clq

l:Io

nliratfirr: ullgLtlvo

CBLOCK, che definisce un blocco, il cui nome nel nostro caso è KEY_VAR In senrritn ri nrpor.roeremo di colloLe due routines principal realizzaKEY_SCAN e KEY_OFF. La ^"i*-rd c>prurd pril ^.^l^"- lrd +-.+i^"^^" {;l^;^ Ld>r-rcrd pcr illc il rorr> Ai rrn f îctn nrómr ri^ nor rr ri ìLla !u, |/s,

te sono

|

senta l'enunciato proposto, si possono differenziare due parti: l'esplorazione della tastiera e le azionr dopo la rilevazione 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 tastiera

affermativa, e cioè che è stato premuto un tasto, si fara una chiamata a un'altra

<i Jr

aArè dt ro<fn hlrìaaal

essa senza preoccuparci. per il momen-

verrà inserita in una subroutine. Nel caso che questa fornisca una risposta

norriÀ prrrrv

attiva una ad una e raccoglie il risultato delle colonne. Se il risultato di quanto inviato e ricevuto è diverso, significa che è stato premuto un pulsante, e la

routine fornirà il codice del pulsante premuto. Se testando le quattro file non 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 tempo in cui noi premramo una volta il pulsante, il programma riesce ad esplorare diverse volte la tastiera, rilevando quindi diverse volte il pulsante premuto, e questo potrebbe generare degli errori.


; Blocco delle etichette

CBLOCK

; Inizio delle variabili

KEY VAR TASTO

KEY_I KEY_2

KEY-DELAY_I KEY_DELAY_2

TEMP

,I

ENDC

; Routine di scansione della tastiera KEY SCAN

KEY SCAN

1

STATUS,RPO

movlw movwf

b'00001 I PORTAS

; R84-R87 uscite, RB0-RB3 ingresi

bsf bcf

TMR0,0PT-7 STATUS,RPO

; Attiva pull-up interni ; Torno al banco 0

movlw movwf

KEY_1

; N' delle file da esplorare

m0vtw

b'0't111111'

movwf movf movwf

TASTO

1

t1'

; Fila da attivare

TASTO,W PORTAB

;Attiva fila

n0p

,:::,1:,a

:t:ì:r::

:.:,l:ììil

aaì:,ìr' :tìtì:ì;,1

-1.1::r:::

movf movwf subwf

TASTO,W

btfss

5TATU5,Z

; Legge le colonne ; Qualche pukante attivo?

goto

KEY_sCAN 2

;5ì

bsf

5TATU5,C

rrf

TASTO,T

decfsz

KEY,1,F

; No, non c'è niente in questa fila ; Seleziona la fila successiva ; Salta se sono terminate le file

PORTAB,W KEY-2

goto

KEY_5CAN.1

MOVIW

0x80

goto

TORNARE

KEY_SCAN_2

MOVIW

.100 KEY_DEtAY-1

KEY SCAN-3

movwf clrf clrwdt

KEY SCAN 4

decfsz

KEY_DELAY_2,F

90î0

KEY_SCAN-4

decfsz

KEY_DELAY_1,F

g0r0 movf movwf

TASTO,W PORTAB

PORfAB,W

subv'rf btfss

KEY_2,W

goto movf

KEY_SCAN_I

mow'rf retufn

TASTO

KEY_OTF

movf movwf

TASTO,W

KEY OIF NO

call

KEY_5CAN

movlw subwf

TASTO,W

btfss

5TATU5,Z

g0r0 movf movwf relurn

KEY_OIF NO TEMP-1,W

:ìi:]:

:tì:: :ri:j.

a, TORNARE

; Routine che attende che il

tafo

; Ciclo di temporizzazione di 20ms ; per evitare i rimbalzi del pulsante

KEY_5CAN,3

movf la,

; Restituisci il codice 0x80 (nesun puhante attivo)

KEY DETAY_2

n0p

STATUS,Z

KEY_2,W

; 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

sia rilasciato

:,1t. :.!a,.

; Passo al banco

bsf

:ìiìl:

ììì:i:

TEMP_I 0x80

TASTO

; 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

Rouline di Lralbmento della tastiera

Sw${*x*rm:;re*


LIST

P--16F844

; Definizione del processore

5TATU5

EQU

03

; Definizione delle variabili

PORTAA

EQU

05 06

PORTAB

EQU

TMRO,OPT

EQU

01

INTCON

TQU

OB

W

EQU

0

F

IQU

I

z

EQU

I

c

EQU

0

RPO

EQU

c0Nt

EQU

0c

KEY_VAR

EQU

OD

ORG

0

g0r0

tNtzt0

; Variabili della tastiera

; Programma principale ; lnserisci il file di trattamento della

INCLUDE "TASTIERA.INC"

tNtzt0

NO TASTO

RITARDO

crcL0l ctcL02

tafiera

bsf

STATUS,RPO

clrf m0vtw

PORTAA b'000001

movwf

TMRO_OPT

bd

5TATUS,RPO

bcf

PORTAA,O

; Disattiva il cicalino

call

KEY_SCAN

; Esegui una scansione della tastiera

MOVIW

subwf

0x80 TASTO,W

; 5i compara TAST0 con il valore 80 (nessuna puhazione)

btfsc

STATUS,Z

goto

NO_TA5TO

call

KIY

t1'

; Porta A come uscita ;Configura OPTION per il TMR0

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

bsf

PORTAA,O

call

RITARDO

bcf

PORTAA,O

goto

NO,TASTO

; ; ; ; ; ;

movlw movwf movlw movwf

d'15'

; Ciclo eferno rhe si ripeterà 15 volte

CONT 00

; Inizializzazione del ciclo interno

OTF

TMRO_OPT

btfss

INTCON,2

goto

CICLO2

bcf

rNTC0N,2

decfsz

c0Nll

g0î0

clct0l

return

; ; ; ; ; ;

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

rl

:)

Programma completo dell'enunciato proposto

..-. .""." d e [-..-,-:""11],: r': i"- -" ' .t,'':': ,." }*L ll programma, una volta incluso nel nuovo file

della

Port:ntn nér ,,^"i+i--"^ , -^ vqr ilrLorc ^, Iucrr-

tastiera, risulta molto semplice. Dopo aver conf igurato

IO VTSIO, Vr SU9-

l: nnrt: .A. nar , dol rirslina o il Tl\/lRO ,_, <i ., esptora ta r,, l'rr<n tastiera. e nel caso si rileiii rrn nrrlsanîe nrpmrt[o si attrri: il ric:linn nor rn sornndn ner noi snponorln Si rinp|'--',r-' rp il nrorpsso rn modo infintto.

gcr rorru ur .^rcd-

^^";-*^:; lizzare il mont:anin

nprtrq-

sario sopra una Y-'

,-,t"1,"

.,r-

Nel caso della tastiera non possiamo realizzare una simulazione tramite MPLAB, dato che non esiste nescr rn dicnncitivn di inoroccn rhp < nn<c: rnnfinrrr:ro corle si farebbe co1 Lna rastiera, assoc;ata a due linee.

$****wssser

Y'"

\r hpma r omnlpto elFll cserctzta

IOUpr, O SU Una .-h^^. ,,^i,,^" )LLtCUd Ut tivctll -.1^ ^"^^..-*-,,i 5dre. ll plogldmnld

-,,^"i{i--"^ -i .+^.- d -L^ Lre connesvl arJre'd ver ilrLdre cile sìoni siano realizzale correttamente, dato che il cicalino sJonera premendo qualsiasi pulsante.


Direttive lcune le abbiamo già viste, dato che ne abbiamo avuto bisogno nei programmi che abbramo realizzalo, però ora le tratteremo in modo approfondito, vedendo sino a che

punto oossono essere utili.

fl#rdeffiYYs ffis mxffisTYxw&

versioni precedenti dei compilatori di Microchip, e per rendere compatibili i programmi realizzati da diversi utenti. ll compilatore MPASM fornisce cinque tipi di direttive: . Direttive di Controllo, che permettono l'assembla-

mento di frammenti di codice secondo determinate condizioni.

.

Una direttiva è un comando assembler che si inserisce nel codice sorgente del programma, però non viene tradotto in codice macchina dal compilatore. Si utilizza per diversi scopi, in relazione al posizionamento delle variabili, e al controllo degli ingressi e delle uscite nell'as-

Direttive di Dati, che controllano il posizionamento dei dati nella memoria e danno la possibilità di riferirsi ad essi con nomi significativi. . Direttive di Listato, che servono per configurare la forma in cui si presenterà il file assembler: titoli, impa-

semblato. La maggioranza delle direttive ha diversi nomi e formati, per preservare la compatibilità con Ie

grnazrone, ecc.

r

Direttive di Macro, che controllano l'esecuzione

e

Le direttive

non vengono tradotte in codice macchina

quando si assemDE

un programma.

Sw#*wwsw


ii posizionamento dei dati quando si utilizzano macro nella programmazione. o Direttive di File Object, che si utilizzano quando vuole creare un file object.

si

u$# ffifi1Lffi #X$qflX-rxwffi Nella maggioranza dei casi i programmatori devono ultlizzare sempre le stesse direttive, dato che sono molto specifiche quelle dei dati e delle macro, e solo in presenza di situazioni speciali, come ad esempio se si vuole stampare il Iistato di un file con dimensioni differenti 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 direttive esistenti, per questo le presentiamo nella tabella con una breve descrizione oer oqnuna.

Esempio di un programma che utilizza diverse direttive meno frequentr

CODE CONFIG

una catena di caratteri

unl rUn

.DW

ruq0

!itÏeevuote._ un sottotitolo di un Ulqgfarn0l un titolo di un programma di sostituzione se la condizione è vera

Tabella di alcune direttive

fornite dal MPASM

$m#*wwrm :rrla:

aaara


Applicazione pratica: visualizzanone dei dati tramite

LCD

l- +--+ì^.I- ^i, ^*^ orTre rd rdsrera e co^ ra ptu

gliamo lavorare riceve I'informa-

m I rna ir) rrrurru rru

zione tramile 14 pin, otto dei qr: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-

,

Ài lo noriforirho rL tg ut PLtilLttLt

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 trovare

sempre piu spesso sui dispositivi manenti sono per l'alimentazione (Vss, Vdd) e il contrasto (V0). commerciali, come ad esempio, macchine distributrici di prodotti. Quando il display LCD e collegato piacerebbe non vi imparare Quindi, a un PIC 16t84,le linee dei dati di Collegamenti di un LCD da 2xl 6 caratteri a programmarli per fornire messaggi solito corrispondono con la porta del tipo " introdurre l'importo", B e le tre di controllo con le linee "puo passare", ecc.? Questa e la nostra proposta. meno sionificative dell,e nnrt: A R^n-R47. Le linee dei dati dovranno essere bidirezionali, cioè a votre tn/ a r d'd *,qf' S'9f-F*?f f fi?1 - ;.. .H . ?<*, " e! " :!? ':,3h. Hhffi{}kHÀ;",\ u}L;...ì nressi p a volle rrsrile dato rhp nlestn Ltr neCeSSaf iO IL YULJLV Un LCD e un dispositivo molto potente, flessibile e faciper passare dati all'LCD o per ricevere informazioni le da gestire. E capace di rappresertare lettere, numeri sul suo stato interno. Le linee di controllo si confique altri caratteri ASCll, o simboli specifici programmati rano come uscite. I

DB2 DBt DBo Tempo.di e5ecuzrÒRè -o'- -'d-----1

-:

o I x I l/D S D C B R,/L X X OlDLNFXX 'I INDIRIZZI

i i i i

i,?;A;; 1,64ms 40ms 40ms

40ms

DELLA CGRAM

Display LCD modello WM-CI 602M

della ditta WINTEK.

.

FIAG O

O

]

i 0 READ DATA TO O

0

l,

O

I

READ BUSY S ADDRESS

jWRÌTiDATATO

dall'rrtente

trtto

nrresto

in

Uno

f lrllcu l;n^^ pcl <n:zin uu :d ocomnin r'.li z )vuLtvt !r!rrrprv, ul ^^" '16 colonne, a seconda del modello. ll modulo LCD contiene un micro-

rnntrnllpr rhc nc<ti<rq il suo funzionamento e ha il compito di tradurre i comandi mandati tramrte il programma in ordini compresi dal display. ll display LCD con cui vo-

CGODD

INDIRIZZI DELLA CGRAM O DDRAM

BF

CODICE ASCII

PER

j

40

ms

LA RAM

CODICE MEMORIZZATO NEILA RAM

CGODD

* 5:

i. sposlo lo visuolizzozione ogni vohoche sl scrive un doto. Se vole O, funziona in modo * l/D: Se vole I, sí incremento l'indirizzo del cursore; se vole 0. si decremento. * S/(: Se vole 1, sposfo lo visuolizzozione. se voie 0, sposla il cursore. * R/L; Se vole l, lo sposfomenfo è o desfro; se vole 0, o sinistro.' BF: Se vole I, il nodulo LCD è occupoto: se vole O, è disponibiie. * DL: Se vole l, si lovoro con 6us dei doti o I bit: se vole 0, con bus o 4 bit. * N: Se vole l, /o presenfozione si fo in due linee: se vole 0, in uno. * F; Se vole I , il corottere è di 5 x t O pixel; se vole O, di 5 x 7.'B: Se vole l,lonpeggio íl cursore (se è ONi. * e; Se vole I il cursore è ottivo /ON./.' D: Se vole l, ìl disploy è offivo. * X: lndeterminoto. Se uoie

normole.

Tabella dei codici di controllo del display LCD

Sw$*'E*swryry

|r|NÌNrl|''ffiHll::.:.:.)):..........tt

t

\\iùrraj,


che, oltre alla dichiarazione delle variabili, abbiamo introdotto le dichiarazioni di etichetta mediante ìa direttiva " #def ine "

A seconda della combinazione dei dati delle linee dì controllo, l'LCD capira se deve rappresentare un carattere, cambiare la posizione del cursore (che gli si domanda 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 sparizione dei caratteri dai lati del display, la rappresentazione di figure in movimento ecc.

tr$ffitrF9#

.

#define #deiine #define #define #define

OFF COMANDO

fdefine

ON_(OMANDO

ENABLE DISABLE TEGGERE SCRIVERE

cBt0cK

bsf

UP_TCD

Il primo passo da fare quando si sta cominciando ad acquisire un nuovo linguaggio di programmazione, e generare un messaggio

clrf clrf

che dica "N/ONTY". Fino ad ora non aveva-

relurn

1

su L€D

arganigramma dell'enunciato dato

PORTB,T

tCD_BU5Y_I

bsf

Disabilita LCD

^,,^-+î r-1uc)Lo uv-

LCD-E

movlw movwf LCD_E_1

decfsz g0J0

LCDEl

LCD_REG

PORTB

call

LCD_BU5Y

Disattiva RS (modo comando) Valore ASCll da mettere sulla P0RTB Asoetta che si liberi LCD Attiva RS (modo dato) Genera impulso di E

tCD INI

LCD_E

Disattiva R5 (modo comando)

OFF COMANDO

Codice di comando

g0r0

PORTB LCD BUSY LCD_E

movlw

b'00111000'

call

LCD

libero?

5ì. Genera imouko di

call call

LCD REG

m0vtw

b'001 f 1000'

call call

tCD

LCD_DELAY

Codice di istruzione

REG

LCD_DELAY b'00-i f 1000'

Temporizza

call call

ICD

movlw

b'00000001'

Codice di istruzione TemDorizza Cancella [CD e Home.

call

LCD_REG

REG

LCD_DELAY

feturn

-DELAY

drwdt movlw movwf clrf

.10

LCD_DEIAY_I

decfsz

Lcd_Temb_2,t tCD DETAY 1

LCD

; Perde 40 us per la costante di Tc dei nuovi moduli LCD di

iWintek

movwf

movwf

E

i tempo

OFF COMANDO

goto

*Hà-g,-"Lf,*

che verranno utilizzate, tenendo sempre rnnin rho lo nn<izinni,, non srano gla occupate da altri file. Notate nella tavola a lato

Disattiva Lcd Temo I kd_Temb_1,F

ON-COMANDO

terli, e lur si incaricherà del resto.

di solito vengono incluse come file indipendenti del programma principale. Oltre a includere i file dovremo dichiarare le variabili

I

.14

retufn LCD DA]O

vremo solo inviare

Così come rl modulo della tastiera, il display LCD ha bisogno di una serie di routines che

Attiva

ENABLE DISABLE

è

i dati all'LCD e ìndicare dove met-

Pone LCD in Modo WR

n0p

mo osservare, l'orNlni dn-

Porta B uscita

return

portunità in modo rnmndn o <omnli.ó l-nmo nnccir|,v sv, HvJJs

STATUS,RPO PORTB STAIUS,RPO

SCRIVERE

&t*YgruffiS #g **ruFtr#È-*-*

Sw#*weww*

PORTB STATUS.RPO

qoto

MOVIW

*-$:

E=0

h'tt'

DISABLE

mo questa possibilita, dato che l'unica perif erica ner rannresentare numeri e lettere era il display a 7 segmenti, anche se in modo abbastanza limitato. ll display LCD ci

Scrivi

1

RB<0-7> uscite diqitali

STATUS,RPO

n0p btfsc

bcf

"MONTY"

i

ENABLE

clrf

<omnliro

; Banco

i

bcf

il messaggio "M0NTY".

ganrgramma

STATUS,RPO PORTB PORTA STATUS,RPO

DISABLE

bt

Enunciato dell'esempio di funzionamento dell'LCD

LCD

lnizio delle variabili. Sarà il orimo indirizzo disponibile

I Porta A uscita ; Banco 0 ; R5=0

m0vtw mowvf

LCD BUSY

lniziolizzo

PORTA,0

Lcd var Lcd-Temp I kd_Temb_2

LIGGERE

5i vuole verificare il funzionamento del display

€onfigurozione rcD

P0RTA;1 P0RTA,1 P0RTA,0

; Attiva seqnale E ì Disattivaieonale E i Pone LCD in-Modo RD : Pone LCD in Modo WR : Disattiva R5 (modo comando) ; Attiva RS (modo dato)

OFT COMANDO

bcf

LCD BUSY

,-J--ì udrd

PORTA,2 PORTA.2

ENDC

*g 16.$&*xg*ru&ffi fi ruF*

LCD. Per questo si scriverà

bsf bcf bsf bcf bcf bsf

qoto decfsz

goto return

Routine di trattamento dell'LCD

Lcd Temp

1

kd-Temb-2 Lcd,Temp_[F LCD DELAY I

E


UP_LCD:

Configurazione delle linee del PIC per LCD

ICD,BUSY

Lettura del Flag Busy e indirizzo

LCD_E:

lmpuho di tnable. Nei nuovi

LCD_DATO:

Soittura dei dati in DDRAM o CGRAM. lnvia dato presente in W

LCD

questo segnale deve stare a "0",45 m5 prima di tornare ad essere attivato a "1"

LCD.RIG:

Scrittura dei comandi dell'LCD. Invia il comando presente in W

LCD_INI:

lnizializzazione dell'LCD inviando il tomando "Function Set" 3 volte consecutive con un intervallo di 5 m5. ICD rimane cancellato e il cursore nella prima posizione

tCD DEIAY

Routine di temporizzazione di 5 m5. 5i utilizzano le variabili Lcd_Temp_1 e LCD_Temp_2 al posto del TMR0. Questo rimane libero per le applicazioni dell'utente.

Significato delle routines dell' LCD

Ogni volta che si utilizza, si fa corrispondere all'etichetta che segue il valore successivo. Così ad esempio, dopo questo #define, ogni volta che nel programma si scrive "ENABLE", è come se si ponesse "bsf PORTA,2". Questo avvicina un po' di piu l'assembler ai linguaggi di alto livello. Nella tabella allegata troviamo diverse routines implementate e le loro funzioni. insieme al modo di utilizzarle. Le più impor-

prendere una frase completa, invece di dare ordini per il posizionamento del cursore per ogni lettera in modo individuale, 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 catena che si vuole visualizzare.

tanti sono: UP_LCD, LCD,lNl, LCD_REG, e LCD_DATO. Queste si richiamano alle altre per il loro funzio-

Fffi#V& ll montaggio per la verifica di questo esercizio e mo-

namento, pero non e piu necessario che lo faccia an-

strato in figura, e segue la configurazione tipica usata per la maggior parte da ditte che utilizzano moduli che integrano un display tCD. N/PLAB non dispone di risorse per simulare rl funzionamento di questo tipo di periferiche.

che l'utente nelle sue aoolicazioni.

pffi*#ffie$4 f4&

FffigFd fl atr&E_fr

Nel programma, per prima cosa bisogna configurare PIC per l'uso della tastiera: e questo

il

va fatto ognivolta che lavoriamo con

il disnlav dato che e ,,

v,JY'vlt

normale che

condivida le linee con le altre periferiche e chp orresfe le rttilizzino in un altro modo. In seguito dovremo inizializzare l'LCD. Questo processo è necessario solo la prima volta che si ulilizza un LCD nel programma. Dopo aver iniziato a mandare ordini o À1+i îll'l LLUr r'-n lr uCtl Oll ld PlULCtru'u ^r^.^4trr:

qomnro

ò JLrrrprL L

uguale. Quando si tratta di un ordine, si deve introdurre il codice di controllo in W e chiamare la routine LCD_REG, mentre se si tratta di un dato si mefterà nrrest'gl{jppo in W e si chiamerà LCD_DATO. I comandi

'^

lfll--

-2rÈL?,EL

piu utilizzati, come ad esempio cancella LCD e porta il cursore alla prima posizione, saranno introdotti a loro volta in una subroutine, pero internamente faranno la stessa cosa. Nel

nostro caso, dato che vogliamo

t

'5 fr+sv +I'u'l +

Sch ema co m p

I

eto

d el l' esercizt

o

$w$*.wwy*


LIST INCLUDE

p=l5F84A P16F84A.|NC

EQU EQU

0x20 0x22

; Inizio delle variabili delle routine LCD ; Variabili temporali per la temporizzazione

ORG goto

0x00

;

ORG INCLUDI

0x05

; Tipo di processore

; Definizione dei registri interni . ,.,::::::.1

var Delay-var Lcd

.:.t

',2

Vectot di Reset

:.:.::'': .

r::ì::l::

:.,.::::ì

lnizio ; Salva il Vector di interrupt

'::':aa.,a;.

: a

LCD_CXX.INC

; lnclude le routine di gestione dell'LCD

.t::t

a::,::,:aa

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

;;;,::t::1

Delay

sleep decfsz

goto

Delay-var,F Delay

;Temporizza 36,4 ms sino a che il WDT vada in overflow ; È fato ripetuto il numero di volte desidetato? ; No. Attendi altri 18 ms

:::a,:,

return ..:.t::,.1 ..t.:a:ì::

;Programma principale

:

lnizio

CITÎ

clrf bsf

clrf

drf MOVIW

b'0000r001'

mowvf

OPTION

bcf

REG STATUS,RP0

call

UP-LCD

call

LCD-INI

m0vlw

b'00001'100'

call

LCD_REG

m0vlw

call

movlw

.28

movwf

Delay,var

call

Delay

movlw

b'00000001'

m0vlw call MOVIW

call

movlw call

movlw call

m0vlw

a com pl eto

d el l' en u n

,M,

; Cancella i latth di uscita

; Seleziona il banco 1 ; Porta B configurata come uscita ; Porta A configurata come uscita ; Prescaler di 2 al WDT ; Seleziona il banco 0

.

:..4::a::,

.:.,:::.a.4

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

':;11,.:.

":

a'::t:a

.

::i::

; Configura la porta per LCD ; Inizializza LCD ; LCD 0N cursore e btink OFF

; Pone il cursore nella 7" posizione ; Visualizza

"M"

; Visualizza

"0"

; Visualizza "N"

,T,

call

LCD_REG

movlw

,zo

movwf

Delay var

call

Delay

g0r0

Ioop

END

.':l::

0x86

ICD_REG LCD_DATO ,0, LCD_DATO 'It' LCD_DAT0 LCD_DATO LCD DATO

call

a:

; Cancella i latch di uscita

; Resetta il WDT

chwdt

L00p

Prog ra m m

PORTB PORTA SIATUS,RP0 TRISB TRISA

; Visualizza "T"

;

Visualizza "Y"

;Temporizza '1"

; Cancella il display

;

Temporizza 1"

; tine del programma

ciato proposto

Sg*Ssss.-wryw

,,:iì ..:'::j:


&

Strumenti di lavoro: caratteristi ch e avanzate di MPLAB (r)

M

ffi ffi

m'

ffi

uando abbiamo presentato MPLAB, accennammo

ffii

ambiente di sviluppo per il lavoro integrato con i PlC, dato che con lo stesso programma si nossono realizzare îrrtte le funzioni necessarie allo sviluppo di un progetto, anche se alcune di esse necessitano di un hardware specifico. Ora vediamo le caratteristiche più interessanti di due dr questi moduli

al fatto che era

I

ffi. ffit"

ffi ffi,

addizionali, accessibili

un

tramite

MPLAB.

w fl

ffi ffi: ;:

-

Per lavorare con l'emulatore dovremo

cambiare I'ambiente di sviluppo.

fud--

ffi

Èiffiffi # $-rW#ffi#

gt\ {trffifl {JXT# pXifbtASTKffi

H.

Un emulatore è uno

ffi'..

strumento

L--J...^-^ -r^tc >ctvc -^-..^ nor Itdtuvvdtc Lt r,. mAftoro :

punto programmi che funzionano

ffi,

LUI I lC )C

r

ci )l

c+nccnrn )LC))ClU

o<onrrondn LJLVULT ruv

in il

|

tempo reale. MPLAB dispone di strumenti software per poter ulilizzare,fra

gli altri, l'emulatore

PICMASTER. Un

r

emulatore si accomuna e si differenzia

$M',.

reale in dìverse cose:

ffi. ffi" ry

t.

:r:::::::::

dal simulatore e daìla

.

Fotog raf i a del I' em

uI

atore

Pl

CM ASTE R

applicazione

L'emulatore contiene linee di

innro<cn/r

rcrit:

o di<nnciti\ti r

v'JYvJ'

\'

v t,

r6,o

ffiw$#wmss*

,:taetlít gtfr$rtt:|1|l:at,'\1,:tai:*tì\ìììjìì!s!]ì!ij:ii:rilffitlutìu


.

PICSTART ptus

Fffi.ffiffif

r grtG*re

velocità di esecuzione dell'emulatore e la risoosta 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 accade all'interno del microcontroller in tempo reale; serve per mettere a punto il programma, potendo inoltre attivare dispositivi come un oscilloscopio a tale scopo. r I a "testa di nrova" dell'emulatore è intercambiabile a seconda del PIC da emulare, e si introduce nello zoccolo destinato al microcontroller come si farebbe con un PIC normale. Le linee addizionali che l'emulatore porta all'esterno, si possono collegare alle periferiche, per vedere il valore di determinate linee, o per l'introduzione di eventi esterni. Sarà necessario configurare il PIC-N/ASTER seguendo le specifiche del fabbricanLa

te, che dipendono dal microcontroller da

emulare. Bisognerà cambiare anche l'ambiente di sviluppo come già abbiamo fatto iniziando a simulare i programmi,

configurare le porte, il clock, ecc. Per sapere se I'emulatore funziona in modo adeguato, possiamo fare una prova nell'opzione Tools>Verify PICMASTER. PICSTART Plus per la scrittura dei microcontroller.

hanno la stessa f unzionalità del processore reale, men-

tre il simulatore è un modello lrmitato delle caratteristiche del microcontroller.

g-# sfiffig"cY#ffiffi pxil$Y&ffiY g3L&is Un altro hardware molto interessante, che si può anche gestire 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 possibilità di utilizzare lo scrittore che offre N,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 collega al computer con un'interfaccia <ori:lo

nor P-' nn+ar riratraro

il nrn-

gramma tramrte lo stesso ambrente di sviluppo.

.

Nello stesso modo è possibile leg-

gere l'informazione contenuta in un microcontroller non protetto per metterlo a punto, modificarlo o copiarne il codice. Dopo aver installato il dispo-

sitivo dovremo sceglrere rl programmatore da utilizzare. Nella barra dei menù ne apparirà uno nuovo per il lavoro con il PICSTART Plus che permoftorÀ rli <rrivoro lonnoro a.)n.FtaDovremo scegliere il programmatore da utilizzare

Sw$#effiwww

re i microcontroller.


Appti cazione pratica: un programma completo giunto

il

momento

di

mettere in pratica in un unico programma tutto cio che abbiamo imparato. Uniremo l'introduzione dei dati tramite la tastiera, con la visualtzzazione deg i stessi tramite LCD e con le altre semPlici Pertferiche che saranno necessarie. Per quanto riguarda le subroutines ab-

biamo cercato un'applicazione

in

cui ìa loro utilizzazione non solo abbia senso, ma sia indispensabile per

un buon funzionamento.

5i vuole controllare l'accesso ad un recinto.

fare questo disponiamo di una tastiera, in cui, dopo aver premuto il pulsante "4" di "accesso", si dovrà introdune un codice Per

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

Schema elettrico dell'eserozio proposto

del codice. Questo sarà memorizzato nella EEPR0M, e potrà essere tambiato con un oulsante della tastiera "C" di'tambio".

tr{-ilT?KA** Leggendo l'e-

Un cicalino piezoelettrico emetterà un "beep"

premendo ogni pulsante. Un display LCD, da parte sua, genererà mesaggi che guideranno l'utente nel suo compito.

s{#ilffie nunciato dell'e<orrizio p nnssibile che abbiate non(:tn

E

n u

nci ato del I' eser< izi o p

roposlo

#ffiffi&rusffiK&F€ffie

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

Come possiamo osservare dall'organigramma esposto, il programma non è così semplice come quelli visti finora. Cìò è dovuto al fatto che sono contemplati diversi casi, e che in quaìsiasi momento è permessa l'opzione di cancellazione. Per arrivare a questo organigramma prima abbiamo dovuto pensare molto bene alle opzioni permesse, e fare un primo organigramma più semplice per complicarlo successivamente con l'introduzione 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 sempre un valore memorizzalo, ecc. In ogni caso, a dispetto della dimensione dell'organigramma, notate

che sono state rispettate le regole della struttura, e non cisono diversi puntidifine, ingressia metà difunzione, ecc. Per questa ragione la traduzione in programma assembler non dovrebbe comportare alcun problema.

ffiw$wwsexres


pgq#s$q&P"'gÍ1,?-q ConliguÉrione

M3, U4

ICD

Questo programma risulta molto lungo. Inoltre notate che si parte da cio che si conosce e si hanno a disposizione tre file, di cui due contengono le routines per il trattamento della tastiera e dell'LCD, ilterzo contiene la definizione dei registri del PlC. Di questi abbiamo già parlato in precedenza. La prima cosa che appare nel programma dopo la configurazione delle variabili, sono i messaggi che devono apparire sull'LCD Tutti i messaggi sono raggruppati in una tabella simile a quella utilizzata con il

D;i.onnenèF elè c.i.olirc

l€99eré

ts3i&.e

EIPROM

È!frli'2.r.? O

- (AltuètuÉ

vúudr4oÉ

mènur

'*

c;mbio.hidvè

{cJ

*ordh

toifierc

ui pukd^t.?

a CeneroE

"baF"

è

orèndere,olb

display a sette segmenti, ma presenta la ca-

Èrobp,€Fdo O

$ trò

I

ftb

hFr..onrabÉ

pEnuro "4"1

i.rè:.o q

3

O vùuolL!. n€iù:

{al coi.ellore

rodnè?

il.evè..dk€

{p

Vèdfi.. ie

è

.oreh

vérifi..

o Rneve

è.ordo

O

vLlqlù&ménù:(C)coi..llcnuoyo(odté

È

(dte?

.X,'f" o

r€

O

{cl co..e[o

Ri.ovè.di.è

Èshbp,.énub

O

vÈ&lÈa nénù

visu.li'ld,,puòFsdre"

cdi.e

"':i$-

B

a

ftb p'end.

&

Vi3u.lizo "A<€ss.

rq.b',

vùuolirlo mènù: ((l Conello.!ilehd

Rneve.odi.e

O

È

Esempio di come apparrranno i messaggi

tabella

oxl

I

Mesag

oK 2. digir?

ox3' digm

O

o ffdorirro

O

rg

an

ig ra m m

nqovo

equ

retlw fetlw

oK 4. digil?

89

1

movwf

retlw retlw retlw retlw retlw retlw

a . rry

in un file a parte. ll resto di domande e funzioni, si segue a partire dall'organigramma, che corrisponde con la parte

interno

F9

rg

f l-l E a Utrrro Ànllr +rc+i^...i inqoriro Il'lL!y Ld)Lttrtd >t nntrohhorn F_''

principale del programma. Iniriolird.ontd.re

lbro eEnú.

*

ratteristica di essere divisa in frammenti e per accedere ad ognuno dei messaggi indipendentemente, si assegna all'etichetta che simbolizza il suo nome, il valore del PC in quella posizione. In questo modo, potremo cambiare il testo dei messaggi o posizionarlo da un'altra parte del codice, senza che influenzi il programma che lo sta chiamando. lnoltre si dovranno ulilizzare Ie routines di lettura e scrittura della EEPROM per Ieggere e scrivere la chiave. ln questo programma sono presentate in modo diverso da come le abbiamo viste negli altri esercizi, quindi allo stesso modo delle routines del-

retlw retlw retlw

(di.e

P{l ,

I'

'A'

Ì

'; :!;

:i

retlì/v

:ia

retlw

0x00

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

;Spostamento sulta tabella

Messag_l_l

equ reflw retlw retlw reilw retlw retlw fetlw retlw retlw

$

I' 'C'

)' 'C'

'a'

'm' 'b'

'i'

retlw reflw

retlw retlw retlw retlw retlw retlw

'C'

'l' 'a' 'e' 0x00


.Tinn rli nrnra<<nro

P=16t844

,,. --

0x11

diqit 0tqìI

I

I

subwf

N tasto,W

btîsc

_z

goto (all

N_tasto UP-tCD

movlw

OIqII J ; Variabili per i

dióit 4

diiem

call

digit del codice

1

di tem z di,tem_3 di_tem 4 cont err (ont tasti

; Variabili temporaìi per i digit ; Contatore di errori ; Contatore tasti premuti

temp_1

temp,2

; Variabilì

Delay_1 Delay_2 Delay_3

;

temporali

Variabili per la temporizzazione

INCLUDE

"P16F84A.|NC" ; Definizione dei registri interni

#DEFINE #DEFINE #DEFINE #DEFINE #DEFINE #DETINE

_z

Si_canc No

can(

rd

,wr

Etc0N'1,2

wfen

catl

0x0C

subwf btfsc goto g0t0 bsf return

N tasto,W

bcf

temp

movf movwf incf

N_tasto,W

LCD

; Visualizza il carattere ; Genera Beep e aspetta che s! liberi

; controlla se è il tasto c (Cancellare)

Si canc No canc

temp

1,1

1,1 INDF FSR,Í cont tasti,f N_tasto

;

Attiva flag dì cancellazione

; Disattiva il Flag di cancelìazione ; Scrivi il tasto nel buffer ; Posizione successiva del buffer ; Aggiorna contatore dei tasti ; Ripete il processo

return

: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

ORG

0

; Vector di inizio

0key

9Oto

lN!zt0

ORG

5

movwf

PCL

equ

$

DT

"(A) Aoertura", 0x00

1_1

equ

b

2

equ

Messag-2-1

4 5 6 Messaq -Di

movlw movwf movlw movwf

; Spostamento sulla tabella

drf Okey

call

1

mol4 tw subwf an0

"Codi(e", 0x00

equ

btfss "(C) Can(ellare", 0x00

DT

Messag-3

bcf

"(C) Cambio todice", 0x00

DT DT

equ

$

DT

"Nuovo Codice", 0x00

lvlessag

equ

Messag

equ

bsl incf incf decfsz

"Confermare", 0x00

DT

goto return

"Può Dassare", 0x00

DT

1,0 4 cont tasti digit tSR EEADR EE Read temp

1

; Cancella il flag

; Numero di byte da verificare

1

; Primo digit ; Prima posizione della EEPR0M ; Legge il byte della EEPROM

EEDATA,W 0x0F

INDIW z temp_1,0 EfADR,f tsR,f

(ont_tasti,f

; Lo compara con il buffer ; Controlla 5e è uguale ; No, attiva il flag di errore ; Posizione successiva deila EEPROIV ; Digit successivo ; Ripete la verifìca

0key-1

equ "Accesso negato", 0x00

;

INCLUDE INCLUDE

"tastìera,inc''

"lcd-txx.int"

: Delav: Ouesta routine realizza una temporizzazione variabile, che dipende dal valore ; dell'ércúmulatore nel momento in cui sì legge.

Delal

golo

z

; Riconflgura

EECON,I,4

Messag_1

Delav

DATO

KEY_oFF

;N0

,eeif

tabella

Messag

5TATUS,2 STATUS,5 EECONl,O EECON,I,,I

LCD

calì

decfsz

lvlessag

; Qualche pulsante premuto?

loop

decfsz

movwf Delav 3,f ooto úecfsz ooto decfsz goto

Delay

EE

.Read: Legge un byte della

bsf bcf ; EEWRite: S(rive un bvte neìla EE

Write

Delav loop Delai 2,f Delav loop

movlw movwf movlw movwf

Delai l,f Delay_loop

cal

I

movwf movf btfss

I l,W tabella temp 2 temo 2,f z goto

bsf bcf btfss

goto bcf

; Salva posizione della tabella ; Recupera posizione della tabella ; Chiama carattere dì uscita ; lMemorizza il valore deìla tabella

temp temb

bt bsf

; lVlessaggio: Questa routine porta nell'LCD il messaggio il cui inizio è inditato : nelì'a(cumulatore

1

rpO _rd rpO

;Selezione del banco 1 ;ordine di lettura ; Selezione del banco 0

EEPRONII

'l

return

lVlessaqqio movwf movf Nessallio

bt

Keao

EEPROIV

bcf

,rp0 wren

; Seleziona il banco 1 ; Permesso di scrittura

0x55 EECON2

0xAA EECON2

; Sequenza secondo Microchip

;Ordine di scrittura wren _eeif Wait -rp0

; Blocca ulteriori scritture ; Verifica la fine della scrittula ; Resetta flag di {ine scrittura ; Seleziona il banco 0

UP_LCD

; Guarda se è l'ultimo No ultimo

call call

; Visualizza sull'LCD

movlw movwf

LCD_lNl

; Inizializza

DISPLAY-ON-CUR

OFF

LCD

feturn

No_ultimo

call

incf goto

LCD_DATo

temp

1,f

l\4essaggio.1

; Controllo: Attende che siano p,emuti i quattro sulI'LCD. ll ; in digit_1 .. diqit 4 e visualizza

Controllo

N tasto

movlw movwf m0vtw movwf call

movlw

Programma r60lto

-4

; Carattere seguentÉ ; Ripete (on il carattere su((essivo

talo

C

call

permette di cancellare

cont tastì digit-1

; Inìzializza contatore

F5R

; Punta all'inizio del buffer della tastiera ; Esplora Ia tastiera

KEY SCAN 0x80

clrf

digit del codice, li memorizza

movlw subwf btfss

goto : Carica

b'00011000'

PORTA EEADR EE Read

; Scollega relè e cicalino

; Posizione iniziale della EEPROM ; Legge byte dalla EEPRoM

0xff EEDATA,W

z

5i usata

nella EEPROM il codice 1234 per default

; Verifica se è utilizzato


;:li.:,

No

usata

No_usata_I

Si_usata

No tast

clri

EEDATA

movlw movwf incf

4 temp_1

; Numero di byte da scrivere

EEDATA,f

cail

EE

; Codice da scrivere ; Scrivi dato

Write

incf

EEADR,f

decfsz

temp-1,f

9ot0

No usata_1

(4il movlw

LCD_lNl

Messaggio

m0vtw

0xC0

call

LCD_REG

movlw

Messag-l

cail call

Messaggio

m0vtw subwf

0x80

btf5c

goro call

m0vtw subwf btfsc

g0r0 movlw subwf btfss

goto

KEY

; Visualizza "(C) Cambio Codice" ; Esplora la tastiera

; C'è il tasto

No_tast KEY 0xoA

OtF

_z

i

E' il tasto A (Apertura)?

Altro i E'il tasto

movlw

LCD_REG

movtw

Messag-2

calt

illessaggio (ontrollo

goto

temp_1,1 Si usata

cail

uKey

C (Cambio codice)?

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

LCD.REG

Messag,3 Messaggio

; Offset del messaggio 3 ; Visualizza "Nuovo Codice"

call

Controllo

btfsc goto

temp_1,1 5i_usata

; Attende il nuovo codire ; Cancellazione awenuta?

movlw call

movf movwf movf

mowvf movf movwf movf movwf CAII

btfsc goto

Messag_2-l

Messaggio

Messaggio digit

digit_1 FSR

; Indire dei digit

drf

EEADR

; Prima posizrone della

movf movwf

INDF,W

EE_Write

; Saive nella !EPROM ; Digit successivo

EEADR,f

; Posizione successiva della EEPRoM

decfsz

(ont_tasti,f Altro_digit usata

novlw

3

movwf

cont err

; Stabilisce il numero dei tentativi

UP-tCD LCD-INI

; Riconfigura LCD ; Aggiorna ;Offset del messaggio 2.'l

Altro_ancora call call

movlw

Messag 2

1

Messaggio 0xC0

; Visualízza "(C) Cancella"

I.CD.REG

; Riposiziona il cursore dell'LCD ; Offset del messaggio 2 ; Visualizza "Codice" ; Attende che si introduca il codice

Messag 2 Messaggio

cail

0key

btfs( g0r0

temp 1,0 No 0k

call call

m0vlw (atl

UP.LCD LCD INI Messag_5 Messaggio

bcf bcf

PORTA,4

; Riconfigura LCD ; Aggiorna ; 0ffset del messaggio 5 ; Visualizza "Può passare" ; 5i attiva il relè

PORTA,3

;

; Temporizza 2 sec.

; Verifica se è

bd

PORTA,4

; Visualizza "(C) Cancellare"

drl

bt

PORTA,3

9oto

cont err Si usata

;Offset del messaggio 4

decfsz

cont

;Visualizza"Confermare"

goto

Altro_ancora

call

err,f UP-ICD LCD lNl lvlessag -6 lressaggio

m0vtw

0x10

movlw

(aII goTo

di_tem 4

; Salva in modo temporaneo l" codice

Controllo

; Legge il secondo codice

DISPIAY ON-CUR_OIT

movtw call

return 1,1

5i

call

digit 4,W

Si usata

EEDATA F5R,f

0x0A Delay

3

; Cancellazione awenuta?

;5i

EEPRoIVI

incf incf goto goîo

Si_A

; Numero di byte da scrivere

call

m0vtw

dí_tem_2 digit 3,W

temp

cont tasti

; Ri(onfigura ICD ; Aggiorna LCD ;offset del messaggio 2.1

di_tem-1 digit_2,W

di tem

;No

movlw movwf

1,W

Programma r isolto kon tinuazione)

ffiw$*ewwr*

:tl

0xC0 LCD REG

Messag_4

; Verifica il 4' diqit ; Uguale?

5i-usata

movlw (atl

UP_ICD LCD_lNl

di-tem 4,W

movwf

del messaggio 2.1

; Visualizza "(C) Cancella" : Rinosiziona LCD

;No

ii,usata

temp_1,1

inizializza LCD

call

m0vtw

digit_4,W

btfsc

Messag_2_l ;0ffset

calt

movf subwf

goto

; Cancella e

; Verifica il 3" diqit ; Uguale?

tem_3,W

ai-usata

Controllo

movlw

Messaggio

di

goto

Verifica se è corretta ; E'valida? ;

Si_usata UP LCD tcD tNt

0xC0

usata

call call

temp_1,0

call

digit-3,W

;Si

btfsc

movlw

5i

movf subwf

movlw (all movlw

9010 call cail

(atl

digit

No tast

call

2,W

movlw

5i A

z

di tem

gor0

; Scrive nella E!PROM il nuovo codite

; Genera beep e attende che si liberi

0x0C N_tasto,W

Messag_2_1 Messaggio 0xC0

cail

dìgit_2,W

Verifica il 1" digit Uguale? No

btfss

N_tasto,W

LCD_INI

m0vtw

movf subwf

N tasto,W

movlw

call

Si-usata

;

btfss

; Regola posizione del messaggio ;offset del messaggio 1,1

'l

_z

CAII

btfsr

goto

goto

UP_LCD

call

; Inizializza ICD ;Offset del messaggio 1 ; Visualizza "(A) Apertura"

SCAN

call

cail

drgit_1,W di-tem 1,W

btfss

Messag_1

call

movf subwf btfss

END

Delay Si_usata 100'

b'00001 LCD REG

coretta

Attiva beep

; Disattiva il relè ; Disattiva beep ; Pone a zero il contatore di tentativi ; Ripete il processo ; Prova fallita ; Ripete un altro

tentativo

; Rjconfigura LCD ; Aggiorna ; Offset del messaggio 6 ; Vìsualizza "Ac(esso negato" ; Temporizza ; Ripete il processo

; LCD on cursore off


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

(il)

Codice assoluto:

cmw

ambiente che

OPTION

facilitano la oroqrammazione dei mtcrocon-

:

trolìer PlC.

$4p&sM effi $$ ffi &cfs ffi R&T*&fr mx p4sm{jg-x Conosciamo MPASM come un assemblatore che trasforma il codice sorgente che intende l'utente, in un codice adeguato al microcontroller. Però questo assemblatore 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 file

Codice nei moduli:

CODE

Start

CLRW

OPIION

Codice definito come modulo all'interno di un programma

Dati assolutir

un

HEX eseguibile, è leggermente dif-

cBL0c(

0x20

ferente.

ffiSMtjLX ffig il#Sxflfr Possiamo definire come moduli diverse cose. Quando sono istruzioni della

memoria

di codice dovranno

lnputGain, 0utputGain

; Controllo di citlo

HistoryVector

; 5i deve inizializzare a 0

Tempf, Temp2, Temp3

; Variabili temporali

IDATA

; Dati inizializati

ENDC

essere

precedute dalla dichiarazione di una sezione di codice come mostrato nella

figura. In aìcuni casi, è necessario specificare la sìtuazione fisica che occuperà il codice, come ad esempio con

Dati in sezioni:

HistoryVector

DBO

il UDATA

vettore di interrupt.

r4ffiffiffiLX *gX ffi&YX Anche i dati della memoria RAM possono 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

lnputGain

REs

1

0utputcain

REs

1

UDATA_OVR

Templ

REs

1

lemp2

REs

1

Temp3

REs

1

; Dati non inizializzati

; Dati temporali

Dati definiti in sezioni all'interno di un programma

Sw$sawwvw


siamo abituati e nelle differenti sezioni, a seconda dell'uso che vogliamo

fare di ognuno, in modo che il programma li gestisca in modo differen-

îe. Per oontrnà delle sezioni si usa un

tino di direttiva nor e<cmnin noli: IDATA sono permesse le direttive DB,

DW e DATA.

KSff#RY&KX***ffi $: p#RYexg*$* g ffig tr&#*fi"3 {_g Quando vogliamo che un'etichetta definita in un modulo o routine si utilizzi in un altro, la si deve esportare utilizzando la direttiva GLOBAL, per ciò è necessario averla dichiarata in gffi

precedenza. A loro volta, i moduli che utilizzano etichette dichiarate in altri

moduli dovranno essere importati con Per poter utilizzare moduli in un progetto dobbiamo indicarlo in MPLAB la direttiva EXTERN. Dato che si lavora con differenti banchi di dati, dobbiamo tenere presente in quale banco si alloggia ognuna lizzando la direttiva BANKSEL seguita dal nome della delle variabili prima di fare riferimento ad esse. Questo variabile prima di fare qualcosa con essa, perche sia compito pero può essere demandato all'assembler util'assembler ad occuparsi di cambrare banco.

rffipesffi fr#ru wtrLKruK

Definizioni delle variabili globali in un modulo:

tr UDATA

lnput6ain

RES

1

0utputGain

RES

f G!0BAL InputGain, 0utputcain

Filter Global Filter ; Filter code

Utilizzo di variabili definite in un altro modulo:

realtzzalo in questo modo e la riutilizzazione del codice con il conseguente risparmio di tempo e Da parte sua, MPLIB aiuta anche il manteni-

mento del codice, visto che permette di fare

RES

librerie.

1

MOVWF

lnputGain

Una libreria è una collezione di moduli object, normalmente con alcune caratteristiche comuni riunite in un unico file, come per esempio, la libreria "math.lib" per il lavoro con ope-

MOVLW

GAIN2

razioni matematiche.

M0\AI/F

0utputGain

MOVLW

GAIN1

MOVF CALL

Reading,W Filter

Dati e routine definiti in modo qenerale per essere utilizzati in altri moduli

Sw$$wresse

modulo in oggetto, per assemblarlo si seleziona l'opzione "Object File" e il file avra estensione .obj. ll programma MPLINK si incaricherà di radunare e posizionare tutti i moduli realizzati, generando l'eseguibile. ll vantaggio di un progetto

UDATA

CODE

tffstrfttÌìÙrrR*i

il

risorse.

EXTIRN lnputGain,0utputcain,tilter

Reading

ffi$3$_5:t$

Una volta editato

Per noter tiilizzarp in rrn nronptto diffcrcpli moduli di questo tipo al posto di uno solo, lo dovremo indicare come opzione, in Option >Environment Setup, e all'interno di questo,

noll: <rhod: Prniort


Strumenti di lavoro: caratteristiche avanzate detfM PLAB-SIM I

il

l'imPonanza che riveste ffiWM ata provare il un programma ffi W la sua compilazrone e dopo W ffi ffi w

ffi ffi prima di programmarlo $W'-,,.--,,-.---.-, dtrettamente sul mrcroconw troller; anche se abbiamo gia fatto

i

primi passi in questo settore, crediamo che il simulatore MPLAB-SlM, all'interno deglì strumenti supportati dall'ambiente di sviluppo MPLAB, meriti un discorso a parte. Sino ad ora abbiamo eseguito un programma, abbiamo introdotto differenti valori sulle linee di

r/A -L.A;--^ 9uoruc ^,,-.rlto i risultati sui t/v c^ duutdilru registri corrìspondentì. In definitiva abbiamo venficato che i programmi andassero bene, e che facessero quello che ci si attendeva da loro. Pero, avete provato voi a fare alcune delle modifiche che vr abbiamo proposto? Dobbiamo chiamare ogni linea di ingressoluscita come propone il simulatore E in caso affermativo, che cosa è successo quando il programma non ha $3X$\$ XNSffi ffi$SglUSf,XYffi f unzionato? Avete trovato la causa? p A volte orresto e diffirile nprchp np.essalo conoMPLAB-SlM può lavorare con molti e diversi microcontroller, fra cui il PlC16F84 e, a seconda deì dispositivo scere le caratteristiche avanzate del simulatore che cì che si sta utilizzando, dobbiamo tenere conto di diveraiutano nel nostro compito. quelle se cose. di cui dobbiamo tenere Inizieremo vedendo Alcuni microcontrollel ad esempio, hanno multiconto al momento di lavorare con il simulatore e che nlex:tp lp loro linee di inoressi/r rsciîe in modo che dipendono esclusivamente da questo, in altre parole, quello che ci permette di fare e che restrizioni presenta ognuna realizzi diverse funzioni e per ognuna di esse c'è un nome. MPLAB-SIM. Per modificare queste linee, sia direttamente che Wffi *-*{gYe g}K *:Sffifl àitrg*ru ffi con l'opzione di introdurre stimoli esterni, si devono utilizzare i nomi proposti per esse, altrimenti il simulatore tN/PLAB-SlM simula l'esecuzione di un microcontrol-

ffi'

tu

'^rocita che ler e orrpllo deoli inn"^-'tt""t+^ VEI d UllO " 'JIC))l/U)LILC' -*J" dipende dal computer su cui gira il programma. Di rnnqpnronTÀ ncr In qtesqrì nrnnr:mm: si devono considerare differenti opzioni, per fare in modo che la simulazione non risulti ne troppo rapida, né troppo lenta.

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 maggior peso della porta B, interrupt esterno per RB0/lNT e

tt

tttttttt

Sw#sw*xww ::


sw&Til*-$ffi*# Anch'esso e simulato nell'MPLAB-SlM, sempre e quando sia stato attivato in Options>Development Mode.

RffiSgS?eA Sptrflg&g"g Lavorando con i PIC ci sono alcune risorse che, anche se devono essere prese in considerazione, non dispon-

gono di una posizione all'interno della finestra dei reginon sono recristri di ner se hensì bit all'intornn doi ionictri Si dispone di questi tramite la finestra di registro di funzioni speciali, come il T0PRE, per rappresentare il

slri noirhe

Sono contemplate diverse cause

di

prescaler del TMR0. ll reoistro di lavoro \A/ e rrn r:cn cnpri:lo rhe si trova in questa finestra.

reset

termine della scrittura della EEPROM. Questo permetterà di ultlizzare la risorsa di "stato di riposo", da cui si ócaó aAn rrn intarrr rnf

KffiSgY srmulatore inoltre supporta

ll

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'opzione del reset dentro l'opzione Debug>Run. Inoltre abbiamo il reset del sistpma e il reset npr connessione dell'alimentazione.

Ci sono alcune risorse che si possono solo osservare all'interno della finestra rlei rcni<tri di fi tn-ioni <nprtdlt.

#F*g # 3c'èd $: i hi\Àq ffig: tuF!&Lqàtu Oltre alle linee di ingresso/uscita, all'interno del simulatore 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 medianfo imnrrl<i octorni ln nrro<t'rrltimn r:<n il +on,lpo In cul l- li^^td il|ed

.i,--^^

.J; almeno ^--^.^ |iltd|e d- 1I e^ a- n,l^,,^ u, oeve essere ol un

ciclo, per essere tenuta in conto.

.

Memoria dei dati EEPROM.

Anche questa risorsa e simulata, insieme ai suoi cicli di lettura e scrittura. E approssimativamente di 10 ms. il Watchdog dobbiamo attivarlo come si farebbe per la scrittura del PIC Per utilizzare

Scp#&eetrw*"w

Le funzioni dei bit di controllo WRERR e WREN sono q))E -i-,,l-+^ ^^-r^t^--^ cttLtI )[ ttutoLE.

uiutltmlmtm@ffi


FS.

t'; ffi

p' :c::::

w

:-:'

r.' ;

tu

ffi

ffi tr.

È.i'

Strumenti di lavoro: caratteristiche avanzAte del MPLAB.SIM II

tu"

&

il; ff' iU;::

ll":'' F^i

* Fr'

$;

ffi'

e avete letto la scheda precedente, sapete già cosa potete o non potete aspetlarvi dal simulatore MPLAB-SlM. Vediamo ora come sfruttarlo al meglio, a seconda delle nostre esigenze e in ogni occasione. Ricordate che per avere accesso agli strumenti di simulazione, e necessario cambiare l'ambiente di sviluppo. hr LlUC)Ld a,,aa+r >LC>>d {i^^-+"-+^---i p\JLtdt ^^+.-^^^ il tU ili^^l+"^ rUil rC ,,^"i Vúr rL-/d ||C)U d )r

ficare se esistono delle limitazioni nella simulazione del disposltivo scelto, oltre ad ottenere "dettagli" sul medesrmo. Se non si cambia l'ambiente di sviluppo, le opzio-

ffi.

ni di simulazione appariranno disattivate.

ffii

trgfi,às{3 *.Fnm{-,\}

w'

Cambiando l'ambiente di simulazione si possono chiedere h*

g* &.1

i-4 f* f'

$*

[ !r ,f-

ll monrr Dahr rn rnntiano tr rfto lo nnzinni norocqerio ' quando si sta simulando un programma per la sua messa a punto. Le opzioni

più

ffil ffi-

importanti

sono rappresenta-

Ìe ancne In una barra di icone

ffi

come quella riportata in figura.

ffi:

Questa barra si ottiene cliccando

ffi'

sull'icona

ff

di

sini-

-+.)Lt d -.1^ll-,,iJ^^+^ ucild vlucdLd. r\,,-^,.J^ -i ^---)r po))c

vuoruu sulle icone con il mouse, sulla linea inferiore di N/PLAB

ffi ffi

àa+f " vLr(uyí

Se non si cambia l'ambiente

appare il commen-

di sviluppo le opzioni della simulazione

ro per ognuna

);.-++;,,^+^ -^^-;^^^ pPa tvt t9 u/)dLtrvo(9.

d

CSSC.

0l

an

I

i

" Aal vL,

Aic nn< v,JPvJ,(,vv.

iti,n

#pxx*rdtr K#ru L'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 subroutine da sola. e fermarsi subito dopo (Step Over). Per fermarp il nrnrpscnro ci nro ltsare l'onzione Halt con cut st visualizzeranno le informazioni delle finestre corrispondenti. Un'altra opzione di fermata è Halt Trace, che fermerà il "tracciato" del programma, però questo continuera ad eseguirsi. I registri si possono inoltre rendere visrbili con Update All Regìsters. Per iniziare nuovamente si puo scegliere l'opzione Reset, che provoca una reinizializzaztone 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).

ffi Opzioni

pu

rmportanti del menu Debug

ffi ffi'

Sw#*ewwwm


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

Opzioni del menu Run

5i possono scegliere

#Pffig*ruffi ffiKffiflLJYffi

ad esempio un treno di impulsi, si utilizzerà l'opzione

Al momento di eseguire il programma, potrebbe essere interessante non farlo girare completamente, ma verificarlo fino ad una particolare istruzione (Execute an Opcode), o eseguirlo fino al verificarsi di una determi-

Clock Stimulus.

{_&Y#ffi sYge4 # L{Js Oltre a generare stimoli per il simulatore in modo inte{,$

rattivo (Asynchronous Stimulus), si possono descrivere segnali che arrivano ai pin di ingresso come file ditesto (Pin Stimulus), o ulilizzare i file di testo per introdurre

i

valori da B bit direttamente sui registrr (Register Stimulus). Se gli impulsi devono essere periodici, come

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 di roîtrrra nermette di rombinare i diversi modi di esecuzione, in modo che, ad esempio, il programma venga eseguito in modo rapido (Run) sino ad un certo punto di rottura, in cui il programma si ferma e si può simulare passo a passo. Se inoltre si definisce un range di indirizzi di programma, si puo sapere in ogni momento che valori hanno i registri quando sono eseguite quelle istruzìoni. Entrambe le oozioni 0ermettono di visualizzare lo stato del nrrìrpssore. ouando si stanno cercando possibili cause di un mal funzionamento del pro-

gramma. Queste funzioni si possono annullare facilmente con Clear All Points.

&LgRil *trX3#r,jg Esistono altre opzioni che possono essere utili in determinati momenti; ad esempio simulare la cancellazione del microcontroller con Clear Program Memory, resettare il sistema completo come se iniziassimo in quel

momento a lavorare con MPLAB (System Reset), o generare un reset che ponga tutti iregistri con un valore determinato o casuale, a seconda di cosa si sceglie.

Può essere interessante eseguire una sola rstruztone

Scs*Éwwril,

--a:al*

, I t:,.:tj:

r.

nata condizione (Conditional Break).

{.}pK€#*{ ffi sgr4

i valori dei regrstri dopo un reset

l'onziono Confor f)ohrrn I nr:tinn normatta dr csonrrrro un salto nella simulazione del programma, collocando il contatore di programma alla metà del codice che si sta verificando

t:r

:ì$

:r,::,:

.'::,:::7

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

t ,,:::=

'i :l:::: ,'t:ì

,::ì

,.:.,:.1)

::::'

.: i+

...:::-,?

:r::i:ì rlì.ì:ì

rì:: i'ì


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.