[an error occurred while processing this directive]
|
Допустим у вас в фоне в main() есть строка :
PORTC |= 0xE0;
(в качестве переменной используем PORTC в примере).
Эта строка компилятором преобразуется в 3 команды :
IN R16,0x15
ORI R16,0xE0
OUT 0x15,R16
Допустим, у вас в PORTC записан 0.
IN R16, 0x15 ; в R16 у Вас 0
ORI R16,0xE0 ; в R16 у Вас 0xE0
OUT 0x15,R16 ; в PORTC записываем 0xE0
А теперь предположим, что у Вас есть прерывание, которое устанавливает младший бит PORTC в 1. Пускай это прерывание возникает после первой строки (после IN R16, 0x15 ).
IN R16, 0x15 ; в R16 у Вас 0
; здесь вызывается прерывание, которое записывает 1 в PORTC
; т. е. сейчас в PORTC реально 0x01 находится и если мы сейчас
; сделаем IN R16, 0x15, то в R16 будет 1
; возвращаемся из прерывания и продолжаем
ORI R16,0xE0 ; в R16 у Вас 0xE0, а в PORTC 1
OUT 0x15,R16 ; в PORTC записываем 0xE0
И так, результат установления 1 на PORTC в прерывании пропал, потому что мы записываем в PORTC значение из R16.
Теперь понятно ?
E-mail: info@telesys.ru