Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Разъясните, как организовать кнопку на прерывании
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Alex K
камень - ATMega8, компилятор - CodeVision 1.24.8.
девайс считает импульсы со входа INT0 и выводит на светодиодный семисегментный индикатор. для расчета кол-ва импульсов задействован таймер_2, для динамической индикации - таймер_0. дополнительно используется ШИМ (для регулировки цвета светодиодного индикатора) - юзается таймер_1. на вход INT1 подвешена кнопка. собственно при нажатии на нее должна вызываться процедура, в которой задаются различные коэффициенты пересчета, цвет индикатора и т.п.
собственно проблема: при нажатии на эту кнопку возникает прерывание INT1, входим в процедуру настройки, но пропадает индикация (т.к. таймер_0 останавливается). я так понимаю, что после нажатия на кнопку (или после перехода в процедуру настройки) нужно запретить реагировать на возникновение этого прерывания? т.е. чтобы все остальные прерывания (кроме int1) вновь заработали... так? какие директивы прописать? ткните носом, если уже разжевывалось, найти не получилось...
stells
мне кажется лучше в цикле динамической индикации сделать просто опрос кнопки со счетчиком времени ее нажатия для устранения дребезга контактов (нажата 2 цикла - есть нажатие). тогда с и прерываниями ничего дополнительно делать не надо. по прерыванию обрабатывают какие-то быстрые события или когда нужна быстрая реакция
INT1
Установите MCUCR так, чтобы INT1 происходило по перепаду, а то он у вас похоже из обработчика в основной цикл вылезть не может. Да и другие прерывания не могут быть обработаны, пока вы кнопку держите.
mempfis_
Самы простой вариант как вам посоветовали перенести опрос кнопки в обработчик прервыния от ТС который обеспечивает динамическую мндикацию (там подходящий период). Обязательно нужно сделать антидребезг.
Если же вы хотите использовать именно INT1 то позаботьтесь чтобы у вас небыло многократного повторного вхождения в прерывание - при первом нажатии кнопки когда вызывается обработчик прерывания INT1 установите некоторый таймер на 50-100 мС и запретите прерывание INT1. В прерывани от ТС декрементируйте этот таймер до 0 и когда он достигнет нуля разрешайте INT1. Так можно избавиться от дребезга. Ну и настройте само прерывание INT1 на срабатывание по фронту (по какому это зависит от включения вашей кнопочки)
Alex K
Цитата(INT1 @ Jul 19 2009, 11:50) *
Установите MCUCR так, чтобы INT1 происходило по перепаду
уже -)
Цитата(mempfis_ @ Jul 19 2009, 13:32) *
...и запретите прерывание INT1.
вот это как раз и не знаю, как сделать -(...
пожалуй, сделаю как и советовали, счетчик в процедуре динамической индикации на появление нулика на выходе D3.
stells
Цитата(Alex K @ Jul 19 2009, 13:37) *
пожалуй, сделаю как и советовали, счетчик в процедуре динамической индикации на появление нулика на выходе D3.

и это будет правильно
mempfis_
Эх вы smile.gif как настроить прерывание разобрались а как разрешать/запрещать его нет.

Код
General Interrupt Control Register – GICR
Bit 7 – INT1: External Interrupt Request 1 Enable


Код
GICR |= (1<<INT1); //разрешить прерывание INT1
GICR &= ~(1<<INT1); //запретить прерывание INT1


А вообще развивайте вариант со сканирование кнопки в обработчике прерывания динамической индикации.
По ссылке я приводил свой вариант антидребезга которым пользуюсь во многих проектах.
http://electronix.ru/forum/index.php?showtopic=65048
Alex K
спасибо, сейчас пытаюсь придумать систему меню, чтобы при помощи одной кнопки вводить 4 числовых параметра...
stells
Цитата(Alex K @ Jul 19 2009, 15:40) *
спасибо, сейчас пытаюсь придумать систему меню, чтобы при помощи одной кнопки вводить 4 числовых параметра...

тут в общем-то можно кой-чего посоветовать, но наверное не стоит прерывать Ваш творческий процесс rolleyes.gif
XVR
Цитата(Alex K @ Jul 19 2009, 15:40) *
спасибо, сейчас пытаюсь придумать систему меню, чтобы при помощи одной кнопки вводить 4 числовых параметра...
Совет - не делайте этого. С такой 'системой меню' смогут нормально работать только потомственные радисты, как минимум в 3м поколении smile3046.gif
У меня была попытка сделать нечто такое, в наличии была 1 кнопка и 2 светодиода (один из них 2х цветный). На это нужно было повесить около 3х задаваемых пользователем режимов работы и в каждом из них нужно было показывать текущий статус (то же около 2-3 булевских параметров).
Это было сделано с помощью длинных и коротких нажатий кнопки (в разное время) и разными характеристиками мигания светодиодами.
После непродолжытельной практики все было выкинуто и оставленно 2 основных режима с минимум индикации. Пользователи оказались не в состоянии воспользоваться всеми наворотами, даже имея перед глазами подробнейшую инструкцию cranky.gif
AHTOXA
Пользователи бывают разныеsmile.gif Некоторые даже умудряются автомобильную сигнализацию программироватьsmile.gif
stells
Цитата(XVR @ Jul 21 2009, 12:13) *
У меня была попытка сделать нечто такое, в наличии была 1 кнопка и 2 светодиода (один из них 2х цветный). На это нужно было повесить около 3х задаваемых пользователем режимов работы и в каждом из них нужно было показывать текущий статус (то же около 2-3 булевских параметров).
Это было сделано с помощью длинных и коротких нажатий кнопки (в разное время) и разными характеристиками мигания светодиодами.

у меня тоже был опыт сделать более-менее понятный пользовательский интерфейс на 2-х кнопках и 2-х светодиодах, регулировать нужно было 4 параметра. текстовое объяснение алгоритма работы воспринималось действительно очень трудно, тогда в техописание было добавлено графическое представление интерфейса - почти все вопросы были сняты:
Нажмите для просмотра прикрепленного файла
Alex K
собственно количество кнопок обусловлено габаритами прибора и отсутствием свободных ножек микроконтроллера. и настройка будет производиться только один раз при установке и наладке прибора (можно и вовсе обойтись без кнопки и ручного ввода параметров, задавая все через программатор, но хочется, чтобы конечный юзер смог это сделать сам).


p.s. кнопка пострадала из-за неаккуратного обращения -)
mempfis_
С одной кнопкой много не сделаеш. Но у вас есть индикация. Нажимаете и удерживаете кнопку - переход в меню настройки, например начинает мигать номер меню и по одиночному нажатию перелистываете номера. Ещё раз нажатие и удержание переход в выбранное меню, по одиночным нажатиям меняете параметр, нажимаете и удерживаете кнопку - изменённый параметр сохраняется и переходит на уровень вверх. Ещё раз нажать и удержать выход из меню настройки. Немного запутанно но вполне реализуемо smile.gif
Ещё лучше предусмотреть выход с уарта (там пару проводков) на внешний преобразователь ttl-rs232 и настраивать через com-порт smile.gif
KvKv
С одной кнопкой можно использовать, например, двойные нажатия.
Короткое одиночное, двойное, длинное одиночное - вот уже как-будто три кнопки. smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.