Innehållsförteckning:

BloodBowl-räknare med 7-segment-lysdioder: 5 steg
BloodBowl-räknare med 7-segment-lysdioder: 5 steg

Video: BloodBowl-räknare med 7-segment-lysdioder: 5 steg

Video: BloodBowl-räknare med 7-segment-lysdioder: 5 steg
Video: Force vs. Dodger - Crendorian Invitational Week 1 (Blood Bowl 2) 2024, November
Anonim
BloodBowl-räknare med 7-segment-lysdioder
BloodBowl-räknare med 7-segment-lysdioder

Detta projekt var för en BloodBowl-spelvarvräknare med sex Charlieplexed 7-segment-lysdioder.

Steg 1: Koncept

Begrepp
Begrepp

En vän till mig frågade mig om idéer för att bygga Bloodbowl Turn counter för hans brädspel. Eftersom jag inte visste vad detta var och vad han ville, tog det ett tag att avgöra om och hur jag skulle göra det. Jag var först tvungen att ha en uppfattning om vad han ville, så jag började med konceptkonst (bild). Grundtanken är att ha tre tryckknappar, som styr tre lysdioder vardera och den skulle placeras inuti ett specialbyggt torn. Den enda stora begäran var att få de fyra bästa displayerna att räkna från 0 till 8 och återställa och ha de nedre 2 skärmar räknar ner från 8 till 0 och cyklar tillbaka. Jag skulle slutföra kretsen och han skulle slutföra tornet.

Steg 2: Design- och reservlista

Design och reservdelar
Design och reservdelar

Eftersom konceptet krävde 6 lysdioder med 7 segment och jag hade några 8-bitars Microchip PIC till hands, undersökte jag sätt att använda PIC: erna för att styra lysdioder. Jag hittade den här länken https://www.mikroe.com/en/books /picbook/7_08chapter.htm som säger "Upp till 6 skärmar kan nås så här utan att ljusstyrkan på varje skärm påverkas." Jag ansåg detta vara en utmaning och något att undersöka som en del av mitt projekt. Det första jag gjorde var att ta några glödlampor med 7 segment från min låda och se hur de skulle fungera. Dåliga nyheter. De specifika delarna jag valde uppförde sig inte som jag ville. Segmentet tändes vid behov på brödbrädet, men läckström fördelades till de andra 6 segmenten. Jag insåg att glödlampor kanske inte är rätt väg, eller jag behövde använda dem på ett annat sätt. Så för enkelhets skull verifierade jag att de 7-segmentiga lysdioderna jag hade till hands skulle fungera för brödbräda och beställde några vanliga anoddisplayer. Det andra jag behövde göra var att utforma min design och börja arbeta med koden. På bilden är min krets. Inte mycket för det, eftersom koden i PIC tar hand om multiplexen … fel Charlieplexing. Obs! ALLA 6 bildskärmar har samma linjer från drivrutins -IC. Väljar-IC möjliggör varje display, 1 åt gången, och 7-segmentslinjerna uppdateras av PIC i enlighet därmed. Mycket enkel idé. Efter det är kod och hårdvara komplettering allt som behövdes. Dellista Efter 3 små beställningar från Digi-Key när jag bestämde mig för specifika komponenter hade jag allt jag behövde (med lite saker till hands); 1 ~ 3 "x4 "PCB6 små tryckknappar (NO) 1 74LS47, 7-segment display IC1 PIC16F627 1 CD4028, 1 av 10 väljare IC 6 10KOhm motstånd1 470Ohm motstånd1 trådrulle. Jag använde olika färger och mätare, men det var bara jag.1 78L05 5V regulator1 9V batteriklämma1 9V batteri1 liten strömbrytare (för ström på/av) Jag anser att detta är ett måttligt komplext projekt på grund av; 1) Mikroprocessorkod krävs2) Lödning och breadboarding 3) Designoptimering. Ingen av dessa frågor i sig är alltför komplicerade, men att ta på sig alla utan erfarenhet kan vara mycket för nybörjaren. En hårdvaruprogrammerare krävs för att bränna enheten, lödstationen, etc … Den FÖRSTA tingen någon kan märka är att lysdioderna med 7 segment INTE har seriemotstånd (strömbegränsande)! Låt mig ta itu med det snabbt genom att ange att min ursprungliga design hade dem … men läs nästa steg för förklaring!

Steg 3: Breadboarding & Micro Code

Breadboarding & Micro Code
Breadboarding & Micro Code

Brödbräda var ett måste för detta. Visas min generiska brödbräda, men för storleken på detta projekt använde jag faktiskt den här och en mindre brödbräda, eftersom det var många trådar som behövde fördelas. Först testade jag en enda 7-segmentig LED med initial kod. Detta bekräftade 3 saker; 1) Kabeldragning av IC: erna verifierades bra! 2) Ledde mig att optimera och slutföra min kod. 3) Fick mig att inse att jag inte behövde de nuvarande begränsningsmotstånden! att arbeta med min kod, eftersom lysdioden skulle bläddra igenom siffror med en knappknapp, så att verifierade min kod och layout. Det krävdes inte mycket men breadboarding bekräftade att jag var i gott skick.2 CODEI hade ursprungligen min kod inställd med en huvudrutin för att söka efter knappar och ISR (Interrupt Service Routine) visar siffrorna,. Efter breadboarding -test vände jag rutinerna, så majoriteten av tiden visade ständigt siffror och ISR för att kolla efter knappar. Anledningen till att jag gjorde detta var bara för att ha en konstant skärm, eftersom PIC körs med en intern 4Mhz -klocka förlorar jag väldigt lite tid på att söka efter knappar. Ingen stor sak … beror bara på hur du vill göra koden och vad som är mest vettigt för varje applikation. För detta är displayen viktig, så jag satte det i huvudrutinen. När mina första delar kom (alla 6 displayer!), Jag slutförde brödbrädans ledningar och hittade ett annat problem. När jag tryckte på knappen hade min kod några slarviga register som inte raderades och ISR orsakade några mindre displayfel.; ========================= ===================================================== =====; 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;; ==================================== ================================================; Revisionshistorik och anteckningar:; V1.0 Initial Header, kod 3/30/09;;; (C) 5/2009; Denna kod kan användas för personlig inlärning/applikation/modifiering..; ------------------------------------------------ -------------------------------#inkluderar P16F627A. INC; ============== ===================================================== ==================; Definierar; ------------------------------------------------- -------------------------------; ==================== ===================================================== ============; Data;------------------------------------------------ -------------------------------; Tidsvariabler räkna1 ekv 20 räkna2 ekv 21 dis1 ekv 22dis2 ekv 23dis3 ekv 24dis4 ekv 25dis5 ek 26dis6 ekv 27w_temp ek 28status_temp ek 29ISRCNTR ekv 2A; ======================= ===================================================== ========; Återställ vektorer;; KONTROLLERA KONFIG. BIT FÖR BRÄNNING !!!; INTOSC; MCLR: AKTIVERAT; PWRUP: AKTIVERAD; ALLA ANDRA: INAKTIVERA !!;; ------------------------------------------ ------------------------------------- RESET_ADDR EQU 0x00 ISR_ADDR EQU 0x04 org RESET_ADDR starta; == ===================================================== ==============================; ISR;; ---------------------------------------------- -------------------------------- org ISR_ADDR movwf w_temp swapf STATUS, w movwf status_temp;; ISR HÄR; Kontrollera PB0-PB5-omkopplare btfsc PORTB, 0; Kontrollera SW1 -samtal sw1debounce btfsc PORTB, 1; Kontrollera SW1 -samtal sw2debounce btfsc PORTB, 2; Kontrollera SW1 -samtal sw3debounce btfsc PORTB, 3; Kontrollera SW1 -samtal sw4debounce btfsc PORTB, 4; Kontrollera SW1 -samtal sw5debounce btfsc PORTB, 5; Kontrollera SW1 -samtal sw6debounce goto endisrsw1debounce call debounce; Vänta 0,2 sek samtal debounce incf dis1; Uppdatera räknare movf dis1, W; Kontrollera om överflöd xorlw 0x1A; 10 på 7-seg? btfss STATUS, Z return; Nej, återgå till skanningen. movlw h'10 '; Ja, återställ displayen. movwf dis1 returnerarw2debounce samtal debounce; Vänta 0,2 sek samtal debounce incf dis2; Uppdatera räknare movf dis2, W; Kontrollera om överflöd xorlw 0x4A; 10 på 7-seg? btfss STATUS, Z return; Nej, återgå till skanningen. movlw h'40 '; Ja, återställ displayen. movwf dis2 returnerarw3debounce samtal debounce; Vänta 0,2 sek samtal debounce incf dis3; Uppdatera räknare movf dis3, W; Kontrollera om överflöd xorlw 0x5A; 10 på 7-seg? btfss STATUS, Z return; Nej, återgå till skanningen. movlw h'50 '; Ja, återställ displayen. movwf dis3 returnerarw4debounce samtal debounce; Vänta 0,2 sek samtal debounce incf dis4; Uppdatera räknare movf dis4, W; Kontrollera om överflöd xorlw 0x8A; 10 på 7-seg? btfss STATUS, Z return; Nej, återgå till skanningen. movlw h'80 '; Ja, återställ displayen. movwf dis4 returnerarw5debounce samtal debounce; Vänta 0,2 sek samtal debounce incf dis5; Uppdatera räknare movf dis5, W; Kontrollera om överflöd xorlw 0x9A; 10 på 7-seg? btfss STATUS, Z return; Nej, återgå till skanningen. movlw h'90 '; Ja, återställ displayen. movwf dis5 returnerarw6debounce samtal debounce; Vänta 0,2 sek samtal debounce incf dis6; Uppdatera räknare movf dis6, W; Kontrollera om överflöd xorlw 0xCA; 10 på 7-seg? btfss STATUS, Z return; Nej, återgå till skanningen. movlw h'C0 '; Ja, återställ displayen. movwf dis6 returnendisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie; ============================= ===================================================== =; Börja här!;---------------------------------------------- ---------------------------------Start; Config I/O -portar 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 Ingångar movwf TRISB; Ställ in intern timer bsf PCON, 3; Ställ in på 4Mhz. movlw h'CF '; Tmr0 Intern källa, förskala TMR0 1: 256 movwf OPTION_REG movlw h'A0 'movwf INTCON; Aktivera TMR0 -avbrott, bcf STATUS, RP0; Initiera register clrf PORTA; Rensa PortA clrf PORTB; Rensa PortB -utgångar 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 samtal debounce; 0,2 sek; test -LED, display 8 ???; ======================================== ===========================================; Huvud; Hämtar inmatningar från switchar, debounces och incriments displayer.;; Detta uppdaterar displayerna, @4Mhz med TMR0 prescal 1: 4, med en hastighet på 1 KHz.; Display 0 används för att allokera till en oanvänd display. Display 1-6 är anslutna.; Först laddas BCD-7Seg IC med visningsvärde, OCH BCD-Dec IC är aktiverat för; displayval.; För det andra hålls en fördröjning på ms för visning.; Tredje, BCD-Dec IC är avaktiverat … display0 väljs för att stänga av displayen;; Detta upprepas för var och en av de 6 bildskärmarna och slingas.; ISR hanterar omkopplingsavkänning med 15Hz-hastighet.; -------------- ---------------------------------------------------------- --------------- main; Disp1 movf dis1, 0 movwf PORTA call ledon goto main; ======================= ===================================================== =========; Ledon; Avräkningstid för LED -ström på.; 6 skärmar-> 1/6 arbetscykel vid 1Khz = 166 cykler; ----------------------------------- -------------------------------------------- ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn; ============================================ =======================================; Avvisa signal; 4 cykler för att ladda och ringa, 2 cykler för att återvända.; 4Mhz Tc:: count2 = 255-> 0,2 sek; -------------------------------------- ----------------------------------------- debounce movlw.255; Fördröjning för 1/5 sekunders debounce. movwf count2 call pon_wait return; -------------------------------------------- -----------------------------------; count1 = 255d:: 775 cykler till 0, + 3 cykler för att återvända.; --------------------------------- ---------------------------------------------- pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 CIRCUITI hade ursprungligen 470Ohm motstånd från varje displaydrivrutin från 74LS47 och CD4028 aktiveringslinjen. Jag testade dock min krets nuvarande dragning och fann att den bara drog ~ 31mA. Och eftersom den faktiska drivrutinen för bildskärmarna är direkt från 74LS47 och aktiveringen är från en annan IC, en snabb nedgång av genomsnitts- och toppkraven och respektive datablad ….. Jag drog ut motstånden från brädbrädan och fann en skillnad på 1 mA ! Det verkar som att det är OK att köra CA -linjen direkt från 4028 medan du kör alla segment direkt. …ungefär.:) Jag HAR haft en glitch i min kod som inte rensade mina register när en knapp trycktes, vilket gjorde att den sista displayen fick 2 segment att lysa mycket starkt när en knapp trycktes. Det här var dåligt. Genom att rensa registret åtgärdades dock detta problem och kontinuerliga effektkontroller bekräftar att det hela tiden är cirka 30 mA drag. Detta borde ge mig (baserat på tidigare erfarenhet av liknande kretsar) ~ 20 timmars körtid med 1 9V batteri (500mAH/30mAH enligt 5V -reglering) … Jag hoppas! Jag bestämde mig för att behålla lysdioderna direktdrivna, men satte dem i uttag i om något hände på lång sikt.

