Conversione di dati analogici ossiamo affermare che
il
PIC
1
6FB4
è
un
microcontroller povero ma essenziale, perché nonostante le scarse risorse di cui dispone al
suo interno, permette la realizzazione di un'infìnità di applicazioni molto utili. Comunque, che cosa succede quando le risorse di cui abbiamo bìsogno non ci sono nel PIC? Anche se la filo-
sofia dei microcontroller è funzionare come sistemi chiusi. dipendendo cioè, unicamente dalle risorse interne e senza connessione ad altri dispositivi, esiste la pos-
sibilità di comunicare con periferiche che apportino quello che i PIC non hanno. Proviamo a fare uso di queste caratteristiche, per disporre di un convertitore che si incarichi di trasformare valori analogici ìn valori digitali che possano essere processati dal PlCl 6F84. In ogni caso, la scelta più sensata sarebbe seleziona-
re un PIC che contenga un convertttore, ad esemplo uno della gamma dei
3t
rr4ff#LJLS
PIC
16FB7x.
effifl/Set
ll convertitore che utilizzeremo ha come sigla PCF8591 e si collega al PIC tramite le linee del bus l2C, SCL e SDA.
Nella figura possiamo osservarne
l'aspetto. master è deteril riferrmento fare tindirizzo a cui dovrà ha tre bit minato dal codice 1001, stabilito in fabbrica, che dipendono dai valori assegnati alle linee A0, A1 e 42, che nella figura sono collegati a massa. ll bit meno sìgnificativo degli indirizzi indica se si va a leggere (1)o se si va a scrivere (0) sul dispositìvo' ll circuito si comporterà come un convertitore analogico/digitale a B bit, convertendo i valori che arrivano tramite le linee ANO, ANl, AN2 e AN3. e passando il
ll modulo ADCIDAC PCFB591
nx#x*,xm,m*ffix* wfr|l&ùliÌtrl@s@Wsflfr1f]W]i@1ù[Wl#,à@wN'd]slùùuÌ
risultato come valore binario al PlC. Inoltre può funzionare come un convertitore digitale/analogico, convertendo ilvalore binario che fornisce il PlC, in una tensione che esce tramite AOUT. I segnali di massa e di riferimento si collegano ai pin AGND e VREF. A seconda delle caratteristiche della tensione di riferimento 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 dedichiamocr, per ora, solamente alla conversione. Sarà tanto semplice quanto realizzare un crclo di lettura sul dispositivo PCF859'1. Se si prende come tensioOrga
ll programma legge il valore analogico presente sul canale
0,
12C
per mettere in comunicazione il
ig ra m
ma
d e I I' esercr zi
o
p ro
posto
ne di riferimento 5 V la risoluzione per bit sarà di 20 mV, come conferma l'equazione della figura e come risulta anche dalla tabella in cui ogni incremento di 20 mV aumentera di 1 il valore binario Come mostra l'organigramma, dal modulo prrncipale si configurano solo ie variabili che si vogliono utilizzare e si eseguono le chiamate alle differenti funzioni,
lo converte in digitale e lo mostra tramite i diodi LED, 5i utilizza il bus
n
PIC con
il dispositivo convertitore, Lnunc ia to dell' eserc izio propost o
che saranno quelle che sup-
porteranno Vref +
Risoluzione =
2
-Vref-
Ne bir
5-O =-=-= 28
5
256
il
carico reale
del programma. ll modo 20 mV/bit
in
cui queste funzioni si realiz-
zeranno dipenderà
dal
dispositivo: raccomandiamo 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 ^i,', avansdrdÍrÍlo ,,+ili---+^ uI'|tzzale ptu
ti.
Equazione che da la risolutione di un convertjtore e ld relaLivà tabellò.
Configureremo la porta A come uscita, utilizzando le quattro linee meno significative per acquisire parte del valore convertito, cioè i
e
p
ry fi $ccw
*qg
ry
€__ffi.trtrR#
ffi
ff
; Tipo
di processore
LIST
P=f6F84A
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"
A_lnput
call
Txt_5tart_Bit
movlw
b'10010001'
; lnclude le routines di gestione del bus l2C
;Trasmette la sequenza di inizio
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
m0vT
A
; Spostiamo il risultato in W
andlw
b'0000111f'
; Lavoriamo con la parte bassa del registro
movwf
PORTA
; e la spostiamo sulla Porta A ; Spostiamo nuovamente il risultato in W
return
Visualizzare
ino,0
m0vî
A-inp,0
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
MOVWT
;e
PORTB
li portiamo sulla Porta
bit
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
movwf
OPTION
bcf
STATUS.RPO
; Seleziona il banco 0
call
lnizia Bus
; lnizializza il bus t2C
0{f
REG
t -'-'"-....-.="=..-:.-'"-."=
Programma nsolto
;il.
loop
il Prog ra m m
a ri solto
(co
; Resetta iIWDT ; Ottiene ilvalore di conversione ADC
lJ:ri-'.,,
;Visualiza sui
LED
il risultato
:;""'" ;
tine del programma
nti n uazi one).
quattro bit meno significativi del numero. Allo stesso modo la porta B acquisirà la restante parte del numero, vale a dire i4 bit più significativi. Inoltre, le linee RB6 e RB7 saranno utilizzate per la comunicazione con il convertitore 12C. La routine "A_input" legge il valore binario che arri-
va dal canale 0 dell'ADC contenuto nel disoositivo l2CPCF8591. La subroutine "Visualizzare" prende il
valore convertito dalle porte A e B, nel modo precedentemente descrrtto. ll modo di realizzare la comunicazrone con il convertitore viene indicata dal fabbricante di quest'ultimo Dopo un bit di inizio dobbiamo indirizzarlo, indicando se vogliamo leggere o scrivere, Nel nostro caso stiamo leggendo, dato che stiamo cercando di acquisire la
conversione
di una tensione
analoqica
a
binaria.
l/^^-;^^^ up4rur
A, )Lr --.1++,,.^ rc ur rLLuro p€l' qUeStO dispositivo consiste nel fargli produrre la tensione corrispondente al valore binario che introduciaL
Iniziqlizzozione PA uscito P3 uscitq
mo. Dato che inviamo solo un byte, se ne vogliamo conoscere il valo-
TMR.O
re, e leggere rl valore convertito, possiamo fermare il seguito della
Ghiede il volore dello conversione
sequenza. Vqlore =
X?
Tutte nrreste roiltines sono Sl
raccolte nel
file
"12CLOW.lNC".
Invece di utilizzare le porte A e B per acquisire il valore della conversione in un modo così ricerca-
Vqlore >X?
Spegnere
Spegnere
il riscqldcmento
Accendere il vedilgtore
Spegnere il ventilotore
il riscaldqmento
Spegnere il ventilotore
Accendere
il riscoldomento
to, si potrebbe optare per l'utilizzo di un altro dispositivo, anch'esso l2C, a cui passare il dato con due soli f ili, e quest'ultimo visualizzerebbe su dei
,*nnl i r,nx:g#ffi :gt,i s,ff
,,-.,,',
dato
FIUOVA PROPOSTA Proponiamo ora una modifica all'esercizio precedente.
A seconda che il valore sia rnorinro inforinro ,_,- n_ uguate ao preso uno come riferimento, si accenderà un riscaldatore, un ventilatore o si spegnerà tutto. cr
Organigramma della nuova proposta
il
LED.
Comuni cazione
fra dispositivi osì come abbiamo visto con il convertitore DAC/ADC PCFB591, esistono molti altri dispositivi predisposti per comunicare con il bus l2C. Questo ci fornisce la possibilita di t^.,^-^-^-^" 256 elementi con un impiego "* - --.r minimo di linee, nella fattispecie due. In questo caso vogliamo aggiungere alla f unzione di conversione, quella di visualizzazione. Per fare questo utilizzeremo contemporaneamente due dispositivi l2C, in modo che i dati generati da uno, passino all'altro. La comunicazione fra entrambi i dispositivi si realizza tramite un
d#re ffi ffi ffi 'i m
microcontroller, il
PIC
1
6F84.
HL fl#r4YR#$_L#ffifi $3s ffirSFLeY SeAs*64 Questo integrato e capace di pilotare fino a 4 display a 7 segmenti. ll suo impiego è semplice: sostanzialmente,
dobbiamo ìnviare la combinazione binaria corrispondente ai segmenti che vanno attivati per ognuno dei 4 digit. Per farlo funzionare con i suddetti display si puo collegare come mostrato nella figura. Tramite le lrnee UI SAAr 0ó4
SCL e SDA il m icrocontroller manda al dispo-
sitivo l'informazione da visua-
lizzare.
Dei
3/8 di Vcc 5/8 di Vcc
sette bit di indirizza
i rinnr ra
più
significativi <nnn nrodotar-
Tabella che determina i due brt meno sig n if icativi del I' i nd i rizzo.
minati in fabbrica come "01110" e i due successivi sono stabiliti dall'utente secondo la tensione applicata al pin 1 (ADR), la cui corrispondenza si trova nella tabella allegata.
Uultimo bit, e quello di lettura (1) o scrittura (0) del dispositivo. ll SAA1064 f unziona come un multiplexer, attivando consecutivamente i display 1 e 3 e i display 2 e 4. Se questo si fa con una velocita adeguata, sì provoca la sensazione ottica che i quattro display siano attivati in modo continuo. ll circuito dispone inoltre dì funzioni di reset, test, controllo di luminosità, ecc.
Dir=Olll0llr/w
ESERCIZIO PROPOSTO Questo programma è simile al primo che abbiamo realizzalo con il convertitore, cambia solo il modo di offrire il
risultato finale, che sarà un valore fra 0000 e 0255, rappresentato sui quattro d splay a 7 segcompreso
menti. Ancora una volta il programma principale è incaricato di eseguire le
chiamate alle diverse funzìoni, che
DtG4 ., ..;_ ,r-l;:l 1...É{ -s-4 ',4lJ+-@;ì 4-+4 4: 4,
|
' l.gE +-L'.'+:: r ...ì
F ,e!
realizzano realmente il lavoro. Le specifiche di questo dispositivo indicheranno il modo con cui si realizzerà la
comunicazione fra essi e il PlC.
543óil t'
PROGRAMMA ll SAA| 064 collegato a quattro display a 7 segmenti
ll programma principale è molto simiì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 sul conole 0, lo converte in BCD e lo moslro lromi$e 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.
Fnunc
Ìa
to
PB uscite TMRO
€hiedere vqlore dello conversione
del I' eserciz io propos Lo
mo gra visto. Si richiede l'acquisizione di un valore analogico 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
.
Converlire o 7 segmenli
bus|2C,situatesu||aportaB,chesonocondiviseconi 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. Per la conversione del dato a BCD si parte da un va ore memotzzalo nel regìstro di lavoro W che è convertito in codice BCD e memorizzato nei due registri da
Bbit,inmodocheinogniregtstrocisianoduedigit'
:
,
,
Visuqlizzore : :
Òrn.nínrsmms
dol l a<arci zìa
^rÒnÒ<rÒ
u5T
P:l6F84A
; Tipo
INCLUDE
'P16F84A.rNC"
: Defínizione dei reqistri interni
CLKIN
EQU
.4000000
; Frequenza di lavoro
12c-vat
EQU
0xOc
Digit_1
EQU
0x'12
; lnizio delle variabili per la routine I2C_LOW ; Buffer di uscita dei 4 digit per il 5AA1064
Digit 2 Digit 3
EQU
0x13
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
g0r0
Inizio
INCLUDE
"12cLowlNc"
; lnclude la routine di gestione del bus l2C
call
Txt*Starî-Bít
; Trasmette la sequenza di inizio
movlw movwf
b'10010001'
call
Txt_Byte
A_lnput
Vedor reset
DataByte
-Ultimo*Byte
; lndirizzo del PCF8591 {modo lettura) ; Riceve un unico byte per volta
call
RcvByte
; Riceve il risultato della conversione AD
call
Txt*Stop_Bit
; Trasmette la sequenza di 5T0P
movf movwf
DataByte,W
bsf
return
í;-,+.É+=-:'1rSaE:::.=
;
di processore
A_inp
; Salva il valore risultante dalla conversione
:,
.
:
ììì:
Visualizzare
call
Inizia*Bus
call
Txt_Start_Bit
ilOVIW
b'01
movwf
DataByle
call
Txt_Byte
drf
DataByte
call
Txt_Byte
movlw movwf
b'010001 1 1'
1
;lnizializza la linea del bus l2C ; Invia il codice di inizio
101 1o',
; Trasmette I'indirizzo del dispositivo {scittura) ; Trasmette il byte di istruzione
DataByte
call
lxt
movf
Digit_1,W
Byte
movwf
DataByte
call
Txt_Byte
movf movwf
Digit_2,W
call
Txt-Byte
movf movw{
Digit_3,W
call
Txt_Byte
movf
DigiL4,W
; Trasmette byte di controllo
; Trasmette Digit
1
DataByte ; Trasmelte Digit 2
DataByte
;Trasmette Digit 3
movwf
DataByte
call
Txt_Byte
; Trasmette Digit 4
call
Txt_5lop_Bit
; Trasmette la sequenza di 5T0P
clrf clrf
Buffe_L
; Cancella i registri di lavoro
addlw
UXTb
; Sottrae 10 per somma di complemento a 2
btfss
5TATU5,C
;
90î0 movwf
Bin_bcd_3
;N0
A-inp
; 51. Scivilo nel registro temporale
incf
Buffer_L,F
movf xorlw
Buffer_L,W
; Incrementare byte basso, scriverlo e inviarlo... .,, al registro W...
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.
movf
A_inp,W
; Recupera il dato.
goto
Bin_bcd_1
; Continua le operazioni.
addlw
H'OA
; TEMP0 + OAh
swapf
Buffer_l,F
ionivf
Buffer_L,F
i <3:0> <==> a7;4v g ==> BCDL ; W o BCDL ==> BCDL
return Bin,bcd
Bin bcd 'l
Bin_brd_2
Érn 0c0 J
Buffer_H
I
presente il Cany?
return Un_Pack
swapf
Buffer_H,W
call
BCD_7seg
movwf
Digit'1
movf
Buffer_H,W
call
3(D_7seg
movwf
Digit_2
swapf
Buffer_L,W
call
BCD_7seg
movwf movf
Digit_3
call
BCD_7seg
movw{
Digii_4
return
; Converte il nibble piir significativo del Buffer-H
; Converte il nibble meno significativo del Buffer_H
; Converte il nibble più signi{icativo del Buifer_L
Buffer_L,W ; Converte il nibble meno signi{icativo del Buffer-L
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 segmenti. 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 dispositivo che abbiamo aooena conosciuto.
Soflwsre
Organigramma della nuova proposta
AP 05
Appticazione pratica: o
o
comunrcazlOne con e l'utilizzo della tastiera
.''''
it computer
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 occasione: 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 Orrest'rrltimo orazie
Vcc
al software
HyperTerminal (Hypertrm) fornito da Windows, si comporterà come un Lerminale di comunicazione.
ll piedino RB4 del PIC sarà la lìnea di trasmissione dei dati, e il piedino RB5 la linea di ricezìone. Nel connettore DB9 del (ompurcr saranno i pin 3 e 2 rispettivamente. 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^,,+^r' ItUI ^^^ PULtrl /,ti^^,,î^^i^,
L---+Ud)Ld
5i desidera controllare, famite un teminale, una serie di dispositivi di allarme quali possono essere i
,,+ili---"^ E l^ rU .r^..^ )rC)rU U||t/ót
ilngua9gro, ma oevono ,..t
diodi lED, che mostrano in ogni momento la situaziole di diversi sensori. 5i seguirà la seguente tabella:
es5ere
uguali anche isuoi livelli elettrici. Per otîenere orresîo si utilizza il rircttita intonr:tn N/AY7?7 iì nrr:ìo hr il rnmnitn ar I tl
Ài rnnuarfiro
nrn\/onronîr
fl:t
ilirralli HI(
lnniri rnnlirrn^ rwvrLr P(--)?f r\J-zJZ, rha Lr rE ci )r oPPilLoru npffnro dol rnmnrrfor
:
lnniil\/a
ìl
TASTO
AZIONE
a
pericolo di incendio
A
N0 pedcolo di incendio
0
pericolo intrusi
P
N0 pericolo intrusi
5PC
scollegamento
ìl LUr .^n ror 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.
ll
PIC
USCITA
ALTARME
RBO
pericolo incendio
RBl
N0 perkolo incendio
RB2
pericolo intrusi
R83
N0 pericolo intrusi
oltre a mostrare le informazioni tramite i
mostrata in video. )^,,^ ^,,^-^ t-^-:-1^ --,.^ sel ttt1 (dvo Hte OeVe àVete le
linee di trasmtssione e riceztane tncroctale
Lnunciato dell esercrzio proposrc.
LED
fornirà il tipo di situazione al terminale perché sia
i
Quando è il computer che manda i dati al PlC, il MAX232 ha il compito di fare la conversione inversa.
Nella figura possiamo vedere pochi componenti esterni di cui ha bisogno questo chip per lavorare. Comp vpdete le nossibilità che offre la comunicazione con un computer sono enormi. ll PC potrebbe trovarsi in una abitazione, e il sistema di controllo in un'altra, anche a notevole
i
Alfendere lc ricezione di un cqrqllere
0 rsta
nza.
Òltra : np<fira doi comnliri
Accendere
:
HS
RBO
Spegnere
E'O?
RBO
ActendeÉ RB2
Spegnae
Un
microrobot per realizzare un lavoro. o un sistema di riscaldamento che si attiverà o drsattiverà a seconda degli ordini dell'utente o delle ore del gior-
RAI
Actendere RBI Spegrere
IFT)
notrémo anche movimentafe
--!.
o
no. Lo schema, in questo caso, non
RE3
Aceendere RBit
si
limita agli elementi da collegare al PlC, ma si estende sino alla connessinnp rnn il rnmnrrter ll modulo che appare nella figura come canale RS232 è mostrato in dettaglio in una
È"r
Spggnere nB2 Atcendere R8O, RBI, rB2, Rg3
finrrra nrarodonta '+;
Visuelizzore mesroggio
ftrr* ízÍ:iltie"ú & rÍi. l'u
+
Dopo aver confrgurato le linee del
PIC
e il resto delìe periferiche in modo adeguato, sì
come ingressi/uscite,
attende di ricevere un carattere. Si verificano ad una ad una tutte
le I
.i!
possibìlità
di
attìvazione
di
una
+rc+i o e qornnd: ,-- Ài ur nrrrli vuoil Lo)Ll sono stati premuti, si accenderanno o --l^a' ' -+i ca ri <i )pEVr <nonnor:nnn Flì dUcVUdtl )l rEroril rv iI ILLU )r
f:<tiora
manderà un messaggio sul monitor che visualizza la situazione attuale del sistema. i.: i;i j.':
ll
i': i'l .:i1
= ::"jl ;r! programma, anche se lungo,
è
+--;t^,l--^;"^ q. toLItE uo loPil Le variabili definite all'inizio del
O
rga
n
ig ra m
ma del l' esercizi o proposto.
programma sono necessarie per la comunicazione seriale. In seguito si definìscono i differenti messaggì da visualizzare, in modo simile a quan-
i
ìÌi
,rll
di processore
u5T
P=15F844
; Tipo
INCLUDE
"P'l5F84A.tNC"
CTKIN
EQU
.4000000
BAUDE
EQU
.9600
; Definizione dei registri interni ; irequenza di lavoro ; Velorità di comunicazione
T-MODO R MODO
EQU
1
;
EQU
1
T-Nbh
EQU
ó
R_Nbit
EQU
8
Sbit RS232,var
EQU EQU
0x{)C
Contatore
EQU
0ffset
EQU
EQU
0x1'l 0x12 0x13 0x14
ORG
0x00
Temporale_1
Temporale
2
Mess_0 Mess_1
EQU
g0r0
tNtzt0
ORG
0x05
; Salta il vedor di intenupt
EQU
ì
DT
"5collegamento ",0x0d,0x00
îorondn
"Pericolo Incendio ",0x0d,0x00
co nfig u razio n
"No pericolo incendio ",0x0d,0x00 "Condizione nulla ",0x0d,0x00
EQU
"Perkolo intrusi ",0x0d,0x00
DT Mess_5
EQU
DT Mess_6
"No Pericolo intrusi ",0x0d,0x00
"No incendiollntrusi ",0x0d,0x00 'RS232t0W.tNC',
; Include le routines di comunicazione
movwf
pat
movwf movf
lNtzl0
LOOP
Temporale
1
movwf movf
Temporal_1,W Tabella_mesaggi Temporale_2 Temporale_2,F
btfss
SîATUS,Z
goto return movwf
Non è ultimo
call
il cui lNlZlO è indicato ; nell'actumulatore. La fine di un messaggio si determina mediante il codite 0x00 ; Salva posizione della tabella ; Recupera posizione della tabella ; Cerca carattere di uscita ; Memorizza il carattere ;
Controlla se è l'ultimo
Txdreg
call
txu
incf g0to
Temporale l,F
drf
PORTB
bsf
STATUS,RPO
movlw
b'10001111',
movwf movlw movwf
OPTION,REG TRISB
bcf
STATUS,RPO
; RB5 ingresso e RB4-RB0 uscite ; Seleziona pagina 0 dei dati
RxD
;
; Trasmette il carattere ; Carattere successivo
Mesaggio_1
b'1
1 1
; Scollega uscita ; Selezione banco 1 dei dati ; Prescaler da 128 per il WDT, Pull,up
00000'
clrwdt call
movlw
,n,
Secondo passo nella
configurazione del programma terminale " Hypertrm"
; Calcola lo spostamento sulla tabella ; dei mesaggi: Questa routine invia
tramhe RS232 il mesaggio
Non_è ultimo
I
.---*:!
"lncendio/No intrusi ",0x0d,0x00
; A seronda del valore contenuto nel registro W, viene fornito il carattere da visualizzare
Mesaggio_1
N@iqdrȀl@r
edù@6c!rud,É
EQU
INCLUDE
MESSAGGIO
rMH.
l.*
EQU
DT
Tabella,Messaggi
dh+r@
,ddr*H#
EQU
DT
Mess 10
'-qLde
"Condizione nulla ",0x0d,0x00
DT Mess_9
Q*,*"'*** -_
"lntrusi/No incendio ",0x0d,0x00
EQU
DT Mess_8
"lncendio/lntrusi ",0x0d,0x00
EQU
DT
Mess 7
ra m m a
EQU
DT
Mess 4
e del prog
terminale "Hypertrm".
EQU
DT Mess_3
ns<<o nol la
EQU
DT Mess_2
îrasmette il primo bit t5B
; Riceve il primo bit l5B ; Trasmette caratteri da 8 bit ; Rkeve caratteri da 8 bit ; Trasmette 2 bit di stop ; Inizio delle variabili per routines R5232 ; Variabile rontatore di mesaggi ; Spostamento dei messaggi ; Variabile temporale ; Variabile temporale ; Vector Reset
Attendi la ricezione di un carattere
to fatto lavorando con il
display
LC D.
ll file "RS232LOW.lNC" contie-
ne le routines di
cornunicazione,
per l' nvio e ricezione dei dati; dato che il
PIC
16F84 non ha queste risor-
se
i'np err^entate nel 'hardware, flrpq-p onor:zinni devono eSSere no<tito iri: cnftrnr:ro In segurto trovramo la routrne inca.icata dr rasmettere il nîessaggio che fa uso della rour ne "TxD ", contenuta in " RS232LOW", e invia un byte (un solo carattere) ogni volta che si chrama. La chiamata alla routine inversa, la "RxD", si trova ne programma prncrpa e.
c î'oínera del tasro p"e.^uto. Dopo aver verificato di quale
essa
ffiJ sublvf
Rxdreg,W
btfsc
STATUS,Z
goto
INCENDIO
.È
,rl'? bryFry.#b@'bl
m0vtw subwf
Rxdreg,W
btfsc
STATUS,Z
;E,A?
goto
NO_INCFNDIO
;Si
m0vtw
,0,
subwi
Rxdreg,W
btfsc g0î0
STATUS,Z
. È ,n,r
INTRUSI
;Si
m0vtw
'P'
subwf
Rxdreg,W
btfx
STATUS,Z
;È
g0r0
NO_INTRU$
;Si
sffi
,P'?
SCOLLEGAMENTO
INCENDIO
NO-INCENDIO
INTRUSI
Rxdreg,W
.4rt&. .l
Terzo passo nella configurazrone oet programma
movlw subwf
:JSf-ìl
btfsc
SÎATUS,Z
;È"?
goto
L00p
;No
bcl
PORTB,O
bcf
PORTB,l
bcf
PORTB,2
terminaIe "Hypertrm".
ÍdE
Motu {M@d f)d
ù1,Él
bcf
PORTB,3
g0r0
Test_Mess
;Scollega uxite ; Determina il mesaggio da dare
bcf
PORTB,l
; Scollega
bsf
PORTB,O
; Collega
g0t0
Test_Mess
bcf
PORîB,O
;Determina il mesaggio da dare ; Scollega Rgo
RB1
bsf
PORTB,l
; Collega R81
g0r0
Tel_Mess
; Determina il messaggio da dare
bcf
PORTB,3
; Scollega RB3
bsf goto
PORTB,2
; Collega RB2
Test_Mess
; Determina il messaggio da dare
bcf
PORTB,2
; )coilega xbr
bf
PORTB,3
; Collega
goto
Test Mess
; Determina il mesaggio da dare
;0ra
ìl
I
; del messaggio da fornire tenendo conto che i messaggi iniziano a ; partire dall'indirizzo 0x05 ed hanno una lunghezza fksa di 20 (aratteri.
Uscita mess
Drnaramma
rì<alfn
+--+^ -i +.-++î -i i-^:StanO Lt oLLo, )t [|P\ ibit di td)LU )t
spnnalazionp serondo la tabella vista nell'enunciato del programma, e si procede a determinare -r- :til rìc))dgvrL ^, -l^ )rd ^^---^^t) da inviare al qudrtr term ina le.
movlw
0x0a
movwf
Contatore
movlw
Mens_10
movlvf
0ffset
movf
PORTB,W
andlw
b'00001
subwf
Contatore,W
btfsc
sTATU5,Z
; Conisponde al messaggio da fornire?
goto
Uscita_mess
;sì
ra le.
m0vtw
.20
subwf
0{fsei
; No, punta al messaggio precedente
decf
Contatore,F
Donn ,aver r-ollen,r{g il PIC con il compuler, chiameremo il programma
g0r0
Mess_loop
" l--lrinorirm ,
movf
0ffset,W
call
MESSAGGIO
goto
LOOP
: lnizializza contatore di messaggi ; lndirizzo dell'ultimo messaggio
1 1
1'
; Legge il valore attuale della PORTA
B
Per fare funzionare il programma sorlo necessari, oltre al PIC e ai LED, nli viqti nolln crhpm: nonov" plpmonli -'-'
,)Y-'.'
; Uscita del messaggio appropriato
; Fine del programma sorgente
END
4@@
procediamo a determinare il messaggio
; Per questo in base al contenuto della PORTA B si cakola l'offset
Mess_loop
Atuer
Ora si puo iniziare .:-^,,^.^ /; udll, )-+, ^ //Lcvg/t a iltvtalÉ u
RB3
di uscita sul terminale
Test_mess
?
RBO
.ffi.omg
NO_INTRUSI
lrafu
d13l s1ì5f etl
" o ln rn --'nf"tgureremo per
fare in modo che segua gli
stessi
narametri del P C nella corrìunrcaztone (porta, velocita, ecc.). ln <onrritn nntromn tntTtAro A 6(a-
,r--^+i tr ^ .,^,r^-e rrtrrc pur)orLr vcucl Che COSa risponde il
PlC.
Ci