Cuprins:

BloodBowl Turn Counter Folosind LED-uri cu 7 segmente: 5 pași
BloodBowl Turn Counter Folosind LED-uri cu 7 segmente: 5 pași

Video: BloodBowl Turn Counter Folosind LED-uri cu 7 segmente: 5 pași

Video: BloodBowl Turn Counter Folosind LED-uri cu 7 segmente: 5 pași
Video: По следам древней цивилизации? 🗿 Что, если мы ошиблись в своем прошлом? 2024, Iulie
Anonim
BloodBowl Turn Counter Folosind LED-uri cu 7 segmente
BloodBowl Turn Counter Folosind LED-uri cu 7 segmente

Acest proiect a fost pentru un contor de jocuri BloodBowl folosind șase LED-uri Charlieplexed cu 7 segmente.

Pasul 1: Concept

Concept
Concept

Un prieten de-al meu m-a întrebat despre idei pentru construirea contorului Bloodbowl Turn pentru jocul său de masă. Necunoscând ce este și ce vrea el, a durat o vreme să decid dacă și cum voi face acest lucru. Mai întâi a trebuit să am o idee despre ceea ce dorea el, așa că am început cu conceptul de artă (imagine). Ideea de bază este de a avea 3 butoane, care controlează câte 3 LED-uri fiecare și ar fi plasat în interiorul unui turn construit la comandă. afișajele numărătoarea inversă de la 8 la 0 și ciclul înapoi. Aș finaliza circuitul și el ar completa turnul.

Pasul 2: Proiectare și listă de piese

Design & Lista pieselor
Design & Lista pieselor

Deoarece conceptul solicita 6 LED-uri cu 7 segmente și aveam la îndemână niște PIC-uri cu microcip pe 8 biți, am cercetat modalități de utilizare a PIC-urilor pentru controlul LED-urilor. Am găsit acest link https://www.mikroe.com/en/books /picbook/7_08chapter.htm care precizează „Până la 6 afișaje pot fi accesate astfel fără ca luminozitatea fiecărui afișaj să fie afectată”. Am considerat acest lucru o provocare și ceva de investigat ca parte a proiectului meu. Primul lucru pe care l-am făcut a fost să iau niște afișaje incandescente pe 7 segmente din cutia mea și să văd cum ar funcționa. Vesti proaste. Partile particulare pe care le-am selectat nu se comportau așa cum mi-am dorit. Segmentul se va aprinde atunci când este necesar, pe panou, dar curentul de scurgere a fost distribuit celorlalte 6 segmente. Mi-am dat seama că ecranele cu incandescență pot să nu fie calea de urmat sau trebuia să le folosesc într-un mod diferit. Așadar, pentru simplitate, am verificat LED-urile pe 7 segmente pe care le aveam la îndemână să funcționeze pentru breadboarding și am comandat câteva afișaje anodice obișnuite. În imagine este circuitul meu. Nu prea mult, codul din PIC se ocupă de multiplexare … err Charlieplexing. Notă: TOATE cele 6 afișaje au aceleași linii de la IC-ul driverului. Selectorul IC activează fiecare afișaj, câte 1, iar liniile cu 7 segmente sunt actualizate de PIC în consecință. Idee foarte simplă. După aceea, completarea codului și a hardware-ului este tot ce era necesar. Lista pieselor După 3 comenzi mici de la Digi-Key în timp ce decideam asupra componentelor specifice, am avut tot ce aveam nevoie (cu câteva lucruri la îndemână); 1 ~ 3 "x4 "Comutatoare cu buton mic PCB6 (NO) 1 74LS47, afișaj pe 7 segmente IC1 PIC16F627 1 CD4028, 1 din 10 selector IC 6 rezistențe 10KOhm1 470Ohm rezistor1 bobină de sârmă. Am folosit diverse culori și indicatoare, dar am fost doar eu.1 78L05 5V regulator1 9V baterie clip1 baterie 9V 1 întrerupător mic (pentru pornire / oprire) Consider că este un proiect moderat complex, datorită; 1) Cod microprocesor necesar breadboarding 3) Optimizarea proiectării. Niciuna dintre aceste probleme de la sine nu este prea complicată, dar acceptarea tuturor fără experiență poate fi foarte utilă pentru începători. Un programator hardware este necesar pentru a arde dispozitivul, stația de lipit, etc … PRIMUL lucru pe care cineva l-ar putea observa este că LED-urile cu 7 segmente NU au rezistențe de serie (cu limitare de curent)! Permiteți-mi să mă adresez atât de repede, precizând că designul meu original le avea … dar citiți următorul pas pentru explicații!

