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