Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

ds18b20 Sorunu

Başlatan ayhan_eee, 19 Eylül 2012, 20:33:56

ayhan_eee

Merhaba arkadaşlar bir iki akşamdır ds18b20 ile ilgili proteus üzerinden çalışmalar yapıyorum.Ancak bir türlü değer elde edemedim.Kullandığım kodlar ve kütüphaneler aşağıda.Acaba hatam nerede olabilir?Bu haliyle sürekli 40.000 gösteriyor.

ds18b20.h:
#define TRIS_IO2 TRISC7			
#define wire RC7  				

extern unsigned char hat_reset(void);

extern unsigned int hat_byte_oku(void);

extern void hat_byte_yaz(unsigned char data); 

extern void ds18b20(unsigned int *sicak, unsigned int *onda);

ds18b20.c:
#include <pic.h> 
#include "ds18b20.h"
#include "delay.h"

unsigned char hat_reset(void) 
{ 
   unsigned char sonuc;
   wire = 0; 
   TRIS_IO2 = 0; 
   
   _delay(250);
   _delay(250);// 640us>x>480us 
   TRIS_IO2 = 1; 
   _delay(70);		// 78us>x>70us 
   sonuc = wire;    // 0 Hazır, 1 Hazır değil 
   _delay(250);
   _delay(250); //410us
   
   return sonuc; 
}

unsigned int hat_byte_oku(void)
{
   unsigned char sayac; 
   unsigned int veri=0, bitler=1; 
   for(sayac=0; sayac<8; sayac++) 
   { 
      wire = 0; 
      TRIS_IO2 = 0; 
      _delay(5); 
      TRIS_IO2 = 1; 
      _delay(10);
      if ( wire == 1 ) 
    	  veri |= bitler;  

      bitler=bitler<<=1; 
      
   } 
   return veri; 
}

void hat_byte_yaz(unsigned char veri) 
{ 
   unsigned char bitler = 1, sayac;  
   for (sayac=0;sayac<8;sayac++) 
   { 
      if ( veri&bitler) 
      { 
         TRIS_IO2 =0; 
         wire = 0; 
         _delay(5); 
         TRIS_IO2 = 1; 
         _delay(60); 
      } 
      else 
      { 
    	 TRIS_IO2 = 0; 
         wire = 0; 
         _delay(60);  
         TRIS_IO2 = 1; 
      } 
      bitler=bitler<<=1; 
   } 
}

void ds18b20(unsigned int *sicak, unsigned int *onda)
{ 
	unsigned char sayac, bitlertam, bitleronda; 
	unsigned int sicaklik, bitler,sicaklik1; 
   RC3^=1;
	while(hat_reset()==1); RC0^=1;
	hat_byte_yaz(0xCC); 
	hat_byte_yaz(0x44); 
	DelayMs(250); 
	DelayMs(250); 
	DelayMs(250);
	while ( hat_reset()==1); RC1^=1;
	hat_byte_yaz(0xCC); 
	hat_byte_yaz(0xBE); 

	sicaklik= hat_byte_oku(); //lsb
	sicaklik1=hat_byte_oku();//msb
	while (hat_reset()); 
 
	*sicak=(sicaklik1<<4)+(sicaklik>>4);
	
		if(*sicak & 0x80)//sicaklik negatif ise 
		{
			*sicak=~*sicak;
			sicaklik=~sicaklik&0x0F;
		}
		
		if(sicaklik & 0x08) *onda=500;
		if(sicaklik & 0x04) *onda+=250;
		if(sicaklik & 0x02) *onda+=125;
		if(sicaklik & 0x01) *onda+=62;
		
	
}


main.c:
#include <htc.h>
#include "lcd.h"
#include "delay.h"
#include "ds18b20.h"     

 
unsigned int sic,onda;
void PIC_Init(void)
{
	  
	PORTB=0x00;    
	PORTC=0x00;
	TRISB=0x00;
	TRISC=0x00; 
  
	lcd_init();
	lcd_yaz("Sicaklik:");
}  

 

   
   
void    
main(void)
{  
	PIC_Init();
	while (1){
	    lcd_gotoxy(2,1); 
	    ds18b20(&sic,&onda);    
	    _delay(10);    
	    veri_yolla(sic/100+48);  
	    veri_yolla((sic%100)/10+48);  
	    veri_yolla(sic%10+48); 
	    veri_yolla('.'); 
	    veri_yolla(onda/100+48);  
	    veri_yolla((onda%100)/10+48); 
	    veri_yolla(onda%10+48); 
	    veri_yolla(0xDF);    
	    veri_yolla('C'); 
	} 
}

armsistem

İstersen bir bak, vcc ile dq ayakların arasına 4,7 Kohm bir direnç bağla.

http://www.mcu-turkey.com/sicak-su-tanki-sicaklik-uyari-ve-kontrol-sistemids18b20/

ayhan_eee

Teşekkürler 4k7 zaten atılı araya.kod olarak da internetteki örneklere baktım hem benzer kodlar benimkiler ile ama bende çalışmadı.Varmı başka diyeceğil olan

armsistem

hocam , hitech c ile uğraşırken delay hep problemdi ,orada problem olabilir.

ayhan_eee

DelayUS denedim,_delay denedim,__delay_us() denedim çözüm olmadı acaba hitech ile çalıştıranlar varsa örnek verebilirler mi?