Sei sulla pagina 1di 14

Conversione di dati analogici

ossiamo affermare che il PIC 1 6FB4 è un re un PIC che contenga un convertttore, ad esemplo
microcontroller povero ma essenziale, perché uno della gamma dei PIC 16FB7x.
nonostante le scarse risorse di cui dispone al
suo interno, permette la realizzazione di 3t rr4ff#LJLS effifl/Set
un'infìnità di applicazioni molto utili. ll convertitore che utilizzeremo ha come sigla PCF8591
Comunque, che cosa succede quando le risorse di cui e si collega al PIC tramite le linee del bus l2C, SCL e
abbiamo bìsogno non ci sono nel PIC? Anche se la filo- SDA.
sofia dei microcontroller è funzionare come sistemi Nella figura possiamo osservarne l'aspetto.
chiusi. dipendendo cioè, unicamente dalle risorse inter- tindirizzo a cui dovrà fare riferrmento il master è deter-
ne e senza connessione ad altri dispositivi, esiste la pos- minato dal codice 1001, stabilito in fabbrica, ha tre bit
sibilità di comunicare con periferiche che apportino che dipendono dai valori assegnati alle linee A0, A1 e
quello che i PIC non hanno. 42, che nella figura sono collegati a massa.
Proviamo a fare uso di queste caratteristiche, per ll bit meno sìgnificativo degli indirizzi indica se si va
disporre di un convertitore che si incarichi di trasforma- a leggere (1)o se si va a scrivere (0) sul dispositìvo'
re valori analogici ìn valori digitali che possano essere ll circuito si comporterà come un convertitore analo-
processati dal PlCl 6F84. gico/digitale a B bit, convertendo i valori che arrivano
In ogni caso, la scelta più sensata sarebbe seleziona- tramite le linee ANO, ANl, AN2 e AN3. e passando il

ll modulo ADCIDAC PCFB591

