Самое простое устройство на микроконтроллере

Микроконтроллеры / Создание устройств /

Устройства на микроконтроллерах Разработка устройств на микроконтроллерах

Возможно, вы уже научились чему-то в теме программирования микроконтроллеров. Возможно, вы уже можете написать программу для простого устройства типа бегущих огней новогодней гирлянды. Однако аппетит приходит во время еды. И наверняка вам хочется чего-то большего. Наверняка вам хочется шагнуть на уровень профессионала. Ну хотя бы на первую ступеньку... Подробнее...

До сих пор я выдавал вам общие сведения о микроконтроллерах, отрывки из документации, иногда немного говорил о программировании. Но ещё ни разу не приводил примеров устройств на микроконтроллерах. А ведь именно в этом весь смысл обучения - в создании собственных устройств.

Так что с этой статьи я начинаю исправлять положение дел, и буду рассказывать именно о создании устройств с примерами схем, программ и т.п. Рассказы будут для начинающих. Как всегда буду стараться, чтобы понятно было даже людям, далёким от электроники и программирования. И первый пример будет настолько простым, насколько это вообще возможно…

Пример устройства на микроконтроллере

Итак, наше первое устройство на микроконтроллере будет не простым, а очень простым. И хотя сделать какой-то полезный прибор с наипростейшей схемой и наипростейшей программой крайне сложно, я всё-таки постараюсь. Конечно, эта полезность будет весьма сомнительной, но всё-таки применить это устройство можно будет не только для обучения, но и на практике (конечно, скорее как игрушку, но всё же).

Для опытов возьмём один из самых дешёвых микроконтроллеров - ATtiny13A, о котором я уже немало поведал на этом сайте.

Самая простая схема на микроконтроллере

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

Итак, наше устройство - это простейшая сигнализация. Если вход микроконтроллера замкнут, то на выходе ноль. Если вход разомкнуть, то на выходе, к которому подключен светодиод, появится сигнал. Светодиод включится, и это будет означать, что сигнализация сработала.

Конечно, это всё достаточно примитивно. Однако в давние времена, когда я занимался (в том числе) и обслуживанием систем сигнализации, мы использовали такие самодельные “датчики”. Например, обматывали решётку на окне тонким проводом и подключали его в шлейф прибора сигнализации. Если злодей выдернет решётку - провод порвётся и сигнализация сработает.

Ну а теперь к схеме.

Микроконтроллер ATtiny13A по умолчанию использует внутренний генератор на 9,6 МГц (это следует из документации, и я писал об этом здесь). И если нас такое решение устраивает (а нас оно устраивает), то это означает, что никаких внешних цепей для задания тактовой частоты нам не потребуется.

Микроконтроллер ATtiny13A выпускается в нескольких корпусах. Будем считать, что у нас корпус 8PDIP/SOIC (подробнее об этом здесь). Тогда схема будет такой:

Самая простая схема на микроконтроллере

Наверно вы знаете, что у этих МК есть встроенные подтягивающие резисторы. Но эти резисторы очень маломощные и могут перегореть, если их использовать с нагрузкой. Поэтому последовательно со светодиодом лучше ставить внешний резистор.

На схеме SA1 может быть либо охранным датчиком, либо просто тонким проводом, обмотанным, например, вокруг какого-то охраняемого предмета. При обрыве провода (или размыкании контакта) сигнализация “срабатывает” и светодиод загорается.

Конечно, это слишком несовершенная система. Но мы же только учимся. И в начале пути создания устройств на микроконтроллерах это лучшее решение, потому что оно самое простое.

Простая программа микроконтроллера

Ну а теперь можно перейти к программированию. Я буду использовать ассемблер и среду разработки AVRStudio 4. Почему я использую именно эту среду, хотя есть более новые версии, я рассказал здесь.

Итак, пройдём путь от создания проекта до написания программы.

Запускаем среду разработки AVRStudio 4 и видим окно:

Запуск AVRStudio 4

Нажимаем кнопку NEW PROJECT. Откроется окно:

Создание проекта в AVR Studio 4

Здесь можно выбрать вид проекта - на ассемблере или на Си, задать имя проекта и выбрать каталог для файлов проекта.

ВНИМАНИЕ!
В пути к файлу не должно быть русских букв. То есть если вы сохраните проект в папку МОИ_ПРОГРАММЫ, то программа не скомпилируется, так как AVR Studio 4 может не понять путь с русскими буквами.

Мы будем писать программу на ассемблере. Проект назовём myprog.

Теперь можно нажать кнопку ДАЛЕЕ (NEXT).

В следующем окне надо выбрать отладочную платформу и тип микроконтроллера:

Выбор микроконтроллера в AVR Studio 4

Выберем 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

Вступить в группу "Основы программирования"

Подписаться на рассылки по программированию

Микроконтроллеры для ЧАЙНИКОВ Микроконтроллеры для ЧАЙНИКОВ

Бесплатная рассылка о микроконтроллерах. Рассылка содержит как бесплатную информацию для начинающих, так и ссылки на платные продукты (книги, видеокурсы и др.) для тех, кто захочет вникнуть в тему более глубоко. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su