M048 – ESAME DI STATO DI ISTITUTO PROFESSIONALE Un

M048 – ESAME DI STATO DI ISTITUTO PROFESSIONALE
Un Possibile Svolgimento
Spieghiamo brevemente cosa è richiesto dal problema:
 Disegni uno schema a blocchi della catena di acquisizione e descriva la funzione di
ciascun blocco
In questo punto è richiesto di disegnare e successivamente descrivere lo schema a blocchi
del Sistema di Acquisizione, Elaborazione e Distribuzione Dati più adatto allo scopo. Inoltre
bisogna descrivere ciascun blocco presente nello schema.
 Determini le caratteristiche elettriche di ciascun blocco in funzione dei segnali elettrici di
ingresso e di uscita.
Qui bisognerà descrivere, per ciascun blocco, le sue caratteristiche elettriche.
 Progetti l’interfaccia di acquisizione con componenti di sua conoscenza.
Adesso bisogna realizzare circuitalmente i blocchi indicati nello schema.
 Disegni la flow-chart del programma di gestione dell’intero sistema.
Cioè il diagramma di flusso, vale a dire lo schema in cui sono indicati i vari passi che il
microcontrollore dovrà eseguire perché il sistema funzioni correttamente.
 Codifichi in un linguaggio di sua conoscenza un segmento del programma.
Infine bisogna realizzare, partendo dalla flow-chart, una porzione (quanto più ampia
possibile) del programma, in un linguaggio a scelta del candidato.
1. Ipotesi Aggiuntive
 Supponiamo che il sottosistema di elaborazione si trovi vicino al terreno da irrigare ed alle
pompe. Ad esempio posizionato dentro una cabina protetto dalle intemperie, oppure dentro
un piccolo contenitore impermeabile.
 Supponiamo che i sensori del serbatoio siano anch’essi di tipo digitale On/Off.
 Supponiamo che ciascun sensore di umidità sia costituito da due elettrodi di acciaio inox
posti ad una distanza tale da offrire una resistenza di 100 Ω con un’umidità del 40% ed una
resistenza di 10 kΩ con un’umidità del 5%.
 Supponiamo che i sensori per il pozzo ed il serbatoio siano realizzati con dei potenziometri
da 100 kΩ.
2. Disegno dello Schema a Blocchi e Descrizione di Ciascun Blocco
Un Primo Tentativo di Schema a Blocchi
Per iniziare proviamo a realizzare lo schema a blocchi utilizzando solamente catene dirette sia
per l’acquisizione che per la distribuzione.
In tal modo lo schema a blocchi sarà il seguente.
Acquisizione
SU3
Cond.
ADC
SU4
Cond.
ADC
SU5
Cond.
ADC
SU6
Cond.
ADC
SU7
Cond.
ADC
SU8
Cond.
ADC
Driver
Relè
Driver
Relè
Driver
Relè
Umid3
Umid4
Umid5
Umid6
Umid7
Umid8
Sensore
SerbVuoto
Serbatoio
Vuoto
PompaSTOn
SPVuoto
C
Sensore
Pozzo
Umid2
Pompa
Serbatoio  Terreno
ADC
Pompa
Pozzo  Serbatoio
Cond.
Pompa
Pozzo  Terreno
SU2
Umid1
PompaPSOn
ADC
Distribuzione
PompaPTOn
Cond.
P I
SU1
Elaborazione
Sensore
SerbPieno
Serbatoio
Pieno
Pulsante
Selezione
Display
Pulsante
Figura 1
Display
Lo schema riportato in fig.1 ha la seguente funzione:
I segnali rilevati dai sensori dopo opportuno condizionamento ed eventuale conversione
vengono acquisiti dal microcontrollore, il quale li elabora e decide se azionare o meno le pompe
ad esso connesse ed inoltre visualizza i valori misurati su di un apposito display.
Vediamo adesso la funzione dei singoli blocchi.
Sottosistema di Acquisizione
Esso è costituito da:
 Otto identiche catene di acquisizione associate ad altrettanti sensori di umidità, ciascuna
costituita da:
 Un sensore di umidità (SUi) opportunamente posizionato nel terreno.
 Un blocco di condizionamento (Cond) che adatta il segnale in modo da essere
