ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
29 июня
230049
mazur (21.12.2010 22:02, просмотров: 2808)
Вынужден признаться, что что-то все же "ни асилил". Поступил заказ. Сделать в автомобиль одно устройство. Логика работы такова: при превышении определенного порога напряжения (задействован аналоговый компаратор) устройство готово к работе. Включаем зажигание, на 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 И я понял, что эта проблема у меня вылезет и в последующих программах.
Математика описывает конечный автомат как "пятерку состояний": Входы + Выходы + состояния + Фунции переходов + Функции выходов
Хотелось бы, чтобы подсказали, как работать с составляющей конечных автоматов "входы".