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

 
 
 
Reply to this topicStart new topic
> LDLE mode в обработчике прерывания, AT91SAM7S64
MiklPolikov
сообщение Aug 3 2008, 14:32
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Хочу в прерывании от PIT запускать ADC и переводить процессор в idle mode для уменьшения шума,
а возвращатся из IDLE mode он будет по прерыванию от ADC.
И не работает- процессор так и остаётся в IDLE.
А если всё то же самое делать не в прерывании от таймера- работает .

Почему так ? В обработчике прерывания нельзя переходить в IDLE mode ?

Спасибо !


__irq void PIT_interrupt(void) //прерывание от PIT
{

x=*AT91C_PITC_PIVR; //сбрасываем флаг прерывания
*AT91C_ADC_CR|=AT91C_ADC_START; //запускаем ADC
AT91C_BASE_PMC->PMC_SCDR|=(1<<0); // idle mode
*AT91C_AIC_EOICR = 0; // возврат из прерывания
}

__irq void ADC_interrupt(void) // прерывание от ADC
{

x=*AT91C_ADC_LCDR; //сбрасываем флаг прерывания
*AT91C_AIC_EOICR = 0; // возврат из прерывания
}

Сообщение отредактировал MiklPolikov - Aug 3 2008, 14:32


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
injen-d
сообщение Aug 3 2008, 17:09
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 10-10-07
Из: Воронежа
Пользователь №: 31 250



Вы останавливаете процессор когда он находится в прерывании от PIT, следовательно он там и останется, и прерывание от ADC не может возникнуть, если оно ниже приоритетом и запрещены вложенные прерывания. Я бы советовал использовать флаг (если это возможно) и устанавливать его в прерывании от PIT, а в основной программе анализировать его, и если установлен - переходить в idle. Конечно можно поэксперементировать с приоритетами прерываний, вдруг поможет? biggrin.gif


--------------------
- Бендер, ты же робот, зачем тебе пить пиво?
- Незачем! Я могу бросить в любой момент!
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Aug 4 2008, 06:29
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Спасибо за подсказку !
Сделал приоритет ADC выше PIT и заработало .


Цитата(injen-d @ Aug 3 2008, 21:09) *
Конечно можно поэксперементировать с приоритетами прерываний, вдруг поможет? biggrin.gif


Сообщение отредактировал MiklPolikov - Aug 4 2008, 06:29


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 4 2008, 07:22
Сообщение #4


Гуру
******

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



Цитата(MiklPolikov @ Aug 4 2008, 09:29) *
Сделал приоритет ADC выше PIT и заработало .
Как вариант можно было сказать AIC, что текущее прерывание уже обработано: AT91C_AIC_EOICR = 0;


--------------------
На любой вопрос даю любой ответ
"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

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:32
Рейтинг@Mail.ru


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