Про процедуры в прерывании расскажите)
Описание процедур от внешнего прерывания:
1 Подпрограмма макроса
Reg_Push это сохранение трёх регистров в стек (
R16; R17; и SREG). Это обусловлено именно нюансами АВ и в Си в данном случае думаю она не нужна (но это решать Вам).
2 Pulse_Count – это однобайтная переменная счётчика импульсов (у автора рабочий регистр
R21 объявлен этой переменной). (
Pulse_Count >= 34) – Если значение этой переменной больше или равно 34 (десятичное значение), то переходим по стрелке вниз на подпрограмму
Reg_Pop (пунк 8 ).
Если переменная
Pulse_Count меньше 34, то выполняем следующую процедуру пункт 3.
3 В данном алгоритме это
Pulse_Count++, что означает увеличение на единицу данной переменной.
4 Следующая процедура это (
Pulse_Count = 1). Если переменная равна единице, то это первый импульс, а значит необходимо выполнить подпрограмму под названием
_Res_TSOP_Count.
5 Подпрограмма
_Res_TSOP_Count.
5а Процедура
TSOP_Count -> r17 – Это переменная под названием
TSOP_Count (Счётчик TSOP), у автора рабочий регистр
R20 объявлен этой переменной. Так вот, значение данной переменной копируется в рабочий регистр
R17.
5б Процедура
^TSOP_Count – означает очищение значений данного регистра.
5в Затем выход из подпрограммы на пункт 6.
4 Если переменная
Pulse_Count не равна единице, то переходим на следующую процедуру – пункт 6.
6 Следующая процедура это (
Pulse_Count = 33). Если переменная равна 33, то уходим по стрелке на вершину «Последний замер» (это пунктом 8 ). Если переменная меньше 33, то продолжаем замер (пункт 7).
7 Пункт 5 – замер периодов.
7а Выполняем подпрограмму
_Res_TSOP_Count (пункт 5).
7б Процедура
r17 = 60 – это рабочий регистр
R17 сравнивается с десятичным значением 60. То есть предварительно в
R17 было скопировано значение переменной
TSOP_Count в подпрограмме
_Res_TSOP_Count (пункт 5). Так вот, если регистр
R17 меньше 60, то в переменную
Rec_Probing_Seq записывается в старший бит 1, а если регистр
R17 равен 60 или больше, то в переменную
Rec_Probing_Seq записывается в старший бит 0. Это происходит в пункте 7в.
7в Процедура
>Rec_Probing_Seq>> - это логический сдвиг вправо переменной с переносом. Переменная
Rec_Probing_Seq является четырёхбайтная, и расположил автор её в рабочих регистрах
R26; R27; R28; R29. Затем переход на пункт 11.
8 «Последний замер»
8а Выполнить подпрограмму
_Res_TSOP_Count (пункта 5).
8б Процедура
r17 = 60 – уже описана выше.
8в Процедура
>Rec_Probing_Seq>> - уже описана выше.
8г Процедура (
Stud -= 1) – данная процедура нужна лишь когда необходимо читать иную последовательность сигнала с пульта и сохранять её в EEPROM. Но так как Вам это не нужно, то эту и две следующие процедуры можно исключить. Таким образом, переходим к процедуре пункта 9
8д 8е9 Процедура
(Rec_Probing_Seq = EE_Probing_Seq)_Add_Status - эта процедура сравнивает принятые импульсы переменной
Rec_Probing_Seq с ранее записанными импульсами в переменной
EE_Probing_Seq, которая находится в памяти EEPROM. И если принятый код совпадает с кодом из EEPROM, то выполняется подпрограмма под названием
_Add_Status (пункт 10). Если коды не совпадают, то выполняется пункт 11.
10 Подпрограмма
_Add_Status.
10а Процедура
(Status < 3)Status + 2 – если переменная под названием Status меньше десятичного значения 3, то к значению данной переменной прибавляется десятичное значение 2. У автора рабочий регистр R30 объявлен этой переменной.
10б Процедура
(Status -= 2) - если переменная не равна двум, то уходим по стрелке на пункт 10д. Если переменная равна двум, то выполняется пункт 10в.
10в Процедура
(PinB2 = 0)1 -> PinB.0 - если бит входного регистра вывода РВ2 равен нулю, то в регистр PinB.0 (вывода РВ0) записывается значение 1. Не все контроллеры позволяют проделывать такую манипуляцию с входным регистром… но у этого МК это позволяет управлять выходом в триггером режиме. Потому как раз вывод РВ0 назван «Триггер». Если на выходе вывода РВ2 уже имеется единица, то просто переходим к пункту 10с, без манипуляций с выводом РВ0.
10с Процедура 1 -> PortB2 - записывается единица в бит порта РВ2, для получения данного логического сигнала на этом выводе. Далее выполняется пункт 10д.
10д Процедура ret – выход из подпрограммы.
11 Подпрограмма макроса
Reg_Pop. Макрос подпрограммы
Reg_Pop – как Вы наверняка догадались, возврат ранее сохранённых регистров из стека (
R16; R17; и SREG).
12 И далее выход из прерывания (
reti) с разрешением глобальных прерываний (I = 1).
Если возникнут вопросы – задавайте. Попробую ответить, если это в моей компетенции. Кстати в АВ есть справка в формате PDF на русском языке... всё подробно там описано...