Съдържание:

Брояч на завой на BloodBowl Използване на 7-сегментни светодиоди: 5 стъпки
Брояч на завой на BloodBowl Използване на 7-сегментни светодиоди: 5 стъпки

Видео: Брояч на завой на BloodBowl Използване на 7-сегментни светодиоди: 5 стъпки

Видео: Брояч на завой на BloodBowl Използване на 7-сегментни светодиоди: 5 стъпки
Видео: Blood Bowl 3. Ladder PO. Diomed(O) - Hiru(D). (Вначале немного ладдера) 2024, Юли
Anonim
Брояч на завой на BloodBowl Използвайки 7-сегментни светодиоди
Брояч на завой на BloodBowl Използвайки 7-сегментни светодиоди

Този проект беше за брояч на завой на игра BloodBowl, използващ шест светодиода Charlieplexed със 7 сегмента.

Стъпка 1: Концепция

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

Един мой приятел ме попита за идеи за изграждане на брояча на Bloodbowl Turn за настолната му игра. Без да знам какво е това и какво иска, отне известно време, за да реша дали и как ще направя това. Първо трябваше да имам представа какво иска, затова започнах с концептуалното изкуство (картина). Основната идея е да има 3 бутона за управление, всеки от които да контролира 3 светодиода и да бъде поставен в кула по поръчка. Единственото голямо искане беше първите 4 дисплея да броят от 0 до 8 и да нулират, а долните 2 да имат дисплеите отброяват от 8 до 0 и се връщат обратно. Аз щях да завърша веригата, а той да завърши кулата.

Стъпка 2: Списък на дизайна и частите

Списък на дизайна и частите
Списък на дизайна и частите

Тъй като концепцията изискваше 6 7-сегментни светодиода и имах под ръка 8-битови микрочипови карти, проучих начините за използване на PIC за управление на светодиоди. Намерих тази връзка https://www.mikroe.com/en/books /picbook/7_08chapter.htm, който гласи „До 6 дисплея могат да бъдат достъпни по този начин, без да се засяга яркостта на всеки дисплей.“Смятах това за предизвикателство и нещо, което трябва да проуча като част от моя проект. Първото нещо, което направих, беше да извадя някои нажежаеми 7-сегментни дисплеи от кутията си и да видя как ще работят. Лоши новини. Конкретните части, които избрах, не се държаха така, както исках. Сегментът ще светне, когато е необходимо, на макета, но токът на утечка се разпределя към останалите 6 сегмента. Осъзнах, че дисплеите с нажежаема жичка може да не са начинът или трябваше да ги използвам по различен начин. Затова за простота проверих, че 7-сегментните светодиоди, които имах под ръка, ще работят за макетиране, и поръчах някои общи анодни дисплеи. Второто нещо, което трябваше да направя, беше да подредя дизайна си и да започна работа по кода. На снимката е моята верига. Не много, тъй като кодът в PIC се грижи за мултиплексирането … греши Чарлиплексиране. Забележка: ВСИЧКИ 6 дисплея имат еднакви редове от IC драйвера. IC на селектора позволява всеки дисплей, 1 наведнъж, а 7-сегментните линии се актуализират съответно от PIC. Много проста идея. След това кодът и хардуерното завършване са всичко, което е необходимо. Списък на частите След 3 малки поръчки от Digi-Key, докато решавах конкретни компоненти, имах всичко необходимо (с някои неща под ръка); 1 ~ 3 "x4 "PCB6 малки бутони за превключване (NO) 1 74LS47, 7-сегментен дисплей IC1 PIC16F627 1 CD4028, 1 от 10 селектор IC 6 10KOhm резистори 1 470Ohm резистор 1 макара от проводник. Използвах различни цветове и марки, но това бях само аз. макет 3) Оптимизиране на дизайна. Нито един от тези проблеми сам по себе си не е прекалено сложен, но приемането на всички без никакъв опит може да бъде много за начинаещите. Изисква се хардуерен програмист, за да изгори устройството, станцията за запояване и т.н. … ПЪРВОТО, което някой може да забележи, е, че 7-сегментните светодиоди НЯМАТ серийни (ограничаващи тока) резистори! Позволете ми да се обърна към това бързо, като заявя, че оригиналният ми дизайн ги е включил … но прочетете следващата стъпка за обяснение!

Стъпка 3: Breadboarding & Micro Code

Breadboarding & Micro Code
Breadboarding & Micro Code

