Урок 8. Ввод информации в МК. Подключение кнопки к МК BASCOM-AVR
В предыдущих уроках были проведены способы вывода информации из микроконтроллера: подключение светодиода и ЖК индикатора. Но как, же вводить информацию в микроконтроллер? Существует множество вариантов и устройств для этого. Но пока что рассмотрим самый простой вариант, это обычная кнопка. Кнопки бывают двух видов: тактовые и фиксирующие. Тактовые кнопки работают по такому принципу: нажал – контакты замкнулись, отпустил – контакты разомкнулись. Следует учесть, что существуют тактовые кнопки, которые изначально замкнуты, а при нажатии размыкаются. Фиксирующие кнопки (их иногда называют: тумблеры, выключатели, переключатели) в отличии от тактовых фиксируют своё положение при нажатии, то есть: нажал – контакты замкнулись, еще раз нажал – контакты разомкнулись. В общем, с кнопками разобрались, теперь будем разбираться, как подключить эти кнопки к микроконтроллеру. А подключить на самом деле очень даже просто! Смотрим схему:
Возможно, вы спросите: Зачем резистор R1? А затем, что без резистора R1, когда кнопка S1 будет разомкнута, микроконтроллер на порте, к которому всё это подключено, будет видеть то логическую 1, то логический 0 тем самым будут производиться ложные срабатывания кнопки.
Пример:
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, скачать можно в архиве ниже. Работа в схемы в симуляторе Proteus:
Скачать файлы для урока (проект в Proteus, исходник, прошивка) вы можете ниже
Урок 9. Работа с АЦП на примере ATtiny13 в BASCOM-AVR
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
IC1 | МК AVR 8-бит | ATtiny13 | 1 | Поиск в магазине Отрон | В блокнот | |
R1, R2 | Резистор | 4. 7 кОм | 2 | Поиск в магазине Отрон | В блокнот | |
R3 | Резистор | 150 Ом | 1 | Поиск в магазине Отрон | В блокнот | |
HL1 | Светодиод | 1 | Поиск в магазине Отрон | В блокнот | ||
Bat1 | Элемент питания | 3 Вольт | 1 | Поиск в магазине Отрон | В блокнот | |
Добавить все |
Скачать список элементов (PDF)
Прикрепленные файлы:
- mc127.rar (16 Кб)
Теги:
- Микроконтроллер
- AVR
- Proteus
- BASCOM-AVR
Урок 8.
Ввод информации в МК. Подключение кнопки к МК BASCOM-AVR « схемопедияВ предыдущих уроках были проведены способы вывода информации из микроконтроллера: подключение светодиода и ЖК индикатора. Но как, же вводить информацию в микроконтроллер? Существует множество вариантов и устройств для этого. Но пока что рассмотрим самый простой вариант, это обычная кнопка. Кнопки бывают двух видов: тактовые и фиксирующие. Тактовые кнопки работают по такому принципу: нажал – контакты замкнулись, отпустил – контакты разомкнулись. Следует учесть, что существуют тактовые кнопки, которые изначально замкнуты, а при нажатии размыкаются. Фиксирующие кнопки (их иногда называют: тумблеры, выключатели, переключатели) в отличии от тактовых фиксируют своё положение при нажатии, то есть: нажал – контакты замкнулись, еще раз нажал – контакты разомкнулись. В общем, с кнопками разобрались, теперь будем разбираться, как подключить эти кнопки к микроконтроллеру. А подключить на самом деле очень даже просто! Смотрим схему:
Возможно, вы спросите: Зачем резистор R1? А затем, что без резистора R1, когда кнопка S1 будет разомкнута, микроконтроллер на порте, к которому всё это подключено, будет видеть то логическую 1, то логический 0 тем самым будут производиться ложные срабатывания кнопки.
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
Просто, не правда ли? Итак, теперь попробуем реализовать подключение кнопки к микроконтроллеру в “железе”.
Алгоритм работы программы такой: кнопка 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, скачать можно в архиве ниже. Работа в схемы в симуляторе Proteus:
Видео работы:
Скачать файлы для урока (проект в Proteus, исходник, прошивка)
Автор: Яковлев Александр Вячеславович (г.Витебск, Беларусь)
Микроконтроллер— Как определить нажатие кнопки между вызовами функции цикла MCU?
\$\начало группы\$В настоящее время у меня есть несколько кнопок, подключенных через сдвиговый регистр I2C к MCU. Супер просто, так что не уверен, что ему нужна схема, но я могу поделиться ею (и любыми другими деталями), если это необходимо. У меня есть гибкий подход к тому, что MCU я могу использовать, предложения приветствуются.
MCU проверяет состояние кнопки каждые n мс. Проблема в том, что если пользователь нажимает кнопку слишком быстро, между функцией цикла MCU нажатие кнопки не обнаруживается. Одним из временных решений является увеличение скорости контура, но это не очень энергоэффективно и только уменьшает проблему. Даже с более быстрым циклом все еще можно пропустить импульс от нажатия кнопки при достаточно быстром нажатии, поскольку MCU имеет ограничения по скорости, особенно если он выполняет какую-то интенсивную операцию, тогда задержка цикла непредсказуемо увеличивается.
Мысли вслух, возможно, бессвязные: я подумал, может быть, мне стоит использовать защелку. Я подозреваю, что есть способ получить хороший баланс между аппаратным обеспечением и прошивкой без чрезмерного усложнения. Мне кажется, что если я хочу использовать кнопку для простого тумблера, то проще использовать защелку, а не триггер. Если триггер — лучший вариант, какая разница, D или JK? Или положительный/родной край? Или есть способ вообще избежать использования триггера и позволить микроконтроллеру делать всю работу?
Редактировать: Кажется, переключение также можно выполнить с помощью микросхемы таймера.
Редактировать 2: Не могу поверить, что я забыл упомянуть об этом, но я использую PCF8574.
- микроконтроллер
- триггер
- сдвиговый регистр
- кнопка
- защелка
Решение 1. Прерывание контакта
Расширитель ввода-вывода PCF8574 имеет контакт прерывания ( INT
), который является открытым стоком и должен быть подключен к нагрузочному резистору. Подключите его к свободному контакту на MCU и часто проверяйте его, используя таймер с высоким разрешением. Когда на выводе расширителя ввода-вывода установлен низкий уровень, запросите состояние расширителя ввода-вывода от MCU.
При использовании менее сложного сдвигового регистра (например, 74HC595) подключите все кнопки к одному и тому же выводу прерывания на MCU через диод. Как и выше, когда состояние этого вывода изменяется, опрашивается сдвиговый регистр.
Кредит: Энди, он же
Редактировать: Но это полезно, только если мощность очень мала (спасибо @TonyM за указание на это).
Решение 2. Таймер прерывания
Другим решением является использование таймера прерывания для более регулярного опроса сдвигового регистра, чтобы другой работающий код в основном цикле не задерживал обнаружение переключения.
Кредит: TonyM
\$\конечная группа\$ 2Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google Зарегистрироваться через Facebook Зарегистрируйтесь, используя электронную почту и парольОпубликовать как гость
Электронная почтаТребуется, но никогда не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
микроконтроллер — определяет, сколько кнопок нажато, используя не более двух контактов Arduino
\$\начало группы\$Представьте, что у вас есть различное количество кнопок, которые необходимо подключить к микроконтроллеру, такому как Arduino, из которых вы можете использовать максимум два контакта (не считая 5v и gnd). Каждая кнопка должна быть подключена к следующей, а общее количество проводов между ними не должно превышать 4, из которых 2 — это 5В и земля. Цель состоит в том, чтобы узнать, сколько кнопок подключено, и определить, когда и какая кнопка нажата. Кнопки не имеют фиксированного порядка; вы должны быть в состоянии изменить их положение в случае необходимости.
Мне удалось заставить его работать в определенной степени, используя резисторы 2k вместе с кнопками и измерив сопротивление в конце. Когда я нажимаю кнопку, я считываю сопротивление до этой точки, добавляя дополнительный резистор 1 кОм перед выводом Arduino. Поэтому, если я получаю четное значение, я делю его на два и получаю общее количество кнопок. Если я получаю нечетное значение, это потому, что какая-то кнопка нажата, поэтому я делю его на два и округляю в меньшую сторону, получая положение нажатой кнопки.
Проблема в том, что я не могу одновременно получить информацию об общем количестве кнопок и о нажатой кнопке. Пока я нажимаю кнопку, я могу удалить кнопку справа, и я не могу знать. Кроме того, если я нажму две или более кнопок одновременно, будет обнаружена только нажатая крайняя левая кнопка.
Есть ли способ сделать это относительно недорогим способом, имея возможность в любой момент времени знать, сколько кнопок есть, сколько нажато и какие из них, используя максимум два контакта?
- микроконтроллер
- arduino
- схемотехника
- i2c
- spi
С 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 цифровых контактов ввода-вывода, каждый из которых может быть подключен к одному коммутатору.
- Микросхема имеет три адресных контакта, поэтому на одну шину I2C можно установить до 8 микросхем. Это позволяет распознавать до 64 переключателей.
- Чип может питаться напрямую от источника питания 5В.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google Зарегистрироваться через Facebook Зарегистрируйтесь, используя электронную почту и парольОпубликовать как гость
Электронная почтаТребуется, но никогда не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.