Далее подпрограмма обработки прерывания еще сохраняет рабочие регистры (в АТтини2313 это r16 r17), которые будт в ней использоваться. Использовать их будет АЛУ при вычислениях.
Как говорил выше каждому прерыванию присвоен свой адрес начала подпрограммы обработки прерываний, которые идут последовательно один за другим после нулевого. Так вот по этим адресам также как и на нулевом адресе, стоят команды безусловного перехода на другой адрес. А по адресам неиспользуемых прерываний стоят команды reti (это выход из подпрограммы прерываний. Есть команда ret это выход из подпрограммы).
Далее напишу на ассемблере начало программной памяти... Условно и не с точным количеством команд:
00 команда безусловного перехода на адрес 05 (пример)// Reset
01 reti //например прерывание от переполнения таймера Т0, сразу же команда выхода из ПП обработки прерывания
02 reti //например прерывание от переполнения таймера Т1
03 команда безусловного перехода на адрес 153 (пример) //например прерывание от внешнего источника
04 reti //выход из какойто подпрограммы обработки прерывания
05 начало выполнения нашей программы всякие там функции setup, main....
06 .....
примерно так, извините, если не понятно, в яндексе лучше расписано.
Только с адреса 05 (в нашем примере) начинается выполнение нашей программы. И первое что необходимо в любой программе это назначить адрес (желательно в конце) оперативной памяти, по которому будет сохраняться стековая память - адрес начала стековой памяти (регистр SP - указатель стека, в него записать адрес последней!!! ячейки ОЗУ). Это делается потому что до начала основного цикла (Main), могут возникнуть прерывания и АЛУ текущий адрес PC сохранит например по адресу 00 в ОЗУ. А подпрограмма обработки в этот адрес может что то "свое" записать и по выполнении команды reti в РС вернется не тот адрес на котором остановилась основная программа, а какойнить другой (результат каких то вычислений в подпрограмме)... Далее идут команды настройки периферии (таймеров, счетчиков,
ПОРТОВ ввода-вывода) в IDE это функция Setup.
В Ардуино ИДЕ все эти переадресации векторов прерываний делаются автоматически при компиляции, потому что это уже углубленные знания работы контроллера и начинающим пользователям об этом думать незачем, но они есть по любому. И на каком бы языке вы не писали программу, все равно она копилируется в машинный код. А машине по любому надо указать по каким адресам находятся подпрограммы обработки прерываний...
Так вот к чему все это?
Цитата RedSky
В секции setup ещё до pinMode (можно в самом начале)
Секция Setup это не начало. Начало это нулевой адрес программы. К которому доступа через Arduino IDE нет. Точнее нужно использовать ассемблерские команды.
А срабатывание реле это
инициализация ВСЕХ пинов контроллера, которые
ЕЩЕ ДО начала (имею ввиду нулевой адрес программы) выполнения программы устанавливаются в ноль на несколько тактов задающего генератора.
И щелканье реле с нулевым активным сигналом, по любому будет, что бы вы в Setup-е не написали.
Если кто не понял пишите, попробую просто нарисовать кусок реальной программы на ассемблере простенького контроллера, так будет понятней.