понедельник, 26 марта 2018 г.

Немного о портах ввода-вывода

 Очень часто новички из-за недостатка знаний не могут сделать элементарных вещей.
Я попытаюсь немного помочь разобраться с портами ввода-вывода.

 Итак, с++ AVR как считать данные с порта.

Для начала определимся, что нам нужно. Например, нам нужно знать, есть питание на ножке микроконтроллера или нет. Как узнать есть ли логическая единица на ножке микроконтроллера?
Опростить ножку и она нам всё сама расскажет. Не она, конечно, а регистр..

Итак, пример для Attiny13a:

На 6-той ножке есть у нас некая кнопка. Нам надо узнать, нажата она или нет.
Первое: как настроить ножку как вход? А этого не нужно, она по умолчанию настроена на вход. В регистре DDRB нули, а именно он отвечает за то, чем занимаются ножки микроконтроллера - вводом или выводом.
Если мы определяем кнопку - то стоит ножку подтянуть резистором на землю, и через другой резистор и через кнопку подавать 5 вольт - питание микроконтроллера. Итак, кнопка нажата - есть 5 вольт, не нажата - нету.
 Предполагается, что наличие 5-ти вольт должно запустить некий процесс. Итак, код

if(PINB&(1<<1))
{
   //что-то делаем, если есть на ножке 6 5-ть вольт
}else{
//что-то делаем, если нету 5-ти вольт
}


Выражение 
(PINB&(1<<1)) проверяет, что находиться на ножке. мы так же можем загнать то, что там находиться, в переменную

unsigned char peremennaya = 
(PINB&(1<<1));
Значение peremennaya будет либо 0 либо 1. В микроконтроллерах avr чтение порта - это чтение регистра, который отвечает за порт. Чтение состояния ножки - это сдвиг битов регистра до бита необходимой нам ножки.

Конструкция if-else вытаскивает с ножки её состояние и исходя из того, верно оно или нет
(true или false, тоесть 1 или 0) принимает решение какую часть кода выполнять.
Вот так на C++ можно посмотреть есть ли 1 на ножке микроконтроллера.