wfr|l&ùliÌtrl@s@Wsflfr1f]W]i@1ù[Wl#,à@wN'd]slùùuÌ
nx#x*,xm,m*ffix*
risultato come valore binario al PlC. Inoltre può funzio-
nare come un convertitore digitale/analogico, conver-
tendo ilvalore binario che fornisce il PlC, in una tensio-
ne che esce tramite AOUT. I segnali di massa e di riferi-
mento si collegano ai pin AGND e VREF.
A seconda delle caratteristiche della tensione di rife-
rimento si otterrà maggiore o minore precisione.

h5ilffi {EHE{:} Fffi #$F#lS} {3


ll programma deve solo prendere un valore e mostrarlo
convertito. lmmaginate che il parametro sia quello di
una temperatura o di un sensore di luminosita, e che in
funzione del valore si debba attivare un ventrrarore, un
termoconvettore, una luce, ecc.
Affrontiamo quindi il lavoro per parti, e dedichiamo-
cr, per ora, solamente alla conversione.
Sarà tanto semplice quanto realizzare un crclo di let-
tura sul dispositivo PCF859'1. Se si prende come tensio-
Orga n ig ra m ma d e I I' esercr zi o p ro posto

ll programma legge il valore analogico presente sul canale 0,


ne di riferimento 5 V la risoluzione per bit sarà di 20
lo converte in digitale e lo mostra tramite i diodi LED, mV, come conferma l'equazione della figura e come
5i utilizza il bus 12C per mettere in comunicazione il PIC con
risulta anche dalla tabella in cui ogni incremento di 20
mV aumentera di 1 il valore binario
il dispositivo convertitore,
Come mostra l'organigramma, dal modulo prrncipa-
le si configurano solo ie variabili che si vogliono utiliz-
Lnunc ia to dell' eserc izio propost o
zare e si eseguono le chiamate alle differenti funzioni,
che saranno quelle che sup-
porteranno il carico reale
del programma. ll modo
Vref + 5-O 5
in
Risoluzione = -Vref- =-=-= 20 mV/bit cui queste funzioni si realiz-
2 Ne bir
28 256 zeranno dipenderà dal
dispositivo: raccomandia-
mo di leggere sempre le
specifiche tecniche per
seguire r passi ed i tempi
indicat dal costruttore

$3ffi##ffiÀ*,4 ffiA
Dopo la definizione delle
variabili dovremo includere
un file con le routines di
gestione per il bus l2C che
sdrdÍrÍlo ,,+ili---+^
uI'|tzzale ptu
^i,', avan-
ti. Configureremo la porta
A come uscita, utilizzando
le quattro linee meno signi-
ficative per acquisire parte
Equazione che da la risolutione di un convertjtore e ld relaLivà tabellò.
del valore convertito, cioè i

e p *qg
ry fi $ccw ry €__ffi.trtrR# ffi ff
LIST P=f6F84A ; Tipo di processore
INCLUDE "P16F84A.lNC' Definizione dei registri interni

EQU .4000000 Frquenza di lavoro

l2c_var EQU 0xOt lnizio delle variabili per le routines I2C-L0W


A_inp EQU 0x12 Risultato deila conversione AD di ingresso

aux EQU 0x13 ; Variabile ausiliaria dedicata al dato binatio

ORG 0x00 ; Vector reset


goto lnizio

INCLUDE 't2cLow.tNc" ; lnclude le routines di gestione del bus l2C

A_lnput call Txt_5tart_Bit ;Trasmette la sequenza di inizio


movlw b'10010001'
movwf DataByte
call Txt_Byte ; lndirizzo del PCF8591 (modo lettura)
bsf _Ultimo-Byte ; Riceve un unico byte pet volta
call RcvByte ; Riceve il risultato della conversione AD
call Txt_Stop_Bit ; Trasmette sequenza di ST0P
mov{ DataBvte,W
movwf A_inp ; Salva il valore della conversione
return

Visualizzare m0vT A ino,0 ; Spostiamo il risultato in W


andlw b'0000111f' ; Lavoriamo con la parte bassa del registro
movwf PORTA ; e la spostiamo sulla Porta A
m0vî A-inp,0 ; Spostiamo nuovamente il risultato in W

andlw b'11110000' ; e lavoriamo con la parte aÌta


movwf aux ; spostandola su di un registro ausiliario
swapf aux,0 ; Cambiamo di posizione ai bit
MOVWT PORTB ;e li portiamo sulla Porta B

return

lnizio ctrf PORTA

clrf PORTB

bsf STATUS.RPO ; Seleziona il banco î


movlw b'00000000'
movwf TRISA ; RA0-RA4 uscite
clrf TRI5B ; Porta B uscita
m0vlw b'î0000110' ; Prescaler di 128 per ilTMR0. Pull-up 0{f
movwf OPTION REG

bcf STATUS.RPO ; Seleziona il banco 0

call lnizia Bus ; lnizializza il bus t2C


t
-'-'"-....-.="=..-:.-'"-."=
Programma nsolto
;il.
loop ; Resetta iIWDT
; Ottiene ilvalore di conversione ADC
lJ:ri-'.,, ;Visualiza sui LED il risultato

Prog ra m m a ri solto (co


il
nti n uazi one).
:;""'"
; tine del programma

quattro bit meno significativi del numero. Allo stesso valore convertito dalle porte A e B, nel modo prece-
modo la porta B acquisirà la restante parte del numero, dentemente descrrtto. ll modo di realizzare la comuni-
vale a dire i4 bit più significativi. Inoltre, le linee RB6 e cazrone con il convertitore viene indicata dal fabbrican-
RB7 saranno utilizzate per la comunicazione con il con- te di quest'ultimo
vertitore 12C. Dopo un bit di inizio dobbiamo indirizzarlo, indican-
La routine "A_input" legge il valore binario che arri- do se vogliamo leggere o scrivere, Nel nostro caso stia-
va dal canale 0 dell'ADC contenuto nel disoositivo mo leggendo, dato che stiamo cercando di acquisire la
l2CPCF8591. La subroutine "Visualizzare" prende il conversione di una tensione analoqica a binaria.
l/^^-;^^^
L
A, )Lr
rc ur
up4rur --.1++,,.^
rLLuro p€l' qUeStO
dispositivo consiste nel fargli pro-
Iniziqlizzozione durre la tensione corrispondente
PA uscito al valore binario che introducia-
P3 uscitq
TMR.O mo.
Dato che inviamo solo un byte,
se ne vogliamo conoscere il valo-
Ghiede il volore re, e leggere rl valore convertito,
dello conversione
possiamo fermare il seguito della
sequenza.
Tutte nrreste roiltines sono
Vqlore = X? Sl raccolte nel file "12CLOW.lNC".
Invece di utilizzare le porte A e B
per acquisire il valore della con-
versione in un modo così ricerca-
to, si potrebbe optare per l'uti-
lizzo di un altro dispositivo,
Vqlore >X? Spegnere il ventilotore
anch'esso l2C, a cui passare il
dato con due soli f ili, e que-
Spegnere Spegnere st'ultimo visualizzerebbe il dato
il riscqldcmento il riscaldqmento
su dei LED.

Accendere il vedilgtore Spegnere il ventilotore FIUOVA PROPOSTA


Proponiamo ora una modifica
all'esercizio precedente.
Accendere
il riscoldomento A seconda che il valore sia
crrnorinro inforinro
,_,- n_ uguate ao
uno preso come riferimento, si
Organigramma della nuova proposta
accenderà un riscaldatore, un
ventilatore o si spegnerà tutto.

,*nnl i r,nx:g#ffi :gt,i s,ff ,,-.,,',


Comuni cazione
fra dispositivi
d#re osì come abbiamo visto con il convertitore SCL e SDA il
ffi DAC/ADC PCFB591, esistono molti altri m icrocontroller
dispositivi predisposti per comunicare con il
ffi manda al dispo-
ffi
'i m
bus l2C. Questo ci fornisce la possibilita di
t^.,^-^-^-^" 256 elementi con un impiego
sitivo l'informa-
3/8 di Vcc
"* - --.r zione da visua-
minimo di linee, nella fattispecie due. In questo caso lizzare. Dei
5/8 di Vcc

vogliamo aggiungere alla f unzione di conversione, sette bit di indi-


quella di visualizzazione. Per fare questo utilizzeremo rizza i rinnr ra
più Tabella che determina i due brt meno
contemporaneamente due dispositivi l2C, in modo che significativi
sig n if icativi del I' i nd i rizzo.
i dati generati da uno, passino all'altro. La comunica- <nnn nrodotar-
zione fra entrambi i dispositivi si realizza tramite un minati in fab-
microcontroller, il PIC 1 6F84. brica come "01110" e i due successivi sono stabiliti dal-
l'utente secondo la tensione applicata al pin 1 (ADR), la
HL fl#r4YR#$_L#ffifi $3s ffirSFLeY SeAs*64 cui corrispondenza si trova nella tabella allegata.
Questo integrato e capace di pilotare fino a 4 display a Uultimo bit, e quello di lettura (1) o scrittura (0) del
7 segmenti. ll suo impiego è semplice: sostanzialmente, dispositivo. ll SAA1064 f unziona come un multiplexer,
dobbiamo ìnviare la combinazione binaria corrispon- attivando consecutivamente i display 1 e 3 e i display 2
dente ai segmenti che vanno attivati per ognuno dei 4 e 4. Se questo si fa con una velocita adeguata, sì pro-
digit. Per farlo funzionare con i suddetti display si puo voca la sensazione ottica che i quattro display siano atti-
collegare come mostrato nella figura. Tramite le lrnee vati in modo continuo. ll circuito dispone inoltre dì fun-
zioni di reset, test, controllo di lumi-
UI nosità, ecc.
SAAr 0ó4
Dir=Olll0llr/w
ESERCIZIO PROPOSTO
Questo programma è simile al primo
che abbiamo realizzalo con il conver-
titore, cambia solo il modo di offrire il
risultato finale, che sarà un valore
compreso fra 0000 e 0255, rappre-
sentato sui quattro d splay a 7 seg-
menti. Ancora una volta il programma
principale è incaricato di eseguire le
chiamate alle diverse funzìoni, che
DtG4 F realizzano realmente il lavoro. Le spe-
..;_ ., ,e!

-s-4 ,r-l;:l
1...É{ cifiche di questo dispositivo indiche-
',4lJ+-@;ì
4:
4, ' l.gE
|4-+4 ranno il modo con cui si realizzerà la
+-L'.'+:: r ...ì comunicazione fra essi e il PlC.
543óil t'

PROGRAMMA
ll programma principale è molto simi-
ll SAA| 064 collegato a quattro display a 7 segmenti
ìe a quello del convertitore che abbia-

taa:aaaaaatLaaa:aaaaaaaaa,aaatltt\j111::11:::a:;;::;lll\l::ìlì{lflHiPr:r.ir::r:-ìììihÀ*11r!ì3!rì111!ì!ìì:
$cffware
o3

lniziolizzozione
ll progrommo legge il volore onologico presenf,e PB uscite
sul conole 0, lo converte in BCD e lo moslro lromi$e TMRO
quoitro disploy o 7 segmenti. 5i utilizzo il bus l2C
per mettere in comunicozione íl PIC con il dispositivo
convertitore e con il conhollore di disploy.

€hiedere vqlore
Fnunc Ìa to del I' eserciz io propos Lo dello conversione

mo gra visto. Si richiede l'acquisizione di un valore ana-


logico convertito a binario, qJesto valore binario si co"ì- Convertire q BCD

verteinBCD,chetornaaconvertirsiqUeStavo|tain
codice a 7 segmenti, per rappresentarlo sui display. Si
utilizzano come linee di l/O solo le due corrispondenti al .

bus|2C,situatesu||aportaB,chesonocondiviseconi Converlire o 7 segmenli


due dispositivi utilizzati. Come routines nuove abbiamo :

nrrallo Ài ttcttzltzztztnne del datO, di COnVefSiOne del ,

dato del codice binario BCD e quella di decodifica del ,

numero BCD. Visuqlizzore


Per la conversione del dato a BCD si parte da un
:

va ore memotzzalo nel regìstro di lavoro W che è con- :

vertito in codice BCD e memorizzato nei due registri da


Òrn.nínrsmms dol l a<arci zìa
^rÒnÒ<rÒ
Bbit,inmodocheinogniregtstrocisianoduedigit'

u5T P:l6F84A ; Tipo di processore


INCLUDE 'P16F84A.rNC" : Defínizione dei reqistri interni

CLKIN EQU .4000000 ; Frequenza di lavoro

12c-vat EQU 0xOc ; lnizio delle variabili per la routine I2C_LOW


Digit_1 EQU 0x'12 ; Buffer di uscita dei 4 digit per il 5AA1064
Digit 2 EQU 0x13
Digit 3 EQU 0x14
Digit_4 EQU 0x15
A_inp lQu 0x16 ; Risultato della conversione AD di ingresso
Buffer_H EQU 0x17 ; Risultato della conversione in BCD
Buffer_L EQU 0x18

ORG 0x00 ; Vedor reset


g0r0 Inizio

INCLUDE "12cLowlNc" ; lnclude la routine di gestione del bus l2C

A_lnput call Txt*Starî-Bít ; Trasmette la sequenza di inizio


movlw b'10010001'
movwf DataByte
call Txt_Byte ; lndirizzo del PCF8591 {modo lettura)
bsf
-Ultimo*Byte ; Riceve un unico byte per volta
call RcvByte ; Riceve il risultato della conversione AD
call Txt*Stop_Bit ; Trasmette la sequenza di 5T0P
movf DataByte,W
movwf A_inp ; Salva il valore risultante dalla conversione
return

í;-,+.É+=-:'1rSaE:::.=
:,

ììì:

Visualizzare call Inizia*Bus ;lnizializza la linea del bus l2C


call Txt_Start_Bit ; Invia il codice di inizio
ilOVIW b'01 1 101 1o',

movwf DataByle
call Txt_Byte ; Trasmette I'indirizzo del dispositivo {scittura)
drf DataByte
call Txt_Byte ; Trasmette il byte di istruzione
movlw b'010001 1 1'
movwf DataByte
call lxt Byte ; Trasmette byte di controllo
movf Digit_1,W
movwf DataByte
call Txt_Byte ; Trasmette Digit 1

movf Digit_2,W
movwf DataByte
call Txt-Byte ; Trasmelte Digit 2
movf Digit_3,W
movw{ DataByte
call Txt_Byte ;Trasmette Digit 3
movf DigiL4,W
movwf DataByte
call Txt_Byte ; Trasmette Digit 4
call Txt_5lop_Bit ; Trasmette la sequenza di 5T0P
return

Bin,bcd clrf Buffe_L ; Cancella i registri di lavoro


clrf Buffer_H

Bin bcd 'l addlw UXTb ; Sottrae 10 per somma di complemento a 2


btfss 5TATU5,C ; I presente il Cany?

90î0 Bin_bcd_3 ;N0


movwf A-inp ; 51. Scivilo nel registro temporale
incf Buffer_L,F ; Incrementare byte basso, scriverlo e inviarlo...
movf Buffer_L,W .,, al registro W...
xorlw b'00001010' ; ... xor di OAh con W (BCDL)
btfss STATUS,Z ; ll risultato di questa operazione è zero?
goto Bin_brd_2 ; N0.
clrf Buffer-L ; Sl. Canrella il byte basso e,,,
incf Suffer_H,F ; incrementare quello alto.
Bin_brd_2 movf A_inp,W ; Recupera il dato.
goto Bin_bcd_1 ; Continua le operazioni.

Érn 0c0 J addlw H'OA ; TEMP0 + OAh


swapf Buffer_l,F i <3:0> <==> a7;4v g ==> BCDL
ionivf Buffer_L,F ; W o BCDL ==> BCDL
return

Un_Pack swapf Buffer_H,W


call BCD_7seg
movwf Digit'1 ; Converte il nibble piir significativo del Buffer-H
movf Buffer_H,W
call 3(D_7seg
movwf Digit_2 ; Converte il nibble meno significativo del Buffer_H
swapf Buffer_L,W
call BCD_7seg
movwf Digit_3 ; Converte il nibble più signi{icativo del Buifer_L
movf Buffer_L,W
call BCD_7seg
movw{ Digii_4 ; Converte il nibble meno signi{icativo del Buffer-L
return
Prog ra m m a ri solto (cont in u azion e).

Prima di poter visualizzare il risultato, dobbiamo


dividerlo in quattro digit o decodificarlo, e trasformare
ognuno di essi nel suo corrispondente codice a 7 seg-
menti. La routine dtvisualizzazione è ouella che utilizza
il dispositivo SAA1964. In essa, dopo il bit di inizio e il
suo indirizzamento per la scrittura, si invia la funzione
che si vuole eseguire. Di seguito si trasmettono. ad uno
ad uno, idigit da visualizzare, gia convertiti rn codice a
7 segmenti.

NUOVA PROPOSTA
Pensate a una nuova possibilità: ad esempio, che ve ne
pare di disporre di diversi sensori, uno per ogni canale
del convertitore, e scegliere quale convertire a seconda
del valore dei due interruttori? ll risultato puo essere
mostrato tramite dei LED, o con l'aiuto del nuovo dispo-
Organigramma della nuova proposta
sitivo che abbiamo aooena conosciuto.

Soflwsre
AP 05

Appticazione pratica:
comunrcazlOne con
o o
it computer
.'''' e l'utilizzo della tastiera e
dell'lCD come neriferiche
1...-'.
di un PIC vi sono sembrate
una grande invenzione,
î-^^++a+^'-.li',^'J^"^
d5peLLdre ur veuere cosa
abbiamo preparato in questa occa-
sione: niente più e niente meno che
la comunicazione del PIC con il com-
nltter Per ouesto lrtilizzeremo un
canale RS-232 che comunrca rn
modo se'iale con la porta del PC
Vcc
Orrest'rrltimo orazie al software
HyperTerminal (Hypertrm) fornito da
ll piedino RB4 del PIC sarà la lìnea di trasmissione dei dati, e il piedino RB5 la
Windows, si comporterà come un linea di ricezìone. Nel connettore DB9 del (ompurcr saranno i pin 3 e 2 rispettivamente.
Lerminale di comunicazione. ll cavo seriale che unisce il computer con il PIC tramite rl MAX232 deve avere le linee
di trasmisstone e di ricezione tncrociate, dato che quello inviato dal PIC tramite la hnea di
trasmissione deve arrivare alla periferica sulla linea di rìceztone e vrceversa.

Per fare comunicare il PIC con il com-


L---+- ,,+ili---"^ 5i desidera controllare, famite un teminale, una serie di dispositivi di allarme quali possono essere i
^,,+^r' ItUI
PULtrl ^^^ Ud)Ld U||t/ót E l^
rU .r^..^
)rC)rU
/,ti^^,,î^^i^, diodi lED, che mostrano in ogni momento la situaziole di diversi sensori. 5i seguirà la seguente tabella:
ilngua9gro, ma oevono ,..t
es5ere
uguali anche isuoi livelli elettrici. TASTO AZIONE
Per otîenere orresîo si utilizza il a pericolo di incendio

rircttita intonr:tn N/AY7?7 iì nrr:ìo A N0 pedcolo di incendio

hr il rnmnitn Ài rnnuarfiro ilirralli lnni- 0 pericolo intrusi


P N0 pericolo intrusi
ar I tl nrn\/onronîr fl:t HI( : il\/a ìl
5PC scollegamento
lnniri
rwvrLr P(--)?f
r\J-zJZ, rha
Lr rE ci rnnlirrn^
)r oPPilLoru ìl LUr
or .^n r-
npffnro dol rnmnrrfor Premere uno di questi pulsanti farà cambiare lo stato delle linee RB3-R80, quelle che ci
mosttano lo stato dei sensori. Dato che abbiamo due lED per ogni situazione di allarme al posto di uno,
dobbiamo assicurarci che i LID spenti lo siano per errore del sistema e non
per problemi di montaggio del circuito. Solo nel caso di "disconnessione" non ci sarà alcun IED acceso;
in tutti gli altri casi dovranno esserci due LED su quattro accesi nella posizione adeguata.

USCITA ALTARME
RBO pericolo incendio
RBl N0 perkolo incendio
RB2 pericolo intrusi
R83 N0 pericolo intrusi

ll PIC oltre a mostrare le informazioni tramite i LED fornirà il tipo di situazione al terminale perché sia
mostrata in video.
)^,,^ ^,,^-^ t-
ttt1 (dvo -^-:-1^
--,.^ sel Hte OeVe àVete le
linee di trasmtssione e riceztane tncroctale Lnunciato dell esercrzio proposrc.
i

Quando è il computer che manda


i dati al PlC, il MAX232 ha il compito
di fare la conversione inversa.
Nella figura possiamo vedere i

pochi componenti esterni di cui ha


bisogno questo chip per lavorare.
Comp vpdete le nossibilità che offre
Alfendere
lc ricezione la comunicazione con un computer
di un cqrqllere
sono enormi. ll PC potrebbe trovarsi
in una abitazione, e il sistema di con-
trollo in un'altra, anche a notevole
0 rsta nza.
Òltra : np<fira doi comnliri IFT)
Accendere
notrémo anche movimentafe
: --!.

RBO HS Un
Spegnere
RAI microrobot per realizzare un lavoro. o
Actendere
RBI E'O? un sistema di riscaldamento che si
Spegrere
RBO
attiverà o drsattiverà a seconda degli
ActendeÉ ordini dell'utente o delle ore del gior-
RB2
Spegnae o no.
RE3
Lo schema, in questo caso, non si
Aceendere
RBit È"r limita agli elementi da collegare al
Spggnere
nB2 PlC, ma si estende sino alla connes-
Atcendere sinnp rnn il rnmnrrter ll modulo che
R8O, RBI,
rB2, Rg3 appare nella figura come canale RS-
232 è mostrato in dettaglio in una
finrrra nrarodonta

'+; ftrr* ízÍ:iltie"ú & rÍi. l'u +


Visuelizzore mesroggio
Dopo aver confrgurato le linee del PIC
e il resto delìe
come ingressi/uscite,
periferiche in modo adeguato, sì
attende di ricevere un carattere.
Si verificano ad una ad una tutte
le possibìlità di attìvazione di una
I .i!
f:<tiora o e qornnd: ,-- Ài
ur nrrrli +rc+i
vuoil Lo)Ll
sono stati premuti, si accenderanno o
<i )pEVr
)r <nonnor:nnn
rEroril rv iI ILLU --l^a' ' -+i ca ri
Flì dUcVUdtl )l
manderà un messaggio sul monitor
che visualizza la situazione attuale del
sistema.

i.: i;i j.': i': i'l .:i1


= ::"jl ;r!
ll programma, anche se lungo, è
+--;t^,l- --^;"^ q.
toLItE uo loPil
Le variabili definite all'inizio del
programma sono necessarie per la
comunicazione seriale. In seguito si
definìscono i differenti messaggì da
O rga n ig ra m ma del l' esercizi o proposto.
visualizzare, in modo simile a quan-
i

ìÌi

,rll

u5T P=15F844 ; Tipo di processore


INCLUDE "P'l5F84A.tNC" ; Definizione dei registri interni
CTKIN EQU .4000000 ; irequenza di lavoro
BAUDE EQU .9600 ; Velorità di comunicazione
T-MODO EQU 1 ; îrasmette il primo bit t5B
R MODO EQU 1 ; Riceve il primo bit l5B
T-Nbh EQU ó ; Trasmette caratteri da 8 bit
R_Nbit EQU 8 ; Rkeve caratteri da 8 bit
Sbit EQU ; Trasmette 2 bit di stop
RS232,var EQU 0x{)C ; Inizio delle variabili per routines R5232
Contatore EQU 0x1'l ; Variabile rontatore di mesaggi
0ffset EQU 0x12 ; Spostamento dei messaggi
Temporale_1 EQU 0x13 ; Variabile temporale
Temporale 2 EQU 0x14 ; Variabile temporale
ORG 0x00 ; Vector Reset
g0r0 tNtzt0
ORG 0x05 ; Salta il vedor di intenupt
Mess_0 EQU ì
DT "5collegamento ",0x0d,0x00 îorondn ns<<o nol la
Mess_1 EQU
DT "Pericolo Incendio ",0x0d,0x00 co nfig u razio n e del prog ra m m a
Mess_2 EQU terminale "Hypertrm".
DT "No pericolo incendio ",0x0d,0x00
Mess_3 EQU
DT "Condizione nulla ",0x0d,0x00
Mess 4 EQU
DT "Perkolo intrusi ",0x0d,0x00
Mess_5 EQU

Mess_6
DT
EQU
"lncendio/lntrusi ",0x0d,0x00
Q*,*"'***
-_

DT "lntrusi/No incendio ",0x0d,0x00 '-qLde dh+r@ rMH. edù@6c!rud,É


Mess 7 EQU .---*:!
,ddr*H# l.*
DT "Condizione nulla ",0x0d,0x00
Mess_8 EQU
DT "No Pericolo intrusi ",0x0d,0x00 N@iqdrȀl@r I
Mess_9 EQU
DT "lncendio/No intrusi ",0x0d,0x00
Mess 10 EQU
DT "No incendiollntrusi ",0x0d,0x00

INCLUDE 'RS232t0W.tNC', ; Include le routines di comunicazione

; A seronda del valore contenuto Secondo passo nella


nel registro W, viene fornito
il carattere da visualizzare
configurazione
del programma terminale " Hypertrm"
pat
Tabella,Messaggi movwf ; Calcola lo spostamento sulla tabella
; dei mesaggi: Questa routine invia
tramhe RS232 il mesaggio
il cui lNlZlO è indicato to fatto lavorando con il display
; nell'actumulatore. La fine di un
LC D.
messaggio si determina mediante
il codite 0x00 ll file "RS232LOW.lNC" contie-
movwf Temporale ; Salva posizione della tabella
MESSAGGIO
Mesaggio_1 movf Temporal_1,W
1

; Recupera posizione della tabella


ne le routines di cornunicazione,
call Tabella_mesaggi ; Cerca carattere di uscita per l' nvio e ricezione dei dati; dato
movwf Temporale_2 ; Memorizza il carattere
movf Temporale_2,F che il PIC 16F84 non ha queste risor-
btfss
goto
SîATUS,Z
Non è ultimo
; Controlla se è l'ultimo
se i'np err^entate nel 'hardware,
return flrpq-p onor:zinni devono eSSere
Non_è ultimo movwf Txdreg
txu
no<tito iri: cnftrnr:ro
call ; Trasmette il carattere
incf Temporale l,F ; Carattere successivo In segurto trovramo la routrne
g0to Mesaggio_1
inca.icata dr rasmettere il nîessag-
lNtzl0 drf PORTB ; Scollega uscita gio che fa uso della rour ne "TxD ",
bsf STATUS,RPO ; Selezione banco 1 dei dati
movlw b'10001111', ; Prescaler da 128 per il WDT, Pull,up contenuta in " RS232LOW", e invia
movwf OPTION,REG
un byte (un solo carattere) ogni
movlw b'1 1 1 00000' volta che si chrama. La chiamata
movwf TRISB ; RB5 ingresso e RB4-RB0 uscite
bcf STATUS,RPO ; Seleziona pagina 0 dei dati alla routine inversa, la "RxD", si
LOOP clrwdt
call RxD Attendi la ricezione di un carattere
trova ne programma prncrpa e.
movlw
,n,
;
essa c î'oínera del tasro p"e.^uto.
Dopo aver verificato di quale
ffiJ :JSf-ìl
sublvf Rxdreg,W
.È ,rl'?
btfsc STATUS,Z
goto INCENDIO
bryFry.#b@'bl
m0vtw
subwf Rxdreg,W
btfsc STATUS,Z ;E,A?
goto NO_INCFNDIO ;Si
,0,
m0vtw
subwi Rxdreg,W
. È ,n,r
btfsc STATUS,Z
g0î0 INTRUSI ;Si
m0vtw 'P'
subwf Rxdreg,W
btfx
g0r0
STATUS,Z

NO_INTRU$

;Si
,P'?
sffi .4rt&. .l

movlw Terzo passo nella configurazrone


subwf Rxdreg,W oet programma
btfsc SÎATUS,Z ;È"? terminaIe "Hypertrm".
goto L00p ;No

SCOLLEGAMENTO bcl PORTB,O

bcf PORTB,l ÍdE Motu {M@d f)d lrafu ?

bcf PORTB,2 ù1,Él d13l s1ì5f etl


bcf PORTB,3 ;Scollega uxite
g0r0 Test_Mess ; Determina il mesaggio da dare
INCENDIO bcf PORTB,l ; Scollega RB1
bsf PORTB,O ; Collega RBO

g0t0 Test_Mess ;Determina il mesaggio da dare


NO-INCENDIO bcf PORîB,O ; Scollega Rgo
bsf PORTB,l ; Collega R81
g0r0 Tel_Mess ; Determina il messaggio da dare
INTRUSI bcf PORTB,3 ; Scollega RB3
bsf PORTB,2 ; Collega RB2
goto Test_Mess ; Determina il messaggio da dare
I ìl
.ffi.omg Atuer 4@@
NO_INTRUSI bcf PORTB,2 ; )coilega xbr
bf PORTB,3 ; Collega RB3
Ora si puo iniziare
goto
.:-^,,^.^ /; udll,
^ //Lcvg/t
a iltvtalÉ u )-+,
Test Mess ; Determina il mesaggio da dare

;0ra procediamo a determinare il messaggio


di uscita sul terminale +--+^ -i +.-++î
td)LU )t -i i-^:StanO
Lt oLLo, )t [|P\ ibit di
; Per questo in base al contenuto della
PORTA B si cakola l'offset
spnnalazionp serondo la tabella
; del messaggio da fornire tenendo conto che vista nell'enunciato del program-
i messaggi iniziano a
; partire dall'indirizzo 0x05 ed hanno una
ma, e si procede a determinare
lunghezza fksa di 20 (aratteri. -r- :til rìc))dgvrL
^, -l^ )rd
qudrtr ^^---^^t) da inviare al
term ina le.
Test_mess movlw 0x0a
movwf Contatore : lnizializza contatore di messaggi
movlw Mens_10
0ffset
Per fare funzionare il programma
movlvf ; lndirizzo dell'ultimo messaggio
Mess_loop movf PORTB,W
andlw b'00001 1 1 1' ; Legge il valore attuale della PORTA B sorlo necessari, oltre al PIC e ai LED,
v" plpmonli viqti nolln crhpm: nono-
subwf Contatore,W
nli
btfsc sTATU5,Z ; Conisponde al messaggio da fornire?
-'-'
goto Uscita_mess ;sì ra le.
m0vtw .20 Donn ,aver r-ollen,r{g il PIC con il
subwf 0{fsei ; No, punta al messaggio precedente
decf Contatore,F
compuler, chiameremo il programma
g0r0 Mess_loop ,)Y-'.'
" l--lrinorirm
, " o ln rn
--'nf"tgureremo per
Uscita mess movf 0ffset,W
fare in modo che segua gli stessi
call MESSAGGIO ; Uscita del messaggio appropriato
goto LOOP narametri del P C nella corrìunrcazto-
ne (porta, velocita, ecc.).
END ; Fine del programma sorgente
ln <onrritn nntromn tntTtAro A 6(a-
,r--^+i tr
rrtrrc pur)orLr ^ .,^,r^-e
vcucl Che COSa Ci
Drnaramma rì<alfn
risponde il PlC.

Potrebbero piacerti anche