Índice:

BloodBowl Turn Counter usando LEDs de 7 segmentos: 5 etapas
BloodBowl Turn Counter usando LEDs de 7 segmentos: 5 etapas

Vídeo: BloodBowl Turn Counter usando LEDs de 7 segmentos: 5 etapas

Vídeo: BloodBowl Turn Counter usando LEDs de 7 segmentos: 5 etapas
Vídeo: LEGIONES ASTARTES - The Emperor's Angels | Warhammer 40k Lore 2024, Julho
Anonim
BloodBowl Turn Counter usando LEDs de 7 segmentos
BloodBowl Turn Counter usando LEDs de 7 segmentos

Este projeto foi para um contador de curvas BloodBowl usando seis LEDs de 7 segmentos Charlieplexed.

Etapa 1: conceito

Conceito
Conceito

Um amigo meu perguntou-me sobre ideias para construir o contador Bloodbowl Turn para seu jogo de tabuleiro. Sem saber o que era e o que ele queria, demorou um pouco para decidir se e como eu faria isso. Primeiro, eu precisava ter uma ideia do que ele queria, então comecei com a arte conceitual (imagem). A ideia básica é ter 3 botões de pressão, controlando 3 LEDs cada e seria colocado dentro de uma torre customizada. O único grande pedido era fazer com que os 4 monitores superiores contassem de 0 a 8 e reiniciassem, e os 2 inferiores os monitores fazem uma contagem regressiva de 8 a 0 e voltam. Eu completaria o circuito e ele completaria a torre.

Etapa 2: Design e lista de peças

Lista de Design e Peças
Lista de Design e Peças

Como o conceito exigia 6 LEDs de 7 segmentos e eu tinha alguns PICs de microchip de 8 bits à mão, pesquisei maneiras de usar os PICs para controlar LEDs. Encontrei este link https://www.mikroe.com/en/books /picbook/7_08chapter.htm que afirma "Até 6 monitores podem ser acessados desta forma sem que o brilho de cada monitor seja afetado." Considerei isso um desafio e algo a investigar como parte do meu projeto. A primeira coisa que fiz foi pegar alguns visores incandescentes de 7 segmentos da minha caixa e ver como funcionariam. Más notícias. As partes específicas que selecionei não estavam se comportando como eu queria. O segmento acenderia quando necessário, na placa de ensaio, mas a corrente de fuga foi distribuída para os outros 6 segmentos. Percebi que telas incandescentes podem não ser a melhor opção, ou eu precisava usá-las de uma maneira diferente. Portanto, para simplificar, verifiquei que os LEDs de 7 segmentos que tinha em mãos funcionariam para o breadboarding e pedi alguns visores de ânodo comuns. A segunda coisa que precisei fazer foi fazer o layout do meu projeto e começar a trabalhar no código. Na foto está o meu circuito. Não muito, já que o código no PIC cuida da multiplexação … errr Charlieplexing. Nota: TODOS OS 6 visores têm as MESMAS linhas do IC do driver. O seletor IC habilita cada exibição, 1 por vez, e as linhas de 7 segmentos são atualizadas pelo PIC de acordo. Ideia muito simples. Depois disso, a conclusão do código e do hardware é tudo o que foi necessário. Lista de peçasApós 3 pequenos pedidos da Digi-Key enquanto decidia sobre componentes específicos, eu tinha tudo que precisava (com algumas coisas em mãos); 1 ~ 3 "x4 "Interruptores de botão pequeno PCB6 (NO) 1 74LS47, display de 7 segmentos IC1 PIC16F627 1 CD4028, 1 de 10 seletor IC 6 resistores de 10KOhm1 resistor de 470Ohm1 carretel de fio. Usei várias cores e calibres, mas era só eu.1 78L05 5V regulador1 clipe de bateria de 9V1 bateria de 9V1 interruptor pequeno (para ligar / desligar) Eu considero este um projeto moderadamente complexo, devido a; 1) Código de microprocessador necessário2) Solda e breadboarding 3) Otimização do projeto. Nenhum desses problemas por si só é excessivamente complicado, mas enfrentá-los sem qualquer experiência pode ser um pouco demais para o iniciante. Um programador de hardware é necessário para queimar o dispositivo, estação de solda, etc … A PRIMEIRA coisa que alguém pode notar é que os LEDs de 7 segmentos NÃO têm resistores em série (limitadores de corrente)! Deixe-me abordar isso rapidamente, declarando que meu projeto original os continha … mas leia a próxima etapa para obter uma explicação!

Etapa 3: breadboarding e microcódigo

Breadboarding e Microcódigo
Breadboarding e Microcódigo

O breadboard era uma obrigação para isso. É mostrada minha placa de ensaio genérica, mas para o tamanho deste projeto, na verdade usei esta e uma placa de ensaio menor, pois havia muitos fios que precisavam ser espaçados. Primeiro, testei um único LED de 7 segmentos usando o código inicial. Isso confirmou 3 coisas; 1) A fiação dos ICs foi verificada como boa! 2) Me levou a otimizar e finalizar meu código.3) Me fez perceber que eu não precisava dos resistores de limitação de corrente! 1 FIAÇÃO Como declarado, meu projeto esquemático foi encontrado para trabalhar com meu código, pois o LED alternaria entre os números usando um botão de pressão, de modo que verificasse meu código e layout. Não era necessário muito, mas o breadboarding confirmou que eu estava em boa forma.2 O CODEI originalmente tinha meu código definido com uma rotina principal para procurar botões e o ISR (Rotina de Serviço de Interrupção) exibia os números,. Após os testes de breadboarding, inverti as rotinas, de modo que a maior parte do tempo exibia constantemente números e o ISR para verificar os botões. A razão pela qual fiz isso foi apenas para ter um display constante, já que o PIC está funcionando com um clock interno de 4Mhz, estou perdendo muito pouco tempo procurando por botões. Não é grande coisa … só depende de como você deseja fazer o código e o que faz mais sentido para cada aplicativo. Para isso, a tela é importante, então coloquei isso na rotina principal. Quando minhas primeiras peças chegaram (todas as 6 telas!), Concluí a fiação da placa de ensaio e encontrei outro problema. Ao apertar o botão, meu código apresentava alguns registros desleixados que não estavam sendo limpos e o ISR estava causando alguns pequenos problemas de exibição.; ========================== ========================================================== =====; Contador de giros;; -----------; Dsply3 Dsply2; Dsply4 Dsply1; Led1 Led3; A5 | 4 15 | A6 - Led2; Vss | 5 14 | Vdd; Botão1 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;; ==================================== =================================================; Histórico de revisão e notas:; Cabeçalho inicial V1.0, Código 30/03/09;;; (C) 5/2009; Este código pode ser usado para aprendizagem / aplicação / modificação pessoal.; Qualquer uso deste código em produtos comerciais viola esta versão de freeware.; Para perguntas / comentários, entre em contato com circuit dot mage em yahoo dot com.; ------------------------------------------------ ------------------------------- # include P16F627A. INC; ============= ====================================================== ================; Define; ------------------------------------------------ -------------------------------; ================== ========================================================== ===========; Dados;------------------------------------------------ -------------------------------; Variáveis de manutenção de tempo: contagem1 equ 20 contagem2 equ 21 dis1 equ 22dis2 equ 23dis3 equ 24dis4 equ 25dis5 equ 26dis6 equ 27w_temp equ 28status_temp equ 29ISRCNTR equ 2A; ====================== ========================================================== =======; Vetores de reset;; CHECK CONFIG. BITS ANTES DE QUEIMAR !!!; INTOSC; MCLR: ENABLED; PWRUP: ENABLED; TODOS OS OUTROS: DESATIVAR !!;; ------------------------------------------ ------------------------------------- RESET_ADDR EQU 0x00 ISR_ADDR EQU 0x04 org RESET_ADDR goto start; == ====================================================== =============================; ISR;; ----------------------------------------------- -------------------------------- org ISR_ADDR movwf w_temp swapf STATUS, w movwf status_temp;; ISR AQUI; Verifique os interruptores PB0-PB5 btfsc PORTB, 0; Verifique a chamada SW1 sw1debounce btfsc PORTB, 1; Verifique a chamada SW1 sw2debounce btfsc PORTB, 2; Verifique a chamada SW1 sw3debounce btfsc PORTB, 3; Verifique a chamada SW1 sw4debounce btfsc PORTB, 4; Verifique a chamada SW1 sw5debounce btfsc PORTB, 5; Verifique a chamada SW1 sw6debounce goto endisrsw1debounce chamada debounce; Aguarde 0,2 seg chamada debounce incf dis1; Atualizar contador movf dis1, W; Verifique se há estouro xorlw 0x1A; 10 em 7-seg? btfss STATUS, retorno de Z; Não, volte para digitalizar. movlw h'10 '; Sim, reinicie a tela. movwf dis1 returnsw2debounce chamada debounce; Aguarde 0,2 seg chamada debounce incf dis2; Atualizar contador movf dis2, W; Verifique se há estouro xorlw 0x4A; 10 em 7-seg? btfss STATUS, retorno de Z; Não, volte para digitalizar. movlw h'40 '; Sim, reinicie a tela. movwf dis2 returnsw3debounce chamada debounce; Aguarde 0,2 seg chamada debounce incf dis3; Atualizar contador movf dis3, W; Verifique se há estouro xorlw 0x5A; 10 em 7-seg? btfss STATUS, retorno de Z; Não, volte para digitalizar. movlw h'50 '; Sim, reinicie a tela. movwf dis3 returnsw4debounce chamada debounce; Aguarde 0,2 seg chamada debounce incf dis4; Atualizar contador movf dis4, W; Verifique se há estouro xorlw 0x8A; 10 em 7-seg? btfss STATUS, retorno de Z; Não, volte para digitalizar. movlw h'80 '; Sim, reinicie a tela. movwf dis4 returnsw5debounce chamada debounce; Aguarde 0,2 seg chamada debounce incf dis5; Atualizar contador movf dis5, W; Verifique se há estouro xorlw 0x9A; 10 em 7-seg? btfss STATUS, retorno de Z; Não, volte para digitalizar. movlw h'90 '; Sim, reinicie a tela. movwf dis5 returnsw6debounce chamada debounce; Aguarde 0,2 seg chamada debounce incf dis6; Atualizar contador movf dis6, W; Verifique se há estouro xorlw 0xCA; 10 em 7-seg? btfss STATUS, retorno de Z; Não, volte para digitalizar. movlw h'C0 '; Sim, reinicie a tela. movwf dis6 returnendisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie; ============================== ========================================================== =; Começa aqui!;---------------------------------------------- ---------------------------------começar; Portas de E / S de configuração clrf PORTA movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00 '; Saídas RA, RA5 Sem saída movwf TRISA bcf STATUS, RP0 clrf PORTB bsf STATUS, RP0 movlw h'FF'; Entradas RB movwf TRISB; Definir temporizador interno bsf PCON, 3; Defina para 4Mhz. movlw h'CF '; Tmr0 Fonte interna, pré-escala TMR0 1: 256 movwf OPTION_REG movlw h'A0 'movwf INTCON; Ativar interrupções TMR0, bcf STATUS, RP0; Inicializar registros clrf PORTA; Limpar PortA clrf PORTB; Limpar saídas 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 dis5 movlw h'C0' movwf dis6 chamada debounce; 0,2 seg; teste LEDs, display 8 ???; ======================================== ===============================================; Principal; Obtém entradas de interruptores, debounces e exibições de incrementos.;; Isso atualiza as exibições, @ 4Mhz com TMR0 prescal 1: 4, a uma taxa de 1Khz.; Display 0 é usado para alocar para um display não utilizado. Os monitores 1-6 estão ligados.; Primeiro, BCD-7Seg IC é carregado com o valor de exibição E BCD-Dec IC é ativado para; seleção de exibição.; Em segundo lugar, um atraso de ms é mantido para exibição.; Terceiro, BCD-Dec IC está desativado … o display0 é selecionado para desligar o display;; Isso é repetido para cada um dos 6 displays e em loop.; ISR lida com a detecção do interruptor a uma taxa de 15 Hz.; -------------- -------------------------------------------------- --------------- main; Disp1 movf dis1, 0 movwf PORTA chamar ledon goto main; ======================= ========================================================== ========; Ledon; Tempo de acomodação para ligar o LED.; 6 exibições -> 1/6 ciclo de trabalho a 1 KHz = 166 ciclos; ----------------------------------- -------------------------------------------- ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn; =================================================== ========================================; Sinal de debounce; 4 ciclos para carregar e chamar, 2 ciclos para retornar.; 4Mhz Tc:: count2 = 255 -> 0,2 seg; -------------------------------------- ----------------------------------------- debounce movlw.255; Atraso para debounce de 1/5 de segundo. movwf count2 call pon_wait return; -------------------------------------------- -----------------------------------; contagem1 = 255d:: 775 ciclos a 0, + 3 ciclos para retornar.; --------------------------------- ---------------------------------------------- pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 CIRCUITI originalmente tinha 470Ohm resistores de cada linha de driver de vídeo da linha de ativação 74LS47 e CD4028. No entanto, testei o consumo de corrente do meu circuito e descobri que ele puxava apenas ~ 31mA. E uma vez que o driver real para os monitores é diretamente do 74LS47 e a ativação é de outro IC, uma rápida redução dos requisitos médios e de pico e as respectivas planilhas de dados … Retirei os resistores do breadboard e encontrei uma diferença de 1mA ! Parece que dirigir diretamente a linha CA do 4028 enquanto dirige diretamente todos os segmentos está OK! …tipo de.:) TIVE uma falha em meu código que não apagou meus registros quando um botão foi pressionado, fazendo com que o último display tivesse 2 segmentos muito iluminados quando um botão foi pressionado. Isso era ruim. No entanto, limpar o registro corrigiu esse problema e as verificações contínuas de energia confirmam que o consumo está constantemente em torno de 30 mA. Isso deve me dar (com base na experiência anterior com circuitos semelhantes) ~ 20 horas de autonomia usando 1 bateria de 9V (500mAH / 30mAH sob regulação de 5V) … Espero! Decidi manter os LEDs acionados diretamente, mas colocá-los em soquetes caso algo acontecesse, a longo prazo.

