Mikroişlemciler genellikle analog ve digital girişler bulundurur. Analog girişleri mikroişlemcimizin digitale dönüştürmesi gerekir. Bu konu her ne kadar msp430 üzerinden anlatılsada diğer mikroişlemcilerde de bu çalışma mantığını anlmanıza yardımcı olacaktır.

images

Öncelikle programa başlarken kontrol amaçlı ledleri aktif etmemiz gerekiyor. Projeyi launchpad üzerinden kolayca gerçekleştirebiliriz. Bu yüzden launchpadde bulunan ledleri kullanacağız. 1.0 ve  1.6 pinlerine kırmızı ve yeşil ledleri bağlı bulunur eğer sağ alttan jumperları kaldırırsanız bu ledler aktifliğini yitireceklerdir.

#include  "msp430g2553.h" 

#define     LED0                  BIT0

#define     LED1                  BIT6
 
unsigned int value=0;
 
Led0 bit 0’a ve Led 1 bit 6’ya atadık. Led 0 kırmızı ve led 6 ie launchpadden yeşil ledimiz olacaktır.
Bunlar launchpad üzerinde bulunan ledlerdir.
 
Daha sonra adc fonksiyonlarını kullanmak için ADC modülü aktif etmemiz gerekir.
ADC10CTL1 kaydedicisini analog girişler için kullanacağız.
Bizim bir referans gerilimi seçmemiz gerekiyor(Vcc) bunu SReF_o ile yapabiliyoruz. açmak için ADC10ON,ADC10 ve kesme olarak ADC10IE yi açmamız gerekiyor.
 ADC10AE0 ile P1.5 portunu analog modül için giriş seçiyoruz.
void ConfigureAdc( void )

{
   /* Configure ADC  Channel */
   ADC10CTL1 = INCH_5 + ADC10DIV_3 ;         // Kanal 5, ADC10CLK/4
   ADC10CTL0 = SREF_0 + ADC10SHT_3 + ADC10ON + ADC10IE;  //VCC ve Vss referans Gerilimi
   ADC10AE0 |= BIT5;                         //P1.5 ADC için   
}
 
Daha sonra main içerisinde watchdog timerı kapatılır. Ledler analog girişlerimizin çalışıp çalışmadığını anlamak için ayarlanır.
P1sel ile adcnin giriş pini olarak 1.5 seçilir configureAdc() fonksiyonu ise kesme olarak kullanılır ve çalışıp çalışmadığını anlamamız için kesmeye girer
void main( void )

{
   WDTCTL = WDTPW + WDTHOLD;                 // Dur WDT 
   BCSCTL1 = CALBC1_1MHZ;                    // Frekans Ayarı
   DCOCTL = CALDCO_1MHZ;
   BCSCTL2 &= ~(DIVS_3);                  // SMCLK = DCO = 1MHz 
   P1DIR |= LED0 + LED1;  
   P1SEL |= BIT5;                             //ADC Giriş pin P1.5         
   P1OUT &= ~(LED0 + LED1);                    //Ledleri Yak
   
   ConfigureAdc();   
   __enable_interrupt();                     // Kesmeler Açık
 
Bir kaç döngü sonra kararlı bir seviyeye gelmesinden sonra ADC10CTL0 registerına yani kaydedidicisine eklemeye başlayabiliriz.
Ledleri adc modülümüze göre yakabiliriz fakat yanma sayısı en fazla 10bitlik adc kullandığımız için 1023 olacaktır bunu unutmayınız.
Farklı hesaplamalar kullanarak uygulamayı geliştirebilirsiniz.
 
while (1)

   {   
     __delay_cycles(1000);                   // ADCnin referansının kararlı hale gelmesi için bekle
     ADC10CTL0 |= ENC + ADC10SC;             // Örnekleme ve dönüştürme başlatılıyor.
     __bis_SR_register(CPUOFF + GIE);        // LPM0 ile kesmleer aktif    
     value = ADC10MEM;
     if (value>511)
     {
        P1OUT &= ~(LED0 + LED1);                //Değer 511 den büyükse led 0 yanacak değilse led 1
        P1OUT |= LED0;
     }
     else
     {
        P1OUT &= ~(LED0 + LED1);
        P1OUT |= LED1;}
     } 
}
 
ADC için rutin bir işlemdir ve Timer_A da da bu olayı görürüz.
 
// ADC10 interrupt service routine

#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR ( void )
{
   __bic_SR_register_on_exit(CPUOFF);        // Aktif Moda Dön
}
  • ben bu uygulamayı yaptım d her seferinde ölçüler deger farklı çıktı hatta pın1.5 hiş bişey balmadan denedim yine degişken degerler çıktı nedenini biliyor musunuz

    ben bu uygulamayı yaptım her seferinde ölçülen deger farklı çıktı hatta pın1.5 hiş bişey baglamadan denedim yine degişken degerler çıktı nedenini biliyor musunuz