Sommario:

Contagiri BloodBowl con LED a 7 segmenti: 5 passaggi
Contagiri BloodBowl con LED a 7 segmenti: 5 passaggi

Video: Contagiri BloodBowl con LED a 7 segmenti: 5 passaggi

Video: Contagiri BloodBowl con LED a 7 segmenti: 5 passaggi
Video: H1 Replacement/Installation 2024, Novembre
Anonim
Contagiri BloodBowl con LED a 7 segmenti
Contagiri BloodBowl con LED a 7 segmenti

Questo progetto era per un contagiri di gioco BloodBowl che utilizzava sei LED a 7 segmenti Charlieplexed.

Passaggio 1: concetto

Concetto
Concetto

Un mio amico mi ha chiesto delle idee per costruire il segnalino Turno di Bloodbowl per il suo gioco da tavolo. Non sapendo cosa fosse e cosa volesse, ci è voluto un po' per decidere se e come lo avrei fatto. Prima dovevo avere un'idea di cosa voleva, quindi ho iniziato con la concept art (immagine). L'idea di base è quella di avere 3 pulsanti, che controllano 3 LED ciascuno e che sarebbe collocato all'interno di una torre costruita su misura. L'unica grande richiesta era di avere i primi 4 display che contassero da 0 a 8 e si resettassero, e che i 2 inferiori visualizza il conto alla rovescia da 8 a 0 e torna indietro. Io completerei il circuito e lui completerebbe la torre.

Passaggio 2: design e elenco delle parti

Design e elenco delle parti
Design e elenco delle parti

Poiché il concetto richiedeva 6 LED a 7 segmenti e avevo a portata di mano alcuni PIC Microchip a 8 bit, ho cercato modi per utilizzare i PIC per controllare i LED. Ho trovato questo link https://www.mikroe.com/en/books /picbook/7_08chapter.htm che afferma "È possibile accedere a fino a 6 display in questo modo senza che la luminosità di ciascun display venga influenzata". Ho considerato questa una sfida e qualcosa da indagare come parte del mio progetto. La prima cosa che ho fatto è stata prendere alcuni display a 7 segmenti incandescenti dalla mia scatola e vedere come avrebbero funzionato. Cattive notizie. Le parti particolari che ho selezionato non si comportavano come avrei voluto. Il segmento si accendeva quando necessario, sulla breadboard, ma la corrente di dispersione veniva distribuita agli altri 6 segmenti. Mi sono reso conto che i display a incandescenza potrebbero non essere la strada da percorrere, o avevo bisogno di usarli in un modo diverso. Quindi, per semplicità, ho verificato che i LED a 7 segmenti che avevo a portata di mano avrebbero funzionato per il breadboard e ho ordinato alcuni display anodi comuni. La seconda cosa che dovevo fare era impaginare il mio progetto e iniziare a lavorare sul codice. Nella foto è il mio circuito. Non c'è molto da fare, poiché il codice nel PIC si occupa del multiplexing… err Charlieplexing. Nota: TUTTI e 6 i display hanno le STESSE linee del driver IC. Il selettore IC abilita ogni visualizzazione, 1 alla volta, e le linee a 7 segmenti vengono aggiornate di conseguenza dal PIC. Idea molto semplice. Dopodiché, il completamento del codice e dell'hardware è tutto ciò che era necessario. Elenco delle parti Dopo 3 piccoli ordini da Digi-Key mentre decidevo su componenti specifici, avevo tutto ciò di cui avevo bisogno (con alcune cose a portata di mano); 1 ~ 3 "x4 " PCB6 interruttori a pulsante piccoli (NA)1 74LS47, display a 7 segmenti IC1 PIC16F627 1 CD4028, 1 di 10 selettore IC 6 resistori da 10KOhm1 resistore da 470Ohm1 rocchetto di filo. Ho usato vari colori e calibri, ma ero solo io.1 Regolatore 78L05 5V1 clip batteria 9V1 batteria 9V1 piccolo interruttore (per l'accensione/spegnimento) Lo considero un progetto moderatamente complesso, a causa di;1) È richiesto il codice del microprocessore2) Saldatura e breadboarding 3) Ottimizzazione del design. Nessuno di questi problemi di per sé è eccessivamente complicato, ma affrontarli tutti senza alcuna esperienza può essere un po' troppo per il principiante. È necessario un programmatore hardware per masterizzare il dispositivo, la stazione di saldatura, ecc. La PRIMA cosa che qualcuno potrebbe notare è che i LED a 7 segmenti NON hanno resistori in serie (limitatori di corrente)! Permettetemi di affrontarlo rapidamente, affermando che il mio design originale li conteneva … ma leggete il passaggio successivo per la spiegazione!

Passaggio 3: breadboard e microcodice

Breadboard e microcodice
Breadboard e microcodice

Il breadboard era un must per questo. Viene mostrata la mia breadboard generica, ma per le dimensioni di questo progetto ho effettivamente usato questa e una breadboard più piccola, poiché c'erano molti fili che dovevano essere distanziati. Innanzitutto, ho testato un singolo LED a 7 segmenti utilizzando il codice iniziale. Ciò ha confermato 3 cose;1) Il cablaggio dei circuiti integrati è stato verificato correttamente!2) Mi ha portato a ottimizzare e finalizzare il mio codice.3) Mi ha fatto capire che non avevo bisogno dei resistori di limitazione della corrente!1 CABLAGGIOCome affermato, il mio progetto schematico è stato trovato per funzionare con il mio codice, poiché il LED scorreva i numeri utilizzando un interruttore a pulsante, in modo da verificare il mio codice e il layout. Non è stato richiesto molto, ma il breadboard ha confermato che ero in buona forma.2 In origine il CODEI aveva impostato il mio codice con una routine principale per la scansione dei pulsanti e l'ISR (Interrupt Service Routine) visualizzava i numeri,. Dopo i test di breadboard, ho invertito le routine, quindi la maggior parte del tempo visualizzava costantemente i numeri e l'ISR per verificare la presenza di pulsanti. Il motivo per cui l'ho fatto era solo per avere un display costante, poiché il PIC funziona con un orologio interno a 4 Mhz, sto perdendo pochissimo tempo a cercare i pulsanti. Niente di grave…dipende solo da come vuoi creare il codice e da cosa ha più senso per ogni applicazione. Per questo, il display è importante, quindi l'ho inserito nella routine principale. Quando sono arrivate le mie prime parti (tutti e 6 i display!), Ho completato il cablaggio della breadboard e ho riscontrato un altro problema. Quando ho premuto il pulsante il mio codice aveva alcuni registri sciatti che non venivano cancellati e l'ISR stava causando alcuni piccoli problemi di visualizzazione.;======================== ================================================== =====;Contagiri;; -----------;Dsply3 Dsply2;Dsply4 Dsply1;Led1 Led3; A5 |4 15| A6 - Led2; Vss |5 14| Vdd;Pulsante1 B0 |6 13| B7; B1 |7 12| B6; B2 |8 11| B5; B3 |9 10| B4; -----------;; LED1-3 - IC BCD-dec -LEDSeg's1-6; Dsply1-3 - BCD-7seg IC -Dsply#1-9;;================================== =============================================; Cronologia e note delle revisioni:; V1.0 Intestazione iniziale, codice 30/03/09;;;(C) 5/ 2009;Questo codice può essere utilizzato per apprendimento/applicazione/modifica personali.;Qualsiasi utilizzo di questo codice in prodotti commerciali viola questa versione freeware.;Per domande/commenti, contattare circuit dot mage at yahoo dot com.;------------------------------------------------ -----------------#include P16F627A. INC;============= ================================================== ================; Definisce;------------------------------------------------ -----------------;================== ================================================== ===========; Dati;------------------------------------------------ -----------------; Variabili cronometraggiocount1 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;====================== ================================================== =======; Ripristina vettori;; VERIFICA CONFIG. PUNTE PRIMA DI BRUCIARE!!!; INTOSC; MCLR: ABILITATO; PWRUP: ABILITATO; TUTTI GLI ALTRI: DISABILITA!!;;------------------------------------------ -------------------------------------RESET_ADDR EQU 0x00 ISR_ADDR EQU 0x04 org RESET_ADDR goto start;== ================================================== ===========================; PVR;; ---------------------------------- --------------------------------org ISR_ADDR movwf w_temp swapf STATUS, w movwf status_temp;; ISR QUI; Controllare gli switch PB0-PB5 btfsc PORTB, 0; Controlla SW1 chiama sw1debounce btfsc PORTB, 1; Controlla SW1 chiama sw2debounce btfsc PORTB, 2; Controlla SW1 chiama sw3debounce btfsc PORTB, 3; Controlla SW1 chiama sw4debounce btfsc PORTB, 4; Controlla SW1 chiama sw5debounce btfsc PORTB, 5; Check SW1 call sw6debounce goto endisrsw1debounce call debounce; Attendere 0.2 sec chiamata antirimbalzo incf dis1; Aggiorna contatore movf dis1, W; Verificare l'overflow xorlw 0x1A; 10 su 7 segmenti? btfss STATUS, Z return; No, torna alla scansione. movlw h'10'; Sì, ripristina il display. movwf dis1 restituisce la chiamata w2debounce antirimbalzo; Attendere 0.2 sec chiamata antirimbalzo incf dis2; Aggiorna contatore movf dis2, W; Verificare l'overflow xorlw 0x4A; 10 su 7 segmenti? btfss STATUS, Z return; No, torna alla scansione. movimento h'40'; Sì, ripristina il display. movwf dis2 restituisce la chiamata w3debounce debounce; Attendere 0.2 sec chiamata antirimbalzo incf dis3; Aggiorna contatore movf dis3, W; Verificare l'overflow xorlw 0x5A; 10 su 7 segmenti? btfss STATUS, Z return; No, torna alla scansione. movimento h'50'; Sì, ripristina il display. movwf dis3 restituisce la chiamata w4debounce antirimbalzo; Attendere 0.2 sec chiamata antirimbalzo incf dis4; Aggiorna contatore movf dis4, W; Verificare l'overflow xorlw 0x8A; 10 su 7 segmenti? btfss STATUS, Z return; No, torna alla scansione. movimento h'80'; Sì, ripristina il display. movwf dis4 restituisce w5debounce call debounce; Attendere 0.2 sec chiamata antirimbalzo incf dis5; Aggiorna contatore movf dis5, W; Verificare l'overflow xorlw 0x9A; 10 su 7 segmenti? btfss STATUS, Z return; No, torna alla scansione. movimento h'90'; Sì, ripristina il display. movwf dis5 restituisce w6debounce call debounce; Attendere 0.2 sec chiamata antirimbalzo incf dis6; Aggiorna contatore movf dis6, W; Verificare l'overflow xorlw 0xCA; 10 su 7 segmenti? btfss STATUS, Z return; No, torna alla scansione. movlw h'C0'; Sì, ripristina il display. movwf dis6 returnendisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie;============================ ================================================== =; Comincia qui!;---------------------------------------------- ---------------------------------cominciare; Configurazione porte I/O clrf PORTA movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00';RA Uscite, RA5 Nessuna uscita movwf TRISA bcf STATUS, RP0 clrf PORTB bsf STATUS, hRP'0. RB Ingressi movwf TRISB; Imposta timer interno bsf PCON, 3; Impostato su 4 Mhz. movlw h'CF'; Tmr0 Sorgente interna, prescala TMR0 1:256 movwf OPTION_REG movlw h'A0' movwf INTCON; Abilita gli interrupt TMR0, bcf STATUS, RP0; Inizializza Registri clrf PORTA; Cancella Porta clrf PORTA B; Cancella uscite 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 dis6 h'C0'movlw antirimbalzo; 0,2 sec;test LED, display 8 ???;===================================== =========================================; Principale; Riceve input da interruttori, antirimbalzi e incriminazioni display.;;Questo aggiorna i display, @4Mhz con TMR0 prescal 1:4, a una velocità di 1Khz.;Il display 0 viene utilizzato per allocare a un display inutilizzato. I display 1-6 sono cablati.; Primo, BCD-7Seg IC viene caricato con il valore del display, E BCD-Dec IC è attivato per la selezione del display.; Secondo, viene trattenuto un ritardo di ms per il display.; Terzo, BCD-Dec IC è disattivato…display0 è selezionato per spegnere il display;;Questo viene ripetuto per ciascuno dei 6 display e in loop.;ISR gestisce il rilevamento dell'interruttore a una frequenza di 15Hz.;-------------- --------------------------------------------------- ---------------main;Disp1 movf dis1, 0 movwf PORTA call ledon goto main;===================== ================================================== ========; Ledone; Tempo di stabilizzazione per l'accensione del LED.; 6 display -> 1/6 duty cycle a 1Khz = 166 cicli;----------------------------------- ------------------------------ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn;=========================================== ====================================; Segnale antirimbalzo; 4 cicli per caricare e chiamare, 2 cicli per tornare.; 4Mhz Tc:: count2=255 -> 0.2 sec;-------------------------------------- ------------------------------------------debounce movlw.255; Ritardo per antirimbalzo di 1/5 di secondo. movwf count2 call pon_wait return;---------------------------------------------------------- -----------------------------------; count1=255d:: 775 cicli a 0, + 3 cicli per tornare.;--------------------------------- ------------------pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 CIRCUITI originariamente aveva resistori da 470Ohm da ciascuna linea del driver del display dalla linea di abilitazione 74LS47 e CD4028. Tuttavia, ho testato l'assorbimento di corrente del mio circuito e ho scoperto che tirava solo ~ 31 mA. E poiché il driver effettivo per i display proviene direttamente dal 74LS47 e l'abilitazione proviene da un altro IC, un rapido abbassamento dei requisiti di media e picco e dei rispettivi datasheet… Ho tolto i resistori dalla breadboard e ho trovato una differenza di 1 mA ! Sembra che guidare direttamente la linea CA dal 4028 mentre si guida direttamente tutti i segmenti sia OK! …una specie di.:) Ho avuto un problema tecnico nel mio codice che non ha cancellato i miei registri quando è stato premuto un pulsante, causando l'ultimo display con 2 segmenti molto luminosi quando è stato premuto un pulsante. Questo era male. Tuttavia, la cancellazione del registro ha risolto questo problema e i continui controlli dell'alimentazione confermano che è costantemente intorno ai 30 mA di assorbimento. Questo dovrebbe darmi (basato sull'esperienza precedente con circuiti simili) ~20 ore di autonomia usando una batteria da 1 9V (500mAH/30mAH sotto la regolazione 5V)…spero!Ho deciso di mantenere i LED pilotati direttamente, ma li ho inseriti nelle prese in caso è successo qualcosa, a lungo termine.

Passaggio 4: saldatura PCB

Saldatura PCB
Saldatura PCB

Ogni volta che arrivo a questo punto del mio progetto ritardo un po'. All'inizio stavo per avvolgere questa cosa, ma ho subito abbandonato l'idea. All'inizio penso "Alcuni fili da saldare, niente di grave"… poi, quando il mio progetto è pronto per essere saldato, penso " Avrei dovuto inviare una scheda proto o incidere la mia scheda"…Ho impiegato circa 3 ore a saldare questa cosa. Sono circa 150 fili, quindi sono 300 punti di saldatura, più ritocchi per i ponti di saldatura. Comunque, ecco il lato posteriore della scheda nella foto… sì… un po' di confusione, ma quando tutto è stato fatto ho avuto solo 1 saldatura in corto. Ci sono voluti 20 minuti di riflessione poiché il display mostrava i # sbagliati visualizzati in uno schema logico che dovevo decifrare. Dopo di che, ho localizzato il corto, e bam! Ha funzionato perfettamente.

Passaggio 5: conclusione

Conclusione
Conclusione

HA FUNZIONATO! Questo progetto ha richiesto circa; ~ 2 settimane per pensare e inviare via e-mail i punti fini al richiedente, ~ 3 ore di completamento del codice e debug, ~ 4 ore di breadboard e debug, ~ 3 ore di saldatura Utilizzando solo 3 circuiti integrati è possibile Charlieplex 6 LED a 7 segmenti. L'assorbimento di potenza è di circa 30 mA con questo design, il che non è male se lo dico io stesso. Sospetto che si potrebbero usare più LED a 7 segmenti, ma non ho spinto la busta. Questa idea potrebbe essere applicato a quasi QUALSIASI applicazione utilizzando LED a 7 segmenti; termometro, orologio, display di testo, ecc. Con un codice ingannevole, potresti avere un display in movimento o immagini … forse anche una base per un progetto POV (persistenza della visione). L'implementazione finale è lasciata al mio amico per costruire la sua Torre e posiziona la scacchiera, come meglio crede. Se/quando sarà fatto, otterrò un'immagine caricata. Ma per quanto riguarda il circuito, questo sembra essere costruito su ordinazione!

Consigliato: