Pagina 1 di 1

PIC e sonda di temperatura

MessaggioInviato: 18 gen 2013, 17:28
da ricello9
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:

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.

Re: PIC e sonda di temperatura

MessaggioInviato: 18 gen 2013, 17:51
da simo85
ricello9 ha scritto:Questo è il codice che eseguo dentro il timer 2

Che lungo.. Sicuro che non puoi evitare di fare tutto quello all'interno della ISR ed eseguire una funzone esterna?

Comunque credo che il codice può essere migliorato.

Re: PIC e sonda di temperatura

MessaggioInviato: 18 gen 2013, 18:37
da ricello9
Sicuro che non puoi evitare di fare tutto quello all'interno della ISR ed eseguire una funzone esterna?


Ciao gohan, questa sera prova a ridurre il codice come mi hai suggerito.
Ma secondo te è fattibile l'idea di disabilitare i vari interrupt prima di dialogare con la sonda di tempertura e alla fine riabilitarli?