Electronics Engineering BLOG

Блог об электронике

Первое устройство на микроконтроллере AVR (Кто быстрее нажал кнопку).

| комментариев 9

Кто-быстрее-нажал-кнопку Меня попросили изготовить устройство для организации игр, в которых требовалось быстрее остальных дать правильный ответ. (Аналогична игре «Угадай мелодию»). Данное устройство отображает на семисегментном  дисплее номер одной из четырёх кнопок нажатой первой. Это моё первое устройство на микроконтроллере AVR, которое состоит из 5-ти кнопок, контролера ATMEL Mega8 и семи сегментного индикатора. При нажатии на одну из 4-х игровых кнопок на индикаторе выводится номер кнопки нажатой раньше остальных. Устройство находится в таком состоянии до тех пор, пока не будет нажата 5-я кнопка-кнопка сброса. Это устройство я опубликовал для начинающих, для тех, кто делает первые шаги в avr, так как оно очень простое, и его любой сможет собрать, я для него даже схемы не рисовал, всё было нарисовано в тетрадном листочке, и алгоритм, и схема, и распиновка семисегментного индикатора)))

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

Для меня это первое устройство на микроконтроллере AVR. Вообще на данном устройстве я очень много сделал впервые: собрал программатор по готовой схеме, изучил ассемблер для АВР, написал программу,  впервые на компьютере в программе Sprint-Layout разработал первую печатную плату, и впервые изготовил плату по методу ЛУТ. Мотивация у меня была сильная, за изготовление я получил деньги))) Схема устройства простейшая, я использовал микроконтроллер ATMEL Mega8 в DIP корпусе, распиновка на схеме соответствует ему. Для статьи только что нарисовал принципиальную схему.

Схема_Первое_устройство_на_микроконтроллере_AVR_Shema_Pervoe_ustrojstvo_na_mikrokontrollere_AVR

К выводам 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-х игровых кнопок. Для данного устройства была разработана печатная плата (файлы проекта можно скачать в конце статьи).

Плата_Sprint-Layout-_Первое_устройство_на_микроконтроллере_AVR_Plata_Sprint-Layout-_Pervoe_ustrojstvo_na_mikrokontrollere_AVR

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

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

Вид_сверху_Первое_устройство_на_микроконтроллере_AVR_Vid_sverhu_Pervoe_ustrojstvo_na_mikrokontrollere_AVR

Вид со стороны дорожек и поверхностного монтажа.

Вид_снизу_Первое_устройство_на_микроконтроллере_AVR_Vid_snizu_Pervoe_ustrojstvo_na_mikrokontrollere_AVR

Ниже видео, демонстрирующее работу моего первого устройства на микроконтроллере AVR. Я пинцетом замыкаю нужную мне группу контактов, то есть имитирую нажатие кнопки. Что из этого получилось — смотрите!

Скачать файлы проекта!

9 комментария

Добавить комментарий

Обязательные поля отмечены *.