Платформата беше задължителна за това. Показан е моят общ план, но за размера на този проект всъщност използвах този и по-малък, тъй като имаше много проводници, които трябваше да бъдат раздалечени. Първо тествах един единствен 7-сегментен светодиод, използвайки първоначален код. Това потвърди 3 неща; 1) Кабелите на интегралните схеми бяха проверени добре! 2) Накара ме да оптимизирам и финализирам кода си. 3) Накара ме да осъзная, че не се нуждая от ограничаващите тока резистори! да работя с моя код, тъй като светодиодът ще циклира през числата с помощта на един бутон за превключване, така че потвърди кода и оформлението ми. Не се изискваше много, но макетът потвърди, че съм в добра форма. След макетни тестове, обърнах рутините, така че по -голямата част от времето постоянно показваше числа и ISR, за да провери за бутони. Причината да направя това беше просто да имам постоянен дисплей, тъй като PIC работи с вътрешен 4Mhz часовник, губя много малко време за сканиране за бутони. Нищо страшно … просто зависи от това как искате да направите кода и какво има най -голям смисъл за всяко приложение. За това дисплеят е важен, затова го поставих в основната рутина. Когато пристигнаха първите ми части (всичките 6 дисплея!), Завърших окабеляването на макета и открих друг проблем. При натискане на бутона моят код имаше някои небрежни регистри, които не бяха изчистени и ISR причиняваше някои малки проблеми на дисплея.; ======================== ================================================== =====; Брояч на завой;; -----------; Dsply3 Dsply2; Dsply4 Dsply1; Led1 Led3; A5 | 4 15 | A6 - Led2; Vss | 5 14 | Vdd; Бутон1 B0 | 6 13 | В7; B1 | 7 12 | В6; B2 | 8 11 | В5; B3 | 9 10 | В4; -----------;; LED1-3-BCD-dec IC -LEDSeg's1-6; Dsply1-3-BCD-7seg IC -Dsply#1-9;; ================================== =============================================; История на ревизиите и бележки:; V1.0 Начална заглавка, код 3/30/09;;; (C) 5/2009; Този код може да се използва за лично обучение/приложение/модификация.; Всяко използване на този код в търговски продукти нарушава тази безплатна версия.;.; ------------------------------------------------ -------------------------------#включва P16F627A. INC; ============= ================================================== ================; Определя; ------------------------------------------------ -------------------------------; ================== ================================================== ===========; Данни;------------------------------------------------ -------------------------------; Променливи за водене на време count1 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; ====================== ================================================== =======; Нулиране на вектори;; ПРОВЕРЕТЕ КОНФИГ. БИТОВЕ ПРЕДИ ГОРЕНЕ !!!; INTOSC; 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 повикване debounce; Изчакайте 0,2 сек. Актуализиране на брояча movf dis1, W; Проверете за преливане xorlw 0x1A; 10 на 7 сегмента? btfss STATUS, Z връщане; Не, върнете се към сканирането. movlw h'10 '; Да, нулиране на дисплея. movwf dis1 връща w2debounce повикване debounce; Изчакайте 0,2 сек. Актуализиране на брояча movf dis2, W; Проверете за преливане xorlw 0x4A; 10 на 7 сегмента? btfss STATUS, Z връщане; Не, върнете се към сканирането. movlw h'40 '; Да, нулиране на дисплея. movwf dis2 връща w3debounce повикване debounce; Изчакайте 0,2 секунди повикване debounce incf dis3; Актуализиране на брояч movf dis3, W; Проверете за преливане xorlw 0x5A; 10 на 7 сегмента? btfss STATUS, Z връщане; Не, върнете се към сканирането. movlw h'50 '; Да, нулиране на дисплея. movwf dis3 връща w4debounce повикване debounce; Изчакайте 0,2 секунди повикване debounce incf dis4; Актуализиране на брояча movf dis4, W; Проверете за преливане xorlw 0x8A; 10 на 7 сегмента? btfss STATUS, Z връщане; Не, върнете се към сканирането. movlw h'80 '; Да, нулиране на дисплея. movwf dis4 връща w5debounce повикване debounce; Изчакайте 0,2 сек. Актуализиране на брояч movf dis5, W; Проверете за преливане xorlw 0x9A; 10 на 7 сегмента? btfss STATUS, Z връщане; Не, върнете се към сканирането. movlw h'90 '; Да, нулиране на дисплея. movwf dis5 връща w6debounce повикване debounce; Изчакайте 0,2 сек. Актуализиране на брояча movf dis6, W; Проверете за преливане xorlw 0xCA; 10 на 7 сегмента? btfss STATUS, Z връщане; Не, върнете се към сканирането. movlw h'C0 '; Да, нулиране на дисплея. movwf dis6 връщане на bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie; ========================== ================================================== =; Започни тук!;---------------------------------------------- --------------------------------- начало; Конфигуриране на I/O портове clrf PORTA 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 movl' RB входове movwf TRISB; Задайте вътрешен таймер bsf PCON, 3; Задайте на 4Mhz. 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'C6' call разобличавам; 0,2 сек; тестови светодиоди, дисплей 8 ???; ====================================== =========================================; Основен; Получава входове от дисплеи на превключватели, съобщения и инкрименти.;; Това актуализира дисплеите, @4Mhz с TMR0 прескал 1: 4, с честота 1Khz.; Дисплей 0 се използва за разпределяне към неизползван дисплей. Дисплеят 1-6 са свързани. IC е деактивиран … display0 е избран за изключване на дисплея;; Това се повтаря за всеки от 6-те дисплея и се затваря.; ISR управлява разпознаването на превключвателя с честота 15Hz.; -------------- -------------------------------------------------- --------------- main; Disp1 movf dis1, 0 movwf PORTA повикване ledon goto main; ===================== ================================================== ========; Ледон; Време за утаяване при включване на LED; 6 дисплея-> 1/6 работен цикъл при 1Khz = 166 цикъла; ----------------------------------- -------------------------------------------- ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn; =========================================== ==================================; Сигнал за отстраняване; 4 цикъла за зареждане и повикване, 2 цикъла за връщане.; 4Mhz Tc:: count2 = 255-> 0,2 сек; -------------------------------------- ----------------------------------------- debounce movlw.255; Забавяне за 1/5 секунда деблоунд. movwf count2 повикване pon_wait връщане; -------------------------------------------- -----------------------------------; 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 първоначално имаше 470Ohm резистори от всяка линия на драйвера на дисплея от разрешаващата линия 74LS47 и CD4028. Въпреки това, аз тествах текущата схема на моята верига и установих, че тя дърпа само ~ 31mA. И тъй като действителният драйвер за дисплеите е директно от 74LS47 и активирането е от друга интегрална схема, бързо изтичане на средните и пиковите изисквания и съответните таблици с данни ….. Извадих резисторите от макета и намерих 1mA разлика ! Изглежда, че директното шофиране на CA линия от 4028, докато директно шофиране на всички сегменти е ОК! …нещо като.:) ИМАМ проблем в кода си, който не изчисти регистрите ми при натискане на бутон, в резултат на което последният дисплей има 2 ярко осветени сегмента при натискане на бутон. Това беше лошо. Изчистването на регистъра обаче реши този проблем и непрекъснатите проверки на захранването потвърждават, че той е постоянно около 30 mA. Това трябва да ми даде (въз основа на предишен опит с подобни схеми) ~ 20 часа време на работа с 1 9V батерия (500mAH/30mAH при 5V регулиране) … Надявам се! Реших да запазя светодиодите директно задвижвани, но ги поставих в гнездата в случай, че нещо се случи, дългосрочно.