agevolmente convertito dal successivo ADC.
 Un convertitore analogico/digitale (ADC) che converte il segnale analogico presente al
suo ingresso in un segnale digitale con un opportuno numero di bit, il quale verrà infine
acquisito dal microcontrollore.
 Tre sensori di livello di tipo digitale On/Off, ciascuno avente una differente funzione:
 Sensore Pozzo: La sua uscita, SPVuoto, avrà livello logico ‘1’ se il tubo che preleva
l’acqua dal pozzo non è più in grado di pescare acqua in modo efficace. La presenza di
tale sensore ha lo scopo di evitare che la pompa che preleva l’acqua dal pozzo si bruci
pompando a vuoto.
 Sensore Serbatoio Vuoto: Esso dà in uscita il segnale SerbVuoto, il quale avrà livello
logico ‘1’ se il serbatoio è vuoto. Questo per evitare che la pompa che preleva acqua da
esso si bruci pompando a vuoto.
 Sensore Serbatoio Pieno: Esso dà in uscita il segnale SerbPieno, il quale avrà livello
logico ‘1’ se il serbatoio è pieno. Questo per evitare che il serbatoio si riempia
eccessivamente e l’acqua trasbordi.
 Infine è presente un tasto con la funzione di selezionare il valore istantaneo di umidità (o la
loro media) da visualizzare sul display.
Sottosistema di Elaborazione
Per tale sottosistema si è scelto un microcontrollore PIC della Microchip.
Sottosistema di Distribuzione
Esso è costituito da:
 Tre catene di distribuzione associate ad altrettante pompe, ciascuna costituita da:
 Un Driver che pur dando in uscita lo stesso valore logico presente nel suo ingresso, è in
grado di fornire la corrente necessaria per pilotare il relé.
 Un Relé la cui funzione è quella di azionare l’interruttore che accende o spegne la
pompa ad esso collegata.
 La Pompa che ha una funzione differente in ciascuna catena di distribuzione:
 Pompa Pozzo  Terreno: Viene utilizzata per irrigare il terreno mediante l’acqua
presente nel pozzo, quando ce n’è.
 Pompa Pozzo  Serbatoio: Che ripristina l’acqua del serbatoio dopo il suo
eventuale utilizzo.
 Pompa Serbatoio  Terreno: La cui funzione è quella di irrigare il terreno
mediante l’acqua presente nel serbatoio qualora il pozzo sia vuoto.
 Un Display utilizzato per visualizzare i valori istantanei di umidità rilevati dai sensori ed il
loro valore medio.
Valutazione dello Schema a Blocchi Proposto
Vediamo innanzitutto quanti pin deve avere il PIC utilizzato in questo schema:
 Sottosistema di Acquisizione
 Ciascuno degli otto sensori di umidità arriva al microcontrollore con n bit. Questi
dovranno essere almeno quattro per ciascun sensore, per un totale di 32 almeno.
 I sensori di livello hanno ciascuno una sola linea che va al PIC.
 Lo stesso dicasi per il pulsante.
 Sottosistema di Elaborazione
 Ciascuna delle tre pompe ha bisogno di una sola linea proveniente dal PIC.
 Per il Display ho bisogno di un totale di 10 linee almeno:
 Otto linee per i dati.
 Una linea che dice al display se ciò che segue è un comando o un dato.
 Una linea per indicare al display se leggere o scrivere
In totale mi servono almeno 49 linee che sono troppe per un PIC, infatti:
 PIC16F690, ha 20 pin di cui 18 di I/O, così suddivisi:
 PORTA  6 bit (RA5 – RA0)
 PORTB  4 bit (RB7 – RB4)
 PORTC  8 bit (RC7 – RC0)
 PIC16F1936 ha 28 pin di cui 25 di I/O, così suddivisi:
 PORTA  8 bit (RA7 – RA0)
 PORTB  8 bit (RB7 – RB0)
 PORTC  8 bit (RC7 – RC0)
 PORTE  1 bit (RE3)
 PIC16F1937 ha 40 pin di cui 36 di I/O, così suddivisi:
 PORTA  8 bit (RA7 – RA0)
 PORTB  8 bit (RB7 – RB0)
 PORTC  8 bit (RC7 – RC0)
 PORTD  8 bit (RD7 – RD0)
 PORTE  4 bit (RE3 – RE0)
E’ perciò necessario optare per una struttura multiplexata allo scopo di ridurre il numero di
pin del microcontrollore.
Bisogna adesso stabilire se il multiplexer dev’essere analogico o ne basta uno digitale, questo
dipende dal costo degli 8 ADC presenti e perciò dal numero di bit necessari per la codifica binaria.
Per stabilire il numero di bit di ciascun ADC bisogna tener conto di due fattori:
 Calcolo della Media:
 Esso richiede 8 somme ed una divisione per 8 (cioè 3 spostamenti a destra di un bit
ciascuno).
 Perché il programma non si complichi troppo sarebbe necessario che tali operazioni
venissero fatte su singoli bytes.
 Errore di Discretizzazione:
 Esso dev’essere sufficientemente piccolo da non inficiare il funzionamento del sistema.
Analizziamo i due problemi singolarmente.
1° Problema: Calcolo della Media
Supponiamo di utilizzare degli ADC ad 8 bit, in questo caso la media dovrà essere fatta su
numeri binari ad 8 bit.
Concentriamoci sulla somma degli 8 numeri e mettiamoci ne caso peggiore, supponiamo cioè
che ciascun numero acquisito sia massimo, cioè pari a 1111 1111BIN = 255DEC.
In questo particolare caso sommare gli 8 numeri equivale a moltiplicare il numero
1111 1111BIN per 8, cioè spostarlo di 3 bit a sinistra, in questo modo otteniamo:
1111 1111BIN * 8DEC = 111 1111 1000BIN
(1)
Il numero binario perciò cresce di 3 bit divenendo così ad 11 bit. Se vogliamo lavorare con
numeri binari ad 8 bit è allora necessario che numeri binari prodotti dagli ADC siano a non più di
5 bit, in questo modo dopo la loro somma diverranno al più ad 8 bit.
n=5
(2)
2° Problema: Errore di Discretizzazione
Conosciamo il numero di bit degli ADC (n = 5) ed anche l’intervallo di valori dell’umidità del
terreno che dobbiamo misurare (40% - 5% = 35%), possiamo perciò calcolare l’errore di
discretizzazione che si commette nella conversione analogico – digitale:
V 
VRe s 35% 35%
 5 
 1.1%
32
2n
2
(3)
Perciò con una codifica binaria a 5 bit la conversione introduce un’incertezza dell’1.1% che è
assolutamente accettabile se paragonata con i valori con i quali il numero binario acquisito
dev’essere confrontato e cioè 10% e 25% (vedi testo del compito).
Poichè gli ADC a 5 bit sono piuttosto economici possiamo tranquillamente utilizzarne 8 e perciò
possiamo utilizzare un multiplexer di tipo digitale.
Riassumendo
 Si utilizzeranno degli ADC a 5 bit che sono piuttosto economici.
 Si farà inoltre uso di un multiplexer digitale per ridurre il numero dei pin del
microcontrollore.
Schema a Blocchi definitivo
Acquisizione
ADC Umid3
SU4
Cond.
ADC Umid4
SU5
Cond.
ADC Umid5
SU6
Cond.
ADC Umid6
SU7
Cond.
ADC Umid7
SU8
Cond.
ADC Umid8
SPVuoto
C
Sensore
Pozzo
Driver
Relè
Driver
Relè
Pompa
Serbatoio  Terreno
Cond.
Relè
Pompa
Pozzo  Serbatoio
SU3
Driver
Pompa
Pozzo  Terreno
ADC Umid2
PompaSTOn
Cond.
PompaPSOn
SU2
Distribuzione
PompaPTOn
ADC Umid1
P I
Cond.
MUX Digitale
SU1
Elaborazione
Sensore
SerbVuoto
Serbatoio
Vuoto
Sensore
SerbPieno
Serbatoio
Pieno
Pulsante
Selezione
Display
Pulsante
Figura 2
Display
3. Determinazione Caratteristiche Elettriche e Progetto di Ciascun Blocco
Il secondo ed il terzo punto del compito verranno svolti congiuntamente in questo paragrafo.
Alimentazione
Si farà uso di tre differenti alimentazioni:
 -12V, 0V, +12V: Per i sensori di umidità e gli amplificatori operazionali.
 220V: Per le pompe.
 0V, 5V: Per tutto il resto.
