Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PCINT для ATtiny2313.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
kv_addr
Имеется некоторое устройство на ATtiny2313. Для обработки данных, получаемых с двух линий порта B (PB0 и PB1), используется прерывание PCINT (Pin-Change Interruption). Происходящие на этих линиях события взаимонезависимы и поэтому возможна ситуация, когда во время обработки прерывания, например, от PB0 произойдет изменение на PB1. Это событие также должно быть обработано и никоим образом не потеряно. Время обработки прерывания от каждой из линий значительно меньше минимального интервала между событиями на этой линии, но события на другой могут попадать во временной интервал обработки прерывания от первой. Вполне допустимо как отложить обработку прерывания от второй до завершения обработки от первой, так и прервать обработку от первой для обработки от второй и потом продолжить обработку от первой, но в конечном счете оба прерывания должны быть обработаны.

Для того, чтобы решить эту задачу, мне не совсем понятно, как можно распорядиться с флагами I в регистре SREG и PCIF в регистре EIFR.

В момент изменения состояния одной из линий взводятся оба флага и происходит обработка прерывания по вектору PCINT по возврату из которой оба флага сбрасываются. Если в это время происходит событие на другой линии, то, по идее, оно будет проигнорировано, поскольку флаг PCIF у них общий.

1. Если в пп обработки прерывания сбросить флаг PCIF, то второй линией он будет снова взведен, но будет сброшен по возврату и отсроченной обработки прерывания не произойдет. Верно ли я понимаю? Можно ли все же реализовать ОТСРОЧЕННУЮ обработку прерывания, возникшего во время прерывания?

2. Если же сбросить оба флага, то, как я понимаю, второе прерывание прервет первое, будет отработано и снова вернется в первое. Вроде-бы так. Но нет ли здесь какого-либо подвоха?

Если можно, проясните ситуацию с этим Pin-Change.
solidreg
Есть 2 флага для каждого прерывания (cм. GIFR register). После возращении из первого прерывании (RETI команда), SREG "I" флаг будет "1" опять. Если теперь будет флаг2 = "1" (было прерывание от 2-ого источника), всё сработает, ничего не будет потеренно.
kv_addr
Да, конечно, в регистре EIFR (GIFR - это для AT90S2313) имееся такой флаг для PCINT, PCIF называется. Но поскольку изменение состояния на любой определенной в регистре PCMSK линии порта B будет вызывать ОДНО И ТО ЖЕ прерывание, флаг для котрого - PCIF будет сначала взведен, а по RETI будет сброшен, то не совсем понятно, что произойдет, когда во время обработки прерывания от одной линии появится прерывание от другой. По идее, PCIF уже будет взведен, взвести его ЕЩЕ раз не получится (Для INT0 и INT1 понятно, тут прерывания и флаги РАЗНЫЕ) и по RETI он будет сброшен,прерывания по другой линии не произойдет.

Кроме того, мне не понятно, что получится, если же в пп обработки прерывания принудительно сбросить флаг PCIF. По появлению второго прерывания он снова будет взведен (как я понимаю), но взведенный I в SREG не позволит немедленно обработать это прерывание, а по RETI I будет сброшен, но также сбросится (?) вновь взведенный PCIF и второе прерывание обслужено не будет. Или же PCIF не сбросится и произойдет отложенное прерывание? Но для того, чтобы отличить был ли PCIF взведен повторно или нет, необходим некий буфер, которого, как я понимаю, не существует в контроллере. Или же существует, но я не подозреваю о его существовании?

Во, какой вопрос!
solidreg
Цитата(kv_addr @ Jan 15 2006, 06:12) *
флаг для которого - PCIF будет сначала взведен, а по RETI будет сброшен, то не совсем понятно


Нет. PCIF будет сброшен не по RETI, о тогда, когда PC прыгает в функцию прерывании. А потом, если что-то произайдёт когда вы будете обрабатывать первое прерывание - PCIF будет взведен на "1" опять. RETI не сброшет его, а только востановит "I" в SREG, и тогда будет другое прерывание.

НО, если в тот же момент возникнит изменение на обеих ногах (+/- 1uSec.), вы получите ТОЛЬКО 1 прерывание!!!

Здесь нет ни какого буфера.
kv_addr
Ага, вот ключевой момент! Если PCIF сбрасывается именно тогда, когда начинается обработка прерывания (на что, ясного и внятного указания в атмеловской документации я, к сожалению, не нашел), то все становится по своим местам. Меня беспокоило то, что если при обработке одного прерывания произойдет второе, то оно может быть утеряно. А ситуация с ОДНОВРЕМЕННЫМ прерываним по двум линиям решается, потому как в п/п обработки прерывания идет "разбор полетов", т.е. на какой линии (линиях) состояние изменилось и ни одно изменение не будет пропущено.

TNX за разъяснение.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.