Есть много задержек перед выполнением кода ISR.
Во-первых, аппаратные задержки. Они задокументированы в таблицах данных и включают время, чтобы заметить и зафиксировать, что входные данные изменились, завершить текущую инструкцию, поместить указатель инструкции в стек и выполнить переход к ISR.
![enter image description here](https://i.stack.imgur.com/IKDNk.png)
Далее идут задержки программного обеспечения. Сначала происходит переход от вектора прерывания к адресу IST, затем компилятор помещает серию инструкций в начало ISR, чтобы убедиться, что все регистры сохранены и также имеют правильные ожидаемые значения. Это называется «преамбулой».
https://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
Вы не можете ничего сделать с аппаратной задержкой, но вы можете значительно уменьшить программную задержку - особенно для очень простого ISR, подобного вашему. Один из способов - создать «голый» ISR, который будет сохранять только те регистры, которые вы меняете. Для приведенного выше кода вы, вероятно, могли бы получить только изменение одного регистра.
Я думаю, что также возможно выполнить функцию ISR без использования каких-либо регистров данных, используя хитрость записи в регистр PIN, чтобы немного перевернуть.
![enter image description here](https://i.stack.imgur.com/tdciy.png)
Вы сможете найти более подробную информацию обо всем этом, прибегая к помощи Google, или сообщите здесь, если вам нужно какое-то конкретное руководство по любому из этих пунктов!
Альтернативный подход - использовать встроенный аппаратный инвертированный выход
Timer1 на этом чипе имеет встроенный инвертирующий выход, который будет автоматически выводить инвертированный сигнал, который вы ищете, и между инвертированным и неинвертированным выходами будет намного меньше, чем задержка в 1 цикл (при условии, что вы этого не сделаете) намеренно добавить dead time
между переходами).
![enter image description here](https://i.stack.imgur.com/h7RMt.png)
Это потребует программирования регистров таймера для включения инвертированного выхода, а инвертированные выходы доступны только на определенных выводах, но обычно это не проблема.