Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
06.07.2010, 12:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Прерывания в прерываниях ATmega8
Кто подскажет как написать правильно.
Есть прерывание по переполнению таймера0 напрмер
interrupt [TIM0_OVF] void indy(void) фукция динамической индикации.
Есть три кнопки
Например такие
#define mode PIND.1//PIND.1 кнопка выбора режима
#define more PIND.0//PIND.0 кнопка больше
#define less PIND.2//PIND.2 кнопка меньше
Как сделать так чтоб при нажатии кнопки например "mode" наступало прерывание и соответственно выполнялась функция обработчик прерывания например void button (void) но приэтом динамическая индикация не останавливалась. Другими словами в процесе прерывания и выполнения функции работы с кнопками происходило еше прерывание и выполнение динамической индикации. Вобшем прерывание прерывания.
Как правильно это написать?
|
|
|
|
06.07.2010, 13:19
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
Можно сделать и то что вы просите. Для этого надо в прерывании более низкого порядка (обработчик прерывания от кнопки) просто разрешить прерывание.
Но в данном случае, это абсолютно бредовая идея. Задумайтесь сами - зачем?
Обработка кнопки - медленная операция. Сопоставимая с реакцией человека. То есть ничего плохого не произойдёт если кнопка будет обработана за 0.1 сек, что для процессора гигантский интервал.
Типовое решение - обработка кнопок опросом. Я бы сделал так. Создал бы одно прерывание, по регенерации изображения. Именно в этом прерывании, я бы заодно с регенерацией опрашивал клавиатуру и гасил дребезг.
|
|
|
|
06.07.2010, 14:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
SasaVitebsk,
Цитата:
|
Обработка кнопки - медленная операция. Сопоставимая с реакцией человека. То есть ничего плохого не произойдёт если кнопка будет обработана за 0.1 сек, что для процессора гигантский интервал.
|
Ну так в том то и дело.
Гоняется в круговую по прерыванию динамическая индикация которая чтото показывает. Например прерывание по переполнению таймера0 вектор прерывания [7], обновляет динамичку. С этим понятно сделал просимулировал все работает.
Нажимается кнопка, в прмежутке между прерываниями таймера0 происходит прерывание по событию PIND.1==0 ну дальше там антидребезг 0,05сек. Присвоим прерыванию вектор [20]. И если в процесе прерывания с вектором [20] произойдет прерывание с вектором [7], а это должно произойти судя из литературы без всяких разрешений, а исходя из того что одно главнее другого.
Если не так то как то как сделать это
Цитата:
|
Для этого надо в прерывании более низкого порядка (обработчик прерывания от кнопки) просто разрешить прерывание.
|
То время выполнения прерывания с вектором [20] будет равно суме времен. Ну выполнится обработка кнопки не за 0.05 сек, а чуть дольше так бог с ней. Человек этого и не заметит. Динамическая индикация выполняется не намного то и чаще поэтому увеличение времени будет не намного то и больше.
Отсюда вопрос какправильно объявить прерывание по событию т.е. если кнопка нажата сделать прерывание с таким то вектором например [20]?
Будет ли это прерывание прервано прерываним с вектором [7]?
Цитата:
|
Типовое решение - обработка кнопок опросом. Я бы сделал так. Создал бы одно прерывание, по регенерации изображения.
|
Создано, работает, опробовано. Обработчик по переполнению таймера0 вектор [7].
Цитата:
|
Именно в этом прерывании, я бы заодно с регенерацией опрашивал клавиатуру и гасил дребезг.
|
Стоп, стоп, кнопок в действительности три это видно из первого поста. Режимов тоже три. Каждый режим имеет свое значение в интервале от 0 до 999 которое нужно видеть на экране. Прибавляем времена обработки антидребезга. При Вашем подходе если все смешать получится каша и динамичка тоже работать не будет.
А так нажали кнопку "выбор режима" остановилось все кроме динамички и делаем установки, чего наустанавливали видим на экране. Если кнопки не нажимаются 5сек вышли из обработчика прерываний кнопок продолжаем работу согласно новых установок.
Последний раз редактировалось 7Fantomas7; 06.07.2010 в 14:16.
|
|
|
|
06.07.2010, 14:29
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,381
Сказал спасибо: 1,962
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
7Fantomas7, а кто вам мешает сделать динамическую индикацию в прерывании, а опрос кнопок в рабочем цикле? Чтоб проще в понимании было.
Индикация в прерывании по таймеру - для основной программы - как бы и не существует вовсе. Идет себе и идет, никому не мешает (ну если корректно сохранять все что надо).
А прерывание из прерывания в АВРках просто так не получится, надо чуток шаманить, да и не нужно такое делать вообще. Обработчик прерывания должен быть короток, как тост.
По моему, у вас пока размыто само понятие прерывания. То, что вы, допустим, ждете полсекунды для дребезга - не значит, что в этом цикле ожидания не будет прерывания по таймеру.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
06.07.2010, 14:33
|
|
Супер-модератор
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 956 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
Сообщение от SasaVitebsk
|
Создал бы одно прерывание, по регенерации изображения. Именно в этом прерывании, я бы заодно с регенерацией опрашивал клавиатуру и гасил дребезг.
|
Именно это я ему и втолковывал, только в другой ветке.
|
|
|
|
06.07.2010, 15:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
Цитата:
|
а кто вам мешает сделать динамическую индикацию в прерывании,
|
Так и сделана
Писал выше
Цитата:
|
Гоняется в круговую по прерыванию динамическая индикация которая чтото показывает. Например прерывание по переполнению таймера0 вектор прерывания [7], обновляет динамичку. С этим понятно сделал просимулировал все работает.
|
Цитата:
|
а опрос кнопок в рабочем цикле? Чтоб проще в понимании было.
|
Так и пытался делать, был справедливо раскритикован Halex07, причину критики нашел, начал переделывать.
Halex07,
Цитата:
|
Не, это работать не будет. Заведите один из таймеров, загоните опрос кнопок в прерывание и через какую нибудь переменную контролируйте свой антидребезг.
|
Вы советовали это. Это я пытаюсь сделать. Только прерывание не по таймеру, а по изменению сигнала на пине который опрашивается в маине. Другими словами если состояние пина изменилось то делаем прерывание и выполняем обработчик прерывания функцию работы с кнопками. При этом не мешаем динамической индикации которая в своем прерывании.
Цитата:
|
То, что вы, допустим, ждете полсекунды для дребезга - не значит, что в этом цикле ожидания не будет прерывания по таймеру.
|
Так и делал, был раскритикован Halex07, ждал антидребезг через delay. В принципе согласен по книжке так делать не советуют. Решил сделать через прерывание и таймер.
|
|
|
|
06.07.2010, 15:31
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,381
Сказал спасибо: 1,962
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
Сообщение от 7Fantomas7
|
Только прерывание не по таймеру, а по изменению сигнала на пине который опрашивается в маине. Другими словами если состояние пина изменилось то делаем прерывание
|
Нет, у вас все же неверное представление о прерывании. Прерывание не делают, оно само возникает.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
06.07.2010, 15:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
Цитата:
|
А прерывание из прерывания в АВРках просто так не получится, надо чуток шаманить,
|
Ну шож Вы меня не понимаете то, ну шо мне еще както сказать
Не прерывание из прерывания. А есть главное прерывание и второстепеное прерывание. Второстепенное прерывание включается когда нет главного прерывания по событию и прерывается главным прерыванием когда таковое случается. А потом продолжает выполняться.
|
|
|
|
06.07.2010, 15:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
Цитата:
|
Прерывание не делают, оно само возникает.
|
Хорошо как сделать так чтоб оно возникло когда состояние пина изменилось с 1 на 0.
|
|
|
|
06.07.2010, 15:41
|
|
Прописка
Регистрация: 16.03.2005
Сообщений: 244
Сказал спасибо: 78
Сказали Спасибо 85 раз(а) в 55 сообщении(ях)
|
Re: Прерывания в прерываниях ATmega8
а что мешает сделать все в одном прерывании по таймеру и индикацию и опрос кнопок и антидребезг. еще и отсчет "точного" времени и еще кучу всего в одном прерывании. даже функцию delay?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Прерывания ATMega8
|
7Fantomas7 |
Микроконтроллеры, АЦП, память и т.д |
21 |
03.07.2010 10:41 |
ATMega8 VS USB
|
SkyProc |
Микроконтроллеры, АЦП, память и т.д |
28 |
28.04.2010 17:01 |
Вложенные прерывания HITECH PIC16
|
picavr |
Микроконтроллеры, АЦП, память и т.д |
17 |
07.03.2010 17:39 |
Вход в прерывания для PIC микроконтроллеров
|
dimmich |
Микроконтроллеры, АЦП, память и т.д |
4 |
06.12.2009 17:17 |
Котроллер дисплея на Atmega8
|
kosant |
Микроконтроллеры, АЦП, память и т.д |
24 |
30.11.2009 20:57 |
Часовой пояс GMT +4, время: 01:13.
|
|