Spisu treści:

Licznik obrotów BloodBowl za pomocą 7-segmentowych diod LED: 5 kroków
Licznik obrotów BloodBowl za pomocą 7-segmentowych diod LED: 5 kroków

Wideo: Licznik obrotów BloodBowl za pomocą 7-segmentowych diod LED: 5 kroków

Wideo: Licznik obrotów BloodBowl za pomocą 7-segmentowych diod LED: 5 kroków
Wideo: obrotomierz i licznik motogodzin ustawienia 2024, Lipiec
Anonim
Licznik obrotów BloodBowl za pomocą 7-segmentowych diod LED
Licznik obrotów BloodBowl za pomocą 7-segmentowych diod LED

Ten projekt dotyczył licznika obrotów w grze BloodBowl wykorzystującego sześć 7-segmentowych diod LED Charlieplexed.

Krok 1: Koncepcja

Pojęcie
Pojęcie

Mój przyjaciel zapytał mnie o pomysły na zbudowanie licznika Bloodbowl Turn do jego gry planszowej. Nie wiedząc, co to było i czego chciał, zajęło mi trochę czasu, zanim zdecydowałem, czy i jak mam to zrobić. Najpierw musiałem mieć pomysł na to, czego chce, więc zacząłem od grafiki koncepcyjnej (zdjęcie). Podstawową ideą jest posiadanie 3 przycisków, kontrolujących 3 diody LED każdy, które byłyby umieszczone wewnątrz specjalnie zbudowanej wieży. Jedyną wielką prośbą było to, aby 4 górne wyświetlacze liczyły od 0 do 8 i resetowały się, a dolne 2 wyświetlacze odliczają od 8 do 0 i wracają do cyklu. Ja uzupełniłbym obwód, a on uzupełniłby wieżę.

Krok 2: Projekt i lista części

Projekt i lista części
Projekt i lista części

Ponieważ koncepcja wymagała 6 7-segmentowych diod LED, a miałem pod ręką kilka 8-bitowych mikrochipów PIC, zbadałem sposoby wykorzystania PIC do sterowania diodami LED. Znalazłem ten link https://www.mikroe.com/en/books /picbook/7_08chapter.htm, który stwierdza: „W ten sposób można uzyskać dostęp do maksymalnie 6 wyświetlaczy bez wpływu na jasność każdego wyświetlacza”. Uznałem to za wyzwanie i coś do zbadania w ramach mojego projektu. Pierwszą rzeczą, którą zrobiłem, było wyjęcie kilku żarzących się 7-segmentowych wyświetlaczy z mojego pudełka i sprawdzenie, jak będą działać. Złe wieści. Wybrane przeze mnie poszczególne części nie zachowywały się tak, jak chciałem. Segment zapalał się w razie potrzeby na płytce stykowej, ale prąd upływu był rozprowadzany do pozostałych 6 segmentów. Zdałem sobie sprawę, że żarowe wyświetlacze mogą nie być dobrym rozwiązaniem lub musiałem użyć ich w inny sposób. Więc dla uproszczenia sprawdziłem, czy 7-segmentowe diody LED, które miałem pod ręką, będą działać na płytkach stykowych i zamówiłem kilka typowych wyświetlaczy anodowych. Drugą rzeczą, którą musiałem zrobić, było rozplanowanie mojego projektu i rozpoczęcie pracy nad kodem. Na zdjęciu mój obwód. Niewiele, ponieważ kod w PIC zajmuje się multipleksowaniem… errr Charlieplexing. Uwaga: WSZYSTKIE 6 wyświetlaczy ma te same linie z układu scalonego sterownika. IC selektora włącza każdy wyświetlacz, po jednym na raz, a linie 7-segmentowe są odpowiednio aktualizowane przez PIC. Bardzo prosty pomysł. Potem wystarczyło tylko skompletowanie kodu i sprzętu. Lista części Po 3 małych zamówieniach od Digi-Key, decydując się na konkretne komponenty, miałem wszystko, czego potrzebowałem (z kilkoma rzeczami pod ręką);1 ~3 x4 Małe przełączniki PCB6 (NO)1 74LS47, 7-segmentowy wyświetlacz IC1 PIC16F627 1 CD4028, 1 z 10 selektorów IC 6 rezystory 10KOhm1 rezystor 470Ohm1 szpula drutu. Użyłem różnych kolorów i wskaźników, ale to był tylko ja.1 78L05 Regulator 5V1 Zacisk baterii 9V1 Bateria 9V1 mały włącznik (do włączania/wyłączania zasilania) Uważam, że jest to umiarkowanie skomplikowany projekt, ze względu na;1) Wymagany kod mikroprocesorowy2) Lutowanie i breadboarding 3) Optymalizacja projektu. Żadna z tych kwestii sama w sobie nie jest zbyt skomplikowana, ale podjęcie ich wszystkich bez żadnego doświadczenia może być trochę dla początkującego. Do wypalenia urządzenia, stacji lutowniczej itp. wymagany jest programator sprzętowy… PIERWSZĄ rzeczą, którą ktoś może zauważyć, jest to, że 7-segmentowe diody LED NIE mają szeregowych (ograniczających prąd) rezystorów! Pozwólcie, że zajmę się tym szybko, stwierdzając, że mój oryginalny projekt je zawierał… ale przeczytaj następny krok, aby uzyskać wyjaśnienie!

Krok 3: Deska do krojenia chleba i mikrokod

Deska do krojenia chleba i mikrokod
Deska do krojenia chleba i mikrokod

Deska do krojenia chleba była koniecznością. Pokazano moją ogólną płytkę stykową, ale ze względu na rozmiar tego projektu faktycznie użyłem tej i mniejszej płytki stykowej, ponieważ było wiele przewodów, które musiały być rozstawione. Po pierwsze, przetestowałem jedną pojedynczą 7-segmentową diodę LED za pomocą początkowego kodu. Potwierdziło to 3 rzeczy; 1) Okablowanie układów scalonych zostało zweryfikowane jako dobre! 2) Poprowadziło mnie do optymalizacji i sfinalizowania mojego kodu. 3) Zdałem sobie sprawę, że nie potrzebuję rezystorów ograniczających prąd! 1 OKABLOWANIE Jak stwierdzono, mój schemat został znaleziony do pracy z moim kodem, ponieważ dioda LED będzie przełączać się między liczbami za pomocą jednego przycisku, co weryfikuje mój kod i układ. Niewiele było wymagane, ale płytki prototypowe potwierdziły, że jestem w dobrej formie.2 CODEI pierwotnie ustawił mój kod z główną procedurą skanowania w poszukiwaniu przycisków, a ISR (procedura obsługi przerwań) wyświetlała liczby,. Po testach prototypowania odwróciłem procedury, więc przez większość czasu stale wyświetlałem liczby i ISR, aby sprawdzić przyciski. Powodem, dla którego to zrobiłem, był stały wyświetlacz, ponieważ PIC działa z wewnętrznym zegarem 4Mhz, tracę bardzo mało czasu na skanowanie przycisków. To nic wielkiego… zależy tylko od tego, jak chcesz napisać kod i co jest najbardziej sensowne dla każdej aplikacji. W tym celu wyświetlacz jest ważny, więc umieściłem to w głównej procedurze. Kiedy dotarły moje pierwsze części (wszystkie 6 wyświetlaczy!), wykonałem okablowanie płytki stykowej i znalazłem inny problem. Po naciśnięciu przycisku mój kod miał kilka niechlujnych rejestrów, które nie były usuwane, a ISR powodował drobne usterki wyświetlania.;================= =========================================================== =====;Licznik obrotów;; -----------;Dsply3 Dsply2;Dsply4 Dsply1;Led1 Led3; A5 |4 15| A6 -- Led2; Vss |5 14| Vdd;Przycisk1 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;;=================================== ==============================================; Historia zmian i notatki:; V1.0 początkowy nagłówek, kod 3/30/09;;;(C) 5/2009;Ten kod może być używany do osobistego uczenia się/zastosowania/modyfikacji.;Każde użycie tego kodu w produktach komercyjnych narusza tę wersję freeware.;W przypadku pytań/komentarzy prosimy o kontakt.;------------------------------------------------ -------------------------------#zawiera P16F627A. INC;============= =========================================================== ================; Definiuje;------------------------------------------------ -------------------------------;=================== =========================================================== ===========; Dane;------------------------------------------------ -------------------------------; Zmienne czasowecount1 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;====================== =========================================================== =======; Resetuj wektory;; SPRAWDŹ KONFIG. BITY PRZED PALENIEM !!!; INTOSC; MCLR: WŁĄCZONE; PWRUP: WŁĄCZONE; WSZYSTKIE POZOSTAŁE: WYŁĄCZ!!;;------------------------------------------ -------------------------------------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 TUTAJ; Sprawdź przełączniki PB0-PB5 btfsc PORTB, 0; Sprawdź połączenie SW1 sw1debounce btfsc PORTB, 1; Sprawdź połączenie SW1 sw2debounce btfsc PORTB, 2; Sprawdź połączenie SW1 sw3debounce btfsc PORTB, 3; Sprawdź połączenie SW1 sw4debounce btfsc PORTB, 4; Sprawdź połączenie SW1 sw5debounce btfsc PORTB, 5; Sprawdź wywołanie SW1 sw6debounce goto endisrsw1debounce wywołanie debounce; Czekaj 0,2 sek. wywołanie debounce incf dis1; Aktualizacja licznika movf dis1, W; Sprawdź przepełnienie xorlw 0x1A; 10 na 7-seg? btfss STATUS, powrót Z; Nie, wróć do skanowania. movlw h'10'; Tak, zresetuj wyświetlacz. movwf dis1 zwracaw2debounce wywołanie debounce; Czekaj 0,2 sek. wywołanie debounce incf dis2; Aktualizacja licznika movf dis2, W; Sprawdź przepełnienie xorlw 0x4A; 10 na 7-seg? btfss STATUS, powrót Z; Nie, wróć do skanowania. movlw h'40'; Tak, zresetuj wyświetlacz. movwf dis2 returnw3debounce wywołanie debounce; Czekaj 0,2 sek. wywołanie debounce incf dis3; Aktualizacja licznika movf dis3, W; Sprawdź przepełnienie xorlw 0x5A; 10 na 7-seg? btfss STATUS, powrót Z; Nie, wróć do skanowania. movlw h'50'; Tak, zresetuj wyświetlacz. movwf dis3 returnw4debounce wywołanie debounce; Czekaj 0,2 sek. wywołanie debounce incf dis4; Aktualizacja licznika movf dis4, W; Sprawdź przepełnienie xorlw 0x8A; 10 na 7-seg? btfss STATUS, powrót Z; Nie, wróć do skanowania. movlw h'80'; Tak, zresetuj wyświetlacz. movwf dis4 returnw5debounce wywołanie debounce; Czekaj 0,2 sek. wywołanie debounce incf dis5; Aktualizacja licznika movf dis5, W; Sprawdź przepełnienie xorlw 0x9A; 10 na 7-seg? btfss STATUS, powrót Z; Nie, wróć do skanowania. movlw h'90'; Tak, zresetuj wyświetlacz. movwf dis5 zwracaw6debounce wywołanie debounce; Czekaj 0,2 sek. wywołanie debounce incf dis6; Aktualizacja licznika movf dis6, W; Sprawdź przepełnienie xorlw 0xCA; 10 na 7-seg? btfss STATUS, powrót Z; Nie, wróć do skanowania. movlw h'C0'; Tak, zresetuj wyświetlacz. movwf dis6 returnendisr bcf INTCON, T0IF swapf status_temp, w movwf STATUS swapf w_temp, f swapf w_temp, wretfie;============================ =========================================================== =; Zacznij tutaj!;---------------------------------------------- ---------------------------------początek; Konfiguracja portów we/wy clrf PORTA movlw 0x07 movwf CMCON bcf STATUS, RP1 bsf STATUS, RP0 movlw h'00';Wyjścia RA, RA5 Brak wyjścia movwf TRISA bcf STATUS, RP0 clrf PORTB bsf STATUS, RP'0FF' movl; RB Wejścia movwf TRISB; Ustaw wewnętrzny timer bsf PCON, 3; Ustaw na 4 MHz. movlw h'CF'; Tmr0 Źródło wewnętrzne, preskalowanie TMR0 1:256 movwf OPTION_REG movlw h'A0' movwf INTCON; Włącz przerwania TMR0, bcf STATUS, RP0; Inicjalizacja rejestrów clrf PORTA; Wyczyść portA clrf PORTB; Wyczyść wyjścia 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 movw h'C0' wywołanie movw Obalić; 0,2 s; testowe diody LED, wyświetlacz 8 ???;======================================= ==========================================; Główny; Pobiera dane wejściowe z przełączników, debounces i monitorów. Wyświetlacze 1-6 są podłączone.;Najpierw BCD-7Seg IC jest ładowany z wyświetlaną wartością, AND BCD-Dec IC jest aktywowany dla;wyboru wyświetlacza.;Po drugie, opóźnienie ms jest utrzymywane na wyświetlaczu.;Po trzecie, BCD-Dec IC jest dezaktywowany…wybrano display0, aby wyłączyć wyświetlacz;;Powtarza się to dla każdego z 6 wyświetlaczy i jest zapętlone.;Sterowanie przełącznikami ISR z częstotliwością 15 Hz.;----------------- -------------------------------------------------- ---------------main;Disp1 movf dis1, 0 movwf PORTA call ledon goto main;===================== =========================================================== ========; Ledona; Czas ustalania dla włączenia zasilania LED.; 6 wyświetlaczy -> 1/6 cyklu pracy przy 1Khz = 166 cykli;----------------------------------- --------------------------------------------ledon movlw.54 movwf count1ledloop decfsz count1, F goto ledloopreturn;=================================================== =====================================; sygnał odbicia; 4 cykle do załadowania i wywołania, 2 cykle do powrotu.; 4Mhz Tc:: liczba2=255 -> 0,2 sek;-------------------------------------- -----------------------------------------debounce movlw.255; Opóźnienie o 1/5 sekundy odbicia. movwf count2 wywołanie pon_wait return;----------------------------------------------- -----------------------------------; count1=255d:: 775 cykli do 0, + 3 cykle do powrotu.;--------------------------------- ----------------------------------------------pon_waitbig_loopS movlw.255 movwf count1short_loopS decfsz count1, F goto short_loopS decfsz count2, F goto big_loopSreturnend3 CIRCUITI pierwotnie miał rezystory 470Ohm z każdej linii sterownika wyświetlacza z linii enable 74LS47 i CD4028. Jednak przetestowałem pobór prądu mojego obwodu i stwierdziłem, że ciągnie on tylko ~31mA. A ponieważ rzeczywisty sterownik wyświetlaczy pochodzi bezpośrednio z 74LS47, a włączony jest z innego układu scalonego, szybkie obniżenie średnich i szczytowych wymagań oraz odpowiednich arkuszy danych….. Wyciągnąłem rezystory z płytki stykowej i znalazłem różnicę 1mA ! Wygląda na to, że bezpośrednia jazda linią CA z 4028 podczas bezpośredniej jazdy wszystkimi segmentami jest OK! …raczej.:) MIAŁEM usterkę w moim kodzie, która nie wyczyściła moich rejestrów po naciśnięciu przycisku, powodując, że ostatni wyświetlacz miał 2 segmenty bardzo jasno podświetlone po naciśnięciu przycisku. To było złe. Jednak wyczyszczenie rejestru naprawiło ten problem, a ciągłe kontrole mocy potwierdzają, że stale wynosi około 30 mA. To powinno dać mi (w oparciu o wcześniejsze doświadczenia z podobnymi obwodami) ~20 godzin pracy przy użyciu 1 akumulatora 9 V (500 mAH/30 mAH przy regulacji 5 V)… Mam nadzieję! na wypadek, gdyby coś się stało, na dłuższą metę.

Krok 4: lutowanie PCB

Lutowanie PCB
Lutowanie PCB

Za każdym razem, gdy dochodzę do tego punktu w moim projekcie, trochę się zwlekam. Na początku chciałem to owinąć drutem, ale szybko porzuciłem ten pomysł. Na początku myślę „Kilka przewodów do lutowania, nic wielkiego”… potem, kiedy mój projekt jest gotowy do lutowania, myślę: „ Powinienem był wysłać albo zrobić płytkę prototypową, albo wytrawić własną płytkę „. Nie jestem w trawieniu PCB (jeszcze) i nie chciałem płacić $ $ za wykonanie płytki, więc…. Tak….. Spędziłem około 3 godzin na lutowaniu tej rzeczy. To około 150 przewodów, więc to 300 punktów lutowniczych plus poprawki do mostków lutowniczych. W każdym razie, tutaj jest na zdjęciu tylna strona płytki … tak … trochę bałaganu, ale kiedy wszystko było skończone, miałem tylko 1 lut. Zajęło mi to 20 minut myślenia, ponieważ wyświetlacz pokazywał błędne # w logicznym wzorze, który musiałem rozszyfrować. Potem zlokalizowałem krótki i bam! Działało idealnie.

Krok 5: Wniosek

Wniosek
Wniosek

TO DZIAŁAło! Ten projekt zajęło około; ~ 2 tygodnie na przemyślenie i wysłanie e-mailem drobnych punktów do zleceniodawcy, ~ 3 godziny dokończenia kodu i debugowania, ~ 4 godziny tworzenia prototypów i debugowania, ~ 3 godziny lutowania Za pomocą zaledwie 3 układów scalonych można 7-segmentowe diody LED Charlieplex 6. Przy takim projekcie pobór mocy wynosi około 30 mA, co nie jest złe, jeśli sam to powiem. Podejrzewam, że można by użyć więcej 7-segmentowych diod LED, ale nie przesunąłem koperty. być stosowane w prawie KAŻDEJ aplikacji za pomocą 7-segmentowych diod LED; termometr, zegar, wyświetlacz tekstowy itp. Przy pewnym skomplikowanym kodzie możesz mieć ruchomy wyświetlacz lub obrazy… może nawet podstawę do projektu POV (trwałości widzenia). Ostateczną implementację pozostawia mój przyjaciel, aby zbudować swoją Wieżę i umieść planszę tak, jak uzna za stosowne. Jeśli/Kiedy to zrobisz, dostanę zdjęcie. Ale jeśli chodzi o tor, wydaje się, że jest zbudowany na zamówienie!

Zalecana: