ds18b20

Başlatan gogtug, 13 Şubat 2015, 21:20:46

gogtug


    #include<16f877a.h>


#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000)


#use fast_io(c)
#use fast_io(b)


#define display_1 pin_a0
#define display_2 pin_a1
#define use_portb_lcd TRUE         //B portu lcd için ayrılıyor
#include <lcd.c> 
#include<ds18b20.c>

       void main(){
    setup_psp(PSP_DISABLED);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    setup_adc_ports(NO_ANALOGS);
    setup_adc(ADC_OFF);
    setup_CCP1(CCP_OFF);
    setup_CCP2(CCP_OFF);

       setup_comparator(NC_NC_NC_NC);

   

       set_tris_b(0x00);
       set_tris_c(0xff);
       
       float temp;
       
       while(1)
       {
        lcd_init();
       temp=ds1820_read();
       printf(lcd_putc,"%f",temp);
       
       
       }
       }
       
       
       

       


sürekli -0,06 gösteriyo   3.1fde yaptım o zamanda sadece 0.0 gösteriyo yani hiç bi şekilde okumuyo hata nerde acaba kafayı yiyecem yardım ederseniz sevinirim

baranekrem9

İşlemciye sağ tıklayıp hex kodunu eklediğin bölümün altında frekans yeri va orayı programda kaç MHz yaptıysan aynısını yap.

baranekrem9

#2
Birde lcd_init'i while'ın üstüne al bir kere hazırlamak yeterli.
set_tris_c(0xFF); kaldırsanda iyi olur.Zaten fast io yapmıssın

gogtug



         
#include <16f628a.h>     // Kullanılacak mikroişlemci seçiliyor
#fuses INTRC_IO,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT
#use delay (clock=4000000) //  osilatör frekansı.

#include <ds18b20.c>  //18b20 sıcaklık sensoru

#use fast_io(b)
#use fast_io(a)


void main()
{
     

    float a=0;
   
    const int digit[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x6F};

   
    #define display_1 pin_a0
    #define display_2 pin_a1
   
 
    char birler=0,onlar=0,sayi=0;   

    set_tris_a(0xfc);
    set_tris_b(0x00);
    output_low(display_1);
    output_low(display_2);

   

     
      while(1){
     
   a= ds1820_read();
     
 
     sayi=a;
     
     birler=sayi%10;
     onlar=sayi/10;
 
 
   
    output_high(display_2);
    output_b(digit[birler]);
    delay_ms(5);
    output_low(display_2);
    output_high(display_1);
    output_b(digit[onlar]);
    delay_ms(5);
    output_low(display_1);

         
 


}
   
   
   
   
   
   
   

   
   
   
   
   
   
   
   
   
   
}
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 

Onu yaotim suan dogru okuyi ama displaydeki değer sürekli yanıp sönüyor bir türlü sabitleemedim yardımcı olan olursa teşekkür edrim 


}
   
   
   
   
   
   
   

   
   
   
   
   
   
   
   
   
   
}
   
   




[/code]

baranekrem9

simülasyonda öyle gösterir fakat değeri okuduktan sonra while içinde eski değer ile aynı mı değil mi diye kontrol ettirirsin aynı ise yenilemezsin böylece yanıp sönme olmaz farklı ise yenilersin.En iyisi devreyi breadboard'a kur birde öyle dene yada ekrana basma işleminden sonr abiraz bekleme koy

baranekrem9

dostum diğer forumdada cevapladım 2 farklı uygulama vermişsin biri display biri lcd :D

gogtug

#6
LCD yi yaptım 7 segment dislayde yanıp sönüyo iki devreyi de bordda yapiyorum

baranekrem9

delayları azalt ve şu kütüphaneyi kullan


#define ONE_WIRE_PIN PIN_A2

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=1;
   int8 busy=0, temp1, temp2;
   signed int16 temp3;
   static float result;

   if(ds_flag==1)
   {
      onewire_reset();
      onewire_write(0xCC);
      onewire_write(0x44);
      ds_flag=0;
   }

   if(ds_flag==0)
   {
      busy = onewire_read();
      if(busy==0)return result;
      else ds_flag=1;
   }
   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);
}


gogtug

#8
bu kütüphaneyi kullandım o zmanda titreme var ama oyapcak bişey yok acil olduğu için şimdilik gördü işi saolasın

baranekrem9

aslında bu daha düzgün bir kütüphane titreme varsa digiler arasındaki delayları azaltabilirsin

gogtug

1 yaptım onları zaten ama gene olmadı acil olduğu için simdilik isimi görecek bos vakitimde ugrasacam

baranekrem9

daha sonra uğraşacaksan 74HC595 entegresini kullan titreme vs problemleri olmaz ayriyetten 2 entegre daha eklersin ama

Powered by EzPortal