// onewire library, for dallas onewire devices // currently includes: // - generic onewire functions (init, readbyte, sendbyte, crc, etc.) // - ds1822 dallas-semi econo-thermometer // (C) copyright 2003 j.d.sandoz / jds-pic !at! losdos.dyndns.org // released under the GNU GENERAL PUBLIC LICENSE (GPL) // refer to http://www.gnu.org/licenses/gpl.txt // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //Previously Posted in CCS thread from jds-pic //Revision Made By SCanan Date: 26.06.2007 #include <16f628.h> #device *=16 // internal osilator used #FUSES NOWDT,INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD//for 16f628 #use delay(clock=4000000) #USE RS232(BAUD=9600, XMIT=PIN_B2, RCV=PIN_B1) #include "1wire.c" int8 tH,tL,Conf; float ds1820_read() { int8 busy=0, temp1, temp2; signed int16 temp3; float result; onewire_reset(); onewire_write(0xCC); onewire_write(0x44); delay_ms(200); while (busy == 0) busy = onewire_read(); onewire_reset(); onewire_write(0xCC); onewire_write(0xBE); temp1 = onewire_read(); temp2 = onewire_read(); tH=onewire_read(); tL=onewire_read(); Conf=onewire_read(); temp3 = make16(temp2, temp1); //result = (float) temp3 / 2.0; // 0.5 deg C resolution result = (float) temp3 / 16.0; //0.1 deg C resolution delay_ms(200); return(result); } void main() { float temperature; setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); //for 10 bit resolution mod onewire_write(0xCC); onewire_write(0x4E); onewire_write(125); onewire_write(-55); //this should be done for proper working of DS18B20 onewire_write(127); onewire_reset(); onewire_write(0xCC); onewire_write(0x48); delay_ms(15); while (1) { temperature = ds1820_read(); printf("Temperature= %3.1f\n\r",temperature); } } ////// 1wire.c fontion ////// ///// DS18b20 data pin connected to pic16f628 B0 pin ////// /***********************1Wire Class***********************/ /*Description: This class handles all communication */ /* between the processor and the 1wire */ /* sensors. /*********************************************************/ /*-------1-wire definitions-------*/ #define ONE_WIRE_PIN PIN_B0 /*******************1-wire communication functions********************/ void onewire_reset() // OK if just using a single permanently connected device { output_low(ONE_WIRE_PIN); delay_us( 500 ); // pull 1-wire low for reset pulse output_float(ONE_WIRE_PIN); // float 1-wire high delay_us( 500 ); // wait-out remaining initialisation window. output_float(ONE_WIRE_PIN); } /*********************** onewire_write() ********************************/ /*This function writes a byte to the sensor.*/ /* */ /*Parameters: byte - the byte to be written to the 1-wire */ /*Returns: */ /*********************************************************************/ void onewire_write(int data) { int count; for (count=0; count<8; ++count) { output_low(ONE_WIRE_PIN); delay_us( 2 ); // pull 1-wire low to initiate write time-slot. output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // set output bit on 1-wire delay_us( 60 ); // wait until end of write slot. output_float(ONE_WIRE_PIN); // set 1-wire high again, delay_us( 2 ); // for more than 1us minimum. } } /*********************** read1wire() *********************************/ /*This function reads the 8 -bit data via the 1-wire sensor. */ /* */ /*Parameters: */ /*Returns: 8-bit (1-byte) data from sensor */ /*********************************************************************/ int onewire_read() { int count, data; for (count=0; count<8; ++count) { output_low(ONE_WIRE_PIN); delay_us( 2 ); // pull 1-wire low to initiate read time-slot. output_float(ONE_WIRE_PIN); // now let 1-wire float high, delay_us( 8 ); // let device state stabilise, shift_right(&data,1,input(ONE_WIRE_PIN)); // and load result. delay_us( 120 ); // wait until end of read slot. } return( data ); }