Нет, проблема не в прерывании, тут все хитрее оказалось. Даже не ждал что удастся найти ответ так быстро.
При компиляции с ключем -O0 ассемблерный листинг выглядит вот так:
Код: Выделить всё
PORTD &= ~(1<<PD5)
9c: 82 e3 ldi r24, 0x32 ; 50
9e: 90 e0 ldi r25, 0x00 ; 0
a0: 22 e3 ldi r18, 0x32 ; 50
a2: 30 e0 ldi r19, 0x00 ; 0
a4: f9 01 movw r30, r18
a6: 20 81 ld r18, Z
a8: 2f 7d andi r18, 0xDF ; 223
aa: fc 01 movw r30, r24
ac: 20 83 st Z, r18
Тут даже команд out или cbi я не наблюдаю... и как оно работает?
Если пересобрать тот же код с ключем -Os, то все становиться гораздо интререснее:
Код: Выделить всё
PORTD &= ~(1<<PD5)
94: 95 98 cbi 0x12, 5 ; 18
Ну и работает соответственно без проблем.