Оглавление:

Счетчик хода BloodBowl с использованием 7-сегментных светодиодов: 5 шагов
Счетчик хода BloodBowl с использованием 7-сегментных светодиодов: 5 шагов

Видео: Счетчик хода BloodBowl с использованием 7-сегментных светодиодов: 5 шагов

Видео: Счетчик хода BloodBowl с использованием 7-сегментных светодиодов: 5 шагов
Видео: КАК ИГРАТЬ в Blood Bowl 2024, Июль
Anonim
Счетчик хода BloodBowl с использованием 7-сегментных светодиодов
Счетчик хода BloodBowl с использованием 7-сегментных светодиодов

Этот проект был разработан для счетчика хода игры BloodBowl с использованием шести 7-сегментных светодиодов Charlieplexed.

Шаг 1: концепция

Концепция
Концепция

Один мой друг спросил меня об идеях создания счетчика Turn Bloodbowl Turn для его настольной игры. Не зная, что это было и чего он хотел, потребовалось некоторое время, чтобы решить, собираюсь ли я это делать и как. Сначала мне нужно было понять, чего он хочет, поэтому я начал с концепт-арта (изображения). Основная идея состоит в том, чтобы иметь 3 кнопки, каждая из которых управляет 3 светодиодами, и он будет размещен внутри специально построенной башни. Единственная большая просьба заключалась в том, чтобы верхние 4 дисплея считали от 0 до 8 и сбрасывались, а нижние 2 отображает обратный отсчет от 8 до 0 и цикл назад. Я бы замкнул круг, а он завершил бы башню.

Шаг 2: конструкция и список деталей

Дизайн и список деталей
Дизайн и список деталей

Поскольку концепция требовала 6 7-сегментных светодиодов, а у меня было несколько 8-битных микрочипов PIC, я исследовал способы использования PIC для управления светодиодами. Я нашел эту ссылку https://www.mikroe.com/en/books /picbook/7_08chapter.htm, в котором говорится: «Таким образом можно получить доступ до 6 дисплеев без изменения яркости каждого дисплея». Я счел это проблемой и тем, что нужно изучить в рамках моего проекта. Первое, что я сделал, - взял из коробки несколько 7-сегментных дисплеев накаливания и посмотрел, как они будут работать. Плохие новости. Отдельные части, которые я выбрал, вели себя не так, как я хотел. Сегмент на макетной плате при необходимости загорался, но ток утечки распределялся по остальным 6 сегментам. Я понял, что лампы накаливания могут не подходить, или мне нужно было использовать их по-другому. Поэтому для простоты я проверил, что 7-сегментные светодиоды, которые у меня были под рукой, подойдут для макетирования, и заказал несколько распространенных анодных дисплеев. Второе, что мне нужно было сделать, - это разметить дизайн и начать работу над кодом. На фото моя схема. Ничего особенного, так как код в PIC заботится о мультиплексировании … эээ, Charlieplexing. Примечание. ВСЕ 6 дисплеев имеют ОДИНАКОВЫЕ строки от драйвера IC. Селектор IC включает каждый дисплей, по одному за раз, и 7-сегментные линии обновляются PIC соответственно. Очень простая идея. После этого все, что было необходимо, - это код и аппаратная доработка. Список деталей После 3 небольших заказов от Digi-Key, когда я выбирал конкретные компоненты, у меня было все необходимое (с некоторыми вещами под рукой); 1 ~ 3 дюйма x4 Маленькие кнопочные переключатели на плате PCB6 (NO) 1 74LS47, 7-сегментный дисплей IC1 PIC16F627 1 CD4028, 1 из 10 селектор IC 6 Резисторы 10 кОм 1 резистор 470 Ом 1 катушка с проводом. Я использовал разные цвета и цвета, но это был только я.1 Регулятор 78L05 5 В 1 Зажим аккумулятора 9 В 1 Батарея 9 В 1 маленький переключатель (для включения / выключения) Я считаю этот проект умеренно сложным из-за: 1) Требуется код микропроцессора 2) Пайка и макетирование 3) Оптимизация дизайна. Ни один из этих вопросов сам по себе не является чрезмерно сложным, но взяться за их все без какого-либо опыта может быть немного для новичка. Для записи устройства, паяльной станции и т. Д. Требуется аппаратный программатор. ПЕРВОЕ, что кто-то может заметить, это то, что 7-сегментные светодиоды НЕ имеют последовательных (токоограничивающих) резисторов! Позвольте мне быстро ответить на этот вопрос, заявив, что они присутствовали в моем первоначальном дизайне … но прочтите следующий шаг для объяснения!

