В предыдущих уроках были проведены способы вывода информации из микроконтроллера: подключение светодиода и ЖК индикатора. Но как, же вводить информацию в микроконтроллер? Существует множество вариантов и устройств для этого. Но пока что рассмотрим самый простой вариант, это обычная кнопка. Кнопки бывают двух видов: тактовые и фиксирующие. Тактовые кнопки работают по такому принципу: нажал – контакты замкнулись, отпустил – контакты разомкнулись. Следует учесть, что существуют тактовые кнопки, которые изначально замкнуты, а при нажатии размыкаются. Фиксирующие кнопки (их иногда называют: тумблеры, выключатели, переключатели) в отличии от тактовых фиксируют своё положение при нажатии, то есть: нажал – контакты замкнулись, еще раз нажал – контакты разомкнулись. В общем, с кнопками разобрались, теперь будем разбираться, как подключить эти кнопки к микроконтроллеру. А подключить на самом деле очень даже просто! Смотрим схему:
Возможно, вы спросите: Зачем резистор R1? А затем, что без резистора R1, когда кнопка S1 будет разомкнута, микроконтроллер на порте, к которому всё это подключено, будет видеть то логическую 1, то логический 0 тем самым будут производиться ложные срабатывания кнопки. Чтобы этого не происходило необходимо этот порт “подтягивать” сопротивлением к плюсу питания. Сопротивление резистора R1 может быть в интервале от 4,7кОм до 10кОм. С резистором получается такая картина: кнопка S1 нажата – на порте МК возникает логический 0, кнопка S1 не нажата – на порте МК возникает логическая 1 за счёт сопротивления R1. Конечно, нужно знать, что в некоторых AVR микроконтроллерах есть встроенные подтягивающие резисторы сопротивление порядка 50кОм, по умолчанию они отключены. В BASCOM-AVR эти резисторы можно включить, записав в необходимый порт логическую 1. Но я крайне не рекомендую использовать эти встроенные, гораздо надёжнее использовать внешние, как показано на схеме выше. Ну что, со схематическим решением разобрались, теперь будем разбираться программно. Для работы с кнопкой сначала нужно сконфигурировать порт микроконтроллера на вход, в BASCOM-AVR это делается вот так:
Config
(порт микроконтроллера) = input
Пример:
Config PINB.3 = input
Обратите внимание, что для работы порта на вход, имя порта должно начинаться с PIN, а не с PORT как для конфигурации порта на выход!
После конфигурации порта на вход мы можем считать с него значение 1 или 0, в нашем случае 0 – кнопка нажата, 1 – кнопка не нажата. А проверить, что кнопка нажата, мы можем так:
If
(порт микроконтроллера) = 0 then
(если кнопка нажата, то выполняем, действия описанные здесь)
End if
Можно и наоборот, проверить, не нажата ли кнопка:
If
(порт микроконтроллера) = 1 then
(если кнопка не нажата, то выполняем, действия описанные здесь)
End if
Пример:
If PINB.3 = 0 then
PORTB.2 = 1 "если кнопка нажата, то включаем светодиод подключенный к PB.2
End if
Просто, не правда ли? Итак, теперь попробуем реализовать подключение кнопки к микроконтроллеру в “железе”. За основу возьмём микроконтроллер Attiny13 и для него сделанную немного ранее. Для того кто не делал отладочную плату, вот схема:
Алгоритм работы программы такой: кнопка S1 нажата – светодиод не горит, кнопка S1 не нажата – светодиод горит. А вот и сама программа на BASCOM-AVR:
$regfile = "attiny13.dat" $crystal = 8000000 Config Pinb.3 = Input Config Portb.2 = Output Do If Pinb.3 = 0 Then Portb.2 = 0 If Pinb.3 = 1 Then Portb.2 = 1 Loop End
Вот такая простая программа. Скомпилированная прошивка находится в архиве ниже. Фьюз биты можно не выставлять, так как в такой простой программе тактовая частота не особо важна. Для ленивых собирать в железе есть проект в нашем любимом , скачать можно в архиве ниже. Работа в схемы в симуляторе Proteus:
Скачать файлы для урока (проект в , исходник, прошивка) вы можете ниже
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
IC1 | МК AVR 8-бит | ATtiny13 | 1 | В блокнот | ||
R1, R2 | Резистор | 4.7 кОм | 2 | В блокнот | ||
R3 | Резистор | 150 Ом | 1 | В блокнот | ||
HL1 | Светодиод | 1 |
О том, как подать дискретный сигнал на вход микроконтроллера, я рассказывал . Такой подход вполне работоспособен и будет прекрасно выполнять свою миссию, если в качестве источника сигнала будет, например, транзистор или другого микроконтроллера.
Однако, если вы таким образом подключите к входу микроконтроллера кнопку или контакт реле, то здесь вас могут поджидать неожиданные эффекты в виде сбоев работы устройства и разных глюков. А вызваны эти эффекты будут таким явлением, как дребезг контактов .
В этой статье я расскажу о том, как устранить дребезг контактов, подключаемых к микроконтроллера. Но сначала (для тех, кто слышит это словосочетание впервые), расскажу непосредственно о том, что же такое этот самый дребезг контактов.
Дребезг контактов возникает во время замыкания или размыкания контактов. Посмотрите на рисунок:
Изначально контакт разомкнут.
Когда мы начинаем замыкать контакт (нажимаем на кнопку), то замыкание происходит не сразу.
Это нам кажется, что мы нажали на кнопку мгновенно. Однако на самом деле, если растянуть время достаточно сильно, по получится, что мы нажимаем кнопку постепенно. На механическом контакте надо обеспечить достаточное усилие, чтобы он окончательно замкнулся, а контакты, как правило, пружинят, и поэтому какое-то время контакт находится в переходном процессе. То есть быстро-быстро замыкается-размыкается.
Если мы включаем этой кнопкой лампочку, то мы не заметим этот переходный процесс. Нам будет казаться, что лампочка сразу включилась после нажатия кнопки.
Однако быстродействие микроконтроллера таково, что он заметит все (или почти все) замыкания-размыкания переходного процесса. Это будет означать, что программа микроконтроллера столько раз отреагирует на сигнал от кнопки, сколько раз будет изменяться сигнал во время переходного процесса.
А мы то ожидаем, что одно нажатие кнопки - это одно переключение входа микроконтроллера. Но на самом деле это не так. Потому что дребезг контактов вносит свою лепту в усложнение жизни инженеров.
Представьте, что наши кнопки - это клавиатура телефона. Мы нажимаем цифру 8, подразумевая, что эта цифра будет набрана телефоном один раз. Но телефон вместо этого набирает 5 или 10 восьмёрок, потому что разработчики телефона не удосужились предусмотреть защиту от дребезга контактов. Станете вы пользоваться таким телефоном?
Ну и напоследок надо сказать, что время дребезга контактов зависит от качества контактов, и обычно составляет от 10 до 100 мс.
Устранение дребезга контактов
Думаю, уже не надо объяснять, что в случае, если к входам вашего микроконтроллера подключены механические контакты, то ваше устройство должно как-то бороться с дребезгом контактов.
Есть два способа борьбы с дребезгом контактов:
- Аппаратный
- Программный
Аппаратное подавление дребезга контактов
Аппаратное подавление дребезга - это схемные решения, которые позволяют устранить этот неприятный эффект. Чаще всего это простая RC-цепь, или вообще только один конденсатор.
Принцип работы такой схемы простой: конденсатору требуется какое-то время для зарядки (или разрядки). А пока он полностью не зарядится, на вход микроконтроллера не поступит нужный сигнал. Этого времени хватает на то, чтобы переходный процесс успел завершиться. Таким образом и выполняется подавление дребезга.
Простая схема устранения дребезга контактов приведена на рисунке:
Номиналы элементов приблизительные. По идее надо их рассчитывать для каждого отдельного случая. Но в большинстве случаев они вполне подойдут.
Есть и более сложные схемы подавления дребезга контактов, которые не требуют расчёта, потому что выполняются на цифровых элементах. Например, схема на RS-триггере. Но в устройствах на микроконтроллерах использовать подобные ухищрения нет смысла.
Программное подавление дребезга контактов
Если уж мы используем микроконтроллер, то в подавляющем большинстве случаев нет смысла усложнять схему устройства и встраивать в неё элементы устранения дребезга. Потому что проще и дешевле организовать программное подавление дребезга.
Использовать аппаратное подавление дребезга в устройствах на микроконтроллерах имеет смысл только в очень редких случаях. Например, если микроконтроллер маломощный и даже малейшее расходование его ресурсов не на основную задачу нежелательно.
Самое простое и самое распространённое программное решение для борьбы с дребезгом - это временная задержка. Алгоритм простой:
- При изменении уровня сигнала на входе на противоположный включаем таймер (например, на 100 миллисекунд).
- После истечения задержки проверяем сигнал. Если он остался изменённым, то считаем, что кнопка нажата (или отпущена - в зависимости от того, какое изменение сигнала обнаружено). Если же он вернулся в исходное состояние, то считаем это помехой и не реагируем на сигнал.
Бывают особые случаи, когда быстрое переключение контактов - это обычное состояние системы. Ну например, если есть какой-то датчик, который по логике работы не может принимать фиксированное значение на длительное время. То есть идёт как бы непрерывный дребезг контактов. И в этом бесконечном потоке нам надо как-то определить, какой же всё-таки сигнал на входе.
В этом случае можно применить следующий алгоритм:
- Посчитать количество и/или продолжительность замкнутого и разомкнутого состояния контакта в единицу времени (например, в секунду).
- По наибольшему количеству (или времени) определить конечное состояние сигнала.
Например, если за секунду на входе у нас 50 раз была логическая 1, и 20 раз - логический 0, то можно считать, что на входе единица. Разумеется, здесь нужен индивидуальный подход в зависимости от задачи.
Примеры исходных кодов приводить здесь не буду, потому как статья эта не о программировании. Если кому интересно, то способы подключения разных устройств к микроконтроллеру можно найти .
Подключение питания.
Микроконтроллер часто применяется в аппаратуре, где его напряжение питания может оказаться ниже оптимального. В качестве источников питания могут использоваться батареи, выпрямители переменного тока с фильтрами, генераторы постоянного тока. Это означает, что микроконтроллерам приходится работать с разными значениями входных сигналов и взаимодействовать с устройствами, работающими с различными логическими уровнями. Поэтому микроконтроллеры специально проектируются для использования в таких суровых условиях, которые для многих других электронных устройств являются неприемлемыми.
К счастью, большинство микроконтроллеров нормально работают в широком диапазоне внешних условий. Единственное, на что следует обратить внимание при разработке приложения, - это развязка питающего напряжения. Как правило, для развязки используется танталовый конденсатор емкостью 0,1мкФ, который подключается как можно ближе выводам питания. Этот конденсатор обеспечит повышенный выходной ток при переходных процессах, предохраняя аппаратуру отложных сбросов и искажения данных. Таким образом простое включение конденсатора избавит вас от множества проблем.
При любом применении микроконтроллера важно быть уверенным, что он работает в допустимых окружающих условиях. Запуск микроконтроллера должен иметь место только тогда, когда установилось требуемое напряжение питания.
Как правило, устройства, использующие микроконтроллеры, должны начинать работу при включении питающего напряжения. Чтобы быть уверенным, что запуск микроконтроллера произойдет, когда напряжение питания достигло заданного стабильного значения, используют схему, показанную на рис.2. 10.
В этой схеме сигнал RESET на входе микроконтроллера становится активным (принимает значение логического 0) приблизительно через 22 мс (время задержки Td = 2,2 RC) после включения питания. Этого времени достаточно для стабилизации напряжения питания и установки требуемой частоты тактового генератора прежде, чем начнет работать микроконтроллер.
Кнопка RESET используется в процессе разработки устройства для сброса микроконтроллера в начальное состояние. При отладке устройства очень полезно иметь возможность выполнения сброса, чтобы обеспечить повторный запуск микроконтроллера. Резистор сопротивлением 100 Ом, который включен последовательно с конденсатором, служит для ограничения тока разряда конденсатора в момент сброса (заряженный конденсатор является источником большого тока, когда он закорачивается на «землю»). Эта схема может быть использована для запуска микроконтроллеров, у которых сигнал RESET имеет высокий активный уровень (например, микроконтроллер 8051), путем инвертирования напряжения на конденсаторе (например, с помощью микросхемы типа 7404).
Рис. 2.10 - Схема формирования сигнала запуска RESET.
Для некоторых микроконтроллеров можно удалить RC-цепь в схеме запуска, так как внутри них имеется схема, обеспечивающая задержку включения (пуск тактового генератора и начало выполнения первой команды программы). В этом случае схема запуска может быть упрошена, как показано на рис. 2.11. Посмотрев на эту схему, вы, возможно, подумаете, что схему можно еще более упростить, просто подключив вывод RESET к шине питания Vdd. Это верно, но использовать такое включение следует только после того, как схема будет полностью отлажена. Однако при этом целесообразно включить токоограничивающий резистор, чтобы иметь возможность повторного запуска путем закорачивания вывода RESET на «землю».
Эти схемы сброса лучше всего использовать в случаях, когда гарантировано поддержание напряжения питания в рабочем диапазоне. Для питания многих устройств используются батареи, напряжение которых падает с течением времени. По мере падения напряжения могут возникать нарушения в работе устройства, так как напряжение отключения для одних приборов достигается раньше, чем для других.
Для решения этой проблемы существуют устройства - мониторы питания, которые следят за уровнем напряжения Vcc/Vdd. Если это напряжение падает ниже определенного уровня (обычно 4.5В), то вырабатывается сигнал RESET. Как правило, такие мониторы питания содержат схему задержки и работают аналогично описанной выше RC-схеме запуска. Они монтируются в такой же корпус, как трехвыводной транзистор.
Рис. 2.11 - Модифицированная схема RESET.