Устройство и работа портов ввода-вывода микроконтроллеров AVR. Часть 4

от автора

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

Изучив данный материал, в котором все очень детально и подробно описано с большим количеством примеров, вы сможете легко овладеть и программировать порты ввода/вывода микроконтроллеров 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);     }	  	   }  } 

ссылка на оригинал статьи http://habrahabr.ru/post/256269/


Комментарии

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

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