Jump to content

    
Sign in to follow this  
SAS-1983

Источник прерывания для АЦП

Recommended Posts

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

 

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

 

Разобрался с этой проблемой. Теперь возникла другая: у меня все время прерывание генерится по завершению преобразования нулевого канала. Это так и должно быть и как мне сделать, что бы срабатывало прерывание и по окончании преобразовании в других каналах?

Share this post


Link to post
Share on other sites

Вообще-то АЦП везде ОДИН. Входы - мультиплексируются. Номер входа никак не связан с завершением преобразования. АЦП глубоко наплевать по какому входу пришла аналоговая информация.

Share this post


Link to post
Share on other sites
Вообще-то АЦП везде ОДИН. Входы - мультиплексируются. Номер входа никак не связан с завершением преобразования. АЦП глубоко наплевать по какому входу пришла аналоговая информация.

 

 

Наплевать-то это понятно. Но у меня стоит задача в том, чтьо бы после того как обработчик прерывания зашел в функцию, мне нужно понять из какого канала считывать данные.

Share this post


Link to post
Share on other sites
Наплевать-то это понятно. Но у меня стоит задача в том, чтьо бы после того как обработчик прерывания зашел в функцию, мне нужно понять из какого канала считывать данные.
Там есть регистр, в котором хранится копия последнего результата. Т.е. считывать можно всегда из него.

Share this post


Link to post
Share on other sites
Там есть регистр, в котором хранится копия последнего результата. Т.е. считывать можно всегда из него.

 

 

Точно, забыл что есть такой регистр.

Спасибо.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this