Шаг 3. Макетирование и микрокод

Макетирование и микрокод
Макетирование и микрокод

Макетная плата была обязательной для этого. Показан мой общий макет, но для размера этого проекта я фактически использовал этот макет и меньшую макетную плату, так как нужно было развести много проводов. Сначала я протестировал один единственный 7-сегментный светодиод, используя исходный код. Это подтвердило 3 вещи: 1) Электропроводка микросхем была проверена хорошо! 2) Помогла мне оптимизировать и доработать мой код 3) Я понял, что мне не нужны ограничивающие ток резисторы! для работы с моим кодом, так как светодиод будет циклически переключать числа с помощью одного кнопочного переключателя, чтобы проверить мой код и макет. Требовалось немногое, но макетирование подтвердило, что я в хорошей форме2. Изначально в CODEI в моем коде была установлена основная процедура для поиска кнопок, а программа ISR (Interrupt Service Routine) отображала числа,. После тестирования макета я полностью изменил процедуры, поэтому большую часть времени постоянно отображал числа и ISR для проверки наличия кнопок. Причина, по которой я сделал это, заключалась в том, чтобы иметь постоянный дисплей, поскольку PIC работает с внутренними часами 4 МГц, я теряю очень мало времени на сканирование кнопок. Ничего страшного … просто зависит от того, как вы хотите писать код и что наиболее удобно для каждого приложения. Для этого важен дисплей, поэтому я включил его в основную процедуру. Когда были доставлены мои первые детали (все 6 дисплеев!), Я завершил разводку макета и обнаружил еще одну проблему. При нажатии кнопки в моем коде были нечеткие регистры, которые не очищались, и ISR вызывал незначительные сбои отображения.; ======================== ================================================== =====; Счетчик оборотов;; -----------; Dsply3 Dsply2; Dsply4 Dsply1; Led1 Led3; A5 | 4 15 | A6 - Led2; Vss | 5 14 | Vdd; Button1 B0 | 6 13 | B7; B1 | 7 12 | B6; B2 | 8 11 | B5; B3 | 9 10 | B4; -----------;; LED1-3 - BCD-dec IC -LEDSeg's1-6; Dsply1-3 - BCD-7seg IC -Dsply # 1-9;; ================================== =============================================; История изменений и примечания:; Начальный заголовок версии 1.0, код 30.03.09;;; (C) 5/2009; Этот код можно использовать для личного обучения / применения / модификации.; Любое использование этого кода в коммерческих продуктах нарушает данный выпуск бесплатного программного обеспечения.; По вопросам / комментариям обращайтесь к магу схемы dot на yahoo dot com.; ------------------------------------------------ ------------------------------- # include P16F627A. INC; ============= ================================================== ================; Определяет; ------------------------------------------------ -------------------------------; ================== ================================================== ===========; Данные;------------------------------------------------ -------------------------------; Переменная хранения времениscount1 equ 20 count2 equ 21 dis1 equ 22dis2 equ 23dis3 equ 24dis4 equ 25dis5 equ 26dis6 equ 27w_temp equ 28status_temp equ 29ISRCNTR equ 2A; ====================== ================================================== =======; Сбросить векторы;; ПРОВЕРИТЬ КОНФИГУРАЦИЮ. БИТЫ ПЕРЕД ГОРЕНИЕМ !!!; ИНТОСК; MCLR: ВКЛЮЧЕНО; PWRUP: ВКЛЮЧЕНО; ВСЕ ДРУГИЕ: ОТКЛЮЧЕНО !!;; ------------------------------------------ ------------------------------------- RESET_ADDR EQU 0x00 ISR_ADDR EQU 0x04 org RESET_ADDR goto start; == ================================================== ===========================; ISR;; ----------------------------------------------- -------------------------------- org ISR_ADDR movwf w_temp swapf STATUS, w movwf status_temp;; ISR ЗДЕСЬ; Проверить переключатели PB0-PB5 btfsc PORTB, 0; Проверка SW1 вызова sw1debounce btfsc PORTB, 1; Проверка SW1 вызова sw2debounce btfsc PORTB, 2; Проверка SW1 вызова sw3debounce btfsc PORTB, 3; Проверка SW1 вызова sw4debounce btfsc PORTB, 4; Проверка SW1 вызова sw5debounce btfsc PORTB, 5; Проверить вызов SW1 sw6debounce goto endisrsw1debounce call debounce; Подождите 0,2 секунды, вызовите дебаунс incf dis1; Обновить счетчик movf dis1, W; Проверить переполнение xorlw 0x1A; 10 на 7 сегментов? btfss STATUS, Z return; Нет, вернуться к сканированию. movlw h'10 '; Да, сбросить дисплей. movwf dis1 возвращает debounce вызова w2debounce; Подождите 0,2 секунды, вызовите дебаунс incf dis2; Обновить счетчик movf dis2, W; Проверить переполнение xorlw 0x4A; 10 на 7 сегментов? btfss STATUS, Z return; Нет, вернуться к сканированию. movlw h'40 '; Да, сбросить дисплей. movwf dis2 возвращает debounce вызова w3debounce; Подождите 0,2 секунды, вызовите дебаунс incf dis3; Обновить счетчик movf dis3, W; Проверить на переполнение xorlw 0x5A; 10 на 7 сегментов? btfss STATUS, Z return; Нет, вернуться к сканированию. movlw h'50 '; Да, сбросить дисплей. movwf dis3 возвращает debounce вызова w4debounce; Подождите 0,2 секунды, вызовите дебаунс incf dis4; Обновить счетчик movf dis4, W; Проверить переполнение xorlw 0x8A; 10 на 7 сегментов? btfss STATUS, Z return; Нет, вернуться к сканированию. movlw h'80 '; Да, сбросить дисплей. movwf dis4 возвращает debounce вызова w5debounce; Подождите 0,2 секунды, вызовите дебаунс incf dis5; Обновить счетчик movf dis5, W; Проверить на переполнение xorlw 0x9A; 10 на 7 сегментов? btfss STATUS, Z return; Нет, вернуться к сканированию. movlw h'90 '; Да, сбросить дисплей. movwf dis5 возвращает debounce вызова w6debounce; Подождите 0,2 секунды, вызовите дебаунс incf dis6; Обновить счетчик movf dis6, W; Проверить переполнение xorlw 0xCA; 10 на 7 сегментов? btfss STATUS, Z return; Нет, вернуться к сканированию. movlw h'C0 '; Да, сбросить дисплей. movwf dis6 Retreatnendisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie; ============================ ================================================== знак равно Начните здесь!;---------------------------------------------- ---------------------------------Начните; Конфигурация портов ввода / вывода clrf ПОРТА movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00 '; RA Выходы, RA5 Нет выхода movwf TRISA bcf STATUS, RP0 clrf PORTB bsf STATUS, RP0 movlw h'FF'; RB вводит movwf TRISB; Установить внутренний таймер bsf PCON, 3; Установите 4 МГц. movlw h'CF '; Tmr0 Внутренний источник, предварительное масштабирование TMR0 1: 256 movwf OPTION_REG movlw h'A0 'movwf INTCON; Разрешить прерывания TMR0, bcf STATUS, RP0; Инициализировать регистры clrf PORTA; Очистить PortA clrf PORTB; Очистить вывод PortB clrf count1 clrf count2 movlw h'10 'movwf dis1 movlw h'40' movwf dis2 movlw h'50 'movwf dis3 movlw h'80' movwf dis4 movlw h'90 'movwf dis5 movlw h'C0' movwf dis6 call дебаунс; 0,2 сек; тестовые светодиоды, дисплей 8 ???; ====================================== =========================================; Главный; Получает входные данные от переключателей, дисплеев отклонений и отклонений.;; Это обновляет дисплеи, @ 4Mhz с предварительным масштабированием TMR0 1: 4, со скоростью 1Khz.; Display 0 используется для выделения неиспользуемому дисплею. Дисплеи 1-6 подключены.; Во-первых, BCD-7Seg IC загружается с отображаемым значением, И BCD-Dec IC активируется для; выбора отображения.; Во-вторых, задержка в мс сохраняется для отображения.; В-третьих, BCD-Dec. IC деактивирован … display0 выбран для отключения дисплея;; Это повторяется для каждого из 6 дисплеев и зацикливается.; ISR обрабатывает опознавание переключателя с частотой 15 Гц.; -------------- -------------------------------------------------- --------------- main; Disp1 movf dis1, 0 movwf PORTA call ledon goto main; ===================== ================================================== ========; Ледон; Время установления включения светодиода.; 6 дисплеев -> 1/6 рабочего цикла при 1 кГц = 166 циклов; ----------------------------------- -------------------------------------------- ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn; ============================================= ====================================; Сигнал устранения дребезга; 4 цикла на загрузку и вызов, 2 цикла на возврат.; 4 МГц Tc:: count2 = 255 -> 0,2 с; -------------------------------------- ----------------------------------------- debounce movlw.255; Задержка на 1/5 секунды дребезга. movwf count2 call pon_wait return; -------------------------------------------- -----------------------------------; count1 = 255d:: 775 циклов до 0, + 3 цикла до возврата.; --------------------------------- ---------------------------------------------- pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 Изначально у CIRCUITI были резисторы 470 Ом для каждой линии драйвера дисплея из разрешающей линии 74LS47 и CD4028. Однако я проверил ток, потребляемый моей схемой, и обнаружил, что он потребляет всего ~ 31 мА. И поскольку фактический драйвер для дисплеев поступает непосредственно от 74LS47, а включение - от другой ИС, быстрый анализ средних и пиковых требований и соответствующих таблиц данных … Я снял резисторы с макета и обнаружил разницу в 1 мА. ! Похоже, что прямое движение по линии CA от 4028 при прямом управлении всеми сегментами - это нормально! …вроде, как бы, что-то вроде.:) У меня ДЕЙСТВИТЕЛЬНО был сбой в моем коде, который не очищал мои регистры при нажатии кнопки, в результате чего на последнем дисплее при нажатии кнопки очень ярко светились 2 сегмента. Это было плохо. Однако очистка регистра устранила эту проблему, и непрерывные проверки мощности подтверждают, что он постоянно потребляет около 30 мА. Это должно дать мне (на основе предыдущего опыта работы с аналогичными схемами) ~ 20 часов работы при использовании батареи 1 9 В (500 мАч / 30 мАч при регулировании 5 В)… Надеюсь! Я решил оставить светодиоды с прямым приводом, но вставил их в розетки. если что-то случилось, долгое время.

