PIC24-ADC0

Merhaba,
Aşağıya ADC0′ın nasıl kullanıldığı ile ilgili programı ekliyorum. Umarım faydalı olur.
/*
RA0=pot1 üzerindeki voltajı portb üzerinde binari olarak gösterelim
RB0-RB9 çıkış
SWDIP6 üzerinde xtal uçları ve RB4 on olacak
SWDIP4 üzerinde pot1 on olacak
xtal 10Mhz
işlemci 24f64ga002
*/
#include <p24Fxxxx.h>
_CONFIG1(0x3F20) // JTAG, WDF, flash memory'ye yazma kullanılmayacak
_CONFIG2(0x7BAE) // 10mhz xtal (HS), HSPLL enable,
typedef unsigned char u8;
typedef unsigned int u16;
void adc_read(u8 kanal);
void DLY_10US(u16 us);
void DLY_MS(u16 ms);
int
main(void){
while (OSCCONbits.COSC!=3);
while(!OSCCONbits.LOCK);
AD1PCFG=0xFFFE; // AN0 analog, diğerleri dijital
TRISB=0;
TRISA=(u16)0x1; // RA0 giriş
AD1CON1=0x00E0; // auto start ile başlatacağız
AD1CON2=0;
AD1CON3=0;
// TAD = TCY * (ADCS +1)
AD1CON3bits.SAMC=17; // acelemiz yok,
AD1CON3bits.ADCS=16;
AD1CSSL=0; // scan modu off
AD1CON1bits.ADON=1;
DLY_MS(1);
while(1){
adc_read(0); // kanal 0'ı oku
LATB=ADC1BUF0;
DLY_MS(100); // 100ms'de 1 oku ve yaz
};
return 0;
}
void
adc_read(u8 kanal){
AD1CHS = kanal; // kanalı ayarla
AD1CON1bits.ASAM = 1; // start
while(!IFS0bits.AD1IF); // çevrim bitinceye kadar bekle
AD1CON1bits.ASAM = 0; // stop
IFS0bits.AD1IF = 0; // flag clear
}
void
DLY_10US(u16 us){
while(us--) {
__asm__ volatile ("repeat #165");
__asm__ volatile ("nop");
}
}
// 65536ms'ye kadar
void
DLY_MS(u16 ms){
while(ms--){
DLY_10US(100);
}
}