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

 
 
> PCINT для ATtiny2313., Ломаю голову.
kv_addr
сообщение Jan 14 2006, 14:13
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



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

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

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

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

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

Если можно, проясните ситуацию с этим Pin-Change.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kv_addr
сообщение Jan 15 2006, 02:12
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



Да, конечно, в регистре EIFR (GIFR - это для AT90S2313) имееся такой флаг для PCINT, PCIF называется. Но поскольку изменение состояния на любой определенной в регистре PCMSK линии порта B будет вызывать ОДНО И ТО ЖЕ прерывание, флаг для котрого - PCIF будет сначала взведен, а по RETI будет сброшен, то не совсем понятно, что произойдет, когда во время обработки прерывания от одной линии появится прерывание от другой. По идее, PCIF уже будет взведен, взвести его ЕЩЕ раз не получится (Для INT0 и INT1 понятно, тут прерывания и флаги РАЗНЫЕ) и по RETI он будет сброшен,прерывания по другой линии не произойдет.

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

Во, какой вопрос!
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:31
Рейтинг@Mail.ru


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