Чт ноя 24, 2022 19:40:12
Чт ноя 24, 2022 20:18:13
Чт ноя 24, 2022 22:19:25
Пт ноя 25, 2022 06:45:04
Пт ноя 25, 2022 08:36:14
.macro LMP
LPM
.endmacro
Пт ноя 25, 2022 10:53:22
Пт ноя 25, 2022 14:15:12
Пт ноя 25, 2022 14:45:55
Пт ноя 25, 2022 14:54:10
Пт ноя 25, 2022 15:04:27
Пт ноя 25, 2022 15:06:11
Пт ноя 25, 2022 17:35:53
Пт ноя 25, 2022 17:51:42
wait_timer:
rjmp wait_timer ; ожидаем прерывания таймера
Пт ноя 25, 2022 18:27:39
Пт ноя 25, 2022 19:45:59
Пт ноя 25, 2022 22:58:08
Сб ноя 26, 2022 08:51:09
Сб ноя 26, 2022 08:57:05
Сб ноя 26, 2022 10:40:22
Сб ноя 26, 2022 10:52:02
;---------- Таблица переходов
STATES:
.dw STATE_0, STATE_1, STATE_2
STATE_0:
ldi temp0, 0x01 ;Переключаем на следующее состояние
ret
STATE_1:
ldi temp0, 0x02 ;Переключаем на следующее состояние
ret
STATE_2:
ldi temp0, 0x00 ;Переключаем на начальное состояние
ret
; Много телодвижений связано с тем, что в конкретном МК LPM и IJMP или ICALL работают только с парой Z
; Сначала грузим номер текущего состояния из ОЗУ в регистры temp0 и temp1
; За тем выполняем код ниже:
ldi ZL, Low(STATES*2) ; Грузим начальный адрес массива указателей на процедуры
ldi ZH, High(STATES*2)
lsl temp0 ; В регистрах temp0 и temp1 хранится номер текущего состояния. temp0 - младший байт
clr temp1 ; , temp1 - старший. Но тут он не используется, так как состояний не так много было
add ZL, temp0 ;Смещаемся по массиву для выбора нужного указателя
adc ZH, temp1
lpm temp2, Z ; Грузим младший байт адреса
adiw Z, 0x01 ; Смещаемся к старшему байту адрса
lpm temp3, Z ; Грузим старший байт адреса
mov ZL, temp2 ; Заносим байты алреса процедуры в Z
mov ZH, temp3
icall ; Вызываем процедуру
; Тут можем сохранить номер состояния в ОЗУ
Смысл в дополнительной таблице векторов? Лишний расход ПЗУ?