Как подключить к микроконтроллеру кнопки
Почти ни одно изделие с микроконтроллером не обходится без кнопок. Тема эта уже избитая и во многом известная. Написанием этой статьи я не пытаюсь изобрести велосипед. Просто решил собрать всю инфу по схемотехнике воедино. Думаю, что материал будет полезен начинающим.Чтобы не сбивать вас с толку, на приведенных ниже рисунках не показаны схемы питания, сброса и тактирования микроконтроллеров.
рис1а рис1б
Если кнопок немного и дефицита выводов мк не наблюдается, используем традиционный способ подключения.
Когда кнопка отпущена – вывод мк через резистор соединен с “плюсом” питания (рис. 1а). Когда кнопка нажата – вывод мк соединен с землей. Подтягивающий резистор R1 ограничивает силу тока в цепи переключателя. Если бы его не было, то при нажатии кнопки мы бы просто закоротили наш источник питания.
В большинстве современных микроконтроллеров есть встроенные подтягивающие резисторы, поэтому внешние можно не ставить (рис1б). В программе микроконтроллера нужно будет настроить используемый вывод на вход и включить внутренний подтягивающий резистор.
Что произойдет, если вывод микроконтроллера окажется в режиме выхода? Это будет зависеть от состояния этого вывода. Если на выводе “логический ноль” – ничего страшного не случиться, потому что — в первом случае (рис1а) величина втекающего тока ограничена резистором R1, а во втором случае (рис1б) никакой ток вообще не потечет. При нажатии кнопки тоже ничего не случиться, поскольку разность потенциалов между выводом и “землей” в этом случае будет равна нулю.
Если же на выводе будет ”логическая единица” и кнопка окажется нажатой, то через вывод микроконтроллера на землю потечет ток величиной в несколько десятков миллиампер и вывод порта может “погореть”. Предельно допустимый ток для вывода микроконтролера AVR согласно документации равен 40 мА. Поэтому иногда нелишним бывает поставить между выводом мк и кнопкой резистор номиналом в несколько сотен ом, например 330 (рис 1с). Так, например, подключены кнопки на отладочной плате STK500. Это сделано для подстраховки, чтобы пользователь нечаянно не спалил микроконтроллер в ходе своих эксперементов.
Для своих макетов впрочем можно обойтись и без этого резистора.
Рис 1с
Рис. 2а
Рис. 2б
Используется когда кнопок больше двух, а выводы мк хочется сэкономить. Каждой кнопке в данном случае соответствует свой цифровой код, а количество кнопок, которые можно таким способом повесить на N выводов мк = 2N — 1. То есть на три вывода можно повесить 7 кнопок, на четыре – 15 и так далее… но я бы больше 7-ми вешать не стал. Увеличивается количество дополнительных внешних компонентов, усложняется схема и программа мк. Кроме того, для большого количества кнопок есть и другие схемы включения. Подтягивающие резисторы на схеме не показаны, подразумевается, что используются внутренние.
Кстати, через диоды еще можно завести сигналы от кнопок на вывод внешнего прерывания контроллера (рис. 3). При нажатии любой кнопки вывод внешнего прерывания через диод будет замыкаться на землю и вызывать прерывание (естественно при условии, что оно настроено и разрешено). Таким образом контроллеру не нужно будет постоянно опрашивать кнопки, эта процедура будет запускаться только по событию внешнего прерывания.
Рис. 3
Данная схема актуальна не для всех микроконтроллеров AVR, потому что в некоторых моделях микроконтроллеров внешнее прерывание может возникать по любому изменению на любом выводе. (например в ATmega164P)
Рис. 4
Такой вариант подключения обычно используется для блоков из нескольких кнопок, которые объединены конструктивно и соединены электрически по матричной схеме. Но никто не запрещает использовать эту схему и для включения обычных кнопок, однако реальную экономию она дает при количестве кнопок ? 9.
Выводы PС0, PС1, PС2, PC3 – это строки матрицы, выводы PB0, PB1, PB2 – это столбцы матрицы. Кнопки можно опрашивать либо по строкам, либо по столбцам. Допустим, мы опрашиваем их по столбцам. Процедура опроса будет выглядеть следующим образом. Начальное состояние всех выводов – вход с включенным подтягивающим резистором. Устанавливаем вывод PB0 в режим выхода и выставляем ноль. Теперь нажатие кнопок S1, S2, S3, S4 будет замыкать выводы PС0, PС1, PС2, PC3 на 0 питания. Опрашиваем эти выводы и определям нажата ли какая-нибудь кнопка в данный момент. Устанавливаем вывод PB0 в режим выхода и включаем подтягивающий резистор. Устанавливаем вывод PB1 в режим выхода и выставляем ноль. Снова опрашиваем выводы PС0, PС1, PС2, PC3. Теперь нажатие кнопок S5, S6, S7, S8 будет замыкать выводы PС0, PС1, PС2, PC3. Последний столбец кнопок опрашиваем аналогично.
Строки матрицы можно завести через диоды на вывод внещнего прерывания. Тогда логику программы можно было бы построить так. Если клавиатура не используется в течении нескольких минут, микроконтроллер переходит в режим пониженного энергопотребления. При этом выводы PB0, PB1, PB2 – конфигурируются как выходы с нулевым логическим уровнем. Когда одна из кнопок нажимается, вывод прерывания через диод замыкается на ноль. Это вызывает внешнее прерывание, микроконтроллер просыпается и запускает таймер по сигналам которого происходит сканирование клавиатуры. Параллельно запускается счетчик времени, который сбрасывается при нажатии любой из кнопок. Как только он переполняется, микроконтроллер опять переходит в режим пониженного энергопотребления.
Это, пожалуй, пограничный случай экономии выводов при подключении кнопок, поскольку задействован только один вывод микроконтроллера – вывод АЦП. Суть способа понятна из рисунка. У нас есть резистивный делитель с известными уровнями напряжений на резисторах, с помощью кнопок эти напряжения мы коммутируем на вход АЦП. Контроллер оцифровывает напряжение на этом выводе и, исходя из того, в какой диапазон попадает считанное напряжение, определяет номер нажатой кнопки.
Когда ни одна кнопка не нажата, вход АЦП притянут к земле резистором R2. Оставлять вход АЦП плавающим нельзя, а то он будет ловить помехи. При замыкании кнопок резистор R2 оказывается включенным параллельно с резисторами делителя. Чтобы он не влиял на уровень напряжения на входе АЦП, его значение выбирают довольно большим. Резистор R1 предназначен для ограничения величины входного тока в случае если вывод контроллера окажется в режиме цифрового входа и будет нажата кнопка S5.
Рис. 5
Есть еще один вариант подобной схемы приведен на рис. 6. Здесь с помощью кнопок определенные резисторы делителя напряжения коммутируются на землю.
Неудобство этих схемы очевидно. Все резисторы делителя имеют разное сопротивление, а это усложняет и расчет, и подбор компонентов.
Рис. 6
Продолжение следует…
Подключение кнопки к avr
В одних схемах использовались RC-цепочки, и для определения нажатия одной из кнопок требовалось измерение длительности импульсов, в других использовался аналого-цифровой преобразователь и схема резистивного делителя напряжения для каждой кнопки. В статье мы рассмотрим еще один простой способ, позволяющий контролировать до 15 кнопок, подключенных лишь к одному выводу микроконтроллера. Единственным требованием для реализации этого метода является наличие в микроконтроллере внутреннего аналогового компаратора с функцией настройки значения опорного напряжения V REF. Большинство 8-разрядных микроконтроллеров PIC компании Microchip имеют один или два таких компаратора. В качестве простого и практичного примера в изображенной на Рисунке 1 схеме используется микроконтроллер PIC12F и 4 светодиода, в двоичном формате индицирующие номер нажатой кнопки. Для тактирования микроконтроллера используется внутренний генератор.
Поиск данных по Вашему запросу:
Подключение кнопки к avr
Схемы, справочники, даташиты:
Прайс-листы, цены:
Обсуждения, статьи, мануалы:
Дождитесь окончания поиска во всех базах.
По завершению появится ссылка для доступа к найденным материалам.
Содержание:
- 6. Как подключить кнопку к AVR микроконтроллеру
- Подключаем кнопки к AVR. Шаг №12
- Способ первый — традиционный
- Подключение кнопки к AVR
- Работа с кнопками программа обработки нажатия для микроконтроллера ATmega8
- Постановка задачи
- AVR Урок 7. Кнопка
- Микроконтроллеры
Подключение к микроконтроллеру клавиатуры матричного типа - Как подключить кнопки к микроконтроллеру
ПОСМОТРИТЕ ВИДЕО ПО ТЕМЕ: Урок 8. Подключение кнопки к МК BASCOM-AVR
6. Как подключить кнопку к AVR микроконтроллеру
Форма записи программ на Ассемблере. Команды и директивы ассемблера. Виды памяти. Текущий сегмент. Инициализация портов. Настройка портов ввода — вывода. Включение внутренних нагрузочных резисторов. Регистр общего назначения. Регистр ввода — вывода. Простейшая программа лаб 1. С практической точки зрения это совершенно бессмысленная задача, так как для ее решения проще обойтись без микропроцессора.
Но в качестве примера для обучения подойдет прекрасно. Итак, к микроконтроллеру нам нужно подключить светодиод и кнопку управления. Как мы уже говорили, для подключения к микроконтроллеру AVR любых внешних устройств используются порты ввода — вывода. Причем каждый такой порт способен работать либо на ввод, либо и на вывод. В этом случае управляющая программа должна будет настроить порт, к которому подключен светодиод, на вывод, а порт, к которому подключена кнопка, на ввод.
Других специальных требований к микроконтроллеру не имеется. Очевидно, что нам нужен микроконтроллер, который имеет не менее двух портов. Имеет оптимальные размеры выводной корпус. Для управления светодиодом мы будем использовать младший разряд порта В линия РВ. О , а для считывания информации с кнопки управления используем младший разряд порта D линия PD. Полная схема устройства, позволяющего решить поставленную выше задачу, приведена на рис.
Для подключения кнопки S1 использована классическая схема. В исходном состоянии контакты кнопки разомкнуты. Через резистор R1 на вход PD. При замыкании кнопки напряжение падает до нуля, что соответствует логическому нулю. Микроконтроллеры серии AVR имеют встроенные нагрузочные резисторы для каждого разряда порта.
Главное при написании программы — не забыть включить программным путем соответствующий резистор. Подключение светодиода также выполнено по классической схеме.
Это непосредственное подключение к выходу порта. В цепь светодиода включен токоограничивающий резистор R3. Для того, чтобы зажечь светодиод, микроконтроллер должен подать на вывод РВ. О сигнал логического нуля. В этом случае напряжение, приложенное к цепочке R3, VD1, окажется равным напряжению питания, что вызовет ток через светодиод, и он загорится.
Если же на вывод PD. Кроме цепи подключения кнопки и цепи управления светодиодом, на схеме вы можете видеть еще несколько цепей. Это стандартные цепи, обеспечивающие нормальную работу микроконтроллера. Конденсаторы С2 и СЗ — это цепи согласования кварцевого резонатора.
Элементы C1, R2 — это стандартная цепь начального сброса. Такая цепь обеспечивает сброс микроконтроллера в момент включения питания. Еще недавно подобная цепь была обязательным атрибутом любой микропроцессорной системы. Большинство микроконтроллеров AVR, кроме тактового генератора с внешним кварцевым резонатором, содержат внутренний RC-генератор, не требующий никаких внешних цепей.
Если вы не предъявляете высоких требований к точности и стабильности частоты задающего генератора, то микросхему можно перевести в режим внутреннего RC-генератора и отказаться как от внешнего кварца Q1 , так и от согласующих конденсаторов С2 и СЗ.
Цепь начального сброса тоже можно исключить. Внешние цепи сброса применяются только при наличии особых требований к длительности импульса сброса. Три освободившихся вывода микроконтроллера могут быть использованы как дополнительный порт порт А. Но в данном случае в этом нет необходимости. Упростим схему, показанную на рис. От внешнего кварца пока отказываться не будем.
Доработанная схема изображена на рис. Файловый архив студентов. Логин: Пароль: Забыли пароль? Email: Логин: Пароль: Принимаю пользовательское соглашение.
FAQ Обратная связь Вопросы и предложения. Добавил: Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам. Российский государственный гидрометеорологический университет. Скачиваний:
Подключаем кнопки к AVR. Шаг №12
С внешним миром микроконтроллер общается через порты ввода вывода. Схема порта ввода вывода указана в даташите:. Pxn — имя ножки порта микроконтроллера, где x буква порта A, B, C или D , n номер разряда порта 7… 0. Cpin — паразитная емкость порта. VCC — напряжение питания.
Также применим отслеживание дребезга контактов кнопки. не паять физически, а подключить опционально определенной командой.
Способ первый — традиционный
Сегодня мы расширим свой кругозор по изучению работы портов микроконтроллера и изучим второе назначение порта — работу на вход. И для изучения работы на вход мы применим обычную тактовую кнопку. Как всегда, создадим проект в Atmel Studio, выберем Atmega8A, назовем проект Test04 и код также в main. В качестве подопытного порта давайте возьмём порт B. Можно с успехом использовать любой порт. И в качестве ножки возьмем нулевую ножку. Итак у нас ножка B0. Также опять мы соберём проект, скопируем и переименуем файл протеуса, откроем его и в свойствах контроллера покажем путь к новому проекту.
Подключение кнопки к AVR
В этой статье описан вариант подключения и кнопочной клавиатуры к 6-и линиям микроконтроллера AVR. Способ не нов, по этому в излишних комментариях не нуждается. Схема подключения клавиатуры к МК представлена на рисунке ниже. Если для кого-то схема с первого раза покажется не логичной, то нарисуйте на листе бумаги 6 точек в виде шестиугольника и каждые две точки соедините между собой линией.
На первый взгляд вроде бы простая тема, но многие начинающие радиолюбители которые только начали изучать микроконтроллеры довольно часто задают одни и те же вопросы. И раз эти вопросы так часто задают, то тема еще не понятна или не полностью раскрыта и имеет смысл дать исчерпывающий ответ на вопрос » Как правильно подключить микроконтроллер?
Работа с кнопками программа обработки нажатия для микроконтроллера ATmega8
Принцип проверки состояния нажатия клавиши заключается в периодическом программном опросе входной линии, к которой подключен один из выводов клавиши, и анализе значения соответствующего бита. При использовании большого количества кнопок управления целесообразно применить матричную схему подключения клавиатуры, сходную с приведенной на рисунке 2. Нажатие одной из клавиш замыкает в соответствующей позиции горизонтальную и вертикальную сигнальную линии. Алгоритм опроса нажатия клавиши сводится к поочередной установке низких уровней напряжения на вертикальных линиях PORTE. Рассмотрим пример проверки нажатия одной из клавиш первого и второго крайних справа столбцов матричной клавиатуры, схема подключения которой приведена на рисунке 2. Лабораторная работа выполняется в индивидуальном порядке.
Постановка задачи
Описан простой эксперимент с подключением кнопки к AVR микроконтроллеру, разобрана не сложная программа на языке Си для обработки нажатий кнопки. Разберемся с особенностями подключения кнопки к портам МК, а также с методами считывания состояний кнопки на языке Си. В предыдущих статьях были рассмотрены эксперименты со светодиодами, которые подключались к портам микроконтроллера, сконфигурированных на вывод Output. В этой статье мы подключим к микроконтроллеру кнопку, контакты которой при нажатии замыкаются, а при отжатии — размыкаются замыкающая кнопка. Для того чтобы можно было хоть как-то наблюдать и управлять чем-то с помощью кнопки мы подключим к микроконтроллеру еще два светодиода. Схемка очень простая, вот она:.
Подключаем кнопку в микроконтроллеру Atmega8, управляющая программа Также в начало программы нужно подключить модуль avr/interrupt.h в.
AVR Урок 7. Кнопка
Подключение кнопки к avr
О том, как подать дискретный сигнал на вход микроконтроллера, я рассказывал здесь. Такой подход вполне работоспособен и будет прекрасно выполнять свою миссию, если в качестве источника сигнала будет, например, транзистор или дискретный выход другого микроконтроллера. Однако, если вы таким образом подключите к входу микроконтроллера кнопку или контакт реле, то здесь вас могут поджидать неожиданные эффекты в виде сбоев работы устройства и разных глюков. А вызваны эти эффекты будут таким явлением, как дребезг контактов.
Микроконтроллеры
ВИДЕО ПО ТЕМЕ: Опять кнопки. CodeVisionAVR
youtube.com/embed/7kyzgsZsyfU» frameborder=»0″ allowfullscreen=»»/>Подключение кнопки к AVR не должно у вас вызывать никаких трудностей. В предыдущей статье мы провели эмуляцию схемы в программе Proteus, помигали светодиодом и научились прошивать наш виртуальный микроконтроллер. Да, разумеется, это возможно. Реализуется довольно легко.
Методическое указание к лабораторной работе на учебном стенде LESO1. Для реализации взаимодействия пользователя с микропроцессорной системой используют различные устройства ввода-вывода информации.
Подключение к микроконтроллеру клавиатуры матричного типа
Резистор 10к является подтяжкой. Хотя внутри МК уже подключена внутренняя pull-up подтяжка, но всегда обычно используется дополнительно внешняя, для лучшей помехоустойчивости от наводок и ложных срабатываний. Резистор 1к защитный. Это если вдруг вывод МК по ошибке будет настроен как включенный выход и при этом нажать кнопку, то вывод сгорит. Чтобы этого не произошло и используется резистор в 1к. Но опытные радиолюбители его не используют, но помнить об этом надо. Конденсатор гасит дребезг при нажатии кнопки.
Как подключить кнопки к микроконтроллеру
Доброй ночи! Установил дрова IDE все как Подключение кнопки, удаленной на метров Добрый день!
Подключение кнопки к микроконтроллеру
Казалось бы простая тема, а однако в комментах меня завалили вопросами как подключить микроконтроллер. Как подключить к нему светодиод, кнопку, питание. Зачем нужен AVCC и все в таком духе. Итак, раз есть вопросы, значит тема не понятна и надо дать по возможности исчерпывающий ответ.
Поиск данных по Вашему запросу:
Схемы, справочники, даташиты:
Прайс-листы, цены:
Обсуждения, статьи, мануалы:
Дождитесь окончания поиска во всех базах.
По завершению появится ссылка для доступа к найденным материалам.
Содержание:
- 6. Как подключить кнопку к AVR микроконтроллеру
- Способ первый — традиционный
- AVR Урок 7. Кнопка
- Primary Menu
- Подключение кнопки к микроконтроллеру
- Подключение кнопки к AVR
- Как подключить кнопки к микроконтроллеру
- Урок 8. Ввод информации в МК. Подключение кнопки к МК BASCOM-AVR
ПОСМОТРИТЕ ВИДЕО ПО ТЕМЕ: Урок 8. Подключение кнопки к МК BASCOM-AVR
6. Как подключить кнопку к AVR микроконтроллеру
Описан простой эксперимент с подключением кнопки к AVR микроконтроллеру, разобрана не сложная программа на языке Си для обработки нажатий кнопки. Разберемся с особенностями подключения кнопки к портам МК, а также с методами считывания состояний кнопки на языке Си.
В предыдущих статьях были рассмотрены эксперименты со светодиодами, которые подключались к портам микроконтроллера, сконфигурированных на вывод Output. В этой статье мы подключим к микроконтроллеру кнопку, контакты которой при нажатии замыкаются, а при отжатии — размыкаются замыкающая кнопка. Для того чтобы можно было хоть как-то наблюдать и управлять чем-то с помощью кнопки мы подключим к микроконтроллеру еще два светодиода.
Схемка очень простая, вот она:. Как видим, к двум портам PB0 и PB1 через ограничивающие резисторы подключены два светодиода, а к порту PD2 — кнопка и она также с ограничивающим резистором. Собранная на беспаечной макетной панели схема эксперимента с микроконтроллером и кнопкой. Важно заметить что для безопасного использования порта с кнопкой, последовательно ей подключен резистор с сопротивлением на 1 КОм можно подключить и на другое сопротивление Ом — 2 КОм.
Примите это как правило хорошего тона в работе с пинами, которое обережет порт МК от выхода из строя в случае ошибочной подачи на пин высокого уровня и при замкнутой кнопке. Пины микроконтроллера являются универсальными GPIO General Purpose Input Output , к ним можно подключать как исполнительные устройства индикаторы, силовые ключи , так и разнообразные цифровые датчики кнопки, переключатели.
К каждому пину GPIO внутри микроконтроллера подключены несколько блоков и электронных компонентов, о которых полезно знать:. Для программного управления и конфигурирования каждого из портов применяются три специальных регистра, к примеру для порта «B»:. Полезно знать что пин «RESET» микросхемы у нас на схеме это пин под номером 1 , который предназначен для сброса выполнения программы микроконтроллера перезагрузки , также можно использовать для подключения кнопок, светодиодов и других устройств ввода-вывода, то есть он может быть превращен в обычный GPIO.
Это может быть полезно если у микросхемы не хватает пинов для вашей конструкции. Например при сборке какого-то устройства на чипе ATtiny13 8 выводов, 2шт — питание, 5шт — порты ввода-вывода, 1шт -для RESET у вас оказалось что не хватает одного пина для светодиода.
Здесь может быть несколько вариантов решения проблемы:. Но прежде чем это сделать нужно помнить что после данной операции перепрограммировать микроконтроллер станет возможным только с применением высоковольтного программатора на 12В , обычный USB ISP или другой программатор с питанием от 5В сделать свою работу уже не сможет. Итак, у нас есть одна кнопка и два светодиода которые подключены к микроконтроллеру, что же с ними можно сделать?
Пример реализации такого алгоритма на языке Си под AVR приведен ниже. Создадим новый файл для нашей программы и откроем его для редактирования:. Посмотреть какие фьюзы установлены в микроконтроллере можно при помощи avrdude или же графической оболочке к нему под названием AVR8 Burn-O-Mat. Вызвав подобный макрос в любом месте программы мы очень просто можем зажечь или погасить каждый из светодиодов, не придется повторять его код, что в свою очередь упростит программу и сделает ее более наглядной.
Как работать с битовыми операциями и что они значат я рассматривал в одной из недавних статей. Следующим шагом является реализация вечного цикла «while 1 » в котором мы с некоторыми задержками включаем и выключаем светодиоды, используя для этого созданные ранее макросы. Для срабатывания условия когда на пине логический ноль используем операцию логической инверсии «! Пример реализации проверки в нашей программе: «if! Дальше, используя макросы, мы гасим красный светодиод и зажигаем синий.
Теперь при помощи еще одного вечного цикла но у же с условием мы выполним ожидание до того момента, пока кнопка не будет отжата: «while! При отжатой кнопке на пине 6 появится высокий уровень это сделает внутренний подтягивающий резистор, который мы включили раньше , а в разряде PD2 регистра PIND будет установлена логическая 1. После этого выполняется трехразовое мигание включение-выключение синего светодиода с задержкой в 0,5 секунды и основной вечный цикл начинает работу по новому — будут поочередно зажигаться два светодиода.
Очень простая программа, но тем не менее, она является хорошим примером и почвой для дальнейших экспериментов. Для компиляции программы и прошивки ее в МК следует немножко перенастроить команды для сборки в интегрированной среде программирования Geany.
Идем в меню Build — Set Build Commands. В команде для прошивки МК нужно изменить тип чипа для avrdude: «-p t». Более подробно о том как настроить Geany в GNU Linux я рассматривал в одной из предыдущих статей цикла. Компиляцию, сборку и прошивку программы можно выполнить нажав в среде Geany поочередно три кнопки: «Compile», «Build» и «Run». Также все эти операции можно выполнить из консоли, вот команды для данных действий выполнять последовательно :.
Все команды почти полностью за исключением подстановок имен файлов идентичны тем, которые мы исправляли в настройках Geany. Несмотря на простоту эксперимента я также постарался осветить некоторые очень важные технические моменты работы с портами, приведенные знания и опыт будут полезны в дальнейшем изучении и работе с микроконтроллерами ATMEL.
В качестве заключения приведу видео для рассмотренного в статье примера работы с кнопкой и двумя светодиодами:. Очень хорошо. Правда, все-таки предпочтительнее вешать кнопку на прерывание, тогда в мэйне можно делать что-то другое параллельно ожиданию нажатия. Как-то муторно с этим Geany, скомпилировать, потом перегнать, потом залить.
Я даже для одного файла-исходника пишу простенький Makefile. Итого собираю и прошиваю из Emacsa да пофиг вообще из какого редактора одной горячей клавишей. Приветствую тебя Автор! Замути тему применения attiny в качестве управления питания. Пример запуск и выключение по нажатии кнопки. Переключение электрических цепей по разным условиям и т.
Подключаем кнопку к микроконтроллеру ATtiny, простая программа Описан простой эксперимент с подключением кнопки к AVR микроконтроллеру, разобрана не сложная программа на языке Си для обработки нажатий кнопки.
Принципиальная схема эксперимента Для того чтобы можно было хоть как-то наблюдать и управлять чем-то с помощью кнопки мы подключим к микроконтроллеру еще два светодиода. Схемка очень простая, вот она: Рис. Принципиальная схема эксперимента с микроконтроллером ATtiny и кнопкой. Структура портов ввода-вывода в AVR микроконтроллерах Пины микроконтроллера являются универсальными GPIO General Purpose Input Output , к ним можно подключать как исполнительные устройства индикаторы, силовые ключи , так и разнообразные цифровые датчики кнопки, переключатели.
Они используются для «гашения» кратковременных помех, скачков напряжения относительно пина и каждой из шин питания; Также между пином и GND включен конденсатор. Точно не знаю зачем он нужен, возможно для защиты от помех, для предотвращения дребезга контактов при использовании кнопок и переключателей подключенных к пину, или еще для чего-то; К каждому пину подключен электронный ключ с резистором — это подтяжка пина к напряжению источника питания Pull-UP.
Для программного управления и конфигурирования каждого из портов применяются три специальных регистра, к примеру для порта «B»: DDRB — регистр 8 бит для установки режимов работы пинов — на ввод или вывод. Осуществляется установкой соответствующих бит в регистре; PORTB — регистр для управление состоянием пинов порта в режиме вывода — высокий или низкий уровень.
Также используется в режиме ввода, применяется для включения подтягивающих резисторов Pull-UP и установки высокого уровня на входе по умолчанию; PINB — регистр, который содержит логические состояния пинов в порте, используется для чтения значений портов, которые сконфигурированы в режиме ввода.
Пин RESET в качестве порта ввода-вывода Полезно знать что пин «RESET» микросхемы у нас на схеме это пин под номером 1 , который предназначен для сброса выполнения программы микроконтроллера перезагрузки , также можно использовать для подключения кнопок, светодиодов и других устройств ввода-вывода, то есть он может быть превращен в обычный GPIO.
Здесь может быть несколько вариантов решения проблемы: Перепрограммирование пина с RESET под порт ввода-вывода; Подключение светодиода к одному из соседних уже использованных пинов, применив некоторые хистросты в схемном решении и с учетом возможности его общего использования; Использование другого МК у которого больше пинов, например ATtiny Программа на Си Итак, у нас есть одна кнопка и два светодиода которые подключены к микроконтроллеру, что же с ними можно сделать?
Перенастройка Geany для работы с микроконтроллером ATTiny Компиляция и прошивка программы в МК Компиляцию, сборку и прошивку программы можно выполнить нажав в среде Geany поочередно три кнопки: «Compile», «Build» и «Run».
Заключение Несмотря на простоту эксперимента я также постарался осветить некоторые очень важные технические моменты работы с портами, приведенные знания и опыт будут полезны в дальнейшем изучении и работе с микроконтроллерами ATMEL.
В качестве заключения приведу видео для рассмотренного в статье примера работы с кнопкой и двумя светодиодами: Начало цикла статей: Программирование AVR микроконтроллеров в Linux на языках Asembler и C. Комментарии к публикации 5 : 1 Ham 26 Декабрь
Способ первый — традиционный
Сегодня мы расширим свой кругозор по изучению работы портов микроконтроллера и изучим второе назначение порта — работу на вход. И для изучения работы на вход мы применим обычную тактовую кнопку. Как всегда, создадим проект в Atmel Studio, выберем Atmega8A, назовем проект Test04 и код также в main. В качестве подопытного порта давайте возьмём порт B. Можно с успехом использовать любой порт. И в качестве ножки возьмем нулевую ножку. Итак у нас ножка B0.
ПОДКЛЮЧЕНИЕ КНОПОК К МИКРОКОНТРОЛЛЕРУ. Аналогично подключению светодиода, для подключения кнопок к МК существуют две схемы.
AVR Урок 7. Кнопка
Резистор 10к является подтяжкой. Хотя внутри МК уже подключена внутренняя pull-up подтяжка, но всегда обычно используется дополнительно внешняя, для лучшей помехоустойчивости от наводок и ложных срабатываний. Резистор 1к защитный. Это если вдруг вывод МК по ошибке будет настроен как включенный выход и при этом нажать кнопку, то вывод сгорит. Чтобы этого не произошло и используется резистор в 1к. Но опытные радиолюбители его не используют, но помнить об этом надо. Конденсатор гасит дребезг при нажатии кнопки.
Primary Menu
В предыдущих уроках были проведены способы вывода информации из микроконтроллера: подключение светодиода и ЖК индикатора. Но как, же вводить информацию в микроконтроллер? Существует множество вариантов и устройств для этого. Но пока что рассмотрим самый простой вариант, это обычная кнопка. Кнопки бывают двух видов: тактовые и фиксирующие.
Описан простой эксперимент с подключением кнопки к AVR микроконтроллеру, разобрана не сложная программа на языке Си для обработки нажатий кнопки.
Подключение кнопки к микроконтроллеру
В этой заметке пойдет речь о считывании информации с помощью клавиш. Выводить введенную информацию будем на алфавитно-символьный ЖКИ. Предлагаю начать с самого простого. Подсоединим одну клавишу, без фиксатора, нормально разомкнутую и рассмотрим некоторые тонкости работы. Вся остальная обвязка стандартна. Первой тонкостью работы является дребезг контактов, неизбежный при использовании не специализированных кнопок.
Подключение кнопки к AVR
Обновлено Здравствуйте дорогие друзья. В этой статье пойдет речь о кнопках и методе борьбы с дребезгом. Материала в интернете куча, но каждый индивидуальный взгляд на решение вопроса увеличивает скорость понимания данного направления. Поэтому я и решил написать. Ну что ж перейдем к кнопкам. Зачем нужны кнопки?
Простейшая схема подключения Микроконтроллера AVR приведена ниже: Подключение к микроконтроллеру светодиода и кнопки.
Как подключить кнопки к микроконтроллеру
В этой статье описан вариант подключения и кнопочной клавиатуры к 6-и линиям микроконтроллера AVR. Способ не нов, по этому в излишних комментариях не нуждается. Схема подключения клавиатуры к МК представлена на рисунке ниже.
Урок 8. Ввод информации в МК. Подключение кнопки к МК BASCOM-AVR
В предыдущих уроках были проведены способы вывода информации из микроконтроллера: подключение светодиода и ЖК индикатора. Но как, же вводить информацию в микроконтроллер? Существует множество вариантов и устройств для этого. Но пока что рассмотрим самый простой вариант, это обычная кнопка. Кнопки бывают двух видов: тактовые и фиксирующие. Тактовые кнопки работают по такому принципу: нажал — контакты замкнулись, отпустил — контакты разомкнулись.
На первом уроке мы научились подавать напряжение ножкой микроконтроллера.
Речь в статье пойдет о двух разных схемах подключения большого количества кнопок к одному аналоговому входу Arduino. Принцип работы схем основан на чтении и интерпретации аналого-цифровым преобразователем микроконтроллера индивидуального напряжения, формируемого разными комбинациями отдельных участков схемы. Но принципиальные отличия и особенности работы каждой из них имеют различные алгоритмы расчета элементов и конечное поведение. Все примеры в конце, после теории. В правой схеме, наоборот, максимальное напряжение даст кнопка S1.
Методическое указание к лабораторной работе на учебном стенде LESO1. Для реализации взаимодействия пользователя с микропроцессорной системой используют различные устройства ввода-вывода информации. В самом простом случае в роли устройства ввода может выступать кнопка, представляющая собой элементарный механизм, осуществляющий замыкание-размыкание контактов под действием внешней механической силы.
— определяет количество нажатых кнопок, используя не более двух контактов Arduino
\$\начало группы\$
Представьте, что у вас есть различное количество кнопок, которые необходимо подключить к микроконтроллеру, такому как Arduino, из которых вы можете использовать максимум два контакта (не считая 5v и gnd). Каждая кнопка должна быть подключена к следующей, а общее количество проводов между ними не должно превышать 4, из которых 2 — это 5В и земля. Цель состоит в том, чтобы узнать, сколько кнопок подключено, и определить, когда и какая кнопка нажата. Кнопки не имеют фиксированного порядка; вы должны быть в состоянии изменить их положение в случае необходимости.
Мне удалось заставить его работать в определенной степени, используя резисторы 2k вместе с кнопками и измеряя сопротивление в конце. Когда я нажимаю кнопку, я считываю сопротивление до этой точки, добавляя дополнительный резистор 1 кОм перед выводом Arduino. Поэтому, если я получаю четное значение, я делю его на два и получаю общее количество кнопок. Если я получаю нечетное значение, это потому, что какая-то кнопка нажата, поэтому я делю его на два и округляю в меньшую сторону, получая положение нажатой кнопки.
Проблема в том, что я не могу одновременно получить информацию об общем количестве кнопок и о нажатой кнопке. Пока я нажимаю кнопку, я могу удалить кнопку справа, и я не могу знать. Кроме того, если я нажму две или более кнопок одновременно, будет обнаружена только нажатая крайняя левая кнопка.
Есть ли способ сделать это относительно недорогим способом, имея возможность в любой момент времени знать, сколько кнопок есть, сколько нажато и какие из них, используя максимум два штифта?
- микроконтроллер
- arduino
- схемотехника
- i2c
- spi
\$\конечная группа\$
11
\$\начало группы\$
С 8 кнопками есть 255 возможных комбинаций нажатий. Рассмотрим лестницу R-2R.
Если uC имеет 10-битный аналого-цифровой преобразователь, у вас должно быть достаточно разрешения для определения входного напряжения с точностью 1 к 255. Непрерывный опрос аналого-цифрового преобразователя и регистрация результатов будут фиксировать любое изменение состояния кнопки, независимо от того, сколько кнопок изменяют состояние одновременно. Это дает вам 255 кнопок на одном контакте.
Резисторы 0,1% дешевы, и вам нужно всего два номинала на весь диапазон. Вам понадобится очень стабильное опорное напряжение. Допуск начального значения не так критичен, потому что показание без нажатия кнопки задает шкалу напряжения. Температурный коэффициент важнее. Компания National использовала источник опорного напряжения для печи с регулируемой температурой на том же чипе. Прогревается минуту, а потом сидит как камень.
Все это было для 255 кнопок на одном выводе UC. Поскольку у вас есть 2 контакта uC, есть лучший способ.
С помощью двух контактов вы можете разделить (электрически) 8 кнопок на две группы по четыре, по одной группе на каждый контакт UC. Теперь у вас есть две 4-битные лестницы R-2R. Каждый производит 16-кратный диапазон напряжения на кнопку. Вы можете использовать резисторы 1% и гораздо менее дорогой эталон, и любой базовый встроенный 8-битный аналого-цифровой преобразователь имеет более чем достаточную точность для этого.
Две 5-битные лестницы дают вам 10 кнопок и т. д.
\$\конечная группа\$
4
\$\начало группы\$
Вы можете использовать расширитель ввода-вывода I2C с питанием 5 В.
Подключите два контакта ввода-вывода Arduino к линиям I2C SDA и SCK. Используйте питание 5 В для питания микросхемы расширения.
Что-то вроде MCP23008-E/P стоит около 1,55 доллара в Digikey.
- Каждый чип имеет 8 цифровых контактов ввода-вывода, каждый из которых может быть подключен к одному коммутатору.
- Чип имеет три адресных контакта, поэтому вы можете подключить до 8 чипов к одной шине I2C. Это позволяет распознавать до 64 переключателей.
- Чип может питаться напрямую от источника питания 5В.
\$\конечная группа\$
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie
.Кнопки в микроконтроллере PIC, как читать
Кнопка — это простой способ дать микроконтроллеру возможность ввода. Любой пользователь может нажать кнопку или переключатель, чтобы активировать определенную функцию или функцию.
В этом посте вы узнаете, как читать кнопку, чтобы включить светодиод. Эта концепция ввода и вывода, или просто «ввод/вывод», имеет важное значение для будущих проектов, поскольку многие электронные устройства работают полностью в зависимости от одного или нескольких входов.
Прежде чем читать это, вам нужно знать, как настроить MPLAB IDE и как подключить PICkit к микроконтроллеру. Если нет, сначала проверьте их. Ознакомьтесь также с другими проектами для начинающих по 8-битным микроконтроллерам PIC.
Содержание
Требования к кнопкам
Компоненты и устройства
В этом руководстве все компоненты являются сквозными.
- PIC16F628A: 1 шт.
- Светодиод любого размера и цвета: 1 шт.
- Резисторы:
- 330 Ом, 1/2 или 1/4 Вт: 1 шт.
- Любой резистор от 1 кОм до 10 кОм, 1/2 или 1/4 Вт: 2 шт.
- Кнопка, тип SPST: 2 шт.
- PIC16F628A
- Коллекция светодиодов сквозного отверстия (TH). С уважением заимствовано из Википедии. https://commons.wikimedia.org/wiki/File:Verschieden_LEDs.jpg
- Резисторы TH. Компьютерный вектор, созданный macrovector – www.freepik.com
- Кнопка SPST
Инструменты и оборудование
- Макет: 1 шт.
- PICkit (3 или 4): 1 шт.
- Адаптер питания переменного/постоянного тока на 5 В постоянного тока, не менее 500 мА: 1 шт.
- Перемычки или провода UTP: различные.
- Макет. С уважением заимствовано из Википедии. https://commons.wikimedia.org/wiki/File:400_points_breadboard.jpg
- PICkit 4
- Адаптер переменного/постоянного тока
- Перемычки. С уважением заимствовано из Википедии. https://en.wikipedia.org/wiki/File:A_few_Jumper_Wires.jpg
Схема кнопок
Делитель напряжения
Чтобы использовать кнопку, вам нужно подать соответствующий сигнал на микроконтроллер. Он поймет логическая 1 и логическая 0 (что составляет 5 В и 0 В для этого руководства соответственно), и это можно сделать с помощью делителя напряжения. Если вы не знакомы с этой темой, нажмите эту кнопку, чтобы перейти к учебнику:
Узнайте о делителях напряжения
Схема
Кнопку можно подключить к любому выводу ввода/вывода общего назначения микроконтроллера; что означает, если он не используется в другой задаче. Порт B оптимизирован для входов, поскольку он имеет специальные подтягивающие резисторы. Я раскрою эту тему в другом посте.
А пока давайте поместим наш собственный подтягивающий резистор (любое значение от 1 кОм до 10 кОм) и кнопку на контакте RB5 на макетной плате, как показано на схеме.
Поместите светодиод на контакт RB3 с резистором на макетной плате. Светодиоды имеют полярность! Убедитесь, что длинный провод подключен к выходному контакту RB3 . Соответствующий резистор 330 Ом должен быть размещен после короткого провода от светодиода и другого контакта на землю ( 0 В — отрицательный 9).0158).
Как прочитать кнопку.Фото
Несколько фото собранной схемы на макетной плате.
Код кнопок
Функция Configuration()
Как и в предыдущем уроке, мы должны установить биты конфигурации. Точный код можно найти ниже.
- Включить внутренний генератор (4МГц).
- Выключение сторожевого таймера
- Включение основного сброса, таймера включения и таймера отключения.
- Остальное пока неважно.
config(){ // КОНФИГУРАЦИЯ #pragma config FOSC = INTOSCIO // Биты выбора генератора (генератор INTOSC: функция ввода-вывода на выводе RA6/OSC2/CLKOUT, функция ввода-вывода на выводе RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Бит включения сторожевого таймера (WDT отключен) #pragma config PWRTE = ON // Бит включения таймера включения (PWRT включен) #pragma config MCLRE = ON // Бит выбора функции вывода RA5/MCLR/VPP (функция вывода RA5/MCLR/VPP — MCLR) #pragma config BOREN = ON // Бит разрешения обнаружения отключения питания (BOD включен) #pragma config LVP = OFF // Бит разрешения низковольтного программирования (вывод RB4/PGM имеет функцию цифрового ввода/вывода, для программирования необходимо использовать HV на MCLR) #pragma config CPD = OFF // Бит защиты кода памяти данных EE (защита кода памяти данных выключена) #pragma config CP = OFF // Бит защиты кода флэш-памяти программ (защита кода выключена) // После этой строки следует дополнительный код }
Конфигурация распиновки
Весь порт PORTA не используется, поэтому оставим его входным (потому что он имеет более высокое сопротивление). В качестве вывода будет использоваться только RB3 из PORTB, поэтому
TRISA=0b11111111; //Они не используются, поэтому оставьте их с '1'. ТРИСБ=0b11110111; //Только RB3 будет выходом (поэтому '0'). Оставьте остаток 1. ПОРТ=0; //Очистить порты. ПОРТБ=0;
Как использовать «пока» и «если»
Кстати, если вы не знакомы с Поток управления (если, пока, для и т. д.), пожалуйста, перейдите по этой ссылке, чтобы узнать больше, так как вы собираетесь использовать ее в этом руководстве.
Узнайте об управлении потоком
Реализация потока управления
Код должен проверять много раз в секунду, была ли нажата кнопка. Остальной код должен быть написан внутри цикла while. Обязательно поместите 1 в качестве условия; таким образом, он будет всегда выполнять код внутри него.
пока(1) { }
Как прочитать кнопку
Код должен запрашивать у микроконтроллера, была ли нажата кнопка. Откуда микроконтроллеру это известно? Проверка логического значения (либо 0 , либо 1 ) вывода, и есть регистр, чтобы узнать это.
- Если ДА , была нажата, то
- Выполнить определенное действие.
- или ничего не делать (полезно в некоторых случаях).
- Если НЕТ , не нажималась, то
- Выполнить определенное действие.
- или ничего не делать (полезно в некоторых случаях).
PORTBbits — это регистр, содержащий все 8 значений из PORTB (от RB0 до RB7 ). Чтобы узнать значение вывода RB5 , вы должны вызвать значение регистра
if (!PORTBbits.RB5)
Включим его
Так же, как проверка состояния RB5 , вы должны присвоить значение RB3 , где находится светодиод.
если (!PORTBbits. RB5) PORTBbits.RB3=1;
Давайте выключим
Когда кнопка не нажата, давайте просто выключим, хорошо? Давайте дадим значение 0 , когда условие не выполняется. Вы будете использовать инструкцию else .
если (!PORTBbits.RB5) PORTBbits.RB3=1; иначе PORTBbits.RB3=0;
Скачать код Push Button
Если вы хотите увидеть и прочитать весь код, введите свое имя и адрес электронной почты в форму ниже, чтобы скачать проект. Я обещаю, что не буду рассылать вам спам; только соответствующий контент для блога. Если вы не видите ни одной формы ниже, нажмите здесь.
Тестирование кнопки
Если вы не знаете, как скомпилировать и закодировать проект в микроконтроллер PIC, перейдите по этой ссылке на мой учебник.
Если все выполнено правильно, вы должны увидеть сообщение в нижней части окна вывода, подтверждающее, что процесс программирования завершен.
Как видно выше, светодиод включается при нажатии кнопки и выключается при ее отпускании. Миссия выполнена!
Next Chapter
Следующее руководство проведет вас через переключение транзисторов, ориентированное на микроконтроллеры PIC.
У вас есть вопрос? Какие-либо предложения? Позвольте мне знать в комментариях ниже.
Индекс содержания techZorro
Продолжайте читать!
Категория программирования
- Макросы на C, как создавать полезные псевдонимы для кода
Макросы чрезвычайно полезны для экономии времени и беспорядка при написании кода. Этот учебник включает учебные пособия по C. Нажмите здесь, чтобы прочитать.
- Switch в C, аккуратное средство для принятия множественных решений в потоке управления
В потоке управления Switch заменяет множественные «если» и объединяется в одно элегантное решение для принятия решений. Нажмите здесь, чтобы прочитать.
- Цикл While в языке C, функция «сначала спросить» в потоке управления
While in C отлично подходит для создания циклов с использованием потока управления. Это отлично подходит для повторяющихся задач и счетчиков! Нажмите здесь, что прочитать подробнее.
- Code Template, простое руководство по микроконтроллерам PIC на C
Написание программы по порядку экономит время. Загрузите сегодня шаблон кода для микроконтроллеров PIC бесплатно. Нажмите здесь, что прочитать подробнее.
Функции - на языке программирования C Функции
позволяют эффективно повторно использовать код и открывать библиотеки, созданные другими. Нажмите здесь, чтобы научиться использовать функции в C.
Вы зашли так далеко!
Спасибо, что прочитали сообщение в блоге. Ваши комментарии и предложения приветствуются. Внизу этой страницы оставьте сообщение или просто поздоровайтесь! Вся команда techZorro это оценит. Не забудьте также поделиться им в социальных сетях.
Указатель контента techZorro
Нажмите на следующую ссылку, чтобы просмотреть аналогичное содержимое в блоге в techZorro. Этот индекс поможет вам увидеть то, что вы ищете, с высоты птичьего полета.
Информационный бюллетень techZorro!
Если вам понравился этот пост в блоге, подпишитесь на информационный бюллетень techZorro, чтобы не пропустить ни одного поста в блоге!
Нравится:
Нравится Загрузка…
Откройте для себя радость понимания электроники
24 мая 2019 г.• tutorial
В этой статье мы обсудим простой вопрос о том, как считывать состояние кнопки с помощью микроконтроллера. Как мы можем проверить, нажата кнопка или нет? Каковы распространенные ловушки?
Вы можете сказать, что это не очень интересный проект сам по себе, и я это понимаю. Но я также убежден, что разбить более сложный проект на небольшие удобоваримые части — отличная идея для глубокого понимания темы. Таким образом, позже, в более сложных проектах, мы сможем сосредоточиться на интересных вещах, не отвлекаясь. Итак, поехали!
Что такое кнопка?
В посте прошлой недели мы узнали о различных видах кнопок и переключателей, некоторые из которых вы можете увидеть на изображении выше. Сегодня мы попытаемся понять , как считывать кнопку (обведена оранжевым на изображении выше) с помощью микроконтроллера .
Кнопка имеет только два состояния: ее можно нажать или отпустить. Есть и другие переключатели с большим ходом (например, поворотный энкодер), но мы оставим это на другой день. Все, что мы хотим: наш микроконтроллер должен замечать, когда мы нажимаем кнопку.
Здесь вы можете увидеть кнопку, которую мы хотим использовать, и ее схему:
Схема нашей простой тестовой схемы
Для конкретики давайте взглянем на тестовую схему, которую мы хотим построить. Вот он:
Он построен на основе PIC16F627A , который мы уже использовали в руководстве по миганию светодиодов, но основы, которые мы рассмотрим в этом руководстве, могут быть применены к любому микроконтроллеру PIC. Так что, если вы хотите использовать другой контроллер, вы можете продолжить чтение 🙂
Давайте рассмотрим основы схемы, шаг за шагом:
- Символы питания +5V и GND не компоненты, а просто символы. Все, что подключено к символу +5V, должно быть подключено к положительной клемме источника питания +5V, а все, что подключено к символам GND, должно быть подключено к клемме заземления. Иногда удобнее использовать несколько символов +5V и GND, потому что это избавляет нас от прорисовки ненужных лишних полос на принципиальной схеме, что делает ее менее читаемой. Дайте мне знать, если вы найдете это запутанным, мы можем раскрыть эту тему в следующем посте, если хотите 🙂
- С этим покончено, давайте сосредоточимся на более интересных вещах! 🙂 Вывод RB0 подключен к кнопке и к резистору 4,7кОм. Если кнопка нажата, контакт RB0 подключается к земле. Если кнопку отпустить, RB0 подключается к +5В через резистор. Подробнее об этом позже.
- Существует также светодиод , подключенный к порту RB3, и это точно такая же схема, которую мы использовали в нашем руководстве по миганию светодиодов несколько недель назад. Мы будем использовать светодиод для индикации состояния кнопки.
- Важно, чтобы контакт MCLR (основной сброс) также был подключен к +5 В, потому что в противном случае PIC16F627A будет постоянно перезагружаться и никогда не запустится. Мы говорили о функции штифта MCLR в нашем уроке по pic-flash, посмотрите, если хотите 🙂
Теперь мы знаем, как выглядит схема. Давайте теперь поймем и это !
Логические уровни: буквально 101 цифровая схема
Два состояния кнопки дискретны. Что я имею в виду? Между ними нет ничего! Либо его толкают, либо отпускают. Нет такой вещи, как половинчатый. В электронике такие дискретные состояния еще называют логическими уровнями .
Логические уровни имеют два состояния, традиционно обозначаемые как 0 или 1. Вы также можете представить их как ВЫКЛ или ВКЛ, или НИЗКИЙ и ВЫСОКИЙ. Цифровые схемы, такие как схемы микроконтроллеров, работают почти исключительно с такими сигналами, и это объясняет каламбур в заголовке этого раздела.
Важное сообщение: +5V называется 1 или HIGH -level, а GND называется 0 или LOW -level.
Подтягивающий и подтягивающий резисторы
Теперь, когда мы знаем, что микроконтроллеры работают с логическими уровнями, мы понимаем, зачем нужно вставлять в схему резистор R1 !
Скажем на секунду, что мы этого не делали. Тогда схема будет выглядеть так:
И действительно, если вы нажмете кнопку, то на контакте RB0 будет НИЗКИЙ уровень (потому что он соединен с землей). Но что, если кнопка остается открытой? Ну, тогда входы просто плавают! И это плохо, т.к. плавающий вход не имеет определенного логического уровня который будет сбивать с толку микроконтроллер.
Вот почему мы добавляем на схему резистор R1:
Когда кнопка разомкнута, резистор R1 подключает контакт RB0 к +5В. Вот почему мы называем это pullup-resistor : поднимает логический уровень до ВЫСОКОГО.
Хорошо, но зачем нам резистор R1? спросите вы. И правда, если кнопка разомкнута, то ситуация точно такая же: пин RB0 будет подключен напрямую к +5В.
Но что происходит, когда вы нажимаете кнопку? Тогда +5В будет подключено напрямую к GND, что является коротким замыканием! Короткое замыкание — это смерть любой цепи, и мы должны избегать его любой ценой. Нет ничего, что ограничивало бы ток, протекающий от +5 В к земле, что приводило к перегреву и возможной гибели электроники. Итак, еще раз, вот правильная схема, и я надеюсь, что смог убедить вас, что это имеет смысл:
Значение подтягивающего резистора не очень критично. Для цепей 5 В часто используется значение 4,7 кОм, но вы также можете использовать вместо него 10 кОм. Все, что ниже 4,7 кОм, не является хорошей идеей, потому что тогда ток, протекающий через резистор, будет излишне высоким.
Наконец, вы, конечно, можете использовать подтягивающий резистор . Что это? Это почти та же идея! Единственное отличие состоит в том, что подтягивающие резисторы соединяют вход PIC с землей, а затем вы устанавливаете переключатель между +5 В и входным контактом. Совершенно не важно, какой вариант вы выберете. Если вам интересно: в этом руководстве мы выбираем вариант подтягивания, потому что многие PIC-контроллеры имеют внутренние подтягивающие резисторы , которые могут включаться автоматически, так что нам больше не нужен внешний резистор. Об этом мы поговорим ниже.
Цифровой вход для микроконтроллера PIC
Как мы видели в нашей первой программе некоторое время назад, микроконтроллеры необходимо программировать. Кодекс говорит им, что делать. Микроконтроллеры имеют много контактов, которые можно настроить либо как выходы , либо как входы . В руководстве по светодиодному миганию мы подключили светодиод к одному контакту RB3, настроили его как выход и заставили подключенный светодиод мигать.
Теперь скажем PIC16f627A обрабатывать RB0 как вход. Это довольно просто, мы должны установить так называемый tristate -register в значение 1:
TRISB0 = 1;
Помните, что в нашей первой программе, когда мы хотели, чтобы контакт был выходом, мы должны были вместо этого установить регистр с тремя состояниями в 0. Легко запомнить:
- Настройка пинты как ввода : регистр с тремя состояниями установлен в 1 («1» выглядит как «I» в I ввод)
- Настройка пинты как вывода : регистр с тремя состояниями установлен в 0 («0» выглядит как «O» в O вывода)
Затем мы можем определить аббревиатуру для порта RB0, чтобы сделать код более читаемым пользователем:
#define SW RB0
Имейте в виду, что «SW» — это аббревиатура от «switch», но вы, конечно, можете использовать любую другую аббревиатуру, какую захотите.)
Теперь мы хотим узнать, нажата ли кнопка. Как мы это делаем? Нам нужны эти строки:
if (!SW) { // сделай что-нибудь }
Вы заметили «!» знак? Этот инвертирует результат считывания SW. Если SW равен 1, то !SW равен 0, а если SW равен 0, то !SW равен 1. Звучит запутанно, но все, что он делает, это переключает 0 на 1 и 1 на 0.
Нам нужно использовать «!» потому что, когда кнопка нажата, вход будет НИЗКИМ (потому что кнопка соединяет вход с землей). Если мы хотим вместо этого реагировать на отпускание кнопки, мы пишем вместо этого:
если (ПО) { // сделай что-нибудь }
Наконец, есть хороший способ зафиксировать как нажатую, так и отпущенную кнопку. Это работает так:
if (!SW) { // делаем что-то, когда кнопка нажата } еще { // делаем что-то еще, когда кнопка отпущена }
Полный исходный код
Итак, вот полный исходный код во всей красе:
/* * Файл: main.c * Автор: бос * * Создано 23 мая 2019 г., 21:58 */ // НАСТРОЙКА #pragma config FOSC = INTOSCIO // Биты выбора генератора (генератор INTOSC: функция ввода-вывода на выводе RA6/OSC2/CLKOUT, функция ввода-вывода на выводе RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Бит включения сторожевого таймера (WDT отключен) #pragma config PWRTE = OFF // Бит включения таймера включения (PWRT отключен) #pragma config MCLRE = ON // Бит выбора функции вывода RA5/MCLR/VPP (функция вывода RA5/MCLR/VPP — MCLR) #pragma config BOREN = ON // Бит разрешения обнаружения отключения питания (BOD включен) #pragma config LVP = OFF // Бит разрешения низковольтного программирования (вывод RB4/PGM имеет функцию цифрового ввода/вывода, для программирования необходимо использовать HV на MCLR) #pragma config CPD = OFF // Бит защиты кода памяти данных EE (защита кода памяти данных выключена) #pragma config CP = OFF // Бит защиты кода флэш-памяти программ (защита кода выключена) #includeh> # определить ПО RB0 # определить светодиод RB3 # определить _XTAL_FREQ 4000000 недействительным основным (недействительным) { // RB0 — вход ТРИСБ0 = 1; // RB3 — это выход ТРИСБ3 = 0; в то время как (1) { если (!SW) { светодиод = 1; } еще { светодиод = 0; } } возвращаться; }
Дебаунсинг: что это такое и зачем вам это?
Пока что все, что делает наша программа, — это напрямую отображает состояние кнопки с помощью светодиода. Нажмите кнопку, загорится светодиод. Отпустите кнопку, и светодиод погаснет. Это не очень реалистичное приложение.
Обычно кнопки используются для передачи некоторой информации в контроллер. Когда вы устанавливаете время на своей микроволновой печи, а сейчас 9 утра, вам нужно девять раз нажать кнопку часов, чтобы перевести часы с 12 до 9.являюсь.
Рассмотрим следующую схему (на этот раз с подтягивающим резистором вместо подтягивающего резистора, просто так):
При нажатии кнопки S1 PIC-INPUT подключается к +5В. В противном случае он подключается к GND через подтягивающий резистор. Представьте теперь, что вы нажимаете кнопку в реальной жизни, удерживаете ее и очень внимательно следите за сигналом на этикетке PIC-INPUT . Вы увидите что-то вроде этого:
Зеленая линия – сигнальный или логический уровень. Мы видим, что при нажатии на кнопку она прыгает! Это называется подпрыгиванием , и это происходит потому, что механический переключатель внутри кнопки вибрирует, когда кнопка нажата. Это очень быстрый процесс и длится всего около 0,5-1 миллисекунды. Не все кнопки подпрыгивают, но большинство из них. Это невидимо для человеческого глаза, но наши быстрые электронные схемы сбиваются с толку.
Это настоящая проблема: подумайте еще раз о своей микроволновой печи. Когда вы нажимаете кнопку только один раз (как на графике выше), вы хотите увеличить часы с 13:00, скажем, до 14:00. Но что произойдет? Глядя на приведенную выше диаграмму, вы видите, что одно нажатие кнопки на самом деле регистрируется как более чем одно, в данном случае как три нажатия кнопки!
Противодействие этому дребезгу называется устранение дребезга , кто бы мог подумать 🙂 Есть много способов сделать это, и на эту тему есть две отличные статьи на All About Circuits и The Lab Book Pages.
В этом руководстве мы сосредоточимся на вопросе , как устранить дребезг коммутатора с помощью программного обеспечения .
Устранение дребезга в программном обеспечении
На самом деле, устранение дребезга в программном обеспечении довольно простое. Но не будем забегать вперед. Во-первых, нам нужно немного изменить программу, чтобы в первую очередь стала необходимой вся эта штука с устранением дребезга.
Вышеупомянутое программное обеспечение просто отображает состояние кнопки на светодиоде. Если кнопка нажата, светодиод загорается. Если кнопку оставить отпущенной, светодиод не горит. Таким образом, даже если есть подпрыгивание, мы никогда его не увидим: светодиод будет просто очень быстро мигать, а затем перестанет гореть после того, как мы отпустим кнопку, и подпрыгивание будет завершено.
Итак, я написал другую программу. Он делает следующее:
- В начале светодиод выключен.
- Каждое нажатие кнопки меняет состояние светодиода.
Задумайтесь на секунду. Это немного другая программа, чем раньше, и теперь нам действительно нужна антидребезговая .
Хорошо, но как это реализовать? Это очень просто 🙂 Ключевое наблюдение заключается в том, что подпрыгивание происходит очень быстро, поэтому нам просто нужно игнорировать очень быстрые изменения кнопок! Как мы скажем нашему PIC сделать это?
Вот соответствующий код (полный код ниже):
в то время как (1) { // переключить статус // (но только при нажатии кнопки // И когда прошло достаточно времени с момента последнего нажатия кнопки ) если ((!SW) && (SW_debounce == 0)) { статус = !статус; } // если кнопка активна, устанавливаем буфер если (!SW) { SW_debounce = 100; } // управляем светодиодом если (статус) { светодиод = 1; } еще { светодиод = 0; } // устранение дребезга если (SW_debounce > 0) { SW_debounce--; } }
Давайте пройдемся по строчкам и объясним основную мысль!
- Строки 1 и 27 составляют основной цикл, который выполняется снова и снова.
- Строки 3-8 реагируют на нажатие кнопки. Переменная
status
содержит состояние светодиода. Выражениеstatus = !status;
инвертирует значение переменной, что мы и хотим, чтобы нажатие кнопки делало, ничего особенного. - Строки 15-20 довольно стандартны и просто отображают содержимое
статус
переменная на светодиод. - Строки 11-13 важны для устранения дребезга. Помните, что вначале переменная буфера
SW_debounce
имеет нулевое значение. Однако всякий раз, когда кнопка нажимается, она устанавливается на 100. Затем второе нажатие кнопки (из-за подпрыгивания) не будет зарегистрировано программным обеспечением, потому что второе условие в строке 6 (SW_debounce == 0
) больше не выполняется. . - Если бы не строки 22-25, мы бы зашли в тупик, потому что больше никогда не сможем переключать светодиод. Помните, что внутренняя частота работы составляет 4 МГц, что соответствует примерно одному миллиону операций в секунду (вы должны делить на четыре по техническим причинам). Каждый раз, когда основной цикл проходит, в конце мы вычитаем 1 из переменной буфера 9.0616 SW_debounce . После ста циклов переменная буфера возвращается к нулю, и программное обеспечение может снова реагировать на нажатие кнопки.
- Мы надеемся, что к тому времени, когда программа снова сможет реагировать, фаза дребезга кнопок уже закончилась. Таким образом мы можем научить контроллер игнорировать подпрыгивание. Число 100 выбирается методом проб и ошибок. Когда вы работаете с переключателями, просто немного поиграйте с этим числом. Это зависит от вашего коммутатора (некоторые из них имеют смехотворно долгое время возврата), а также от скорости работы. Если вы запускаете свою программу на низкой частоте в несколько кГц, значение 100 может сделать вашу программу слепой к нажатиям кнопок на пару секунд!
Дайте мне знать, понятно ли вам это объяснение. Если вам непонятно, я постараюсь объяснить это лучше в следующий раз 🙂 Вот полный код:
/* * Файл: main. c * Автор: бос * * Создано 23 мая 2019 г., 22:13 */ // НАСТРОЙКА #pragma config FOSC = INTOSCIO // Биты выбора генератора (генератор INTOSC: функция ввода-вывода на выводе RA6/OSC2/CLKOUT, функция ввода-вывода на выводе RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Бит включения сторожевого таймера (WDT отключен) #pragma config PWRTE = OFF // Бит включения таймера включения (PWRT отключен) #pragma config MCLRE = ON // Бит выбора функции вывода RA5/MCLR/VPP (функция вывода RA5/MCLR/VPP — MCLR) #pragma config BOREN = ON // Бит разрешения обнаружения отключения питания (BOD включен) #pragma config LVP = OFF // Бит разрешения низковольтного программирования (вывод RB4/PGM имеет функцию цифрового ввода/вывода, для программирования необходимо использовать HV на MCLR) #pragma config CPD = OFF // Бит защиты кода памяти данных EE (защита кода памяти данных выключена) #pragma config CP = OFF // Бит защиты кода флэш-памяти программ (защита кода выключена) #include# определить ПО RB0 # определить светодиод RB3 # определить _XTAL_FREQ 4000000 недействительным основным (недействительным) { // RB0 — вход ТРИСБ0 = 1; // RB3 — это выход ТРИСБ3 = 0; // переменная состояния, которую мы хотим переключать нажатием кнопки инт статус = 0; // вспомогательная переменная устранения дребезга интервал SW_debounce = 0; в то время как (1) { // переключить статус // (но только при нажатии кнопки // И когда прошло достаточно времени с момента последнего нажатия кнопки ) если ((!SW) && (SW_debounce == 0)) { статус = !статус; } // если кнопка активна, устанавливаем буфер если (!SW) { SW_debounce = 100; } // управляем светодиодом если (статус) { светодиод = 1; } еще { светодиод = 0; } // устранение дребезга если (SW_debounce > 0) { SW_debounce--; } } возвращаться; }
Используйте внутренние подтягивающие резисторы
Многие микроконтроллеры PIC имеют внутренние подтягивающие резисторы . Их можно включить или выключить, установив определенный бит в программном обеспечении. Для PIC16F627A они включаются так:
nRBPU = 0;
Да, это включает их. Почему нам нужно установить его на ноль, чтобы включить их? Это техническая особенность, но вы можете сказать это по названию бита конфигурации. Это не RBPU , а скорее nRBPU , где «n» означает «отрицательный».
И, говоря об аббревиатурах, RBPU расшифровывается как Port B Pull-Up . Обратите внимание, что мы не указали, для какого входного контакта мы включили подтягивания! Это связано с тем, что RBPU обеспечивает подтягивание каждого входного контакта на ПОРТУ B (ПОРТ B — это совокупность всех контактов RB0, RB1, RB2, RB3, RB4, RB5, RB6, RB7).
Но подождите, разве это не портит наш светодиод на порту RB3? вы можете удивиться. Нет, RBPU влияет только на те контакты, которые настроены как входы. Поскольку мы настроили контакт RB3 как выход, он остается неизменным.
Это довольно изящно, потому что теперь мы можем опустить подтягивающий резистор. Окончательная оптимизированная схема выглядит так:
Я перечислил окончательный исходный код, устанавливающий внутренние подтяжки и поставляемый с программным устранением дребезга, в приложении. Приведенная выше схема является наиболее идеальной, которую мы можем построить с помощью PIC16F627A, потому что она использует наименьшее количество внешних компонентов, и в будущем мы будем видеть такую схему бесчисленное количество раз 🙂
Что теперь?
Поздравляем, вы сделали это! Надеюсь, я смог объяснить, как подключить кнопку и как ее прочитать с помощью микроконтроллера. Если что-то было неясно, пожалуйста, дайте мне знать, и я сделаю все возможное, чтобы улучшить презентацию 🙂
Мы, наконец, готовы покинуть стадию учебников и теперь полностью готовы к тому, чтобы начать думать о реальных проектах! Дайте мне знать, если у вас есть идеи или предложения. Спасибо за чтение!
Приложение: Программное устранение дребезга с включенными внутренними подтягиваниями
/* * Файл: main.c * Автор: бос * * Создано 24 мая 2019 г., 00:05 */ // НАСТРОЙКА #pragma config FOSC = INTOSCIO // Биты выбора генератора (генератор INTOSC: функция ввода-вывода на выводе RA6/OSC2/CLKOUT, функция ввода-вывода на выводе RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Бит включения сторожевого таймера (WDT отключен) #pragma config PWRTE = OFF // Бит включения таймера включения (PWRT отключен) #pragma config MCLRE = ON // Бит выбора функции вывода RA5/MCLR/VPP (функция вывода RA5/MCLR/VPP — MCLR) #pragma config BOREN = ON // Бит разрешения обнаружения отключения питания (BOD включен) #pragma config LVP = OFF // Бит разрешения низковольтного программирования (вывод RB4/PGM имеет функцию цифрового ввода/вывода, для программирования необходимо использовать HV на MCLR) #pragma config CPD = OFF // Бит защиты кода памяти данных EE (защита кода памяти данных выключена) #pragma config CP = OFF // Бит защиты кода флэш-памяти программ (защита кода выключена) #include