|
Atmega8:Выход с прерывания по rjmp, с последующей корректировкой указателя стека и установкой флага глоб.прерывания (sei), слишком ли грубый ход ? |
|
|
|
Jan 26 2011, 09:43
|
Группа: Участник
Сообщений: 12
Регистрация: 24-07-09
Из: Барнаул
Пользователь №: 51 518

|
На данный момент существует самодельное устройство автозавода автомобиля по таймеру, управляющий контроллер 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
Сообщение отредактировал DmSk - Jan 26 2011, 09:45
|
|
|
|
|
 |
Ответов
|
Jan 26 2011, 10:40
|
Группа: Участник
Сообщений: 12
Регистрация: 24-07-09
Из: Барнаул
Пользователь №: 51 518

|
Цитата(GDI @ Jan 26 2011, 13:13)  И что значит "команды от кнопок будут обрабатываться мгновенно не дожидаясь выполнения подпрограмм"? нажал на кнопку - вызвалось прерывание из прерывания я сразу перехожу в нужный мне кусок кода - конкретно "завести авто". если по другому сделать, то это например я какойнить флаг бы выставил что нужно завести машину, а в это время выполняется кусок кода "прогрев авто" и висит пауза 60 минут, где я там буду проверять что нужно выйти из прогрева и заводить авто ? даже незнаю как правильно, но мой вариант тоже рабочий
|
|
|
|
|
Jan 26 2011, 14:12
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Цитата(DmSk @ Jan 26 2011, 13:40)  это например я какойнить флаг бы выставил что нужно завести машину, а в это время выполняется кусок кода "прогрев авто" и висит пауза 60 минут, где я там буду проверять что нужно выйти из прогрева и заводить авто ? Вот потому я и сказал что у вас глобальная мысль идет неверно. Как вы эту задержку делаете, пустым циклом, что мешает в этот пустой цикл вставить проверку нажатия кнопки и выход на нужную подпрограмму? вариант по сложнее - сделать задержку sleep-ом, с периодическим просыпанием по прерыванию от таймера с подсчетом прошедшего времени и засыпанием дальше (либо заводить двигатель для прогрева) и по прерыванию от кнопки с соответствующими действиями. Ну, а про то что вешать кнопку на прерывание не есть хороший тон, вам уже выше написали, как минимум в этом прерывании нужно сделать компенсацию дребезга, а то вы рискуете с вашим методом перезаписи стэка. В общем есть корректные пути решения проблем. P.S. Надеюсь, Вы делаете проверку что передача не включена перед стартом двигателя? P.P.S. Может стоит перейти на Си, чтобы решать задачи без усложнения кода?
--------------------
|
|
|
|
|
Jan 27 2011, 03:01
|
Группа: Участник
Сообщений: 12
Регистрация: 24-07-09
Из: Барнаул
Пользователь №: 51 518

|
Цитата(GDI @ Jan 26 2011, 17:12)  Вот потому я и сказал что у вас глобальная мысль идет неверно. Как вы эту задержку делаете, пустым циклом, что мешает в этот пустой цикл вставить проверку нажатия кнопки и выход на нужную подпрограмму? пустой цикл немогу использовать для обработки кнопок, так как нажав кнопку я попаду в нужную мне программу, а нажав другую кнопку после неё уже нет .. потомучто программа в моем случае вернется в "пустой цикл" только после выполнения предыдущей команды . "компенсацию дребезга" - конечно будет, поскольку я пример упростил для наглядности Цитата(GDI @ Jan 26 2011, 17:12)  P.S. Надеюсь, Вы делаете проверку что передача не включена перед стартом двигателя? P.P.S. Может стоит перейти на Си, чтобы решать задачи без усложнения кода? да "защита от дурака стоит"
|
|
|
|
Сообщений в этой теме
DmSk Atmega8:Выход с прерывания по rjmp, с последующей корректировкой указателя стека и установкой флага глоб.прерывания (sei), слишком ли грубый ход ? Jan 26 2011, 09:43    GDI Цитата(DmSk @ Jan 27 2011, 06:01) пустой ... Jan 27 2011, 08:11 Maik-vs А! обычная вещь - прерывание длиной в секунду.... Jan 26 2011, 10:45 DmSk Цитата(Maik-vs @ Jan 26 2011, 13:45)... Jan 26 2011, 14:02  zombi Цитата(DmSk @ Jan 26 2011, 17:02) main:
... Jan 27 2011, 08:50   DmSk Цитата(zombi @ Jan 27 2011, 11:50) 2: Вых... Jan 27 2011, 11:14    zombi Цитата(DmSk @ Jan 27 2011, 14:14) если в ... Jan 27 2011, 12:18     DmSk Цитата(zombi @ Jan 27 2011, 15:18) Ну тог... Jan 27 2011, 14:36      zombi Цитата(DmSk @ Jan 27 2011, 17:28) дребезг... Jan 27 2011, 14:42  Maik-vs Цитата(DmSk @ Jan 26 2011, 17:02) спасибо... Jan 27 2011, 10:20 _Pasha кнопки по прерыванию можно только в одном случае -... Jan 26 2011, 12:36 ILYAUL Цитатаесли нажалии кнопку "прогрев по таймеру... Jan 27 2011, 18:21 DmSk Цитата(ILYAUL @ Jan 27 2011, 21:21) Конеч... Jan 28 2011, 03:22  ILYAUL Цитата(DmSk @ Jan 28 2011, 06:22) Процесс... Jan 30 2011, 15:11 GDI Цитатастатус процесса Это хорошие слова, еще чуть-... Jan 28 2011, 12:36
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|