Indholdsfortegnelse:

BloodBowl-tæller ved hjælp af 7-segmenters lysdioder: 5 trin
BloodBowl-tæller ved hjælp af 7-segmenters lysdioder: 5 trin

Video: BloodBowl-tæller ved hjælp af 7-segmenters lysdioder: 5 trin

Video: BloodBowl-tæller ved hjælp af 7-segmenters lysdioder: 5 trin
Video: Я работаю в Страшном музее для Богатых и Знаменитых. Страшные истории. Ужасы. 2024, Juli
Anonim
BloodBowl-tæller ved hjælp af 7-segmenters lysdioder
BloodBowl-tæller ved hjælp af 7-segmenters lysdioder

Dette projekt var til en BloodBowl-spil tæller ved hjælp af seks Charlieplexed 7-segment LED'er.

Trin 1: Koncept

Koncept
Koncept

En af mine venner spurgte mig om ideer til at bygge Bloodbowl Turn counter til hans brætspil. Uden at vide, hvad dette var, og hvad han ville, tog det et stykke tid at beslutte, om og hvordan jeg skulle gøre dette. Jeg skulle først have en idé om, hvad han ville, så jeg startede med konceptkunst (billede). Den grundlæggende idé er at have 3 trykknapper, der kontrollerer 3 lysdioder hver, og det ville blive placeret inde i et specialbygget tårn. skærme tæller ned fra 8 til 0 og cykler tilbage. Jeg ville fuldføre kredsløbet, og han ville fuldføre tårnet.

Trin 2: Design og reservedelsliste

Design og reservedelsliste
Design og reservedelsliste

Da konceptet krævede 6 LED'er med 7 segmenter, og jeg havde nogle 8-bit Microchip PIC'er til rådighed, undersøgte jeg måder at bruge PIC'erne til at styre LED'er. Jeg fandt dette link https://www.mikroe.com/da/books /picbook/7_08chapter.htm der siger "Der kan opnås op til 6 skærme på denne måde uden at lysstyrken på hver skærm påvirkes." Jeg betragtede dette som en udfordring og noget at undersøge som en del af mit projekt. Det første, jeg gjorde, var at tage nogle glødelamper med 7 segmenter fra min boks og se, hvordan de ville fungere. Dårlige nyheder. De bestemte dele, jeg valgte, opførte sig ikke, som jeg ville. Segmentet ville lyse efter behov på brødbrættet, men lækstrøm blev distribueret til de andre 6 segmenter. Jeg indså, at glødeskærme måske ikke var vejen frem, eller jeg havde brug for at bruge dem på en anden måde. Så for enkelheds skyld bekræftede jeg, at de 7-segmenters lysdioder, jeg havde til rådighed, ville fungere til breadboarding og bestilte nogle fælles anodeskærme. Den anden ting, jeg skulle gøre, var at oprette mit design og starte arbejdet med koden. På billedet er mit kredsløb. Ikke meget ved det, da koden i PIC tager sig af multiplexing … fejl Charlieplexing. Bemærk: ALLE 6 skærme har de samme linjer fra driver -IC. Vælger-IC muliggør hvert display, 1 ad gangen, og linjerne med 7 segmenter opdateres af PIC'en i overensstemmelse hermed. Meget enkel idé. Derefter var kode- og hardwareudførelse alt, hvad der var nødvendigt. Deleliste Efter 3 små ordrer fra Digi-Key, mens jeg besluttede mig for bestemte komponenter, havde jeg alt, hvad jeg havde brug for (med nogle ting ved hånden); 1 ~ 3 "x4 "PCB6 små trykknapkontakter (NO) 1 74LS47, 7-segment display IC1 PIC16F627 1 CD4028, 1 af 10 vælger IC 6 10KOhm modstande1 470Ohm modstand1 trådrulle. Jeg brugte forskellige farver og målinger, men det var bare mig.1 78L05 5V regulator1 9V batteriklips1 9V batteri1 lille switch (til tænd/sluk) Jeg betragter dette som et moderat komplekst projekt på grund af; 1) Mikroprocessorkode påkrævet2) Lodning og breadboarding 3) Designoptimering. Ingen af disse spørgsmål i sig selv er overdrevent komplicerede, men det kan være meget for begyndere at tage dem alle sammen uden erfaring. En hardwareprogrammerer er påkrævet for at brænde enheden, loddestationen osv. Den FØRSTE ting, nogen måske bemærker, er, at LED'erne med 7 segmenter IKKE har seriemodstande (strømbegrænsende)! Lad mig tage fat på det hurtigt ved at angive, at mit originale design havde dem i … men læs det næste trin til forklaring!

Trin 3: Breadboarding & Micro Code

Breadboarding & Micro Code
Breadboarding & Micro Code

Brødbræt var et must til dette. Der er vist mit generiske brødbræt, men for størrelsen af dette projekt brugte jeg faktisk dette og et mindre brødbræt, da der var mange ledninger, der skulle fordeles. Først testede jeg en enkelt 7-segment LED ved hjælp af den første kode. Dette bekræftede 3 ting; 1) Ledninger til IC'erne blev bekræftet godt! 2) Fik mig til at optimere og færdiggøre min kode. 3) Fik mig til at indse, at jeg ikke havde brug for de nuværende begrænsningsmodstande! 1 WIRINGSom angivet, blev mit skematiske design fundet at arbejde med min kode, da lysdioden ville gennemgå tal ved hjælp af en trykknapkontakt, så det bekræftede min kode og layout. Ikke meget var påkrævet, men breadboarding bekræftede, at jeg var i god form. 2 CODEI havde oprindeligt min kode indstillet med en hovedrutine til at scanne efter knapper, og ISR (Interrupt Service Routine) viser tallene,. Efter breadboarding -test vendte jeg rutinerne, så størstedelen af tiden viste konstant tal og ISR'en for at kontrollere for knapper. Grunden til at jeg gjorde dette, var bare for at have et konstant display, da PIC kører med et internt 4Mhz ur, mister jeg meget lidt tid på at scanne efter knapper. Ingen big deal … afhænger bare af, hvordan du vil gøre koden, og hvad der giver mest mening for hver applikation. Til dette er display vigtigt, så jeg satte det i hovedrutinen. Da mine første dele ankom (alle 6 skærme!), Færdiggjorde jeg brødbrættets ledninger og fandt et andet problem. Da jeg trykkede på knappen, havde min kode nogle sjuskede registre, der ikke blev ryddet, og ISR forårsagede nogle mindre displayfejl.; ========================= ====================================================== =====; Drej tæller;; -----------; Dsply3 Dsply2; Dsply4 Dsply1; Led1 Led3; A5 | 4 15 | A6 - Led2; Vss | 5 14 | Vdd; Knap1 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;; ===================================== =================================================; Revisionshistorik og noter:; V1.0 Initial Header, kode 3/30/09;;; (C) 5/2009; Denne kode kan bruges til personlig læring/anvendelse/ændring.; Enhver brug af denne kode i kommercielle produkter overtræder denne freeware -udgivelse.; For spørgsmål/kommentarer, kontakt circuit dot mage på yahoo dot com.; ------------------------------------------------ -------------------------------#inkluderer P16F627A. INC; =============== ====================================================== ==================; Definerer ------------------------------------------------ -------------------------------; ==================== ====================================================== ============; Data;------------------------------------------------ -------------------------------; Tidsregulerende variabler 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; ======================= ====================================================== ========; Nulstil vektorer;; Tjek KONFIG. BIT FØR BRÆNDNING !!!; INTOSC; MCLR: AKTIVERET; PWRUP: AKTIVERET; ALLE ANDRE: DØMME !!;; ------------------------------------------ ------------------------------------- RESET_ADDR EQU 0x00 ISR_ADDR EQU 0x04 org RESET_ADDR start; == ====================================================== ==============================; ISR;; ---------------------------------------------- -------------------------------- org ISR_ADDR movwf w_temp swapf STATUS, w movwf status_temp;; ISR HER; Kontroller PB0-PB5 switches btfsc PORTB, 0; Kontroller SW1 -opkald sw1debounce btfsc PORTB, 1; Kontroller SW1 -opkald sw2debounce btfsc PORTB, 2; Kontroller SW1 -opkald sw3debounce btfsc PORTB, 3; Kontroller SW1 -opkald sw4debounce btfsc PORTB, 4; Kontroller SW1 -opkald sw5debounce btfsc PORTB, 5; Kontroller SW1 opkald sw6debounce gå til endisrsw1debounce opkald debounce; Vent 0,2 sek opkald debounce incf dis1; Opdater tæller movf dis1, W; Kontroller for overløb xorlw 0x1A; 10 på 7-seg? btfss STATUS, Z return; Nej, gå tilbage til scanningen. movlw h'10 '; Ja, nulstil display. movwf dis1 returnererw2debounce opkald debounce; Vent 0,2 sek opkald debounce incf dis2; Opdater tæller movf dis2, W; Kontroller for overløb xorlw 0x4A; 10 på 7-seg? btfss STATUS, Z return; Nej, gå tilbage til scanningen. movlw h'40 '; Ja, nulstil display. movwf dis2 returnererw3debounce opkald debounce; Vent 0,2 sek opkald debounce incf dis3; Opdater tæller movf dis3, W; Kontroller for overløb xorlw 0x5A; 10 på 7-seg? btfss STATUS, Z return; Nej, gå tilbage til scanningen. movlw h'50 '; Ja, nulstil display. movwf dis3 returnererw4debounce opkald debounce; Vent 0,2 sek opkald debounce incf dis4; Opdater tæller movf dis4, W; Kontroller for overløb xorlw 0x8A; 10 på 7-seg? btfss STATUS, Z return; Nej, gå tilbage til scanningen. movlw h'80 '; Ja, nulstil display. movwf dis4 returnererw5debounce opkald debounce; Vent 0,2 sek opkald debounce incf dis5; Opdater tæller movf dis5, W; Kontroller for overløb xorlw 0x9A; 10 på 7-seg? btfss STATUS, Z return; Nej, gå tilbage til scanningen. movlw h'90 '; Ja, nulstil display. movwf dis5 returnererw6debounce opkald debounce; Vent 0,2 sek opkald debounce incf dis6; Opdater tæller movf dis6, W; Kontroller for overløb xorlw 0xCA; 10 på 7-seg? btfss STATUS, Z return; Nej, gå tilbage til scanningen. movlw h'C0 '; Ja, nulstil display. movwf dis6 returnendisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie; ============================= ======================================================= =; Start her!;---------------------------------------------- ---------------------------------Start; Config I/O -porte clrf PORTA movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00 '; RA Outputs, RA5 Ingen output movwf TRISA bcf STATUS, RP0 clrf PORTB bsf STATUS, RP0 movlw h'FF; RB Indgange movwf TRISB; Indstil intern timer bsf PCON, 3; Indstillet til 4Mhz. movlw h'CF '; Tmr0 Intern kilde, forudskala TMR0 1: 256 movwf OPTION_REG movlw h'A0 'movwf INTCON; Aktiver TMR0 -afbrydelser, bcf STATUS, RP0; Initialiser registre clrf PORTA; Ryd PortA clrf PORTB; Ryd PortB -udgange 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 opkald debounce; 0,2 sek. Test -lysdioder, display 8 ???; ======================================== ============================================; Main; Får input fra switches, debounces og incriments displays.;; Dette opdaterer displays, @4Mhz med TMR0 prescal 1: 4, med en 1Khz rate.; Display 0 bruges til at allokere til et ubrugt display. Display 1-6 er kablet.; Først er BCD-7Seg IC indlæst med visningsværdi, OG BCD-Dec IC er aktiveret for; displayvalg.; For det andet holdes en forsinkelse på ms for visning.; For det tredje, BCD-Dec IC er deaktiveret … display0 er valgt for at lukke skærmen;; Dette gentages for hver af de 6 displays og loopes.; ISR håndterer switch sensing med 15Hz rate.; -------------- ---------------------------------------------------------- --------------- main; Disp1 movf dis1, 0 movwf PORTA call ledon goto main; ======================= ======================================================= =========; Ledon; Afregningstid for LED tændt.; 6 displays-> 1/6 driftscyklus ved 1Khz = 166 cyklusser; ----------------------------------- -------------------------------------------- ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn; ============================================= =========================================; Afkaldssignal; 4 cykler til indlæsning og opkald, 2 cykler til at vende tilbage.; 4Mhz Tc:: count2 = 255-> 0,2 sek; -------------------------------------- ----------------------------------------- debounce movlw.255; Forsinkelse for 1/5 sekund debounce. movwf count2 call pon_wait return; -------------------------------------------- -----------------------------------; count1 = 255d:: 775 cykler til 0, + 3 cyklusser for at vende tilbage.; --------------------------------- ---------------------------------------------- pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 CIRCUITI havde oprindeligt 470Ohm modstande fra hver displaydriverlinje fra 74LS47 og CD4028 aktiveringslinjen. Imidlertid testede jeg mit kredsløbs nuværende trækning og fandt ud af, at det kun trak ~ 31mA. Og da den faktiske driver til skærmene er direkte fra 74LS47 og aktiveringen er fra en anden IC, en hurtig nedgang i gennemsnits- og spidskravene og de respektive datablade ….. Jeg trak modstandene fra brødbrættet og fandt en 1mA forskel ! Det ser ud til, at direkte kørsel af CA -linjen fra 4028, mens du kører alle segmenterne direkte, er OK! …På en måde.:) Jeg havde en fejl i min kode, der ikke slettede mine registre, da der blev trykket på en knap, hvilket fik det sidste display til at have 2 segmenter meget stærkt oplyst, da der blev trykket på en knap. Dette var dårligt. Imidlertid løste rydning af registret dette problem, og kontinuerlige strømkontroller bekræfter, at det konstant er omkring 30mA træk. Dette skulle give mig (baseret på tidligere erfaring med lignende kredsløb) ~ 20 timers driftstid ved brug af 1 9V batteri (500mAH/30mAH under 5V regulering) … Jeg håber! Jeg besluttede at beholde LED'erne direkte drevet, men satte dem i stikkontakter i hvis der skete noget på lang sigt.

Trin 4: PCB lodning

PCB lodning
PCB lodning

Hver gang jeg kommer til dette punkt i mit projekt, forsinker jeg abit. Først ville jeg indpakke denne ting, men droppede hurtigt den idé. Først tænker jeg "Et par ledninger til lodning, ikke så meget" … så, da mit projekt er klar til at blive loddet, tænker jeg, " Jeg skulle enten have sendt ud for at få lavet et prototavle, eller ætset mit eget bord ". Jeg er ikke til PCB -ætsning (endnu), og ville ikke betale $$ for at få lavet et bræt, så …. Ja ….. Jeg brugte cirka 3 timer på at lodde denne ting. Det drejer sig om 150 ledninger, så det er 300 loddepunkter plus touch-ups til loddebroer. Under alle omstændigheder er her bagsiden af brættet afbildet …. Tog 20 minutter at tænke på, siden displayet viste, at de forkerte #vises i et logisk mønster, som jeg var nødt til at tyde. Derefter fandt jeg den korte, og bam! Det fungerede perfekt.

Trin 5: Konklusion

Konklusion
Konklusion

DET VIRKEDE! Dette projekt tog omkring; ~ 2 uger at tænke over og e -maile fine point til forespørger, ~ 3 timer med kodeudfyldning og fejlfinding, ~ 4 timer med breadboarding og fejlfinding, ~ 3 timer med lodning Brug af kun 3 IC'er er det muligt at Charlieplex 6 lysdioder med 7 segmenter. Strømforbrug er på omkring 30mA med dette design, hvilket ikke er dårligt, hvis jeg selv siger det. Jeg formoder, at der kunne bruges flere 7-segmenters LED'er, men har ikke skubbet konvolutten. Denne idé kunne anvendes på næsten ALLE applikationer ved hjælp af 7-segment LED'er; termometer, ur, tekstvisning osv. Med nogle vanskelige koder kan du have et bevægeligt display eller billeder … måske endda en base for et POV -projekt (vedholdenhed i synet). Den sidste implementering er tilbage for min ven at bygge sit tårn og læg tavlen i, som han finder passende. Hvis/Når det er gjort, får jeg uploadet et billede. Men hvad angår kredsløbet, ser det ud til at dette er bygget på bestilling!

Anbefalede: