/******************************************************
      PIC16F877 ile 1-Wire (Tek Hat) İletişim Uygulaması (DS1990A İle)
PIC PROG/DEKA     : Port B jumper'ı LCD konumunda olmalı
*******************************************************/

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

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

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

#include <1_wire.c>  // 1-Wire iletişim fonksiyonlarının kaydedildiği dosya programa ekleniyor

#define use_portb_lcd TRUE   // LCD B portuna bağlı

#include <lcd.c>   // lcd.c dosyası tanıtılıyor

int1 sonuc; // 1 bitlik değişken tanımlanıyor
int seri_no1=0,seri_no2=0,seri_no3=0,seri_no4=0,seri_no5=0,seri_no6=0,seri_no7=0,seri_no8=0; // 8 bitlik değişkenler tanımlanıyor
int32 seri_no=0; // 32 bitlik değişken tanımlanıyor

//********** ANA PROGRAM FONKSİYONU*******

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ışı

   lcd_init();   // LCD hazırlanıyor

   ow_hiz(1);   // 1-Wire iletişim hızı standart seçildi

   while(1) // Sonsuz döngü
   {
      sonuc=ow_reset();  // 1-Wire cihazına reset sinyalini gönder

      if (sonuc==0)  // Eğer data hattında 1-wire cihazı var ve sağlam ise
      {
         printf(lcd_putc,"\fCihaz calisiyor"); // LCD'ye veri gönderiliyor.
         delay_ms(1500); // 1.5 sn gecikme veriliyor

         ow_yaz_byte(0x33); //ROM numarası okuma komutu cihaza gönderiliyor

         seri_no1=ow_oku_byte(); // ROM numarasının ilk byte değeri aile (family) kodu'dur.
         seri_no2=ow_oku_byte(); // ROM numarasının 2. byte ile 7.byte değerleri
         seri_no3=ow_oku_byte();    // cihazın 48 bitlik seri nosunu oluşturur
         seri_no4=ow_oku_byte();
         seri_no5=ow_oku_byte();
         seri_no6=ow_oku_byte();
         seri_no7=ow_oku_byte();
         seri_no8=ow_oku_byte(); // ROM numarasının 8. byte değeri cihazın CRC değeridir

         seri_no=make32(seri_no2,seri_no3,seri_no4,seri_no5); // 8 bitlik değerleri birleştirerek 32 bitlik değer oluşturur

         printf(lcd_putc,"\fCihaz Aile Kodu"); // LCD'ye veri gönderiliyor.
         printf(lcd_putc,"\n%X",seri_no1); // Cihaz aile kodu LCD'ye gönderiliyor
         delay_ms(2000); // 2 sn gecikme veriliyor
         printf(lcd_putc,"\fCihaz Seri No"); // LCD'ye veri gönderiliyor.
         printf(lcd_putc,"\n%X%X%X%X%X%X",seri_no2,seri_no3,seri_no4,seri_no5,seri_no6,seri_no7); // Cihaz seri no LCD'ye gönderiliyor
         delay_ms(2000); // 2 sn gecikme veriliyor
         printf(lcd_putc,"\fCihaz CRC Degeri"); // LCD'ye veri gönderiliyor.
         printf(lcd_putc,"\n%X",seri_no8); // Cihazın CRC değeri LCD'ye gönderiliyor
         delay_ms(2000); // 2 sn gecikme veriliyor

         if (seri_no==0x2CC5B800) // Eğer doğru cihaz sistemdeyse
            output_high(pin_c1);  // RC1 pinine bağlı role çeker
      }
      else  // Eğer data hattında 1-wire cihazı yok veya sağlam değilse
         printf(lcd_putc,"\fCihaz calismiyor");
      delay_ms(1500);  // 1.5 sn gecikme veriliyor
   }
}

