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
Log in with Google account
No account? Register here.