Sby Inserito: 29 marzo 2012 Segnala Share Inserito: 29 marzo 2012 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 More sharing options...
Livio Orsini Inserita: 29 marzo 2012 Segnala Share Inserita: 29 marzo 2012 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora