XC8 ADC MODÜLÜ

Başlatan esdevhk, 07 Haziran 2018, 19:55:31

esdevhk

İyi çalışmalar arkadaşlar,
MPLAB ile uygulama geliştirmeye yeni başladım. ADC modülüne bakıyorum fakat bir kod bloğunda neler olduğunu anlamadığım bir kısım var. Onu sizlerle paylaşıp ADC mantığını anlamak istiyorum. Kodun yazıldığı proje 16F877A ile yapılmış.

#include <xc.h>

#define _XTAL_FREQ 8000000

void ADC_Init()
{
  ADCON0 = 0x81;              //Turn ON ADC and Clock Selection
  ADCON1 = 0x00;              //All pins as Analog Input and setting Reference Voltages
}

unsigned int ADC_Read(unsigned char channel)
{
  if(channel > 7)              //Channel range is 0 ~ 7
    return 0;

  ADCON0 &= 0xC5;              //Clearing channel selection bits
  ADCON0 |= channel<<3;        //Setting channel selection bits
  __delay_ms(2);              //Acquisition time to charge hold capacitor
  GO_nDONE = 1;                //Initializes A/D conversion
  while(GO_nDONE);            //Waiting for conversion to complete
  return ((ADRESH<<8)+ADRESL); //Return result
}

void main()
{
  unsigned int a;
  TRISA = 0xFF;                //Analog pins as Input
  TRISB = 0x00;                //Port B as Output
  TRISC = 0x00;                //Port C as Output
  ADC_Init();                  //Initialize ADC

  do
  {
    a = ADC_Read(0);            //Read Analog Channel 0
    PORTB = a;                  //Write Lower bits to PORTB
    PORTC = a>>8;              //Write Higher 2 bits to PORTC
    __delay_ms(100);            //Delay
  }while(1);                    //Infinite Loop
}
Arkadaşlar kodun tamamı burada. Ben bazı kısımları anlamadım şimdi size onları göstereceğim.

void ADC_Init()
{
  ADCON0 = 0x81;              //Turn ON ADC and Clock Selection
  ADCON1 = 0x00;              //All pins as Analog Input and setting Reference Voltages
}

Bu kod bloğunda yaptığı şeyi anladım sayılır. Size de söyleyeyim beni doğrulayın. Burada ilgili PIC in datasheet'inden bakarak sahip olduğu ADC modüllerini adreslendirdik.

ADCON0 &= 0xC5;              //Clearing channel selection bits
 ADCON0 |= channel<<3;        //Setting channel selection bits

Bu kısımda ise ne yapıldığını tam anlamadım. Bit işlemlerinden sonra elde edilen adres yine aynı oldu. Ne farketti onu anlamadım.

return ((ADRESH<<8)+ADRESL); //Return result
Okunan analog değer ADRESH ve ADRESL'e kaydediliyor diye biliyorum. Fakat burada tam olarak nasıl bir iş dönüyor tam bilmiyorum.  Genel olarak ufak bir açıklama ile kod parçacığında ne oluyor beni aydınlatırsanız çok sevinirim.