Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Соберём следующую схему, см. рис.7. На нем изображено подключение кнопки без фиксации
к пину D3 с подтягивающим резистором 10 килоом к
плюсу питания. Из схемы подключения видно, что на
пине D3 находится логическая единица если кнопка не
нажата, и – логический ноль если нажата. Напишем
программу считывающую нажатие кнопки и
включающую или выключающую светодиод на
встроенном пине D13. Определимся с
микроконтроллером. Пусть это будет ATmega328p, тогда
D13 соответствует PB5, а D3 – PD3. Таким образом нам
нужно настроить пятый бит порта B на ВЫХОД и третий
бит порта D на вход. У микроконтроллеров ATmega328p
и ATmega2560 порты B, C, D и соответствующие им
имена регистров и бит совпадают. Поэтому
воспользуемся рисунком 4. Команда
DDRB |= (1<<DDB5);
Рис.7. Подключение кнопки с установит PB5 как ВЫХОД.
подтягивающим резистором Команда
к +5В. DDRD &= ~(1<<DDD3);
установит PD3 как ВХОД. Для считывания состояния
пина PD3 нужно использовать регистр (см. рис. 4) PIND, а вернее его третий бит PIND3.
Команда
PIND&(1<<PIND3)
позволит понять, какой уровень сигнала (высокий или низкий) находится на пине PD3.
Разберем ее подробно. Операция 1<<PIND3 сдвинет единицу на третью позицию (считая от
нуля) и мы получим следующее двоичное число 0b00001000, затем применим побитовую
операцию логического И с восьмибитным регистром PIND
0b----x---
& 0b00001000
0b0000x000
Нас интересует состояние только третьего бита регистра PIND, которое мы обозначили как
x, значения всех остальных бит нам неважно (поэтому стоят прочерки). После применения
побитового & в ответе получим двоичное число либо 1000 либо 0 (нули на старших разрядах
опущены). Таким образом если на пине присутствует логический ноль, то мы получим число
0, если – логическая единица, то получаем некоторое число больше нуля. Слово некоторое
означает, что если бы мы считывали второй бит, то получили бы 100, если бы пятый, то –
10000 и тому подобные числа. В языке С++ число 0 определяется как логическое FALSE, а
любое другое число не равное нулю как TRUE. Поэтому справедлива следующая
конструкция
if (PIND&(1<<PIND3)){
//кнопка не нажата
}
else{
//кнопка нажата
}
Так получается потому что при нажатии на кнопку мы устанавливаем логический ноль на
пине D3. Окончательно имеем следующую программу
prog5
prog6
Обратите внимание, что если закомментировать седьмую строчку, то prog6 не будет работать
со схемой, собранной по рисунку 9.
Дребезг кнопки
Для того, чтобы понять, что такое дребезг, соберем очень простую схему с Arduino, кнопкой
и светодиодом. При нажатии на кнопку светодиод должен включаться, если он был
выключен. При следующем нажатии на кнопку светодиод должен гаснуть. Схема
подключения представлена на рис.9.
prog7
prog8
Видим, что кроме золотой полоски еще имеется три (возможный вариант -
четыре). Последовательность трех полос слева направо следующая:
красная, красная, коричневая.
Смотрим в таблицу: первая красная полоска соответствует цифре «2»,
вторая – цифре «2», а третья, коричневая, множителю «10».
Таким образом имеем следующую комбинацию:
2210,
которая соответствует значению 220 Ом.
Золотая полоска означает точность изготовления резистора, т.е. 5%. Это
соответствует 2200,05=11 Ом, т.е. наш резистор может быть в пределах от 220-
11 до 220+11 Ом, другими словами, сопротивление резистора лежит от 209 до
231 Ома.
Если бы у нас был резистор с четырьмя полосками, то третья полоса
соответствовала бы цифре, а не множителю. В частности, иногда используется
следующий резистор
Задание.
Рассчитать номинал следующего
резистора