Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Источник прерывания для АЦП
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
SAS-1983
Всем доброго времени суток.

У меня проблема с определанием источника прерывания в 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;
  }
  
  
}


Разобрался с этой проблемой. Теперь возникла другая: у меня все время прерывание генерится по завершению преобразования нулевого канала. Это так и должно быть и как мне сделать, что бы срабатывало прерывание и по окончании преобразовании в других каналах?
DpInRock
Вообще-то АЦП везде ОДИН. Входы - мультиплексируются. Номер входа никак не связан с завершением преобразования. АЦП глубоко наплевать по какому входу пришла аналоговая информация.
SAS-1983
Цитата(DpInRock @ May 17 2008, 13:48) *
Вообще-то АЦП везде ОДИН. Входы - мультиплексируются. Номер входа никак не связан с завершением преобразования. АЦП глубоко наплевать по какому входу пришла аналоговая информация.



Наплевать-то это понятно. Но у меня стоит задача в том, чтьо бы после того как обработчик прерывания зашел в функцию, мне нужно понять из какого канала считывать данные.
Сергей Борщ
Цитата(SAS-1983 @ May 19 2008, 12:01) *
Наплевать-то это понятно. Но у меня стоит задача в том, чтьо бы после того как обработчик прерывания зашел в функцию, мне нужно понять из какого канала считывать данные.
Там есть регистр, в котором хранится копия последнего результата. Т.е. считывать можно всегда из него.
SAS-1983
Цитата(Сергей Борщ @ May 19 2008, 13:05) *
Там есть регистр, в котором хранится копия последнего результата. Т.е. считывать можно всегда из него.



Точно, забыл что есть такой регистр.
Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.