Haberler:

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

Ana Menü

18b20 Sürücü Programı

Başlatan emretunali, 25 Ocak 2011, 11:24:34

emretunali

Merhaba arkadaşlar. Kendime bir alarm devresi yapıyorum. Isı göstergesi 18b20 kullandım. Ama ne yaptıysam çalıştıramadım. Ekranda sürekli 0.0 C Derece Gözüküyor. Aynı devreye pic basic ile kod yazınca derece çalışıyor.

/*******************************************************
      PIC18f452 ile Güvenlik Alarmı Uygulaması
*******************************************************/


// Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#include <18F452.h>

// Denetleyici konfigürasyon ayarları
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD 

// Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#use delay (clock=20000000)

// Port yönlendirme komutları A port'u için geçerli.
#use fast_io(a)

// Port yönlendirme komutları B port'u için geçerli.
#use fast_io(b)

// Port yönlendirme komutları C port'u için geçerli.
#use fast_io(c)

// Port yönlendirme komutları D port'u için geçerli.
#use fast_io(d)

// Port yönlendirme komutları E port'u için geçerli.
#use fast_io(e)


#include <LCD420.c>
#include <DS1302.c>
#include <2464.c>
#include <ds18b20.c>

#define siren pin_b0

#define sens1 pin_b0
#define sens2 pin_b0
#define sens3 pin_b0
#define sens4 pin_b0
#define sens5 pin_b0

#define rowa pin_d0
#define rowb pin_d1
#define rowc pin_d2
#define rowd pin_d3

#define col1 pin_d4
#define col2 pin_d5
#define col3 pin_d6
#define col4 pin_d7

#define lcd pin_e0

#define data pin_e1
#define en pin_e2
float temp;
int8 saniye,dakika,saat,gun,ay,yil,haftanin_gunu; // byte türünde değişkenler tanımlanıyor

int1 sdurum,adurum,home,dmenu,dalarm;

char tus=0; // karakter tipinde değişken tanımlanıyor

void acilis_msg ()
{
   //rtc_set_datetime(22,01,10,7,23,43); // Tarih ve Saat ayarları yapılıyor
   lcd_hazirla();             // LCD başlangıç ayarları yaptırılıyor
   
   ozel_karakterler();        // Özel karakterler CGRAM'e yükleniyor
   
   output_bit(lcd,1);         // LCD aydınlatmasını aç

   imlec(1,6 );               // İmlec x.satır y.sütunda
   printf(lcd_veri,"FOTO ERKEN");

   imlec(2,3);
   printf(lcd_veri,"GÜVENLİK SİSTEMİ"); 
   
   imlec(3,3); 
   printf(lcd_veri,"DESIGNED BY FROM");
   
   imlec(4,1);
   printf(lcd_veri,"    EMRE TUNALI");   

   delay_ms (3000);

   lcd_komut(0x01); // LCD sıfırlanıyor 
}

void anasayfa ()
{
   imlec(1,1);
   switch(sdurum)
   {
      case 0:printf(lcd_veri,"SİSTEM DURUMU:PASİF");break;
      case 1:printf(lcd_veri,"SİSTEM DURUMU:AKTİF");break;
   }

   imlec(2,1);
   switch(adurum)
   {
      case 0:printf(lcd_veri,"ALARM  DURUMU:PASİF");break;
      case 1:printf(lcd_veri,"ALARM  DURUMU:AKTİF");break;
   }

   imlec(3,1);
   printf(lcd_veri,"%02d/%02d/20%02d %02d:%02d:%02d",gun,ay,yil,saat,dakika,saniye); //LCD'ye gün,ay,yıl bilgileri yazdırılıyor
   
   imlec(4,1);
   printf(lcd_veri,"A<MENÜ  %02.1f%cC ALR>B",temp,223);
   
   home=1;   
}

void menu ()
{

}

void alarm ()
{

}

void sistem_guncelleniyor ()
{
imlec(1,1);
printf(lcd_veri,"       SİSTEM       ");

imlec(2,1);
printf(lcd_veri,"    GÜNCELLENİYOR   ");

imlec(3,1);
printf(lcd_veri,"     >>>EMRE<<<     ");

imlec(4,1);
printf(lcd_veri,"YAZILIM VERSİYONU:1.0"); 
}



void sens_read ()
{
   temp = ds1820_read();
   rtc_get_time(saat,dakika,saniye);       // DS1302'den saat,dakika,saniye bilgileri alınıyor
   rtc_get_date(gun,ay,yil,haftanin_gunu,); // DS1302'den gün,ay,yil ve günün isim bilgisi alınıyor
}

//*********** Keypad Tarama Fonksiyonu *********
char keypad() // Fonksiyon ismi
{
   output_d(0x00); // D portu çıkışı sıfırlanıyor

   output_high(rowa); // 1. satır lojik-1 yapılıyor
   if (input(col1))   // 1. sütun okunuyor
      { delay_ms(20); tus=1; }
   if (input(col2))   // 2. sütun okunuyor
      { delay_ms(20); tus=2; }
   if (input(col3))   // 3. sütun okunuyor
      { delay_ms(20); tus=3; }
   if (input(col4))   // 4. sütun okunuyor
      { delay_ms(20); tus=0xA; }
   output_low(rowa); // 1. satır lojik-0 yapılıyor

   output_high(rowb); // 2. satır lojik-1 yapılıyor
   if (input(col1))   // 1. sütun okunuyor
      { delay_ms(20); tus=4; }
   if (input(col2))   // 2. sütun okunuyor
      { delay_ms(20); tus=5; }
   if (input(col3))   // 3. sütun okunuyor
      { delay_ms(20); tus=6; }
   if (input(col4))   // 4. sütun okunuyor
      { delay_ms(20); tus=0xB; }
   output_low(rowb); // 2. satır lojik-0 yapılıyor

   output_high(rowc); // 3. satır lojik-1 yapılıyor
   if (input(col1))   // 1. sütun okunuyor
      { delay_ms(20); tus=7; }
   if (input(col2))   // 2. sütun okunuyor
      { delay_ms(20); tus=8; }
   if (input(col3))   // 3. sütun okunuyor
      { delay_ms(20); tus=9; }
   if (input(col4))   // 4. sütun okunuyor
      {delay_ms(20); tus=0x0C; }
   output_low(rowc); // 3. satır lojik-0 yapılıyor

   output_high(rowd); // 3. satır lojik-1 yapılıyor
   if (input(col1))   // 1. sütun okunuyor
      { delay_ms(20); tus=0xE; }
   if (input(col2))   // 2. sütun okunuyor
      { delay_ms(20); tus=0; }
   if (input(col3))   // 3. sütun okunuyor
      { delay_ms(20); tus=0xF; }
   if (input(col4))   // 4. sütun okunuyor
      {delay_ms(20); tus=0xD; }
   output_low(rowd); // 3. satır lojik-0 yapılıyor

   return tus; // Fonksiyon "tus" değeri ile geri döner
}

void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
   
   set_tris_a(0b000000);    
   set_tris_b(0b11111110);
   set_tris_c(0b10000000);
   set_tris_d(0b11110000);
   set_tris_e(0b110);
   
   output_a(0x00);
   output_b(0x00);
   output_c(0x00);
   output_d(0x00);
   output_e(0x00);
   
   sdurum=0;

   adurum=0;
   
   dmenu=0;       //0 yapılırsa kullanım dışı olur
   
   dalarm=0;      //0 yapılırsa kullanım dışı olur
      
   acilis_msg();
   
   home=1;
   
   start:
      sens_read();
      
      keypad();
            
      if (home==1 && tus==0xA && dmenu==1)
      {
         menu();
      }
      
      if (home==1 && tus==0xBA && dalarm==1)
      {
         alarm();
      }
      
      if (home==1 && tus==0xA && dmenu==0)
      {
         sistem_guncelleniyor();
      }
      
      if (home==1 && tus==0xBA && dalarm==0)
      {
         sistem_guncelleniyor();
      }
                           
      if (home==1)
      {
         anasayfa();   
      }           
   goto start;
}


#define ONE_WIRE_PIN PIN_c5
void onewire_reset() 

{
output_low(ONE_WIRE_PIN);
delay_us( 500 ); //1-wire resetleme için sıfıra çekilir
output_float(ONE_WIRE_PIN); //1-wire bir yapılır
delay_us( 500 ); // sensörün hazırlanması için beklenir.
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 ); // Sensöre yazma işlemine başlamak için  1-wire sıfıra çekilir.
output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // yazılacak bilgi 1-wire'da
delay_us( 60 ); // Yazma işlemi zamanı doldurulur.
output_float(ONE_WIRE_PIN); // 1-wire bir yapılır,
delay_us( 2 ); // 1us'den fazla beklenir.
}
} 

int onewire_read()
{
int count, data;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); //Sensördem okuma işlemi içinl 1-wire sıfıra çekilir.
output_float(ONE_WIRE_PIN); //1-wire bir yapılır,
delay_us( 8 ); // Sensörün kendine gelmesi beklenir,
shift_right(&data,1,input(ONE_WIRE_PIN)); // sonuc bilgisi alınır.
delay_us( 120 ); //Okuma işlemi zamanı doldurulur.
}
return( data );
} 

float ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;
onewire_reset();
onewire_write(0xCC);
onewire_write(0x44);
while (busy == 0)
busy = onewire_read();
onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
result = (float) temp3 / 16.0;
delay_ms(200);
return(result);
}

frkcn

sorunun üzerinden birkaç ay geçmiş ama cevapsız görünce yazmak istedim.
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı

bunlar kapalı durumda...
Bugün ömrümün geride kalan son günü...