Вынужден признаться, что что-то все же "ни асилил". Поступил заказ. Сделать в автомобиль одно устройство. Логика работы такова: при превышении определенного порога напряжения (задействован аналоговый компаратор) устройство готово к работе. Включаем зажигание, на 1 секунду включается бензонасос, затем на 1 секунду включаются форсунки (бензонасос остается включенный), потом все отключается. Если после первого включения стартера зажигание не было отключено, и опять стартер включили, устройство не включает бензонасос и форсунки. Для того, чтобы не залить свечи, контролируется количество включений зажигания. Возьмем 5 раз. Я навскидку прикинул, вроде фигня делов. Стал писать прогу, и въехал в пень на одном моменте.
В общем, поднятые время от времени мною темы всем завсегдатаям форума известны. До недавнего времени я не знал даже что такое автоматное программирование. Написал несколько программ, казалось бы что-то понял. Ан нет.
Итак, в чем сейчас моя проблема:
Если в каждом состоянии проверять входы и условия, то как бы проблем нет. Но, это ведет к раздутия кода. Хотелось бы сделать это в одной функции. Перед основным автоматом-циклом работы устройства.
Что я пока накидал:
Main:
; rcall PROCESS_INPUTS ; Предполагаемая подпрограмма обработки входов
rcall ADD_FUEL
rjmp Main
ADD_FUEL:
READ_STATE ADD_FUEL_STATE,ADD_FUEL_STATES_SIZE
brlo ADD_FUEL_0
rjmp HANDLER_ERRORS
ADD_FUEL_0:
CASE ADD_FUEL_CHECK_IGN_ON_STATE,ADD_FUEL_CHECK_IGN_ON
CASE ADD_FUEL_FUEL_PUMP_ON_STATE,ADD_FUEL_FUEL_PUMP_ON
CASE ADD_FUEL_INJECTORS_ON_STATE,ADD_FUEL_INJECTORS_ON
CASE ADD_FUEL_INJECTORS_OFF_STATE,ADD_FUEL_INJECTORS_OFF
ret
ADD_FUEL_CHECK_IGN_ON:
sbis ACSR,ACO
ret
lds r16,IGN_ON_CNT
cpi r16,3
brsh ADD_FUEL_CHECK_IGN_ON_END
sbic PINB,IGN_PIN
ret
inc r16
sts IGN_ON_CNT,r16
sbi DDRB,FUEL_PUMP
SET_TIMER ST_ADD_FUEL,10
SET_STATE ADD_FUEL_STATE,ADD_FUEL_FUEL_PUMP_ON_STATE
ADD_FUEL_CHECK_IGN_ON_END:
ret
ADD_FUEL_FUEL_PUMP_ON:
CHECK_TIME_OUT ST_ADD_FUEL
sbrc FLAGS,TIME_OUT_FLG
ret
sbi DDRB,INJECTORS
SET_TIMER ST_ADD_FUEL,10
SET_STATE ADD_FUEL_STATE,ADD_FUEL_INJECTORS_ON_STATE
ret
ADD_FUEL_INJECTORS_ON:
CHECK_TIME_OUT ST_ADD_FUEL
sbrc FLAGS,TIME_OUT_FLG
ret
in r16,DDRB
andi r16,0b11110011
out DDRB,r16
SET_STATE ADD_FUEL_STATE,ADD_FUEL_INJECTORS_OFF_STATE
ret
ADD_FUEL_INJECTORS_OFF:
SET_STATE ADD_FUEL_STATE,ADD_FUEL_INJECTORS_ON_STATE
ret
HANDLER_ERRORS:
cli
out DDRB,RCLR
out DDRD,RCLR
out PORTB,RCLR
out PORTD,RCLR
HANDLER_ERRORS_END:
rjmp HANDLER_ERRORS_END
И я понял, что эта проблема у меня вылезет и в последующих программах.
Математика описывает конечный автомат
как "пятерку состояний":
Входы + Выходы + состояния + Фунции переходов + Функции выходов
Хотелось бы, чтобы подсказали, как работать с составляющей конечных автоматов "входы".