We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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 */ }