На данный момент существует самодельное устройство автозавода автомобиля по таймеру, управляющий контроллер ATMEGA8. Задумал добавить кнопку, что бы можно было заводить с кнопки.
Получается так: сел в машину, нажал кнопку, и авто завелось, при этом автомобиль мог до этого стоять на «программе прогрева», соответственно «программа прогрева» должна быть прекращена.
Появились небольшие вопросы при реализации задуманного в программе.
Программа написана на асме, весь текст приводить не буду , напишу «обычным языком» и коротко без деталей и ньансов.
Вопрос:
Слишком ли будет грубо переходит из прерывания в основную программу, установив указатель стека в начало и установив флаг гл. прерывания («sei») так как он при вызове прерывания сбрасывается?
Решил сделать так, потому что команды от кнопок будут обрабатываться мгновенно не дожидаясь выполнения подпрограмм(паузы и т.д.)
Существует ли альтернатива этому механизму ?
Вот алгоритм программы
______________________________
Иницируем таймер опроса кнопок
Разрешаем прерывания по IRQ1 для тахометра (считать импульсы, решать завелась или незавелась)
Стек в начало;
Основной цикл:
Проверка статуса кнопок:
Мигаем диодом, авто ждет команды
Rjmp Проверка статуса кнопок
// в основном цикле я разместил оба процесса, прогрев и заводим с кнопки
Прогрев:
Стек в начало;
«Ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16»
установим флаг гл.прерывания «sei»
Пауза 1 час
Rcall ЗавестиМашину
Пауза 5 минут
глушим
Rjmp Прогрев
ЗаводимСКнопки:
Стек в начало; установим флаг гл.прерывания;
//Проверка заведена ли машина
Если машина заведена то
rjmp Проверка статуса кнопок
Иначе rcall ЗавестиМашину
rjmp Проверка статуса кнопок
Rjmp ЗаводимСКнопки
Rjmp Основной цикл
ЗавестиМашину:
Запрещаем прерывание таймера опроса кнопок
Заводим включая зажигание и включая стартер по определенному алгоритму
Разрешаем прерывание таймера опроса кнопок
Ret
Прерывание таймера опроса кнопок:
// если нажали кнопку завести то сразу переходим на программу завести с кнопки
// тем самым команда ret не будет никогда выполнена
// мы заменим её в основной программе возвратом указателя стека и установкой флага
// глобального прерывания?!
Если нажата кнопку 1 (завести авто)
То rjmp ЗаводимСКнопки
Если нажата кнопку 2 (прогрев авто по таймеру)
То rjmp Прогрев
Ret