Pasul 3: Breadboarding și cod micro

Breadboarding și cod micro
Breadboarding și cod micro

Pânza era o necesitate pentru asta. Afișat este panoul meu generic, dar pentru dimensiunea acestui proiect l-am folosit de fapt pe acesta și pe un panou mai mic, deoarece erau multe fire care trebuiau distanțate. În primul rând, am testat un singur LED cu 7 segmente folosind codul inițial. Acest lucru a confirmat 3 lucruri; 1) Cablarea IC-urilor a fost verificată bine! 2) M-a determinat să optimizez și să finalizez codul meu. 3) M-a făcut să realizez că nu am nevoie de rezistențele de limitare a curentului! să lucrez cu codul meu, deoarece LED-ul ar trece prin numere folosind un singur buton, astfel încât să-mi verifice codul și aspectul. Nu a fost nevoie de mult, dar panoul de confirmare a confirmat că mă aflu într-o formă bună. După testele de breadboarding, am inversat rutinele, așa că majoritatea timpului afișau constant numere și ISR pentru a verifica butoanele. Motivul pentru care am făcut acest lucru a fost doar pentru a avea un afișaj constant, deoarece PIC rulează cu un ceas intern de 4 MHz, pierd foarte puțin timp scanând butoane. Nu este mare lucru … depinde doar de modul în care doriți să faceți codul și de ceea ce are cel mai mult sens pentru fiecare aplicație. Pentru aceasta, afișajul este important, așa că am pus acest lucru în rutina principală. Când au sosit primele mele piese (toate cele 6 afișaje!), Am finalizat cablajul plăcii și am găsit o altă problemă. Când apăsați butonul, codul meu avea niște registre neglijent care nu erau șterse, iar ISR provoca unele erori minore de afișare.; ======================== =================================================== =====; Turn Counter;; -----------; Dsply3 Dsply2; Dsply4 Dsply1; Led1 Led3; A5 | 4 15 | A6 - Led2; Vss | 5 14 | Vdd; Buton1 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;; ================================== ==============================================; Istoricul reviziilor și note:; V1.0 Header Initial, Cod 3/30/09;;; (C) 5/2009; Acest cod poate fi utilizat pentru învățarea / aplicarea / modificarea personală; Orice utilizare a acestui cod în produsele comerciale încalcă această versiune gratuită..; ------------------------------------------------ ------------------------------- # include P16F627A. INC; ============= =================================================== ================; Definește; ------------------------------------------------ -------------------------------; ================== =================================================== ===========; Date;------------------------------------------------ -------------------------------; Variabilă de păstrare a timpului 1 ech 20 număr2 ech 21 dis1 ech 22dis2 ech 23dis3 equ 24dis4 equ 25dis5 equ 26dis6 equ 27w_temp equ 28status_temp equ 29ISRCNTR equ 2A; ====================== =================================================== =======; Resetați vectorii;; VERIFICĂ CONFIG. BIȚII ÎNAINTE DE ARZARE !!!; INTOSC; MCLR: ACTIVAT; PWRUP: ACTIVAT; TOȚI ALȚII: DEZACTIVAȚI !!;; ------------------------------------------ ------------------------------------- RESET_ADDR EQU 0x00 ISR_ADDR EQU 0x04 org RESET_ADDR începe la început; == =================================================== ============================; ISR;; ----------------------------------------------- -------------------------------- org ISR_ADDR movwf w_temp swapf STATUS, w movwf status_temp;; ISR AICI; Verificați comutatoarele PB0-PB5 btfsc PORTB, 0; Verificați apelul SW1 sw1debounce btfsc PORTB, 1; Verificați apelul SW1 sw2debounce btfsc PORTB, 2; Verificați apelul SW1 sw3debounce btfsc PORTB, 3; Verificați apelul SW1 sw4debounce btfsc PORTB, 4; Verificați apelul SW1 sw5debounce btfsc PORTB, 5; Verificați apelul SW1 sw6debounce Goto endisrsw1debounce call debounce; Așteptați 0,2 secunde de apelare rebounce incf dis1; Actualizare contor movf dis1, W; Verificați dacă este depășit xorlw 0x1A; 10 pe 7-seg? btfss STATUS, Z return; Nu, reveniți la scanare. movlw h'10 '; Da, resetează afișajul. movwf dis1 returnează w2debounce apel debounce; Așteptați 0,2 secunde de apelare deblocare incf dis2; Actualizare contor movf dis2, W; Verificați dacă este prea mare xorlw 0x4A; 10 pe 7-seg? btfss STATUS, Z return; Nu, reveniți la scanare. movlw h'40 '; Da, resetează afișajul. movwf dis2 returnează w3debounce apel debounce; Așteptați 0,2 secunde de apelare rebounce incf dis3; Actualizare contor movf dis3, W; Verificați dacă este prea mare xorlw 0x5A; 10 pe 7-seg? btfss STATUS, Z return; Nu, reveniți la scanare. movlw h'50 '; Da, resetează afișajul. movwf dis3 returnează w4debounce apel debounce; Așteptați 0,2 secunde de apelare rebounce incf dis4; Actualizare contor movf dis4, W; Verificați dacă este depășit xorlw 0x8A; 10 pe 7-seg? btfss STATUS, Z return; Nu, reveniți la scanare. movlw h'80 '; Da, resetează afișajul. movwf dis4 returnează w5debounce apel debounce; Așteptați 0,2 secunde de apelare deblocare incf dis5; Actualizare contor movf dis5, W; Verificați dacă este depășit xorlw 0x9A; 10 pe 7-seg? btfss STATUS, Z return; Nu, reveniți la scanare. movlw h'90 '; Da, resetează afișajul. movwf dis5 returnează w6debounce apel debounce; Așteptați 0,2 secunde de apelare rebounce incf dis6; Actualizare contor movf dis6, W; Verificați dacă se depășește xorlw 0xCA; 10 pe 7-seg? btfss STATUS, Z return; Nu, reveniți la scanare. movlw h'C0 '; Da, resetează afișajul. movwf dis6 returnendisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie; ============================ =================================================== =; Începe aici!;---------------------------------------------- ---------------------------------start; Configurarea porturilor I / O clrf PORTA movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00 '; Ieșiri RA, RA5 Fără ieșire movwf TRISA bcf STATUS, RP0 clrf PORTB bsf STATUS, RP0 movlw h'FF'; Intrări RB movwf TRISB; Setați temporizatorul intern BSF PCON, 3; Setați la 4Mhz. movlw h'CF '; Tmr0 Sursă internă, prescală TMR0 1: 256 movwf OPTION_REG movlw h'A0 'movwf INTCON; Activați întreruperile TMR0, bcf STATUS, RP0; Inițializați Registrele clrf PORTA; Ștergeți PortA clrf PORTB; Ștergeți ieșirile 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 debounce; 0,2 sec; LED-uri de testare, afișaj 8 ???; ======================================= =========================================; Principal; Obține intrări de la afișaje de comutatoare, debounces și incriments.;; Aceasta actualizează afișajele, @ 4Mhz cu TMR0 prescal 1: 4, la o rată de 1Khz. Afișajul 1-6 este cablat.; În primul rând, BCD-7Seg IC este încărcat cu valoarea afișajului, ȘI BCD-Dec IC este activat pentru; selectarea afișajului;; În al doilea rând, este menținută o întârziere de ms pentru afișare.; IC este dezactivat … afișajul 0 este selectat pentru a opri afișajul;; Acest lucru se repetă pentru fiecare dintre cele 6 afișaje și este în buclă. -------------------------------------------------- --------------- main; Disp1 movf dis1, 0 movwf PORTA call ledon go main; ====================== =================================================== ========; A condus la; Timp de stabilire pentru pornirea LED-ului.; 6 afișaje -> 1/6 ciclu de funcționare la 1 Khz = 166 cicluri; ----------------------------------- -------------------------------------------- ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn; ============================================ =====================================; Semnal de debounce; 4 cicluri de încărcare și apel, 2 cicluri de revenire.; 4Mhz Tc:: count2 = 255 -> 0,2 sec; -------------------------------------- ----------------------------------------- debounce movlw.255; Întârziere pentru o retragere de 1/5 secunde. movwf count2 call pon_wait return; -------------------------------------------- -----------------------------------; count1 = 255d:: 775 cicluri la 0, + 3 cicluri pentru a reveni.; --------------------------------- ---------------------------------------------- pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F go short_loopS decfsz count2, F go big_loopSreturnend3 CIRCUITI avea inițial rezistențe 470Ohm din fiecare linie de driver de afișare din linia de activare 74LS47 și CD4028. Totuși, am testat curentul circuitului meu și am constatat că trăgea doar ~ 31mA. Și din moment ce driverul real pentru afișaje este direct de la 74LS47 și activarea este de la un alt IC, o reducere rapidă a cerințelor medii și de vârf și a fișelor tehnice respective ….. Am tras rezistențele de pe panou și am găsit o diferență de 1mA ! Se pare că conducerea directă a liniei CA de la 4028 în timp ce conduceți direct toate segmentele este OK! …un fel de.:) Am avut o eroare în codul meu care nu mi-a șters registrele când a fost apăsat un buton, determinând ultimul afișaj să aibă 2 segmente foarte aprinse când a fost apăsat un buton. A fost rău. Cu toate acestea, ștergerea registrului a rezolvat această problemă, iar verificările continue ale puterii confirmă că este în mod constant în jur de 30 mA. Acest lucru ar trebui să-mi ofere (pe baza experienței anterioare cu circuite similare) ~ 20 de ore de funcționare folosind 1 baterie de 9V (500mAH / 30mAH în conformitate cu reglementarea de 5V) … Sper! Am decis să mențin LED-urile direct acționate, dar să le pun în prize în caz că s-a întâmplat ceva, pe termen lung.

Pasul 4: lipire PCB

Lipire PCB
Lipire PCB

De fiecare dată când ajung în acest punct al proiectului meu întârzie abit. La început aveam să împachetez acest lucru, dar am renunțat rapid la această idee. La început cred că „Câteva fire de lipit, nu e mare lucru” … apoi, până când proiectul meu este gata să fie lipit, mă gândesc: Ar fi trebuit fie să trimit să fac o placă proto, fie să îmi gravez propria placă…Am petrecut aproximativ 3 ore lipind chestia asta. Este vorba de 150 de fire, deci sunt 300 de puncte de lipit, plus retușuri pentru poduri de lipit. Oricum, iată partea din spate a tabloului din imagine … da … abit de o mizerie, dar când a fost gata, am avut doar 1 lipire scurtă. Am luat 20 de minute de gândire, deoarece afișajul a arătat numărul greșit afișat într-un model logic pe care a trebuit să îl descifrez. După aceea, am localizat scurtul și bam! A funcționat perfect.

Pasul 5: Concluzie

Concluzie
Concluzie

A FUNCȚIONAT! Acest proiect a durat aproximativ; LED-uri Charlieplex 6 cu 7 segmente. Consumul de energie este de aproximativ 30 mA cu acest design, ceea ce nu este rău dacă aș spune și eu. Bănuiesc că ar putea fi utilizate mai multe LED-uri cu 7 segmente, dar nu am împins plicul. Această idee ar putea să fie aplicat la aproape ORICE aplicație folosind LED-uri cu 7 segmente; termometru, ceas, afișaj de text etc. Cu un cod dificil, ai putea avea un afișaj în mișcare sau imagini … poate chiar o bază pentru un proiect POV (persistența viziunii). Implementarea finală este lăsată pentru ca prietenul meu să-și construiască Turnul și așezați tabla, după cum consideră potrivit. Dacă / Când se face asta, voi primi o imagine încărcată. Dar în ceea ce privește circuitul, acesta pare a fi construit la comandă!

Recomandat: