Подключение кнопки к линии порта ввода/вывода

Изучив данный материал, в котором все очень детально и подробно описано с большим количеством примеров, вы сможете легко овладеть и программировать порты ввода/вывода микроконтроллеров AVR.


Пример будем рассматривать на микроконтроллере 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)


  1. Tutanhomon
    21.04.2015 15:56
    +1

    А как же упомянуть про то, что подтягивающий резистр обычно встроен в контролле, и его можно программно включить?
    + Хорошо бы упомянуть про т.н. «дребезг контактов», для полноты картины.


    1. expert_av Автор
      22.04.2015 08:19

      Подтягующий резистор встроенный в микроконтроллер программно нужно включать или выключать… об этом написано в первой части статьи…
      Что касается дребезга контактов, то это отдельная и очень большая тема, так как видов защит от дребезка контактов много: апаратная, программная через задержку, программная через таймер…


  1. VT100
    21.04.2015 22:00

    Сопротивление резистора не должно быть слишком маленьким, чтобы ток, текущий через него при замкнутых контактах кнопки не был слишком большим. Обычно используют значения порядка 10-100 кОм.

    Также — оно не должно быть слишком большим, что-бы происходила «самоочистка» контакта кнопки.
    Например, для кнопок производства «Omron» чётко указано минимальное значение коммутируемого тока.