На ATmega другие прерывания блокируются во время выполнения любого вектора прерывания.
Это полезная функция по разным причинам. Это предотвращает прерывание прерывания самого себя, предотвращает потенциальное переполнение стека из-за рекурсии и позволяет выделить специальные регистры специально для использования в прерываниях с малой задержкой без необходимости их предварительного сохранения, а также гарантирует, что обработчик является атомарным, среди других причин .
Однако иногда полезно явно использовать повторяющиеся прерывания, особенно на ATmega, в которой отсутствуют уровни приоритета прерываний. Для этого просто добавьте инструкцию SEI, чтобы установить флаг разрешения прерывания.
Вы должны быть очень осторожны, чтобы избежать проблем, упомянутых выше, делая это. Как правило, это означает, что любые используемые регистры должны быть сохранены в стеке, и что само прерывание необходимо отключить до запуска реентерабельной части.
Что касается вашей проблемы с перекрытием адресов, я подозреваю, что проблема в том, что ваш ассемблер подсчитывает свои программные адреса в байтах, тогда как адреса векторов прерываний в таблице данных указываются в словах (например, прерывание сравнения таймера 2 вместо этого будет 0x24 0x12). Вам также необходимо позаботиться о том, чтобы вернуться к основному сегменту кода после завершения определения векторов, иначе любой последующий код просто перейдет к другим векторам.