реклама на сайте
подробности

 
 
> Atmega8:Выход с прерывания по rjmp, с последующей корректировкой указателя стека и установкой флага глоб.прерывания (sei), слишком ли грубый ход ?
DmSk
сообщение Jan 26 2011, 09:43
Сообщение #1





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GDI
сообщение Jan 26 2011, 10:13
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Вместо такого описания, лучше бы нарисовали алгоритм, а там, глядишь и сами бы разобрались как надо правильно сделать. Я ничего не понял из Вашего описания, но у меня создалось стойкое ощущение что у Вас что-то глобально не правильно в программе, т.е. сама концепция программы не верна. И что значит "команды от кнопок будут обрабатываться мгновенно не дожидаясь выполнения подпрограмм"?


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
DmSk
сообщение Jan 26 2011, 10:40
Сообщение #3





Группа: Участник
Сообщений: 12
Регистрация: 24-07-09
Из: Барнаул
Пользователь №: 51 518



Цитата(GDI @ Jan 26 2011, 13:13) *
И что значит "команды от кнопок будут обрабатываться мгновенно не дожидаясь выполнения подпрограмм"?


нажал на кнопку - вызвалось прерывание из прерывания я сразу перехожу в нужный мне кусок кода - конкретно "завести авто".

если по другому сделать, то
это например я какойнить флаг бы выставил что нужно завести машину, а в это время выполняется кусок кода "прогрев авто" и висит пауза 60 минут, где я там буду проверять что нужно выйти из прогрева и заводить авто ?

даже незнаю как правильно, но мой вариант тоже рабочий laughing.gif
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 26 2011, 14:12
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата(DmSk @ Jan 26 2011, 13:40) *
это например я какойнить флаг бы выставил что нужно завести машину, а в это время выполняется кусок кода "прогрев авто" и висит пауза 60 минут, где я там буду проверять что нужно выйти из прогрева и заводить авто ?

Вот потому я и сказал что у вас глобальная мысль идет неверно. Как вы эту задержку делаете, пустым циклом, что мешает в этот пустой цикл вставить проверку нажатия кнопки и выход на нужную подпрограмму? вариант по сложнее - сделать задержку sleep-ом, с периодическим просыпанием по прерыванию от таймера с подсчетом прошедшего времени и засыпанием дальше (либо заводить двигатель для прогрева) и по прерыванию от кнопки с соответствующими действиями. Ну, а про то что вешать кнопку на прерывание не есть хороший тон, вам уже выше написали, как минимум в этом прерывании нужно сделать компенсацию дребезга, а то вы рискуете с вашим методом перезаписи стэка. В общем есть корректные пути решения проблем.

P.S. Надеюсь, Вы делаете проверку что передача не включена перед стартом двигателя?
P.P.S. Может стоит перейти на Си, чтобы решать задачи без усложнения кода?


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
DmSk
сообщение Jan 27 2011, 03:01
Сообщение #5





Группа: Участник
Сообщений: 12
Регистрация: 24-07-09
Из: Барнаул
Пользователь №: 51 518



Цитата(GDI @ Jan 26 2011, 17:12) *
Вот потому я и сказал что у вас глобальная мысль идет неверно. Как вы эту задержку делаете, пустым циклом, что мешает в этот пустой цикл вставить проверку нажатия кнопки и выход на нужную подпрограмму?

пустой цикл немогу использовать для обработки кнопок, так как нажав кнопку я попаду в нужную мне программу, а нажав другую кнопку после неё уже нет .. потомучто программа в моем случае вернется в "пустой цикл" только после выполнения предыдущей команды .

"компенсацию дребезга" - конечно будет, поскольку я пример упростил для наглядности

Цитата(GDI @ Jan 26 2011, 17:12) *
P.S. Надеюсь, Вы делаете проверку что передача не включена перед стартом двигателя?
P.P.S. Может стоит перейти на Си, чтобы решать задачи без усложнения кода?

да "защита от дурака стоит" sm.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 00:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01429 секунд с 7
ELECTRONIX ©2004-2016