TEMA D'ESAME DI MATURITÀ PROFESSIONALE 2010

LISTATO 

;by Vittorio Crapella i2viu@libero.it

            .title  "CONTROLLO UMIDITÀ"       ; Titolo del programma
.vers   "ST62E60"        ; Microprocessore usato 
.w_on             ; Abilita la memoria a finestre
;       4 Mhz                  ; 26-06-2010

;----------------------------------------------
;|       VARIABILI DEL MICROPROCESSORE        |

            .input "st626reg"
;----------------------------------------------

;|      VARIABILI usate da questo PROGRAMMA   |

;----------------------------------------------

flag       .def      084h    ;se 1= irrigazione se 0= non irriga
lsb        .def      085h    ;byte meno significativo per ricordare le letture dell'ADC
msb      .def      086h    ;byte più significativo che dopo 256 conversioni sarà la media
media   .def      087h    ;per tenere il valore medio della %RH 
cont     .def      088h    ;per tenere il conteggio del numero di conversioni   
mux      .def      089h    ;contatore binario a 3 bit per cd4051              
;fino a   0bfh    massimo

;*******************************

;***   Settaggio iniziale    ***

;*******************************

            .org    080h      ; Significa: da qui in poi memorizziamo il  programma nella memoria ROM

inizio                     ; Inizializzazione del micro

            ldi     wdog,0ffh  ; Carico il Watch-Dog.

;***  Setta la porta A

 ldi        port_a,00000000b      ; bir 0, 1 ,2 = output
 ldi        pdir_a,00000111b      
  ldi       popt_a,00000111b

;***  Setta la porta B

 ldi     port_b,10000000b        ;pb0 input galleggiante pozzo pb1 input gall. cisterna
 ldi     pdir_b,00011100b        ;pb2 out POMPA =0 spenta =1 accesa
 ldi     popt_b,10011100b        ;pb4 out EV 3 VIE =0 pozzo =1 serbatoio
                                               ;pb3 out EV serbatoio =0 chiusa =1 aperta
                                               ;pb5 out EV pozzo =0 chiusa =1 aperta
                                                ;pb7 input ADC

;***  Setta la porta C

 ldi     port_c,00000000b        ;pc2 pc3 pc4 conf. per SPI seriale
ldi     pdir_c,00000000b       
 ldi     popt_c,00000000b        ;

;***  Disabilita gli Interrupt che non servono
 ldi     adcr,0         ;disabilita A/D interrupt
 ldi     tscr,0         ;disabilita TIMER interrupt
 ldi     ior, 0         ;disabilita TUTTI gli interrupt
 reti                   
  jp      main    

tim_int  reti

art_int  reti     

C_int    reti

AB_int     reti

nmi_int    reti

;*************************************************

;***                       SUBROUTINE           ***

;**************************************************

RS232  ;sobrutine               ;qui andrà scritto la parte per la comunicazione attraverso la porta SPI e il PC
                     ret

inadc  ;sobrutine                ;qui andrà scritto la parte per la conversione ADC lettura della tensione equivalente all'umidità
                    ret

;******************************************

;PROGRAMMA PRINCIPALE

;******************************************

MAIN         ldi        wdog,255                   
AZZERA     clr        cont                 ;azzera variabile CONT
                clr        flag

CLRLSB        clr        lsb                   ;prepara le variabili per memorizzare el 256 letture di umidità

                clr        msb

CLRMUX      clr        mux                 ;conterrà valore binario tra 0 e 7 per indirizzare CD4051

                ld         a,mux               ;mette il valore di mux in a

                ld         port_a,a           ;manda i bit al 4051

INCMUX     inc        mux                 ;mux=mux+1

                ld         a,mux

                cpi        a,8                   ;verifica se ha indirizzato tutti i sette ingressi

                jrz        CLRMUX            ;se siamo a 8 allora va ad azzerare e ricomincia

                call       inadc                ;chiama la sobrutine per la gestione della lettura con ADC

                add      lsb,a                 ;somma a LSB il valore del registro a di ritorno dall'ADC

                jrnc      OLTRE                ;se non c'è riporto va oltre

                inc        msb                 ;altrimenti incrementa MSB

OLTRE      inc        cont                 ;cont= cont +1 tiene conto del numero di letture fatte

                ld         a, cont             ;mette il valore di cont nel registro a per valutare a che punto siamo

                cpi        a,0                   ;se a=0 significa che abbiamo fatto 256 letture

                jrz        MEDIA_             ;se si va a prendere la media

                jp         INCMUX            ;altrimenti ricomincia per altra lettura

MEDIA_      ld         a,msb               ;mette nel reg. a il valore della umidità media

               call       RS232             ;chiama la sobrutine per comunicare dati tra micro e PC

                ld         a,flag                ;prende il valore del flag per valutare se 1 o 0 (irriga o no)

                cpi        a,0                   ;se 0 va a verificare se la media è minore di 109

                jrz        VERI109            ;va verificare se 109

                jp         VERI219             ;altrimenti verifica se è 219

VERI109     ld        a,msb               ;riprende valore medio

                cpi        a,109               ;verifica se 109

                jrnc      VERSERB            ;se non è minore salta

                jp         irriga                ;altrimenti va a predisporre per l'irrigazione

VERSERB    jrs        1,port_b,OKS    ;se il bit 1 di port_b è 1 va a OKS (galleg. serbatoio aperto ok)

                jrs        0,port_b,OKP  ;se il bit 0 di port_b è 1 va a OKP (galleg. pozzo aperto acqua ok)

                jp         clrlsb                ;ricomincia nuovo ciclo con 256 letture per nuova media

OKS          res       2,port_b          ;azzera bit 2 di port_b per tenere diseccitato relè pompa OFF

                res       3,port_b          ;azzera bit 3 di port_b per tenere chiuso EV serbatoio

                jp         CLRLSB               ;ricomincia nuovo ciclo con 256 letture per nuova media

OKP          res       4,port_b          ;bit 4  a 0 per tenere la EV 3 VIE verso il pozzo

                set        3,port_b          ;bit 3 a 1 per aprire EV riempimento serbatoio

                set        2,port_b          ;bit 2 a 1 per eccitare relè pompa = accesa on

                jp         CLRLSB                ;ricomincia nuovo ciclo con 256 letture per nuova media

IRRIGA      ldi        flag,1               ;flag=1 ricorda che si sta irrigando

                res       4,port_b          ;bit 4  a 0 per tenere la EV 3 VIE verso il pozzo

                set        5,port_b          ;bit 5  a 1 per aprire la EV di irrigazione

VERPOZ     jrs        0,port_b,POMPON         ;salto se il galleggiante è aperto = 1 pozzo con acqua

                res       2,port_b             ;azzera bit 2 di port_b per diseccitare relè pompa OFF spenta

                jrs        1,port_b,SUSERB  ;salto se il galleggiante è aperto = 1 serbatoio con acqua

                res       4,port_b              ;bit 4  a 0 per tenere la EV 3 VIE verso il pozzo

                jp         CLRLSB               ;ricomincia nuovo ciclo con 256 letture per nuova media

POMPON     set        2,port_b          ;bit 2 a 1 per eccitare relè pompa = accesa on

                jp         clrlsb                ;ricomincia nuovo ciclo con 256 letture per nuova media

SUSERB     set        4,port_b           ;bit 4  a 1 per girare la EV 3 VIE verso il serbatoio

                jp         CLRLSB                ;ricomincia nuovo ciclo con 256 letture per nuova media

VERI219     ld        a,msb                ;prende media nel reg. a

                cpi        a,219

                jrc        VERPOZ            ;salta se minore

                clr        flag                  ;se maggiore o = azzera flag per ricordare fine irrigazione

                res       2,port_b          ;azzera bit 2 di port_b per diseccitare relè pompa OFF spenta

                res       5,port_b          ;bit 5  a 0 per chiudere la EV di irrigazione

                jp         VERSERB

;**************************************

;***       VETTORI DI INTERRUPTS    ***

;*************************************

            .org    0ff0h

 jp      tim_int                 ;timer int e A/D int        vector #4
 jp      art_int    
           ;artimer int      vector #3
 jp      C_int                  ;port C spi int   vector #2
 jp      AB_int  
            ;port A B int     vector #1

            .org    0ffch
 jp      nmi_int   
              ;nmi int        vector #0
 jp       inizio                    ;reset vector
 end                                ; Fine del programma

 

FLOW-CHART

Altre soluzioni