Имеется некоторое устройство на ATtiny2313. Для обработки данных, получаемых с двух линий порта B (PB0 и PB1), используется прерывание PCINT (Pin-Change Interruption). Происходящие на этих линиях события взаимонезависимы и поэтому возможна ситуация, когда во время обработки прерывания, например, от PB0 произойдет изменение на PB1. Это событие также должно быть обработано и никоим образом не потеряно. Время обработки прерывания от каждой из линий значительно меньше минимального интервала между событиями на этой линии, но события на другой могут попадать во временной интервал обработки прерывания от первой. Вполне допустимо как отложить обработку прерывания от второй до завершения обработки от первой, так и прервать обработку от первой для обработки от второй и потом продолжить обработку от первой, но в конечном счете оба прерывания должны быть обработаны.
Для того, чтобы решить эту задачу, мне не совсем понятно, как можно распорядиться с флагами I в регистре SREG и PCIF в регистре EIFR.
В момент изменения состояния одной из линий взводятся оба флага и происходит обработка прерывания по вектору PCINT по возврату из которой оба флага сбрасываются. Если в это время происходит событие на другой линии, то, по идее, оно будет проигнорировано, поскольку флаг PCIF у них общий.
1. Если в пп обработки прерывания сбросить флаг PCIF, то второй линией он будет снова взведен, но будет сброшен по возврату и отсроченной обработки прерывания не произойдет. Верно ли я понимаю? Можно ли все же реализовать ОТСРОЧЕННУЮ обработку прерывания, возникшего во время прерывания?
2. Если же сбросить оба флага, то, как я понимаю, второе прерывание прервет первое, будет отработано и снова вернется в первое. Вроде-бы так. Но нет ли здесь какого-либо подвоха?
Если можно, проясните ситуацию с этим Pin-Change.
|