Перейти к содержанию

Обработка Нажатия Кнопок


Рекомендуемые сообщения

Изучаю прерывания, сделал простенькую программу, которая зажигает светодиод при нажатии кнопки и гасит, вот схема (см. вложение).

Тут использован внешний источник прерываний RB0/INT, в контроллере 16F84A он один(а может и не только в нем). Допустим мне надо обрабатывать нажатие двух и более клавиш, как это реализовать? (для каждой клавиши свой обработчик)

post-156072-0-15642000-1351191201_thumb.png

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Тут использован внешний источник прерываний RB0/INT,

в этой задаче он нахрен не нужен, вкючайте таймер и опрашивайте состояние кнопок через 5-10мс и будет вам счастье...

внешние прерывания для кнопок нужны только в случае использования режима SLEEP

Изменено пользователем IMXO
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Ну я думал это как-то не очень правильно, опрашивать постоянно кнопки, т.к. много в холостую работать будет контроллер.

Получается внешнее прерывание используется ТОЛЬКО для пробуждения контроллера? Или есть еще варианты?

Ссылка на комментарий
Поделиться на другие сайты

Ну я думал это как-то не очень правильно, опрашивать постоянно кнопки,

не постоянно , а один раз в 5-10мс ( один раз на 5-10 тыс инструкций МК при Fosc=4MHz) :rtfm:

Ссылка на комментарий
Поделиться на другие сайты

Ну я думал это как-то не очень правильно, опрашивать постоянно кнопки,

не постоянно , а один раз в 5-10мс ( один раз на 5-10 тыс инструкций МК при Fosc=4MHz) :rtfm:

Ну понятно, я это и имел ввиду, через такой коротки интервал, считай постоянно :)

Ну в общем так делают во все и это промышленное решение?

И еще по схеме. Т.е. в случае использования таймера, можно считывать нужные пины и смотреть, если на них высокий уровень - значит произошло нажатие. А как подать на них пысокий уровень, просто пин на плюс питания замкнуть кнопкой или через резистор?

Ссылка на комментарий
Поделиться на другие сайты

если на них высокий уровень - значит произошло нажатие. А как подать на них пысокий уровень, просто пин на плюс питания замкнуть кнопкой или через резистор?

на оборот : низкий уровень = нажатие , это более правильно :

1. в МК уже есть PULLUP (хотя внешний резистор надежней)

2. более высокая помехоустойчивость

Ссылка на комментарий
Поделиться на другие сайты

Т.е. через резистор замкнуть нужный пин на плюс, а кнопка в разрыв цепи в нормально замкнутом состоянии, правильно понял?

И какого номинала надо резистор?

Ссылка на комментарий
Поделиться на другие сайты

нет кнопка на массу , смотрим свою схему пост#1 там все правильно

если нет строгих условий по потреблению питания , резистор 5-10Ком

И еще по схеме. Т.е. в случае использования таймера, можно считывать нужные пины и смотреть, если на них ....

правильный алгоритм для МК 12 и 16 серии следующий:

1 прочитать порт

2 сохранить значение порта в темповскую переменную

3 провести обработку битов темповской переменной

не соблюдение этой последовательности может приводить к ошибкам в работе МК....

Изменено пользователем IMXO
Ссылка на комментарий
Поделиться на другие сайты

Реализовать без использования прерываний.

Помоему человек ясно сказал "Изучаю прерывания".

И для автора: в протеусе не обязательно MCLR тянуть к питанию.

Ссылка на комментарий
Поделиться на другие сайты

Реализовать просто. С помощью диодов подтянутых к пину внешнего прерывания, в программе обработки прерывания определяете нажатую кнопку. Вот пример

post-162786-0-59662100-1351230589_thumb.png

Изменено пользователем XeoN
Ссылка на комментарий
Поделиться на другие сайты

правильный алгоритм для МК 12 и 16 серии следующий:

1 прочитать порт

2 сохранить значение порта в темповскую переменную

3 провести обработку битов темповской переменной

не соблюдение этой последовательности может приводить к ошибкам в работе МК....

т.е.

1. Считать порт в рабочий регистр

2. Сохранить рабочий регистр в память данных

3. И тут понятно, работать с ячейкой памяти, проверять нужные биты

правильно понял?

П.С. почему этот алгоритм правильный для 12 и 16 пиков? Для 18 это не будет работать?

Реализовать просто. С помощью диодов подтянутых к пину внешнего прерывания, в программе обработки прерывания определяете нажатую кнопку. Вот пример

Сам уже думал, как бы один единственный источник внешних прерываний использовать для всех кнопок, чтобы когда на нем происходит прерывание, считывать кнопки. Я так понял, 4-ый пин у атмеги на этом ресунке - это и есть источник внешнего прерывания?

Ссылка на комментарий
Поделиться на другие сайты

INT для кнопок - жирно и через жо... задницу. Не такое уж и важное по времени событие, что бы так быстро реагировать на него.

Для этого Вам понадобится ещё один таймер, что бы отсчитывать время после прерывания, по которому разрешать прерывания по INT'у, для устранения дребезга. Лучше этот таймер задействовать для периодичного опроса кнопок, заодно и системные тики реализовать, которые понадобятся для формирования всяческих там задержек...

Так-же, Вы не сможете отлавливать отжатие кнопки и реализовать обработку длинного нажатия.

Ну и выводов и деталей используется больше. А спрашивается - нафига этот весь геморрой, если можно сделать по-нормальному ?

Ссылка на комментарий
Поделиться на другие сайты

не знаю что вы поняли , но написали ерунду

понятие рабочий регистр включает в себя все регистры МК и РОН(регистр общего назначения) и РСН(регистр специального назначения)

понятие память данных - флеш память МК

короче порт читаем в аккумулятор, аккумулятор сохраняем в РОН , работаем с битами РОН

для 18 серии работать будет , но это не актуально в ней есть дополнительный регистр LATB

Ссылка на комментарий
Поделиться на другие сайты

не знаю что вы поняли , но написали ерунду

понятие рабочий регистр включает в себя все регистры МК и РОН(регистр общего назначения) и РСН(регистр специального назначения)

понятие память данных - флеш память МК

короче порт читаем в аккумулятор, аккумулятор сохраняем в РОН , работаем с битами РОН

для 18 серии работать будет , но это не актуально в ней есть дополнительный регистр LATB

Рабочий регистр - это W, по крайней мере так написано в книге

Ссылка на комментарий
Поделиться на другие сайты

Читаю даташит к дедушке 84А, добрался до таймера.

Возникли воворосы:

1. Предделитель можно использовать ТОЛЬКО в режиме счетчика и ТОЛЬКО с внешним тактирующим сигналом на порту RA4/TOCKI ?

2. С использованием предделителя 1:256 и самого таймера 256, получается 256*256 = 65536 операций, одна операция 4 такта, итого 4*65536= 262144 такта, т.е. примерно 262мс ? Получается максимальный интервал таймера0 составляет 262мс ?

Или я не так все понял? :)

Изменено пользователем metallic
Ссылка на комментарий
Поделиться на другие сайты

ТОЛЬКО с внешним тактирующим сигналом на порту RA4/TOCKI ?
Нет, не только. Предделитель можно подключать и при тактировании от Fosc.

На сколько я помню, в этом чипе прескалер можно подключить либо перед WDT либо перед таймером. Минимальное соотношение перед WDT = 1:1, перед таймером = 1:2.

Получается максимальный интервал таймера0 составляет 262мс ?
Нет. Получается - 65536 микросекунд на частоте осцилятора, равной 4Мгц.

1 такт таймера = 1 машинному циклу = 4 тактам осцилятора.

Изменено пользователем Alex
Ссылка на комментарий
Поделиться на другие сайты

Нет, не только. Предделитель можно подключать и при тактировании от Fosc.

Т.е. по первому пункту(предделитель работает только в режиме счетчика) все верно?

А при тактировании от Fosc - это имеется ввиду от внутр. генератора? Т.е. с обычным внешним кварцем?

На сколько я помню, в этом чипе прескалер можно подключить либо перед WDT либо перед таймером. Минимальное соотношение перед WDT = 1:1, перед таймером = 1:2.

Так и есть, конфигурится это битом PSA, регистра OPTION_REG

Нет. Получается - 65565 микросекунд на частоте осцилятора, равной 4Мгц.

1 такт таймера = 1 машинному циклу = 4 тактам осцилятора.

Что-то не понял, получается на частоте 4Мгц один машинный цикл выполняется за 1 микросекунду? Как это рассчитывается?

Ссылка на комментарий
Поделиться на другие сайты

Т.е. по первому пункту(предделитель работает только в режиме счетчика) все верно?
Что за первый пункт ? Предделитель всегда работает в режиме счётчика, т.к. - это и есть счётчик, находящийся перед таймером.
А при тактировании от Fosc - это имеется ввиду от внутр. генератора? Т.е. с обычным внешним кварцем?
Не обязательно от внутреннего. От тактового генератора.

Кстати, в 84А нет внутреннего осцилятора, только внешние.

Что-то не понял, получается на частоте 4Мгц один машинный цикл выполняется за 1 микросекунду? Как это рассчитывается?
Да, так и получается. Тактовая частота = частота осцилятора / 4.
Ссылка на комментарий
Поделиться на другие сайты

Тактовая частота = частота осцилятора / 4.

Это я знаю, что 1 машинный цикл выполняется за 4 такта генератора.

Т.е. при 4Мгц:

4000000Гц / 4 = 1000000 тактовая частота, т.е. миллион операция в секунду

Но что-то не соображу, почему 65565 операций будут выполняться 65565мкС ?

А сколько времени будут выполняться 65565 операция на частоте 20МГц ?

Т.е. при 5.000.000 операций в сек (4МГц), одна операция выполняется 1.000.000/5.000.000 = 0.2мкС ?

Получается 65565 * 0,2 = 13113 мкС ?

Изменено пользователем metallic
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...