Table des matières:

Compteur de tours BloodBowl utilisant des LED à 7 segments : 5 étapes
Compteur de tours BloodBowl utilisant des LED à 7 segments : 5 étapes

Vidéo: Compteur de tours BloodBowl utilisant des LED à 7 segments : 5 étapes

Vidéo: Compteur de tours BloodBowl utilisant des LED à 7 segments : 5 étapes
Vidéo: Les règles du jeu BLOOD BOWL Ep#1 2024, Novembre
Anonim
Compteur de tours BloodBowl utilisant des LED à 7 segments
Compteur de tours BloodBowl utilisant des LED à 7 segments

Ce projet concernait un compteur de tours de jeu BloodBowl utilisant six LED Charlieplexed à 7 segments.

Étape 1: Conception

Concept
Concept

Un de mes amis m'a demandé des idées pour construire un compteur Bloodbowl Turn pour son jeu de société. Ne sachant pas ce que c'était et ce qu'il voulait, il m'a fallu un certain temps pour décider si et comment j'allais le faire. Je devais d'abord avoir une idée de ce qu'il voulait, alors j'ai commencé par le concept art (photo). L'idée de base est d'avoir 3 boutons-poussoirs contrôlant chacun 3 LED et il serait placé à l'intérieur d'une tour construite sur mesure. La seule grande demande était que les 4 écrans supérieurs comptent de 0 à 8 et se réinitialisent, et que les 2 inférieurs affiche un compte à rebours de 8 à 0 et un cycle arrière. Je terminerais le circuit et il terminerait la tour.

Étape 2: Conception et liste de pièces

Conception et liste de pièces
Conception et liste de pièces

Étant donné que le concept prévoyait 6 LED à 7 segments et que j'avais des PIC Microchip 8 bits à portée de main, j'ai recherché des moyens d'utiliser les PIC pour contrôler les LED. J'ai trouvé ce lien https://www.mikroe.com/en/books /picbook/7_08chapter.htm qui indique " Jusqu'à 6 écrans peuvent être accédés ainsi sans que la luminosité de chaque écran soit affectée." Je considérais cela comme un défi et quelque chose à étudier dans le cadre de mon projet. La première chose que j'ai faite a été de prendre des écrans incandescents à 7 segments dans ma boîte et de voir comment ils fonctionneraient. Mauvaises nouvelles. Les pièces particulières que j'ai sélectionnées ne se comportaient pas comme je le voulais. Le segment s'allumait en cas de besoin, sur la maquette, mais le courant de fuite était distribué aux 6 autres segments. J'ai réalisé que les écrans à incandescence n'étaient peut-être pas la solution, ou que je devais les utiliser d'une manière différente. Donc, pour plus de simplicité, j'ai vérifié que les LED à 7 segments que j'avais sous la main fonctionneraient pour la maquette et j'ai commandé des affichages anodiques courants. La deuxième chose que je devais faire était de mettre en page ma conception et de commencer à travailler sur le code. Sur la photo, mon circuit. Pas grand-chose, car le code dans le PIC s'occupe du multiplexage… errr Charlieplexing. Remarque: TOUS les 6 écrans ont les MÊMES lignes du circuit intégré du pilote. Le sélecteur IC active chaque affichage, 1 à la fois, et les lignes à 7 segments sont mises à jour par le PIC en conséquence. Idée très simple. Après cela, il suffisait de terminer le code et le matériel. Liste des pièces Après 3 petites commandes de Digi-Key tout en décidant des composants spécifiques, j'avais tout ce dont j'avais besoin (avec quelques trucs à portée de main);1 ~ 3"x4 " PCB6 petits boutons poussoirs (NO)1 74LS47, afficheur 7 segments IC1 PIC16F627 1 CD4028, 1 des 10 sélecteurs IC 6 résistances 10KOhm1 résistance 470Ohm1 bobine de fil. J'ai utilisé différentes couleurs et jauges, mais c'était juste moi.1 78L05 Régulateur 5V1 Clip de batterie 9V1 Batterie 9V1 petit interrupteur (pour allumer/éteindre) Breadboarding 3) Optimisation de la conception. Aucun de ces problèmes en soi n'est trop compliqué, mais les aborder tous sans aucune expérience peut être un peu difficile pour le débutant. Un programmeur matériel est nécessaire pour graver l'appareil, la station de soudure, etc… La PREMIÈRE chose que quelqu'un pourrait remarquer est que les LED à 7 segments N'ONT PAS de résistances en série (limitation de courant) ! Permettez-moi d'aborder cela rapidement, en déclarant que ma conception originale les comportait… mais lisez l'étape suivante pour plus d'explications !

Étape 3: Planche à pain et micro-code

Planche à pain et micro-code
Planche à pain et micro-code

La planche à pain était un must pour cela. Ma maquette générique est montrée, mais pour la taille de ce projet, j'ai en fait utilisé celle-ci et une maquette plus petite, car de nombreux fils devaient être espacés. Tout d'abord, j'ai testé une seule LED à 7 segments à l'aide du code initial. Cela a confirmé 3 choses; 1) Le câblage des circuits intégrés a été vérifié comme bon ! 2) M'a conduit à optimiser et à finaliser mon code. 3) M'a fait réaliser que je n'avais pas besoin des résistances de limitation de courant ! 1 CÂBLAGEComme indiqué, ma conception schématique a été trouvée pour travailler avec mon code, car la LED parcourait les chiffres à l'aide d'un interrupteur à bouton-poussoir, ce qui a permis de vérifier mon code et ma disposition. Il ne fallait pas grand-chose, mais la maquette a confirmé que j'étais en bonne forme.2 À l'origine, CODEI avait défini mon code avec une routine principale pour rechercher les boutons et l'ISR (Interrupt Service Routine) affichait les chiffres,. Après des tests de montage, j'ai inversé les routines, de sorte que la majorité du temps affichait constamment des chiffres et l'ISR pour vérifier les boutons. La raison pour laquelle j'ai fait cela, était juste d'avoir un affichage constant, puisque le PIC fonctionne avec une horloge interne de 4Mhz, je perds très peu de temps à rechercher des boutons. Ce n'est pas grave… ça dépend juste de la façon dont vous voulez faire le code et de ce qui est le plus logique pour chaque application. Pour cela, l'affichage est important, j'ai donc mis cela dans la routine principale. Lorsque mes premières pièces sont arrivées (les 6 écrans !), j'ai terminé le câblage de la maquette et j'ai trouvé un autre problème. En appuyant sur le bouton, mon code avait des registres bâclés qui n'étaient pas effacés et l'ISR provoquait quelques problèmes d'affichage mineurs.;======================== ================================================== =====;Compteur de tours;; -----------;Dsply3 Dsply2;Dsply4 Dsply1;Led1 Led3; A5 |4 15| A6 -- Led2; Vss |5 14| Vdd;Bouton1 B0 |6 13| B7; B1 |7 12| B6; B2 |8 11| B5; B3 |9 10| B4; -----------;;; LED1-3 - CI BCD-dec -LEDSeg's1-6; Dsply1-3 - BCD-7seg IC -Dsply#1-9;;=================================== =============================================; Historique des révisions et notes:; En-tête initial V1.0, code 30/03/09;;;(C) 5/ 2009;Ce code peut être utilisé pour un apprentissage/application/modification personnel.;Toute utilisation de ce code dans des produits commerciaux viole cette version du logiciel gratuit.;Pour des questions/commentaires, contactez circuit dot mage à yahoo dot com.;------------------------------------------------ -------------------------------#include P16F627A. INC;============== ================================================== =================; Définit;------------------------------------------------ -------------------------------;=================== ================================================== ============; Données;------------------------------------------------ -------------------------------; Temps de conservation des variablescount1 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;====================== ================================================== =======; Réinitialiser les vecteurs;; VÉRIFIEZ LA CONFIGURATION. BITS AVANT DE BRLER !!!; INTOSC; MCLR: ACTIVÉ; PWRUP: ACTIVÉ; TOUS LES AUTRES: DÉSACTIVER !!;;------------------------------------------ -------------------------------------RESET_ADDR EQU 0x00 ISR_ADDR EQU 0x04 org RESET_ADDR aller au début;== ================================================== ===========================; ISR;;------------------------------------------- --------------------------------org ISR_ADDR movwf w_temp swapf STATUS, w movwf status_temp;; ISR ICI; Vérifiez les commutateurs PB0-PB5 btfsc PORTB, 0; Vérifiez l'appel SW1 sw1debounce btfsc PORTB, 1; Vérifiez SW1 call sw2debounce btfsc PORTB, 2; Vérifiez SW1 appeler sw3debounce btfsc PORTB, 3; Vérifiez SW1 appeler sw4debounce btfsc PORTB, 4; Vérifiez SW1 appelez sw5debounce btfsc PORTB, 5; Vérifiez SW1 call sw6debounce goto endisrsw1debounce call debounce; Attendre 0,2 sec anti-rebond d'appel incf dis1; Compteur de mise à jour movf dis1, W; Vérifier le débordement xorlw 0x1A; 10 sur 7-seg ? btfss STATUT, retour Z; Non, revenez au scan. movlw h'10'; Oui, réinitialiser l'affichage. movwf dis1 renvoie w2debounce appel anti-rebond; Attendre 0,2 sec anti-rebond d'appel incf dis2; Compteur de mise à jour movf dis2, W; Vérifier le débordement xorlw 0x4A; 10 sur 7-seg ? btfss STATUT, retour Z; Non, revenez au scan. movlw h'40'; Oui, réinitialiser l'affichage. movwf dis2 renvoie w3debounce appel anti-rebond; Attendre 0,2 sec anti-rebond d'appel incf dis3; Compteur de mise à jour movf dis3, W; Vérifier le débordement xorlw 0x5A; 10 sur 7-seg ? btfss STATUT, retour Z; Non, revenez au scan. movlw h'50'; Oui, réinitialiser l'affichage. movwf dis3 renvoie w4debounce appel anti-rebond; Attendre 0,2 sec anti-rebond d'appel incf dis4; Compteur de mise à jour movf dis4, W; Vérifier le débordement xorlw 0x8A; 10 sur 7-seg ? btfss STATUT, retour Z; Non, revenez au scan. movlw h'80'; Oui, réinitialiser l'affichage. movwf dis4 renvoie w5debounce appel anti-rebond; Attendre 0,2 sec anti-rebond d'appel incf dis5; Compteur de mise à jour movf dis5, W; Vérifier le débordement xorlw 0x9A; 10 sur 7-seg ? btfss STATUT, retour Z; Non, revenez au scan. movlw h'90'; Oui, réinitialiser l'affichage. movwf dis5 renvoie w6debounce appel anti-rebond; Attendre 0,2 sec anti-rebond d'appel incf dis6; Compteur de mise à jour movf dis6, W; Vérifier le débordement xorlw 0xCA; 10 sur 7-seg ? btfss STATUT, retour Z; Non, revenez au scan. movlw h'C0'; Oui, réinitialiser l'affichage. movwf dis6 returnendisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie;============================= ================================================== =; Commencer ici!;---------------------------------------------- ---------------------------------début; Config I/O ports clrf PORTA movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00';RA Sorties, RA5 Pas de sortie movwf TRISA bcf STATUS, RP0 clrf PORTB bsf STATUS, h'FF0'movlw; RB Entrées movwf TRISB; Régler le temporisateur interne bsf PCON, 3; Réglez sur 4Mhz. movlw h'CF'; Tmr0 Source interne, pré-échelle TMR0 1:256 movwf OPTION_REG movlw h'A0' movwf INTCON; Activer les interruptions TMR0, bcf STATUS, RP0; Initialiser les registres clrf PORTA; Effacer PortA clrf PORTB; Effacer les sorties 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' call movwf rebondir; 0,2 sec; tester les LED, afficher 8 ???;====================================== =========================================; Principale; Obtient les entrées des affichages des commutateurs, des anti-rebonds et des incréments.;;Cela met à jour les affichages, @4Mhz avec TMR0 préscal 1:4, à un taux de 1Khz.;L'affichage 0 est utilisé pour allouer à un affichage inutilisé. Les écrans 1 à 6 sont câblés.;Premièrement, BCD-7Seg IC est chargé avec la valeur d'affichage, ET BCD-Dec IC est activé pour;sélection d'affichage.;Deuxièmement, un délai de ms est maintenu pour l'affichage.;Troisièmement, BCD-Dec IC est désactivé… display0 est sélectionné pour éteindre l'affichage;; Ceci est répété pour chacun des 6 affichages, et en boucle.; ISR gère la détection du commutateur à une fréquence de 15 Hz.; --------------- -------------------------------------------------- ---------------main;Disp1 movf dis1, 0 movwf PORTA appel ledon goto main;===================== ================================================== =========; Conduit sur; Temps de stabilisation pour la mise sous tension de la LED.; 6 affichages -> 1/6 cycle de service à 1Khz = 166 cycles;----------------------------------- ------------------------------------------------------------ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn;=========================================== =====================================; Signal anti-rebond; 4 cycles pour charger et appeler, 2 cycles pour revenir.; 4Mhz Tc:: count2=255 -> 0.2 sec;-------------------------------------- -----------------------------------------debounce movlw.255; Retard pour 1/5 seconde de rebond. movwf count2 appel pon_wait return;---------------------------------------------- -----------------------------------; count1=255d:: 775 cycles à 0, + 3 cycles à retourner.;-------------------------------- ------------------------------------------------pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 CIRCUITI avait à l'origine des résistances de 470 Ohm de chaque ligne de pilote d'affichage de la ligne d'activation 74LS47 et CD4028. Cependant, j'ai testé la consommation de courant de mon circuit et j'ai découvert qu'il ne tirait qu'environ 31 mA. Et puisque le pilote réel pour les écrans provient directement du 74LS47 et que l'activation provient d'un autre circuit intégré, un aperçu rapide des exigences moyennes et maximales, et des fiches techniques respectives… J'ai retiré les résistances de la planche à pain et trouvé une différence de 1 mA. ! Il semble que conduire directement la ligne CA à partir de la 4028 tout en conduisant directement tous les segments est OK ! …sorte de.:) J'ai eu un problème dans mon code qui n'a pas effacé mes registres lorsqu'un bouton a été enfoncé, ce qui a fait que le dernier affichage a 2 segments très lumineux lorsqu'un bouton a été enfoncé. C'était mauvais. Cependant, l'effacement du registre a résolu ce problème, et des contrôles continus de l'alimentation confirment qu'il est constamment aux alentours de 30 mA. Cela devrait me donner (sur la base d'une expérience précédente avec des circuits similaires) environ 20 heures d'autonomie avec 1 batterie 9V (500mAH/30mAH sous une régulation 5V)… J'espère ! J'ai décidé de garder les LED directement entraînées, mais de les mettre dans des cas, quelque chose s'est passé, à long terme.

