EmbeddedRelated.com
Forums

ADC on LPC2134 vs. ADC on LPC2138

Started by gaquaycalifornia February 6, 2006
Hi,
Please help with the Adcs.
I having problem of reading conversion from ADC_1.
LPC2134/6/8 have two ADCs and 16 pins to connect to.
I wrote the following code. and it runs fine in the evaluation board 
LPC2138, but not the target board LPC2134.
Here is what I did.
Initialize ADC0
Initialize ADC1
Both has interrupt vectors assigned to.

#define configure_adc_0 0x01215F00
#define configure_adc_1 0x01215F00

void adc_0_initialize (int * p, int lastchannel)
{
	index_0 = 0;
	memcpy(&x[0], p,32);
	lastchannel_adc_0 = lastchannel; 
	VICVectAddr3 = (unsigned long)adc0_irq;			
	VICVectCntl3 = 0x32; 				    	
	VICIntEnable |= VIC_BIT(VIC_ADC_0);			
	AD0CR   = configure_adc_0 | Find_Next_Channel(lastchannel,0) ;
}
void adc_1_initialize (int * p, int lastchannel)
{
	index_1 = 0;
	memcpy(&y[0], p,32);
	lastchannel_adc_1 = lastchannel; 
	VICVectAddr10 = (unsigned long)adc1_irq;		
	VICVectCntl10 = 0x35; 				    	
	VICIntEnable |= VIC_BIT(VIC_ADC_1);			
	AD1CR   = configure_adc_1 | Find_Next_Channel(lastchannel,1) ;
}
// to start both ADCs
void StartAdcs(void){
	ADGSR = 0x01010000;
}
// isr of adc0
void adc0_irq (void) __irq
{
	int chan, tmp;
	unsigned short val;
	tmp = AD0DR;
	chan = ((tmp >> 24)& 0x07); 
	val =  (unsigned short)((tmp >> 6 )& 0x3FF);
	result_0[index_0][chan] = val;
	index_0 = IncrementInindex(index_0,chan,0);
	AD0CR  = configure_adc_0 | Find_Next_Channel(chan,0) ;
	VICVectAddr = 0; 					
}
// isr of adc1
void adc1_irq (void) __irq
{
	int chan, tmp;
	unsigned short val;
	tmp = AD1DR;
	chan = ((tmp >> 24)& 0x07); 
	val =  (unsigned short)((tmp >> 6 )& 0x3FF);
	result_1[index_1][chan] = val;
	index_1 = IncrementInindex(index_1,chan,1);
	AD1CR   = configure_adc_1 | Find_Next_Channel(chan,1) ;
	VICVectAddr = 0; 					
				
}

On the evaluation board which has LPC2138 it runs fine, both 
interrupt got triggered.
When move this code onto the target with a LPC2134, only adc0 gets 
triggerd.

Please take a look and help me with any ideas

thanks
	

An Engineer's Guide to the LPC2100 Series

Have you looked at the peripheral power-control register (PCONP)
setting?

We had a similar problem a while back (see message 8441). It turned 
out this had to be set explicitely to enable teh 2nd ADC: the 
maunual's description of the default setting turned out to be wrong.

Regards
Brendan
	--- In lpc2000@lpc2..., "gaquaycalifornia" 
<gaquaycalifornia@...> wrote:
>
> Hi,
> Please help with the Adcs.
> I having problem of reading conversion from ADC_1.
> LPC2134/6/8 have two ADCs and 16 pins to connect to.
> I wrote the following code. and it runs fine in the evaluation 
board 
> LPC2138, but not the target board LPC2134.
> Here is what I did.
> Initialize ADC0
> Initialize ADC1
> Both has interrupt vectors assigned to.
> 
> #define configure_adc_0 0x01215F00
> #define configure_adc_1 0x01215F00
> 
> void adc_0_initialize (int * p, int lastchannel)
> {
> 	index_0 = 0;
> 	memcpy(&x[0], p,32);
> 	lastchannel_adc_0 = lastchannel; 
> 	VICVectAddr3 = (unsigned long)adc0_irq;			
> 	VICVectCntl3 = 0x32; 				    	
> 	VICIntEnable |= VIC_BIT(VIC_ADC_0);			
> 	AD0CR   = configure_adc_0 | Find_Next_Channel(lastchannel,0) ;
> }
> void adc_1_initialize (int * p, int lastchannel)
> {
> 	index_1 = 0;
> 	memcpy(&y[0], p,32);
> 	lastchannel_adc_1 = lastchannel; 
> 	VICVectAddr10 = (unsigned long)adc1_irq;		
> 	VICVectCntl10 = 0x35; 				    	
> 	VICIntEnable |= VIC_BIT(VIC_ADC_1);			
> 	AD1CR   = configure_adc_1 | Find_Next_Channel(lastchannel,1) ;
> }
> // to start both ADCs
> void StartAdcs(void){
> 	ADGSR = 0x01010000;
> }
> // isr of adc0
> void adc0_irq (void) __irq
> {
> 	int chan, tmp;
> 	unsigned short val;
> 	tmp = AD0DR;
> 	chan = ((tmp >> 24)& 0x07); 
> 	val =  (unsigned short)((tmp >> 6 )& 0x3FF);
> 	result_0[index_0][chan] = val;
> 	index_0 = IncrementInindex(index_0,chan,0);
> 	AD0CR  = configure_adc_0 | Find_Next_Channel(chan,0) ;
> 	VICVectAddr = 0; 					
> }
> // isr of adc1
> void adc1_irq (void) __irq
> {
> 	int chan, tmp;
> 	unsigned short val;
> 	tmp = AD1DR;
> 	chan = ((tmp >> 24)& 0x07); 
> 	val =  (unsigned short)((tmp >> 6 )& 0x3FF);
> 	result_1[index_1][chan] = val;
> 	index_1 = IncrementInindex(index_1,chan,1);
> 	AD1CR   = configure_adc_1 | Find_Next_Channel(chan,1) ;
> 	VICVectAddr = 0; 					
> 				
> }
> 
> On the evaluation board which has LPC2138 it runs fine, both 
> interrupt got triggered.
> When move this code onto the target with a LPC2134, only adc0 gets 
> triggerd.
> 
> Please take a look and help me with any ideas
> 
> thanks
>
	
Thanks for the help.
  Just what it takes to make it works
  thanks
	brendanmurphy37 <brendan.murphy@bren...> wrote:
  
Have you looked at the peripheral power-control register (PCONP)
setting?

We had a similar problem a while back (see message 8441). It turned 
out this had to be set explicitely to enable teh 2nd ADC: the 
maunual's description of the default setting turned out to be wrong.

Regards
Brendan
	--- In lpc2000@lpc2..., "gaquaycalifornia" 
<gaquaycalifornia@...> wrote:
>
> Hi,
> Please help with the Adcs.
> I having problem of reading conversion from ADC_1.
> LPC2134/6/8 have two ADCs and 16 pins to connect to.
> I wrote the following code. and it runs fine in the evaluation 
board 
> LPC2138, but not the target board LPC2134.
> Here is what I did.
> Initialize ADC0
> Initialize ADC1
> Both has interrupt vectors assigned to.
> 
> #define configure_adc_0 0x01215F00
> #define configure_adc_1 0x01215F00
> 
> void adc_0_initialize (int * p, int lastchannel)
> {
>       index_0 = 0;
>       memcpy(&x[0], p,32);
>       lastchannel_adc_0 = lastchannel; 
>       VICVectAddr3 = (unsigned long)adc0_irq;                  
>       VICVectCntl3 = 0x32;                                   
>       VICIntEnable |= VIC_BIT(VIC_ADC_0);                  
>       AD0CR   = configure_adc_0 | Find_Next_Channel(lastchannel,0) ;
> }
> void adc_1_initialize (int * p, int lastchannel)
> {
>       index_1 = 0;
>       memcpy(&y[0], p,32);
>       lastchannel_adc_1 = lastchannel; 
>       VICVectAddr10 = (unsigned long)adc1_irq;            
>       VICVectCntl10 = 0x35;                                   
>       VICIntEnable |= VIC_BIT(VIC_ADC_1);                  
>       AD1CR   = configure_adc_1 | Find_Next_Channel(lastchannel,1) ;
> }
> // to start both ADCs
> void StartAdcs(void){
>       ADGSR = 0x01010000;
> }
> // isr of adc0
> void adc0_irq (void) __irq
> {
>       int chan, tmp;
>       unsigned short val;
>       tmp = AD0DR;
>       chan = ((tmp >> 24)& 0x07); 
>       val =  (unsigned short)((tmp >> 6 )& 0x3FF);
>       result_0[index_0][chan] = val;
>       index_0 = IncrementInindex(index_0,chan,0);
>       AD0CR  = configure_adc_0 | Find_Next_Channel(chan,0) ;
>       VICVectAddr = 0;                               
> }
> // isr of adc1
> void adc1_irq (void) __irq
> {
>       int chan, tmp;
>       unsigned short val;
>       tmp = AD1DR;
>       chan = ((tmp >> 24)& 0x07); 
>       val =  (unsigned short)((tmp >> 6 )& 0x3FF);
>       result_1[index_1][chan] = val;
>       index_1 = IncrementInindex(index_1,chan,1);
>       AD1CR   = configure_adc_1 | Find_Next_Channel(chan,1) ;
>       VICVectAddr = 0;                               
>                         
> }
> 
> On the evaluation board which has LPC2138 it runs fine, both 
> interrupt got triggered.
> When move this code onto the target with a LPC2134, only adc0 gets 
> triggerd.
> 
> Please take a look and help me with any ideas
> 
> thanks
>
	  SPONSORED LINKS 
        Microcontrollers   Microprocessor   Intel microprocessors     Pic
microcontrollers 
    
---------------------------------
  YAHOO! GROUPS LINKS
	---------------------------------
	---------------------------------
 Yahoo! Autos. Looking for a sweet ride? Get pricing, reviews, & more on new
and used cars.