Vai al contenuto
PLC Forum


Termostato Con Pic E Sonda Ds18B20


Sby

Messaggi consigliati

Buongiorno a tutti,

scrivo perchè da ieri sera sto cercando un modo per costruire un termostato con i due semiconduttori soprascritti, utilizzando come compilatore Mikrobasic.

Mi accontenterei anche di C, dove poi farei la conversione a basic.

Ho cercato in giro ma i progetti descritti bene sono tutti fatti con l'LM35 o simili, quelli con DS1820 invece si limitano alla descrizione ma non alla parte di programmazione.

C'è qualcuno di voi che sa darmi una mano?

Grazie comunque dell'attenzione

Saluti

Davide

Link al commento
Condividi su altri siti


Sotto ti riporto il codice in "C" (compilatore CCS).

Il codice è "così come é". Fa aprte di un programma per un data logger di temperature che ho realizzato circa 5 anni fa usando un pic16F88 ed un DS18B20.

Il lavoro funzionava egragiamente. L'ho provato recentemente anche con un pic16F877 senza problema alcuno.


/*******************************************************************************

*																			  *

* Funzioni per leggere la temperatura da un dispositivo DS18B20			    *

*																			  *

*******************************************************************************/

//

// Le 3 definizioni che seguono sono legate alla definizione circuitale

//

#define DQ (port_d,7)   //definisce la linea di 1 Wire bus

#define Lz_DQ (0b011111111) //D7 ==> output, tutti gli altri input

#define Hz_DQ (0b011111111) //D7 ==> output, tutti gli altri input

/*******************************************************************************

*																			  *

*			    Definizioni dei comandi per DS18B20						   *

*																			  *

*******************************************************************************/

//byte const srchrom = 0xf0;   //comando "search ROM"

byte const rdrom =   0x33;    //comando "read ROM"

byte const mtchrom = 0x55;    //comando "match ROM"

byte const skprom =  0xcc;    //comando "skip ROM"

byte const conv_t =  0x44;    //comando "converti temperatura"

byte const rd_dat =  0xbe;    //comando "leggi i dati dalla memoria"

/******************************************************************************/

BOOLEAN On_reset()

	    {

		    int1 b_ack;

		    b_ack = FALSE;

		    set_tris_d(0b01000000);	  //D6 ==> input, tutti gli altri output

		    bit_clear(port_d,7);    //forza a 0 la linea DQ

		    delay_us(250);

		    delay_us(250);

		    set_tris_d(0b1100000);	  //D6 e 7 == in; gli altri tutti output

		    delay_us(70);

		    if( bit_test(port_d,7) == 0)

								  b_ack = TRUE;

		    delay_us(250);

		    delay_us(200);

		    return b_ack;

	    }

/******************************************************************************/

byte DSrx_byte()	  //Lettura di un byte i memeorizzazione nel buffer

    {

		 byte dato = 0;

		 int icnt;

		    for ( icnt = 0; icnt < 8; icnt++)

		    {

		    set_tris_d(0b01000000);	 //D6 ==> input, tutti gli altri output

			    bit_clear(port_d,7);    //forza a 0 la linea DQ

			    delay_us(1);

			    set_tris_d(0b1100000);  //D6e7 == in; gli altri tutti output

			    delay_us(18);		   //Porto DQ in HZ e aspetto 1 us

			    if(  bit_test(port_d,7)  == 1){

					    bit_set(dato,icnt);

			   }

			    else {

					    bit_clear(dato,icnt);

			    }

			    delay_us(60);

		    }

	    return(dato);

    }

/******************************************************************************/

void DStx_byte(byte dato)	 //Scrittura di un byte memorizzato nel buffer

	    {

		    int1 bit;

		    int icnt;

		    for ( icnt = 0; icnt < 8; icnt++)

		    {

			    set_tris_d(0b01000000);   //D6 ==> input, tutti gli altri output

			    bit_clear(port_d,7);	  //forza a 0 la linea DQ

			    bit = bit_test(dato,icnt);    //ricavo il valore del bit cor-

											   //rispondente al numero di

											   //iterazioni effettuate

			    if ( bit == 1)

			    {

				   set_tris_d(0b1100000);  //D6e7 == in; gli altri tutti output

				   delay_us(80);

			    }

			    else {

					    bit_clear(port_d,7);    //forza a 0 la linea DQ

					    delay_us(80);

					    set_tris_d(0b1100000);  //D6e7 == in; gli altri output

					 }

			    delay_us(4);				 //Porto DQ in HZ e aspetto 4 us

		    }

	    }

/******************************************************************************/

void tem_conv(int *pnt)//lettura temperatura e momoin array punyato da "pnt"

    {

	   int1 b_ack;

	   int i, dato;

		    b_ack = On_reset();   //invio comando di reset al DS18S20

		    if ( b_ack == FALSE)

		    {

			    dato = skprom;    //invio il comando "skip ROM"

			    DStx_byte(dato) ; // scrivi byte

			    dato = conv_t;    //invio il comando "converti"

			    DStx_byte(dato) ; // scrivi byte

		    do

			   {

				  dato = DSrx_byte();	    // leggi byte

			   }while (dato =! 0xff);

			    set_tris_d(0b01000000);   //D6 ==> input, tutti gli altri output

			    bit_set(port_d,7);	    //forza a "1" la linea DQ

			    delay_us(250);

			    set_tris_d(0b1100000);  //D6e7 == in; gli altri tutti output

			    On_reset();

			    delay_us(250);

			    dato = skprom;    //invio il comando "skip ROM"

			    DStx_byte(dato) ;

			    delay_ms(250);

			    dato = rd_dat;	  //invio comando "leggi i dati"

			    DStx_byte(dato) ;

			    for ( i=0; i<2; i++)

			    {

				    *(pnt+i)=DSrx_byte();

			    }

		    }

		    else

		    {

				    *pnt = 0;	 //non cè presenza del dispsoitivo

				    *(pnt+1) = 0;	 //non cè presenza del dispsoitivo

		    }

    }


Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...