Microrobotica Monty Peruzzo Editore - 11 B - Modulo di Controllo

Page 1

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&

/.:

,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

â‚Ź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

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

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

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

*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. Ăˆ 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.

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.


Turn static files into dynamic content formats.

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