E

DS18S20 & DS18B20 Driver CCS c

Başlatan Erata, 06 Kasım 2012, 05:19:49

Erata


1wire.c


// (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

/***********************1Wire Class***********************/
/*Description: This class handles all communication */
/* between the processor and the 1wire */
/* sensors.
/*********************************************************/

/*-------1-wire definitions-------*/
#define ONE_WIRE_PIN PIN_A0

/*******************1-wire communication functions********************/

/************onewire_reset*************************************************/
/*This function initiates the 1wire bus */
/* */
/*PARAMETERS: */
/*RETURNS: */
/*********************************************************************/

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 );
}





ds1820.c


float ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;

onewire_reset();
onewire_write(0xCC);
onewire_write(0x44);

while (busy == 0)
  busy = onewire_read();

onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);

result = (float) temp3 / 2.0;   //Calculation for DS18S20 with 0.5 deg C resolution
// result = (float) temp3 / 16.0;  //Calculation for DS18B20 with 0.1 deg C resolution

delay_ms(200);
return(result);
}





Test program:




#include <16F877A.h>
#device *=16
#device adc=8

#FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT     
#use delay(clock=20000000)

#include<1wire.c>
#include<lcd.c>
#include<ds1820.c>


void main()
{
float temperature;

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(VREF_LOW|-2);

lcd_init();
lcd_putc("\f");

while (1)
{
  temperature = ds1820_read();

  lcd_gotoxy(1,1);
  printf(lcd_putc,"TEMP: %3.1f ", temperature);
  lcd_putc(223);
  lcd_putc("C    ");

  lcd_gotoxy(1,2);
  if(temperature >= 29.0)
   printf(lcd_putc,"Hot!    ");
  else if( temperature >= 20 && temperature < 29.0)
   printf(lcd_putc,"Comfort!");
  else
   printf(lcd_putc,"Cold!   ");
}

}





alıntıdır

umitco

#1
1wire.c dosyasında , bu bölümde hata veriyor (#device reguired before this line)

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);
}

pwm.c

#2
DS18B20 ile denediğim uygulamayı vereyim. %100 çalışıyor.

ds18b20.c dosyası:
#define ONE_WIRE_PIN PIN_c0
void onewire_reset() 

{
output_low(ONE_WIRE_PIN);
delay_us( 500 ); //1-wire resetleme için sıfıra çekilir
output_float(ONE_WIRE_PIN); //1-wire bir yapılır
delay_us( 500 ); // sensörün hazırlanması için beklenir.
output_float(ONE_WIRE_PIN);
} 

void onewire_write(int data)
{
int count;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); // Sensöre yazma işlemine başlamak için  1-wire sıfıra çekilir.
output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // yazılacak bilgi 1-wire'da
delay_us( 60 ); // Yazma işlemi zamanı doldurulur.
output_float(ONE_WIRE_PIN); // 1-wire bir yapılır,
delay_us( 2 ); // 1us'den fazla beklenir.
}
} 

int onewire_read()
{
int count, data;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); //Sensördem okuma işlemi içinl 1-wire sıfıra çekilir.
output_float(ONE_WIRE_PIN); //1-wire bir yapılır,
delay_us( 8 ); // Sensörün kendine gelmesi beklenir,
shift_right(&data,1,input(ONE_WIRE_PIN)); // sonuc bilgisi alınır.
delay_us( 120 ); //Okuma işlemi zamanı doldurulur.
}
return( data );
} 

float ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;
onewire_reset();
onewire_write(0xCC);
onewire_write(0x44);
while (busy == 0)
busy = onewire_read();
onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
result = (float) temp3 / 16.0;
delay_ms(200);
return(result);
}

örnek program:
#include <16f876a.h>            //Kullanılacak pic       
#use delay(CLOCK=4000000)         //Fosc=4Mhz 
#fuses HS,NOWDT,NOPROTECT,NOLVP
#define use_portb_lcd TRUE         //B portu lcd için ayrılıyor
#include <lcd.c>                 //lcd ait fonksiyonlar programa eklenir
#include "ds18b20.c"             //ds18b20 ait fonksiyonlar programa eklenir
//Global değişkenler

///PROGRAM
void main(void){ 
float temp;    
   lcd_init();  // LCD başlangıç ayarları yapılıyor

   while(1)
   {  temp = ds1820_read();                //Sıcaklık bilgisi okunuyor ve çevriliyor
      
      printf(lcd_putc,"\f %3.1f%cC  \n DS18B20 CCS",temp,223); 

      delay_ms(300); // 1/2 sn gecikme veriliyor
   }
}


buda devre şeması:
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

Erata

Alıntı yapılan: umitco - 06 Kasım 2012, 16:23:22
1wire.c dosyasında , bu bölümde hata veriyor (#device reguired before this line)

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);
}




ben derledim problem yok

ccs c  hangi versiyon kullanıyorsunuz

benim kullandığım versiyon 4.107 PCWHD

umitco

4.137 versiyon kullanıyorum. Sanırım hata dosya isminden kaynaklanıyordu , türkce karakter ve birden fazla kelime kullandığımdan olabilir çünki ismi düzletince hata vermedi ve derledi.

Her ikinizin kodları aynı aslında ama arada bir fark var

Erata DS1820.c dosyası 2.0 a bölümüş
result = (float) temp3 / 2.0;

PWM DS18B20.c dosyasında   16.0 a bölünmüş
result = (float) temp3 / 16.0;

Bu farkın bir önemi olurmu ?

Birde verdiğiniz kodları kopyala yapıştır ile programa aldığımızda tüm kodlar tek bir satıra aktarılıyor (buradan kopyala yapıştır ile deneyerek görebilirsiniz). Kodları satır satır aşağı indirmek gerekiyor .Bunuda fonksiyonları bilmediğimiz için her satırda verdiğiniz koda bakıp inceleyerek yapmak gerekiyor. Hani bir iki dosya olsa sorun değilde fazla olunca yoruyor açıkcası. Buna bir protik yol bulabilirmiyiz , belki kodu aldığınızda önce windowsun edit programına kopyalayıp oradan almak olabilir yada kod dosyalarıı upload etmek olabilir..

Erata

benim verdigim dosyada ikiside var  biri kapalı


result = (float) temp3 / 2.0;   //Calculation for DS18S20 with 0.5 deg C resolution
// result = (float) temp3 / 16.0;  //Calculation for DS18B20 with 0.1 deg C resolution


yanlarinda açıklama verlmiş   hassaslık degişiyor   0.5 derece  veya 0.1 derece olarak istedigini acıp kullanabilirsin

umitco

#6
İkinizede teşekkür ederim..

codabas

burada iki ds1820 kullanıp 1-wire iletişimi yapmak istersek nasıl değişiklikler yapmamız gerekir? sensör sayısı artırılarak yapılmış tek örnek bulamadım...

istinaf duvarı

#8
ds1820_read() fonksiyonunu çağırınca --undefined identifier hatası alıyorum.
*** Error 12 "C:\Users\*******\Documents\CCS C Projects\fidenet_clock\fidenet_clock.c" Line 252(35,36): Undefined identifier  -- ds1820_read

temperature değişkeni void main() içerisinde float temperature şeklinde tanımlı.

Fonksiyonun çağrıldığı aşağıdaki if döngüsünü /* */ ile yorumlayarak iptal edip derleyince hata ortadan kalkıyor.
Bu da programın geri kalanında bir problem olmadığını gösteriyor.

if ((genCounter % 500)==450)
      {
         
         temperature = ds1820_read();
         adres(1,3);
         printf(lcd_yaz,"Hava %3.1f%cC",temperature,223);
      }   

DS18B20 sürücü:
#define ONE_WIRE_PIN PIN_c0
void onewire_reset() {
output_low(ONE_WIRE_PIN);
delay_us( 500 ); //1-wire resetleme için sıfıra çekilir
output_float(ONE_WIRE_PIN); //1-wire bir yapılır
delay_us( 500 );// sensörün hazırlanması için beklenir.
output_float(ONE_WIRE_PIN);
} 

void onewire_write(int data)
{
int count;
   for (count=0; count<8; ++count)
   {
   output_low(ONE_WIRE_PIN);
   delay_us( 2 ); // Sensöre yazma işlemine başlamak için  1-wire sıfıra çekilir.
   output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // yazılacak bilgi 1-wire'da
   delay_us( 60 ); // Yazma işlemi zamanı doldurulur.
   output_float(ONE_WIRE_PIN); // 1-wire bir yapılır,delay_us( 2 ); // 1us'den fazla beklenir.
   }
} 
   
int onewire_read()
{
int count, data;
   for (count=0; count<8; ++count)
   {
   output_low(ONE_WIRE_PIN);
   delay_us( 2 ); //Sensördem okuma işlemi içinl 1-wire sıfıra çekilir.
   output_float(ONE_WIRE_PIN); //1-wire bir yapılır,
   delay_us( 8 ); // Sensörün kendine gelmesi beklenir,
   shift_right(&data,1,input(ONE_WIRE_PIN)); // sonuc bilgisi alınır.
   delay_us( 120 ); //Okuma işlemi zamanı doldurulur.}
   return( data );
   } 

float ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;
onewire_reset();
onewire_write(0xCC);
onewire_write(0x44);
while (busy == 0)
busy = onewire_read();
onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
result = (float) temp3 / 16.0;delay_ms(200);return(result);
}

Powered by EzPortal