Всем доброго времени суток.
У меня проблема с определанием источника прерывания в AT91SAM7SE512. Дело в том, что яинициализирую АЦП и устанавливаю, что прерывание будет происходить только после окончания преобразования на одном из каналов. Но когда я смотрю регистр ADC_SR, то он мне все время показывает число 0x000E0000. В чем может быть проблема или я не туда смотрю?
Код
//------------------------------------------------------------------------------
/// Инициализация АЦП
//------------------------------------------------------------------------------
void ADC0_Init(void)
{
// SHTIM = 3, STARTUP = 7, PRESCAL = 9, SLEEP = 0, LOWRES = 0, TRGSEL = 0, TRGEN = 0
AT91C_BASE_ADC->ADC_MR = ((SHTIM << 24) | (STARTUP << 16) | (PRESCAL << 8) | (SLEEP << 5) | (LOWRES <<4) | (TRGSEL << 1) | (TRGEN ));
AT91C_BASE_PIOA->PIO_PER = (0x01 << 17) | (0x01 << 18) | (0x01 << 19); // Разрешает PIO управлять соответствующим выводом(отключает переферийное управление выводом)
AT91C_BASE_PIOA->PIO_ODR = (0x01 << 17) | (0x01 << 18) | (0x01 << 19); // Отключаем выход на линии ввода/вывода
AT91C_BASE_PIOA->PIO_IFER = (0x01 << 17) | (0x01 << 18) | (0x01 << 19); // Разрешаем входной фильтр помех на линии ввода/вывода
AT91C_BASE_ADC->ADC_IER = (0x01 << 0) | (0x01 << 1) | (0x01 << 2); // Разрешить прерывание по окончании преобразования 0,1,2 || Разрешаем соответствующее прерывание
AT91C_BASE_ADC->ADC_IDR = (0x01 << 19) | (0x01 << 18) | (0x01 << 17) | (0x01 << 16);
AT91C_BASE_ADC->ADC_CHER = (0x01 << 0) | (0x01 << 1) | (0x01 << 2); // Разрешаем канал 0 и 1 и 2
AIC_ConfigureIT(AT91C_ID_ADC, 0, ISR_ADC0); // Конфигурирует прерывание, связанное с данным источником, используя указанный режим и обработчика прерываний.
AIC_EnableIT(AT91C_ID_ADC); // Допускает прерываниям, исходящим из данного (уникального) источника.
}
Код
//------------------------------------------------------------------------------
/// Обработчик прерывания ADC
//------------------------------------------------------------------------------
static void ISR_ADC0(void)
{
unsigned short data_ADC0_0 = 0x00;
unsigned short data_ADC0_1 = 0x00;
unsigned short data_ADC0_2 = 0x00;
if(AT91C_BASE_ADC->ADC_SR & 0x01) // окончание преобразования канала 0
{
data_ADC0_0 = AT91C_BASE_ADC->ADC_CDR0;
}
if(AT91C_BASE_ADC->ADC_SR & 0x02) // окончание преобразования канала 1
{
data_ADC0_1 = AT91C_BASE_ADC->ADC_CDR1;
}
if(AT91C_BASE_ADC->ADC_SR & 0x04) // окончание преобразования канала 2
{
data_ADC0_2 = AT91C_BASE_ADC->ADC_CDR2;
}
}
Разобрался с этой проблемой. Теперь возникла другая: у меня все время прерывание генерится по завершению преобразования нулевого канала. Это так и должно быть и как мне сделать, что бы срабатывало прерывание и по окончании преобразовании в других каналах?