Read-Only Author Sander Wiggers Posted 30-May-2007 11:51 GMT Toolset ARM |  fiq_handler Sander Wiggers Hi, I want to handle my adc interrupt in a fiq using realview. I set the correct bit in the VICIntSelect register and changed the FIQ_Handler to adc_isr. now my program isn't working any more. can someone tell me what's wrong on the following code.
; MY START UP CODE
; Startup Code must be linked first at Address at which it expects to run.
EXTERN adc_isr
AREA RESET, CODE, READONLY
PRESERVE8
ARM
; Exception Vectors
; Mapped to Address 0.
; Absolute addressing mode must be used.
; Dummy Handlers are implemented as infinite loops which can be modified.
Vectors LDR PC, Reset_Addr
LDR PC, Undef_Addr
LDR PC, SWI_Addr
LDR PC, PAbt_Addr
LDR PC, DAbt_Addr
NOP ; Reserved Vector
; LDR PC, IRQ_Addr
LDR PC, [PC, #-0x0120] ; Vector from VicVectAddr
LDR PC, FIQ_Addr
Reset_Addr DCD Reset_Handler
Undef_Addr DCD Undef_Handler
SWI_Addr DCD SWI_Handler
PAbt_Addr DCD PAbt_Handler
DAbt_Addr DCD DAbt_Handler
DCD 0 ; Reserved Address
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler
Undef_Handler B Undef_Handler
SWI_Handler B SWI_Handler
PAbt_Handler B PAbt_Handler
DAbt_Handler B DAbt_Handler
IRQ_Handler B IRQ_Handler
FIQ_Handler B adc_isr
/**********************************************/
/* initialisation of the adc */
***********************************************/
void init_adc
{
uint8 channel;
for(channel = 0; channel < MAX_ADC_INPUTS; channel++)
{
adc_data[channel].adc_active = FALSE;
}
PCLKSEL0 |= (0x01 << 24); /* Set ADC clock to CPU clock */
PCONP |= (1 << 12); /* Enable CLOCK into ADC controller */
PINSEL1 |= (0x01 << 14) | (0x01 << 16) | (0x01 << 18);
AD0CR = (0x07 << 0) | /* SEL = 3, select channel 0 and 1 on ADC0 */
(15 << 8) | /* CLKDIV - 1 */
(0 << 16) | /* BURST = 0, software controlled */
(0 << 17) | /* CLKS = 0, 11 clocks/10 bits */
(1 << 21) | /* PDN = 1, normal operation */
(0 << 22) | /* TEST1: 0 = 00 */
(0 << 24) | /* START = 0 A/D conversion stops */
(0 << 27) ; /* EDGE = 0 (CAP/MAT singal falling,
trigger A/D conversion) */
VICIntSelect |= (1 << ADC0_INT);
VICIntEnable = (1 << ADC0_INT);
enable_timer_process(TMR_handle_adc_inputs);
return(TRUE);
}
/*************************** FUNCTION ************************************/
void adc_isr(void) __irq
/*************************** INFO ****************************************
**
** DESCRIPTION : adc interrupt for channel 1..MAX_ADC_INPUTS
**
** INPUT :
**
** OUTPUT :
**
** RETURN :
**************************************************************************/
{
static uint8 adc_sample_count = (uint8)ADC_SAMPLE_COUNT;
static uint32 adc_value[3];
adc_value[0] += (*((uint16*)(ADC_DATA_REGISTER + 0)));
adc_value[1] += (*((uint16*)(ADC_DATA_REGISTER + 4)));
adc_value[2] += (*((uint16*)(ADC_DATA_REGISTER + 8)));
adc_sample_count--;
AD0INTEN = 0x000;
AD0CR &= ~(1 << 16); /* Disable ADC burst mode */
FIO2CLR = 0x00000040;
}
VICVectAddr = 0; /* Acknowledge interrupt */
}
|