Etapa 4: Solda PCB

Solda PCB
Solda PCB

Toda vez que chego a este ponto em meu projeto, demoro um pouco. No início, eu ia embrulhar essa coisa com fio, mas rapidamente desisti. No início, penso "Alguns fios para soldar, não é grande coisa" … então, quando meu projeto estiver pronto para ser soldado, estou pensando: " Eu deveria ter enviado para mandar fazer uma placa proto, ou gravado minha própria placa ". Eu não gosto de gravação PCB (ainda) e não queria pagar $$ para ter uma placa feita, então … Sim ….. Passei cerca de 3 horas soldando essa coisa. São cerca de 150 fios, então são 300 pontos de solda, mais retoques para pontes de solda. De qualquer forma, aqui está a parte de trás da placa retratada … sim … um pouco de bagunça, mas quando tudo estava pronto eu só tinha uma solda curta. Levei 20 minutos para pensar, pois o visor mostrava o número errado sendo exibido em um padrão lógico que eu tive que decifrar. Depois disso, localizei o short e bam! Funcionou perfeitamente.

Etapa 5: Conclusão

Conclusão
Conclusão

FUNCIONOU! Este projeto levou cerca de; ~ 2 semanas para pensar sobre e enviar por e-mail os pontos finos para o solicitante, ~ 3 horas de conclusão de código e depuração, ~ 4 horas de breadboarding e depuração, ~ 3 horas de soldagem. Usando apenas 3 ICs, é possível Charlieplex 6 LEDs de 7 segmentos. O consumo de energia é de cerca de 30mA com este design, o que não é ruim, se eu mesmo disser. Suspeito que mais LEDs de 7 segmentos poderiam ser usados, mas não forcei os limites. Esta ideia poderia ser aplicado a quase QUALQUER aplicação usando LEDs de 7 segmentos; termômetro, relógio, display de texto, etc. Com algum código complicado, você poderia ter um display móvel, ou imagens … talvez até uma base para um projeto POV (persistência de visão). A implementação final é deixada para meu amigo construir sua torre e coloque a placa, como achar melhor. Se / quando isso for feito, vou enviar uma imagem. Mas quanto ao circuito, este parece ser feito por encomenda!

Recomendado: