EmbDev.net

Forum: ARM programming with GCC/GNU tools ADC interrupt problem in LPC2138


von kamil bahadir (Guest)


Rate this post
useful
not useful
Hi!

I am using yagarto last ver. in my project. normaly if i use timer0 
interrupt in project, everything ok! timer0 is working.(the LED is 
blinking!!)
if i use two interrupt in system (timer0 and A/D0 ) the system is 
halting.
the code as below,

cpu: LPC2138
//---------------------------------------------------------
#define IRQ_MASK (~0x000000C0)

void tc0_IRQ(void) __attribute__((interrupt("IRQ")));
void adc0_IRQ(void) __attribute__((interrupt("IRQ")));
//-------------------------------------------------------------
/* ****************************************************** */

void EnableIRQ(void)
{
  _SET_CPSR(_GET_CPSR() & IRQ_MASK);

}
/******************************************************** */
static inline unsigned _GET_CPSR(void)
{
  unsigned long retCode;
  asm volatile (" mrs  %0, cpsr" : "=r" (retCode) : );
  return retCode;
}
/* ****************************************************** */
static inline void _SET_CPSR(unsigned value)
{
  asm volatile (" msr  cpsr, %0" : : "r" (value)  );
}
/* ****************************************************** */


void vectorinit (void)
{
#define VICVectCntl0_ENABLE (1<<5)
#define VIC_Channel_Timer0  4
#define VIC_Channel_adc0  18

    // setup timer0 for IRQ
  // set interrupt as IRQ
  VICIntSelect &= ~(1<<VIC_Channel_Timer0);
  VICIntEnable |=  (1<<VIC_Channel_Timer0);// Enable Timer0 Interrupt
  VICIntEnable |=  (1<<VIC_Channel_adc0);


  // assign VIC slot
  VICVectCntl0 = VICVectCntl0_ENABLE | VIC_Channel_Timer0;// use it for 
Timer 0 Interrupt
  VICVectCntl1 = VICVectCntl0_ENABLE | VIC_Channel_adc0;

  VICVectAddr0 = (unsigned long )tc0_IRQ;// set interrupt vector in  0
  VICVectAddr1 = (unsigned long )adc0_IRQ;// set interrupt vector in 1

  /* Enable interrupts */
  EnableIRQ();

}
****************************************************************

void adc0_IRQ (void)
{

#define VIC_Channel_adc  18

unsigned int r,ch;
     VICVectAddr = 0x00000000;       // clear this interrupt from the 
VIC
    //
    //------------------------------------------------------
  r = AD0DR; // Read Data Register and clear DONE flag
  ch = (r >> 24) & 0x07; // which channel was converted
  ADCresult0[ch] = (r>>6) & 0x03FF; // bit 6:15 is 10 bit AD value
:
:Some code in here....
}
/******************************************************* */
void tc0_IRQ (void)
{
:
:some code in here...
:

            VICVectAddr = 0x00000000;             // clear this 
interrupt from the VIC
     T0IR |= 0x00000001;
}
/**********************************************************/
 void init_adc0(unsigned char clk_div){

 PINSEL0 |= 0x00003C00; // P0.5, P0.6 setup for AD0.7, AD1.0
 PCONP |= 0x00001000;   /*Power on the A/D converter 0 */
                          // AD0CR = 0x00200604; // enable ADC, 11 
clocks/10 bits, ADC clock = 4.286MHz
   AD0CR = ( ((clk_div-1))<<8 ) | pdn_bit  ; /* | (1<<ch) configuerthe 
A/D control register of A/D 0  with clock = PCLK/(14+1) = 3.8Mhz
*/
  // power up
   AD0CR |= 0x00010000;    // start burst mode

}
//***************************************************************
//********************************************************************** 
******
int main(void)
{

some code.......

init_adc0(14); /*pass channel number and clkdiv*/
init_adc1(14);
:
:
:
:
}
------------------------------------------------------------------

Best regrads
kamil

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.