Étape 4: Soudure PCB

Soudure PCB
Soudure PCB

Chaque fois que j'arrive à ce point dans mon projet, je retarde un peu. Au début, j'allais envelopper cette chose, mais j'ai rapidement abandonné cette idée. Au début, je pense "Quelques fils à souder, pas grave"… J'aurais dû soit envoyer faire fabriquer une carte proto, soit graver ma propre carte"…J'ai passé environ 3 heures à souder cette chose. C'est environ 150 fils, donc c'est 300 points de soudure, plus des retouches pour les ponts de soudure. Quoi qu'il en soit, voici l'arrière de la carte sur la photo….ouais…un peu le bordel, mais quand tout a été fait, je n'avais qu'une soudure à court. Il m'a fallu 20 minutes de réflexion car l'écran montrait les mauvais # affichés dans un schéma logique que je devais déchiffrer. Après ça, j'ai localisé le short, et bam ! Cela a parfaitement fonctionné.

Étape 5: Conclusion

Conclusion
Conclusion

ÇA A FONCTIONNÉ ! Ce projet a pris environ; ~ 2 semaines pour réfléchir et envoyer par e-mail les points fins au demandeur, ~ 3 heures de complétion de code et de débogage, ~ 4 heures de montage et de débogage, ~ 3 heures de soudureEn utilisant seulement 3 circuits intégrés, il est possible de Charlieplex 6 LED à 7 segments. La consommation électrique est d'environ 30 mA avec cette conception, ce qui n'est pas mal si je le dis moi-même. Je soupçonne que plus de LED à 7 segments pourraient être utilisées, mais je n'ai pas repoussé les limites. être appliqué à presque TOUTES les applications utilisant des LED à 7 segments; thermomètre, horloge, affichage de texte, etc. Avec un code compliqué, vous pourriez avoir un affichage en mouvement, ou des images… peut-être même une base pour un projet POV (persistance de la vision). La mise en œuvre finale est laissée à mon ami pour construire sa tour et placez le plateau dedans, comme il l'entend. Si/quand cela sera fait, je téléchargerai une photo. Mais quant au circuit, il semble construit sur commande !

Conseillé: