ds1820 ile ds18b20 okuma

Başlatan armsistem, 17 Ağustos 2012, 17:41:11

armsistem

Arkadaşlar merhaba , aşağıdaki linkte lpc2103 ile ds18b20 ısı okuması yapabiliyorum , lakin gerçek devre üzerinde ds1820 (9 bit) okuma yapamıyorum.DS18b20 proteus+isis aşağıda linkte. Anladığım kadarıyla one wire ayarlarından bir şey değiştirmem gerekmiyor yalnız sıcaklık okuma ile ilgili yerleri diye tahmin ediyorum uğraştım ama olmadı beceremedim  ,bir de aşağıda ki kodları tam anlayamadım anlatacak arkadaşlara şimdiden teşekkür ederim.
;
sayi2 = onewire_read_byte();	 //lsb
sayi1 = onewire_read_byte();	 //msb
while (onewire_reset());
*onda=0;
//*sicak=(sayi1*16)+(sayi2>>4);
 // TReading = (HighByte << 8) + LowByte;
 *sicak=(sayi1<<8)+(sayi2);


http://s2.dosya.tc/server18/iyZmaq/mcu_turkey_ds18b20.rar.html

mustafa6106

Ben picle yapmıştım pull-up direncini bağlamayı unutmuştum..sende unutmuş olabilirmisin?

armsistem

donanımsal oldugunu dusunmuyorum ds18b20 de çalısıyor yazılımda bır eksıklık var ds1820 çalışmıyor.

ete

DS18B20 ile DS1820 farklı sensörlerdir. Okuma ve sıcaklık hesaplama şekilleride doğal olarak farklıdır. Bir birinin yerine olmaz.
Data sheetleri okuyun.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

armsistem

#4
Aşağıda koda göre anlatmaya çalışacağım ds18b20 ile çalışan ;

- sayı2=lsb ,sayı1=msb ;
- sicak değişkeni pointer char 1 byte
- sayi1,sayi2 integer 2 byte  // neden int , char kullanamazmıyım ?


DS18b20 için:
sayi2 = onewire_read_byte();
sayi1 = onewire_read_byte();
*sicak=(sayi1*16)+(sayi2>>4);


DS1820 veya DS18s20:
*sicak = (sayi2 << 8) + sayi1;



pointer den dönen değer aşağıda ascii koduna döndürülüyor ama aşağıdaki dönüşümü tam olarak anlamadım.
Bu çevrimi 9 bit veya 12 bit olarak nasıl çevrilir mantığı nedir.

lcd_putchar (sicaklik/100+48);
lcd_putchar((sicaklik%100)/10+48);
lcd_putchar(sicaklik%10+48);
lcd_putchar(0xDF);
lcd_putchar('C')


Eksik veya yanlış anladığım bir nokta varmıdır ?

void ds18b20(unsigned int *sicak, unsigned int *onda)
{
unsigned char sayi1,sayi2,busy=0;
while(onewire_reset());
onewire_write_byte(0xCC);
onewire_write_byte(0x44);
DelayMs(250);
DelayMs(250);
DelayMs(250);
while (onewire_reset());
onewire_write_byte(0xCC);
onewire_write_byte(0xBE);
sayi2 = onewire_read_byte();
sayi1 = onewire_read_byte();
while (onewire_reset());
*onda=0;
*sicak=(sayi1*16)+(sayi2>>4);
if(sayi2 & 0x08)
*onda=500;
if(sayi2 & 0x04)
*onda+=250;
if(sayi2 & 0x02)
*onda+=125;
if(sayi2 & 0x01)
*onda+=62;
}



[IMG]http://img423.yukle.tc/images/4755ScreenClip.png[/img]


[IMG]http://img421.yukle.tc/images/93741.png[/img]


[IMG]http://img423.yukle.tc/images/11542.png[/img]