You are on page 1of 82

Realizziamo ora il primo programma con gli

PORTA A interruttori presenti sulla scheda di tngressi e uscite.


È un semplice esercizio di utilizzo degli ingressi e delle
uscite. Consiste nel rilevare lo stato dell'interruttore
SW3, e in funzione del medesimo accendere
o spegnere il LED D1 . Nella fotografia è mostrato lo
schema utilizzato per la realizzazione dell'esercizio,
che eseguiremo collegando, mediante il cavo PtcBus,
la scheda di controllo e quella di ingressi e uscite.
PORTA B Nello schema possiamo anche vedere la ctrcuiteria
minima necessaria per il funzronamento
del PlC. Se ad un certo punto avremo bisogno di far
nuovamente iniziare I'esecuzione del programma, non
dovremo far altro che premere il pulsante di Reset.

1 tx#***#e*******#*****#***#*
2 ;Prograwa che accende o spelne il diodo
I ;led D1 de1la schedà di ingressi e $scite
Questa e I'intestazione del programma. 4 ;in îunzione de1lo stato del cosiltitorE Sl{3-
All'inizio di ogni programma btsogna sempre
definire il tipo di processore che vogliamo ;fipo di dispositiuo
utilizzare, nel nostro caso il PlCl 6F84. Poi
assegniamo le etichette agli indirizzi di
memoria dei registri dei dati, per facilitare il
loro successivo impiego durante la lg STRTUS EqU

realizzazione del programma. Poniamo nel


t'lPoHTfi EqlJ
t2 PnnTú g{tj
Vector 0 un'istruzìone di salto all'inizio It BPB E{U
del programma. Con ORG 5, saltiamo il Vector i4
di interrupt posizionato all'indirizzo 4, t5
iniziando il programma all'indirizzo 5. 16 0sE
t7 goto
t8
$ OBE
,.9

2'
22
2:l ; Inizio del programna
24
35 IHIZIO: bsf STftTUS, RPB
z,fr Elrf PflETB La prima cosa che dobbiamo fare all'inizio del
programma è configurare i registri che
2î noul$ b'BBSB810B' vogliamo utilizzare. ln questo caso dobbiamo
?* IIIOUI{f POBTR configurare la porta B come uscita
2!, bcf SîfiTU$, EPE
(il diodo Dl è collegato a RB)), e il pin RA2
come ingresso (pin al quale arriva il segnale
cTrf PIATS dell'interruttore SW3). Per realizzare la
51 configurazione delle porte passiamo al Banco
1, e dopo averle configurate
Í2 torniamo al Banco 0 per continuare ad
eseguire il programma.

Consisli prcrtici
Questo e il ciclo pilncipde del programma.
Mediante un' istruzione di salto condizionato,
veifichiamo lo stato del pin RA2 (interruttore ax
SW3). Se I'interruttore è a '1' andiamo alla
gs EICL0: btfss P0BTÉ,2
routine ACCENDERE mediante la quale slt goto SPEEHEEE
invieremo un segnale '1' al piedino RB). Se 35 goto fiICEHDEFE
l'ìnterruttore è a '0' spegneremo il diodo LED ÍrÉ
mediante Ia routine SPEGNERE. SF ÈCCEHDEFE: bsf P0FTB, B
Questo ciclo è infinito, e viene eseguito s8 goto EICL0
in modo continuativo. $s
4F SPEGHEHE: bcf F0BTB, B
tll gotri G I EL0
+2
llg EHD ;FinP del programma
+tr

Dopo aver scritto e compilato il programma,


procederemo alla memorizzazione del file .hex
che e sfato generato, nella memoria Flash del
microcontroller. Dopo aver scritto e verificato
il PlC, procederemo a collegare
la scheda di controllo attraverso il connettore
PicBus, come ci mostra l'immaqine.

=
Per provare I'esecuzione del programma,
dobbiamo togliere tutti i jumper della scheda
di ingressi e uscite eccetto JMPI . Questo
è quello che abilita i diodi LED, dei quali
stiamo utilizzando D1. A seconda di come
cambieremo la posizione dell' interruttore
SW3 faremo accendere o spegnere il diodo.
Suggeriamo ai lettori di ripetere
I'esercizio, però provando l'effetto contrario,
cioè quando l'interruttore è su
ON il LED si dovrà spegnere, e quando
è su OFF si dovrà illuminare.

Goqslgli prcllici
:-.#
---é
,,é

&

ff
ff

fhontcggio passo q passo


PORTA A Questo esercizio ci permetterà di lavorare con segnali
multipli di rngresso e uscita, utilizzando maschere
per selezionare insiemi di bit e verificarne il loro
valore. Questo programma utilizza i cinque intenuttori
della scheda di ingressi e uscite, e gli otto diodi LED.
{*, l'* All'iilzio del programma i diodi rimangono spenti,

/'r I' /v {' fr fino a che viene introdotta Ia combinazione 1-0-1-0-1


mediante gli interruttori da SWI a SW5. ln quel
momento la barra dei LED si illumina. Per spegnerla
PORTA B e tornare ad eseguire il programma, schiacceremo
il pulsante di Reset della scheda di controllo.

D8 D7 lDó lD5 lD4 lD3 lD2 lor


t- I-- .I--.Y--.Y---V-- -Vr-

Nell'intestazione del programma, è buona norma


descrivere brevemente, a modo di commento
(anteponendo il ;), il compito del medesimo. ln seguito
selezioneremo il PlC16FB4, e creeremo le
etichette da quelle dei registri che utilizzeremo
nel programma. L'inizio del programma
è all'indirizzo 0 e saltiamo il Vector 4 di interrupt.

All'inizio del programma configureremo i registrt


che dovremo utilizzare. Passiamo al banco 1
e in esso configuriamo le porte. La porta A
funziona come ingresso, la porta B come uscita.
Una volta realizzate le configurazioni torniamo
al banco 0, poniamo a zero il valore della pofta B,
per far sì che all'inizio dell'esecuzione
del programma i diodi LED siano spenti.
Ciclo principale de! programma.
ln esso leggeremo il valore degli interruttori (Porta A)
F*';Ciclo che attende la combinazione 1-B-1-B-1. + e realizzeremo una prima maschera AND,
32 per rimanere solo con i cinque
33 CICL0: mouf P0HTA, H meno significativi che vogliamo verificare.
Str andlr,r b ' 8061 1 111 '
35 xorlur b' 0661 01 81 ' La funzione logica XOR verifica che la combinazione
3ó btfss STATUS, 2 introdotta sia valida. Se il risultato delle XOR
JZ goto cIcL0 pone il bit Z del registro di stato a 1 sÌgnifica che gli
s8 i nterruttori stanno introducenoo n
39 moultt Bxff combinazione l -0-1 -0-1 e, pertdnto, procederemo
40 nou+rrf P0ffTB
ad accendere la barra dei LED.
41
FIHE: goto FIHE In caso contrario, rimarremo all'interno del
49 ..,:

4S ciclo principale del programma.


44 ;Premere iI Beset
+5 iper tornare ad eseguire i1 progranma
46
&7 EHD ;Fine del progremne
4S
;***+*****+t***************+******************:*F
__n rOi

Quesfe sono le connessioni che dobbiamo


roali zzara nar n^tar fsra at ta<ta a<areizio
Dobbiamo alimentare la scheda di controllo
e collegarla alla porta parallela per la scrittura
del file hex (ottenuto dopo la compilazione)
nella memoria Flash del PlC. Ricordiamo che
per poter scrivere, il commutatore di scrittura
deve essere nella posiziane PROG. lnfine,
dobbiamo collegare le schede di controllo e di
ingresso e usclta tramite il connettore PicBus.

A fianco è mostrato il programma in


esecuzione, con la barra dei LED illuminata
a conseguenza dell'introduzione della
combinazione corretta: 1-0-l -0-1 .

Per fare in modo che si accendano i LED,


il jumper JMPI deve essere montato,
i jumpers JMP2 e lMP3 devono essere
estratti e il commutatore di scrittura
nella posizione RUIV. Questo programma,
inoltre, ci servirà per verificare
se abbiamo saldato bene tutti i diodi LED
della scheda di ingressi e uscite.

Gonsiqli rtrcrlicr
Monlcrqnio ncrsso at lrctsso
PL 44

re
wts{t|!!!]w

#ffiri'iililljiwwswweffi#

èe :- Se-*
. *J,,1* -., qla* *-
#€
-{f

"4

#-.\
\ q"ffiq
c, 1"* ..\
Con questo esercizio vogliamo introdurre Ia gestione
PORTA A di un display a sette segmenti. Un display, non
è altro che un insieme di diodi LED distribuiti in modo
da imitare Ia forma dei numeri decimali.
Rappresentiamo sopra il dÌsplay della scheda di ingressi
5W3
ó e uscite il valore dell'interruttore SW3.
I
x Quando questo interruttore è a '0', sul display
si vedrà il numero zero,
PORIA B e quando è a '1' verrà mostrato un uno nel display.

a?rograffi rhe util-izza il. lisplay a 7 =q*nti


lntestazione del programma, dove si realizza ;;per indicare iI ualrre d€lf intsrruttors Slf:t-
una breve descrizione sotto forma di "commento".
Dobbiamo scegliere il modello di microcontroller
líst F=lúF3+ ;riso di dilpusiÉuo
che useremo ed etichettare i registri che saranno ;frFa dells stic'|ettf
impiegati durante lo sviluppo del programma. f{U È.C} :*eaistro di stato
lnfine collocheremo l'inizio del programma nella t{U fr(ú ;Pcrta f
posizione 0, però salteremo il vector di interrupt 4
E0U stfú ;fúrta 3
f{lt ÈrÉ5
prima di introdurre la prima istruzione.
!*É É ;llector fesst
{sts IIIIZIO
rffc 5 ;5a1t1aH 11 U€rtof {l
;intsrrupt

Dobbiamo configurare le porte A e B. Per questo


auntiamo il banco 1 e aoniamo a'f il bit RP) del
Registro di stato. Una volta in questo banco
collocheremo un 'f in RA2 e tutti zero nella porta B
ln questo modo la porta B viene configurata come
uscifa e RA2 funziona come ingresso. Configurate le
porte, ritorniamo al banco 0
e poniamo a zero il bit RP) del Registro di stato.

Gonsigli pr.rtici
Questo è il ciclo principale del programma,
il quale viene eseguito rn maniera continuativa.
ln esso testiamo il valore dell'interruttore SW3,
mediante Ia lettura del pin RA2. Se è a zero,
andiamo alla routine con la quale mandiamo
altraverso la porta B il codice a setre segmentl
corrispondente allo zero, in modo che sia mostrato
nel display. Se l'interruttore è a '1', saltiamo
alla routine UNO con la quale mandiamo al display il
codice corrispondente al numero '1 '.

Una volta scritto e compilato il programma,


t
procederemo a memortzzarlo nel
microcontroller. Per fare questo collegheremo
la scheda di controllo al PC
mediante la porta LPT| e ci assicureremo che
I' i nterruttore di memorizzazione sia
in PROG. Dobbiamo collegare la scheda
di controllo e quella degli ingressi
e uscife mediante il PicBus, per verificare
l' esecuzion e de I prog ra m m a.

Qui si vede il display che sta visualizzando


uno '0', il cui valore corrisponde
a quello presente sull'interruttore SW3.
Per gestire il display
è necessario chiudere il jumper JMP2
e aprire JMPI e lMP3, come si vede
nell'immagine. L'interruttore della scheda
di controllo, ora deve essere
collocato in RUN invece che in PRaG.

Consigli prctici
ftfionÈerq€gge
F€ F€-::*r € ÉgÉ{#
i
:1i

llll


lll
Ni

I
J

1
ln questo esercizio realizzeremo una temporizzazione.
ll programma che implementeremo
e proleremo sulla scheda di ingressi e uscite, fara
PORTA A
lampeggiare il diodo LED Dl accendendolo e
spegnendolo ogni secondo. Nell'immagine è indicato
lo schema dei collegamenti necessari per poter
provare questo prog ramma.

PORTA B

1 ;PrograFa che accendÈ e spegne il lliodu Dl


3 ;ogni serondo-
+
f list p=16F8t ;Tipo rli dispositiuo
Come già sappiamo all'inrzio del programma ú
dobbiamo definire il tipo di microcontroller che I ;firea dÈllÈ etichette
vogliamo utilizzare. lnoltre possiamo dare un nome e ,S.SrÈrUS EtU ÈrHt ;BÈgistro di stato
+. POBT* EqU frrE ;Porta A
registri del PIC che utilizzeremo nel corso del
t-g PIIRTB EQll S{S ;Fúrta B
programma. Oltre ai registri interni del PlC, in questo *1 ftPE EQU &.S
programma utilizzeremo anche un registro di uso t2 0PTIOH_BE8 EqU &tfl ;TixrE * llption
generale, che posizioneremo al primo indirizzo libero, l* IlftcllH EQU &.Cb
che corrisponde allo 0x0C.
fÈ TElf0l EQU È.Ec ;$egistro di utilizzs
î5 ;gÈneraIÈ
l*
l? 0rs e ;Uector Reset
:*
t+ gùto IHIZIù
g0 OFG 5 ;Saltiaro il uector di
21 ;interupt - ':

td
.IÍ 0RG g ;Uector Reset
t*
t? goto IHIZI0
g! ORE 5 ;Saltiam il uector di
ei ; interrupt. All'inizio del programma passeremo al banco 1

5i per realizzare le configurazioni. Imposteremo la Porta B


cs ;InizÍo dÈl Frograxa come uscita, e assegneremo il prescaler al Timer),
t* con valore 256. Questo farà sì che il Timer) si
u5 IHIZIII: bsf STÈTUS, RPO incrementi ogni 256 cicli macchina, e ci faciliterà
Íú clrf P0BTB
i calcoli, dato che dobbiamo realizzare
c} roulf b'CttÈFllt'
t* muirf llPTI0H_REG una temporizzazione cosi lunga, qual è quella di 1
Ín bcf ST*TÙS, EPÉ secondo (bisogna ricordare che il PIC impiega 1
*a clrf P0RTB microsecondo ad eseguire un'istruzione). Dopo aver
configurato questi registri, torneremo al banco 0.

Consiqli prcrticr
Questo è il ciclo principale del programma, dal quale
eseguiamo la chiamata alla routine di configurazione
st ll procedimento è il seguente: si accende il diodo,
sg si temporizza un secondo, si spegne
ss ;Ciclo principale- Si accende e si spegne il diodo, si temporizza un secondo
$* ;il led temporiaaando un spcondo fra e il ciclo ricomincìa. Questo programma, quindi,
g5 ;entrambe Ie aeioni rimane in esecuzione in modo permanente.
-$*
sr CI[10: bsf P0BTB, B
$$ call DELRT1S
s$ bcf P0RTB, B
4E CAIT DELRV1S
e1 goto CICLB
[3

t4:;Routine di ritardo di 1 secondo


t5
*É DELET1S bcf STRTUS, RP9
Quesfa e la routine di temporizzazione
*T noulu Bxú{
di 1 secondo. Prima si carica il registro TEMPOI con . ,S, Rouìrf TElF0l
il valore decimale 100, dopo si chiama un'altra ** call DEL18
routine che esegue una temporizzazione di 10 ms, rÈturn
un numero di volte pari al valore della variabile
TEMPO| . ln questo modo otteniamo una 5T DEL1B bcf IHTCoN, ?
temporizzazione di 1 secondo. La routine DEL10 5g mul$ Br{08

esegue con il Timer) la seguente temporizzazione: 5{ rEIirf |lPTIIIN_REE


T = 4* 0.25us * 39*256 = s5
0.009984 secondi = 10 ms (circa) 56 DELIS_I btfss IllTc0lt, 2
5I goto DEtl 0_1
ss decfsz TEI'1P01 , 1
59'- goto DELl 8
ùs return
ùî
úÈ EHD ;Fine del progranna

Programma in esecuzione sulla scheda di ingressi e


uscite, che è collegata alla scheda di controllo
mediante il PicBus.
ll jumper lMPl deve essere chiuso, mentre il resto
dei jumpers deve essere aperto. Proponiamo al
lettore di cercare di ottenere /a sfessa
temporizzazione di 1 secondo, ma con un prescaler
di 128 asseqnato al Timer).

Consiqli prcrticr
tI à
l ,rffi ,w.^ t**L*,
rr,*,,, -,,

i',,,F1,,t8

ffi
....,.,.:.,.:.:,:jj.î,4,ti,:1.,,,
\i

1
rltri

. €:s
Yq+
:

\P
-}F
ffi
,i#

é
'ff
',:ff

:ff

ffi&
:ff
.:ffi

,E
,.,#=

.:&

ffi

É
,a::=
-TÉ

:-é
:*:É
.--.=

,_=

G
-E
':&
=
a
-a.tè

-&

#

:&

"ffi
ff
ff

ff
N el l' esem p i o seg uen te rea I izzere m o un co ntato re.
'l ;******+*******t+***********************t*+ Utilizzeremo come ingresso I'interruttore SWI della
2 ;Progranna cúntatore scheda di ingressi e uscite, che corrisponde
3 al piedino RA) del PIC. ll valore contato verrà
4 list p='túFS4 ;Tipo di dispositiuo ripoftato sui diodi LED da Dl a DB in forma
5 di numero binario. Verranno contate le transizioni 0-1-0
ó ;Érea delle etichette che saranno inviate all'ingresso tramite
7 STRTUS EqU 0*63 ;Begistro di stato
I PoBTA EQU 6HB5 ;Porta R il commutatore. La prima cosa che faremo sarà
g P0RTB E{U B}r0ó ;Porta I nominare i registri che utilizzeremo
15, FPB Pqu 0x65 nel corso del programma, come abbiamo
'1f 0PTIoH_REG EQU 0nB1 ;Tiner0 e 0ption già visto anche altre volte.
12. IHTI0H EqU ox8g
l3 ;Begistro di utilízzo qenerale
14 C0HTfiT0BE EQll 6x00
{5
1f IRG B ;Uector Seset
1?
18 goto IHIZI0
-19 IIBE 5 ;Saltiama il uector di
Íg ;interrupt -

: :*l
tz ;Inizio del progranma
.Z:g
La configurazione del microcontroller richiede di elr IHIZIO: bsf STfiTUS, RPO
configurare il piedino RA) come ingresso, per poter ,25 noulw Elr 61
leggere il segnale dell'interruttore. La pofta B *É
'2e mouÍrf P0HTfi
sarà l'uscita per visualizzare il dato del contatore. clrf PORTB
Dobbiamo configurare un prescaler di 256 per :!E noulu, b' 08866111'
il Timer1, dato che sarà utìlizzato per evitare i rimbdzi
.t* ÍIOUU'f OPT I NH_REG
g& bcF STRTUS, RP0
g:l clrf PoRTB
I clrf IOHTRTOFE
s5

a+
*c ;Giclo principale. Si esegue la sonna in funzione
39 ;deg1i inpulsi introdotti datl'interruttore Sl,l1
36
3X GIBLI: btfss P0HTB, B
38 goto ÈICl-0
sc call RHTIRII4BALZ0
4,8
41 CI[L02: btfsc P0BTR, 6
* goto CICL02
43 call fiHTIRII'IBALZÍI
Questo e il ciclo principale del programma, il quale
44
&5 incf C0HTRTÍIRE, F
attende che dall'interrufÍore arrivi una transizione da
4ú mouf CI]HTfiTORE, t,J 0 a 1 e che torni in stato di riposo '0'.
tlî ÍrourrJf FI]FTB ln questo rtante si realizza la somma, incrementando
Ir8 la variabile contatore. Il risultato
&e qoto IIELo della somma viene visualizzato tramite la oofta B.

Gonsigli prcrtici
t*ffi'q '*
Dato che questo progrdmma utilizza periferìche
-ltrl)<J reali, dobbiama anche considerare gli effetti
5o :l intrincar ì Aì n' ta< t i \v,,iPv,,rlLr,
v, YuLJr, rnmnnnanti in nt tacf a r:<a
51
52 ;Routine per risoluere uia softrrrare il problena dobbiamo evitare i rimbalzi del commutatore.
53 ;dei rimbalzi degli interruttoFi. I'elfeLto rrmbalzo è uno stato lransitorio, che genera
54 ulld 5equellzd LdsUdte,-t^ A; -.
ut zefl e UnO
55 ÈHTIRIiIBfiLZO: .ha <; nr^.lt taè nt rsndn iln <an<óro dí finn marrsnirn
5ú bcf IHTCoN, 2
57 noulu BXBB cambia di stato. Per evitare i rimbalzi
58 mou$rf BPTI0H_REG reàliz/eremo una rcmportzzazione ogni volta úe
59 rileúamo un cambto di stato nell'tnterruttore.
óB DEL: btfss IHTG0H, 2
61 goto DEL I

62 return ---l
óa
64 EHD ;Fine del progranma
ó5 ; ***********************************x*****x****{
-l
tì I rf-

Nella foto si mostra il funzionamento del


programma sulla scheda di ingressi e uscite.
lntrodurremo gli impulsi attraverso il
commutatore SW|, e osserveremo il dato di
risposta sui diodi LED. A tal fine
dobbiamo tenere tl jumper .lMPl chiuso
e it rosto dci inmner< anerfi.

ln questa tmmagtne possamo osservare


i collegamenti fra la scheda di controllo e
quella dt ingressi e ,lscite Dopo aver
compilata il programma procederemo alla
sua scrittura sul microcontroller, tramite la
scheda di controllo, nel modo che già
(onoscièmo. Vi consigliamo di ripetere
l'esercizio, pero annullando
la chiamata alla routine ANTIRIMBALZO,
e osservare sulla scheda di ingressi
e uscite il funzionamento del programma
appena modificato.

w,7*1)1:rlssi|]!]!w,
Monlcrqqio pcrsso cr trcrsso
Pt 50
qlsf $$$]NtN
Èr4ill$slf riFiiliwi

'1i{&. "'é^ i'r@.'

{. ,,1
s $:::.-;

ry1 ea-aÉ

€\
,.'.*J

#ts*;stf?7trÍ
!t f n&
e d F rF * 's ' ' .
.; sg
t
"--é
u ,f q.
frllr,,-lè *
-.
R:

ffi
-t +^'1 14*-lqrg
fl ft
:,1:

tr.-',.'j

r*\ r :ls
À .,{
jll
\t--j
q

#,. , ,;l
lmpareremo ad utilizzare I'altoparlante della scheda
di ingressi e uscite, a questo
scopo realizzeremo un programma, I'esempio 6,
con possibilità di attivarlo e disattivarlo
in modo periodico. L'altoparlante è collegato
al piedino RBTdel microcontroller PlC.
Per attivarlo dobbiama chtudere
il jumper )MP3, e collegarlo alla morsettiera,
facendo attenzione alla polarità.

. 1,. ;*É*********il**t****************i****************
' :4. ;ffograÍ*it tontatore
:g'
,è.' list p=1ófs4 ;Tips dl dispositivo
:5,
lntestazione del programma. Come sempre, ó ;nrea delle etichette
sceglieremo per pilma cosa il modello ? Slaus €QU Bx03 ;Registre di stats
:,:,*': PUIT* tQl' 6xB5 ;Porta R
di microcontroller e daremo un'etichetta ai registri ::::9::P0*Tf,$ €qU gXgé ;Porta S
che intendiamo uttlizzare durante il programma i*,3P8 f{U 9x0s
lnfine collocheremo i vettori 0 e 5 1t':$FtI0t'LnE{ ÉQU gXú1 ;f inerÚ e l}ptien
t2: Il{TG0lt EQU BXQF
per posizionare la prima istruzione 13 ;R€gistri di utilizzo generale
del programma, e per saltare il vector di interrupt. lq IEHP01 EqU SXS$I
t5:
i*: 03fi S ;Uectúr Re5Èt
i?:.
1€ qoto ltlIZIo
19 éne 5 ;sàltiaRs i1 uecter di
tS ;interrupt.

27
22 ;Inizio rlel Pr8grarr$a
?g
24 lilIZIo: bsf sTfiTUS, RPo
25 noulu b'81111111'
Z,& Flou$f PoRTB
ZT noslu b'8S666111'
28 EÌosarf oPIIOH REG
29 bcf P0Fi8
g0 clrf P0RT8
91 ;ciclo principale. La configurazione è semplice. RB7, dove si trova
32
I' altoparla nte, deve essere u n' uscita ; i noltre
€S CIDLo: bsf P0nT8, 7
34 call DELrvlS assegneremo il prescaler al Timer), dato che
35 bcf P0RT8, 7 realizzeremo delle temporizzaùoni. ll ciclo principale
3é call DELaYls
del programma consiste nell'attivare e disattivare il
87 goto CICL0
3* segnale del piedino RB7, realizzando due
temporizzazioni diverse, una durante I'accensione e
I'altra durante lo speqnimento

Consigli prctici
ff

Queste sono le due routine di temporizzazione


: : ::&8.
impiegate. La prima di queste, DELAYIS Ia conosciamo già,
{i ;Routine di ritardo
42 e realizza una temporizzazione di 1 secondo.
4' DELEYIS bcf STNTUS, RPO
La routine DELAYMS temporizza mezzo secondo.
,lt nouls .1 00
45 no(|Hf TE+1P01 Le due routine si appoggiano alla routine DELAY|0, che
::: :4ó : eal'l !fl-'t 6
4? return temporizza 1 0 millisecondi. Nell'altoparlante
4$ si otterrà un suono simile a auello di una sveolia.
40 DrLavHS bcf SInIUS, RPO
SO mulu -5 0
91 nouuf TEHP0'|
':.1:.::IC, call DEL'IO
].'rr.':5$,'
:t:r:::5[ :
r*turn
55 DEL18 bcf IHrCoil,2
5ó oEuls &(DB
l::.: .,*i: rîout{f 0PT!0N-AEG
FT
59 DEL10-1 btfss INTCoN, 2
ú€ goto DEL'!0_1
ó1 dec6sz lE|lPO1 , 't
62 goto oElro
ól return
,. :.:$f :

I :,::ùF:.1 tllD :Flne del progrannà


: r*****a**È**tt***s*t{t*ts****t**ts******

Potremo regolare il timbro o il tono


dell'altoparlante muovendo con un cacciavite
il potenziometro Rl B. Questo fa si che il
generatore di onda quadra della scheda di
ingressi e uscife vari la frequenza
che si applica all'altoparlante. ln questo modo
possiamo scegliere il suono che piit ci piace.

Come già sappiamo fare, dopo aver


compilato il programma lo memorizzeremo
sul microcontroller, mediante la scheda di
controllo. Fate attenzione alla corretta
alimentazione della scheda, cosi come alla
posizione dell'interruttore di scrittura.
Durante la scrittura il connettore Picbus
deve essere collegato. Dopo aver
memorizzato il programma,
raccomandiamo di togliere il cavo DB25
dalla scheda di controllo.

G_qqs!g!!Jrcrtici
Pt 52
'.: t.4;

.,r.r{+s:n .,,iryîs1ti*:igf:$L
I
.:{d*.*i:r.f- ' - " --- " --:""'

,:*
: -:::::
:

: :ì .ìt .ì :::t! .. . t:: r't,t I . .

€r-
*;i
ffi-i
t*
!

:: :@àA@j;;ra,.
ln questo esempio impareremo a scrivere i dati nella
1 ll.st P*1óFAll ;Iipo di rrispositi$q memoila EEPROM interna del microcontroller. I dati
2
g ;firea €te1Le etLchette che vengono scritti in questa memoria non sono
{ SIúTUS ÉQU SXSS ;Reglstro di. stata volatili come quelli della memoria RAM, e rimangono
5 P0RTn €0U 0x09 ;Porta n inalterati anche quando togliamo l'alimentazione al
ó P{tBfB E0U 0x06 ;Forta I
? RPú ÈqU 0x05 PlC. Ouindi è una memoria ideale in cui scrivere chiavi
0 orrIúH_B€c EQU 0x01 ;Tiser0 É optlsn o dati che devono rimanere inalterati. All'inizio
I IltTÉ0N EQO S:{0b
t0 del programma definiamo come al solito il tipo di
EQt 88h ;Etichetta di. reglstrù dispositivo e /e etichette dei registri da impiegare.
ÉQU 89h ;per la EEPi0H
ÉQU 08lr
FQ0 0!h
€qu 5 ;EtÍchetta di bit
€Qr, 6
EqU 2
EQU J
FQU S

Z? ;FÈglrtrl di utiliazo general?


eS TEI'1P01 É8U SxS0

;U?ctor neset

;SaLtla$o il uector di
; InterrupÈ.

sg
ll programma scriverà all'rndirtzzo zero della memoria st ;tnizÍa del prcgramma
EEPROM il dato corrispondente al valore presente **
nella porta A, il quale sarà selezionato dagli sg IHIZT$ bsf STSTUS, RPS
n.!$le,
interruttori della scheda di ingressi e usclte. A questo
scopo configureremo ld porta A come ingresso,
s*
st I[o$$f
b' 80S111'11 '
F0*îA J
chiameremo la routine DATO, che raccoglie il dato *é Í!orr1$ b'SSSefi11 '
presente sulla porta A, e la routine sr nsusf 0PTI0|t*nE8
WRITE che lo scrive nella memoila EEPROM. s$ bcf STAIUS, RP&
s* cnll tr*T0
*$ call I*FITE
*f goto FIHE
:l-J'" >J,,,:

&5
4ó $ÉTO ficf ST*TtlS,RPS
4? nsvLr" b'0SOOS0SB'
43 rrr{nrsrf EESùR
4t nouf P$*Ìft, i'l
gs mnr.rwf E€SàT*
5t rct$|,n
FA
La routine DATO seleziona I'indirizzo di memoila
5S }rR I Tg bsf SI*TI S , RF B
5rl bsf EEC{l}ll , I{SEH EEPROM da scrivere, in questo caso I'indiilzzo zero, e

55 $s$111, 6x55 Iegge il dato della porta A, scrivendolo in EEDATA,


5ú ncvw$ EEC$!12 registro che deve contenere il valore che si vuole
5? nor.rllll Sx** immagazzinare nella memoria EEPROM. La routine
5* rflo.Jr'tf f Ec$H? WRITE realizza il processo necessario per scrivere
59 b5f EECflNl , lrn i dati nella memoria EEPROM, utilizzando i registri
És bcf STf,TlrS, RPB EECONl ed EECON2. 5i abilita il permesso di scilttura
sî *a11 DEL"I 6 WREN) in EECON2 si inserisce una
*2 rÉtrrrn sequenza stabilita da Microchip, infine si inizia il ciclo
&+
di scrittura, attivando WR.

Consigli prcrtici
Questa routine di temporizzazione è necessaria, dato
che il processo di scrittura di un dato
ú3
64 nella memoria EEPROM non e cosi immediato come
65 ;Rúutins di l"itardo succede per la memoria RAM, ma puo
ú6 impiegare sino a 10 ms per compiersi. Anche se per
ú? DELIB bcf IllTCBil,2
úf, moulu gx8g questo programma potremmo fare a meno
ó* I|lourrf OPTIBII_RE8 della temporizzazione, visto che scriviamo un solo
7B dato, dobbiamo abituarci a considerare
71 DELIS_1 btfss llll0ltx, 2
questa necessltà. Un altro modo di verificare se è
72 goto DÉL'l B_1
7S d€cfsz TEl,tP01 , 1 terminata Ia scrittura, consiste nel
fa goto DELIB testare il bit EEIF del registro EECONl, che viene
75 return messo a 1 alla fine di detto ciclo.
:6
77 EtJù ;Fine del pragrannà
7a

Terminato il programma, selezioneremo una


combinazione con gli interruttori della scheda
rli innrc<qi e trcrile P nremerema
il pulsante di reset del microcontroller. Dopo il
reset, il PIC esegue il programma
e scrive all'indirizzo zero della memoria
EEPROM il dato scritto con gli interruttori.

Per verificare di aver scritto bene il dato


nella memoria EEPROM, possiamo eseguire
il programma di scrittura e selezionare
I'opzione Modifica Dati. Nella nuova
videata che appare sceglieremo Leggi PlC.
Sul video apparirà all'indirizzo
zero, il valore del dato memorizzato.

Gonsigli prctici
ffit
MontcrggiPJ.g*fig*gJ?gs.*-o*
PT. 54
:r.\trr-2:...ryw

,4Í

: ,,,,,.1

I'

:,#:.

,*'.
.&:.
Abbiamo già visto come scrivere i dati nella memoria
:: ; **************+++*************tt***+*************
EEPROM e verificare di averli scritti correttamente
Z;Progranna contatorP tramite il software di scrittura. Nell'esempio B, che ora
3 vi proponiamo, impareremo a leggere i dati dalla
È list p=tOrS+ ;Tipo fli dispositiuo
5 memoria EEPROM per utilizzarli nel nostro
6 ;firea delle etichette programma. La prima cosa che dobbiamo fare nel
7 STfiTUS E0U 0r.03 ;Begistro di stat0 programma è, come al solito, scegliere il dispositivo e
I PoRTfi EQU gxgs ;Porta fi posizionare le etichette pertinenti.
9 PORTB EqU 8*86 ;Porta B
1E BPE EQU 0Hg5
11 oPTI0H_FEG EqU 0x01 ;Tirner0 e Option
12 IHTC0tl EQU BxúB
t3
14 EECoH1 EqU 88h ;Etichetta di registro
15 EEDRTfi EQU 98h
1ó EERDR EqU 69h

18 BPo EoU s ;Etichetta dÍ bit


19 RD EQU O
?0
21 ;Registri di utilizzo generate
EQU sxED
,..,t.'.t.**ì,ttttot
ORG O ;Uector Beset
goto IHIZI0
ORG 5 ;saltiamo il uector
;di interrupt.

ll programma inizia all'indirizzo 5. Leggeremo il dato


che abbìamo scritto all'indirizzo 0 della memoria
EEPROM (con il programma del precedente esempio
7) e lo visualizzeremo sulla fila dei LED.
Per poter fare questo, configuriamo la porta B come
uscita, chiamiamo la routine
READ, e posizioniamo il dato letto sulla porta B.

Come si può vedere, la routine per leggere la


memoila EEPROM dei dati è molto più semplice di
quella utilizzata per scrivere. A differenza
della scrittura, la lettura dei dati non comporta una
significativa perdita di tempo, inoltre possiamo
Ieggere tanti dati di seguito quanti vogliamo.
Carichiamo nel registro EEADR I'indirizzo desiderato,
tramite il registro EECON| attiviamo il ciclo
di lettura (RD e, finalmente, nel registro EEDATA
abbiamo a disposizione il dato letto.

Gonsigli prcrliri
Dopo aver compilato il programma procederemo alla
sua scrittura nel microcontroller. Prima
di eseguire la scrittura cancelleremo la memoria di
programma, come facciamo sempre.
Cancellare Ia memoila di programma del PIC non
significa cancellare la memoria dei dati
del medesimo, per questo i dati che sono memoizzati
nella EEPROM rimangono
inalterati anche dopo la cancellazione del PIC.

Per vedere il risultato sui LED, dobbiamo


chiudere il jumper JMP1 della scheda di
ingressi e uscite, e lasciare gli altri jumpers
aperti. il dato che possiamo osservare
nell'imrpagine corrisponde fedelmente al dato
scritto tramite la porta A,
con il programma precedente.

La fotografia ci mostra i collegamenti


necessari per provare il programma.
È necessario alimentare il sistema attraverso Ia
scheda di controllo, programmare il PIC, e
una volta scritto collegare, tramite il Picbus, Ia
scheda di ingressi e uscite. Raccomandiamo
di scollegare il connettore DB25
dopo aver programmato il microcontroller.

Consigli prqtici
PL 5ú
{;:::;

a-&

:L 'r
:A
:A
'l'..=r

'o.èo.
fl*
4.
l-i.
('j.
L',r

x€ pfisso cl
lmpareremo a includere i file nel nostro programma
sorgente. Uno dei file piit utili che dobbiamo
includere, e che utilizzeremo sempre a partire da
questo momento, è quello che
contiene tutte le definizioni dei registri interni del
microcontroller. Questi file si trovano
nella cartella dove abbiamo installato MPLAB.

Utilizzeremo il file Pl6FB4A.lNC, che è quello che


possiede la definizione dei registri del nostro
microcontroller. Dobbiamo copiare questo file nella
stessa directory in cui si trovano i programmi
sorgente, in cui vogliamo includere questo file.

E0u if ' g[aD ,

EOU fl' trfiù I ,

----- RÉltistÉr'FaIes

E0u H'tlotÚ'
EqU H'tro01'
E0u H'[OO?'
EOU H! OOrt3'
E0u H' rlBt:r4 '
E0u il | [aas I

E[U II'ÚDtr6 '


EOU HI EDÚE'
E0u H'0rl[9,
EOU H'úOttÀ'
EOU I1' |]ùtrE '

::OPTItr{ REG ESU E'0ù81' Se apriamo e editiamo il file Pl 6FB4A.1NC, possiamo


':TRIs.L E0u E,O[fis I verificare quali sono ì nomi che sono stati assegnati
. TBTqE Equ E, OrtB 6 , ad ognuno dei registri del microcontroller. Sono gli
: EECON1 EOU II' llrtE8 ,
stessi nomi che abbiamo utilizzato sino ad ora, e che
: EECONz E0u fi'0ù89' utilizza ufficialmente Microchip sulla documentazione
tecnica, per denominare i registri.
Oltre ai registri, in questo file si trovano anche tutti i
bit di quei registri che hanno qualche significato
speciale. Dobbiamo familiarizzare con questÌ nomi,
dato che saranno molto piit semplici da ricordare
rispetto alla loro posizioni ìnterne in ogni registro.

':.1
, .t LIST p=16F84 ;Iipo rli dispositiuo
Per includere il file di dichiarazione dei registri
6FB4A.lNC, scriveremo nell' intestazione del
:1$,
P1
t include "P16F84-I}E" ;Definizione dei registri
programma: "include Pl 6FB4A.lNC". 5
ln seguito potremo dichiarare i nomi che 6 ;Definizione dei registri di carattere generale
vogliamo ai nostri registri di lavoro, .: ?,
I fiUX EQU 0xBc
che si trovano a partire dall'indirizzo 0x0c. I C0HTAT0RE EqU 0x8d
:t*::DfiT0 EQU B*0e

1Í ffi
'14 ilrlefínE Pin-uscita PoflTB,g
15 tdefine Pin ingresso PoRTfi,l

17
fF OBG Ú

t? goto IHIZIo
zs re
2f 0RG 5 Oltre ai byte e ai bit, possiamo nominare
22 anche i piedini reali delle porte. Come
2x IHIZIo: bsf sTf,TUS, RPE
possiamo vedere nominiamo RB) come
24 bÉf Pin uscita
25 bsf Pin ingresso Pin_uscita e RAl come Pin_ingresso, usando
:É bcf sTfiTUS, BPB I'istruzione "define". Ora nel nostro
27 programma faremo riferimento a questi
28 CICLI goto GIGLo nomi, senza /a necessità di ricordare in che
ztl
38 piedino si trovavano. ll presente esempio non
3f Els) ;Fine de1 prograrEHl è un programma utile, ma solo una
dimostrazione di utilizzo delle definizioni.

Consiqli prntici
ìì,
ltl

::.

ia:

.\\-
tt!
.l i .-
{t1 ;' ,.. --r,.-
Questo e il collegamento che realizzeremo
fra il sensore ottico CNY70 e la morsettiera di ingresso
della scheda di potenza. Come
possiamo osservare, realizzando le saldature dei cavi
collegheremo insieme i due
piedini indicati nella figura e li collegheremo a 5 V.

Sensore n

crRcurTo TrPrco
+Vcc

Circuito di interfaccia per il segnale del sensore, che si


trova sulla scheda di potenza. E composto
da due resisLenze, una per il fotodiodo e I'altra per
il fototransisLor. Quando il raggio *t*
di luce che emette i/ fotodiodo colpisce la base del
fototransistor, l'uscita del sensore produce
uno 0, in caso contrario un 1. Questo è dovuto alla
porta invertente 40106 7 Seonqle
che si trova alla fine del circuito, e permette di RI R2 4Ol Oó di ingresso
ottenere un buon segnale a livello TTL. 220 47k per il PIC
;

!
f
--*-*.,*"*"*"**t

KC
AE

KC
AE

ln questo cronogramma possiamo vedere il risultato


dell'uscita dei due sensori CNY70 al passaggio
su di un insieme di strisce nere e bianche. Dobbiamo
familiarizzare con il funzionamento di questi
sensori, perché saranno quelli che controlleranno la
direzione del robot durante il suo movimento.
I sensori CNY70 possono anche essere utilizzati per
il controllo della velocità del robot, oltre
che per la sua direzione. Per fare questo possiamo
montare un encoder associato ad una
delle due ruote. Con un encoder dotato di strisce
bianche e nere, si può misurare il tempo che
impiega la ruota a compiere un giro, in questo modo
si può calcolare la velocità di movimento del robot.

Schema interno del finecorsa o sensore


a contatto. A seconda se si trova in stato di
riposo oppure alfivo, chiude uno
dei suoi estremi rispetto al piedino centrale.
ll finecorsa serve per rilevare gli ostacoli.
Possiamo incollare, come supplemento, una
prolunga sulla levetta del finecorsa,
pet aumentare il suo campo d'azione.

Questo e il modo di collegare il finecorsa


alla scheda di potenza. Sui piedini destro e
centrale collegheremo massa e 5 V
in modo da ottenere sul piedino di sinistra
questi due livelli, a seconda che il sensore
sia attivo oppure no. lnoltre mediante
I'utilizzo di ultrasuoni, potremo rilevare
Sensore n la presenza di ostacoli senza la necessità di
dover entrare in collisione con essi.

Gonsigli preilici
PL óO
\\.\\!!1rlrrf rllll,liillirl:iillì%.ir6@

*Jru
@"

'ffi
#,€ #
il-****-- '"'-: "
Realizziamo un programma tn cui approfitteremo
delle risorse interne del microcontroller: il Watchdog
2 e il modo Sleep. Vogliamo realizzare un modo
,; LIsl p*'t6F*4 ;TtFo rll dliposlti$o
4 semplice per evitare i rimbalzi utiltzzando queste
$ iilútud€ *P16FgtA.lN6" ;D*finirlonf úrt rÈglstrX due risorse, invece di impiegare
*
f ;flsgistri di qtillaao gen€ralP i temporizzatori, come abbiamo fatto fino ad ora.
I Per prima cosa selezioniamo il dispositivo
:S f,01{lAr0EÉ €QU SxSc
ts e includiamo il file di definizione dei registri.

0RG$*
fS gots II{IZI0
ll programma consiste in un contatore che utilizza 0R8 s
la porta B per portare il risultato su due LED l9
lS lHtzto btf $1*fUS, RP6
della scheda di ingressi e uscite, e RA) come ingresso J
per i segnali da contare (sequenza 0-1-0). 19 clrf PoTRB
ln questo caso configuriamo rl registro OPTION 2E bsf PoBTR,o
con il quarto bit a '1' per assegnare t7 noul.t', b'$SS91111'
il prescaler al Watchdog invece che al Timer).
Èt Ítou$lf 0f lt0t{-SEG
?S bcf $leTirs' FPS
?*
È6.' ; ****************ti******t*s*****i*******f Lf***r

27
ti CIcL0 btfss FllRlf, 0
** goto 0lct0
Aú 51e€P
{t
**,[I[Lll2 ùtfsc fGglg, S
$$ loto CISL$2
tlr slesp
t5
é incf eflHlnroRg, F
*? s6{f Cl}HTfit0Ag, $
** 6sù|'f PCRTS Ciclo principale del programma. Ogni volta che c'è
sf grto cleto un cambio di stato, mandiamo il microcontroller
*s in stato sleep. Quando il Watchdog andrà
:è1 , fl$ ;FlÍs del prsgritmtllil
* in overflow il microcontroller riparlira, continuando
{,4 ;ù*ffitrÈ**iÈ*fft*t****ff*tttt*fÈ*Éfrrar*****É**H*t! I'esecuzione del programma. A quel punto il segnale
di uscita dell'interruttore si sarà gia stabilizzato.

Gonsi
Ricordate di selezronare l'opzione 'Watchdog Si' al momento
di programmare il microcontrollet dato che questo programma lo
utilizza. ln questo modo scriveremo la parola di
configurazione del PlC, e il programma funzionerà correttamente.

L'attivazione del Watchdog non richiede


alcuna modifica per la scrittura
del PlC. Realrzzeremo questo processo
come sempre, collegando la scheda di controllo
al PC, con l'interruttore di scrittura nella
posizione PROG, e con i jumper della scheda
di ingressi e uscite scollegati, nel caso che
entrambe le schede siano unite dal cavo Picbus.

Questa e la scheda di ingressi e uscite con


il programma in funzione. Per fare in modo che
il dato in uscita si possa vedere sulla
barra dei LED, è necessario chiudere il jumper lMPl
della scheda di ingressi e uscite. Ogni volta
che introdurremo una combinazione 0-1-0 tramite
l'interruttore RA1,
si incrementerà il dato di uscita sui LED.
Monloggio pcsso .r pcrsso
€*-
'%

'Woj
"'qrry.

4?
q q\q"'
-,{h\ ."el
-"${fF:
Come avrete notato, tutti gli esercizi che abbiamo
realizzato con la scheda di ingressi e uscite,
sono validi per la gestione dei sensori e dei motori
della scheda di potenza. Dato che questa
scheda condiziona i segnali per i nostri programmi, non
c'è differenza ad inviare un 1 per accendere un LED, o
per attivare un motore, ed è /a sfessa cosa ricevere uno 0
da un interruttore o da un sensore.

Realizziamo un programma di simulazione ************************************************************ I


1 l:
di movimento del microrobot. Per fare questo 2
utilizzeremo gli interruttori SWl e SW2 per simulare t
4
segnali di ingresso dei due sensori a infrarossi CNY70 5 incLu.te "P1úF64A.IH0" ;Definizionp .lei registri
e i LED D1-D4 per simulare É

le uscite di controllo dei motori di trazione.


I ;Fegistri di utilizzo generale
:*
,s AU:{ , EqU 0X 0c

1A
1{ ORG E
,tu goto IHIZIn
1$ 0Ec 5
1tr
15 I HI Z I tl bsf STfiTUS , BP 0 Dopo aver scritto l'intestazione del programma,
{f clrf P0ETE configureremo la porta B come uscita,
1T noulril b' EB0EB011 ' e come ingressi i corrispondenti degli interruttort
1'* bcf STfiTUS, RPB SWI e SW2 della porta A.
{:€ Non utilizzeremo altri registri del microcontroller
(a parte Io STATUS) per questo programma.

Consigli prqtici. Sirnulerndo i movimenli


Ogni volta che leggeremo un dato dalla porta A, lo scriveremo
su una variabile ausiliaria. ln seguito realizzeremo delle maschere
zzJ mouf P0RTÉ, tf per conoscere quale sia il valore dei sensorilinterruttori di ingresso.
23 cIcL0:
Z4 andlu b'ú8098011' Osserviamo che la maschera AND serve
'I5 mouuf HUX solamente per leggere il dato, e per evidenziare i bit che
26 t{orlÌ, b'60000000' ci interessano. ln seguito realizzeremo delle operazioni XOR
E7 btfsc STRTUS, Z
E$ goto RUf,HTI e verificheremo il flag Z (zero) del registro STATUS,
' Cg Írouf fiUtl, t'l per eseguire o meno il salto, a seconda delle diverse combinazioni.
30 xorlt b'E0BEEBE1'
31 btfsc STfiTUS, Z
SZ goto DESTRfi
SS Ítouf RUN, ll
3lr *orlu b' 600086'1 0'
35 btfsc STRTUS, Z
3ú goto SIHISTRfi
37 mouf AUt(, tf
38 xorlu, b'BBEEB011'
,Sq btfsc STRTUS, Z
*$ gúto INDIETB0
llt goto UIGL0

moul$ b' É8608811 '


Dopo aver dxifrato il valore dei sensori, non dowemo far altro che moulrf POBTE
inviare I'ordine conispondente per Ia prta B veso
goto CIELO
i LED: qus'to quivale ad inviare ordini di controllo verso i motoi. ]ÎoUIì, b'[E0B11EB'
I LED Dl-D2 simulano le uxite di controllo di un motore, Ítouurf POBTE
e D3-M lè uscite di controllo rer l'altro motore. I motoi possono goto CI CLO
ginre in entrambi isensi, e la combinazbne
di questi dà origine ai diversi movimenti. Qusto programma, noulu b'0ú09ú118'
nouurf PORTB
benche semplice ci permetterà di controllare
goto CICLO
il veso'del movimento di MonA Da questo momento potremo
complicare l'algoitmo in funzione della nostra cratività. ftoul-ir b' 8060't 001 '
mouuJf PIJÉIB
goto CIELO

EHD ;Fine del progranna

Mostríamo il funzionamento di questo programma


sulla scheda di ingressi e usclte. E necessario chiudere
il jumper JMPI , per fare in modo che Ia barra
dei LED sl possa illuminare, e verificare se gli ordini
di uscita che stiamo inviando sono
corretti. Vi invitiamo ad eseguire /o stesso esercizio
utilizzando pero altri interruttori di ingresso,
e cambiando gli ordini di uscita della porta B.

Consiqli prcrtici. Simulcndo i rnovirnenti


pL {54
j.t:.....:,.,..4:.,,1'a.a'a/r.a t:. -trul-tt . ::t :.itr:1tt::::q

'11:'),\:r|
j2rrrr.,1/,,..,,rtta7..a,a%,trwir:.

"îr{>& '**' €-*'


it e't
"€'.,'Qe
'ttt, " .,t
.;,4
\..b
u'',',.,,.$ufugu,., ia"3


:ig*sr
':g--ffi*
ffiWEi
d:!n*i#a:
l:.s"
{&rÈ
1-
;'
Realizzeremo alcuni esercizi per risolvere dei problemi
1 l; Equazione : {È+E}-[ matematici. Per esempio un' equazione:
2 (A+B) - C. Questi valori saranno di B bit. ll risultato
s dell'equazione si mostrerà mediante
4 list P=1 6FB4A la porta B e si potrà vedere sulla barra dei LED della
5 IHCLUDE "F1úF8lrR - I FlE" scheda di ingressi e uscite.
6 Nell'immagine vediamo I'abituale definizione dei registri.
7 Dato fi equ ExBC
I Dato-B Pqu Bx ÚD
F Dato_C equ ÚX EE
:t3 Ei=ultato equ gil 6F
11
1?, org E$ EE
{x, gsto IHIZIO
14
l5 org 6x85

t?'IHIZI0 bsf sTfiTUS, BPB
rt clrf PfIFTE
f9 bcf sTfiTUS, EPE
Tg

28
, ?1:
*? trtfrulÍ, . ú
,** mouuf Uato_fi
,84 moulru -25
, ?5' nour'rf Dats_B
ll programma configura la porta B come usclta e in seguito .Iú, rmulw .18
carica i dati con i quali si andra ad operare in tre eî nosurf Dato_E
registri di utilizzo generale: (6+25)-10. ln seguito eseguiamo
g8' mouf nato_R,l{
I e is Lr uz i on i a ri Lm e Li che necessarle
s$ adduf Dato_B,ll
3S rrrourlrf Hisultato
ncr nffpnprp il rìq tltaln dpll'pat ta ,inna lnfinp ls ri<nn5[6 5i
5] nouf Dato_[,]l
mostra tramite la porta B. ,5e subluf Fisultato,F
EÉ nouf Risultato,ll
F* fl{rul|rf P0BTE
*s
*f Giclu gotrl Giclo
É7,
38,: EHD

Dopo aver scitto il programma, lo compileremo.


Successivamente scriveremo il codice esadecrmale
nella memoria del mtcrocontroller
utilizzando la scheda di controllo. Una volta scritto
il PIC eollcohcrcmo la seheda di controllo
rnn nt rclls rli ìnnrp<<i a , t<1j7g attraVefSO il CavO
Picbus. Dobbiamo chrudere il jumper lMPl
nar ttarlaro íl ricttltatn r'lall ant t;zinna <, rlls h>rrs
rlaì | Fl-t lAdí.)monfÒ

il dato di risposta si vedrà in numeri binari.

li prcrlici.
':-* Ccrlcoli
, -
merlerncrtici
Questo esercizio è stato semplice perche abbiamo
usato operandi da B bit, pero questi ci
1: permettono di lavorare solo con numeri fino al valore
t list P=1úF84fi di 255 come massimo. Le operazioni con
S IHCLUDE "P16FS4fi. IHC" numeri da 16 bit sono piit complesse, dato che non
Ir esiste un'istruzione diretta del compilatore che
5 Dato_F_L equ [x1 0 li possa realizzare. ln seguito esporremo come
6 Dato_R_H equ Sx1l sommare e sottrarre numeri da 16 bit. L'immagine
F Dato_E_L equ Sx12 mostra la c/assica defintzionc dei rcoi<lri ttltlit,ati
I Dato B H equ 0*13
P RiEuttato-l- equ Exlll
îS Bisultato_H ?qu Bx15
1t
lf org Bfi8B
lfl goto IHIEI0
1*
t5
.tÀ
org Sx05 t
rl I
-u-J !t

'tó
fI IHIZI0 mouf Dato_È_L,tl
18 add$f Dato_E_L,l'l
L'in9eme di istruzioni dell'immagine serve per ÍF mou$f Fisultato_L
sommare due registri da 16 bit. La pdrte segnata 2E nouf Dato_f,_H,l'l
con _L (low) in ogni operando rappresenta la ll btfsc STfiTUS,E
parte bassa di ogni registro da 16 bit. La parte alta è ,gS addltil 1
simbolizzata aggiungendo _H (high) ad ogni ,?* add$rf llato_E_H,l,f
registro. Come si puo vedere, anche il risultato della ?ri nouuf Risultato H
somma si memorizza su un reqistro da 16 bit. ,:'ÈF
,*r,stop nop
,,gI
:3S,
nop

: ',!8,, end

IHIZIO lrfluf Dats_E_L,lt


subrilf llato_fi*L,tl
nout{f Risultato_L
mtruf Ilato_B_H ,l,f
btfss STfiTUS , I
addllu 1
sub$f 0atu_fi_H ,l,l L'insieme di istruzioni in figura, serve per sottrarre
mouruf Hisultato_H due numeri da 16 bit
Conviene scrivere e provdre queste routines, che
nup memorizzeremo nei nostri file, dato
che potrebbero essere utili in qualsiasi momento,
nop durante la realizzazione di algoitmi
di controllo con il robot, in cui sia necessario
end maneggiare registri da 16 bit. Sarà sufficiente aprire
le nostre routines matematiche,
già provate, ed includerle nel nostro programma.

li lÈ]ffittiltìttì:r$r\a
Ccrlcoli mnlemcrtici
Pt óó

Montcrggio pcsso cr pcrsso


lY!$!kgg i :',p,.::t *-e
e', ps:so
Terminato il montaggio della scheda di potenza,
passiamo alla spiegazione delle parti di
cui è composto tl suo circuito, in modo da imparare a
gestirla per realizzare eserczl
con i sensori e con i motori che utilizzeremo quando
programmeremo Monty.

I segnali che genera il microcontroller PIC sulle


sue uscite sono di livello TTL, cioe di 5 V. La capacita
di corrente di ogni piedino è di 20 nA.
Q2
Questo non è sufficiente per alimentare un motore, 8C548
pertanto non potremo collegailo direttamente.
Sulla scheda di potenza abbiamo implementato un
circuito denominato ad H, che si basa sui Qro
transistor Darlington che corrispondono allo schema
riportato in figura. BDI35

Un transistor Darlington è formato dall'associazione


di due transistor, in modo che il guadagno di
entrambi si sommi e si otLenga una maggiore
capacità di carico rispetto a un solo transistor. Come
mostrato nell'immagine, nella nostra scheda la
configurazione Darlington è stata implementata con
una coaaia di transistor formata
da un transistor modello BC54B e un 8D135.

Gonsigli prqtici
Questo e lo schema corrispondente al ponte ad H
che si utilizza per il controllo di un motore. Due
segnali del microcontrolloer pilotano le basi di Q3 e
di Q5. Se si attiva la base di Q3 ma non quella di
Q5, si attivano i Darlington formati da Q3-Ql 1 e da
Q4-Q12. il motore gira in un verso. Attivando la
base di Q5 ma non quella di Q3, si attivano i
Darlington formati da Q5-Q13 e da Q2-Q10. il
motore gira nel verso contrarto. Se si attivano o
disattivano simultaneamente le basi di Q3 e di Q5, il
motore si fermera. ll motore sara collegato
ai due emettitoil di Ql0 e Ql2. ll ponte ad H si
alimenta con la tensione che si applica
al motore, e che nel nostro caso arriverà da un :j€
alimentatore diverso
da quello utilizzato per alimentare l'elettronica.
.

Sulla scheda di potenza abbiamo


implementato due ponti ad H, ognuno per
controllare uno dei due moton che
compongono il sistema mobile di Monty. ln
questo modo possamo ottenere un controllo
totale sul movimento del robot, facendo
in modo che avanzr, si fermi, grri a sinistra o a
cle<f rA rl1<rrivpndn rt trvp OtU O menO
chiuse. Nell'immagine vediamo i 16 transistor
che formano enLrambi i ponti.

|À mnr\Fl lierà I I ? sara nt rclla che


utrlizzeremo come ingresso per la tensrone
di alimentazione dei motori. .11 1 e 112
serviranno per collegare questi motoil al
sstema mobile del robot. Come
si puo vedere, la morsettiera di ingresso
dell'alimentazione per i motori
ha due morsetti, dato che e necessario
-^lt^^--^ e dt
tvilcgot ^^-a^ l- t la>)o
tLt te to t^^.--
dell'alimentatione, perche questa deve
essere comune con la massa dell'elettronica
Tutte le masse di un srstema elettronico
debbono essere comuni, anche se arrivano
da a I i mentato rÌ d iversi.

ConsigIip1cri1i|\|''':''''|||:1||,j!Èl.|:*g}:................'..:::':|''':\1&9n@...'.|.N|
Montoggio, pc,s.so_ cr p.rsso
Faremo un esempio di automatismo
sequenziale, in cui diversi eventi devono susseguirsi uno
t dietro I'altro. L'enunciato è
* List F=1úFs4a il seguente: la sequenza inizia premendo "1" (RA)),
* include "P1úF84a.IHf," che attiva il cilindro "V" (RB)); quest'ultimo
li avanzando spinge il pezzo da tornire e aziona il sensore
5 orll sx E6 "b" (RA2) attivando il relè
É goto IHIZI0 del motore "M" (RB1). Inizra la tornitura. Durante
'î I'avanzamento si arriva sul sensore "c"
'8, orq 6x 65 (RA3) che disattiva il cilindro "V" (RB)) iniziando la
s retrocessione del medesimo.
:'{ IHIZI0 clrf PÍIHTB Passando nuovamente su "b" (RA2) si scollega "M" (RBl).
1'l bsf 5TfiTUS,HP6 Quando si arriva al fine corsa "a" (RAl )
+f clrf TfiISB si attiva un segnale acustico "A" (RB2) per fare in modo
ri.* noullr b ' EBE1 1111 ' che I'operaio ritiri il pezzo,
tft mouwf TBISR ne monti un altro nuovo e inizi un nuovo ciclo premendo
rs, bcf srfiTus,EPg "1" (RA)). L'immagine mostra
la sequenza di inizio, da dove si programmano le porte.

É._i EICI-0: clrt{dt


I sensori sono simulati dagli interruttori della scheda *s btfss POBTÈ,6
di ingressi e uscite. ll cilindro, il motore 1* goto I I f,Lll
e il segnale acustico si simulano mediante i LED. .*,8 bcf P0FTE,g
q{ bsf F0ETB, I
È molto importante fare bene
i programmi sequenziali, dato che molti dei compiti
z-"
che assegneremo a Monty saranno
Èttendi_b_1 clrurdt
di questo tipo. ll programma dell'immagine controlla

3fa btfs= P0ETfi,2
la sequenza in cui il cilindro si attiva e dvanza.
'*5 gato Attendi_b_1
fs bsf PIIHTB,'l
,g? fittendi_c clrwdt
3f btf55 POFTfi,3
Èf goto fittendi_c
f}S bcf P0BTB,B

B2 fittendi_b_2 clrudt
3S btfss P0ETA,z
3h goto Éttendi-b-Z
*5 bcf PllfiTE ,'l
3{
*? Attendi_a clr$dt
SA btf 55 PllETfi,1
39 goto Èttendi_a Questo e l'ultimo ciclo del programma, in cui il cilindro
4E bsf PflHTE,z si disattiva e inizia Ia sequenza di
41 goto CICLo retrocessione. Come si può vedere abbiamo seguito
,12 ordinatamente i compiti da
.AA end realizzare, controllando lo stato delle uscite e dividendo il
programmd in diversi cicli, in ognuno
:' dei quali si realizza una parte delle sequenze, e si attende
.t I
un evento per passare ad eseguire quella successiva.
!_1 I
i+

Compileremo il programma e Io scriveremo sul


microcontroller utilizzando Ia scheda di controllo,
come già sappiamo fare. Ricordiamo che
l'ìnterruttore di scrittura deve stare nella posizione
PROG e non RUN. Scollegate Ia scheda
di controllo dal Picbus prima di programmare il PIC
Dopo aver eseguito la programmazione
togliete il cavo di connessione al PC dalla scheda
di controllo, collegate il cavo Picbus
con Ia scheda di ingressi e uscite e infine chiudete
il jumper JMPI per fare in modo che i LED
possano essere attivati.

La prima cosa che dobbiamo fare è mettere


l'interrutîore RA) a'1'per iniziare Ia
sequenza e attivarc íl cilindro V come recita
l'enunciato. ln seguito attiveremo
I'interruttore RA2 per simulare che il cilindro
ha raggiunto il sensore b lungo
il suo percorso. Dopo si attiverà il motore,
segnale RBl.

Continueremo in questo modo per


verificare la sequenza del programma che
abbiamo implementato, e per vedere se
il funzionamento sul circuito corrisponde in
modo fedele a quanto programmato.
lnvitiamo i lettori a inventare prove e a
realizzare esercizi sequenziali, dato
che sono semplici, ed è molto importante
padroneggiarli, perche saranno la
base per costruire sequenze più complesse
per il funzionamento di Monty.

Gonsigli prolici. Aulorncrfismo sequenziqle


Monlqggio pcrsso cr pcrsso
Monleiggio pqsso cr pcrsso
L'esercizio di cui ci occupiamo è un po' piit complesso
di quelli precedenti. 5i tratta di implementare
un dado elettronico, e il suo enunciato è il seguente:
List P=1óf84 dobbiamo generare un numero
incl.ude"Plff84- If€"
casua/e fra 1 e 6. Quando RA) sarà a "1" sul display
5 llsmero egu gx$c a 7 segmenti collegato alla porta B si vedranno
* Selag*Sont equ gl.$d sequenzialmete i numeri da 1 a 6, con intervalli
7 TeilpàrarPs equ glr$È
di 0,05. Al momento del passaggio
s
* srg g:{$B di RA1 a "0" si vedrà, per 3 secondi, il numero
1S gate IniaLo casuale ottenuto. Dopo il display
"lt s"g $xS5 si spegne e la sequenza ricomincia. Nell'immagine
12 abbiamo la tabella della routine.
fg Essa converte il codice binario presente nei quattro
f4 Tabell"a: addtìrf Pf L,F
bit meno significativi del registro W
15 retlùr b'Sgt't111f '
fÉ retllr b' SBSú8"11S' nell'equivalente a 7 segmenti. ll codice per i 7
*r rÈtl*l b' 51 Sf 15't'l' segmenti viene scritto anch'esso in W.
IF ret1w *' $l Sglf l"t '
19 rstl$ b ' G1l SSt 'l S'
3S r*tl.u $'&ll S'lî 8l'
2a retlu b'C'llf1l&l'
e2
rl I

Delay_2)_ms: questa routine di temporrzzaztone ha


come obi ettivo I' el i m i naztone È* belalr*zú*ms: bcf ItlTCOll,TSf f
e5 rÉ{rr].iir 8xù't
dell' "effetto rimbalzo" delle periferiche za Frsrrsrf TtlR S
elettromeccaniche. Realizza un ritardo di 20 ms 27 De]-ag_zg_ris_f clrndt
Se il PIC lavora a una frequenza ?* btfss IHTS{'H,T6IF
di 4 MHz, il TMR) si incrementa ogni microsecondo
2* gtrts Oetag*i6*rrrs*1 )
3S rett'rn
Se vogliamo temporizzare 20.000 lLs (20 ns) 3f
con un prescaler da 256, il TMR) dovrà contare 78 32
eventi (78 * 256). ll valore 7B equivale 9*
a 0x4e hex, e dato che il TMR) è ascendente
a* DÉlàg_uàr: bcf It{Tg8}t,18IF
ss ncvlrrr Sx3c
dovremo cartcarlo con il suo complemento a 1 aú ErctJwf THfi5
()xbl hex). Dealy_var: routtne simrle a quella s? I'|tÉr$a11o clrr4dt
precedente. ll TMR0 realizza una temporizzazione s* btfss IIITG$il,T8IF
g* SotÉ Interuall's
di 50 ms che si ripete tante volte 4G dscfsz Dslàg_Éant,F
quante indica la variabile Delay Cont. Si ottengono 4t goto Delag*uar
temporizzazioni fra 50 ms e 12,6 sec. a2 rsturn *

4+ IÍizia e1rf Í!$RTA


*5 bsf ST&TUS,A"S
*É qlrf TfISS
* $rosl-r*
fitoitr.r-F
!'AAA-'l11f '
ÍAISA
+*
+s monl-sr f" 0SA€O111'
ÍÉ |tror,tslF *PîIg}{'-F€G
51 bef SÍATI|S,RP5
52
3S gicLo Élr*r{|t
54 btfss PAfiTA,A I
t9 goto cic16 '-J
56 rRn{rf TI{BA,$
s? aorr$}f Hu|nert
5..* càf.: O€.lay_e8*Gls Dopo la classica configurazione delle porte, si arriva
5A alla parte principale del programma che consiste
s3 nel rilevare l'azionamento di RA), evitando i rimbalzi
úî Disidi: rra$:,r* d 'ó'
62 sutr|Ú.F f{rrÉ€r|' , tt che si potrebbero produrre. Dopo questo, si legge
ús Fldu|Éf il valore attuale del TMR1, che rappresenterà la base
f* st'blrrr 'lum€rc
d '5 "
{s btfss STÈTUs,A del nostro numero casuale, e si divide per 6
** gota úf.ul-dí ottenendo un numero casuale compreso fra 1 e 6,
úÉ l-ocf ll|,$er*,F +
corrispondente alle 6 facce del dado.

Gonsigli prcrlici. Dcrdo elettronico


ffi
,

#
Questa sequenza di istruzioni ha come scopo di
visualizzare sul display i numeil da 1 a 6 a intervalli
8* di 0,05s per dare la sensazione di movimento del
6ît llad$; Énslr* rl'ó'
rg oe(,il$ Teryoraneo dado. Questo movimento si mantiene sino a quando
T' B*&_ì clrrdt RAj è a "1". Mettendo RA) a "0" si visualizza il
72 btfss POSTfi,S numero casuale catturato in precedenza dal TMRj.
?t goto llscità
Î* |mrrf îsryoràn€o,*f ffi
?5 cil.l T*bel.l.a
73 wrnrf PABTB
r? Foul,r, rl "t '
TA r&rr$f Del.ay_8orit
Îs call O*lay*uar -Jt
*c deefsz îerryoràl|eo,F
8:l goto Rà6*1
st gato Daúo
t*
s* càI"l Delag_2$_6s _?
h

$orf llunarartl
La routine uscita serve per scegliere call Taùrlla
un numero casuale e visualizzarlo sul display. ROUSf PÍIRTS
lnoltre carica il valore dei temporizzatori noul$ d'SS'
in modo che torni a eseguirsi il ciclo del mousf l)*leg_tmt
programma. Osservate che la
routine di temporizzazione chiamata durante
Éil1 Dclag_urr
il programma, ha una doppia clrf PBATB
funzione: generare i numeri casuali ed
eliminare i rimbalzi. goto ticla
Pnd

ffi

Per provare questo programma scriveremo


il PIC tramite la scheda di controllo, e in
seguito la collegheremo a quella di ingressi
e usclte. È necessario lasciare
aperti tutti i jumpers eccetto JMP2, dato
che utilizzeremo il display a 7 segmenti
per visualizzare il numero del dado.

eleltronico
PL 72

tai
ìa:.:
t'ffi?*T
@ ri___l ,#'
iffit #. .t
.t t-
1-

F# il
'f Ii
l'--f-
ró-tr .t
.1
I.
l.
U2
,.*È-Ì= e

#g**gg#g*nr-t-:*p****H#*g,*******,*,*,** ,i;,Nv,),**tNN,,...,.,,,1r,,,,,,v.,i.,...?,,a3t
Realizziamo ora un eserctzio con i diodi della porta B,
con cui otterremo un estetico movtmento; faremo una
r^fÀ7t^na <ant nall'arran<inno eli noni I Ff)
'pnzisla
collegato alla porh B Se RA) = 0, la rotazione sara
da destra a sinistra e viceversa. Ogni LED rimarrà
acceso A,25 secondi (250 ms). L'immagine mostra la
rli<nn<ìztnna rlai lFl-t <rtlls <rhods r'li innra<<i a tt<rifa

Come già sappiamo, prima di tutto selezioneremo il


tipo di dispositivo e rncluderemo il file con le
definizioni del registro. Nomineremo un registro di
utilizzo generale con il nome di contatore,
a partire dalla prima posizione libera, che è la 0x0c.
ll reset lo collocheremo nel vector 0
come sempre. e salteremo il vector di rnterrupl,
quindi il programma iniziera alla posizione 5

Quesfa e la routine di temporizzazione o Delay. che


utilizzeremo rn questo programma. Se il PIC lavora ad
una frequenza di 4 MHz, il TMR) cambia ogni
microsecondo. 5e si desidera temporizzare 25.000
microsecondi (25 ns) con un prescaler di 128, il TMR)
dovrà contare 1 95 eventi (1 95* 28 = 24 960).
1

ll valore 195 equivale a 0xc3 e, dato che il TMR) è


ascendenle dovremo caricare il suo complemenb
(0x3c). Questa temporiztazione si ripetera 10 volte
per ottenere il totale desiderato di 250 ms.

t**"js!-,*Rf s..tisk*F-grg#R;:k*-e-sg*e-m#kl-9.
All'inizio del programma confígureremo la porta B
EF ************************************** * come uscita per i LED e la porta A come ingresso.
Èa ;Iniulo dÉI programma Frincipat.e Assegneremo un prescaler di 128 al Timer), per fare
2* in modo che la nostra routine di temporizzazione
f,O I nlzis cl'rf P{'RTB
8"r: bsf STRTUS,RFO funzioni correttamente. Ora faremo ruotare
fr* c].rf TRISB I'accensione dei LED verso sinistra o verso destra,
3A moul.n b' 99011111' in funzione dello stato dell'interruttore in RA).
*|} nour4rf TH I SF Per realizzare le rotazioni useremo le istruzioni di
s5 moul"tf, b'86866118'
cÈ MOUrt'f OPT I OH-EEG rotazione di reqistro: rf e rlf.
87 bcf STf,TUS,RPE
E*
s* bsf STfiTUS,C
4E Giclo cal1 Eetag
41 htf sc PflBTfi, B
47, goto F_D€stra
43 É Sínistra Éff poFTg,F
*+ goto Gicl.o
tr5 fi-Destra rrF POFIB,F
ef got0 gicl.o
4r
4*

Dopo aver scritto e compilato il programma


procederemo alla sua memorizzazione mediante il
software del PC e la scheda di controllo.
Ricordate che dovete sempre disabilitare i jumper
della scheda l/O durante Ia memorizzazione,
nel caso in cui questa si trovi unita medíante il Pic Bus
alla scheda di controllo, e che bisogna
collocare l'interruttore di scrittura della scheda di
controllo in posizione PROG
e non in RUN. Una volta scritto il PIC sposteremo
nuovamente l'interruttore su RUN.

Per verificare il funzionamento di questo programma


dobbiamo montare il jumper JMPI che attiva i diodi
LED: il resto dei jumper devono essere aperrl.
Vedremo che modificando lo stato di RAj otterremo
che il "gioco di luci" ruota in un verso o nell'altro.
Proponiamo al |ettore di realizzare un esercizio simile
pero con la temporízzazione di 100
o 250 ms fra I'accensione di un LED e il successivo.
Queste temporizzazion i si selezionano
mediante SWI (RA)). Con I'interruttore RA2 si
controlla il verso dello spostamento.

Gonsigli protici. R.otszione sequenzicrle


\\\R\\\\\\\\\\rw:ii\\\\i\Nìì9ìt:-:\ì\\ìi\f\ì\\\\\\.:i...i\\\\\\i\\\\\\\\r\\i\\Nw1,:i:::rit\\ìì\\\.aii:wa<1s\\$)rKss\\\\\\\\ì$sxss\\\ìw:r
Monlcg-g!9*.F,-T*1,9.1,9*€**,
.r-{!,s,rnl'*ggle,tgti-o-*ngff g
Realizeremo ora un altro esercizio sequenziale,
questa volta si tratta di una macchina di riempimento.
Due relè, "M1" (RB)), e "M2" (RB1), pilotano
due motoil che muovono due nastri trasportatori.
"M1" (RB)) trasporta pezzi e "M2" (RBl ) contenitori.
Un sensore "DP" (RAl ) rileva il passaggio dei pezzi,
e un altro "DE" (RA2), il corretto posizionamento dei
contenitori. Ouando sono passati 1 0 pezzi
il contenitore si considera pieno, si attiva un segnale
acustico "A" (RB2) e il nastro che
trasporta gli imballaggi si sposta sino a presentare un
contenitore vuoto. ln questo momento si disattiva
il segnale acustico "A" (RB2) e avanza nuovamente
il nastro dei pezzi ripetendo così il ciclo. L'interruttore
"1" (RA)) attiva o disattiva il sistema. L'immagine
mostra la disposizione degli interruttori che simulano
i sensori, cosi come i LED che simulano i relè.

1-
A List g*lsF8l+t
* lnclude ;'P1úF8lla.IXf"
a
Selezioniamo il tipo di dispositivo, includiamo il file 5'to*t*_paz:i equ BxÉe
con la definizione dei registri, e nominiamo *
mediante un'etichetta il primo registro libero ? *rg $xg$
di utilizzo generale. Saltiamo il vector di interrupt, I goto MIZIB
e iniziamo lo sviluppo del programma. La pilma cosa I *rg Srúg
da fare sara configurare la porta B come uscita t$
e la porta A come ingresso per la rilevazione dei
11 rlllet$ clrf P0BI*
1e bsf Slftlgs,*f$
sensori. Per fare questo dobbiamo pdssare tg clr$ TEISS
al Banco 1 come abbiamo fafto in ilttfi oli csereizi 1* movlg, à'B$ClllJl'
1F nruírf TRIS*
a{ bcf sTàtlt$,fiP6
17Y

1f ;******{t***!È**********rt*r****{+******il.*r*** .
t*
*&'LaúF*g Élr* F{ttI3
*1 Lcsp r clÈr$t
S* Rruls {'18'
** &s$*rf *anta*pazai
** btfss P{t*1f,,6
CF gots loùp**

*f baf îll*T*, g
S* bsf l$*T*,1 Dopo aver scollegato le uscite, la prima cosa che
**
$S lt**uesa €trY{t faremo sarà inizializzare il numero di pezzi
et btfis f0*îÈr* che dobbiamo contare. Attenderemo che il sensore
AÈ gatù *.h_r,àso attivi il sistema mediante RAj (l), quindi metteremo
fi* in marcia il nastro trasportatore di contenitori,
Sà bsF *$nlB,g sino a che il sensore di rilevamento su RA2 non ne
SS bcf Plt*T8,1
indichi il corretto posizionamento. Quando
$ú, bÉs P$*I*,*
questo awerrà fermeremo il nastro trasportatore
dei contenitori e attiveremo il nastro dei pezzi.

Gonsigli prclici. Rotcrzione sequenzieile


Ora aspettiamo che passino i dieci pezzi, operazione
che realizzeremo con il sensore di posizionamento
*t PeEzB I c1r$t - in RAl . Dovremo rilevare sia l'ingresso dei pezzi
btfcs
stft
P$nî*,1 sia la loro uscita. Conteremo sino a 10, fermeremo
Sat$ f8zuo*S
c* il motore del nastro dei pezzi e attiveremo quello
45 Peeac*1 clrffit dei contenitori. lnoltre verificheremo che arrivi un
eó btfsc Pll*IS,1 nuovo contenitore sino al sensore di posizionamento,
*r gùt8 Pezzú_'l controllando che il contenitore precedente sia uscito.
cs d"sfse Sontà-lrÈaei,F
** gotà fÈea*_ff
tt bcf Fs*Ti,ú
FÌ bff POFI*,I
5g bsf PBET3,?
t$
E* Si*uasn cirdt
3t btSsc PB81g,2
F-ó gotc $i_*asc
s7
5*
$?
6*

Dopo aver scritto il programma procederemo


alla sua memorizzazione. Questo programma è stato
preparato per funzionare con il Watchdog attivato.
Potremo scriverlo, pertanto, attivando questa opzione
della parola di configurazione del PIC. Con il
Watchdog su ON ci assicureremo che se il programma
cade in un ciclo infinito, si reseftl automaticamente
per sbloccarsi. Osservate che per rendere possibile
questo, è stafo necessario introdurre le corrispondenti
istruzioni clrwdt lungo il programma.

Dopo aver programmato il PIC e collegato il Pic Bus


sulla scheda di llO e quella di controllo, chiuderemo il
jumper JMP| per poter vedere I'accensione dei LED.
Ora mediante gli interruttori simuleremo I'attivazione
e la disattivazione dei sensori. con cui potremo
provare il programma. Suggeriamo al lettore di fare
pratica introducendo nuovi sensori
e nastri trasportatori all'enunciato di questo esempio,
dato che è importante fare pratica
con programmi di tipo sequenziale, utili per la
successiva programmazione di Monty.

Consigli prcrlici. Rotcrzione sequenzicrle


,pEp6
f;t--...r..4.:.|
7:.arìr"fnrrr;ùj'ìi,r'ri::-

ffi
"lt):::,...qttuúhtbút ttt$ti||t /lr.rtntit tt t ii:1.:!!tl.r,t.,

{
! {vti
v i
---JE4!
1---:l! t

I ,!+t.
,t,ì':
'e' "eryi*
*#* T i.

t
I

&
-e"
"

irllonfaggio passo rr pÉrs$€


Descriveremo tutte le morsetttere di
cui è composta la scheda di potenza, per collegare ad
essa i sensori ottici e meccanici di cui
disponiamo, e realizzare esercizi con i sensori reali che
possiede il robot. Ricordate che a questa
scheda inoltre si collegheranno i motori che ricevono
il controllo e I'altmentazione
tramite i ponti ad H formati dai diversi transistor.

Le morsettiere J1, J2 e 15 hanno tre terminali e sono


predisposte per i! collegamento
dei sensori ottici. 5e le guardiamo di fronte, nel
terminale di sinistra di ognuna di esse abbiamo il +5V
in quello al centro l'tngresso per il fototransistor
(troviamo la resistenza da 47 K e il trigger 4016), e
nel terminale di destra I'ingresso per
il fotodiodo (resistenza da 220 Q collegata a massa).

ln questo modo per collegare


un sensore CNY70, collegheremo il cavo su cui
abbiamo unito i due terminali del
sensore sul morsetto di sinistra del +5 V. Inseriremo
il cavo del piedino che si trova sotto
la sigla CNY70 sul morsetto centrale (uscita del
fototransistoÒ, e l'ulttmo filo sul morsetto di destra
(fotodiodo). ln questo modo rimane
alimentato il sensore ottico che invia segnali logici
vpr<n il Ple nra 'ip alls rirrt 1i7gyr6 Clj
condizionamento del segnale presente sulla scheda.

Gonsigli prcrtici. Ulilizzo dei sensori


tVeilo stesso modo in cui abbiamo collegato questo
sensore ottico collegheremo gli altri due,
uno in ogni morsettiera. Oltre al sensore a riflessione
CNY70, potremo approfittare della
circuiteria della scheda di potenza per collegare ad
essa qualsiasi tipo di sensore ottico,
come il sensore a forcella che si vede nell'immagine.
ll procedimento per il
co I leg a mento e esattamente ug ua I e.

Le morsettiere J3 e J4 servono per il collegamento


dei sensori di tipo meccanico,
in queste morsettiere non possiamo collegare i sensori
ottici. Normalmente utilizzeremo
queste morseltiere per collegare i finecorsa che ci
serviranno per rilevare gli ostacoli e
per evitare che Monty entri in collisione. Se osserviamo
le morsettiere di fronte, nel terminale di sinistra
abbiamo la massa, in quello al centro i +5 V e in
quello a destrd I'ingresso per il segnale del sensore.

Qui abbiamo un sensore meccanico ttpo finecorsa,


collegato alla scheda di potenza.
ll primo piedino del finecorsa è I'uscita del sensore
che collegheremo con il terminale di destra.
Poi collegheremo gli altri due terminali del sensore
negli altri ingressi della morsettiera.
ln funzione di come realizzeremo il collegamento, il
nostro sensore meccanico
sarà attivo con livello basso o alto.

Consiqli rrrcrlici. Utilizzo dei sensori


Monleiqqio pcrsso ct Irqsso
Olrre alle morteti;èra di tngte>.9 pgr i ,en.Oti atil,.
e meccanict disponramo di altre quattro morsetttere a

s
d.t, terminali .hp ., .gr1 lròDao tan e ing'e5-o
&= s
&
s s5,;ta Jiq,tale 5o"o J6 J7. JB c J9; sono cotlegàte
ai piedini RB4, RB5, RB6 e RB7 del PlC,
nell'ardine mostrato nell'immagine. Se guardiamo
di fronte le morsetttere, tl termtnale di srnistra è /a ,nassa

-i%
w-
ffilE
4*.5:*,.,.--
Pn. :mn ,,ttliztsrp oittr<là mnr<erfterà nar, olloos,o ;..
j'; """"
qualsiasi tipo di dtspositivo che vogltamo. & jJ
u ,,;:
,,;
-
Ad eSemoiO potremo r.O.làre d'od. I I D o ".1e pe, \ i:} f, &.,r:;i
attivare altri moton. Come tngressi potremo l
' o'leqàre p,u serso' 'nÒc.à.t.1 r6po f,^1aq662
r larrLtroT o p.lsan*t. ouos,e mor--fTiere
,noTrc 5Fr\ona per ta.e .oltegamanu cat / sen50 r

della scheda dei sensori che fa parte di Monty.

*+
€:
a\-?

t\3

t':\ %Rt- Le morsettiere l1 1, J12 e J7 3 servrranno per


il controllo dei motort. ll motore che chtameremo M1
ri, sarà collegato in 171 e tl motore M2 in 112 La
morsettiera J13, che si trova fra le due precedenti,
<prvira enmc tnore\\. elplla tensione di alimentaztone
per quos,ì tnavi dòta rhe /a :theda di r:oLenza
permette di dtsrsorre di un'altmentazrone per i moton,
indipendente dall'alrmentazrone della scheda.
Guardando la morsettiera di fronte, rl terminale di
rlF,trà Fià ,-.:ssa a tn ortpllo dr stnrstTa teffa
collegulu la tens'one oosifla da àaplttare al morore.
lnfine la morsettiera J10 serve per collegare
un altoparlante, nello stesso modo in cui lo abbiamo
fatto per la scheda di ingressi e uscite.
Dobbiamo collegare il cavo rosso dell'altoparlante
al segnale +5 V della morsettiera, che si trova
nel terminale di sinistra, se guardiamo
la morsettiera di fronte come mostra l'immagine.

ll collegamento fra Ia scheda di controllo,


in cui risiede il PlC, e la scheda di potenza, lo
realizzeremo attraverso il Pic-Bus, nello stesso modo
con cui collegavamo la scheda di controllo con quella
di ingressi e uscite. A partire da questo momento,
utilizzeremo la scheda di potenza per valutare
i programmi che funzioneranno con gli ingressi
e le uscite reali con cui faremo funzionare il robot.

Per la scrittura del microcontrollore, non sarà


necessario scollegare il Pic-Bus di connessione fra le
due schede, sempre che non ci siano sensori
collegati ai morsetti JB e J9, dato che i segnali
aresenti su ouesti morsetti vanno a RB6
e RB7 cioè i piedini di scrittura del PlC. Come sempre
faremo attenzione alla posizione dell' interruttore
di scrittura della scheda di controllo, che deve essere
in posizione PROG. Nell'inmagine vediamo un
insieme di sensori collegati alla scheda di potenza,
e ouesfa a sua volta colleqata alla scheda di controllo.

Consigli prcrlici. Utilizzo dei sensori


.:
_-j

irÉ:
#
î4

fltomÉtrggis Fcrssc .r Ffiss€


Questo e tl primo esercizio che faremo utrlizzando sensori
1 e motori che diventeranno parte integrante
? List F=16F84a di Monty. L'esercizio consiste nell'accensione e nello
è include "PléFs4a-rHc"
If spegnimento di un motore a correnle continua
5 org 0106 (che controllerà una delle due ruote di trazione del robot)
6 goto Irizio
7 úrg 0x65 secondo Io stato di un sensore ottrco a riflessione.
s Sarà necessario utilizzare la scheda di controllo collegata
S Inizio bsf sTATltS,RPú
alla scheda di potenza. Il programma è riportato nella
fE moulu b'00010060'
1t noutdf P0nTA figura e consiste nell'attivare / disattivare il motore 1 in
12' bcf STATUS,EP0 funzione dello stato del sensore su RA4.
'Ìs
14 Cicl$ btfss PoRTA, 4
tS goto Auanti
16 qoto Ferroo
77
1f FPrnú cLrf P0RTR
1?, goto CicLo
28
21 Asanti bsf PoBTft,B
ZZ goto cicls
2E
24 EHD

Realizzeremo il montaggio necessario sulla scheda di


potenza per provare questo esercEto.
Collegheremo un sensore ottico sulla morsettiera J5,
tramite il quale il segnale arriverà al pin
RA4 del PlC. E necessario collegare correttamente i
cavi nella morsetttera, come già sappiamo.
Se collegheremo male I'alimentazione del sensore
potremmo bruciarlo e renderlo inutilizzabile.

Oltre al sensore ottico collegheremo alla scheda di


potenza un motore a corrente contÌnua. Lo inseriremo
nella morsettiera J11 (motore 1) tramite la quale il motore
resterà collegato ai piedini RA) e RAI del PlC. Quando il
valore di uscita di questi pin sarà due zeri o due uno, il
motore ilmarrà fermo. Con due segnali opposti "1 - 0" o
"0 - 1", faremo girare il motore in un verso o in un altro.

Consigli preitici. Utilizzo dei sensori


Oltre al collegamento del motore su Jl1, è
necessario fornire tramite i morsetti 113 la tensrone
di alimentazione dei motori, che potrà essere
erogata da una pila collegata alla clips. Dobbiamo
fare in modo che la massa dell'elettronica
sia comune alla massa che applicheremo ai motori,
per cui dovremo inserire il terminale
negativo del portapile (cavo nero) nel/a sfessa
posùione che vediamo in figura.

Per provare l'esercbio dobbiamo attivare e disattivare


il sensore ottico. Potremo utilizzare
un pezzo di nastro isolante nero su una superficie
bianca (o riflettente). Quando il sensore
si trova sul fondo scuro del nastro la luce emessa
dal fotodiodo non polarizzerà il fototransistor; quando
si troverà sul fondo bianco la luce
del fotodiodo arriverà sino alla base del fototransistor
e questo conaurra.

Scriveremo, compileremo e trasferiremo il


programma sul microcontroller tramite la scheda di
control lo. I n seg u ito col I eg heremo
la scheda di controllo con quella di potenza tramite
il Pir7t r F nr.vertrmn I'p<pfcEg.
Raccomandiamo di ripetere l'esercizio, pero con il
sensore ottico collegato su morsetti diversi,
e anche con i sensori meccanici,
al fine di verificare il corretto montaggio della
<rhar'la rli n^fan7)

Consigli prolici. Utilizzo dei sensori

You might also like