Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip XC Serisi => Microchip XC8 => Konuyu başlatan: serhat1990 - 27 Ekim 2015, 00:02:00

Başlık: XC8 İle ADC ve LCD Uygulaması
Gönderen: serhat1990 - 27 Ekim 2015, 00:02:00
Merhaba arkadaşlar, PIC18F46K20 ile yapılmış bir adc uygulaması paylaşmak istedim. Ayrıca XC8 için LCD kütüphanesi de mevcut. Umarım işinize yarar.

Uygulamayı ait tüm dökümanları aşağıdaki linkten indirebilirsiniz.

http://www.serhatevcim.com/2015/10/26/xc8-derleyicisi-ile-pic18f46k20-serisi-programlama-adc-uygulamasi/ (http://www.serhatevcim.com/2015/10/26/xc8-derleyicisi-ile-pic18f46k20-serisi-programlama-adc-uygulamasi/)

İyi çalışmalar dilerim.



/*

       EXS04
     18F46K20
   ADC UYGULAMASI

Alınan 10 Bitlik ADC değerine göre ledlerde analog sinyal için seviye gösterimi yapar...

*/


#include <xc.h>      // Header dosyaları eklenir ...
#include "lcd.h"     // LCD kütüphanesi yüklenir.

#define _XTAL_FREQ 64000000      // Kristal frekansı 64MHz ,


/*_________________________   Konfigrasyon Bitleri _____________________________*/



#pragma config FOSC = INTIO67, FCMEN = OFF, IESO = OFF                           // CONFIG1H
#pragma config PWRT = ON, BOREN = OFF, BORV = 30                              // CONFIG2L
#pragma config WDTEN = OFF, WDTPS = 32768                                    // CONFIG2H
#pragma config MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF, CCP2MX = PORTC , HFOFST = ON  // CONFIG3H
#pragma config STVREN = ON, LVP = OFF, XINST = OFF                              // CONFIG4L
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF                        // CONFIG5L
#pragma config CPB = OFF, CPD = OFF                                       // CONFIG5H
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF                     // CONFIG6L
#pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF                              // CONFIG6H
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF                  // CONFIG7L
#pragma config EBTRB = OFF                                                // CONFIG7H


// ____________ Led Tanımlamaları ____________ //

           
#define LED4 LATA2   // Ledler tanımlanır ...
#define LED3 LATA3   // Ledler tanımlanır ...
#define LED2 LATA4   // Ledler tanımlanır ...
#define LED1 LATA5   // Ledler tanımlanır ...


unsigned int adc_bilgi=0; // ADC bilgisi burada tutulur ...


void bekle(unsigned int zaman)              // İstenilen sürede gecikme yapan fonskiyondur ... Girilen değer x 100uS

{

   unsigned int sure;            // 16 bitlik değişken oluşturduk ...

   for(sure=0;sure<zaman;sure++)   // Girilen değer döndürülür ...
   {
      __delay_us(100);      // 100uS bekle ...
   }

}     


void main()
{

   OSCCON=0x70;               //  Osilatör ayarları yapılıyor.
   OSCTUNE=0x40;            // Osilatör ayarları yapılıyor.
   ANSELH=0x00;             // B portu dijital input buffer aktif.
   ANSEL=0x03;                // A0 - A1 analog diğerleri dijital .
   TRISA=0x03;             // A portu giriş / çıkış ayarları yapıldı .
   TRISB=0x00;                // B portu çıkış yapıldı.   
   TRISC=0x94;                // C portu giriş / çıkış ayarları yapıldı .
   TRISE=0x08;                // E portu giriş / çıkış ayarları yapıldı . ( MCLR Giriş )
   lcd_init(FOURBIT_MODE);   // LCD başlangıç ayarlarını yükleriz . LCD 4 bit üzerinden sürülecek .
   ADCON1=0x00; // -Vref = gnd , +Vref = VCC olarak ayarlandı ...
   ADCON2=0xFE; // Sağa dayalı adc sonucu alacaz , bkz : ADCON2 register ... --> 88 Dİ
   ADCON0=0x01; // AN0 seçildi ... ADC aktif ...
   lcd_goto(S1_1);lcd_puts(" ADC UYGULAMASI ");      // LCD 1.satıra  ADC UYGULAMASI  YAZ 1.Satır 1.Sütundan başlayarak


   while(1)     

   {
ADCON0=ADCON0|0x02; // Go/done = 1
while(GO/DONE); // Çevrim bitene kadar bekleyelim...
  adc_bilgi=ADRESL; // Düşük değerlikli 8 bit alınır.
adc_bilgi+=((unsigned int)ADRESH *256); // 10 bitlik adc bilgisi oluşturulur ...
lcd_clear(); // LCD temizle ...
lcd_goto(S1_1);lcd_puts(" ADC UYGULAMASI ");      // LCD 1.satıra  ADC UYGULAMASI  YAZ 1.Satır 1.Sütundan başlayarak
lcd_goto(S2_7);   // 2.satır 7 sütuna gidelim lcd'de.
lcd_data(adc_bilgi/1000+48);   // adc bilgisi yazdırılır.
lcd_data((adc_bilgi%1000)/100+48);   // adc bilgisi yazdırılır.
lcd_data((adc_bilgi%100)/10+48);   // adc bilgisi yazdırılır.
lcd_data(adc_bilgi%10+48);    // adc bilgisi yazdırılır.
bekle(2000); // 200mS bekleyelim.


if(adc_bilgi==0){LED4=0;LED3=0;LED2=0;LED1=0;} // adc seviyesine göre ledleri yakalım .
if((adc_bilgi>0) && (adc_bilgi<255)){LED4=1;LED3=0;LED2=0;LED1=0;} // adc seviyesine göre ledleri yakalım .
if((adc_bilgi>=255) && (adc_bilgi<512)){LED4=1;LED3=1;LED2=0;LED1=0;} // adc seviyesine göre ledleri yakalım .
if((adc_bilgi>=512) && (adc_bilgi<768)){LED4=1;LED3=1;LED2=1;LED1=0;} // adc seviyesine göre ledleri yakalım .
if(adc_bilgi>=768){LED4=1;LED3=1;LED2=1;LED1=1;} // adc seviyesine göre ledleri yakalım .


   }

}