Haberler:

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

Ana Menü

PIC hızı DS18b20'yi etkiliyor

Başlatan baran123, 26 Kasım 2014, 03:57:19

baran123

18F4550 ile sıcaklık okuyup Pc ye aktarıyorum 1. ayarda okumuyor 0 olarak gösteriyor ama 2. ayarda ise okuyor ve her iki durumda da 20 MHz kristal takılı.Devreyi Proteus da çalıştırıyorum bundan kaynaklanabilir mı ?.Ben devreyi kurarken hangi ayarlarda kullanmalıyım ?

Edit : Proteusda işlemciye sağ tıklayıp oradaki frekansı 48 yaptım yine normal çalıştı (1.ayarlar ile)

1)
#include <18F4550.h>
#device ADC=10
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48M)


2)
#include <18F4550.h>
#device ADC=10
#fuses XTPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=4M)



DS18B20 Kütüphanem (Beklemesiz olan)
#define ONE_WIRE_PIN PIN_C0

void onewire_reset() 
{
   output_low(ONE_WIRE_PIN);
   delay_us(500);
   output_float(ONE_WIRE_PIN);
   delay_us(500); 
   output_float(ONE_WIRE_PIN);
} 

void onewire_write(int data)
{
   int count;
   for (count=0; count<8; ++count)
   {
      output_low(ONE_WIRE_PIN);
      delay_us(2);
      output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); 
      delay_us(60);
      output_float(ONE_WIRE_PIN); 
      delay_us(2); 
   }
} 

int onewire_read()
{
   int count, data;
   for (count=0; count<8; ++count)
   {
      output_low(ONE_WIRE_PIN);
      delay_us(2);
      output_float(ONE_WIRE_PIN);
      delay_us(8);
      shift_right(&data,1,input(ONE_WIRE_PIN)); 
      delay_us(120);
   }
   return(data);
} 

float ds1820_read()
{
   static int1 ds_flag=0;
   int8 busy=0, temp1, temp2; 
   signed int16 temp3; 
   static float result; 
   
   if(ds_flag==0)
   {
      onewire_reset(); 
      onewire_write(0xCC); 
      onewire_write(0x44); 
      ds_flag=1;
   }
   
   else
   {
      busy = onewire_read(); 
      if(busy==0)return result;
   }
   
   ds_flag=0;
   onewire_reset(); 
   onewire_write(0xCC); 
   onewire_write(0xBE); 
   temp1 = onewire_read(); 
   temp2 = onewire_read(); 
   temp3 = make16(temp2, temp1); 
   
   result = (float) temp3 / 16.0;
   
   return(result); 
}

Erol YILMAZ

Proteus u fazla takma. Gerçek devrede bak.

baran123

Tamamdır gerçek devrede 1. ayarlar normal çalışıyor