Как стать программистом Как устроен компьютер. Что такое программа. Как написать свою программу. И многое другое узнаете вы из этой книги. Получить бесплатно! |
Самое простое устройство на микроконтроллере
Микроконтроллеры / Создание устройств /
Разработка устройств на микроконтроллерах
Возможно, вы уже научились чему-то в теме программирования микроконтроллеров. Возможно, вы уже можете написать программу для простого устройства типа бегущих огней новогодней гирлянды. Однако аппетит приходит во время еды. И наверняка вам хочется чего-то большего. Наверняка вам хочется шагнуть на уровень профессионала. Ну хотя бы на первую ступеньку... Подробнее... |
До сих пор я выдавал вам общие сведения о микроконтроллерах, отрывки из документации, иногда немного говорил о программировании. Но ещё ни разу не приводил примеров устройств на микроконтроллерах. А ведь именно в этом весь смысл обучения - в создании собственных устройств.
Так что с этой статьи я начинаю исправлять положение дел, и буду рассказывать именно о создании устройств с примерами схем, программ и т.п. Рассказы будут для начинающих. Как всегда буду стараться, чтобы понятно было даже людям, далёким от электроники и программирования. И первый пример будет настолько простым, насколько это вообще возможно…
Пример устройства на микроконтроллере
Итак, наше первое устройство на микроконтроллере будет не простым, а очень простым. И хотя сделать какой-то полезный прибор с наипростейшей схемой и наипростейшей программой крайне сложно, я всё-таки постараюсь. Конечно, эта полезность будет весьма сомнительной, но всё-таки применить это устройство можно будет не только для обучения, но и на практике (конечно, скорее как игрушку, но всё же).
Для опытов возьмём один из самых дешёвых микроконтроллеров - ATtiny13A, о котором я уже немало поведал на этом сайте.
Самая простая схема на микроконтроллере
Наше первое устройство, можно сказать, почти не будет делать ничего полезного. Но зато оно очень простое и новичкам будет проще разобраться как со схемотехникой, так и с программой микроконтроллера.
Итак, наше устройство - это простейшая сигнализация. Если вход микроконтроллера замкнут, то на выходе ноль. Если вход разомкнуть, то на выходе, к которому подключен светодиод, появится сигнал. Светодиод включится, и это будет означать, что сигнализация сработала.
Конечно, это всё достаточно примитивно. Однако в давние времена, когда я занимался (в том числе) и обслуживанием систем сигнализации, мы использовали такие самодельные “датчики”. Например, обматывали решётку на окне тонким проводом и подключали его в шлейф прибора сигнализации. Если злодей выдернет решётку - провод порвётся и сигнализация сработает.
Ну а теперь к схеме.
Микроконтроллер ATtiny13A по умолчанию использует внутренний генератор на 9,6 МГц (это следует из документации, и я писал об этом здесь). И если нас такое решение устраивает (а нас оно устраивает), то это означает, что никаких внешних цепей для задания тактовой частоты нам не потребуется.
Микроконтроллер ATtiny13A выпускается в нескольких корпусах. Будем считать, что у нас корпус 8PDIP/SOIC (подробнее об этом здесь). Тогда схема будет такой:
Наверно вы знаете, что у этих МК есть встроенные подтягивающие резисторы. Но эти резисторы очень маломощные и могут перегореть, если их использовать с нагрузкой. Поэтому последовательно со светодиодом лучше ставить внешний резистор.
На схеме SA1 может быть либо охранным датчиком, либо просто тонким проводом, обмотанным, например, вокруг какого-то охраняемого предмета. При обрыве провода (или размыкании контакта) сигнализация “срабатывает” и светодиод загорается.
Конечно, это слишком несовершенная система. Но мы же только учимся. И в начале пути создания устройств на микроконтроллерах это лучшее решение, потому что оно самое простое.
Простая программа микроконтроллера
Ну а теперь можно перейти к программированию. Я буду использовать ассемблер и среду разработки AVRStudio 4. Почему я использую именно эту среду, хотя есть более новые версии, я рассказал здесь.
Итак, пройдём путь от создания проекта до написания программы.
Запускаем среду разработки AVRStudio 4 и видим окно:
Нажимаем кнопку NEW PROJECT. Откроется окно:
Здесь можно выбрать вид проекта - на ассемблере или на Си, задать имя проекта и выбрать каталог для файлов проекта.
ВНИМАНИЕ!
В пути к файлу не должно быть русских букв. То есть если вы сохраните проект в папку МОИ_ПРОГРАММЫ
, то программа не скомпилируется, так как AVR Studio 4 может не понять путь с русскими буквами.
Мы будем писать программу на ассемблере. Проект назовём myprog
.
Теперь можно нажать кнопку ДАЛЕЕ (NEXT).
В следующем окне надо выбрать отладочную платформу и тип микроконтроллера:
Выберем AVR Simulator
. Ну и поскольку у нас микроконтроллер ATtiny13A, то выберем ATtiny13
. Затем нажимаем FINISH.
Ну вот. Проект создан. Редактор исходного кода открыт. Теперь можно приступить к написанию программы. Она может быть примерно такой:
; Сообщить ассемблеру модель микроконтроллера .device ATtiny13A .nolist ; Подключить файл с объявлениями для ATtiny13A .include "tn13def.inc" .list ; Инициализация Init: ; PB0 - вход, остальные - выходы LDI R16, 0b11111110 OUT DDRB, R16 ; Включить подтяжку для PB0 LDI R16, 0b00000001 OUT PortB, R16 ; Начало программы Start: SBIS PinB, 0 ; Проверить датчик SBI PortB, 1 ; Если обрыв, то включить светодиод SBIC PinB, 0 ; Проверить датчик CBI PortB, 1 ; Если замкнут, то погасить светодиод RJMP Start ; Возвращаемся к началу программы
При инициализации мы определяем, какие выводы будут входами, а какие - выходами. Если в бит регистра DDRB
записать 0, то соответствующий вывод порта В
будет входом, если 1 - выходом.
У нас к выводу РВ0 подключен датчик, следовательно, РВ0 будет входом. К выводу РВ1 подключен светодиод, значит, РВ1 будет выходом. Неиспользуемые выводы лучше всегда делать выходами (хотя здесь у каждого свои предпочтения).
С помощью команды LDI
мы записываем число в регистр R16
,
который используем как временную переменную. Это необходимо, потому что команда
OUT
не может записать в регистр DDRB
непосредственное значение.
Далее мы включаем подтягивающий резистор для вывода РВ0. Для этого в регистр PortB
надо в соответствующий бит записать 1.
Ну а далее начинается программа.
Сначала выполняем команду SBIS
. Эта команда проверяет указанный вход. И если на этом входе 1, то следующая команда НЕ БУДЕТ выполнена. То есть в этом коде:
SBIS PinB, 0 SBI PortB, 1 SBIC ...
мы проверяем РВ0. Если там единица, то мы переходим к команде SBIC
.
Если же ноль (датчик разомкнут - сигнализация сработала), то выполняем команду SBI
, которая устанавливает указанный выход (то есть в нашем случае зажигает светодиод, подавая напряжение на вывод РВ1).
Затем выполняем команду SBIC
. Эта команда также проверяет указанный вход. Но если на этом входе 0,
то следующая команда не будет выполнена. Если же 1 (контакты датчика замкнуты), то будет выполнена команда CBI
, которая обнуляет указанный вывод. То есть на РВ1 будет подан 0, и светодиод погаснет.
Таким образам исполняется наш простой алгоритм: если датчик “не сработал” (контакт замкнут), то светодиод не горит. Если контакты разомкнулись, то светодиод светится.
На этом пока всё. Если что-то осталось непонятно - посмотрите видео в начале статьи.
Подписаться на канал в YouTube
Вступить в группу "Основы программирования" Подписаться на рассылки по программированию |
Микроконтроллеры для ЧАЙНИКОВ
Бесплатная рассылка о микроконтроллерах. Рассылка содержит как бесплатную информацию для начинающих, так и ссылки на платные продукты (книги, видеокурсы и др.) для тех, кто захочет вникнуть в тему более глубоко. Подробнее... |