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 Um5% 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 Um40% Anziché 5V Le tensioni in uscita dal convertitore non sono quelle desiderate, in particolare: VConv Um5% VConv Um40% mentre dovrebbe essere il contrario, bisognerebbe invertire i valori. VConv Um5% 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 Um5% 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