Innholdsfortegnelse:

BloodBowl-teller med 7-segmenters lysdioder: 5 trinn
BloodBowl-teller med 7-segmenters lysdioder: 5 trinn

Video: BloodBowl-teller med 7-segmenters lysdioder: 5 trinn

Video: BloodBowl-teller med 7-segmenters lysdioder: 5 trinn
Video: Григорий Хайтин: сложность, метабиология, Гёдель, холодный синтез 2024, Juli
Anonim
BloodBowl-teller ved hjelp av 7-segmenters lysdioder
BloodBowl-teller ved hjelp av 7-segmenters lysdioder

Dette prosjektet var for en BloodBowl-turteller ved å bruke seks Charlieplexed 7-segmenters lysdioder.

Trinn 1: Konsept

Konsept
Konsept

En venn av meg spurte meg om ideer for å bygge Bloodbowl Turn counter for brettspillet hans. Uten å vite hva dette var, og hva han ønsket, tok det en stund å bestemme om og hvordan jeg skulle gjøre dette. Jeg måtte først ha en ide om hva han ville, så jeg begynte med konseptkunst (bilde). Den grunnleggende ideen er å ha 3 trykknapper, som kontrollerer 3 lysdioder hver, og den vil bli plassert inne i et spesialbygd tårn. viser teller ned fra 8 til 0 og sykler tilbake. Jeg ville fullføre kretsen, og han ville fullføre tårnet.

Trinn 2: Design og deleliste

Design og deleliste
Design og deleliste

Siden konseptet krevde 6 lysdioder med 7 segmenter, og jeg hadde noen 8-biters Microchip PIC-er tilgjengelig, undersøkte jeg måter å bruke PIC-ene til å kontrollere lysdioder. Jeg fant denne lenken https://www.mikroe.com/en/books /picbook/7_08chapter.htm som sier "Opptil 6 skjermer kan nås slik uten at lysstyrken på hver skjerm påvirkes." Jeg betraktet dette som en utfordring og noe å undersøke som en del av prosjektet mitt. Det første jeg gjorde, var å ta noen glødende 7-segmenters skjermer fra esken min og se hvordan de ville fungere. Dårlige nyheter. De bestemte delene jeg valgte oppførte seg ikke som jeg ville. Segmentet ville lyse når det var nødvendig, på brødbrettet, men lekkasjestrøm ble distribuert til de seks andre segmentene. Jeg innså at glødeskjermer kanskje ikke er veien å gå, eller at jeg trengte å bruke dem på en annen måte. Så for enkelhets skyld bekreftet jeg at 7-segmenters lysdioder jeg hadde for hånden ville fungere til brødbrett, og bestilte noen vanlige anodeskjermer. Den andre tingen jeg måtte gjøre var å sette opp designet mitt og starte arbeidet med koden. På bildet er kretsen min. Ikke mye for det, da koden i PIC tar seg av multipleksingen … feil Charlieplexing. Merk: ALLE 6 skjermer har de samme linjene fra driver -IC. Velgeren IC muliggjør hver visning, 1 om gangen, og linjene med 7 segmenter oppdateres av PIC tilsvarende. Veldig enkel idé. Etter det er fullføring av kode og maskinvare alt som trengs. Deleliste Etter 3 små bestillinger fra Digi-Key mens jeg bestemte meg for bestemte komponenter, hadde jeg alt jeg trengte (med noen ting for hånden); "Små trykknappbrytere PCB6 (NO) 1 74LS47, 7-segmenters display IC1 PIC16F627 1 CD4028, 1 av 10 selector IC 6 10KOhm motstander1 470Ohm motstand1 trådrulle. Jeg brukte forskjellige farger og målinger, men det var bare meg. 1 78L05 5V regulator 1 9V batteriklips 1 9V batteri 1 liten bryter (for strøm på/av) Jeg anser dette som et moderat komplekst prosjekt på grunn av; 1) Mikroprosessorkode påkrevd2) Lodding og breadboarding 3) Designoptimalisering. Ingen av disse problemene i seg selv er altfor kompliserte, men å ta dem alle uten erfaring kan være mye for nybegynneren. En maskinvareprogrammerer er nødvendig for å brenne enheten, loddestasjonen osv. Den FØRSTE tingen noen kan legge merke til er at lysdiodene med 7 segmenter IKKE har seriemotstander (strømbegrensende)! La meg ta det raskt, ved å si at det opprinnelige designet mitt hadde dem i … men les neste trinn for forklaring!

Trinn 3: Breadboarding og mikrokode

Breadboarding og mikrokode
Breadboarding og mikrokode

Brødbrett var et must for dette. Det generiske brødbrettet mitt er vist, men for størrelsen på dette prosjektet brukte jeg faktisk dette og et mindre brødbrett, da det var mange ledninger som måtte skilles ut. Først testet jeg en enkelt 7-segment LED ved hjelp av den første koden. Dette bekreftet 3 ting; 1) Kabling av IC -er ble bekreftet bra! 2) Fikk meg til å optimalisere og fullføre koden min. 3) Fikk meg til å innse at jeg ikke trengte de nåværende begrensningsmotstandene! for å jobbe med koden min, ettersom lysdioden ville bla gjennom tall ved hjelp av en trykknappbryter, slik at det bekreftet koden og oppsettet mitt. Ikke mye var nødvendig, men breadboarding bekreftet at jeg var i god form. 2 CODEI hadde opprinnelig min kode satt med en hovedrutine for å søke etter knapper og ISR (Interrupt Service Routine) viser tallene, Etter breadboarding -tester snudde jeg rutinene, så det meste av tiden viste stadig tall og ISR for å se etter knapper. Grunnen til at jeg gjorde dette, var bare for å ha en konstant visning, siden PIC kjører med en intern 4Mhz klokke, mister jeg veldig lite tid på å søke etter knapper. Ikke så farlig … avhenger bare av hvordan du vil gjøre koden og hva som gir mest mening for hver applikasjon. For dette er display viktig, så jeg satte det inn i hovedrutinen. Da mine første deler kom (alle 6 displayene!), Fullførte jeg brødbrettledningen og fant et annet problem. Da jeg trykte på knappen hadde koden min slurvede registre som ikke ble slettet, og ISR forårsaket noen mindre feil på skjermen.; ========================= ===================================================== =====; Turn Counter;; -----------; Dsply3 Dsply2; Dsply4 Dsply1; Led1 Led3; A5 | 4 15 | A6 - Led2; Vss | 5 14 | Vdd; Knapp1 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;; ==================================== =================================================; Revisjonshistorikk og notater:; V1.0 Initial Header, kode 3/30/09;;; (C) 5/2009; Denne koden kan brukes til personlig læring/applikasjon/modifikasjon.; Enhver bruk av denne koden i kommersielle produkter bryter denne freeware -utgivelsen.; For spørsmål/kommentarer, kontakt circuit dot mage på yahoo dot com.; ------------------------------------------------ -------------------------------#inkluderer P16F627A. INC; =============== ===================================================== ==================; Definerer ------------------------------------------------ -------------------------------; ==================== ===================================================== ============; Data;------------------------------------------------ -------------------------------; Tidsholdbare 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; ======================= ===================================================== ========; Tilbakestill vektorer;; SJEKK KONFIG. BITS FØR BRENN !!!; INTOSC; MCLR: AKTIVERT; PWRUP: AKTIVERT; ALLE ANDRE: DEABLE !!;; ------------------------------------------ ------------------------------------- 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; Sjekk PB0-PB5-brytere btfsc PORTB, 0; Sjekk SW1 -ring sw1debounce btfsc PORTB, 1; Sjekk SW1 -ring sw2debounce btfsc PORTB, 2; Sjekk SW1 -ring sw3debounce btfsc PORTB, 3; Sjekk SW1 -samtalen sw4debounce btfsc PORTB, 4; Sjekk SW1 -ring sw5debounce btfsc PORTB, 5; Sjekk SW1 samtale sw6debounce gå til endisrsw1debounce samtale debounce; Vent 0,2 sek ringe debounce incf dis1; Oppdater teller movf dis1, W; Se etter overløp xorlw 0x1A; 10 på 7-seg? btfss STATUS, Z return; Nei, gå tilbake til skanningen. movlw h'10 '; Ja, tilbakestill skjermen. movwf dis1 returnererw2debounce samtale debounce; Vent 0,2 sek ringe debounce incf dis2; Oppdater teller movf dis2, W; Se etter overløp xorlw 0x4A; 10 på 7-seg? btfss STATUS, Z return; Nei, gå tilbake til skanningen. movlw h'40 '; Ja, tilbakestill skjermen. movwf dis2 returnererw3debounce samtale debounce; Vent 0,2 sek ringe debounce incf dis3; Oppdater teller movf dis3, W; Se etter overløp xorlw 0x5A; 10 på 7-seg? btfss STATUS, Z return; Nei, gå tilbake til skanningen. movlw h'50 '; Ja, tilbakestill skjermen. movwf dis3 returnererw4debounce samtale debounce; Vent 0,2 sek ringe debounce incf dis4; Oppdater teller movf dis4, W; Se etter overløp xorlw 0x8A; 10 på 7-seg? btfss STATUS, Z return; Nei, gå tilbake til skanningen. movlw h'80 '; Ja, tilbakestill skjermen. movwf dis4 returnererw5debounce samtale debounce; Vent 0,2 sek ringe debounce incf dis5; Oppdater teller movf dis5, W; Se etter overløp xorlw 0x9A; 10 på 7-seg? btfss STATUS, Z return; Nei, gå tilbake til skanningen. movlw h'90 '; Ja, tilbakestill skjermen. movwf dis5 returnererw6debounce samtale debounce; Vent 0,2 sek ringe debounce incf dis6; Oppdater teller movf dis6, W; Se etter overløp xorlw 0xCA; 10 på 7-seg? btfss STATUS, Z return; Nei, gå tilbake til skanningen. movlw h'C0 '; Ja, tilbakestill skjermen. 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 -porter clrf PORTA movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00 '; RA Outputs, RA5 No output movwf TRISA bcf STATUS, RP0 clrf PORTB bsf STATUS, RP0 movlw h'FF; RB Innganger movwf TRISB; Sett intern timer bsf PCON, 3; Sett til 4Mhz. movlw h'CF '; Tmr0 Intern kilde, forhåndsskala TMR0 1: 256 movwf OPTION_REG movlw h'A0 'movwf INTCON; Aktiver TMR0 -avbrudd, bcf STATUS, RP0; Initialiser registre clrf PORTA; Fjern PortA clrf PORTB; Fjern PortB -utganger 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 samtale debounce; 0,2 sek; testlysdioder, display 8 ???; ======================================== ============================================; Hoved; Får innganger fra brytere, debounces og incriments -skjermer.;; Dette oppdaterer displayene, @4Mhz med TMR0 prescal 1: 4, med en 1Khz -hastighet.; Display 0 brukes til å allokere til et ubrukt display. Display 1-6 er kablet.; Først er BCD-7Seg IC lastet med visningsverdi, OG BCD-Dec IC er aktivert for; displayvalg.; For det andre holdes en forsinkelse på ms for visning.; For det tredje, BCD-Dec IC er deaktivert … display0 er valgt for å slå av skjermen;; Dette gjentas for hver av de 6 skjermene og sløyfes. ISR håndterer bryterføling med 15Hz hastighet.; -------------- -------------------------------------------------- --------------- main; Disp1 movf dis1, 0 movwf PORTA call ledon goto main; ======================= ====================================================== =========; Ledon; Oppgjørstid for LED -strøm på.; 6 skjermer-> 1/6 driftssyklus ved 1Khz = 166 sykluser; ----------------------------------- -------------------------------------------- ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn; ============================================= =======================================; Avbryte signal; 4 sykluser for å laste og ringe, 2 sykluser for å returnere.; 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 sykluser til 0, + 3 sykluser for å returnere.; --------------------------------- ---------------------------------------------- pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 CIRCUITI hadde opprinnelig 470Ohm motstander fra hver skjermdriverlinje fra 74LS47 og CD4028 aktiveringslinjen. Imidlertid testet jeg kretsens nåværende tegning og fant at den bare trakk ~ 31mA. Og siden den faktiske driveren for skjermene er direkte fra 74LS47 og aktiveringen er fra en annen IC, en rask nedgang av gjennomsnitts- og toppkravene og de respektive databladene ….. Jeg dro motstandene fra brødbrettet og fant en 1mA forskjell ! Det ser ut til at det er OK å kjøre CA -linjen direkte fra 4028 mens du kjører alle segmentene direkte. …på en måte.:) Jeg hadde en feil i koden min som ikke slettet registret mitt da en knapp ble trykket, noe som forårsaket at den siste skjermen hadde 2 segmenter veldig sterkt opplyst da en knapp ble trykket. Dette var ille. Imidlertid løste dette problemet problemet ved å slette registeret, og kontinuerlige strømkontroller bekrefter at det hele tiden er rundt 30mA trekk. Dette burde gi meg (basert på tidligere erfaring med lignende kretser) ~ 20 timers kjøretid ved bruk av 1 9V batteri (500mAH/30mAH under 5V regulering) … Jeg håper! Jeg bestemte meg for å beholde lysdiodene direkte, men satte dem i stikkontakter i hvis noe skjedde på lang sikt.

Trinn 4: PCB -lodding

PCB lodding
PCB lodding

Hver gang jeg kommer til dette punktet i prosjektet, forsinker jeg abit. Først skulle jeg pakke denne tingen inn, men droppet raskt den ideen. Først tenker jeg "Noen ledninger til lodding, ikke så farlig" … så når prosjektet mitt er klart for lodding, tenker jeg, " Jeg burde enten ha sendt ut for å få laget et proto -brett, eller etset mitt eget brett. ".. Jeg brukte omtrent 3 timer på å lodde denne tingen. Det er omtrent 150 ledninger, så det er 300 loddepunkter, pluss touch-ups for loddebroer. Uansett, her er baksiden av brettet avbildet …. Tok 20 minutter å tenke på siden displayet viste feil #vises i et logisk mønster som jeg måtte tyde. Etter det fant jeg den korte, og bam! Det fungerte perfekt.

Trinn 5: Konklusjon

Konklusjon
Konklusjon

DET fungerte! Dette prosjektet tok omtrent; ~ 2 uker å tenke på og sende fine poeng til forespørsel via e -post, ~ 3 timer med kodefylling og feilsøking, ~ 4 timer med breadboarding og feilsøking, ~ 3 timer med lodding Ved å bruke bare 3 IC -er er det mulig å Charlieplex 6 lysdioder med 7 segmenter. Strømforbruk er på omtrent 30mA med dette designet, noe som ikke er dårlig hvis jeg sier det selv. Jeg mistenker at flere lysdioder med 7 segmenter kan brukes, men har ikke presset konvolutten. Denne ideen kan brukes på nesten ALLE applikasjoner ved hjelp av 7-segmenters lysdioder; termometer, klokke, tekstvisning osv. Med litt vanskelig kode kan du ha en bevegelig skjerm eller bilder … kanskje til og med en base for et POV -prosjekt (vedvarende syn) -prosjekt. Den siste implementeringen er igjen for min venn å bygge sitt tårn og legg tavlen inn slik han synes det passer. Hvis/Når det er gjort, vil jeg få et bilde lastet opp. Men når det gjelder kretsen, ser dette ut til å være bygget for å bestille!

Anbefalt: