1,4K подписчиков

Работа с цифровым сигналом на ATtiny10. Управление светодиодом. Подключение кнопки

198 прочитали

Здравствуйте, уважаемые читатели! Сегодня хочу подробнее рассказать о работе с портами ввода вывода на ATtiny10. В статье "Программирование ATtiny10 с помощью USBasp программатора" я уже рассказывал о том, как установить библиотеку для работы с ATtiny10 в среде Arduino IDE. В сегодняшней статье разберем, как работать с цифровым сигналом, непосредственно обращаясь к регистрам микроконтроллера. Т.е. отправлять и принимать цифровой сигнал на различные порты ATtiny10.

Как работать с цифровым сигналом на ATtiny10
Как работать с цифровым сигналом на ATtiny10

Откроем сначала размещенный в примерах библиотеки скетч Blink, всё назначение которого мигать раз в секунду, подключенным к порту PB0 светодиодом. Выглядит он следующим образом:

Стандартный скетч Blink
Стандартный скетч Blink

Я перепишу этот скетч в другом виде, чтобы он был более понятен широкому кругу читателей. Заодно и прокомментирую код. Те строки кода, которые отмечены как комментарии, являются альтернативным вариантом осуществления той же самой операции. Ссылки на все скетчи будут в конце статьи.

Видоизмененный скетч Blink
Видоизмененный скетч Blink

Вначале постоянной F_CPU укажем текущую частоту работы микроконтроллера. Частота у нас 1МГц, т.е. 1000000 Герц. UL после цифр указывают, что число относится к типу Unsigned Long. Т.е. беззнаковое число типа Long.

Далее добавим 2 библиотеки: стандартная библиотека AVR для работы с портами ввода вывода и библиотека для работы с таймерами, которая дает нам удобную функцию delay(), задающую паузу в миллисекундах.

В функции setup() мы так же в начале записываем в регистр DRRB единицу. Тем самым назначая порт PB0 на работу с выходным сигналом. Только удобнее записывать в двоичной системе, т.к. сразу понятнее, какому порту, какое значение мы присвоили. У нас их всего четыре. Последний бит, это PB0, далее справа налево PB1, PB2 и PB3. Ноль означает, что порт работает на вход, единица - на выход.

Ниже представлен второй вариант задания регистра DRRB. Кому как нагляднее.

В функции loop() мы записываем в регистр PORTB значения, которые соответствуют высокому (1) и низкому уровню сигнала (0). Соответственно, последний бит это у нас порт PB0, и записывая в него единицу мы включаем светодиод.

Далее пауза в 1 секунду.

И в этот же самый регистр PORTB записываем байт с нулем на конце, тем самым подавая низкий уровень сигнала на ножку PB0 микроконтроллера и отключая светодиод.

Данную операцию можно записать всего с помощью 2 строк где мы каждую секунду просто инвертируем значения регистра PORTB, включая и отключая светодиод. Вернее менять мы так будем сигнал сразу на всех цифровых портах ввода-вывода. А вот, чтобы менять сигнал только на одном нужном нам порту PB0 (или любом другом), можно воспользоваться последним закомментированным блоком функции loop().

Результат работы скетча, можно посмотреть в размещенном внизу статьи видео.

Чтение цифрового сигнала

Теперь перейдем к чтению цифрового сигнала. Для примера, добавим к схеме со светодиодом кнопку. Разместим кнопку на макетной плате и подключим одну из ее ножек к 3-й ножке ATtiny10, которая у нас PB1.

Соседнюю ножку, с которой и будет происходить замыкание при нажатии кнопки, подключим к плюсу. Чтобы при нажатии получать на порту PB1 логическую единицу. О подключении кнопки я подробно рассказывал в статье "Кнопки и Ардуино. Подключение, управление, скетч для работы".

Подключение кнопки к ATtiny10 с использованием внешнего подтягивающего резистора

В первом варианте будем использовать внешний подтягивающий резистор. В результате, у нас получается вот такая схема:

Подключение кнопки к ATtiny10 с использованием внешнего подтягивающего резистора
Подключение кнопки к ATtiny10 с использованием внешнего подтягивающего резистора

Теперь перейдем к скетчу. Начало я ставлю такое же, как и в прошлом скетче мигания светодиода. Функция _delay_ms() в данном скетче не используется, так что вторую из подключаемых библиотек можно убрать. Но если мы захотим добавить функционал обработки долгого нажатия, то библиотека пригодится. Так что подключение библиотеки delay.h можно оставить. Всё равно, пока мы не используем функции подключаемой библиотеки, скетч больше места в памяти микроконтроллера не занимает.

Скетч для работы ATtiny10 с кнопкой с использованием внешнего подтягивающего резистора
Скетч для работы ATtiny10 с кнопкой с использованием внешнего подтягивающего резистора

В функции setup () PB0 работает на выход, остальные, в том числе и порт PB1, к которому подключена кнопка, работают на вход.

Далее, в функции loop() объявляем булеву переменную buttonPress, которая будет равна единице, если кнопка нажата и 0, если нет.

Значение переменной мы присваиваем с помощью битовой операции. Данная операция означает, что нам нужно взять значение текущего логического уровня у первого порта, т.е. PB1.

А далее следует условие. Если buttonPress у нас будет равно единице, то светодиод загорится. А если нулю, светодиод погаснет.

Подключение кнопки к ATtiny10 с использованием внутреннего подтягивающего резистора

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

Подключение кнопки к ATtiny10 с использованием внутреннего подтягивающего резистора
Подключение кнопки к ATtiny10 с использованием внутреннего подтягивающего резистора

Убираем с макетной платы резистор на 10 кОм, а вместо питания, подключаем кнопку к минусу. Т.к. к питанию подключен внутренний подтягивающий резистор микросхемы.

Немного видоизменяем скетч:

Скетч для работы ATtiny10 с кнопкой с использованием внутреннего подтягивающего резистора
Скетч для работы ATtiny10 с кнопкой с использованием внутреннего подтягивающего резистора

В функцию setup() добавляем строку

PUEB = 0b0010;

Данной строкой мы подключает внутренний подтягивающий резистор к порту PB1.

И в функции loop(), в условии, значение buttonPress нужно инвертировать по сравнению с прошлым скетчем, т.к. кнопка подключена теперь к земле, а не к питанию и 0 будет означать, что кнопка нажата и 1, что не нажата.

Результаты работы всех трех скетчей можно посмотреть в размещенном ниже видео:

Скетч мигания светодиодом - https://disk.yandex.ru/d/_jEM4Vc5TWUM5g

Скетч с кнопкой и внешним подтягивающим резистором - https://disk.yandex.ru/d/NuHEV8YSt0UkIA

Скетч с кнопкой и внутренним подтягивающим резистором - https://disk.yandex.ru/d/bvVtkRjnvb2fTQ

_________________________________________________________

Спасибо, что дочитали до конца! Если статья понравилась, нажмите, пожалуйста, соответствующую кнопку. Если интересна тематика электроники и различных электронных самоделок, подписывайтесь на канал. До встречи в новых статьях!

Другие публикации по теме:

  • Работа с аналоговым сигналом на ATtiny10. ШИМ. Подключение потенциометра и управление яркостью светодиода
  • Самый маленький AVR микроконтроллер – ATtiny10. Как можно применить?
  • Программирование ATtiny10 с помощью USBasp программатора
  • USBasp программатор. Обзор, установка драйвера, прошивка микроконтроллера
  • Обновление прошивки USBasp программатора