Шаг 4: пайка печатной платы

Пайка печатных плат
Пайка печатных плат

Каждый раз, когда я добираюсь до этого момента в своем проекте, я откладываю abit. Сначала я собирался обмотать эту штуку проводом, но быстро отказался от этой идеи. Сначала я думаю: «Несколько проводов для пайки, ничего страшного» … потом, когда мой проект будет готов к пайке, я думаю: « Мне следовало либо послать на изготовление прототипа платы, либо протравить свою собственную плату ». Я не занимаюсь травлением печатных плат (пока) и не хотел платить доллары за изготовление платы, так что…. Да….. Я потратил около 3 часов на то, чтобы паять эту штуку. Это примерно 150 проводов, так что это 300 точек пайки, плюс доработки для паяных мостов. В любом случае, вот изображена задняя сторона платы … да … немного беспорядка, но когда все было сделано, у меня остался только 1 короткий припой.. Потребовалось 20 минут размышлений, так как на дисплее показывались неправильные # в виде логической схемы, которую мне пришлось расшифровать. После этого я нашел короткое замыкание и бац! Это сработало отлично.

Шаг 5: Заключение

Заключение
Заключение

ЭТО Сработало! Этот проект занял около: ~ 2 недели, чтобы обдумать и отправить по электронной почте мелкие вопросы заказчику, ~ 3 часа завершения кода и отладки, ~ 4 часа макетирования и отладки, ~ 3 часа пайки. 7-сегментные светодиоды Charlieplex 6. Потребляемая мощность составляет около 30 мА с этой конструкцией, что неплохо, если я так говорю. Я подозреваю, что можно было бы использовать больше 7-сегментных светодиодов, но это не выходило за рамки. применяться практически к ЛЮБОМУ применению с использованием 7-сегментных светодиодов; термометр, часы, текстовый дисплей и т. д. С помощью некоторого хитрого кода у вас может быть движущийся дисплей или изображения … может быть, даже основа для проекта POV (постоянство зрения). Окончательная реализация оставлена для моего друга, чтобы построить свою Башню и поместите доску, как он считает нужным. Если / Когда это будет сделано, я загружу картинку. А вот схема, похоже, построена на заказ!

Рекомендуемые: