Inhaltsverzeichnis:

BloodBowl-Drehzähler mit 7-Segment-LEDs - Gunook
BloodBowl-Drehzähler mit 7-Segment-LEDs - Gunook

Video: BloodBowl-Drehzähler mit 7-Segment-LEDs - Gunook

Video: BloodBowl-Drehzähler mit 7-Segment-LEDs - Gunook
Video: Bloodbowl 2 - Legendary Edition | Tutorial für Einsteiger | 03 - Kislev-Zirkus (Slann) | Deutsch 2024, Juli
Anonim
BloodBowl-Drehzähler mit 7-Segment-LEDs
BloodBowl-Drehzähler mit 7-Segment-LEDs

Dieses Projekt war für einen BloodBowl-Spielrundenzähler mit sechs Charlieplexed 7-Segment-LEDs.

Schritt 1: Konzept

Konzept
Konzept

Ein Freund von mir hat mich nach Ideen gefragt, um einen Bloodbowl-Turn-Zähler für sein Brettspiel zu bauen. Da ich nicht wusste, was das war und was er wollte, dauerte es eine Weile, bis ich mich entschied, ob und wie ich das machen würde. Ich musste zuerst eine Vorstellung davon haben, was er wollte, also begann ich mit Konzeptkunst (Bild). Die Grundidee besteht darin, 3 Drucktasten zu haben, die jeweils 3 LEDs steuern und in einem speziell angefertigten Turm platziert werden. Die einzige große Anforderung war, dass die oberen 4 Anzeigen von 0 bis 8 hochzählen und zurücksetzen und die unteren 2 Die Displays zählen von 8 bis 0 herunter und radeln zurück. Ich würde die Runde vervollständigen, und er würde den Turm vervollständigen.

Schritt 2: Design & Teileliste

Design & Teileliste
Design & Teileliste

Da das Konzept 6 7-Segment-LEDs erforderte und ich einige 8-Bit-Mikrochip-PICs zur Hand hatte, recherchierte ich nach Möglichkeiten, die PICs zur Steuerung von LEDs zu verwenden. Ich fand diesen Link https://www.mikroe.com/en/books /picbook/7_08chapter.htm, die besagt: "Auf bis zu 6 Displays kann so zugegriffen werden, ohne dass die Helligkeit jedes Displays beeinflusst wird." Ich betrachtete dies als eine Herausforderung und etwas, das ich als Teil meines Projekts untersuchen sollte. Das erste, was ich tat, war, einige glühende 7-Segment-Anzeigen aus meiner Box zu holen und zu sehen, wie sie funktionieren würden. Schlechte Nachrichten. Die von mir ausgewählten Teile verhielten sich nicht so, wie ich es wollte. Das Segment würde bei Bedarf auf dem Steckbrett aufleuchten, aber der Leckstrom wurde auf die anderen 6 Segmente verteilt. Mir wurde klar, dass Glühlampen möglicherweise nicht der richtige Weg sind, oder ich musste sie auf andere Weise verwenden. Der Einfachheit halber überprüfte ich, dass die 7-Segment-LEDs, die ich zur Verfügung hatte, für das Steckbrettern funktionieren würden, und bestellte einige gemeinsame Anodenanzeigen. Das zweite, was ich tun musste, war, mein Design zu gestalten und mit der Arbeit am Code zu beginnen. Abgebildet ist meine Schaltung. Nicht viel, denn der Code im PIC kümmert sich um das Multiplexing…errr Charlieplexing. Hinweis: ALLE 6 Displays haben die GLEICHEN Leitungen vom Treiber-IC. Der Selektor-IC aktiviert jede Anzeige einzeln, und die 7-Segment-Leitungen werden vom PIC entsprechend aktualisiert. Sehr einfache Idee. Danach war nur noch die Vervollständigung von Code und Hardware erforderlich. TeilelisteNach 3 kleinen Bestellungen von Digi-Key bei der Entscheidung für bestimmte Komponenten hatte ich alles, was ich brauchte (mit einigen Sachen zur Hand); 1 ~ 3 "x 4" " PCB6 kleine Drucktastenschalter (NO)1 74LS47, 7-Segment-Anzeige IC1 PIC16F627 1 CD4028, 1 von 10 Wahlschalter IC 6 10KOhm Widerstände1 470Ohm Widerstand1 Drahtspule. Ich habe verschiedene Farben und Messgeräte verwendet, aber das war nur ich.1 78L05 5V-Regler1 9V-Batterieklemme1 9V-Batterie1 kleiner Schalter (zum Ein- / Ausschalten) Ich halte dies für ein mäßig komplexes Projekt aufgrund von;1) Mikroprozessorcode erforderlich2) Löten und Breadboarding 3) Designoptimierung. Keines dieser Probleme an sich ist übermäßig kompliziert, aber sie alle ohne Erfahrung anzugehen, kann für den Anfänger etwas zu viel sein. Ein Hardware-Programmierer ist erforderlich, um das Gerät, die Lötstation usw. zu brennen. Das ERSTE, was jemandem auffallen könnte, ist, dass die 7-Segment-LEDs KEINE Serienwiderstände (strombegrenzend) haben! Lassen Sie mich das schnell ansprechen, indem ich sage, dass mein ursprüngliches Design sie enthält … aber lesen Sie den nächsten Schritt zur Erklärung!

Schritt 3: Breadboarding & Mikrocode

Breadboarding & Mikrocode
Breadboarding & Mikrocode

Brot war ein Muss dafür. Gezeigt ist mein generisches Steckbrett, aber für die Größe dieses Projekts habe ich tatsächlich dieses und ein kleineres Steckbrett verwendet, da viele Drähte beabstandet werden mussten. Zuerst testete ich eine einzelne 7-Segment-LED mit dem Anfangscode. Dies bestätigte 3 Dinge; 1) Die Verdrahtung der ICs wurde als gut verifiziert! 2) Führte mich dazu, meinen Code zu optimieren und fertigzustellen. 3) Hat mir klar gemacht, dass ich die Strombegrenzungswiderstände nicht brauche! 1 VERKABELUNG Wie gesagt, mein Schaltplan wurde gefunden um mit meinem Code zu arbeiten, da die LED mit einem Druckknopf durch die Zahlen blättern würde, so dass mein Code und mein Layout überprüft wurden. Es war nicht viel erforderlich, aber das Breadboarding bestätigte, dass ich in guter Verfassung war.2 CODEIch hatte meinen Code ursprünglich mit einer Hauptroutine eingerichtet, um nach Tasten zu suchen, und die ISR (Interrupt Service Routine) zeigt die Zahlen an,. Nach den Breadboarding-Tests habe ich die Routinen umgekehrt, sodass die meiste Zeit ständig Zahlen und der ISR angezeigt wurden, um nach Schaltflächen zu suchen. Der Grund, warum ich dies getan habe, war nur eine konstante Anzeige zu haben, da der PIC mit einem internen 4Mhz-Takt läuft, verliere ich sehr wenig Zeit beim Scannen nach Tasten. Keine große Sache … hängt nur davon ab, wie Sie den Code erstellen möchten und was für jede Anwendung am sinnvollsten ist. Dafür ist das Display wichtig, also habe ich das in die Hauptroutine aufgenommen. Als meine ersten Teile ankamen (alle 6 Displays!), habe ich die Steckbrettverkabelung abgeschlossen und ein anderes Problem gefunden. Beim Drücken der Taste hatte mein Code einige schlampige Register, die nicht gelöscht wurden, und der ISR verursachte einige kleinere Anzeigestörungen.;======================== ================================================ =====;Drehungszähler;; ------------;Dsply3 Dsply2;Dsply4 Dsply1;Led1 Led3; A5 |4 15| A6 -- Led2; Vss |5 14| Vdd;Taste1 B0 |6 13| B7; B1 |7 12| B6; B2 |8 11| B5; B3 |9 10| B4; ------------;; LED1-3 - BCD-dec IC -LEDSegs1-6; Dsply1-3 - BCD-7seg IC -Dsply#1-9;;================================= =============================================; Revisionshistorie & Hinweise:; V1.0 Initialer Header, Code 30.03.09;;;(C) 5/ 2009;Dieser Code darf zum persönlichen Lernen/Anwenden/Ändern verwendet werden.;Jede Verwendung dieses Codes in kommerziellen Produkten verstößt gegen diese Freeware-Version.;Bei Fragen/Kommentaren wenden Sie sich an Circuit dot mage at yahoo dot com.;------------------------------------------------ -------------------------------#include P16F627A. INC;============= ================================================ ================; Definiert;------------------------------------------------ --------------------------------;================== ================================================ ===========; Daten;------------------------------------------------ ------------------------------------------; Zeiterfassungsvariablencount1 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;===================== ================================================ =======; Vektoren zurücksetzen;; KONFIG. PRÜFEN. BITS VOR DEM BRENNEN!!!; INTOSC; MCLR: AKTIVIERT; PWRUP: AKTIVIERT; ALLE ANDEREN: DEAKTIVIEREN!!;;------------------------------------------------------ -------------------------------------RESET_ADDR EQU 0x00 ISR_ADDR EQU 0x04 org RESET_ADDR zum Start;== ================================================ ===========================; ESR;;---------------------------------------------------------- --------------------------------org ISR_ADDR movwf w_temp swapf STATUS, w movwf status_temp;; ISR HIER; PB0-PB5 Schalter prüfen btfsc PORTB, 0; SW1 überprüfen Aufruf sw1debounce btfsc PORTB, 1; SW1 prüfen Aufruf sw2debounce btfsc PORTB, 2; SW1 überprüfen Aufruf sw3debounce btfsc PORTB, 3; SW1 überprüfen Aufruf sw4debounce btfsc PORTB, 4; Check SW1 call sw5debounce btfsc PORTB, 5; Check SW1 call sw6debounce goto endisrsw1debounce call debounce; Warten Sie 0,2 Sek. Rufentprellung incf dis1; Zähler aktualisieren movf dis1, W; Auf Überlauf prüfen xorlw 0x1A; 10 auf 7-seg? btfss-STATUS, Z return; Nein, zurück zum Scannen. movlw h'10'; Ja, Anzeige zurücksetzen. movwf dis1 returnw2debounce Aufruf debounce; Warten Sie 0,2 Sek. Anrufentprellung incf dis2; Zähler aktualisieren movf dis2, W; Auf Überlauf prüfen xorlw 0x4A; 10 auf 7-seg? btfss-STATUS, Z return; Nein, zurück zum Scannen. movlw h'40'; Ja, Anzeige zurücksetzen. movwf dis2 returnw3debounce Aufruf debounce; Warten Sie 0,2 Sek. Anrufentprellung incf dis3; Zähler aktualisieren movf dis3, W; Auf Überlauf prüfen xorlw 0x5A; 10 auf 7-seg? btfss-STATUS, Z return; Nein, zurück zum Scannen. movlw h'50'; Ja, Anzeige zurücksetzen. movwf dis3 returnw4debounce Aufruf debounce; Warten Sie 0,2 Sek. Anrufentprellung incf dis4; Zähler aktualisieren movf dis4, W; Auf Überlauf prüfen xorlw 0x8A; 10 auf 7-seg? btfss-STATUS, Z return; Nein, zurück zum Scannen. movlw h'80'; Ja, Anzeige zurücksetzen. movwf dis4 returnw5debounce Aufruf entprellen; Warten Sie 0,2 Sek. Anrufentprellung incf dis5; Zähler aktualisieren movf dis5, W; Auf Überlauf prüfen xorlw 0x9A; 10 auf 7-seg? btfss-STATUS, Z return; Nein, zurück zum Scannen. movlw h'90'; Ja, Anzeige zurücksetzen. movwf dis5 returnw6debounce Aufruf entprellen; Warten Sie 0,2 Sek. Anrufentprellung incf dis6; Zähler aktualisieren movf dis6, W; Auf Überlauf prüfen xorlw 0xCA; 10 auf 7-seg? btfss-STATUS, Z return; Nein, zurück zum Scannen. movlw h'C0'; Ja, Anzeige zurücksetzen. movwf dis6 returnendisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie;============================ ================================================ =; Fang hier an!;---------------------------------------------- ---------------------------------Anfang; Config I/O Ports clrf PORTA movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00';RA Ausgänge, RA5 Keine Ausgabe movwf TRISA bcf STATUS, RP0 clrf PORTB bsf STATUS, h'0FF'mov; RB-Eingänge movwf TRISB; Internen Timer setzen bsf PCON, 3; 4Mhz einstellen. movlw h'CF'; Tmr0 Interne Quelle, Vorskalierung TMR0 1:256 movwf OPTION_REG movlw h'A0' movwf INTCON; TMR0-Interrupts aktivieren, bcf STATUS, RP0; Register initialisieren clrf PORTA; PortA löschen clrf PORTB; PortB-Ausgänge löschen 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' movw entprellen; 0,2 sec;Test LEDs, Anzeige 8 ???;===================================== =========================================; Hauptsächlich; Ruft Eingaben von Schaltern ab, entprellt und erhöht Displays.;;Dies aktualisiert die Displays, @4Mhz mit TMR0 Prescal 1:4, mit einer 1Khz-Rate.;Display 0 wird verwendet, um einem unbenutzten Display zuzuordnen. Anzeige 1-6 sind verdrahtet.;Zuerst wird BCD-7Seg IC mit Anzeigewert geladen, UND BCD-Dec IC wird aktiviert für;Anzeigeauswahl.;Zweitens wird eine Verzögerung von ms für die Anzeige gehalten.;Dritten BCD-Dec IC ist deaktiviert…display0 wird ausgewählt, um das Display auszuschalten;;Dies wird für jedes der 6 Displays wiederholt und durchgeschleift.;ISR verarbeitet die Schaltererkennung mit einer Frequenz von 15 Hz.;---------------- -------------------------------------------------- ---------------main;Disp1 movf dis1, 0 movwf PORTA call ledon goto main;===================== ================================================ ========; Ledon; Einschwingzeit für LED-Einschaltung.; 6 Anzeigen -> 1/6 Arbeitszyklus bei 1Khz = 166 Zyklen;---------------------------------- --------------------------------------------------------ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn;========================================= ====================================; Entprellsignal; 4 Zyklen zum Laden und Aufrufen, 2 Zyklen zum Zurückkehren.; 4Mhz Tc:: count2=255 -> 0,2 Sek;------------------------------------- ------------------------------------------entprellen movlw.255; Verzögerung für 1/5 Sekunde Entprellung. movwf count2 call pon_wait return;-------------------------------------------------------- -----------------------------------; count1=255d:: 775 Zyklen auf 0, + 3 Zyklen auf Rückgabe.;-------------------------------- ----------------------------------------------------------pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 CIRCUITI hatte ursprünglich 470Ohm-Widerstände von jeder Displaytreiberleitung der 74LS47- und CD4028-Aktivierungsleitung. Ich habe jedoch die Stromaufnahme meiner Schaltung getestet und festgestellt, dass sie nur ~ 31 mA zieht. Und da der eigentliche Treiber für die Displays direkt vom 74LS47 und die Aktivierung von einem anderen IC stammt, ein kurzer Überblick über die durchschnittlichen und Spitzenanforderungen und die entsprechenden Datenblätter ….. Ich habe die Widerstände vom Steckbrett gezogen und einen Unterschied von 1 mA festgestellt ! Es scheint, dass das direkte Fahren der CA-Linie vom 4028 aus in Ordnung ist, während Sie alle Segmente direkt fahren! … irgendwie.:)Ich hatte einen Fehler in meinem Code, der meine Register nicht löschte, wenn eine Taste gedrückt wurde, was dazu führte, dass die letzte Anzeige 2 Segmente sehr hell aufleuchtete, wenn eine Taste gedrückt wurde. Das war schlecht. Das Löschen des Registers hat dieses Problem jedoch behoben, und kontinuierliche Stromprüfungen bestätigen, dass es konstant etwa 30 mA zieht. Dies sollte mir (basierend auf früheren Erfahrungen mit ähnlichen Schaltungen) ~ 20 Stunden Laufzeit mit einer 9-V-Batterie (500 mAH / 30 mAH unter 5 V-Regelung) geben … Ich hoffe! Ich habe mich entschieden, die LEDs direkt angesteuert zu lassen, sie aber in Steckdosen zu stecken Fall etwas passiert ist, langfristig.

Schritt 4: PCB-Löten

PCB-Löten
PCB-Löten

Jedes Mal, wenn ich in meinem Projekt an diesen Punkt komme, zögere ich etwas. Zuerst wollte ich dieses Ding verdrahten, aber diese Idee ließ ich schnell wieder fallen. Zuerst denke ich "Ein paar Drähte zum Löten, keine große Sache" … dann, wenn mein Projekt fertig zum Löten ist, denke ich: " Ich hätte entweder aussenden sollen, um eine Proto-Platine herstellen zu lassen, oder meine eigene Platine ätzen…Ich habe ungefähr 3 Stunden damit verbracht, dieses Ding zu löten. Es sind ungefähr 150 Drähte, also 300 Lötpunkte, plus Ausbesserungen für Lötbrücken. Wie auch immer, hier ist die Rückseite der Platine abgebildet….ja…ein bisschen durcheinander, aber als alles fertig war, hatte ich nur 1 Lötkurzschluss. Ich habe 20 Minuten nachgedacht, da auf dem Display die falschen # in einem logischen Muster angezeigt wurden, das ich entziffern musste. Danach habe ich die kurze und bam! Es hat perfekt funktioniert.

Schritt 5: Fazit

Abschluss
Abschluss

ES HAT FUNKTIONIERT!Dieses Projekt hat ungefähr gedauert;~2 Wochen zum Nachdenken und E-Mail-Feinpunkte an den Anforderer, ~3 Stunden Code-Vervollständigung und Debug, ~4 Stunden Breadboarding und Debug, ~3 Stunden LötenMit nur 3 ICs ist es möglich Charlieplex 6 7-Segment-LEDs. Die Stromaufnahme liegt bei diesem Design bei etwa 30 mA, was nicht schlecht ist, wenn ich es selbst sage. Ich vermute, dass mehr 7-Segment-LEDs verwendet werden könnten, habe aber nicht die Grenzen überschritten kann auf fast JEDE Anwendung mit 7-Segment-LEDs angewendet werden; Thermometer, Uhr, Textanzeige usw. Mit etwas kniffligem Code könnten Sie ein bewegliches Display oder Bilder haben … vielleicht sogar eine Basis für ein POV-Projekt (Persistenz des Sehens). Die endgültige Umsetzung bleibt meinem Freund überlassen, um seinen Turm zu bauen und platziere das Brett nach Belieben. Wenn das erledigt ist, bekomme ich ein Bild hochgeladen. Aber die Schaltung scheint auf Bestellung gebaut zu sein!

Empfohlen: