Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.85/114: Рейтинг темы: голосов - 114, средняя оценка - 4.85
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
1

Изменение приоритетов прерываний в Atmega328p

02.01.2013, 14:46. Просмотров 20804. Ответов 55
Метки нет (Все метки)

Столкнулся с проблемой которая требует чтобы текущий обработчик прерывания отработал без прерывания своей работы более высокоприоритетным прерыванием.
Т.е. если в процессе обработки прерывания INT1, и частичного выполнения кода обработчика оного, внезапно произойдет прерывание INT0 (приоритет которого выше), то, насколько я знаю, обработчик INT1 будет прерван, запущен обработчик INT0, и только после выполнения кода оного, обработчик INT1 будет вызван для завершения вычислений.
Вызов cli() / sei() внутри текущего обработчика приводит к пропускам прерываний, а надо чтобы все прерывания обрабатывались без потерь после выполнения уже начатого. Иными словами нужен механизм, позволяющий задать нескольким (в моем случае 4) прерываниям либо равный приоритет, либо нечто, ставящее их в очередь в порядке появления.
Будьте добры, посоветуйте как решить данную задачу?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2013, 14:46
Ответы с готовыми решениями:

Изменение прерываний в AtMega48
Добрый день : Такой код в кратце ISR (INT0_vect) { z=0; PORTB = 0xFF; }ISR (INT1_vect)...

ATmega328P
Добрый день! Тщетно пытаюсь настроить UART в Proteus 7.0. #include <avr/io.h> #define F_CPU...

Уровни приоритетов, как правильно расставить?
В проекте, на F205, у меня задействованы: TIM2,3,4 CAN2TX, CAN2RX USORT2, USORT3, USORT6 в...

atmega328p и bootloader
Переделал boottooder, работающий с AvrProk, который был тут в уроках по avr под мегу 328. Создал...

Atmega328p + WT11i
Добрый день! Работаю над проектом по созданию устройств, общающихся между собой по Bluetooth. Встал...

55
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
05.01.2013, 20:42 21
Занимает менее 4мкс на моем МК. Это "тяжело"?
0
oordvork
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 9
05.01.2013, 23:19 22
3000 событий в секунду, на обработку каждого тратится до 4 мкс. Итого - 12000 мкс. Почти полтора процента времени система обработки прерываний заблокирована. Или другой взгляд на проблему - в течение секунды порядка сорока событий могут быть зарегистрированы с дополнительной погрешностью (опозданием) в 4 мкс.
Вроде бы мелочь, однако она возникла на пустом месте. И она сопоставима с теми самыми двумя упоминавшимися вами "тяжелыми" умножениями. И кроме того, в условиях, когда вы уже столкнулись с необходимостью ловить блох, избавиться от такого жирного таракана сам бог велел.
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
06.01.2013, 00:20 23
Проблема в том, что из доступных таймеров остался только 8-битный, остальные заняты.
А программить его пусть на дискрет = 1мкс, инкрементить счетчик переполнений, и считать итоговую сумму тиков (мкс) с учетом переполнений займет немногим меньше времени, чем есть сейчас...
Не могу правда пока что точно оценить насколько будет разница, и стоит ли игра свеч.
П.С. Я надеюсь, что библиотеки Ардуино писали не ПТУшники и реализация того же микрос() мало чем будет отличаться, от вышеописанного алго.
0
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
06.01.2013, 03:06 24
Я в ЯВУ не силен, поэтому опишу словами. Делал бы так (исходя из того, как понял задачу):
Аппаратный уровень: Имеем 4 входных воздействия. Допустим (ТС так и не сознался, но, думаю, предположение верно), это изменение уровня на входе. Приводим все воздействия к одному прерыванию, скажем, INT0. Как? Просто заводим входные воздействия на старший или младший полубайт какого- либо порта и через диоды- (монтажное ИЛИ или И, в зависимости) на INT0.
Программный уровень:
Заводим в памяти флаговую переменную, небольшой кольцевой буфер и отводим отдельный регистр, в котором храним текущие (необработанные) воздействия.
Любое входное воздействие приводит к возникновению прерывания INT0, в котором устанавливается флаг признака обработки прерывания (наличия такового для основной программы), происходит считывание с ножек и запись полубайта в кольцевой буфер с модификацией указателей на голову и хвост. Все. Больше в прерывании ничего не происходит!
Основная программа тупит, ожидая флага признака необработанного прерывания, считывает полубайт, модифицирует указатели и, обработав его, сбрасывает флаг, если буфер пуст.
Разрешение конфликтов (если в полубайте больше одной единицы/нуля) оставим на откуп разработчику (например, зажечь светодиод при отладке).

Еще вариантВообще, вот тут рассматривалась подобная задача. Осталось добавить описанные выше буферы и флаги, чтоб не потерять часто приходящие прерывания, словом, чуть -чуть допилить статью.
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
06.01.2013, 03:09 25
Я ничего не скрываю, Вы не стесняйтесь ставить прямые вопросы! :)
Суть: обработка сигналов датчиков АБС.
Одно прерывание в данном случае совсем не роялит, т.к. мне надо писать в лог раздельно все 4 РАЗНЫЕ и НЕЗАВИСИМЫЕ скорости колес в отдельности!
0
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
06.01.2013, 03:14 26
Перечитайте и попробуйте.
Одно прерывание в данном случае совсем не роялит, т.к. мне надо писать в лог раздельно все 4 РАЗНЫЕ и НЕЗАВИСИМЫЕ скорости колес в отдельности!
Этим и займется основная программа, имея 4-х битный код датчика.
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
06.01.2013, 03:25 27
В чем будет отличие если сравнивать с раздельными прерываниями (по одному на ногу) и взведением соотв-х битов флага в оных?
В случае с одним прерыванием необходим парсер (опрос состояния всех ног), если прерываний столько же сколько и ног - этого делать не надо.
За подсказку - благодарю. :)
0
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
06.01.2013, 03:31 28
Цитата Сообщение от Momstir
В чем будет отличие если сравнивать с раздельными прерываниями (по одному на ногу) и взведением соотв-х битов флага в оных?
В едином обработчике. Коротком. В возможности отследить четыре одновременно пришедших сигнала. Если вы расчитываете скорость по таймеру, то скорее всего сокращаются расчеты для пришедших одновременно сигналов.
Цитата Сообщение от Momstir
В случае с одним прерыванием необходим парсер (опрос состояния всех ног), если прерываний столько же сколько и ног - этого делать не надо.
Нужно просто считать весь порт и отдавить по маске незначащую тетраду.
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
06.01.2013, 03:38 29
Цитата Сообщение от STT
В едином обработчике. Коротком. В возможности отследить четыре одновременно пришедших сигнала.
Блядство, это же придется считай с нуля переписывать всю прошивку... Ничо, заодно и от микрос() будет повод отказаться. :)
Цитата Сообщение от STT
Нужно просто считать весь порт и отдавить по маске незначащую тетраду.
Это при условии что требуемые ноги возможно разместить в рамках одного порта, а это не всегда получается (т.к. часть из них - под ШИМом, часть под ЦАПом).
Короче придется полностью переделывать девайс...
Но меня это не пугает, т.к. на фоне фильтрации данных для получения адекватных по значению (без дичайшего шума) ускорений - это сущая мелочь.
Кстати, по способам фильтрации не подскажите чота умное?
0
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
06.01.2013, 03:45 30
Цитата Сообщение от Momstir
...Это при условии что требуемые ноги возможно разместить в рамках одного порта, а это не всегда получается (т.к. часть из них - под ШИМом, часть под ЦАПом).
Короче придется полностью переделывать девайс...
Из 23 пинов??? Я об этом сразу написал. Лучше- если старший или младший полубайт. Можно любых 4 подряд, но это добавит команды на выравнивание. А что, девайс уже в железе?
...Кстати, по способам фильтрации не подскажите чота умное
Сформулируй точнее, людей на форуме много. Какие там шумы? Я просто с АБС не разбирался.
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
06.01.2013, 04:03 31
Цитата Сообщение от STT
А что, девайс уже в железе?
Да. Правда пока нечто вроде пилотной версии... Все уперлось в шум ускорения.
Цитата Сообщение от STT
Сформулируй точнее, людей на форуме много. Какие там шумы? Я просто с АБС не разбирался.
В силу того, что колесо не является идеально круглым и упругим телом при расчете производных второго порядка (ускорений) возникает то, что указано на картинке:

А - ручной (проверочный) расчет в экселе.
Увеличивая время интегрирования скорости - увеличиваем отрезок времени, а значит возникает лаг (задержка), что в подобных системах - непозволительная роскошь (иначе говоря, работать корректно оно не будет).
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
06.01.2013, 14:55 32
Не произойдет ли пропуск события в случае с использованием одного прерывания для всех ног если в момент выполнения оного возникнет еще одно событие, но обработчик еще не будет окончен?
В случае с одно прерывание = одно событие они либо ждут своей очереди, либо прерыванию менее приоритетное - т.е. не теряются.
0
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
06.01.2013, 15:08 33
Обработчик прерывания- не больше 15-20 ассемблерных команд. Если частота 20МГц- прикинь время выполнения и вероятность потери.
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
06.01.2013, 16:55 34
Т.е. вероятность потерь все равно есть, я верно понимаю?
0
SOWushko
0 / 0 / 0
Регистрация: 26.01.2010
Сообщений: 273
06.01.2013, 20:42 35
Отвлекитесь на пару минут, забудьте о прерываниях и прочем. Допустим вы получаете показания с датчиков, каким то неведомым образом, с той точностью, с которой хотите.
Теперь вопрос, какова эта точность? 1мкс? 0.1мкс? 0.01 мкс? Идеальных систем не бывает, каков должен быть квант времени в вашей?
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
06.01.2013, 23:29 36
Вопрос не в абсолютной точности при которой частота колебается около некой средней, а в относительной. В случае с пропуском события период (и частота) будет отличаться примерно в 2 раза - это беда, а то, что даже при равномерном движении в прошлый раз период был = 990 мкс, а в нынешнем 1010 мкс - более чем допустимо.
0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
07.01.2013, 03:01 37
а). период в секундах = разница между моментами (с точностью до ХХХ), в которые события произошли.
б). период в секундах = 3600 / количество событий за час.
в). частота в герцах = 1 / количество событий за секунду.

надеюсь, что библиотеки Ардуино писали не ПТУшники
Независимо от чисто технического понятия "ПТУшность", библиотеки Ардуино целесообразнее было бы оптимизировать ими в сторону защиты от дурака и комфортности применять, чем по быстродействию. А скорость уже постольку поскольку: не тратьте силы - возьмите молоток побольше!
Ну это я так думаю.
0
SOWushko
0 / 0 / 0
Регистрация: 26.01.2010
Сообщений: 273
07.01.2013, 14:36 38
Цитата Сообщение от Momstir
Вопрос не в абсолютной точности при которой частота колебается около некой средней, а в относительной. В случае с пропуском события период (и частота) будет отличаться примерно в 2 раза - это беда, а то, что даже при равномерном движении в прошлый раз период был = 990 мкс, а в нынешнем 1010 мкс - более чем допустимо.
Если использовать разные прерывания, пропусков не будет. Возможна лишь небольшая неточность. Событие есть - флаг будет установлен, и после того как отработает обработчик одного прерывания - запустится обработчик другого. В вашем конкретном случае, если использовать 4 разных источника прерывания - не вижу проблемы получить точность 2-3 мкс при частоте тактирования 20мгц.

Цитата Сообщение от Momstir
В рамках задачи речь идет о прерываниях INT0, INT1, PCINT0, PCINT2.
Если речь идет именно о прерываниях, то пропустить событие здесь сложно. (Так как одно и то же событие происходит не часто).
Если речь идет от линиях PCINT0(PB0) и PCINT2(PB2) с общим вектором (на сколько понимаю, вектор у них общий, PCINT0) - то да, есть вероятность прошляпить прерывание.
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
07.01.2013, 18:50 39
Цитата Сообщение от SOWushko
Если использовать разные прерывания, пропусков не будет. Возможна лишь небольшая неточность. Событие есть - флаг будет установлен, и после того как отработает обработчик одного прерывания - запустится обработчик другого.
Ну значит идеология выделения каждой ноге по прерыванию верна.
Цитата Сообщение от Momstir
Если речь идет именно о прерываниях, то пропустить событие здесь сложно. (Так как одно и то же событие происходит не часто).
Если речь идет от линиях PCINT0(PB0) и PCINT2(PB2) с общим вектором (на сколько понимаю, вектор у них общий, PCINT0) - то да, есть вероятность прошляпить прерывание.
Код
4 0x003 PCINT0 Pin Change Ymtirrupt Request 0
5 0x004 PCINT1 Pin Change Ymtirrupt Request 1
6 0x005 PCINT2 Pin Change Ymtirrupt Request 2
Вектора разные..
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
07.01.2013, 19:10 40
Ваши обработчики должны быть минимальны. В них нужно только установить флаг , что сие прерывание произошло. В Main определить и решить будем или не будем обрабатывать какие-то прерывания или сбросим флаги и подождём. Т.к. Вы не находитесь в какоим либо обработчике, то не пропустите ни одного прерывания.
0
07.01.2013, 19:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2013, 19:10

Atmega328P. Шина I2c
Пытаюсь подключить к контроллеру Atmega328P датчик магнитного поля HMC5883l по шине I2c. Использую...

Atmega328p не работает PORTC???
Доброго всем времени суток! Не могу понять что за трабла такая, для теста подключил два...

Проблема с прерываниями на ATMega328P-PU
Код пишется в Atmel studyo. Плата Arduino UNO c ATMiko328P-PU. Заливаю hex файл через XToodir...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru