ScrambledStamp 0 31 мая, 2008 Опубликовано 31 мая, 2008 · Жалоба Помогите разобраться с прерываниями в 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) Так вот, при подключении юарта реалтаймовая задача начинает глючть, т.е. прерывания начинают запаздывать. Почему? Приоритет таймер же выше? Как решить проблему? Переносить прием комманд в основной цикл не хочется, т.к. в основном цикле ость очень медленный вывод на экран. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flasher 0 31 мая, 2008 Опубликовано 31 мая, 2008 · Жалоба а кусок кода де? прерывание в уарте может долго происходить и пока оно не закончится- другое прерывание не начнется Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ScrambledStamp 0 31 мая, 2008 Опубликовано 31 мая, 2008 · Жалоба а кусок кода де? прерывание в уарте может долго происходить и пока оно не закончится- другое прерывание не начнется Пишу в CVAVR interrupt [uSART0_RXC] void usart0_rx_isr(void) { /// Прерывание юарта, 50 мкс } interrupt [TIM2_COMP] void timer2_comp_isr(void) { // Прерывание таймера , 1мкс, 200 тыщ раз в секунду } Как сделать так, чтоб во время выполнения прерывания юарта могли вызываться ппреывания от таймера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
biDE 0 31 мая, 2008 Опубликовано 31 мая, 2008 · Жалоба "200 тыщ раз в секунду" это тоже 50мкс. При поступленни любого прерывания происходит запрет всех прерываний и переход по соответствующему вектору. Если во время выполнения процедур по прерыванмю от USART приходит прерывание по TMR2, то обработка его (прерывания по TMR2) будет задержана до конца выполнения процедур по USART (у вас это максимум на 50мкс). Чтобы этого избежать можно максимально укоротить процедуры USART или в начале этой процедуры (по USART) насильно включить прерывания, тогда прерывание по TMR2 можно будет обработать не дожидаясь конца выполнения процедур по USART. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ScrambledStamp 0 31 мая, 2008 Опубликовано 31 мая, 2008 · Жалоба Чтобы этого избежать можно максимально укоротить процедуры 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 тыщ раз в секунду } так? Приводит к тому что юарт принимает что-то не то... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flasher 0 31 мая, 2008 Опубликовано 31 мая, 2008 · Жалоба в IAR есть волшебное слово nested. Но почему прерывание уарт такое длинное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tklim 0 31 мая, 2008 Опубликовано 31 мая, 2008 (изменено) · Жалоба в IAR есть волшебное слово nested. Но почему прерывание уарт такое длинное? Действительно много. При прерывании от уарта необходимо забрать байт из регистра и положить его в буфер. Или там тоже какая-то обработка происходит ? Кстати, если уарт на 115200 то прерывания от него будут приходить с периодом 1/14400=69мкс . Изменено 31 мая, 2008 пользователем Клим Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
biDE 0 31 мая, 2008 Опубликовано 31 мая, 2008 · Жалоба Кстати, если уарт на 115200 то прерывания от него будут приходить с периодом 1/14400=69мкс Для скорости 115200 период=(1/115200)*10=86.8мкс и то в случае непрерывной передачи. В обработчике прерывания действительно нужно оставить самое необходимое - вынул байт, положил в память, если надо установил какой-нибудь флажок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться