Только время появилось сесть.
Специальный режим, о котором я писал выше, больше не нужен. Я решил проблемы одновременного вызова двух функций.
На время выполнения функции в основном потоке я устанавливаю переменную intTrigger в единицу.
Код:
void updatePorts() {
intTrigger = 1;
...
intTrigger = 0;
}
Таким образом в прерывании я знаю, что она выполняется. И если выполняется, то выталкиваю из стека адрес возврата. И возврат из прерывания происходит в функцию, которая вызвала updatePorts().
Код:
OR _intTrigger, _intTrigger
BRNE _v3
OUT SREG, R8
RETI
...
_v3: POP R28
POP R28
MOV _intTrigger, R9 ; =0
OUT SREG, R8
RETI
---------- Post added at 20:23 ---------- Previous post was at 20:21 ----------
Хотя глючок я все равно поймал. Если целый час нажимать случайные клавиши 10 раз в секунду, то через час случайно нажимается случайная кнопка.
Я подозреваю, что резисторов на 9 ком недостаточно. Ставьте 4,7 ком.