SOTTOSISTEMA DI ACQUISIZIONE
Sensori di Umidità
Ciascuno di essi è costituito da due elettrodi di acciaio inox e dalla porzione di terreno che si
trova tra di essi.
In funzione dell’umidità del terreno essi forniscono in uscita una resistenza tanto più bassa
quanto maggiore è l’umidità del terreno. E’ necessario perciò un convertitore Resistenza 
Tensione.
L’insieme del sensore di umidità e del convertitore è rappresentato in fig.3.
Figura 3
Si tratta di un semplice partitore di tensione nel quale:
 RSens è il modello elettrico del sensore che, come si è detto nelle Ipotesi Aggiuntive, ha
una resistenza pari a:
 100 Ω con un’umidità del 40%.
 E 10 kΩ con un’umidità del 5%.
 RConv è la resistenza che funge da convertitore resistenza  tensione.
La tensione d’uscita VConv è data dall’equazione:
VConv 
RSens
R
 Sens
RConv  RSens RConv
(4)
L’approssimazione RConv  RSens  RConv è dovuta al fatto che RConv  RSens e perciò RSens può
essere trascurato rispetto a RConv.
Quest’approssimazione rende l’eq. (4) lineare e quindi non è necessario un linearizzatore.
Vediamo quali sono i valori di VConv per i due casi di umidità indicati nel testo del compito.
VConv Um5% 
RSens 10 10 3

 0.1V  100mV
RConv 100 10 3
(5)
RSens
100

 10 3 V  1mV
3
RConv 100 10
(6)
Anziché 0V
VConv Um40% 
Anziché 5V
Le tensioni in uscita dal convertitore non sono quelle desiderate, in particolare:
 VConv Um5%  VConv Um40% mentre dovrebbe essere il contrario, bisognerebbe invertire i
valori.
 VConv Um5%  0V mentre dovrebbe essere uguale, bisognerebbe traslare i valori.

Entrambi i valori (5) e (6) sono ben differenti da quelli richiesti, bisognerebbe
amplificare.
E’ perciò necessario un circuito che faccia da Amplificatore Invertente e da Traslatore.
Amplificatore e Traslatore
Un circuito che può fare quanto detto qui sopra è il seguente.
Figura 4
La tensione d’uscita VAmp è data dalla seguente equazione:
V Amp 
R2
 100mV  VConv 
R1
(7)
Vediamo quali valori abbiamo in uscita tenendo conto delle (5) e (6):
V Amp
Um5%

R2
 100mV  100mV   0V
R1
(8)
V Amp
Um 40%

R2
R
 100mV  1mV   2  99
R1
R1
(9)
Affinché la (9) sia pari a 5V è necessario che:
R1 = 99 kΩ
(10)
R2 = 5 kΩ
(11)
Infatti:
V Amp
Um 40%

5 10 3
5
 100mV  1mV    99  5V
3
99
99 10
(12)
L’amplificatore operazionale utilizzato può essere un semplice uA741.
Condizionamento
In conclusione il blocco di condizionamento utilizzato è costituito da:
 Un Convertitore R  V realizzato mediante una semplice resistenza.
 Un Amplificatore Differenziale che funge da Amplificatore Invertente e Traslatore.
Non è necessario un Linearizzatore in quanto il sensore ha una caratteristica I/O lineare.
ADC
Per il Convertitore Analogico – Digitale possiamo utilizzare un Convertitore Flash il cui schema
è del tipo mostrato nella figura seguente.
Figura 5
Esso è costituito da:
 Un partitore resistivo il quale produce 2n valori di tensione corrispondenti ai livelli di
discretizzazione.
 2n-1 Comparatori, ognuno dei quali confronta la tensione d’ingresso con uno dei livelli
di discretizzazione.
 Un Encoder che converte i segnali digitali prodotti dai comparatori in un numero
binario.
Multiplexer Digitale
Esistono in commercio Multiplexer Digitali a 2, 4 ed 8 bit eccone le sigle:
 74157 è un Multiplexer Digitale a 2 bit
 74153 è un Multiplexer Digitale a 4 bit
 74151 è un Multiplexer Digitale ad 8 bit
 Qualora serve un Multiplexer Digitale a più di 8 bit basta comporre due o più dei Mux
indicati sopra.
Nel nostro caso è sufficiente un Multiplexer Digitale ad 8 bit e perciò un integrato 74151.
Sensori Pozzo e Serbatoio
Tutti e tre i sensori possono essere realizzati nello stesso modo.
Figura 6
Il sensore potenziometrico, RSens, viene utilizzato come partitore di tensione, esso darà (se ben
posizionato) in uscita una tensione tanto più alta quanto maggiore è il livello dell’acqua.
Tale tensione viene confrontata, mediante un comparatore, con una tensione di riferimento, RRif,
ottenuta mediante un trimmer (opportunamente calibrato).
L’uscita del comparatore sarà:
 ‘0’ Se il livello dell’acqua è più basso del riferimento.
 ‘1’ Se il livello dell’acqua è più alto del riferimento.
Questo tipo d’uscita è adatta per il sensore che indica il serbatoio pieno, ma non è adatta negli
altri due casi nei quali serve un segnale negato rispetto ad esso.
Per risolvere il problema basta aggiungere una porta NOT alle loro uscite.
Pulsante Selezione Display
Il circuito che converte la pressione del pulsante in una tensione del tipo ‘0’ o ‘1’ è piuttosto
semplice ed è indicato nella figura che segue.
(a)
(b)
Figura 7
Esso è costituito dal pulsante, indicato con la lettera ‘T’, e da una resistenza R che funge da
convertitore. Vediamone brevemente il funzionamento:
Tasto Aperto
Con il tasto aperto non passa corrente, quindi non c’è caduta di tensione nella resistenza R
VOut  R  I  R  0  0V
(13)
Tasto Chiuso (Premuto)
Il tasto chiuso si comporta come un corto circuito, in questo modo la tensione ai capi di R
corrisponde a VG e perciò:
VOut  VG
(14)
Indipendentemente dal valore di R perciò il nostro circuito darà:
 ‘0’ cioè 0V quando il tasto è aperto, cioè non è premuto.
 ‘1’ cioè VG quando il tasto è chiuso cioè è premuto.
L’alimentazione viene scelta tenendo conto del fatto che l’uscita del circuito andrà direttamente
al PIC, perciò:
VG = 5V
(15)
Il valore della resistenza R è ininfluente per il funzionamento del circuito, ma da esso dipende il
consumo di corrente del circuito stesso, perciò verrà scelto sufficientemente grande:
R = 10 kΩ
(16)
SOTTOSISTEMA DI ELABORAZIONE
Il microcontrollore scelto, come detto in precedenza, è un PIC, bisogna decidere quale tra i tanti
presenti in commercio.
Come si può dedurre dalla fig.2 il numero di pin necessari è pari a 25 perciò la nostra scelta
ricade sul PIC16F1936 che ha appunto 25 pin di I/O.
SOTTOSISTEMA DI DISTRIBUZIONE
Driver
Per pilotare un relé non basta un semplice valore logico ‘0’ o ‘1’, è necessario fornire la
corrente necessaria per eccitare l’elettrocalamita presente al suo interno, a tale scopo si farà uso
di un driver.
Esso si comporta come una porta non invertente, cioè darà in uscita lo stesso valore logico
presente al suo ingresso, ma è in grado di fornire in uscita la corrente necessaria per eccitare
l’elettrocalamita contenuta nel relè.
L’integrato che qui si decide di utilizzare è L293D, nel quale sono contenuti 4 driver ognuno
capace di fornire fino a 600mA di corrente in uscita.
Relè
Si tratta di un interruttore pilotato in corrente. Esso è utile tutte le volte che si vuole azionare un
interruttore mediante un circuito elettronico come nel nostro caso.
Figura 8
Esso è costituito da un tasto in materiale ferromagnetico, una molla ed un’elettrocalamita.
In fig.8 è rappresentato un relè normalmente aperto cioè un relè che:
 Quando la sua elettrocalamita non è eccitata (I = 0A) mantiene, grazie alla molla, il
tasto aperto.
 Mentre quando la sua elettrocalamita è eccitata (I > 0A) attira il tasto è lo chiude.
In questo progetto si farà uso di un relè normalmente aperto perché l’interruttore dovrà
restare gran parte del tempo aperto, visto che le pompe si attiveranno solo per brevi intervalli di
tempo.
Di conseguenza un relè di questo tipo garantirà un minor dispendio di corrente ed inoltre
garantirà una migliore sicurezza elettrica in caso di malfunzionamenti.
In quest’ultimo caso infatti la molla provvederà ad aprire l’interruttore ed a spegnere le
pompe.
Display
Per il display ne basterà uno LCD a due righe, in una si indicherà il tipo di grandezza misurata
e nell’altra il suo valore.
4. Disegno del Flow Chart
Il flow chart che mi accingo a disegnare è costituito da un blocco principale e da due subroutine
aventi rispettivamente la funzione di :
 Controllo Pompe: Essa controlla l’accensione e lo spegnimento delle pompe in base alle
informazioni provenienti dai sensori e dal programma principale.
 Aggiorna Display: Essa provvede a visualizzare ciclicamente le informazioni relative
all’umidità rilevata dagli sensori e la loro media.
In esso sono necessarie in tutto dieci variabili:
 Umid1 – Umid8: Entro le quali verranno conservati i valori di umidità acquisiti.
 Media: Entro la quale verrà conservata la media delle umidità acquisite dagli 8 sensori.
 Irrigazione: Il quale quando è posto ad 1 ordina al sistema di procedere all’irrigazione.
Inizio
Acquisizione
Umidità
Calcolo
Media
Media<10% ?
NO
SI
Irrigazione = 1
Media>25% ?
SI
Irrigazione = 0
Controllo Pompe
NO
Pulsante = 1 ?
SI
Aggiorna Display
NO
Controllo Pompe
NO
Irrigazione = 0 ?
SI
PompaPTOn = 0
PompaSTOn = 0
NO
SPVuoto = 0 ?
SI
PompaPTOn = 1
PompaPTOn = 0
NO
SerbVuoto = 0 ?
SI
PompaSTOn = 1
PompaSTOn = 0
NO
SerbPieno = 1 ?
SI
PompaPSOn = 0
NO
SPVuoto = 1 ?
SI
PompaPSOn = 0
PompaPSOn = 1
Return
5. Realizzazione del Frammento di Programma
Il frammento di programma verrà scritto in assembler.
Prima d’iniziare la stesura del programma andiamo a calcolare i numeri binari corrispondenti
ai valori di umidità di riferimento (10% e 25%) facendo uso dell’eq. (3):
Rif 10%  
10  5 5

 4.54  4
V
1.1
(17)
25  5 20

 18.18  18
V
1.1
(18)
Rif 25%  
Inoltre indichiamo come verranno connessi i dispositivi ai pin del PIC:
PORTA:
 Output:
 A7 A6 A5: Selezione Canale del Mux
 Input
 A4 A3 A2 A1 A0: Valore Binario da Acquisire
PORTB:
 Output:
 B6: PompaPT
 B5: PompaPS
 B4: PompaST
 Input:
 B3: SPVuoto
 B2: SerbVuoto
 B1: SerbPieno
 B0: Pulsante