Стъпка 4: Запояване на печатни платки

Запояване на печатни платки
Запояване на печатни платки

Всеки път, когато стигна до този момент в моя проект, отлагам abit. Отначало щях да обгръщам това нещо, но бързо се отказах от тази идея. Първо си мисля „Няколко жици за запояване, нищо страшно“… след това, докато проектът ми е готов за запояване, си мисля, Трябваше или да изпратя, за да направя прото платка, или да гравирам собствената си дъска . Аз все още не съм в офорт на печатни платки (и все още) и не исках да плащам $ $, за да направя дъска, така че…. Да….. Прекарвах около 3 часа запояване на това нещо. Това е около 150 проводника, така че това са 300 точки за запояване, плюс докосвания за спояващи мостове. Както и да е, ето задната страна на дъската, изобразена…. Да… край на бъркотия, но когато всичко беше направено, имах само 1 спойка къса. Минаха 20 минути мислене, тъй като дисплеят показваше, че грешните #се показват в логически модел, който трябваше да дешифрирам. След това открих късото и бам! Работи перфектно.

Стъпка 5: Заключение

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

Работи! Този проект отне около; ~ 2 седмици за обмисляне и изпращане на точни точки до заявителя, ~ 3 часа завършване и отстраняване на грешки в кода, ~ 4 часа макет и отстраняване на грешки, ~ 3 часа запояване Използвайки само 3 IC, е възможно Charlieplex 6 7-сегментни светодиоди. Потреблението на мощност е около 30 mA с този дизайн, което не е лошо, ако го кажа сам. Подозирам, че могат да се използват повече 7-сегментни светодиоди, но не са натиснали плика. Тази идея може да се прилага за почти ВСЯКО приложение, използвайки 7-сегментни светодиоди; термометър, часовник, текстов дисплей и т.н. С някакъв сложен код можете да имате подвижен дисплей или снимки … може би дори основа за проект за POV (постоянство на зрението). Крайното изпълнение е оставено на приятеля ми да построи своята кула и поставете дъската, както сметне за добре. Ако/Когато това стане, ще кача снимка. Но що се отнася до веригата, тя изглежда е построена по поръчка!

Препоръчано: