Tabla de contenido:

Contador de vueltas BloodBowl con LED de 7 segmentos: 5 pasos
Contador de vueltas BloodBowl con LED de 7 segmentos: 5 pasos

Video: Contador de vueltas BloodBowl con LED de 7 segmentos: 5 pasos

Video: Contador de vueltas BloodBowl con LED de 7 segmentos: 5 pasos
Video: Tutorial Blood Bowl 2020: Como Jugar a BB Second Season Edition 2024, Noviembre
Anonim
Contador de vueltas BloodBowl con LED de 7 segmentos
Contador de vueltas BloodBowl con LED de 7 segmentos

Este proyecto fue para un contador de turnos de juego BloodBowl usando seis LED de 7 segmentos Charlieplexed.

Paso 1: Concepto

Concepto
Concepto

Un amigo me preguntó sobre ideas para construir un contador de turnos Bloodbowl para su juego de mesa. Sin saber qué era esto y qué quería, me tomó un tiempo decidir si iba a hacer esto y cómo. Primero tenía que tener una idea de lo que él quería, así que comencé con el arte conceptual (imagen). La idea básica es tener 3 pulsadores, controlando 3 LED cada uno y se colocaría dentro de una torre construida a medida. La única gran solicitud era que las 4 pantallas superiores contaran de 0 a 8 y se reiniciaran, y tener las 2 inferiores. muestra la cuenta regresiva de 8 a 0 y retrocede. Completaría el circuito y él completaría la torre.

Paso 2: Diseño y lista de piezas

Lista de diseño y piezas
Lista de diseño y piezas

Dado que el concepto requería 6 LED de 7 segmentos, y tenía algunos PIC de Microchip de 8 bits a mano, investigué formas de usar los PIC para controlar los LED. Encontré este enlace https://www.mikroe.com/en/books /picbook/7_08chapter.htm que dice "Se puede acceder a hasta 6 pantallas de esta manera sin que el brillo de cada pantalla se vea afectado". Lo consideré un desafío y algo para investigar como parte de mi proyecto. Lo primero que hice fue tomar algunas pantallas incandescentes de 7 segmentos de mi caja y ver cómo funcionaban. Malas noticias. Las partes particulares que seleccioné no se estaban comportando como yo quería. El segmento se iluminaba cuando era necesario, en la placa de pruebas, pero la corriente de fuga se distribuía a los otros 6 segmentos. Me di cuenta de que las pantallas incandescentes pueden no ser el camino a seguir, o necesitaba usarlas de una manera diferente. Entonces, para simplificar, verifiqué que los LED de 7 segmentos que tenía a mano funcionarían para la placa de pruebas y pedí algunas pantallas de ánodo comunes. La segunda cosa que tenía que hacer era diseñar mi diseño y comenzar a trabajar en el código. En la foto está mi circuito. No mucho, ya que el código en el PIC se encarga de la multiplexación … errr Charlieplexing. Nota: TODAS las 6 pantallas tienen las MISMAS líneas del controlador IC. El selector IC habilita cada pantalla, 1 a la vez, y el PIC actualiza las líneas de 7 segmentos en consecuencia. Una idea muy simple Después de eso, todo lo que se necesitaba es completar el código y el hardware. "PCB6 pulsadores pequeños (NO) 1 74LS47, display de 7 segmentos IC1 PIC16F627 1 CD4028, 1 de 10 selector IC 6 resistencias de 10KOhm1 resistor de 470Ohm1 carrete de cable. Usé varios colores y calibres, pero ese era solo yo.1 78L05 Regulador de 5V1 Clip de batería de 9V1 Batería de 9V1 Interruptor pequeño (para encender / apagar) Considero que este es un proyecto moderadamente complejo, debido a; 1) Se requiere código de microprocesador2) Soldadura y breadboarding 3) Optimización del diseño. Ninguno de estos problemas por sí solo es demasiado complicado, pero abordarlos todos sin ninguna experiencia puede ser mucho para el principiante. Se requiere un programador de hardware para quemar el dispositivo, la estación de soldadura, etc. ¡Lo PRIMERO que alguien puede notar es que los LED de 7 segmentos NO tienen resistencias en serie (limitadores de corriente)! Permítanme abordar eso rápidamente, indicando que mi diseño original los tenía … ¡pero lea el siguiente paso para obtener una explicación!

Paso 3: Placa de pruebas y microcódigo

Breadboarding y microcódigo
Breadboarding y microcódigo

Breadboard era imprescindible para esto. Se muestra mi tablero genérico, pero para el tamaño de este proyecto, en realidad usé este y un tablero más pequeño, ya que había muchos cables que debían separarse. Primero, probé un solo LED de 7 segmentos usando el código inicial. Esto confirmó 3 cosas: 1) ¡Se verificó que el cableado de los circuitos integrados era bueno! 2) Me llevó a optimizar y finalizar mi código 3) ¡Me hizo darme cuenta de que no necesitaba las resistencias limitadoras de corriente! para trabajar con mi código, ya que el LED pasaría por los números usando un interruptor de botón, de modo que verificaba mi código y diseño. No se requirió mucho, pero el tablero confirmó que estaba en buena forma.2 CODEI originalmente tenía mi código configurado con una rutina principal para buscar botones y el ISR (Rutina de servicio de interrupción) mostraba los números,. Después de las pruebas de prueba, invertí las rutinas, por lo que la mayor parte del tiempo mostraba constantemente números y el ISR para verificar los botones. La razón por la que hice esto fue solo para tener una pantalla constante, ya que el PIC está funcionando con un reloj interno de 4Mhz, estoy perdiendo muy poco tiempo buscando botones. No es gran cosa … solo depende de cómo quiera hacer el código y qué tiene más sentido para cada aplicación. Para esto, la pantalla es importante, así que puse eso en la rutina principal. Cuando llegaron mis primeras partes (¡las 6 pantallas!), Completé el cableado de la placa de pruebas y encontré otro problema. Al presionar el botón, mi código tenía algunos registros descuidados que no se estaban borrando y el ISR estaba causando algunos fallos de visualización menores.; ======================== ================================================ =====; Turn Counter;; -----------; Dsply3 Dsply2; Dsply4 Dsply1; Led1 Led3; A5 | 4 15 | A6 - Led2; Vss | 5 14 | Vdd; Botón1 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;; ================================== =============================================; Historial de revisiones y notas:; Encabezado inicial V1.0, código 30/03/09;;; (C) 5/2009; Este código puede usarse para aprendizaje / aplicación / modificación personal.; Cualquier uso de este código en productos comerciales viola esta versión de software gratuito.; Para preguntas / comentarios, comuníquese con circuit dot mage en yahoo dot com.; ------------------------------------------------ ------------------------------- # incluye P16F627A. INC; ============= ================================================ ================; Define; ------------------------------------------------ -------------------------------; ================== ================================================ ===========; Datos;------------------------------------------------ -------------------------------; Variables de mantenimiento de tiempo 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; ====================== ================================================ =======; Restablecer vectores;; VERIFICAR CONFIG. BITS ANTES DE QUEMAR !!!; INTOSC; MCLR: HABILITADO; PWRUP: HABILITADO; TODOS LOS DEMÁS: DESACTIVAR !!;; ------------------------------------------ ------------------------------------- RESET_ADDR EQU 0x00 ISR_ADDR EQU 0x04 org RESET_ADDR ir al inicio; == ================================================ ===========================; ISR;; ----------------------------------------------- -------------------------------- org ISR_ADDR movwf w_temp swapf STATUS, w movwf status_temp;; ISR AQUÍ; Compruebe los conmutadores PB0-PB5 btfsc PORTB, 0; Compruebe SW1 llamada sw1debounce btfsc PORTB, 1; Compruebe SW1 llame a sw2debounce btfsc PORTB, 2; Compruebe SW1 llame a sw3debounce btfsc PORTB, 3; Compruebe SW1 llamada sw4debounce btfsc PORTB, 4; Compruebe SW1 llame a sw5debounce btfsc PORTB, 5; Compruebe SW1 llamada sw6debounce goto endisrsw1debounce llamada debounce; Espere 0,2 seg. Llamada antirrebote incf dis1; Actualizar contador movf dis1, W; Compruebe si hay desbordamiento xorlw 0x1A; ¿10 en 7 seg? btfss STATUS, Z return; No, vuelva a escanear. movlw h'10 '; Sí, restablecer la pantalla. movwf dis1 devuelve w2debounce llamada debounce; Espere 0,2 seg. Llamada antirrebote incf dis2; Actualizar contador movf dis2, W; Compruebe si hay desbordamiento xorlw 0x4A; 10 en 7-seg? btfss STATUS, Z return; No, vuelva a escanear. movlw h'40 '; Sí, restablecer la pantalla. movwf dis2 devuelve w3debounce llamada debounce; Espere 0,2 segundos de llamada antirrebote incf dis3; Actualizar contador movf dis3, W; Compruebe si hay desbordamiento xorlw 0x5A; 10 en 7-seg? btfss STATUS, Z return; No, vuelva a escanear. movlw h'50 '; Sí, restablecer la pantalla. movwf dis3 devuelve w4debounce llamada debounce; Espere 0,2 segundos de llamada antirrebote incf dis4; Actualizar contador movf dis4, W; Compruebe si hay desbordamiento xorlw 0x8A; ¿10 en 7 seg? btfss STATUS, Z return; No, vuelva a escanear. movlw h'80 '; Sí, restablecer la pantalla. movwf dis4 devuelvew5debounce llamada debounce; Espere 0,2 seg. Llamada antirrebote incf dis5; Actualizar contador movf dis5, W; Compruebe si hay desbordamiento xorlw 0x9A; ¿10 en 7 seg? btfss STATUS, Z return; No, vuelva a escanear. movlw h'90 '; Sí, restablecer la pantalla. movwf dis5 devuelve w6debounce llamada debounce; Espere 0,2 segundos de llamada antirrebote incf dis6; Actualizar contador movf dis6, W; Compruebe si hay desbordamiento xorlw 0xCA; 10 en 7-seg? btfss STATUS, Z return; No, vuelva a escanear. movlw h'C0 '; Sí, restablecer la pantalla. movwf dis6 returnndisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie; ============================ ================================================ =; ¡Empieza aqui!;---------------------------------------------- ---------------------------------comienzo; Configuración de puertos de E / S clrf PORTA movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00 '; Salidas RA, RA5 Sin salida movwf TRISA bcf STATUS, RP0 clrf PORTB bsf STATUS, RP0 movlw h'FF'; Entradas RB movwf TRISB; Configure el temporizador interno bsf PCON, 3; Ajústelo a 4Mhz. movlw h'CF '; Tmr0 Fuente interna, preescala TMR0 1: 256 movwf OPTION_REG movlw h'A0 'movwf INTCON; Habilitar interrupciones TMR0, bcf STATUS, RP0; Inicializar registros clrf PORTA; Borrar PortA clrf PORTB; Borrar salidas 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 llamada rebote 0,2 seg; LED de prueba, pantalla 8 ???; ==================================== =========================================; Principal; Obtiene entradas de pantallas de interruptores, antirrebotes e incrementos.;; Esto actualiza las pantallas, @ 4Mhz con TMR0 prescal 1: 4, a una velocidad de 1Khz.; La pantalla 0 se usa para asignar a una pantalla no utilizada. Las pantallas 1-6 están conectadas.; Primero, BCD-7Seg IC se carga con el valor de visualización, Y BCD-Dec IC está activado para; selección de pantalla.; En segundo lugar, se mantiene un retraso de ms para la visualización.; Tercero, BCD-Dec IC está desactivado … se selecciona display0 para apagar la pantalla;; Esto se repite para cada una de las 6 pantallas, y se enlaza.; ISR maneja la detección del interruptor a una velocidad de 15Hz.; -------------- -------------------------------------------------- --------------- main; Disp1 movf dis1, 0 movwf PORTA call ledon goto main; ===================== ================================================ ========; Llevado en; Tiempo de reposo para el encendido del LED.; 6 pantallas -> 1/6 ciclo de trabajo a 1Khz = 166 ciclos; ----------------------------------- -------------------------------------------- ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn; =========================================== ====================================; Señal de rebote; 4 ciclos para cargar y llamar, 2 ciclos para regresar.; 4Mhz Tc:: count2 = 255 -> 0.2 seg; -------------------------------------- ----------------------------------------- movlw antirrebote.255; Retraso de eliminación de rebotes de 1/5 de segundo. movwf count2 llamar pon_wait return; -------------------------------------------- -----------------------------------; count1 = 255d:: 775 ciclos a 0, + 3 ciclos para regresar.; --------------------------------- ---------------------------------------------- pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 CIRCUITI originalmente tenía resistencias de 470Ohm de cada línea de controlador de pantalla de la línea de habilitación 74LS47 y CD4028. Sin embargo, probé el consumo de corriente de mi circuito y descubrí que solo tiraba ~ 31 mA. Y dado que el controlador real para las pantallas es directamente del 74LS47 y la habilitación es de otro IC, un resumen rápido de los requisitos promedio y pico, y las respectivas hojas de datos … Saqué las resistencias de la placa de pruebas y encontré una diferencia de 1 mA ! ¡Parece que conducir directamente la línea CA desde el 4028 mientras conduce directamente todos los segmentos está bien! …algo así como.:) Tuve una falla en mi código que no borró mis registros cuando se presionó un botón, lo que provocó que la última pantalla tuviera 2 segmentos muy iluminados cuando se presionó un botón. Esto estuvo mal. Sin embargo, limpiar el registro solucionó este problema, y las comprobaciones continuas de energía confirman que se trata de un consumo constante de alrededor de 30 mA. Esto debería darme (según la experiencia previa con circuitos similares) ~ 20 horas de tiempo de funcionamiento con 1 batería de 9V (500mAH / 30mAH bajo regulación de 5V) … ¡Espero! caso de que sucediera algo, a largo plazo.

