Просмотр полной версии : AVR Atmega, прерывания, GIFR
Шалом всем.
AVR-щики, подскажите в atmeg328 вообще нет регистра GIFR ? В остальных мегах после получения и обработки внешних прерываний INT0/INT1 Всегда сбрасываю принудительно GIFR биты 6 и 7 , что бы при запрещенных прерываниях после EI не получить ложное прерывание, так как регистр прерываний при DI и поступлении прерывания хранит его и прыгает в прерывание после EI, что бы этого не было мы и сбрасываем GIFR.
Но в atmega328 GIFR нет , или я что то упустил ? Видимо уже это решили аппаратно ?
omercury
28.06.2017, 00:04
AVR-щики, подскажите в atmeg328 вообще нет регистра GIFR ?
Нету.
И адрес не используется, чтоб не было путаницы, теперь используются другие регистры.
что бы при запрещенных прерываниях после EI не получить ложное прерывание
То есть принудительно пропускаете событие? О_о
Может ещё и обрабатываете прямо в ISR ? :-)
теперь используются другие регистры.
Подробнее ?
То есть принудительно пропускаете событие? О_о
Каким образом пропускаю ? При EI прерывания обрабатываются стандартно, что мне и надо, но если мы не сбросим GIFR то при DI регистр прерываний при поступлении прерывания его не проигнорирует, а запишет в регистр, и при наступлении EI тут же начнет его обрабатывать, что мне не нужно. В этом и суть 6 и 7 бита GIFR.
Как без GIFR организовывается запоминание прерывания при DI и исполнение его тут же при EI в atmega328 ?
- - - Добавлено - - -
Может ещё и обрабатываете прямо в ISR ?
Нет, пока в обработчик не лезем, разбираем вышеописанную ситуацию.
omercury
28.06.2017, 01:58
Подробнее ?
Для М328 это EIFR
http://www.atmel.com/ru/ru/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf
Каким образом пропускаю ?
Сбросом флага.
Флаг аппаратно сбрасывается при установке PC на вектор прерывания (при наступлении события прерывания) и ручного сброса не требует (в случае ядра АВР, разумеется).
Если уж так сильно боитесь циклических прерываний, то перед выходом неплохо сделать поллинг флага и, если событие прерывания таки произошло, то что-либо с этим предпринять (как минимум зафиксировать этот факт хотя бы как ошибку), а уж потом сбрасывать флаг и делать RETI.
Нет, пока в обработчик не лезем
А что там обсуждать?
В обработчике установка программного флага события и выход.
В особо тяжёлых случаях ещё и инкремент счётчика событий.
Всё...
Для М328 это EIFR
Alternatively, the flag can be cleared by writing '1' to it.
Это я и искал, спасибо.
omercury
28.06.2017, 02:14
Это я и искал, спасибо.
Так-то бы оно, конечно же и, да, но как таким образом определить количество случившихся за время обработки событий? :)
Так-то бы оно, конечно же и, да, но как таким образом определить количество случившихся за время обработки событий?
В моем случае такая задача не стоит.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot