PIC24-ADC0

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

Yorum ekle

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir