STM32VLDiscovery-DS18B20 Kullanımı-85 hatası

Başlatan ayhan_eee, 13 Kasım 2014, 13:56:15

ayhan_eee

Merhabalar,
STM32VLDiscovery üzerinde Ds18b20 kullanmaya çalışıyorum. Ancak klasik sorunla karşılaştım. Sürekli olarak 85 değerini alıyorum. 4k7 ile Pull-Up çektim.
Logic Analyzer ile haberleşmeyi kontrol ediyorum.1-Wire haberleşme uygun ancak doğru data alamıyorum.
ds1b20.c
#include "ds18b20.h"
#include "stm32f10x_gpio.h"


//GPIO_InitTypeDef GPIO_InitStructure;

void Delay_us(uint32_t us)
{
  uint32_t i = us;
  while (i--){
    asm("nop");
  }

}

void Data_Giris(void)
{		
      GPIO_InitTypeDef GPIO_InitStructure;
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
 
}

void Data_Cikis(void)
{		
	GPIO_InitTypeDef GPIO_InitStructure;
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
 
}

unsigned char onewire_reset(void) 
{ 
  unsigned char sonuc;
  
  Data_Cikis();       
  Data(0);        
  Delay_us(350); 
  Delay_us(350);
  Data_Giris();       
  Delay_us(70);      
  sonuc=GPIO_ReadInputDataBit(GPIOC,Data_Pin);        
  Delay_us(320);
  Delay_us(350); 
 // Data_Cikis(); 
  return sonuc; 
}

unsigned char onewire_read_bit(void)
{
unsigned char veri;
Data_Cikis();
Data(0);   
Delay_us(1);    
Data_Giris();    
Delay_us(1); 
if(GPIO_ReadInputDataBit(GPIOC,Data_Pin))   
veri=1;  
else
veri=0;  
Delay_us(60);
return veri;
}


void onewire_write_bit(unsigned char veri)
{
if(veri)      
{
Data_Cikis();     
Data(0);
Delay_us(1);   
Data_Giris();    
Delay_us(60);  
}
else        
{
Data_Cikis();     
Data(0);
Delay_us(60);   
Data_Giris();    
}
}

unsigned int onewire_read_byte(void)
{
unsigned char i,veri=0, bitler=1; 
for(i=0;i<8;i++) 
{ 
if ( onewire_read_bit() == 1 ) 
veri |= bitler; 
bitler=bitler<<=1; 
} 
return veri; 
}



void onewire_write_byte(unsigned char veri) 
{ 
unsigned char bitler=1, i; 
for (i=0;i<8;i++) 
{ 
if (veri&bitler) 
{ 
onewire_write_bit(1); 
} 
else
{ 
onewire_write_bit(0); 
} 
bitler=bitler<<=1; 
} 
}


ds18b20.h

/*
DS18B20 Kullanımı


*/


#ifndef __DS18B20_H//Daha önceden çağırılmadı mı?
#define __DS18B20_H //LCD.h kullan
#include "stm32f10x.h" 


#define Data_Pin GPIO_Pin_5  // PC5 Pini 

#define Data(x)      ( (x) ? (GPIO_SetBits(GPIOC,Data_Pin))  : (GPIO_ResetBits(GPIOC,Data_Pin)));

extern unsigned char onewire_reset(void);
extern unsigned char onewire_read_bit(void);
extern void onewire_write_bit(unsigned char veri);
extern unsigned int onewire_read_byte(void);
extern void onewire_write_byte(unsigned char data);

#endif


ds18b20 Okuma:

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);
Delay_ms(260); 
//Delay_ms(250); 
//Delay_ms(250);
//while(!onewire_read_byte);
//while(busy == 0) busy = onewire_read_byte();
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;
       
}


Logic Analyzer Verileri:

[IMG]http://i.imgur.com/HXGut6V.png[/img]

[IMG]http://i.imgur.com/ARZ44Lr.png[/img]

NOT: Zamanlamaları Logic Analyzer ile ayarladım.0x44 kodundan sonra 770ms bekleme yapıyorum.

ayhan_eee


ayhan_eee

Dikkatimi başka bir şey çekti. Logic Analyzer üzerinde 0x44 algılanmasına rağmen aslında bitleri okuduğumdaki dğer 44 değil. Ama ilginç olan nokta ise denemek için ne yazsam logic doğru okuyor. Hala çözümü bulamadım.85 okuyup duruyorum

ayhan_eee

[IMG]http://i.imgur.com/XF0ygUO.png[/img]

Arkadaşlar sorunu çözdüm. Logic kullanana kadar zamanlamada hata olduğu için çalışmamış. Logic ile zamanlamayı ayarlayınca ve çalışmayınca farklı ds18b20 denememişim.Daha önceden denediğimi düşünerek.En son farklı ds18b20 deneyince çalıştı. Yukarıdaki kodları STM32VLDiscovery ile test ettim.