Steg 4: PCB -lödning

PCB -lödning
PCB -lödning

Varje gång jag kommer till denna punkt i mitt projekt fördröjer jag abit. Först tänkte jag linda in den här saken, men tappade snabbt den idén. Först tänker jag "Några ledningar för att löda, ingen stor grej" … då, när mitt projekt är klart att lödas tänker jag, " Jag borde antingen ha skickat ut för att få en proto -bräda gjord, eller etsat mitt eget bräda ". Jag är inte inne på PCB -etsning (ännu), och ville inte betala $$ för att få en bräda gjord, så … Ja ….. Jag spenderade ungefär 3 timmar på att löda den här saken. Det handlar om 150 trådar, så det är 300 lödpunkter, plus touch-ups för lödbroar. Hur som helst, här är baksidan av brädet på bilden …. Tog 20 minuter att tänka på sedan displayen visade fel #visas i ett logiskt mönster som jag var tvungen att dechiffrera. Efter det hittade jag den korta, och bam! Det fungerade perfekt.

Steg 5: Slutsats

Slutsats
Slutsats

DET FUNGERADE! Det här projektet tog ungefär; ~ 2 veckor att tänka på och skicka e -post med fina poäng till begäraren, ~ 3 timmar med kodfyllnad och felsökning, ~ 4 timmar med breadboarding och felsökning, ~ 3 timmar med lödning Med bara 3 IC: er är det möjligt att Charlieplex 6 lysdioder med 7 segment. Strömförbrukningen är cirka 30 mA med denna design, vilket inte är dåligt om jag säger det själv. Jag misstänker att fler lysdioder med 7 segment kan användas, men har inte tryckt på kuvertet. appliceras på nästan ALLA applikationer med lysdioder med 7 segment; termometer, klocka, textvisning etc. Med lite knepig kod kan du ha en rörlig display eller bilder … kanske till och med en bas för ett POV -projekt (persistens av vision). Den slutliga implementeringen är kvar för min vän att bygga sitt torn och placera brädan i, som han ser passar. Om/när det är gjort kommer jag att ladda upp en bild. Men när det gäller kretsen verkar detta vara byggt på beställning!

Rekommenderad: