﻿/******************************************************
      PIC16F877 ile Dahili ADC Uygulaması
PIC PROG/DEKA     : Port B jumper'ı LCD konumunda olmalı
*******************************************************/
#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#device ADC=10  // 10 bitlik ADC kullanılacağı belirtiliyor.

// 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.

#use fast_io(c) //Port yönlendirme komutları C portu için geçerli
#use fast_io(e) //Port yönlendirme komutları E portu için geçerli

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

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

#INT_AD               // ADC çevrimi bitti kesmesi
void ADC_Kesmesi ( )
{
   output_high(pin_c5);  // RC5 çıkışı 1
   delay_ms(200);
   output_low(pin_c5);   // RC5 çıkışı 0
}

unsigned long int bilgi; // İşaretsiz 16 bitlik tam sayı tipinde değişken tanımlanıyor
float voltaj;            // ondalıklı tipte voltaj isminde değişken tanıtılı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_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_c(0x00);  // C portu komple çıkış
   set_tris_e(0x0F);  // E portu komple giriş

   output_c(0x00);    // C portu çıkışını sıfırla

   setup_adc(adc_clock_div_32);   // ADC clock frekansı fosc/32
   setup_adc_ports(ALL_ANALOG);   // Tüm AN girişleri analog

   enable_interrupts(INT_AD);     // AD çevrimi bitti kesmesi tanıtılıyor
   enable_interrupts(GLOBAL);     // Tüm kesmeler aktif

   lcd_init();                            // LCD hazır hale getiriliyor

   printf(lcd_putc,"\f ADC UYGULAMASI "); // LCD'ye yazı yazdırılıyor
   delay_ms(1500);

   while(1)   // sonsuz döngü
   {

      set_adc_channel(5);   // RE0/AN5 ucundaki sinyal A/D işlemine tabi tutulacak
      delay_us(20);         // Kanal seçiminde sonra bu bekleme süresi verilmelidir
      bilgi=read_adc();     // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

      voltaj=0.0048828125*bilgi;   // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor

      printf(lcd_putc,"\fAN5 Kanali");
      delay_ms(1500);
      printf(lcd_putc,"\fDijital=%lu",bilgi); // AN5 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
      printf(lcd_putc,"\nVoltaj=%fV",voltaj); // AN5 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
      delay_ms(2500);

      set_adc_channel(6);   // RE1/AN6 ucundaki sinyal A/D işlemine tabi tutulacak
      delay_us(20);         // Kanal seçiminde sonra bu bekleme süresi verilmelidir
      bilgi=read_adc();     // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

      voltaj=0.0048828125*bilgi;  // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor

      printf(lcd_putc,"\fAN6 Kanali");
      delay_ms(1500);
      printf(lcd_putc,"\fDijital=%lu",bilgi);  // AN6 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
      printf(lcd_putc,"\nVoltaj=%fV",voltaj);  // AN6 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
      delay_ms(2500);

      set_adc_channel(7);   // RE2/AN7 ucundaki sinyal A/D işlemine tabi tutulacak
      delay_us(20);         // Kanal seçiminde sonra bu bekleme süresi verilmelidir
      bilgi=read_adc();     // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

      voltaj=0.0048828125*bilgi;  // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor

      printf(lcd_putc,"\fAN7 Kanali");
      delay_ms(1500);
      printf(lcd_putc,"\fDijital=%lu",bilgi);  // AN7 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
      printf(lcd_putc,"\nVoltaj=%fV",voltaj);  // AN7 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
      delay_ms(2500);
   }
}


