ds18b20 Sorunu

Başlatan ayhan_eee, 20 Eylül 2012, 15:23:57

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.Hi-tech c ile 16f877a ile yapıyorum.Bu konuda yardım gerekiyor hatamı görebilen yada varsa kend çalışan kodları olan varsa da olur.Ben inceledim ama hatamı bulamadım :-\

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

serhat1990

Proteus , kodlar hepsini bir dosyaya koyup atabilirsen incelerim .Burada kod okumak zor geliyor. Hem deneme imkanımızda olur.

İyi çalışmalar.

ayhan_eee

http://s2.dosya.tc/server19/RBlvoU/ds18b20.rar.html

Kodlar ve proteus var.

mesaj birleştirme:: 20 Eylül 2012, 16:11:22

http://s2.dosya.tc/server19/RBlvoU/ds18b20.rar.html

kodlar ve proteus içinde

ayhan_eee

Yok mu yardım edebilecek biri?

M_B

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

ayhan_eee

#5
Aynı kodu yazmıştım zaten.Şimdi sizin verdiğniiz hex çalışıyor ancak ben hi-tide kullanıyorum sizin kodu derleyince çalışmıyor yine ne olabilir sorun acaba?

Edit:MPLAB ile de derledim yine bu kod çalışmadı.Sorun hakkında fikri olan var mı yoksa bende mi var bir sıkıntı. :-\

hatta Microchip ten delay kütüphanesi indirip denedim.Değer olarak x95.937 gösteriyor ben derleyince ama senin hex çalışıyor

ayhan_eee


gogge

Hangi derleyiciyi kullanıyorsunuz?

ayhan_eee

Hi-Tide kullanıyorum PM ile dediğim gibi.Bu arada kodu da istemiştiniz kod burada var dosya olarak...

ayhan_eee

Arkadaşlar.Uzun süre uğraştım açlıştıramadım.En son başka bir proje için Timer0 Timer kullanmam gerekti.Bunda da timer1 kesmesi için TMR0IE=1; şartını aradığını görünce sorunun bende olacağını anladım.Zaten format vakti gelmişti.Formattan sonra MPLAB-X kurdum ve derledim çalıştı.Yardımlar için teşekkürler!