; Assegnazione Variabili
Umid1
equ
Umid2
equ
Umid3
equ
Umid4
equ
Umid5
equ
Umid6
equ
Umid7
equ
Umid8
equ
Media
equ
Irrigazione
equ
PompaPTOn
PompaPSOn
PompaSTOn
SPVuoto
SerbVuoto
SerbPieno
Pulsante
equ
equ
equ
equ
equ
equ
equ
H’20’
H’21’
H’22’
H’23’
H’24’
H’25’
H’26’
H’27’
H’28’
H’29’
6
5
4
3
2
1
0
; Il programma verrà conservato a partire dalla locazione 0
org
0
; Configurazione I/O Ports
banksel
TRISA
movlw
movwf
B’00011111’
TRISA
; Configura come Output i primi 5 bit per i valori di Umidità
; E come Input gli ultimi 3 per pilotare il multiplexer
movlw
movwf
B’10001111’
TRISB
; Configura come Input i primi 4 bit per i sensori ed il puls.
; B3:SPVuoto – B2:SerbVuoto – B1:SerbPieno – B0:Pulsante
; E come Output gli altri 3 bit per le pompe.
; B6:PompaPT – B5: PompaPS – B4:PompaST
; Non discuto della configurazione dei bit per il Display
; Inizio Programma
Inizio
; Inizializzazione Output
clrf
PORTB
clrf
Irrigazione
; Acquisizione Umidità
; Umid1
bcf
PORTA, 5
bcf
PORTA, 6
bcf
PORTA, 7
movf
PORTA, w
movwf
Umid1
bcf
Umid1, 5
bcf
Umid1, 6
bcf
Umid1, 7
; Umid2
bsf
PORTA, 5
bcf
PORTA, 6
bcf
PORTA, 7
movf
PORTA, w
movwf
Umid2
bcf
Umid2, 5
bcf
Umid2, 6
bcf
Umid2, 7
; Umid3
bcf
PORTA, 5
bsf
PORTA, 6
bcf
PORTA, 7
movf
PORTA, w
movwf
Umid3
bcf
Umid3, 5
bcf
Umid3, 6
bcf
Umid3, 7
; Label di Inizio Programma
; Porta a 0 tutti i bit di PORTB spegnendo tutte le pompe
; Spegne l’irrigazione
; Ordina al Multiplexer di portare in ingresso il canale 0
; Acquisisce l’intero byte conservandolo in Umid1
; Cancella i 3 bit più a destra in quanto non facenti parte
; del valore acquisito
; Ordina al Multiplexer di portare in ingresso il canale 1
; Acquisisce l’intero byte conservandolo in Umid2
; Cancella i 3 bit più a destra in quanto non facenti parte
; del valore acquisito
; Ordina al Multiplexer di portare in ingresso il canale 2
; Acquisisce l’intero byte conservandolo in Umid3
; Cancella i 3 bit più a destra in quanto non facenti parte
; del valore acquisito
; Umid4
bsf
bsf
bcf
movf
movwf
bcf
bcf
bcf
; Umid5
bcf
bcf
bsf
movf
movwf
bcf
bcf
bcf
; Umid6
bsf
bcf
bsf
movf
movwf
bcf
bcf
bcf
; Umid7
bsf
bcf
bsf
movf
movwf
bcf
bcf
bcf
; Umid8
bsf
bcf
bsf
movf
movwf
bcf
bcf
bcf
PORTA, 5
PORTA, 6
PORTA, 7
PORTA, w
Umid4
Umid4, 5
Umid4, 6
Umid4, 7
; Ordina al Multiplexer di portare in ingresso il canale 3
PORTA, 5
PORTA, 6
PORTA, 7
PORTA, w
Umid5
Umid5, 5
Umid5, 6
Umid5, 7
; Ordina al Multiplexer di portare in ingresso il canale 4
PORTA, 5
PORTA, 6
PORTA, 7
PORTA, w
Umid6
Umid6, 5
Umid6, 6
Umid6, 7
; Ordina al Multiplexer di portare in ingresso il canale 5
PORTA, 5
PORTA, 6
PORTA, 7
PORTA, w
Umid7
Umid7, 5
Umid7, 6
Umid7, 7
; Ordina al Multiplexer di portare in ingresso il canale 6
PORTA, 5
PORTA, 6
PORTA, 7
PORTA, w
Umid8
Umid8, 5
Umid8, 6
Umid8, 7
; Ordina al Multiplexer di portare in ingresso il canale 7
; Acquisisce l’intero byte conservandolo in Umid4
; Cancella i 3 bit più a destra in quanto non facenti parte
; del valore acquisito
; Acquisisce l’intero byte conservandolo in Umid5
; Cancella i 3 bit più a destra in quanto non facenti parte
; del valore acquisito
; Acquisisce l’intero byte conservandolo in Umid6
; Cancella i 3 bit più a destra in quanto non facenti parte
; del valore acquisito
; Acquisisce l’intero byte conservandolo in Umid7
; Cancella i 3 bit più a destra in quanto non facenti parte
; del valore acquisito
; Acquisisce l’intero byte conservandolo in Umid8
; Cancella i 3 bit più a destra in quanto non facenti parte
; del valore acquisito
; Calcolo Media
; Somma degli 8 valori
clrf
Media
movf
Media, w
addwf
Umid1, w
addwf
Umid2, w
addwf
Umid3, w
addwf
Umid4, w
addwf
Umid5, w
addwf
Umid6, w
addwf
Umid7, w
addwf
Umid8, w
movwf
Media
; Divisione per 8
bcf
STATUS, C
rrf
Media, f
bcf
STATUS, C
rrf
Media, f
bcf
STATUS, C
rrf
Media, f
; Media = 0
; W = Media
; W = W + Umid1
; W = W + Umid2
; W = W + Umid3
; W = W + Umid4
; W = W + Umid5
; W = W + Umid6
; W = W + Umid7
; W = W + Umid8
; Media = W
;C=0
; Media = Media/2
;C=0
; Media = Media/2
;C=0
; Media = Media/2
; Controllo Irrigazione
movlw
D’4’
subwf
Media, w
btfsc
STATUS, C
goto
I1
movlw
D’1’
movwf
Irrigazione
; W = 4DEC
; W = Media – W, C = 0 se Media < 4
; Se C = 0 (cioè Media<10%) salta la prossima istruzione
; Vai alla label I1
; Irrigazione = 1  Ordina d’irrigare
I1
movlw
subwf
btfss
goto
movlw
movwf
D’18’
Media, w
STATUS, C
I2
D’0’
Irrigazione
; W = 18DEC
; W = Media – W, C = 1 se Media > 18
; Se C = 1 (cioè Media>25%) salta la prossima istruzione
; Vai alla label I2
; Irrigazione = 0  Ordina d’interrompere d’irrigare
I2
call
ControlloPompe
; Vai alla Subroutine di Controllo delle Pompe
btfss
goto
call
goto
PORTB, 0
Inizio
AggiornaDisplay
Inizio
; Se B0=1 (Pulsante premuto) salta la prossima istruzione
; Vai alla label ‘Inizio’
; Vai alla subroutin di Aggiornamento Display
; Vai alla label ‘Inizio’
ControlloPompe
btfsc
Irrigazione, 0
; Se Irrigazione = 0 salta la prossima istruzione
goto
A1
; Vai alla label ‘A1’
bcf
PORTB, PompaPTOn ; Spegni Pompa Pozzo  Terreno
bcf
PORTB, PompaSTOn ; Spegni Pompa Serbatoio  Terreno
goto
RiempimentoSerbatoio ; Vai a label ‘RiempimentoSerbatoio’
A1
btfsc
goto
bsf
goto
PORTB, SPVuoto
; Se SPvuoto=0 (cioè Pozzo non Vuoto) salta prossima istruz.
A2
PORTB, PompaPTOn ; Accendi Pompa Pozzo  Terreno
RiempimentoSerbatoio ; Vai a label ‘RiempimentoSerbatoio’???
A2
bcf
btfsc
goto
bsf
goto
PORTB, PompaPTOn ; Spegni Pompa Pozzo  Terreno
PORTB, SerbVuoto
; Se SerbVuoto=0 (Serb non Vuoto) salta prossima istruz.
A3
PORTB, PompaSTOn ; Accendi Pompa Serbatoio  Terreno
RiempimentoSerbatoio ; Vai a label ‘RiempimentoSerbatoio’
A3
bcf
PORTB, PompaSTOn ; Spegni Pompa Serbatoio  Terreno
RiempimentoSerbatoio
btfss
PORTB, SerbPieno
; Se SerbPieno=1 (Serbatoio Pieno) salta prossima istruz.
goto
A4
bcf
PORTB, PompaPSOn ; Spegni Pompa Pozzo  Serbatoio
return
A4
btfss
goto
bcf
return
PORTB, SPVuoto
; Se SPVuoto=1 (Pozzo Vuoto) salta prossima istruz.
A5
PORTB, PompaPSOn ; Spegni Pompa Pozzo  Serbatoio
A5
bsf
return
PORTB, PompaPSOn ; Accendi Pompa Pozzo  Serbatoio