Подключение кнопки к линии порта ввода/вывода
Изучив данный материал, в котором все очень детально и подробно описано с большим количеством примеров, вы сможете легко овладеть и программировать порты ввода/вывода микроконтроллеров AVR.
Пример будем рассматривать на микроконтроллере ATMega8.
Программу писать будем в Atmel Studio 6.0.
Эмулировать схему будем в Proteus 7 Professional.
Самой распространенной задачей при создании проектов для микроконтроллеров является подключение кнопок. Несмотря на простоту, эта задача имеет существенные, возможно и неочевидные особенности.
Если подключить один из контактов кнопки, например, к общему проводу («земле»), а второй к выбранной линии порта ввода/вывода микроконтроллера, который переключен в режим «Вход», то выяснится, что такой метод не работает. При нажатии кнопки линия порта микроконтроллера соединяется с землей, и программа будет считывать лог.«0» с этой линии порта ввода/вывода, но при отпущенной кнопке вывод микроконтроллера не будет соединен ни с чем, что часто и называют «висит в воздухе». В таком случае программа будет считать с вывода и лог.«0» и лог.«1» случайным образом, так как на не к чему не присоединённую линию порта ввода/вывода будут наводится наводки.
Правильное подключение предполагает, что в разомкнутом состоянии вывод микроконтроллера должен быть соединен через резистор, например с шиной питания, а в замкнутом — с землей, либо наоборот. Сопротивление резистора не должно быть слишком маленьким, чтобы ток, текущий через него при замкнутых контактах кнопки не был слишком большим. Обычно используют значения порядка 10-100 кОм.
Рис: Подключения кнопки с подтянутой шиной питания.
При таком подключении состояние линии порта ввода вывода будет:
— при отжатой кнопке равно лог.«1»;
— при нажатой кнопке равно лог.«0»;
Рис: Подключения кнопки с подтянутой землей.
При таком подключении состояние линии порта ввода вывода будет:
— при отжатой кнопке равно лог.«0»;
— при нажатой кнопке равно лог.«1»;
— подключения к линии порта ввода/вывода кнопки с подтянутой шиной питания:
— подключения к линии порта ввода/вывода кнопки с подтянутой землей:
Изучив данный материал, в котором все очень детально и подробно описано с большим количеством примеров, вы сможете легко овладеть и программировать порты ввода/вывода микроконтроллеров AVR.
- Часть 1. Работа портов ввода/вывода
- Часть 2. Подключение светодиода к линии порта ввода/вывода
- Часть 3. Подключение транзистора к линии порта ввода/вывода
- Часть 4. Подключение кнопки к линии порта ввода/вывода
Пример будем рассматривать на микроконтроллере ATMega8.
Программу писать будем в Atmel Studio 6.0.
Эмулировать схему будем в Proteus 7 Professional.
Самой распространенной задачей при создании проектов для микроконтроллеров является подключение кнопок. Несмотря на простоту, эта задача имеет существенные, возможно и неочевидные особенности.
Если подключить один из контактов кнопки, например, к общему проводу («земле»), а второй к выбранной линии порта ввода/вывода микроконтроллера, который переключен в режим «Вход», то выяснится, что такой метод не работает. При нажатии кнопки линия порта микроконтроллера соединяется с землей, и программа будет считывать лог.«0» с этой линии порта ввода/вывода, но при отпущенной кнопке вывод микроконтроллера не будет соединен ни с чем, что часто и называют «висит в воздухе». В таком случае программа будет считать с вывода и лог.«0» и лог.«1» случайным образом, так как на не к чему не присоединённую линию порта ввода/вывода будут наводится наводки.
Правильное подключение предполагает, что в разомкнутом состоянии вывод микроконтроллера должен быть соединен через резистор, например с шиной питания, а в замкнутом — с землей, либо наоборот. Сопротивление резистора не должно быть слишком маленьким, чтобы ток, текущий через него при замкнутых контактах кнопки не был слишком большим. Обычно используют значения порядка 10-100 кОм.
Рис: Подключения кнопки с подтянутой шиной питания.
При таком подключении состояние линии порта ввода вывода будет:
— при отжатой кнопке равно лог.«1»;
— при нажатой кнопке равно лог.«0»;
Рис: Подключения кнопки с подтянутой землей.
При таком подключении состояние линии порта ввода вывода будет:
— при отжатой кнопке равно лог.«0»;
— при нажатой кнопке равно лог.«1»;
— подключения к линии порта ввода/вывода кнопки с подтянутой шиной питания:
// Подключаем внешние библиотеки
#include <AVR/io.h>
#include <stdint.h>
// Основная программа
int main(void)
{
// Настраиваем порты ввода/вывода
DDRB = 0b11111111; //Настраиваем все разряды порта B на режим "Выход"
PORTB = 0b00000000; //Устанавливаем все разряды порта B в лог.«0» (На выходе порта напряжение равное GND)
DDRD = 0b00000000; //Настраиваем все разряды порта D на режим "Вход"
PORTD = 0b11111111; //Устанавливаем все разряды порта D в лог.«1» (На выходе порта напряжение равное Vcc)
// Вечный цикл
while (1)
{
//Проверяем: если состояние PD0 лог.«0» то кнопка нажата
if ((PIND&(1 << PD0)) == 0)
{
//Состояние PB0 устанавливаем в лог.«1»
PORTB |= (1 << PB0);
}
else
{
//Состояние PB0 устанавливаем в лог.«0»
PORTB &= ~(1 << PB0);
}
}
}
— подключения к линии порта ввода/вывода кнопки с подтянутой землей:
// Подключаем внешние библиотеки
#include <AVR/io.h>
#include <stdint.h>
// Основная программа
int main(void)
{
// Настраиваем порты ввода/вывода
DDRB = 0b11111111; //Настраиваем все разряды порта B на режим "Выход"
PORTB = 0b00000000; //Устанавливаем все разряды порта B в лог.«0» (На выходе порта напряжение равное GND)
DDRD = 0b00000000; //Настраиваем все разряды порта D на режим "Вход"
PORTD = 0b11111111; //Устанавливаем все разряды порта D в лог.«1» (На выходе порта напряжение равное Vcc)
// Вечный цикл
while (1)
{
//Проверяем: если состояние PD0 лог.«1» то кнопка нажата
if ((PIND&(1 << PD0)) == 1)
{
//Состояние PB0 устанавливаем в лог.«1»
PORTB |= (1 << PB0);
}
else
{
//Состояние PB0 устанавливаем в лог.«0»
PORTB &= ~(1 << PB0);
}
}
}
Комментарии (3)
VT100
21.04.2015 22:00Сопротивление резистора не должно быть слишком маленьким, чтобы ток, текущий через него при замкнутых контактах кнопки не был слишком большим. Обычно используют значения порядка 10-100 кОм.
Также — оно не должно быть слишком большим, что-бы происходила «самоочистка» контакта кнопки.
Например, для кнопок производства «Omron» чётко указано минимальное значение коммутируемого тока.
Tutanhomon
А как же упомянуть про то, что подтягивающий резистр обычно встроен в контролле, и его можно программно включить?
+ Хорошо бы упомянуть про т.н. «дребезг контактов», для полноты картины.
expert_av Автор
Подтягующий резистор встроенный в микроконтроллер программно нужно включать или выключать… об этом написано в первой части статьи…
Что касается дребезга контактов, то это отдельная и очень большая тема, так как видов защит от дребезка контактов много: апаратная, программная через задержку, программная через таймер…