Vai al contenuto
PLC Forum


Termostato Con Pic E Sonda Ds18B20


Messaggi consigliati

Inserito:

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


Inserita:

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

		    }

    }


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...