Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC e sonda di temperatura

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] PIC e sonda di temperatura

Messaggioda Foto Utentericello9 » 18 gen 2013, 17:28

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.
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

0
voti

[2] Re: PIC e sonda di temperatura

Messaggioda Foto Utentesimo85 » 18 gen 2013, 17:51

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.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: PIC e sonda di temperatura

Messaggioda Foto Utentericello9 » 18 gen 2013, 18:37

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?
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti