Oltre ai dispositivi digitali ottici di uscita, come i display o i led, disponiamo anche di dispositivi sonori. I sensori piezoelettrici, emettono un suono quando sono attivati da un'1'logico, e smettono di emettere quando ricevono uno '0'. Si possono attivare direttamente con il segnale di uscita di qualunque piedino del microcontroller PIC.
Oltre ai cicalini piezoelettrici, possiamo produrre suoni anche con un altoparlante. Un altoparlante avrĂ bisogno di un segnale periodico di '1' e'0' per far si che vibri e produca un suono. A seconda della dimensione dell'altoparlante, e della potenza sonora desiderata, potrebbe essere necessa rio aggiungere degli amplificatori esterni; inoltre hanno il vantaggio di poter produrre suoni bassi o acuti, variando la frequenza del segnale periodico. Ne consegue una migliore resa sonora rispetto a i cica I i n i p i ezoelettri ci.
MTCRO REtÉ
Quando si deve alimentare un'uscita che ha un alto consumo di corrente, si utilizza una tensione diversa dai 5 V di uscita del PlC. Possiamo utilizzare un relè i cui contatti permettono di lavorare con tensioni e consumi elevati. Lo schema ci mostra un possibile collegamento della bobina alla linea di uscita del PlC. ln questo modo, isoliamo il segnale del PIC dal carico che dobbiamo attivare.
,
*-**Jg.**iHl*#I*lit,i
Delle periferiche tipiche, impiegate in numerose applicazioni (ad es. in Monty), sono i motori. Nell'immagine abbiamo un motore a corrente continua (C.C.). ll microcontroller può pilotare la sua accensione, la sua fermata, cosi come la velocità e il verso del giro.
Per convertire i segnali logici del PIC in segnali di potenza, applicabili al motore, possiamo utilizzare un driver come I'L2938 che puo governare sino a due motori CC. Questo chip si controlla direttamente dal PIC e amplifica il segnale per poter attivare il motore. lnoltre si può impiegare il classico ponte ad H, formato da transistor e componenti discreti.
ENI
+Vcc
tNl
rN4
OUTI
:=
+ OUT2
OUT4
+ OUT3
rN2
rN3
+Vss
EN2
motore CC come mostrato dall'immagine, possiamo controllare, utilizzando solamente due segnali del PlC, l'accensione e lo spegnimento del motore stesso, e anche il verso del giro. L'accensione e lo spegnimento si ottengono abilitando o meno il segnale di Enable del driver (Vinh). Per cambiare il verso del giro dobbiamo solo rnviare la combinazione'1'-'0' oppure'0'-'1' ai piedini C e D. La tensione di alimentazione del motore si applica tramite l'ingresso Vss. Se colleghiamo un
Con questo driver inoltre, e possibile gestrre dei motori passo a passo, collegando ognuna delle bobine nei due lati del driver. Tramite il PIC dovremo solo inviare al driver la sequenza appropriata dei codici binari per far si che il motore giri a destra o a sinistra ad una determinata velocita
,,JFJJt*gH.it.*Rg:-:-p,*#*.F*F:s,*g-
Monfeq*le
F4?És #
F€H€sF
Per fare rn modo che un altoparlante produca un suono, deve vibrare e per questo lo dobbiamo pilotare tramite un segnale elettrico. Possiamo programmare il PIC perche produca questo segnale, pero porterebbe via molto tempo alla CPU, tempo che dobbtamo impiegare per altri lavon. lJn altro problema è la capacÌtà di caica del PlC. non e suffrciente per altmentare direttamente un altoparlante, quindi conviene considerare una soluzione hardware, che consrste nel far generare questo segnale da un circuito esterno al PlC. ln questo modo l'altopailante si attiverà e disattiverà con un livello logico, e il circuito avrà sufficiente capacità di corrente per alimentailo.
Quesfo e lo schema elettrico della parte del circuito vibratore che genera un'onda quadra ln seguito avremo un altro stadio che amplificherà questo segnale. Consta di diverse resistenze, un potenziometro, un condensatore e un circuito integrato 401 1, che è una porta logica tipo tVAtVD. Ouesta porta compie le funzioni della porra AND - gia spiegald ncra neoate. ouindi c (o/7le se collocasstmo una porta NOT alla sua usctta. La filosofia del circuito consrte nell'utilizzare
ENABTE
/ ---^ ); . -.:-. g- .-^.:-1 i/ LÉt I tPU U/ lol /LC )LOr /LC del condensatore
u
1 opr nrnto(àrc ttn sqonale oscillante '1' o '0'. ll tempo di scarica del condensatore
e
dipenderà dal valore delle resistenze R14 e RlB. Dobbiamo notàre che se il segnale Enable e a '0', I'uscita di U2A sara sempre a'l', di modo che non ci sarà condizione di oscillazione possibile e l'altoparlante non suonerà. La resistenza R1 B è un potenziometro, per cui potremo modificarne
il valore, producendo così un segnale periodico più o meno alto, il cui effetto sopra l'altoparlante sÀrÀ .li nttentrrp <t nni niit O menO aCUti.
f Í1ffi
tegllur4tm!rìrìittÍ'$trlulll
ugri#Ftki
':rt:j
.+
:*
1t
i;i
=
Per modificare il valore del potenziometro raccomandiamo di usare un cacciavite a taglio, con cu, potremo girarlo facilmente. Però bisogna fare attenzione, dato che il potenziometro non può dare un giro completo, perché ha un perno di fine giro in entrambe Ie direzioni.
ATTOPARLANTE
USCITA DEL VIBRATORE
Per fare in modo che I'altoparlante non emetta alcun suono, non è sufficiente fermare il funzionamento del circuito vibratore, dato che piccole correnti parassite che passano per il collettore del transistor, possono far si che I'altoparlante emetta un leggero ronzio. Per questo motivo, quando vogliamo che I'altoparlante non suoni, possiamo togliere il jumper di JMP3, in questo modo scollegheremo I'altoparlante; tsolandolo non emetterà pir) nessun suono. Grazie a questo jumper evitiamo di scollegare l'altoparlante dai suoi terminali quando non vogliamo utilizzarlo.
La funzione della porta U2C e semplicemenfe dì ricostruzione, per ottenere un segnale perfettamente quadrato in uscita, che servira per pilotare il transistor. ll transistor è di tipo NPN, quindi la sua base ha necessità di ricevere corrente. Per questo motivo, quando all'uscita di U2C avremo '1', il transistor si polarizzerà e /ascerà passare corrente tra collettore ed emettitore, e come risultato alimentera I'altoparlante. Grazie a questo stadio di amplificazione, stiamo applicando il segnale
periodico ottenuto all'uscita del vibratore e sufficientemente amplificato all'altoparlante, perché possa muovere la sua membrana ed emettere suono.
Pt 34 W. *if
{*rJ *:rl i *sf
!i!4s t
t
{.t}l
I I
..
/t
e';
"/'\dr}]
slt @
----*"-*k WF",:, " i€ W' :ar*Ér
, '{'" ",-=
tg :a :.-
r
{
-'\-r'\_
U f*"t
.É{i.{.*É-4
i seguito spiegheremo il funzionamento del software di programmazione che serve per programmare il microcontroller. Per questo, abbiamo brsogno dei programmi compilati e senza errori mediante l'uso di un aliro orogramma compilatore come il MPASM. ll programma che dobbiamo eseguire per scrivere il PIC si chiama 'l6FB2.EXE e si trova nelle directory PROGRAMMI del CD-ROM, così come mostrato dall'immagine. Raccomandiamo di copiare il programma in una cartella deldisco rigido e dieseguirlo da lì, invece che dal CD-ROM. La directory radice per trovare iì file del programma da scrivere sul PlC, sarà quella delìa directory in cui il programma si trova e dalla quale si eseguirà il programma 16F82.EXE, per cui è consigliabile posizionarlo nella stessa diectory ìn cui si trovano i nostri file compilati, o in un'altra vicina. Questa e la finestra che appare dopo aver eseguito rl programma. E divisa in varie zone
Jél -d\\\\
-
..J-rr^ \]uoil ^lSSiamO o ^--+:-^ v6r LilE uoilc ^,,-r' PL
selezionare dìstinte fun_ zioni di programmazione: il programma da scrivere, con le verifiche dello stato del PlC, ecc. In seguito spiegheremo in dettaglio ognuna di queste parti del software. Ricordiamo anche che questo software di programmazione, richiede che rl microcontroller PIC sia inserito nella scheda di controllo, e che quest'ultima deve essere collegata alla porta LPT'l del computer, mediante un cavo D825, e correttamente alimentata. Nella finestra superiore a srnistra della videata, possiamo vedere il codice esadecimale del programma da scrivere. Questa è la sequenza dei dati che viene introdotta nel microcontroller, che si ottiene dopo aver com-
pilato il programma. Quando eseguiamo il programma, tutte le posizioni sono riempite da un codice 3FFF di default. Questo corrisponde ad un codice di istruzione del PIC (14 bit per codice) composti da livelìi
'1' (memoria
cancellata).
]:sJ:;#jì'fl
:1ÈÉÉ:í.;;;i llammino.asm Cammino.her EsFloralore.asm
Esplorètore.hex
Posizione del arooramma all'interno del CD
Programma in esecuzione
Consigli prqtici
Cercando il file
ff Codice del programma
re
,é
--ffi file .hex che voglramo scrivere nel PlC, dobbiamo cliccare sul pulsante apri, che si trova nella zona inferiore della finestra, dove ci sono tutti i pulPer aprire il
sa
nti.
Dopo avere cliccato con il mouse questo pulsante, appare una finestra come quella dell'immagine. Come standard, ci troviamo ora nella directory in cui si trova il software di programmazione, e dalla quale lo abbiamo eseguito. Dobbiamo ora cercare l'ubicazione dei file .hex che vogliamo scrivere, muovendosi suli'albero delle directories del disco rigido. Vedremo sulla parte destra il nome dei files .hex che abbiamo nella directory e che potremo ulllizzare, nel caso ne esista qualcuno. Per retrocedere nella directory, sarebbe a dire per awicinarci alla directory base, dobbiamo cliccare con il mouse sopra i due punti che si trovano all'inizio, come prima directory, di ogni finestra. Per entrare in una
Gonsigli prqlici
directory dobbiamo cliccare con il mouse sulla directory desiderata una volta che abbiamo visto il file .hex che vogliamo scrivere; cliccando su di esso lo manderemo direttamente al buffer del software di lettura oer mandarlo nel PlC. Dopo aver aperto un file .hex, nella finestra che rappresenta il buffer di memoria, nella posizione dove prima avevamo solo dati 3FFF, devono apparire una serie di numeri esadecimali che corrispondono al codrce hex che scriveremo nel PlC. Possiamo vedere tutto il codice del programma, che arriva sino all'induizzo 3FF. Per questo possiamo clìccare sui pulsanti Pag su o Pag giù o sopra le due frecce. Con le frecce scenderemo o saliremo solo di una linea per volta. Con i pulsanti Pag su o Pag giu, saliremo o scenderemo di una videata. in modo da poterci muovere sul file molto oiù raoidamente.
:f,e
p&
3ó
/.:
,i. .
L;:
trl:.r,.:r,,L,La,,1aataa,ata,.ttt:a.tat
jÉ'ffi@@
*
ffig#*';iffi.,*ffig#
w
ry
z3à
w
L*,J***
Wf 'fI
,,'***J
;
,
@ rymffiry ffi
ۃ 1
,r r'è
;" .j
.Jr-TryT
,ffi
tr:'
jd?
;'
*
&
1
j.,ti l.lltnttat
?zn.
Mediante questo menu possramo selezianare la parola di configurazione rhp notrcmn mpmnizzsrp nel mrcroconlroller la prima optione. rcdi(e P serve per proteggere o non il @dirc d; progròmmd che vogliamo scrivere. Se attiviamo la proletione del codice e scrivramo rl PtC, quando lo leggeremo apparrranno tutti gli tndirtzzi con il dato 0000, sarebbe a rlira íl rnr"lira à.r;^t)f^
ll Watchdog
T è il temporizzatore interno hp nt tn a,<erp t trili'zstn nef evitafe blOCChi nel PlC, e tl Power Ttmer consiste nel comandare al PIC di realizzare una piccola temporizzazione dopo il Power On, in modo che la tensione ai suoi ingressi si stabilizzino prima di iniziare ad eseguire il programma. lnfine dobbiamo selezionare il tipo di oscillatore con il quale lavorerà il microcontroller, nel nostro ra<n <renliprpmo <Fmnrp lOSCillatOfe XT. e
Nella parte infertore della finestra corrispondente al buffer di memorta troviamo i pulsanti attraverso i quali realizzramo tutte le funzioni di programmaztone. lnizieremo la loro descrizione dalla fila supenore.
"Api File" serve per caricare il programma esadecimale (estensione .hex) che vogliamo memorizzare nel microcontroller PlC. ll secondo pulsante, "Programma Tutto", ci permette di scrivere nel PIC sia la memoria di programma con il file .hex selezionato, che la parola di configurazione. ll pulsante "Programma Parola" scrive solo la parola di configurazione del PlC, senza modificare il contenuto della memoia Flash di programma. L'ultimo pulsante di questa fila, "Verifica" serve per verificare se abbiamo scritto bene il PIC e se è stato o no correttamente programmato. Si confronta il contenuto del buffer con quello della memorta interna. ll pulsante della seconda fila "Leggi PlC", ci mostra nella finestra del buffer il contenuto di un PIC già programmato. Leggeremo sia la memoria di programma del PIC che la sua parola di configurazione. ll pulsante "Cancella" pulisce la memoria di programma del microcontroller ed elimina la parola di conftgurazione. Mediante il pulsante "Verifica Cancella" veilfichiamo se la memoria del PIC è cancellata o meno. lp,fip's martiznta it nt ttcanta "Fc.i" terminiamo l'esecuzione del software di programmazrone. ll primo pulsante
F-p,,*,tig*li*****ki
I'opzione "Veilfica Cancella" il software si assicura che il PIC
Se attiviama
sia cancellato prima di procedere
alla scrittura di ognuno degli indirizzi di memoria di programma. Questa verifica si deve fare sempre manualmente mediante il pulsante, ed è molto affidabile.
Nella parte inferiore del programma vediamo un riassunto delle caratteristiche piit importanti del microcontroller PlC16FB4, per il quale è stato realizzato un software di programmazione. Cosi possiamo vedere che possiede 1 K di memoila flash di programma, 64 byte per idati EEPROM, 13linee di l/O ecc.
a
pp a re u
:
;
n,,A frt i : ":"tr:';î ff;;'!
Si tratta di due numeri esadecimali da quattro bit che si scrivono in una zona riservala
della memoria del PlC. Nel numero lD si tntroduce un numero libero,
che generalmente è utilizzato per indicare il numero di versione del programma scritto, identifica il fabbricante, ecc. ll checksum ci puo servire come codice di sicurezza, per verificare se la memoria del PIC ha subito alterazionr, o se si trova memorizzata così come è stata scritta. Quando scriviamo il PlC, il programma calcola mediante un algoritmo, tl codice checksum, in funzione dei dati che sono scritti nella memoia. Quando leggiamo la memoria del PlC, si calcola impiegando /o stesso algoritmo, il checksum corrispondente ai dati letti che sono memorizzati. ln questo modo, se il numero che mostra la finestra dopo aver letto il PIC e /o stesso che abbiamo visto quando abbiamo scritto il programma, significherà che la memorra del PIC e rimasta inalterata.
Consigli prcrtici
..,:
iii
. .r".
é*r
&
&
& &
&
-.i.
ìrrrrìììrìììr:rrr.rrrrr
Pt 38
''.:aaa...))).).))i\tt
Nntr
* S. \* #? € * tr** q €. fi e. * ::.t., aa.
í.,
&
€
@
@ f i*
e
f,rilecreaggi* pcss+
s
â&#x201A;Źtrsso
Con il programma 16FB4.EXE oltre a scrivere la memoria Flash e la parola di configurazione del PIC possiamo anche vedere il contenuto della memoria EEPROM dei dati. ll PIC consta di 64 indirizzi di memoria EEPROM, nella quale possiamo scrivere, mediante il nostro programma di apphcativo, valori che non vogliamo che vadano persi quando al microcontroller viene tolta tensione. Per accedere alla videata mostrata nell'immagine, dobbramo cltccare il pulsante "Modif. Dati", che si trova all'inLerno del menu "Caratteristiche". Dopo aver premuto questo pulsanle sr apre un'altra finestra in cur sono spariti alcuni pulsanti nella parte inferiore, inoltre si rrducono anche gli indrrizzi dl memoria che possiamo leggere. ln concreto posstamo leggere i 64 byte che abbiamo memorizzato negli indirizzi EEPROM del PlC.
PASSI DA SEGUIRE PER PROGRAMMARE
IL
PIC
pimo
passo consrte nell'assicurarci che il microcontroller PIC sia tnserito nella scheda di controllo, e che sia orientato nella posizione corretta. Ora dobbiamo collegare la scheda al PC mediante un cavo con due connettori DB25 (uno maschio e uno femmina), come mostrato nell'immagine. Questo cavo deve essere acquistato a parte in un negozto specializzato. Dobbiamo anche assicurarci che il connettore SW3 della scheda di controllo si trovi nella posizione di scrittura, altimenti il programma ci darà messaggi ripo "Errore di verifica" oppure "ll PIC non e cancellato" quando si tenterà di programmare il PlC. Dopo aver realizzato questi tentativi, alimenteremo la scheda e posizioneremo gli interruttori su On. Per il processo di memorizzazione raccomandiamo di utrltzzare un trasformatore da 12 V, o di montare tutte le batterie nell'apposito vano sul telaio. Quando la scheda sarà alimentata e collegata al PC, apriremo il programma di scrittura. Dopo aver aperto il programma dovremo selezionare un file .hex che si possa programmare nel PlC. ll microcontroller supporta sino a 1.000 cicli di programmazione e di cancellatura. Se avremo assemblato un programma senza errori con MPASM, disporremo di un file .hex che potremo scrivere nel PlC, nel caso non lo avessimo potremo selezionare, a titolo di prova, i file che si trovano nella directory PROGRAMMI del CD. ll
Questa e la finestra che si vede dopo l'accesso ai file della directory. Nella parte destra, sono mostrati i file .hex che si possono scrivere nel PlC. Ne selezioneremo uno qualunque, ad esempio ESPLORATORE.HEX. Pilma di programmare bisogna cancellare il microcontroller e verificare la cancellazione. Per questo cliccheremo il aulsante "Cancella". 5e tutto va bene, dovrebbe lampeggiare il diodo LED D9 della scheda di controllo, e pervenirci il seguente messaggio; "La cancellazione e stata realizzata". Adesso possiamo veriftcare se il PIC è stato cancellato cliccando il pulsante "Verifica Cancella", nel caso la verifica sia negativa ripeteremo I'operazione di cancellazione. Non dovremo scrivere sino a che il PIC non sarà stato cancellato correttamente. Dopo ogni apparizione di un messaggro nel programma dovremo cliccare il pulsante "Continua" per proseguire con le operazioni successive.
Gonsigli prctici
Ciclo di cancellazione realizzato
Verifica di cancellazione del
Quando il PIC sarà correttamente cancellato procederemo alla sua programmazione. Di seguito scriveremo il programma che abbiamo selezionato e che stiamo vedendo nella finestra del Buffer di Memoria di programma. Prima di scrivere il PIC ci dobbiamo assicurare anche che la parola di configurazione contenga le opzioni che vogliamo assegnare al nostro microcontroller. Rrcordiamo che I'oscillatore deve sempre essere XT cliccheremo il pulsante "Programma Tutto" per scrivere il programma. Durante il processo di scrittura del PIC il diodo D9 lampeggerà come quando lo stavamo cancellando. ln funzione della lunghezza del programma, il tempo impiegato per la scrittura sarà maggtore o mtnore.
PlC.
Se il PIC si programma correttamente, apparirà il messaggio "ll PIC è stato programmato".
Al contrario, se non si potrà programmare, apparirà un messaggio. "Errore di Verifica". Dopo aver scritto il PIC potremo verificare il contenuto del medesimo. Se appare il messaggio "La verif rca e stata esequita correttamenle', il PIC sarà perfettamente programmato, e
potremo esegutre tl suo programma tnterno.
La verifica ha avuto successo
Dopo aver programmato il PlC, potremo modificare tl contenuto della parola di configurazione, indipendentemente dalla memoria di programma. Per fare questo chccheremo il pulsante "Programma Parola" e introdurremo nel PIC la nuova configurazione. Per eseguire il programma nella nostra applicazione, dobbiamo scollegare il cavo DB-25 dalla scheda di controllo (non è obbligatorio). lnoltre dobbiamo muovere la posizione SW3 da PROG a RUN. ln questo modo le linee RB6 e RB7 rimangono pronte peressere collegate ai sensori e agli attuatori, invece che al circuito di scrittura della scheda di controllo. Ora potremo modificare la fonte di alimentazione e passare all'alimentazione mediante un trasformatore, o alimentare con pile o batterie. ll consumo in questo momento è minore e se avremo scollegato il cavo D825, disporremo di un sistema autonomo. Quesro e il processo che bisogna sempre seguire per la programmazione corretta del PlC, e dobbiamo seguirlo anche ogni volta che introdurremo un programma nuovo. Se abbiamo seguito questi passi e nonostante tutti i tentativi fatti non riusciremo a cancellare o programmare il PlC, dobbiamo rivedere le saldature e la disposizione dei componenti sulla scheda. Possiamo toccare con la punta del saldatore Ie saldature per verificare se qualcuna di esse non sia stata ben fatta o non abbia preso la forma di cono.
Consieili prcrlicr
Pt 40 ..
rffi
4F
5r{_yà;.
__'.
F
Montcrggio passo c p.rsso
PORTA
Realizziamo ora il primo programma con gli 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. Nello schema possiamo anche vedere la ctrcuiteria minima necessaria per il funzronamento
A
PORTA B
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*******#*****#***#* Questa e I'intestazione del programma.
All'inizio di ogni programma btsogna sempre definire il tipo di processore che vogliamo 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 realizzazione del programma. Poniamo nel Vector 0 un'istruzìone di salto all'inizio del programma. Con ORG 5, saltiamo il Vector di interrupt posizionato all'indirizzo 4, iniziando il programma all'indirizzo 5.
2 ;Prograwa che accende o spelne il diodo I ;led D1 de1la schedà di ingressi e $scite 4 ;in îunzione de1lo stato del cosiltitorE Sl{3;fipo di dispositiuo lg
t'l
STRTUS
PoHTfi t2 PnnTú
It BPB
EqU EqlJ
g{tj E{U
i4 t5
16 t7 t8 $
0sE
goto OBE
,.9
2' 22
2:l ; Inizio del 24
programna
2î
bsf Elrf noul$
?*
IIIOUI{f
35 IHIZIO: z,fr
2!, 51
Í2
bcf cTrf
STftTUS,
RPB
PflETB
b'BBSB810B' POBTR
SîfiTU$, PIATS
EPE
La prima cosa che dobbiamo fare all'inizio del programma è configurare i registri che vogliamo utilizzare. ln questo caso dobbiamo configurare la porta B come uscita (il diodo Dl è collegato a RB)), e il pin RA2 come ingresso (pin al quale arriva il segnale
dell'interruttore SW3). Per realizzare la configurazione delle porte passiamo al Banco 1, e dopo averle configurate 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 SW3). Se I'interruttore è a '1' andiamo alla routine ACCENDERE mediante la quale invieremo un segnale '1' al piedino RB). Se l'ìnterruttore è a '0' spegneremo il diodo LED mediante Ia routine SPEGNERE. Questo ciclo è infinito, e viene eseguito in modo continuativo.
ax gs
EICL0:
35
btfss goto goto
ÍrÉ SF ÈCCEHDEFE:
bsf
slt
goto s8 $s 4F SPEGHEHE: bcf
tll
+2
llg +tr
gotri
EHD
P0BTÉ,2 SPEEHEEE
fiICEHDEFE
P0FTB,
B
EICL0
F0BTB, G
B
I EL0
;FinP del
programma
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
{*,
Questo esercizio ci permetterà di lavorare con segnali
A
l'*
/'r I' /v {'
fr
PORTA B
D8
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. All'iilzio del programma i diodi rimangono spenti, 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 e tornare ad eseguire il programma, schiacceremo il pulsante di Reset della scheda di controllo.
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.
F*';Ciclo che attende la combinazione 1-B-1-B-1. 32 33 CICL0: mouf P0HTA, H andlr,r b ' 8061 1 111 ' Str xorlur b' 0661 01 81 ' 35 btfss STATUS, 2 3ó goto cIcL0 JZ s8
39 40
+
moultt Bxff nou+rrf
P0ffTB
41
FIHE: goto FIHE 44 ;Premere iI Beset +5 iper tornare ad eseguire i1 progranma 46 EHD ;Fine del progremne &7 49
Ciclo principale de! programma. esso leggeremo il valore degli interruttori (Porta A) e realizzeremo una prima maschera AND,
ln
..,:
4S
per rimanere solo con i cinque meno significativi che vogliamo verificare. La funzione logica XOR verifica che la combinazione introdotta sia valida. Se il risultato delle XOR pone il bit Z del registro di stato a 1 sÌgnifica che gli i nterruttori stanno introducenoo n combinazione l -0-1 -0-1 e, pertdnto, procederemo ad accendere la barra dei LED. In caso contrario, rimarremo all'interno del ciclo principale del programma.
4S __n
rOi
;***+*****+t***************+******************:*F
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
re
44
wts{t|!!!]w
#ffiri'iililljiwwswweffi#
.
èe *J,,1*
:- Se-*
-., qla*
*#€ -{f
"4 #-.\ c, 1"*
\ q"ffiq ..\
Con questo esercizio vogliamo introdurre Ia gestione PORTA
ó I
x PORIA
B
lntestazione del programma, dove si realizza una breve descrizione sotto forma di "commento". Dobbiamo scegliere il modello di microcontroller che useremo ed etichettare i registri che saranno impiegati durante lo sviluppo del programma. lnfine collocheremo l'inizio del programma nella posizione 0, però salteremo il vector di interrupt 4 prima di introdurre la prima istruzione.
A
5W3
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 e uscite il valore dell'interruttore SW3. Quando questo interruttore è a '0', sul display si vedrà il numero zero, e quando è a '1' verrà mostrato un uno nel display.
a?rograffi rhe util-izza il. lisplay a 7 =q*nti ;;per indicare iI ualrre d€lf intsrruttors Slf:t-
líst F=lúF3+ ;frFa dells stic'|ettf f{U È.C} t{U fr(ú E0U stfú f{lt ÈrÉ5 !*É {sts rffc
;riso di dilpusiÉuo :*eaistro di stato ;Pcrta f ;fúrta 3
É
;llector fesst
5
;5a1t1aH 11 U€rtof {l
IIIIZIO
;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, 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
t
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
tĂŹ lll Ni
I
J
1
PORTA
ln questo esercizio realizzeremo una temporizzazione. ll programma che implementeremo e proleremo sulla scheda di ingressi e uscite, fara lampeggiare il diodo LED Dl accendendolo e spegnendolo ogni secondo. Nell'immagine è indicato lo schema dei collegamenti necessari per poter provare questo prog ramma.
A
PORTA B
Come già sappiamo all'inrzio del programma dobbiamo definire il tipo di microcontroller che vogliamo utilizzare. lnoltre possiamo dare un nome e registri del PIC che utilizzeremo nel corso del programma. Oltre ai registri interni del PlC, in questo programma utilizzeremo anche un registro di uso generale, che posizioneremo al primo indirizzo libero, che corrisponde allo 0x0C.
td .IÍ
t*
t? g! ei
5i cs
t*
u5
Íú c}
t* Ín
*a
1 ;PrograFa che accendÈ e spegne il lliodu Dl 3 ;ogni serondo+ p=16F8t ;Tipo rli dispositiuo list f ú I ;firea dÈllÈ etichette ,S.SrÈrUS EtU ÈrHt ;BÈgistro di stato +. POBT* EqU frrE ;Porta A t-g PIIRTB EQll S{S ;Fúrta B *1 ftPE EQU &.S t2 0PTIOH_BE8 EqU &tfl ;TixrE * llption l* IlftcllH EQU &.Cb fÈ TElf0l EQU È.Ec ;$egistro di utilizzs î5 ;gÈneraIÈ l* l? 0rs e ;Uector Reset :* gùto IHIZIù t+ g0 OFG 5 ;Saltiaro il uector di 21 ;interupt -
0RG g ;Uector Reset goto IHIZI0 ORE 5 ;Saltiam il uector di ;
interrupt.
;InizÍo dÈl Frograxa IHIZIII: bsf STÈTUS, RPO clrf P0BTB roulf b'CttÈFllt' muirf llPTI0H_REG bcf ST*TÙS, EPÉ clrf P0RTB
All'inizio del programma passeremo al banco
':
1
per realizzare le configurazioni. Imposteremo la Porta B come uscita, e assegneremo il prescaler al Timer), con valore 256. Questo farà sì che il Timer) si incrementi ogni 256 cicli macchina, e ci faciliterà i calcoli, dato che dobbiamo realizzare una temporizzazione cosi lunga, qual è quella di 1 secondo (bisogna ricordare che il PIC impiega 1 microsecondo ad eseguire un'istruzione). Dopo aver configurato questi registri, torneremo al banco 0.
Consiqli prcrticr
st sg
ss ;Ciclo principale- Si accende e si spegne $* ;il led temporiaaando un spcondo fra g5 ;entrambe Ie aeioni
Questo è il ciclo principale del programma, dal quale eseguiamo la chiamata alla routine di configurazione ll procedimento è il seguente: si accende il diodo, si temporizza un secondo, si spegne il diodo, si temporizza un secondo e il ciclo ricomincìa. Questo programma, quindi, rimane in esecuzione in modo permanente.
-$*
sr $$
s$ 4E e1
CI[10: bsf call bcf CAIT goto
P0BTB,
B
DELRT1S
P0RTB,
B
DELRV1S
CICLB
[3
t4:;Routine di ritardo di 1 secondo t5 STRTUS, RP9 *É DELET1S bcf
Quesfa e la routine di temporizzazione Prima si carica il registro TEMPOI con il valore decimale 100, dopo si chiama un'altra routine che esegue una temporizzazione di 10 ms, un numero di volte pari al valore della variabile TEMPO| . ln questo modo otteniamo una temporizzazione di 1 secondo. La routine DEL10 esegue con il Timer) la seguente temporizzazione:
di 1 secondo.
T = 4* 0.25us * 39*256 = 0.009984 secondi = 10 ms (circa)
*T . ,S, **
noulu Rouìrf
call
Bxú{
TElF0l DEL18
rÈturn 5T
DEL1B
5g
5{
bcf
IHTCoN, ?
mul$ rEIirf
|lPTIIIN_REE
Br{08
s5
56 DELIS_I btfss
IllTc0lt,
5I
DEtl 0_1
ss 59'-
goto decfsz goto
ùs
return
ùî úÈ
EHD
TEI'1P01
,
2 1
DELl 8
;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
,rffi
l
,w.^
i',,,F1,,t8
ffi
\i
1
rltri
. €:s
Yq+ :
\P
-}F
à
t**L*,
rr,*,,, -,,
....,.,.:.,.:.:,:jj.î,4,ti,:1.,,,
ffi
,i#
é
'ff
',:ff
:ff
ffi&
:ff
.:ffi
:É ,E ,.,#=
.:&
ffi
É
,a::=
-TÉ
'É
:-é
.--.= :*:É
,_=
G -E
':&
= a
-a.tè
-&
#
,É
:&
ff
"ffi
ff
ff
N el l' esem p
'l ;******+*******t+***********************t*+ 2 ;Progranna cúntatore 3
p='túFS4 ;Tipo di dispositiuo 4 list 5 ó ;Érea delle etichette 7 STRTUS EqU 0*63 ;Begistro di stato I PoBTA EQU 6HB5 ;Porta R g P0RTB E{U B}r0ó ;Porta I 15, FPB Pqu 0x65 '1f 0PTIoH_REG EQU 0nB1 ;Tiner0 e 0ption 12. IHTI0H EqU ox8g l3 ;Begistro di utilízzo qenerale 14 C0HTfiT0BE EQll 6x00 {5 1f IRG B ;Uector Seset 1? goto IHIZI0 18 -19 IIBE 5 ;Saltiama il uector di Íg ;interrupt -
i
o
seg uen
te
rea I izzere m
o un
co
ntato re.
Utilizzeremo come ingresso I'interruttore SWI della scheda di ingressi e uscite, che corrisponde al piedino RA) del PIC. ll valore contato verrà ripoftato sui diodi LED da Dl a DB in forma di numero binario. Verranno contate le transizioni 0-1-0 che saranno inviate all'ingresso tramite il commutatore. La prima cosa che faremo sarà nominare i registri che utilizzeremo nel corso del programma, come abbiamo già visto anche altre volte.
: :*l
La configurazione del microcontroller richiede
di
configurare il piedino RA) come ingresso, per poter leggere il segnale dell'interruttore. La pofta B sarà l'uscita per visualizzare il dato del contatore. Dobbiamo configurare un prescaler di 256 per il Timer1, dato che sarà utìlizzato per evitare i rimbdzi
tz ;Inizio del progranma IHIZIO: bsf STfiTUS, RPO noulw Elr 61 ,25 *É mouÍrf P0HTfi '2e clrf PORTB noulu, b' 08866111' :!E ÍIOUU'f OPT I NH_REG .t* g& bcF STRTUS, RP0 g:l clrf PoRTB clrf IOHTRTOFE I .Z:g elr
s5
a+
*c ;Giclo principale. Si esegue la sonna in funzione 39 ;deg1i inpulsi introdotti datl'interruttore Sl,l1 36
GIBLI: btfss goto sc call 3X
P0HTB,
38
ÈICl-0
4,8
41
*
43
44 &5
4ú
tlî
Ir8 &e
CI[L02: btfsc
goto call
B
RHTIRII4BALZ0
P0BTR,
6
CICL02 fiHTIRII'IBALZÍI
incf mouf ÍrourrJf
C0HTRTÍIRE, CI]HTfiTORE,
qoto
IIELo
FI]FTB
F t,J
Questo e il ciclo principale del programma, il quale attende che dall'interrufÍore arrivi una transizione da 0 a 1 e che torni in stato di riposo '0'. ln questo rtante si realizza la somma, incrementando la variabile contatore. Il risultato della somma viene visualizzato tramite la oofta B.
Gonsigli prcrtici
t*ffi'q '* 5o
Dato che questo progrdmma utilizza periferìche reali, dobbiama anche considerare gli effetti
-ltrl)<J
:l
51
intrincar
ì Aì n' ta< t i \v,,iPv,,rlLr, rnmnnnanti v, YuLJr,
in nt tacf a r:<a
52 ;Routine per risoluere uia softrrrare il problena
dobbiamo evitare i rimbalzi del commutatore. I'elfeLto rrmbalzo è uno stato lransitorio, che genera
54
55 ÈHTIRIiIBfiLZO:
,-t^ A; -. ulld 5equellzd LdsUdte ut zefl e UnO .ha <; nr^.lt taè nt rsndn iln <an<óro dí finn marrsnirn
59
cambia di stato. Per evitare i rimbalzi reàliz/eremo una rcmportzzazione ogni volta rileúamo un cambto di stato nell'tnterruttore.
53 ;dei rimbalzi degli interruttoFi. 5ú 57 58
óB DEL:
61 62
IHTCoN, 2 bcf noulu BXBB mou$rf BPTI0H_REG
btfss IHTG0H, goto DEL return
úe
2 I
---l
óa
EHD ;Fine del progranma 64 ó5 ; ***********************************x*****x****{
tì
I
-l 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 Èr4ill$slf riFiiliwi '1i{&.
"'é^
qlsf $$$]NtN
'î
i'r@.'
t
-
{.
,,1
s
$:::.-;
ry1
ea-aÉ
€\ ,.'.*J
#ts*;stf?7trÍ d F rF *
e
's
!t
f
' .
'
.;
n&
sg t
"--é q.
u
,f
frllr,,-lè -.
*
R:
ffi fl
-t ft :,1:
+^'1
14*-lqrg
tr.-',.'j
r*\ r :ls À
\t--j
#,.
.,{ jll 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.
:g'
p=1ófs4 list ,è.' ó ;nrea delle etichette ? Slaus €QU Bx03 6xB5 :,:,*': PUIT* tQl' gXgé ::::9::P0*Tf,$ €qU 9x0s f{U i*,3P8 1t':$FtI0t'LnE{ ÉQU gXú1 t2: Il{TG0lt EQU BXQF 13 ;R€gistri di utilizzo generale lq IEHP01 EqU SXS$I t5: S 03fi i*: i?:. qoto ltlIZIo 1€ 5 19 éne tS :5,
lntestazione del programma. Come sempre, sceglieremo per pilma cosa il modello di microcontroller e daremo un'etichetta ai registri che intendiamo uttlizzare durante il programma lnfine collocheremo i vettori 0 e 5 per posizionare la prima istruzione del programma, e per saltare il vector di interrupt.
;ffograÍ*it tontatore
;Tips dl dispositivo ;Registre di stats ;Porta R ;Porta S ;f inerÚ e l}ptien
;Uectúr
Re5Èt
;sàltiaRs i1 uecter di
;interrupt.
27
22 ;Inizio rlel
Pr8grarr$a
?g
24 lilIZIo: bsf
25 Z,& ZT 28 29 g0 91 ;ciclo 32
€S CIDLo:
34 35 3é 87
3*
sTfiTUS, RPo
noulu Flou$f noslu
b'81111111'
bcf clrf
P0Fi8
PoRTB
b'8S666111'
EÌosarf oPIIOH
REG
P0RT8
principale.
bsf call bcf call goto
P0nT8,
7
DELrvlS
P0RT8, DELaYls CICL0
7
La configurazione è semplice. RB7, dove si trova I' altoparla nte, deve essere u n' uscita ; i noltre assegneremo il prescaler al Timer), dato che realizzeremo delle temporizzaùoni. ll ciclo principale del programma consiste nell'attivare e disattivare il segnale del piedino RB7, realizzando due temporizzazioni diverse, una durante I'accensione e
I'altra durante lo speqnimento
Consigli prctici
ff
:
:
::&8.
{i ;Routine di ritardo 42 4' DELEYIS bcf STNTUS, ,lt nouls .1 00 45 no(|Hf TE+1P01 ::: :4ó : eal'l !fl-'t 6 4? return 4$
40 DrLavHS bcf
SO 91 ':.1:.::IC, ].'rr.':5$,' :t:r:::5[ :
mulu nouuf call r*turn
55 DEL18 bcf
RPO
-5 0 TEHP0'| DEL'IO
IHrCoil,2
oEuls &(DB rîout{f 0PT!0N-AEG FT 59 DEL10-1 btfss INTCoN, 2 goto ú€ DEL'!0_1 ó1 dec6sz lE|lPO1 , 't goto 62 oElro return ól ,. :.:$f tllD I :,::ùF:.1 :Flne del progrannà l::.:
5ó .,*i:
SInIUS,
RPO
Queste sono le due routine di temporizzazione impiegate. La prima di queste, DELAYIS Ia conosciamo già, e realizza una temporizzazione di 1 secondo. La routine DELAYMS temporizza mezzo secondo. Le due routine si appoggiano alla routine DELAY|0, che temporizza 1 0 millisecondi. Nell'altoparlante si otterrà un suono simile a auello di una sveolia.
:
:
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; iì
.,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,.
ll.st P*1óFAll 1 2 g ;firea €te1Le etLchette { SIúTUS ÉQU SXSS 5 P0RTn €0U 0x09 ó P{tBfB E0U 0x06 ? RPú ÈqU 0x05 0 orrIúH_B€c EQU 0x01 I IltTÉ0N EQO S:{0b
t0
EQt ÉQU ÉQU FQ0
€qu €Qr, EqU EQU FQU
;Iipo di rrispositi$q ;Reglstro di. stata ;Porta n ;Forta I ;Tiser0 É optlsn
;Etichetta di. reglstrù ;per la EEPi0H
88h 89h 08lr
ln questo esempio impareremo a scrivere i dati nella memoila EEPROM interna del microcontroller. I dati che vengono scritti in questa memoria non sono volatili come quelli della memoria RAM, e rimangono inalterati anche quando togliamo l'alimentazione al PlC. Ouindi è una memoria ideale in cui scrivere chiavi o dati che devono rimanere inalterati. All'inizio del programma definiamo come al solito il tipo di dispositivo e /e etichette dei registri da impiegare.
0!h
;EtÍchetta di bit
5 6 2 J 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 EEPROM il dato corrispondente al valore presente nella porta A, il quale sarà selezionato dagli interruttori della scheda di ingressi e usclte. A questo scopo configureremo ld porta A come ingresso, chiameremo la routine DATO, che raccoglie il dato presente sulla porta A, e la routine WRITE che lo scrive nella memoila EEPROM.
st ;tnizÍa del
**
prcgramma
IHIZT$ bsf n.!$le, st I[o$$f Í!orr1$ *é nsusf sr bcf s$ sg
s*
s* *$
*f
cnll call goto
STSTUS, RPS
J
b' 80S111'11 ' F0*îA b'SSSefi11 ' 0PTI0|t*nE8
STAIUS,
RP&
tr*T0 I*FITE FIHE
:l-J'"
>J,,,:
&5
$ÉTO ficf ST*TtlS,RPS nsvLr" b'0SOOS0SB' 43 rrr{nrsrf EESùR 4t nouf P$*Ìft, i'l 4ó 4?
gs
5t FA
5S }rR I
5rl 55 5ú 5?
5* 59
És
sî
*2 &+
mnr.rwf rct$|,n
E€SàT*
Tg bsf SI*TI S , RF B bsf EEC{l}ll , I{SEH $s$111, 6x55 ncvw$ EEC$!12 nor.rllll Sx** rflo.Jr'tf f Ec$H? b5f EECflNl , lrn bcf STf,TlrS, RPB *a11 DEL"I 6 rÉtrrrn
La routine DATO seleziona I'indirizzo di memoila
in questo caso I'indiilzzo zero, Iegge il dato della porta A, scrivendolo in EEDATA, registro che deve contenere il valore che si vuole immagazzinare nella memoria EEPROM. La routine WRITE realizza il processo necessario per scrivere EEPROM da scrivere,
e
i dati nella memoria EEPROM, utilizzando i registri EECONl ed EECON2. 5i abilita
il
permesso di scilttura
WREN) in EECON2 si inserisce una sequenza stabilita da Microchip, infine si inizia il ciclo
di scrittura, attivando WR.
Consigli prcrtici
ú3 64 65 ú6 ú? úf,
;Rúutins di l"itardo
DELIB bcf IllTCBil,2 moulu gx8g ó* I|lourrf OPTIBII_RE8 7B 71 DELIS_1
72 7S
fa 75
:6
77 7a
btfss llll0ltx, goto DÉL'l B_1 d€cfsz TEl,tP01 , goto DELIB return EtJù
2 1
Questa routine di temporizzazione è necessaria, dato che il processo di scrittura di un dato nella memoria EEPROM non e cosi immediato come succede per la memoria RAM, ma puo impiegare sino a 10 ms per compiersi. Anche se per
questo programma potremmo fare a meno della temporizzazione, visto che scriviamo un solo dato, dobbiamo abituarci a considerare questa necessltà. Un altro modo di verificare se è terminata Ia scrittura, consiste nel testare il bit EEIF del registro EECONl, che viene messo a 1 alla fine di detto ciclo.
;Fine del pragrannà
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' :,#:.
,*'. .&:.
:: ; **************+++*************tt***+*************
Z;Progranna contatorP 3
È list p=tOrS+ ;Tipo fli dispositiuo 6 ;firea delle etichette 7 STfiTUS E0U 0r.03 ;Begistro di stat0 I PoRTfi EQU gxgs ;Porta fi 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 69h 1ó EERDR EqU 18 BPo EoU s ;Etichetta dÍ bit 19 RD EQU ?0 21 ;Registri di utilizzo generate EQU sxED ,..,t.'.t.**ì,ttttot ORG ;Uector Beset goto IHIZI0 ORG 5 ;saltiamo il uector ;di interrupt. 5
Abbiamo già visto come scrivere i dati nella memoria EEPROM e verificare di averli scritti correttamente tramite il software di scrittura. Nell'esempio B, che ora vi proponiamo, impareremo a leggere i dati dalla memoria EEPROM per utilizzarli nel nostro programma. La prima cosa che dobbiamo fare nel programma è, come al solito, scegliere il dispositivo e posizionare le etichette pertinenti.
O
O
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. poter fare questo, configuriamo la porta B come
Per
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. Ă&#x2C6; 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
-----
':TRIs.L . TBTqE : EECON1 : EECONz
,
fl' trfiù I
E0u
H'tlotÚ'
EqU
H'tro01'
,
RÉltistÉr'FaIes
E0u
H'[OO?'
EOU
H! OOrt3'
E0u E0u
::OPTItr{
if ' g[aD
EOU
REG
H' rlBt:r4
'
E[U
il | [aas II'ÚDtr6
EOU
HI EDÚE'
I
'
E0u
H'0rl[9,
EOU EOU
H'úOttÀ'
ESU
E'0ù81'
E0u Equ
E,O[fis
I
E,
,
EOU
II' llrtE8
E0u
fi'0ù89'
I1' |]ùtrE
OrtB 6
'
,
il file Pl 6FB4A.1NC, possiamo verificare quali sono ì nomi che sono stati assegnati ad ognuno dei registri del microcontroller. Sono gli stessi nomi che abbiamo utilizzato sino ad ora, e che Se apriamo e editiamo
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.
G
':.1
Per includere P1
, .t :1$, t
il file di dichiarazione dei registri
6FB4A.lNC, scriveremo nell' intestazione del
programma: "include Pl 6FB4A.lNC". ln seguito potremo dichiarare i nomi che
'14
ilrlefínE
15 tdefine tÉ 17
Pin-uscita Pin ingresso
2f
5 0RG sTf,TUS, RPE bsf bÉf Pin uscita Pin ingresso bsf sTfiTUS, BPB bcf goto GIGLo
2x
24 25 :É 27
28 ztl
IHIZIo:
CICLI
38
3f
Consiqli prntici
Els)
ffi
PoflTB,g PoRTfi,l
OBG goto
22
include "P16F84-I}E"
;Iipo rli dispositiuo ;Definizione dei registri
6 ;Definizione dei registri di carattere generale .: ?, EQU 0xBc I fiUX 0x8d I C0HTAT0RE EqU :t*::DfiT0 EQU B*0e
fF t? zs
p=16F84
5
vogliamo ai nostri registri di lavoro, che si trovano a partire dall'indirizzo 0x0c.
1Í
LIST
Ú
IHIZIo
;Fine de1 prograrEHl
re Oltre ai byte e ai bit, possiamo nominare anche i piedini reali delle porte. Come possiamo vedere nominiamo RB) come Pin_uscita e RAl come Pin_ingresso, usando I'istruzione "define". Ora nel nostro programma faremo riferimento a questi nomi, senza /a necessità di ricordare in che piedino si trovavano. ll presente esempio non è un programma utile, ma solo una dimostrazione di utilizzo delle definizioni.
ĂŹĂŹ,
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 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 che si trova alla fine del circuito, e permette di ottenere un buon segnale a livello TTL.
*t* 7 RI
R2
220
47k
4Ol
OĂł
Seonqle
di ingresso per il PIC ;
--*-*.,*"*"*"**t
! f
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
Sensore n
Gonsigli preilici
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 la presenza di ostacoli senza la necessitĂ di dover entrare in collisione con essi.
PL óO \\.\\!!1rlrrf
rllll,liillirl:iillì%.ir6@
*Jru
@"
'ffi #,€
# il-****-- '"'-: "
2
LIsl p*'t6F*4 ,; ;TtFo rll dliposlti$o 4 *P16FgtA.lN6" iilútud€ $ ;D*finirlonf úrt rÈglstrX * f ;flsgistri di qtillaao gen€ralP I :S f,01{lAr0EÉ €QU SxSc ts
fS
ll programma consiste in un contatore che utilizza la porta B per portare il risultato su due LED della scheda di ingressi e uscite, e RA) come ingresso per i segnali da contare (sequenza 0-1-0). ln questo caso configuriamo rl registro OPTION con il quarto bit a '1' per assegnare il prescaler al Watchdog invece che al Timer).
l9 lS lHtzto
19 2E t7 Èt ?S ?*
Realizziamo un programma tn cui approfitteremo delle risorse interne del microcontroller: il Watchdog e il modo Sleep. Vogliamo realizzare un modo semplice per evitare i rimbalzi utiltzzando queste due risorse, invece di impiegare i temporizzatori, come abbiamo fatto fino ad ora. Per prima cosa selezioniamo il dispositivo e includiamo il file di definizione dei registri.
0RG$* gots II{IZI0
0R8
btf $1*fUS, RP6 PoTRB clrf PoBTR,o bsf noul.t', b'$SS91111' Ítou$lf 0f lt0t{-SEG $leTirs' FPS bcf
È6.' ; ****************ti******t*s*****i*******f
27
ti CIcL0 ** Aú {t **,[I[Lll2 $$ tlr t5 é *? ** sf *s
:è1
*
,
s
J
Lf***r
btfss FllRlf, 0 goto 0lct0 51e€P
ùtfsc fGglg, S loto CISL$2 slesp
incf eflHlnroRg, F s6{f Cl}HTfit0Ag, $ 6sù|'f PCRTS grto cleto fl$
;FlÍs del
prsgritmtllil
{,4 ;ù*ffitrÈ**iÈ*fft*t****ff*tttt*fÈ*Éfrrar*****É**H*t!
Gonsi
Ciclo principale del programma. Ogni volta che c'è un cambio di stato, mandiamo il microcontroller in stato sleep. Quando il Watchdog andrà in overflow il microcontroller riparlira, continuando I'esecuzione del programma. A quel punto il segnale di uscita dell'interruttore si sarà gia stabilizzato.
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.