Inhoudsopgave:

BloodBowl Turn Counter met 7-segment LED's - Ajarnpa
BloodBowl Turn Counter met 7-segment LED's - Ajarnpa

Video: BloodBowl Turn Counter met 7-segment LED's - Ajarnpa

Video: BloodBowl Turn Counter met 7-segment LED's - Ajarnpa
Video: Real Life Voodoo Doll Walks... 2024, November
Anonim
BloodBowl-draaiteller met LED's met 7 segmenten
BloodBowl-draaiteller met LED's met 7 segmenten

Dit project was voor een BloodBowl-spelbeurtteller met zes Charlieplexed 7-segment-LED's.

Stap 1: Concept

Concept
Concept

Een vriend van mij vroeg me naar ideeën voor het bouwen van een Bloodbowl Turn-teller voor zijn bordspel. Omdat ik niet wist wat dit was en wat hij wilde, duurde het even voordat ik besloot of en hoe ik dit ging doen. Ik moest eerst een idee hebben van wat hij wilde, dus begon ik met concept art (foto). Het basisidee is om 3 drukknoppen te hebben die elk 3 LED's bedienen en het zou in een op maat gemaakte toren worden geplaatst. Het enige grote verzoek was om de bovenste 4 displays te laten optellen van 0 tot 8 en te resetten, en de onderste 2 te hebben. displays tellen af van 8 naar 0 en fietsen terug. Ik zou het circuit voltooien, en hij zou de toren voltooien.

Stap 2: Ontwerp- en onderdelenlijst

Ontwerp & Onderdelenlijst
Ontwerp & Onderdelenlijst

Omdat het concept 6 7-segment LED's vereiste en ik een paar 8-bit Microchip PIC's bij de hand had, heb ik manieren onderzocht om de PIC's te gebruiken om LED's te besturen. Ik vond deze link https://www.mikroe.com/en/books /picbook/7_08chapter.htm waarin staat: "Tot 6 schermen kunnen op deze manier worden benaderd zonder dat de helderheid van elk scherm wordt beïnvloed." Ik vond dit een uitdaging en iets om te onderzoeken als onderdeel van mijn project. Het eerste wat ik deed, was een paar gloeiende 7-segments displays uit mijn doos pakken en kijken hoe ze zouden werken. Slecht nieuws. De specifieke onderdelen die ik selecteerde gedroegen zich niet zoals ik wilde. Het segment zou oplichten wanneer nodig, op het breadboard, maar lekstroom werd verdeeld over de andere 6 segmenten. Ik realiseerde me dat gloeilampen misschien niet de juiste keuze zijn, of dat ik ze op een andere manier moest gebruiken. Dus voor de eenvoud heb ik geverifieerd dat de 7-segments-LED's die ik bij de hand had, zouden werken voor breadboarding, en bestelde ik een aantal veelvoorkomende anodeschermen. Het tweede dat ik moest doen, was mijn ontwerp opmaken en aan de code gaan werken. Afgebeeld is mijn circuit. Niet veel aan, want de code in de PIC zorgt voor het multiplexen… errr Charlieplexing. Opmerking: ALLE 6 displays hebben DEZELFDE regels van het driver-IC. De selector-IC activeert elke weergave, 1 tegelijk, en de 7-segmentlijnen worden dienovereenkomstig bijgewerkt door de PIC. Heel eenvoudig idee. Daarna was het alleen nog nodig om code en hardware aan te vullen. Onderdelenlijst Na 3 kleine bestellingen van Digi-Key terwijl ik bepaalde componenten moest kiezen, had ik alles wat ik nodig had (met wat spullen bij de hand); 1 ~3"x4 " PCB6 kleine drukknopschakelaars (NO)1 74LS47, 7-segments display IC1 PIC16F627 1 CD4028, 1 van 10 selector IC 6 10KOhm weerstanden1 470Ohm weerstand1 draadspoel. Ik gebruikte verschillende kleuren en maten, maar dat was ik alleen.1 78L05 5V-regelaar1 9V-batterijclip1 9V-batterij1 kleine schakelaar (voor aan/uit) Ik beschouw dit als een redelijk complex project, vanwege: 1) Microprocessorcode vereist 2) Solderen en breadboarding 3) Ontwerpoptimalisatie. Geen van deze problemen is op zich al te ingewikkeld, maar ze allemaal aan te pakken zonder enige ervaring kan een beetje veel zijn voor de beginner. Er is een hardwareprogrammeur nodig om het apparaat, het soldeerstation, enz. te branden… Het EERSTE dat iemand opvalt, is dat de 7-segments LED's GEEN serie (stroombeperkende) weerstanden hebben! Laat me dat snel aanpakken, door te vermelden dat mijn oorspronkelijke ontwerp ze bevatte … maar lees de volgende stap voor uitleg!

Stap 3: Breadboarding en microcode

Breadboarden en microcode
Breadboarden en microcode

Breadboard was hiervoor een must. Getoond wordt mijn generieke breadboard, maar voor de grootte van dit project heb ik deze en een kleinere breadboard gebruikt, omdat er veel draden waren die uit elkaar moesten worden geplaatst. Eerst testte ik een enkele 7-segment LED met behulp van de initiële code. Dit bevestigde 3 dingen; 1) De bedrading van de IC's was goed geverifieerd! 2) Heeft me ertoe gebracht mijn code te optimaliseren en af te ronden. 3) Deed me beseffen dat ik de stroombeperkende weerstanden niet nodig had! om met mijn code te werken, omdat de LED door nummers zou gaan met één drukknopschakelaar, zodat mijn code en lay-out werden geverifieerd. Er was niet veel nodig, maar breadboarding bevestigde dat ik in goede vorm verkeerde.2 CODEI had oorspronkelijk mijn code ingesteld met een hoofdroutine om naar knoppen te scannen en de ISR (Interrupt Service Routine) gaf de cijfers weer,. Na breadboarding-tests heb ik de routines omgekeerd, dus het grootste deel van de tijd was het constant het weergeven van nummers en de ISR om te controleren op knoppen. De reden dat ik dit deed, was gewoon om een constant beeld te hebben, aangezien de PIC draait met een interne 4Mhz klok, verlies ik heel weinig tijd met het zoeken naar knoppen. Geen probleem … hangt er gewoon van af hoe u de code wilt doen en wat het meest logisch is voor elke toepassing. Hiervoor is display belangrijk, dus ik heb dat in de hoofdroutine gezet. Toen mijn eerste onderdelen arriveerden (alle 6 displays!), Voltooide ik de bedrading van het breadboard en vond ik een ander probleem. Bij het indrukken van de knop had mijn code enkele slordige registers die niet werden gewist en de ISR veroorzaakte enkele kleine schermstoringen.;======================== ================================================== =====;Draaiteller;; -----------;Dsply3 Dsply2;Dsply4 Dsply1;Led1 Led3; A5 |4 15| A6 -- Led2; Vss |5 14| Vdd;Knop1 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;;================================== =============================================; Revisiegeschiedenis en opmerkingen:; V1.0 Initiële koptekst, code 30-3-09;;;(C) 5/2009;Deze code kan worden gebruikt voor persoonlijk leren/toepassing/aanpassing.;Elk gebruik van deze code in commerciële producten is in strijd met deze freeware-release.;Voor vragen/opmerkingen, neem contact op met circuit dot mage op yahoo dot com.;------------------------------------------------ -------------------------------#include P16F627A. INC;============= ================================================== ================; Definieert;------------------------------------------------ -------------------------------;================== ================================================== ===========; Gegevens;------------------------------------------------ -------------------------------; Tijdwaarnemingsvariabelencount1 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;======================================================================= ================================================== =======; Reset vectoren;; CONTROLEER CONFIG. BITS VOOR HET VERBRANDEN!!!; INTOSC; MCLR: INGESCHAKELD; PWRUP: INGESCHAKELD; ALLE ANDERE: UITSCHAKELEN!!;;------------------------------------------ -------------------------------------RESET_ADDR EQU 0x00 ISR_ADDR EQU 0x04 org RESET_ADDR ga naar start;== ================================================== ===========================; ISR;;----------------------------------------------- --------------------------------org ISR_ADDR movwf w_temp swapf STATUS, w movwf status_temp;; ISR HIER; Controleer PB0-PB5 Switches btfsc PORTB, 0; Controleer SW1 oproep sw1debounce btfsc PORTB, 1; Controleer SW1 oproep sw2debounce btfsc PORTB, 2; Controleer SW1 oproep sw3debounce btfsc PORTB, 3; Controleer SW1 oproep sw4debounce btfsc PORTB, 4; Controleer SW1 oproep sw5debounce btfsc PORTB, 5; Controleer SW1 oproep sw6debounce ga naar endisrsw1debounce oproep debounce; Wacht 0,2 sec. oproep debounce incf dis1; Update teller movf dis1, W; Controleer op overloop xorlw 0x1A; 10 op 7-seg? btfss STATUS, Z terugkeer; Nee, ga terug naar scannen. movlw h'10'; Ja, display resetten. movwf dis1 returnsw2debounce oproep debounce; Wacht 0,2 sec. oproep debounce incf dis2; Update teller movf dis2, W; Controleer op overloop xorlw 0x4A; 10 op 7-seg? btfss STATUS, Z terugkeer; Nee, ga terug naar scannen. movlw h'40'; Ja, display resetten. movwf dis2 returnsw3debounce oproep debounce; Wacht 0,2 sec. oproep debounce incf dis3; Update teller movf dis3, W; Controleer op overloop xorlw 0x5A; 10 op 7-seg? btfss STATUS, Z terugkeer; Nee, ga terug naar scannen. movlw h'50'; Ja, display resetten. movwf dis3 returnsw4debounce oproep debounce; Wacht 0,2 sec. oproep debounce incf dis4; Update teller movf dis4, W; Controleer op overloop xorlw 0x8A; 10 op 7-seg? btfss STATUS, Z terugkeer; Nee, ga terug naar scannen. movlw h'80'; Ja, display resetten. movwf dis4 returnsw5debounce oproep debounce; Wacht 0,2 sec. oproep debounce incf dis5; Update teller movf dis5, W; Controleer op overloop xorlw 0x9A; 10 op 7-seg? btfss STATUS, Z terugkeer; Nee, ga terug naar scannen. movlw h'90'; Ja, display resetten. movwf dis5 returnsw6debounce oproep debounce; Wacht 0,2 sec. oproep debounce incf dis6; Update teller movf dis6, W; Controleer op overloop xorlw 0xCA; 10 op 7-seg? btfss STATUS, Z terugkeer; Nee, ga terug naar scannen. movlw h'C0'; Ja, display resetten. movwf dis6 returnendisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie;=========================== ================================================== =; Begin hier!;---------------------------------------------- ---------------------------------begin; Config I/O-poorten clrf PORTA movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00';RA Uitgangen, RA5 Geen uitgang movwf TRISA bcf STATUS, RP0 clrf PORTB bsf STATUS, h'RP0'; RB-ingangen movwf TRISB; Interne timer instellen bsf PCON, 3; Stel in op 4Mhz. movlw h'CF'; Tmr0 Interne bron, voorschaal TMR0 1:256 movwf OPTION_REG movlw h'A0' movwf INTCON; Schakel TMR0-interrupts, bcf STATUS, RP0 in; Initialiseer registers clrf PORTA; Wis poortA clrf PORTB; Wissen PortB-uitgangen 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 debounce; 0.2 sec;test-LED's, display 8 ???;====================================== =========================================; Hoofd; Ontvangt invoer van schakelaars, debounces en incriments-displays.;;Hiermee worden de displays, @4Mhz met TMR0 prescal 1:4, bijgewerkt met een snelheid van 1Khz.;Display 0 wordt gebruikt om toe te wijzen aan een ongebruikt display. Display 1-6 zijn bedraad.;Ten eerste wordt BCD-7Seg IC geladen met displaywaarde, EN BCD-Dec IC wordt geactiveerd voor;displayselectie.;Ten tweede wordt een vertraging van ms aangehouden voor weergave.;Ten derde, BCD-Dec IC is gedeactiveerd…display0 is geselecteerd om het display uit te schakelen;;Dit wordt herhaald voor elk van de 6 displays, en in een lus.;ISR handelt de schakelaardetectie af met een snelheid van 15Hz.;-------------- -------------------------------------------------- ---------------main;Disp1 movf dis1, 0 movwf PORTA bel ledon goto main;===================== ================================================== ========; Ledon; Insteltijd voor LED-stroom aan.; 6 displays -> 1/6 duty cycle bij 1Khz = 166 cycli;----------------------------------- --------------------------------------------ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn;=========================================== ====================================; Debounce signaal; 4 cycli om te laden en te bellen, 2 cycli om terug te keren.; 4Mhz Tc:: count2=255 -> 0.2 sec;-------------------------------------- ----------------------------------------- debounce movlw.255; Vertraging voor 1/5 seconde debounce. movwf count2 call pon_wait return;-------------------------------------------- -----------------------------------; count1=255d:: 775 cycli naar 0, + 3 cycli om terug te keren.;--------------------------------- ----------------------------------------------pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 CIRCUITI had oorspronkelijk 470Ohm-weerstanden van elke display-driverlijn van de 74LS47 en CD4028 enable-lijn. Ik heb echter het stroomverbruik van mijn circuit getest en ontdekte dat het slechts ~ 31 mA trok. En aangezien de eigenlijke driver voor de displays rechtstreeks van de 74LS47 komt en het inschakelen van een ander IC is, een snel overzicht van de gemiddelde en piekvereisten en de respectieve datasheets … Ik trok de weerstanden van het breadboard en vond een verschil van 1 mA ! Het lijkt erop dat het direct besturen van de CA-lijn van de 4028 en het rechtstreeks besturen van alle segmenten OK is! …soort van.:)Ik had een storing in mijn code waardoor mijn registers niet werden gewist toen er op een knop werd gedrukt, waardoor het laatste scherm 2 segmenten heel helder verlichtte wanneer er op een knop werd gedrukt. Dit was slecht. Het wissen van het register loste dit probleem echter op, en continue stroomcontroles bevestigen dat het constant rond de 30mA trekt. Dit zou me (gebaseerd op eerdere ervaring met soortgelijke circuits) ~20 uur bedrijfstijd moeten geven met 1 9V-batterij (500mAH/30mAH onder 5V-regeling) … Ik hoop! Ik heb besloten om de LED's direct aangedreven te houden, maar ze in stopcontacten in als er iets gebeurt, op lange termijn.

Stap 4: PCB-solderen

PCB-solderen
PCB-solderen

Elke keer dat ik op dit punt in mijn project kom, stel ik een beetje uit. In het begin wilde ik dit ding draadwikkelen, maar liet dat idee al snel varen. Eerst denk ik "Een paar draden om te solderen, geen probleem" … en tegen de tijd dat mijn project klaar is om te worden gesoldeerd, denk ik: " Ik had ofwel moeten sturen om een protobord te laten maken, of mijn eigen bord moeten etsen". Ik ben (nog) niet dol op PCB-etsen en wilde geen $$ betalen om een bord te laten maken, dus….. Ik heb ongeveer 3 uur besteed aan het solderen van dit ding. Het zijn ongeveer 150 draden, dus dat zijn 300 soldeerpunten, plus retouches voor soldeerbruggen. Hoe dan ook, hier is de achterkant van het bord afgebeeld … ja … een beetje een puinhoop, maar toen het allemaal klaar was, had ik maar 1 soldeertekort. Duurde 20 minuten nadenken omdat het display de verkeerde #'s liet zien in een logisch patroon dat ik moest ontcijferen. Daarna vond ik de korte, en bam! Het werkte perfect.

Stap 5: Conclusie

Conclusie
Conclusie

HET WERKTE! Dit project duurde ongeveer; ~ 2 weken om na te denken over en fijne punten naar de aanvrager te e-mailen, ~ 3 uur codeaanvulling en debuggen, ~ 4 uur breadboarden en debuggen, ~ 3 uur solderen Met slechts 3 IC's is het mogelijk om Charlieplex 6 7-segment LED's. Stroomverbruik is ongeveer 30 mA met dit ontwerp, wat niet slecht is als ik het zelf zeg. Ik vermoed dat er meer 7-segment LED's kunnen worden gebruikt, maar heb niet de grenzen verlegd. Dit idee zou worden toegepast op bijna ELKE toepassing met behulp van 7-segment LED's; thermometer, klok, tekstdisplay, enz. Met een lastige code zou je een bewegend display of afbeeldingen kunnen hebben … misschien zelfs een basis voor een POV-project (persistentie van visie). De uiteindelijke implementatie wordt overgelaten aan mijn vriend om zijn toren te bouwen en plaats het bord naar eigen inzicht. Als/wanneer dat is gebeurd, krijg ik een foto geüpload. Maar wat het circuit betreft, dit lijkt op bestelling te zijn gebouwd!

Aanbevolen: