Professional Documents
Culture Documents
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
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
=
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
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.
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 '.
Consigli prctici
ftfionÈerq€gge
F€ F€-::*r € ÉgÉ{#
i
:1i
llll
tì
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
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
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
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-
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
G_qqs!g!!Jrcrtici
Pt 52
'.: t.4;
iì
.,r.r{+s:n .,,iryîs1ti*:igf:$L
I
.:{d*.*i:r.f- ' - " --- " --:""'
,:*
: -:::::
:
€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
;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
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
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
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.
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.
----- RÉltistÉr'FaIes
E0u H'tlotÚ'
EqU H'tro01'
E0u H'[OO?'
EOU H! OOrt3'
E0u H' rlBt:r4 '
E0u il | [aas I
':.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
tÉ
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
!
f
--*-*.,*"*"*"**t
KC
AE
KC
AE
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.
'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.
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.
'11:'),\:r|
j2rrrr.,1/,,..,,rtta7..a,a%,trwir:.
€
: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
1ú
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
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
li lÈ]ffittiltìttì:r$r\a
Ccrlcoli mnlemcrtici
Pt óó
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.
.
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.
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+
#
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
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
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*
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**
tú
*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.
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"
"
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
*+
€:
a\-?
t\3
irÉ:
#
î4