Site Loader

Урок 8. Ввод информации в МК. Подключение кнопки к МК BASCOM-AVR

В предыдущих уроках были проведены способы вывода информации из микроконтроллера: подключение светодиода и ЖК индикатора. Но как, же вводить информацию в микроконтроллер? Существует множество вариантов и устройств для этого. Но пока что рассмотрим самый простой вариант, это обычная кнопка. Кнопки бывают двух видов: тактовые и фиксирующие. Тактовые кнопки работают по такому принципу: нажал – контакты замкнулись, отпустил – контакты разомкнулись. Следует учесть, что существуют тактовые кнопки, которые изначально замкнуты, а при нажатии размыкаются. Фиксирующие кнопки (их иногда называют: тумблеры, выключатели, переключатели) в отличии от тактовых фиксируют своё положение при нажатии, то есть: нажал – контакты замкнулись, еще раз нажал – контакты разомкнулись. В общем, с кнопками разобрались, теперь будем разбираться, как подключить эти кнопки к микроконтроллеру. А подключить на самом деле очень даже просто! Смотрим схему:

Возможно, вы спросите: Зачем резистор 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, скачать можно в архиве ниже. Работа в схемы в симуляторе 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 тем самым будут производиться ложные срабатывания кнопки.

Чтобы этого не происходило необходимо этот порт “подтягивать” сопротивлением к плюсу питания. Сопротивление резистора 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, скачать можно в архиве ниже. Работа в схемы в симуляторе Proteus:

Видео работы:

Скачать файлы для урока (проект в Proteus, исходник, прошивка)

Автор: Яковлев Александр Вячеславович (г.Витебск, Беларусь)

Микроконтроллер

— Как определить нажатие кнопки между вызовами функции цикла MCU?

\$\начало группы\$

В настоящее время у меня есть несколько кнопок, подключенных через сдвиговый регистр I2C к MCU. Супер просто, так что не уверен, что ему нужна схема, но я могу поделиться ею (и любыми другими деталями), если это необходимо. У меня есть гибкий подход к тому, что MCU я могу использовать, предложения приветствуются.

MCU проверяет состояние кнопки каждые n мс. Проблема в том, что если пользователь нажимает кнопку слишком быстро, между функцией цикла MCU нажатие кнопки не обнаруживается. Одним из временных решений является увеличение скорости контура, но это не очень энергоэффективно и только уменьшает проблему. Даже с более быстрым циклом все еще можно пропустить импульс от нажатия кнопки при достаточно быстром нажатии, поскольку MCU имеет ограничения по скорости, особенно если он выполняет какую-то интенсивную операцию, тогда задержка цикла непредсказуемо увеличивается.

Мысли вслух, возможно, бессвязные: я подумал, может быть, мне стоит использовать защелку. Я подозреваю, что есть способ получить хороший баланс между аппаратным обеспечением и прошивкой без чрезмерного усложнения. Мне кажется, что если я хочу использовать кнопку для простого тумблера, то проще использовать защелку, а не триггер. Если триггер — лучший вариант, какая разница, D или JK? Или положительный/родной край? Или есть способ вообще избежать использования триггера и позволить микроконтроллеру делать всю работу?

Редактировать: Кажется, переключение также можно выполнить с помощью микросхемы таймера.

Редактировать 2: Не могу поверить, что я забыл упомянуть об этом, но я использую PCF8574.

  • микроконтроллер
  • триггер
  • сдвиговый регистр
  • кнопка
  • защелка
\$\конечная группа\$

11

\$\начало группы\$

Решение 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
\$\конечная группа\$

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.

  1. Каждая микросхема имеет 8 цифровых контактов ввода-вывода, каждый из которых может быть подключен к одному коммутатору.
  2. Микросхема имеет три адресных контакта, поэтому на одну шину I2C можно установить до 8 микросхем. Это позволяет распознавать до 64 переключателей.
  3. Чип может питаться напрямую от источника питания 5В.
\$\конечная группа\$

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

alexxlab

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *