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

 
 
 
Reply to this topicStart new topic
> Источник прерывания для АЦП
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
DpInRock
сообщение May 17 2008, 09:48
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



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


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
SAS-1983
сообщение May 19 2008, 09:01
Сообщение #3


Участник
*

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



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



Наплевать-то это понятно. Но у меня стоит задача в том, чтьо бы после того как обработчик прерывания зашел в функцию, мне нужно понять из какого канала считывать данные.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 19 2008, 09:05
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SAS-1983
сообщение May 19 2008, 11:52
Сообщение #5


Участник
*

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



Цитата(Сергей Борщ @ May 19 2008, 13:05) *
Там есть регистр, в котором хранится копия последнего результата. Т.е. считывать можно всегда из него.



Точно, забыл что есть такой регистр.
Спасибо.
Go to the top of the page
 
+Quote Post

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

 


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


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