Home
Accesso / Registrazione
 di 

Come visualizzare una temperatura mediante conversione A/D con PIC MICRO

PIC16F876.jpeg

Come preannunciato (Visualizzare una temperatura mediante conversione A/D su display a due righe con PIC MICRO), in questo articolo darò la descrizione delle parti fondamentali del firmware da caricare nel micro, per leggere convertire e visualizzare la temperatura rilevata dal sensore.

Partirò dall'impostazione dei registri dell'ADC, per arrivare all'utilizzo delle librerie grafiche incluse nel software MikroC che permettono di visualizzare con semplicità qualunque tipo di testo.

Definizione registri ADC

Per quanto detto nel precedente articolo, è facile intuire che per far funzionare il convertitore analogico digitale interno al micro, è necessario settare correttamente i registri ADCON0 e ADCON1.

In particolare nel firmware da me sviluppato, i settaggi sono stati i seguenti:
ADCON0=0x80 "esadecimale" che in binario diventa: 10000000
ADCON1=0x8E "esadecimale" che in binario diventa: 10001110

Considerando che il primo bit a sinistra è il bit7 mentre l'ultimo è il bit 0, consultando la tabella del registro ADCON0 del precedente articolo, si può vedere come in tal caso ho solo provveduto impostare la frequenza di conversione pari ad 1/32 della frequenza d'oscillazione del clock, lasciando tutti gli altri parametri come default. Essendo comodo ai fini della progettazione hardware, ho lasciato il pin A0 come ingresso analogico, infatti i bit da 5 a 3 sono a zero.

Per il registro ADCON1 invece ho impostato i bit che mi permettono di avere il pin A0 come ingresso analogico, mentre i bin A1 A2 ed A3 come I/O digitali, infatti la configurazione dei bit che vanno da 3 a 0 come 1110, guardando la tabella del registro ADCON1 corrisponde alla codifica che impone quanto detto sopra.
Oltre che l'impostazione di questi due registri, bisogna impostare il registro TRISA, che è colui che comanda la direzione dei pin del micro.Nel caso in questione, si avrà:
TRISA=0x07;//0b00000111;
Che impone il pin A0 come ingresso "analogico" ed i pin A1 ed A2 come digitali.
Di seguito si riporta il listato del firmware che esplica la definizione delle variabili e dei registri di controllo.

---------------------------------------------------------------------------
#include"built_in.h"
unsigned char ch;
unsigned int t,oldstate,m1,m2,Temp_dec,Temp_unit,
somma,somma1,AD,init,but,n,ack;
unsigned short i,flag,r_flag,flag_int;
char *tc,*pom,*name,fi;
long tlong;
char Soglia1[2];
char *buf[15];
//Definizione delle funzioni usate nel programma
void soglia(void);  //Impostazione della soglia 
oltre la quale attacca la pompa
void Memory(void);  //Routine di memorizzazione 
in EEProm della soglia impostata e di conversione A/D
void Control_min(void);//Routine di controllo superamento 
della soglia
void Allarme(void); //Routine di controllo 
superamento dei 70 °C
void Control_man(); //Routine di Controllo 
spegnimento manuale pompa e 
riaccensione con controllo superamento 70 °C
void Maschera();    //Maschera di presentazione 
Software e Progettista
void Control_min1(void);//Routine di controllo 
temperatura max = 70°C se la pompa è messa off manualmente
//************************************
void mask_radio(void);
void main() {
Soglia1[0] =0x30; //0b00110000;
Soglia1[1] =0x31; //0b00110001;
TRISB=0x01;
TRISA=0x07;//0b00000111;
TRISC=0xbb;
//Definizione registri per il convertitore ADC
ADCON0=0x80;
ADCON1=0x8E;
..
...
....
.....

Dove nelle ultime righe si pò notare quanto descritto pocanzi.

Routine di Conversione

Di seguito è riportata la routine, che permette di leggere il valore analogico presente sull'ingresso A0 del pic micro, e di convertire la cifra binaria, in uno o più cartteri alfanumerici da inviare verso il display.

Si può notare come nella riga "t  = ADC_read(0);" venga memorizzato il valore convertito.

    t  = ADC_read(0);   // Legge il valore presente sul primo canale dell'ADC
    LCD_Chr(1,3,223);   // Punto rappresentativo °
    LCD_Out(1,4,"C  Ambiente");
    LCD_Chr(2,13,40);
    LCD_Chr(2,16,41);
    LCD_Out(2,1,"Start Pompa");
    LCD_Chr(2,14,m1);
    LCD_Chr(2,15,m2);

A questo punto dopo aver convertito la grandezza analogica, otterremo un valore intero corrispondente alla temperatura convertita secondo la regola: 

                                                       N=Vin*2e^(10)/Vref

Ovviamente non è possibile inviare verso un display un valore intero composto da due cifre, ad esempio 10 , per pretendere di vederlo visualizzato sui suoi segmenti, ma è necessario separare le cifre della quantità da inviare mandandole una per volta.Quindi nel caso di un valore convertito corrispondente a 10°C, noi dovremmo mandare verso il display prima la cifra uno e poi la zero.

Tutto ciò viene eseguito dalla routine di seguito, che prende un intero corrispondente al valore convertito, e separa le cifre preparandole all'invio verso il display.

    tlong  = t * 5000;                   
    asm {                           
      MOVF STACK_2,W
      MOVWF _tlong+2
      MOVF STACK_3,W
      MOVWF _tlong+3
    }
    t = tlong >> 10;
    ch     = t / 1000;              
    ch    = (t / 100) % 10;

Nella variabile Temp_dec, vengono memorizzate le decine relative al valore convertito, per poi essere inviate al display: 

    Temp_dec=ch+48;
    LCD_Chr(1,1,48+ch);

Nella variabile Temp_unit vengono memorizzate le unità relative al valore convertito per poi essere inviate al display:

    Temp_unit=ch+48;
    LCD_Chr_CP(48+ch);

 

Le routine di invio caratteri al display

Il software di sviluppo MikroC , tra le tante funzioni, mette anche a disposizione quelle relative alla gestione dei comunissimi display a doppia riga con controller HDD44780.

Le seguenti funzioni, permettono sia di visualizzare un testo, che un singolo carattere.

Di default il software prevede l'uso della porta B dedicata al display, utilizzando 4 pin di dati e due di controllo.

Di seguito indicherò le funzioni principali, che ho utilizzato nello sviluppo del firmware:

 

Lcd_Cmd(LCD_CLEAR);          //Pulizia schermo

LCD_Chr(1,1,"carattere");      //Permette di scrivere un carattere partendo dalla posizione 1,1.

Il primo uno indica la riga, mentre il secondo uno la posizione in cui verrà scritto il carattere.

Essendo il display un 2X16, ovvero 2 righe a 16 caratteri cisacuno, con questa funzione riusciremo a posizionare il carattere o numero, in qualunque posizione dello schermo.

LCD_Out(1,i,name);             //questa funzione, permette di inviare direttamente un testo, in questo caso memorizzato nella variabile name, partendo dalla posizione i-esima della riga 1.

Ci sono tante altre funzioni, di uso meno comune, che permettono di personalizzare le applicazioni che è possibile trovare nella guida del software MikroC.

Il presente articolo ha dato solo traccia delle funzioni essenziali di conversione e visualizzazione su display, inquanto sarebbe stato decisamente lungo e sicuramente poco istruttivo il commento di tutto il firmware di gestione del dispositivo. Pertanto ho deciso appositamente di focalizzare l'attenzione in modo sintetico, sulle parti essenziali del sistema, rimanendo a completa disposizione, per eventuali chiarimenti o approfondimenti.

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di GianGrezo

programma intero

Salve, per caso è disponibile l'intero programma che provvede a convertire il segnale e a visualizzarlo sul display?
Grazie in anticipo!

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 2 utenti e 42 visitatori collegati.

Utenti online

Ultimi Commenti