Меня попросили изготовить устройство для организации игр, в которых требовалось быстрее остальных дать правильный ответ. (Аналогична игре «Угадай мелодию»). Данное устройство отображает на семисегментном дисплее номер одной из четырёх кнопок нажатой первой. Это моё первое устройство на микроконтроллере AVR, которое состоит из 5-ти кнопок, контролера ATMEL Mega8 и семи сегментного индикатора. При нажатии на одну из 4-х игровых кнопок на индикаторе выводится номер кнопки нажатой раньше остальных. Устройство находится в таком состоянии до тех пор, пока не будет нажата 5-я кнопка-кнопка сброса. Это устройство я опубликовал для начинающих, для тех, кто делает первые шаги в avr, так как оно очень простое, и его любой сможет собрать, я для него даже схемы не рисовал, всё было нарисовано в тетрадном листочке, и алгоритм, и схема, и распиновка семисегментного индикатора)))
Для меня это первое устройство на микроконтроллере AVR. Вообще на данном устройстве я очень много сделал впервые: собрал программатор по готовой схеме, изучил ассемблер для АВР, написал программу, впервые на компьютере в программе Sprint-Layout разработал первую печатную плату, и впервые изготовил плату по методу ЛУТ. Мотивация у меня была сильная, за изготовление я получил деньги))) Схема устройства простейшая, я использовал микроконтроллер ATMEL Mega8 в DIP корпусе, распиновка на схеме соответствует ему. Для статьи только что нарисовал принципиальную схему.
К выводам 1-4 порта C сконфигурированным на вход, подключены игровые кнопки, а к 5 выводу порта C подключена кнопка сброса. Все кнопки подключены таким образом, что при нажатии на них вывод к которому они подключены подтягивается к земле, то есть на них устанавливается логический ноль. При отпущенной кнопке вывод порта, за счёт подтягивающего резистора на 10К, подтянут к Vcc, то есть на выводе логическая единица. Микроконтроллеру остаётся только опрашивать эти выводы и в зависимости от логического уровня на них определять нажатую кнопку. Дальше микроконтроллер должен зафиксировать кнопку, нажатой раньше остальных, и вывести номер этой кнопки на индикатор, подключенный к порту D микроконтроллера. Для работы устройства была написана программа на языке ассемблер для АВР, кстати, обрати внимание, в программе и в схеме нет никаких элементов для подавления дребезга контактов кнопок, для реализации данного устройства это не нужно. Устройство ловит только первое нажатие, и блокируется до тех пор пока не будет нажата кнопка сброса, поэтому все остальные нажатия или дребезг контактов, устройство уже не будет отрабатывать, так как будет ждать только нажатие кнопки сброс. Текст программы (файлы проекта можно скачать в конце статьи), немного корявый, но это моя первая программа на ассемблере, да и не забывайте что это моё первое устройство на микроконтроллере. Программа работает следующим образом:
.include "m8def.inc" ; Используем ATMega8
Подключаем заголовочный файл с описанием регистров для микроконтроллера Atmeg8.
ldi R16,0x00
out DDRB,R16 ;Порт на вход
out DDRC,R16 ;Порт на вход
ldi R16,0xFB
out PortD,R16 ;Порт частично на ввход, частично на выход
ldi R16,0xFF
out PinB,R16 ;Подключаем подтяжку ко всем входам порта
out PinC,R16 ;Подключаем подтяжку ко всем входам порта
out DDRD,R16 ;Подключаем подтяжку к входным пинам порта порта,
;и переводим в лог "1" пины настроенные на выход
Конфигурируем PortB и PortС на вход с внутренней подтяжкой к Vcc, пины для подключения сегментов семисегментного индикатора PortD настраиваем на выход и выводим на них логическую единицу.
main:
sbis PinC,1
rjmp najat1
sbis PinC,2
rjmp najat2
sbis PinC,3
rjmp najat3
sbis PinC,4
rjmp najat4
rjmp main
Циклически опрашиваем пины 1-4 порта C к которому подключены игровые кнопки. Как только обнаруживаем на каком-то выводе «0» (например на PINC2), значит была нажата кнопка, в данном случае вторая игровая кнопка и выполнение программы переходит на метку najat2
najat2:
LDI R16,0x49
out PortD,R16
rjmp Sbros
Здесь на выходы порта D выводится комбинация которая отображает на семисегментном индикаторе цифру 2, и программа переходит на метку Sbros
Sbros:
sbis PinC,5
rjmp Zanul
rjmp Sbros
Zanul:
LDI R16,0xFB
out PortD, R16
rjmp main
Здесь микроконтроллер циклически опрашивает 5 пин порта C, то есть кнопку сброса. При этом его не интересуют нажатия на другие кнопки, поэтому нажимай не нажимай на игровые кнопки 1-4, микроконтроллер никак на них не отреагирует, ведь он ждёт нажатие только на одну кнопку, на кнопку сброса, именно поэтому дребезг контактов на игровых кнопках микроконтроллеру параллельно! Если кнопка 5 (сброс) не нажата, микроконтроллер снова переходит на метку Sbros: и снова опрашивает данную пятую кнопку. Как только кнопка будет нажата, микроконтроллер переходит к выполнению программы с метки Zanul где на выводы подключённые к семисегментному индикатору выводится комбинация для отображения на дисплее нуля, и программа переходит к выполнению с метки main, то есть с самого начала программы, и снова ожидает нажатие на одну из 4-х игровых кнопок. Для данного устройства была разработана печатная плата (файлы проекта можно скачать в конце статьи).
При разработке я использовал имеющийся у меня семисегментый дисплей с общим анодом, но вы легко можете переразвести плату под имеющиеся у вас в наличии детали, это не сложно и очень интересно! Ну и на последок фото собранного устройства. Вид сверху.
Вид со стороны дорожек и поверхностного монтажа.
Ниже видео, демонстрирующее работу моего первого устройства на микроконтроллере AVR. Я пинцетом замыкаю нужную мне группу контактов, то есть имитирую нажатие кнопки. Что из этого получилось — смотрите!
9 комментария
Написать ответ →