Paso 4: soldadura de PCB

Soldadura de PCB
Soldadura de PCB

Cada vez que llego a este punto en mi proyecto, demoro un poco. Al principio iba a envolver con alambre esto, pero rápidamente abandoné esa idea. Al principio pensé "Unos pocos cables para soldar, no es gran cosa" … luego, cuando mi proyecto está listo para ser soldado, estoy pensando " Debería haber enviado para hacer una placa proto o grabar mi propia placa ". No me gusta el grabado de PCB (todavía), y no quería pagar $$ para hacer una placa, así que … Sí ….. Pasé unas 3 horas soldando esta cosa. Son alrededor de 150 cables, por lo que son 300 puntos de soldadura, más retoques para puentes de soldadura. De todos modos, aquí está la parte posterior de la placa en la foto … sí … un poco de desastre, pero cuando todo estuvo hecho solo tenía 1 soldadura corta. Me tomó 20 minutos de pensamiento ya que la pantalla mostraba el número incorrecto en un patrón lógico que tuve que descifrar. Después de eso, localicé el corto y ¡bam! Funcionó perfectamente.

Paso 5: Conclusión

Conclusión
Conclusión

¡FUNCIONÓ! Este proyecto tomó alrededor de; ~ 2 semanas para pensar y enviar por correo electrónico los puntos finos al solicitante, ~ 3 horas de finalización y depuración del código, ~ 4 horas de prueba y depuración, ~ 3 horas de soldadura Con solo 3 IC es posible Charlieplex 6 LED de 7 segmentos. El consumo de energía es de aproximadamente 30 mA con este diseño, lo cual no está mal si lo digo yo mismo. Sospecho que se podrían usar más LED de 7 segmentos, pero no he superado los límites. Esta idea podría se puede aplicar a casi CUALQUIER aplicación utilizando LED de 7 segmentos; termómetro, reloj, pantalla de texto, etc. Con un código complicado, podría tener una pantalla en movimiento, o imágenes … tal vez incluso una base para un proyecto POV (persistencia de la visión). La implementación final queda para que mi amigo construya su torre y coloque la tabla como mejor le parezca. Si / cuando termine, subiré una foto. Pero en cuanto al circuito, ¡parece estar construido por encargo!

Recomendado: