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

 
 
> Прерывания в AVR
ScrambledStamp
сообщение May 31 2008, 12:23
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 31-05-08
Пользователь №: 37 943



Помогите разобраться с прерываниями в ATMEGA64
Есть три задачи:
1) Реалтаймовая работа, занимает 20 тактов, ведется в interrupt [TIM2_COMP] void timer2_comp_isr(void)
прерывание с частотой 200 кГц
2) обработка - отображение результата, ведется в основном цикле программы, не мешат прерыванию.

3) Прием комманд по UART interrupt [USART0_RXC] void usart0_rx_isr(void)
занимает остаточно много времени, но всегда успевает завершиться до прихода следующего байта (скорость 115.200)

Так вот, при подключении юарта реалтаймовая задача начинает глючть, т.е. прерывания начинают запаздывать. Почему? Приоритет таймер же выше? Как решить проблему? Переносить прием комманд в основной цикл не хочется, т.к. в основном цикле ость очень медленный вывод на экран.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
biDE
сообщение May 31 2008, 13:15
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 1-02-06
Из: Одесса
Пользователь №: 13 863



"200 тыщ раз в секунду" это тоже 50мкс.
При поступленни любого прерывания происходит запрет всех прерываний и переход по соответствующему вектору. Если во время выполнения процедур по прерыванмю от USART приходит прерывание по TMR2, то обработка его (прерывания по TMR2) будет задержана до конца выполнения процедур по USART (у вас это максимум на 50мкс).
Чтобы этого избежать можно максимально укоротить процедуры USART или в начале этой процедуры (по USART) насильно включить прерывания, тогда прерывание по TMR2 можно будет обработать не дожидаясь конца выполнения процедур по USART.
Go to the top of the page
 
+Quote Post
ScrambledStamp
сообщение May 31 2008, 13:53
Сообщение #3





Группа: Новичок
Сообщений: 4
Регистрация: 31-05-08
Пользователь №: 37 943



Цитата(biDE @ May 31 2008, 17:15) *
Чтобы этого избежать можно максимально укоротить процедуры USART или в начале этой процедуры (по USART) насильно включить прерывания, тогда прерывание по TMR2 можно будет обработать не дожидаясь конца выполнения процедур по USART.


interrupt [USART0_RXC] void usart0_rx_isr(void)
{
#asm("sei");
/// Прерывание юарта, 50 мкс
}

interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
// Прерывание таймера , 1мкс, 200 тыщ раз в секунду
}

так?
Приводит к тому что юарт принимает что-то не то...
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 20th August 2025 - 19:06
Рейтинг@Mail.ru


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