Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: armsistem - 01 Ağustos 2012, 21:41:38

Başlık: Ynt: ds18b20 ölçüm hatası
Gönderen: armsistem - 01 Ağustos 2012, 21:41:38
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;




   
   
   }
}