Да так и есть, ты просто не понял о чём идёт речь.
Да так и есть, ты просто не понял о чём идёт речь.
Что это такое "конечный автомат"? Я не понял о чём речь.Demiurg писал(а):возможно ли в нем реализовать конечный автомат. И как.
Код: Выделить всё
.cseg
//==================
.macro Proc_FSM
ldz @0*2
rjmp _Proc_FSM
.endmacro
_Proc_FSM:
lpm XH, Z+ ; Считывание старшего байта адреса параметров автомата.
lpm XL, Z+ ; Считывание младшего байта адреса параметров автомата.
ld r16, X ; Считывание состояния автомата. Индекс таблицы.
lpm r17, Z+ ; Считывание количества состояний автомата.
cp r16, r17
brsh Process_Errors_FSM
lpm XH, Z+ ; Начало таблицы адресов.
lpm XL, Z ; Начало таблицы адресов.
movw ZH:ZL, XH:XL
add ZL, r16 ; Смещение по индексу-состоянию автомата.
adc ZH, RCLR
shiftlwz
lpm r17, Z+ ; Считывание адреса по индексу.
lpm r16, Z
movw ZH:ZL, r17:r16
ijmp
Process_Errors_FSM:
cli
adiw ZL, 2
lpm r16, Z
rjmp Proc_Errors
//==================
//==================
Set_FSM_State:
st Y, FSM_STATE
ret
//==================
//==================
//Proc_FSM_Exit:
// st Y, FSM_FLAGS
// std Y+1, FSM_STATE
// ret
//==================
//==================
Proc_Heater_Save_Val:
std Y+DISP_PROC_HEAT, FSM_STATE
std Y+DISP_PROC_HEAT_FLAGS, FSM_FLAGS
ret
//==================
//==================
Proc_Heater:
pushiwl Proc_Heater_Save_Val ; Смещение стека на Proc_Heater_Save_Val, после выхода из подпрограммы будет выход из конечного автомата.
ldy _PROC_HEAT
ldd FSM_STATE, Y+DISP_PROC_HEAT
ldd FSM_FLAGS, Y+DISP_PROC_HEAT_FLAGS
Proc_FSM_Heater:
Proc_FSM Table_FSM_Proc_Heat
//------------------------------------------------------------------------
Proc_Heat_Init_1: // Инициализация портов ввода-вывода.
cbi RED_LED_PORT, RED_LED
sbi RED_LED_DDR, RED_LED
cbi GREEN_LED_PORT, GREEN_LED
sbi GREEN_LED_DDR, GREEN_LED
cbi PLUG_PORT, PLUG
sbi PLUG_DDR, PLUG
Set_Timer Par_Timer_Proc_Heat_Init
Set_State _PROC_HEAT_INIT_2
ret
//==================
Table_FSM_Proc_Heat:
.db tab_h(_PROC_HEAT), MAX_PROC_HEAT_STATES,tab_h(Table_Jmp_Proc_Heat), ERR_ID_PROC_HEAT
Table_Jmp_Proc_Heat:
.equ MAX_PROC_HEAT_STATES = 18
.equ _PROC_HEAT_INIT_1 = 0
.db tab_h(Proc_Heat_Init_1)
.equ _PROC_HEAT_INIT_2 = 1
.db tab_h(Proc_Heat_Init_2)
.equ _PROC_HEAT_WAIT_ON = 2
.db tab_h(Empty_Action)
.equ _PROC_HEAT_BLOW_1 = 3
.db tab_h(Proc_Heat_Blow_1)
.equ _PROC_HEAT_SET_WAIT_FIRE_SENS = 4
.db tab_h(Proc_Heat_Set_Wait_Fire_Sens)
.equ _PROC_HEAT_WAIT_FIRE_SENS = 5
.db tab_h(Proc_Heat_Wait_Fire_Sens)
.equ _PROC_HEAT_WAIT_FIRE_SENS_DONE = 6
.db tab_h(Empty_Action)
.equ _PROC_HEAT_WORK = 7
.db tab_h(Empty_Action)
.equ _PROC_HEAT_BLOW_2 = 8
.db tab_h(Proc_Heat_Blow_2)
.equ _PROC_HEAT_WAIT_FIRE_SENS_COLD = 9
.db tab_h(Proc_Heat_Wait_Fire_Sens_Cold)
.equ _PROC_HEAT_WAIT_FAN_OFF = 10
.db tab_h(Proc_Heat_Wait_Fan_Off)
.equ _PROC_EMERG_LOW_VOLT_SENS_1 = 11
.db tab_h(Empty_Action)
.equ _PROC_EMERG_FIRE_SENS_1 = 12
.db tab_h(Empty_Action)
.equ _PROC_EMERG_OVERHEAT_SENS_1 = 13
.db tab_h(Empty_Action)
.equ _PROC_EMERG_FIRE_LOW_VOLT_SENS_1 = 14
.db tab_h(Empty_Action)
.equ _PROC_EMERG_OVERHEAT_LOW_VOLT_SENS_1 = 15
.db tab_h(Empty_Action)
.equ _PROC_EMERG_OVERHEAT_FIRE_SENS_1 = 16
.db tab_h(Empty_Action)
.equ _PROC_EMERG_OVERHEAT_FIRE_LOW_VOLT_SENS_1 = 17
.db tab_h(Empty_Action)
//==================
Код: Выделить всё
.macro Read_State
lds r16,@0
.endmacro
.macro Case
cpi r16,@0
brlo Case_Exit // Макрос именно такой, потому что диапазон breq +- 64 байта.
rjmp @1
Case_Exit:
.endmacro
Read_State
case 0, FUNC_1
case 1, FUNC_2
FUNC_1:
ret
FUNC_2:
ret
Написано, что чувствительность составляет приблизительно 1 LSB / °C...The measured voltage has a linear relationship to the temperature as described in Table 17-2 The sensitivity is approximately 1 LSB / °C and the accuracy depends on the method of user calibration. Typically, the measurement accuracy after a single temperature calibration is ±10°C, assuming calibration at room temperature. Better accuracies are achieved by using two temperature points for calibration.