hello can any one help me to slove my problem im facing problem with my adc in lpc 2148.im posting my code so please go through once and execute it.im facing that conversion is taking continously even though there is a fixed analog value.the digital conversion is so fast and it is continously varying instead of showing one converted value.
------------------------------------------------------------------------------------------------- #include <lpc21xx.h> /* LPC2200 definitions */ #include <stdio.h> /* standard I/O .h-file */
#define pin_rs 1<<24 /*lcd rs pin*/ #define pin_rw 1<<23 /*lcd rw pin*/ #define pin_en 1<<22 /*lcd en pin*/
#define pin_ctrl pin_rs|pin_rw|pin_en /*lcd control pins*/
#define lcd_d4 1<<10 /*lcd data pins D4,D5,D6,D7*/ #define lcd_d5 1<<11 #define lcd_d6 1<<12 #define lcd_d7 1<<13
#define lcd_data lcd_d4|lcd_d5|lcd_d6|lcd_d7 #define lcd_rs(x) ((x)?(IOSET1=pin_rs):(IOCLR1=pin_rs));/*lcd_rs(x) if x=1 will set the lcd_rs pin will clear if x=0*/ #define lcd_rw(x) ((x)?(IOSET1=pin_rw):(IOCLR1=pin_rw)); #define lcd_en(x) ((x)?(IOSET1=pin_en):(IOCLR1=pin_en)); #define data_in ((IOPIN0>>10)&(0x0F))
/*direction of the data pins as input*/ #define data_out(x) IOCLR0=lcd_data; IOSET0=(x & 0x0F)<<10; /*direction of the data pins and control pins as output*/ #define lcd_all_dir_out IODIR0 |= lcd_data; IODIR1 |= pin_ctrl; /*setting as output for both data and control pins*/ #define lcd_dir_data_out IODIR0 |= lcd_data #define lcd_dir_data_in IODIR0 &= ~(lcd_data) #define delay_2n 4 long ioscan=0; unsigned int z,d1,d2,d3,d4,d5; volatile unsigned int val; static void delay(int); static unsigned char busy_wait(void);
static void delay(int cnt) { cnt <<= delay_2n; while(cnt--); }
void adc_read(void); void adc_init(void); void adc_data(void); void data(void); void lcddata(unsigned char c); void lcdcmd(unsigned char c); void lcdinit(void); void lcddisplay(unsigned char *ptr); void message(unsigned char k,unsigned char *ptr1);
static unsigned char busy_wait() { delay(500); return 1;
}
void lcd_write_4bit(unsigned char c) { lcd_rw(0); delay(10); lcd_en(1); delay(10); data_out(c & 0x0F); delay(10); lcd_en(0); delay(10); }
void lcdcmd(unsigned char c) {
busy_wait(); lcd_rs(0); delay(10); lcd_write_4bit(c>>4); lcd_write_4bit(c); }
void lcddata(unsigned char c) { busy_wait(); lcd_rs(1); delay(10); lcd_write_4bit(c>>4); lcd_write_4bit(c); }
void lcddisplay(unsigned char *ptr) { while(*ptr) { lcddata(*ptr); ptr++; } }
void lcdinit() { lcd_all_dir_out; delay(10); lcd_rs(0); lcd_write_4bit(0x3); delay(10); lcd_write_4bit(0x3); delay(10); lcd_write_4bit(0x3); lcd_write_4bit(0x2); lcdcmd(0x28); lcdcmd(0x0C); }
void lcd_clear() { lcdcmd(0x01);
void message(unsigned char k,unsigned char *ptr1) { lcdcmd(k); delay(10); lcddisplay(ptr1); }
void adc_init(void) { VPBDIV = 0x02; //Set the Pclk to 30 Mhz ADCR &= 0x00000000;// reset all cotrol bit ADCR = 0x00250602; // Setup A/D: 10-bit AIN0 @ 3MHz ADCR |= 0x01000000; // Start A/D Conversion }
void adc_read(void) { do { val = ADDR; // Read A/D Data Register } while ((val & 0x80000000) == 0); //Wait for the conversion to complete ADCR=~0x01000000; // Stop A/D Conversion val = ((val >> 6) & 0x03FF); //Extract the A/D result }
void adc_data(void) { z=val; d1=z/10; d2=z%10; d3=d1/10; d4=d1%10;
lcdcmd(0xc0); lcddata(d3+0x30); lcddata(d4+0x30); lcddata(d2+0x30);
int main() { PINSEL1=0x01000000; lcdinit(); lcd_clear(); delay(100); message(0x80,"ADC TESTING"); adc_init();
while(1) { adc_read(); adc_data(); } }