XC8 İle ADC ve LCD Uygulaması

Başlatan serhat1990, 27 Ekim 2015, 00:02:00

serhat1990

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/

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

			
   }

}