реклама на сайте
подробности

 
 
> Источник прерывания для АЦП
SAS-1983
сообщение May 17 2008, 08:22
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 39
Регистрация: 1-02-07
Пользователь №: 24 952



Всем доброго времени суток.

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


Разобрался с этой проблемой. Теперь возникла другая: у меня все время прерывание генерится по завершению преобразования нулевого канала. Это так и должно быть и как мне сделать, что бы срабатывало прерывание и по окончании преобразовании в других каналах?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th September 2025 - 03:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.03879 секунд с 7
ELECTRONIX ©2004-2016