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;
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
}
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
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;}
}
}
// 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