2005-08-10 04:58 AM
2005-08-10 02:53 AM
Hi,
I'm using since few days an STR710FZ2-EVAL with Keil compiler, and i'm testing some simple applications. I try to use ADC in different mode, but I have a problem with ADC interrupt. I use ADC in ''manual'' mode with the following code while(1){ .... ADC12_Init(); ADC12_PrescalerConfig(50); ADC12_ModeConfig(ADC12_SINGLE); ADC12_ChannelSelect(ADC12_CHANNEL0); ADC12_ConversionStart(); while (!ADC12_FlagStatus (ADC12_DA0)); data = ADC12_ConversionValue(ADC12_CHANNEL0); ADC12->CSR &= ~ADC12_DA0; ... } and it works. I try also the roud robin mode and works too. I have some problems when i try to use the interrupts. The code in main file is the following: u16 data=0; .... ADC12_Init(); ADC12_PrescalerConfig(50); ADC12_ModeConfig(ADC12_SINGLE); ADC12_ChannelSelect(ADC12_CHANNEL0); ADC12_ITConfig(ENABLE); ADC12_ConversionStart(); EIC_Init(); EIC_IRQChannelConfig(ADC_IRQChannel, ENABLE); EIC_IRQChannelPriorityConfig(ADC_IRQChannel, 1); EIC_IRQConfig(ENABLE); while(1){ //control the value of data } and the interrupt routine extern u16 data; void ADC12_IRQHandler(void) __arm { data = ADC12_ConversionValue(ADC12_CHANNEL0); ADC12->CSR &= ~ADC12_DA0; } but the application not enter in ADC12_IRQHandler, in fact the value of data is always equal to 0. Someone can help me?2005-08-10 04:04 AM
Have not used the ADC part of the chip yet but are you sure the interrupt is not happening, the code looks ok?
You should also declare ''data'' as volatile. I dont know how you are using it, but the compiler may well be optermising it in such a way that it is not updating after the interrupt..2005-08-10 04:58 AM
Now is OK. The problem is that i write an application to test all the modes of the ADC : ''manual'' & ''interrupt'' mode, single channel & round robin mode, so i define some directive in main file like this :
#define MANUAL_MODE //#define INTERRUPT_MODE #define SINGLE_CHANNEL_0 //define ROUND_ROBIN .... and then i write the code for this directive in main file #ifdef MANUAL_MODE ..... #endif #ifdef INTERRUPT_MODE ..... #endif ... an so on then i test the different mode comment some line. The problem is that i make the same in interrupt routine like this : extern vu16 datas; void ADC12_IRQHandler(void) __arm { #ifdef MODE_SINGLE_0 datas = ADC12_ConversionValue(ADC12_CHANNEL0); ADC12->CSR &= ~ADC12_DA0; #endif #ifdef MODE_SINGLE_3 datas = ADC12_ConversionValue(ADC12_CHANNEL3); ADC12->CSR &= ~ADC12_DA3; #endif #ifdef MODE_ROUND datas = ADC12_ConversionValue(ADC12_CHANNEL0); .... ADC12->CSR = 0; #endif } and i don't know why but this is wrong. In fact if i don't use the directive in interrupt routine the code works. Moreover i see that is the same if i define a variable as volatile or not.