Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

3 adet ds18b20

Başlatan eraygil, 14 Aralık 2011, 17:47:28

eraygil

mrhaba  arkadaşlar benim  16f877 ile 3 adet ds18b20 ısı sensöründen bilgi almam lağzım  bir tanesi ile yapabiliyorum ancak diğerlerini nasıl yapabilirim lütfen acil yardımlarınızı bekliyorum.   3 sensördeki bilgiyi okuyup lcd ye yansıtamam gerekiyor.   

Kabil ATICI

ds1820.c dosyasından
#define ONE_WIRE_PIN PIN_C7 satırını .  entegreleri bağladığın  bacaklara ata.
#define ONE_WIRE_PIN1 PIN_C5 satırını ekle.
#define ONE_WIRE_PIN2 PIN_C6 satırını ekle

geri kalanları kopyala iki kere kopyla yapıştır.

ONE_WIRE_PIN satırlarını değiştrir. Ana programdan çağrılan satırlarıda unutma
örneğin
void onewire_write(int data)
{
...
}

void onewire_write1(int data)
{
...
}

void onewire_write2(int data)
{
...
}

void onewire_reset()
{
...
}
void onewire_reset1()
{
...
}
void onewire_reset2()
...

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;
delay_ms(200);
return(result);
}
float ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;
onewire_reset1();
onewire_write1(0xCC);
onewire_write1(0x44);
while (busy == 0)
busy = onewire_read1();
onewire_reset1();
onewire_write1(0xCC);
onewire_write1(0xBE);
temp1 = onewire_read1();
temp2 = onewire_read1();
temp3 = make16(temp2, temp1);
result = (float) temp3 / 2.0;
delay_ms(200);
return(result);
}
float ds1820_read2()
{
...

gibi.

hatta atladığım şeyler varsa onları yap


ana programdan

  temperature = ds1820_read();
   printf(lcd_putc,"Sicaklik:\n %3.1f derece", temperature);

  temperature = ds1820_read1();
   printf(lcd_putc,"Sicaklik:\n %3.1f derece", temperature);

  temperature = ds1820_read2();
   printf(lcd_putc,"Sicaklik:\n %3.1f derece", temperature);

en bunu gibi bir şey  ekranda satır tanımlarıa göre göndermen gerekir.
ambar7

emosamca

ds18b20 lerin fabrika üretiminde 64 bitlik seri CRC numaraları (kataloğunda mevcut) vardır.Onewire haberleşmede bu crc numarasını kullanabilirsin. Kataloğunda 55h komutu var. Bu match rom demektir. Bu komuttan sonra 8 byte rom adresini gönderirsen sadece o ds18b20 algılar. Yani aynı hatta istediğin kadar ds18b20 bağlayabilirsin. Ben mikroC de yapmıştım. örnek kod şöyle:
void Read_isi(char konum)
{
    Ow_Reset(&PORTB, ds18b20bDQ);                         // Onewire reset signal
    Ow_Write(&PORTB, ds18b20bDQ, 0x55);                   // ROM adresini dikkate al
    Send_rom_value(konum);                            //bu metodla daha önce hafızaya aldığım rom adresini tek tek gönderiyorum.
    Ow_Write(&PORTB, ds18b20bDQ, 0x44);                   // isiyi çevirmeye başla
    Delay_us(120);

    Ow_Reset(&PORTB, ds18b20bDQ);
    Ow_Write(&PORTB, ds18b20bDQ, 0x55);                   // ROM adresini dikkate al
    Send_rom_value(konum);
    Ow_Write(&PORTB, ds18b20bDQ, 0xBE);                   // ısıyı okuyacağım bilgin olsun

    ds18b20Lsb = Ow_Read(&PORTB, ds18b20bDQ);             // düşük 8 biti oku
    ds18b20Msb = Ow_Read(&PORTB, ds18b20bDQ);             // yüksek 8 biti oku
    ds18b20Temp = (ds18b20Msb << 8) + ds18b20Lsb;         // iki değeri int e dönüştür

}


eraygil

ambar 7 arkadaşım verdiğin bilgiler için çok çok tesekkür ederim ancak  anladığıma göre  3 sensörde ayrı bacaklardan bağlanacak  driver dosyasında 3 pini de belirteceksin.  ama böyle bisey olmaz biliyorum olsada hangi pinden okuma yapacağını nasıl yapıyorsun??

emosamca

eraygil, 3 ayrı bacak kullanmana gerek yok. bütün hepsini tek bacağa bağlayabilirsin. ısıyı çevirme komutu vermeden önce ds18b20 nin 64 bitlik CRC numarasını vereceksin. böylece sadece o seri numarasına sahip olan ısıyı çevirme işlemi yapacak. sonra diğerinin CRC numarasını göndereceksin. o çevirecek. böylece hepsini tek bir metod içerisinda yapabilirsin. aynı şekilde yazılmış 3 ayrı metoda gerek yok. boşu boşuna PIC in hafızasını harcarsın.

Maxim

adı üstünde 1-wire sensor
yani tek kablo sensoru


Kabil ATICI

Alıntı yapılan: eraygil - 16 Aralık 2011, 00:06:41
ambar 7 arkadaşım verdiğin bilgiler için çok çok tesekkür ederim ancak  anladığıma göre  3 sensörde ayrı bacaklardan bağlanacak  driver dosyasında 3 pini de belirteceksin.  ama böyle bisey olmaz biliyorum olsada hangi pinden okuma yapacağını nasıl yapıyorsun??
bunu zaten driver dosyasına sen belirtiyorsun.

ds1820.c kütüphanesi içindeki
#define ONE_WIRE_PIN PIN_C7 satırını .  entegreleri bağladığın  bacaklara ata.
#define ONE_WIRE_PIN1 PIN_C5 satırını ekle.
#define ONE_WIRE_PIN2 PIN_C6 satırını ekle


mavi ile işaretli satır zaten senin ds1820 entegresinin bağlanacağı bacağı belirtir. Bunun için program içindeki bu bacak ile ilgili satırlarıda değiştirmen gerekir. bu sadece örnekti.

ds1820 kodları içindeki kod başlıklarına bak. Buradaki tüm kod 1 tane için verilmiş. bu başlıkları 2. ve 3. içinde oluşturman gerekir. bu biraz senin programa ne kadar  incelediğine bağlı. Verdiğim sadece işin temelini oluşturacak türden bir şeydi. Normalde gidilecek çok yol vardır, seçmek sana bağlıdır.

Arkadaşlar entegrenin içindeki eşsizlik kodu kullanımını önermişler.  Bu da sana kalmış.
ambar7

M_B

Alıntı yapılan: emosamca - 15 Aralık 2011, 13:27:00
ds18b20 lerin fabrika üretiminde 64 bitlik seri CRC numaraları (kataloğunda mevcut) vardır.Onewire haberleşmede bu crc numarasını kullanabilirsin. Kataloğunda 55h komutu var. Bu match rom demektir. Bu komuttan sonra 8 byte rom adresini gönderirsen sadece o ds18b20 algılar. Yani aynı hatta istediğin kadar ds18b20 bağlayabilirsin. Ben mikroC de yapmıştım. örnek kod şöyle:
void Read_isi(char konum)
{
    Ow_Reset(&PORTB, ds18b20bDQ);                         // Onewire reset signal
    Ow_Write(&PORTB, ds18b20bDQ, 0x55);                   // ROM adresini dikkate al
    Send_rom_value(konum);                            //bu metodla daha önce hafızaya aldığım rom adresini tek tek gönderiyorum.
    Ow_Write(&PORTB, ds18b20bDQ, 0x44);                   // isiyi çevirmeye başla
    Delay_us(120);

    Ow_Reset(&PORTB, ds18b20bDQ);
    Ow_Write(&PORTB, ds18b20bDQ, 0x55);                   // ROM adresini dikkate al
    Send_rom_value(konum);
    Ow_Write(&PORTB, ds18b20bDQ, 0xBE);                   // ısıyı okuyacağım bilgin olsun

    ds18b20Lsb = Ow_Read(&PORTB, ds18b20bDQ);             // düşük 8 biti oku
    ds18b20Msb = Ow_Read(&PORTB, ds18b20bDQ);             // yüksek 8 biti oku
    ds18b20Temp = (ds18b20Msb << 8) + ds18b20Lsb;         // iki değeri int e dönüştür

}


Merhaba eraygil;
En iyi cozumu arkadas vermiş ( ustte ).
Her bir pine DS18B20 takmaktansa bır pine parelel bağla yukardakı kod mantıgını kullan işin hallolur.
Kolay gelsin.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

M_B

Merhaba Onceden bu tur bır calısma yapmıstım. Kullandıgım kod lar aşağıda umarım yardımcı olur.

Bir kereye mahsus  yapman gereken Her DS18B20 nın ROM kodunu okuyup pic in epromuna kayıt etmen.
Altakı program kodu onu yapmaktadır.

void D_ReadRom(unsigned char Adr)
{
	unsigned char count;
	D_Reset();
 	D_Write(0x33);          //-- Read Rom
                         	//-- Read in the ROM code from the Device
 	for(count=Adr;count<Adr+8;count++)
 		{
		EEPROM_WRITE(count,D_Read());
					
 		}
}


Eproma kayıt edıldıkten sonra sıcaklığı okuma fonksiyonu ise aşağıda.

void SicaklikOku(unsigned char Adr ) 
{ 
   unsigned char sayac,temp_value ; 
   unsigned char a,i, b; 
Tekrar: 
   if ( D_Reset()==1 ) goto Tekrar; 
   		D_Write(0x55);
				for(i=Adr;i<Adr+8;i++)
					{
					D_Write(EEPROM_READ(i));
					}

		 D_Write(0x44); 
  
  		 DelayMs(250);
   		 DelayMs(250); 

	if ( D_Reset()==1 ) goto Tekrar; 
	
		D_Write(0x55);

		for(i=Adr;i<Adr+8;i++)
			{
				D_Write(EEPROM_READ(i));
			}

	D_Write(0xBE); 
 
   	DelayMs(250); 
 
   	a=D_Read(); 
   	b=D_Read(); 

	if((b&0x08)==0x08)
			{
			 b=~b;
			 temp_value = b<<4;
			 a=~a;
			 temp_value+ =(a>>4)+1;
			 address[0]='-';
			 }
			else
				{
				temp_value=b<<4;
   				temp_value+=(a&0xF0)>>4;
   				address[0]=' ';
				}
	address[1]=temp_value/10+'0';
   	address[2]=temp_value%10+'0';
}


Ornek kullanım:

SicaklikOku(0x00);  //1. Ds18b20
SicaklikOku(0x08); // 2. Ds18b20
SicaklikOku(0x10); // 3. Ds18b20
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

eraygil

ilgilenen arkadaşlara çok çok çok teşekkür ederim

eraygil

mb arkadaşım epromları okuturken her sensörü sıra ile mi takıyorsun    üffff sunun mantığını bi anlayamadım gittii

M_B

Alıntı yapılan: eraygil - 16 Aralık 2011, 20:08:01
mb arkadaşım epromları okuturken her sensörü sıra ile mi takıyorsun    üffff sunun mantığını bi anlayamadım gittii
Evet tek tek takıp Rom kodunu eeproma yazıyorsun.
Şoyle bir uygulama yapabilirsin.
Program ilk defa çalıştıgı zaman senden Sensorleri tek tek tanıtmanı ısteyecek.

Ornek
1.Sensoru takın ve Ok basın ( OK TUS)
2.Sensoru takın ve Ok basın ( OK TUS)
3.Sensoru takın ve Ok basın ( OK TUS)
Sonunda Sensorler eproma kayıt edildi diyecek ve bundan sonrada tum sensorler takılacak.
Sensor tanımlama kismi programda bir kereye mahsus calıstırılacak.


İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

eraygil

mb arkadaşım gerçekten çok büyük yardımın dokundu çok çok çok teşekkür ederim yardımını esirgemeyen bütün arkadaşlardan

eraygil

mb arkadaşım acaba ccs c için ds18b20 kütüphanesi varmıdır  sende.