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.
Ö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 her seferinde ölçülen deger farklı çıktı hatta pın1.5 hiş bişey baglamadan denedim yine degişken degerler çıktı nedenini biliyor musunuz