PIC e sonda di temperatura
Ciao, nel mio progetto sto cercando di far comunicare un pic18.con il sensore di temperatura ds18b20.
Il risultato è che a video mi compare la temperatura misurata dal sensore, e fin qui tutto ok.
I problemi iniziano quando abilito il timer 2, che mi esegue un conteggio ad interrupt ogni mS.
La lettura della temperatura funziona ancora, ma ogni tanto il valore letto è -127.94.
Analizzando il problema ho capito che il codice che gestisce la comunicazione tra il PIC e il sensore di temperatura deve rispettare tempi precisi, per non avere problemi; e l'utilizzo del timer 2 mi varia questi tempi.
Volevo chierdervi quale è la strada più gusta per risolvere questo problema, se per esempio devo disabilitare tutti gli interrup prima di eseguire la lettura della temperatura e poi riabilitarli a lettura eseguita.
Questo è il codice che eseguo dentro il timer 2:
Grazie per l'auito.
Marcello.
Il risultato è che a video mi compare la temperatura misurata dal sensore, e fin qui tutto ok.
I problemi iniziano quando abilito il timer 2, che mi esegue un conteggio ad interrupt ogni mS.
La lettura della temperatura funziona ancora, ma ogni tanto il valore letto è -127.94.
Analizzando il problema ho capito che il codice che gestisce la comunicazione tra il PIC e il sensore di temperatura deve rispettare tempi precisi, per non avere problemi; e l'utilizzo del timer 2 mi varia questi tempi.
Volevo chierdervi quale è la strada più gusta per risolvere questo problema, se per esempio devo disabilitare tutti gli interrup prima di eseguire la lettura della temperatura e poi riabilitarli a lettura eseguita.
Questo è il codice che eseguo dentro il timer 2:
- Codice: Seleziona tutto
if(PIR1bits.TMR2IF==1) //ciclico ogni 1 mS
{
if(GSM_NET==1 && gsm_ready==1)
{
conteggio_campo++;
una_volta=0;
}
if(GSM_NET==0 && una_volta==0 && gsm_ready==1)
{
if(conteggio_campo>1000)
presenza_linea=1;
else
presenza_linea=0;
una_volta=1;
conteggio_campo=0;
}
if(flag_ring==1) //se leggo il fronte di discesa del segnale RING incremento la viabile ogni ms
verifica_sms++;
if(flag_ring>=2) //sul fronte di salita verifico la durata del segnale per discriminare l'sms dalla chiamata (misurato 128ms 122ms)
{
if(verifica_sms>=110 && verifica_sms <=130)
sms_arrivato=1;
else
chiamata=1;
flag_ring=0;
verifica_sms=0;
INTCON2bits.INTEDG0 = 0; //Interrupt on rise edge
}
if(veicolo_in_marcia==1 && segnale_gps_agganciato==1)
lampeggio_veloce++;
if(lampeggio_veloce>=50)
{
lampeggio_veloce=0;
LED_GIALLO=LED_GIALLO^1;
}
if(allarme_inserito==1)
{
lampeggio_furto++;
if(lampeggio_furto>=600 && allarme_furto==0)
{
lampeggio_furto=0;
LED_BLU=LED_BLU^1;
}
}
PIR1bits.TMR2IF=0; //reset flag interrupt timer2
Grazie per l'auito.
Marcello.