Ynt: ds18b20 ölçüm hatası

Başlatan armsistem, 01 Ağustos 2012, 21:41:38

armsistem

arkadaşlar merhaba ds18b20 ile ısı ölçüm yapmaya çalışıyorum lakin program bir yerde kilitleniyor yardımlarınızı bekliyorum.
  ds18b20.c
#include <LPC21xx.H>                       /* LPC21xx tanimlari */

#include "1wire.h"

float ds1820_read(unsigned int olc) 
{ unsigned char ss[48];
 short int busy=0, tt=0,i; 
 int temp3; 
 float result; 
 i=onewire_reset();
 if(i!=0) {
   print("Reset basarisiz");
   return (-273.15);
 } 
 if (olc==1) {
   onewire_16write(0x44CC); // 44 ölçümü baslatir.
   while (busy == 0) busy = onewire_read(1); 
 }                  
 onewire_reset(); 
 onewire_16write(0xBECC); 
 tt = onewire_read(2); 
 temp3 = (int) tt; 
 sprintf(ss," Temp3= %6d ", temp3); // raw reading 
	  print(ss);

 result = (float)temp3 / 16.0;  //defauld conf. 12 bit resolution 

	  sprintf(ss,"Temp= %6.2f oC\n", result);   ----------------------------------------buradaki tür çevriminde hata veriyor.
	  print(ss);
   return(result); 
}



main.c

/******************************************************************************/
/* DS18B20 Sicaklik Olcumu                                                    */
/******************************************************************************/
#include <LPC21xx.H>                       /* LPC21xx tanimlari */
#include "lcd.h"
void init_serial (void);
char putchar (unsigned char ch);
unsigned char getchar (void);
void delay_ms(int);
float ds1820_read();
  	    unsigned char ss[48];
int main (void) {
//  unsigned char ss[48], *s;
  float t;

  PINSEL1 = PINSEL1 & 0x0003FFFF;	       /* P0.25-31 ve P0.2-3 GPIO olarak calisacak */
  PINSEL1 = PINSEL1 & (~0x00003000);       /* Buzzer P0.22 GPIO olarak calisacak */
  PINSEL0 = 0x00000000;			           /* Port 0-15 GPIO olarak calisacak */
  PINSEL2 &= (~0x00000003);                /* DS18B20 bacagi normal io*/
  IODIR0 = 0x00003C0c;                     /* P0.10..13 yonu cikis olarak tanimlandi */
  IODIR0 = IODIR0 & 0x01FFFFFF;            /* P0.25..31 yonu giris olarak tanimlandi */
  IODIR0 = IODIR0 | 1<<22;                 /* Buzzer P0.22 yonu cikis olarak tanimlandi */

  VPBDIV = 0x00;	//Divide Pclk by four, bu frekansta uart hizi 4800 bps
//  VPBDIV = 0x01;	//Divide Pclk by 1, bu frekansta uart hizi 19200 bps
  init_serial();
  delay_ms(100);
  lcd_init();
  T1IR = T1IR; //0x07; // Clear M2, M1, M0 interrupts

  ds1820_read(0);      // arg:(0) = without 0xCC, 0x44, at startup should read 85 oC, 
					   // used to check whether write,read functions works or not.
  while (1)  {                             
 	  t=ds1820_read(1);// arg:(1) = with 0xCC, 0x44, normally should read env. temp oC,
	  delay_ms(1000); 
	 	
	  
--------------------------------------------t-----------------------------float chara çevirmek gerekiyor mu nasıl display basabilriz.	  
  
  }
}


mesaj birleştirme:: 01 Ağustos 2012, 23:11:37

Arkadaşlar aşağıdaki kod ısı değeri sürekli sıfır veriyor. Kristal 11.0592 Hz

# include <lpc23xx.h>
# define dq 1<<16
# define dq_dir(x) (x)?(IODIR0|=dq):(IODIR0&=~dq)
# define dq_set IOSET0|=dq
# define dq_clr IOCLR0|=dq
# define dq_rd IOPIN0

unsigned char flag,TEMP;
void delay_5us(unsigned int);
void delay_1us(unsigned long int);
void dq_reset();
unsigned char dq_read();
void tmpwrite(unsigned char);
void start_conv();
unsigned char tmp();
unsigned char tmpread();

void delay_5us(unsigned int count)
{
unsigned int i;
while(count)
{
i=32;
 while(i>0)i--;
 count--;
 }}

 void delay_1us(unsigned long int t)
 {
 unsigned long int i;
 unsigned long int j;
 j=11059200/1000000*t;
 for(i=0;i<j;i++);
 }

		void dq_reset()
		{char presence=1;
		while(presence){
		dq_dir(1);
		dq_set;
		delay_1us(2);
		dq_clr;
		delay_5us(100);
		dq_set;
		delay_5us(12);
		dq_dir(0);
		presence = dq_rd;
		presence = presence & dq;
				}
		delay_5us(100);
		dq_dir(0);
		presence=dq_rd;
		presence=~presence;
		presence=presence&dq;

}			
 void tmpwrite(unsigned char dat){
 unsigned char j;
 int testb;
 dq_dir(1);
 for(j=1;j<=8;j++)
 {
 testb=dat&0x01;
 dat=dat>>1;
 if(testb)
 {
 dq_set;
 delay_1us(2);
 dq_clr;
 delay_1us(4);
 dq_set;
 delay_5us(14);
 }
 else
 {
 dq_set;
 delay_1us(2);
 dq_clr;
 delay_1us(4);
 dq_clr;
 delay_5us(14);
}}dq_set;
 			   delay_1us(1);
 }



	   unsigned char dq_read()
	   {
	   unsigned char dat;
	   dq_dir(1);
	   dq_set;
	   delay_1us(2);
	   dq_clr;
	   delay_1us(3);
	   dq_set;
	   dq_dir(0);
	   delay_5us(12);
	   dat=dq_rd;
	   return(dat);
	   }




				   unsigned char tmpread()
				   {
unsigned char i,dat;
int j=0;
dat=0;
for(i=1;i<=8;i++)
{
j=dq_read();
j=(j>>25)&0x01;
dat=(j<<7)|(dat>>1);
}
dq_dir(1);
dq_set;
return(dat);
}

	   unsigned char tmp()
	   {
		unsigned char a,b;
		dq_reset();
		tmpwrite(0xcc);
		tmpwrite(0xbc);
a=tmpread();
b=tmpread();
 if (b>127)
 {
 a=256-a;
b=256-b;
flag=1;
}
else {flag=0;}
TEMP=((a>>4)&0x0f)|((b&0x07)<<4);
return(TEMP);

 
 }


  void start_conv()
  {
  dq_reset();
  tmpwrite(0xcc);
  tmpwrite(0x44);

  }






main()

{
   unsigned char msb,disp[4];
   while(1)
   {
   start_conv();
   delay_5us(200);
   delay_5us(200);
   delay_5us(200);
   delay_5us(200);
   delay_5us(200);
   delay_5us(200);
msb=tmp();
		if(flag)
		disp[0]=43;
		else
		disp[0]=45;
		disp[1]=msb/100+0x30;
		disp[2]=msb/10%10+0x30;
		disp[3]=msb%10;




   
   
   }
}