Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

dekoder kolejności wciśnięcia przycisku - jak zrobić?

02 Sty 2007 17:28 1878 9
  • Poziom 12  
    witam
    zwracam sie do Forumowiczów z prośbą o pomoc w zaprojektowaniu dekodera kolejności wciśnięcia przycisków. chodzi mi dokładniej o układ przeznaczony do zabawy dla dzieci w grupie przedszkolnej, w którym będzie 10 przycisków i tymi przyciskami dzieci będą zgłaszały chęć udzielenia odpowiedzi na zadane pytanie. układ taki powinien mieć możliwość wyświetlania numeru przycisku na wyświetlaczu 7seg, oraz zapamiętywania 2-3 zgłoszeń jeśli wciśnięcie drugiego przycisku nastąpi przed skasowaniem poprzedniego zgłoszenia. podejrzewam ze układ taki mógłby byc oparty o dekoder "1 z 10" na kod binarny i dalej na kod wyświetlacza 7seg. niestety jestem zielony w sprawach projektowania układów i dlatego zwracam się do fachowców :)
    prosze o pomoc, jakikolwiek link do strony zawierającej podobny układ (lub choć nazwę takiego układu - nawet nie wiem jak go poprawnie nazwać i poszukać w guglach) lub konkretny schemat. z góry dziekuję za wszelkie podpowiedzi i pozdrawiam
    malcziki
  • Użytkownik usunął konto  
  • Poziom 29  
    chyba najłatwiej/najszybciej i najtaniej będzie wykorzystać jakiś taniutki mikroprocesor.
  • Specjalista elektronik
    Generator z kilkadziesiąt kHz + licznik (można zrobić na CD4060, bo to generator + licznik w jednym),
    demultiplekser podłączony wejściami adresowymi do wyjść licznika, wejściami danych do przycisków,
    jak na wyjściu pojawi się sygnał, to ma być zapamiętany, i spowodować zatrzymanie generatora
    i wyświetlenie stanu licznika - to będzie numer przycisku, który pierwszy został wciśnięty
    (z dokładnością do okresu liczenia, ale to będzie ułamek milisekundy).
  • Poziom 12  
    witam
    pomysł przedmówcy _jta_ narazie chyba najbardziej mi odpowiada. miałbym jeszcze tylko pytanko o podpowiedź jak to tego układu domontować jakiś rejestr lub pamięc która pozwoliłaby na zapamiętanie sytuacji gdyby ktoś nacisnął drugi przycisk zanim pierwsze zgłoszenie zostałoby skasowane przez opiekuna. z góry dziekuje za kolejne porady :)
    malcziki
  • Specjalista elektronik
    A do ilu przycisków chciałbyś zapamiętywać? Czy jeśli drugi zostanie wciśnięty w czasie, gdy pierwszy
    nadal jest wciśnięty, to czy ma to być zapamiętane? Czy może wystarczy, że po puszczeniu pierwszego
    wykryje się, że jest wciśnięty drugi, i wtedy się to zapisze? Jeśli by się chciało pozwolić na wciśnięcie
    kilku po kolei, i zapisać kolejność wciśnięć, to trzeba by sprawdzać, czy już jest gdziekolwiek zapisany...
    I jak wtedy ma wyglądać kasowanie - odczytujemy jeden numer, wypadałoby ten jeden skasować,
    i wtedy mieć możliwość przeczytania następnego... albo trzeba mieć kilka cyfr wyświetlacza.
  • Poziom 12  
    witam
    z tym zapamiętywaniem to chodziło by mi o takie rozwiązanie żeby było tak:
    - dziecko 1 zgłasza się do odpowiedzi i odpowiada
    - w tym czasie inne dziecko może zgłosić swoją chęć odpowiadania (czyli dziecko 1 już puściło guzik)
    - po zakończeniu odpowiedzi przez dziecko 1 opiekun kasuje wskazanie zgłoszenia pierwszego
    - na wyświetlaczu pojawia się numer kolejnego zapamiętanego zgłoszenia i odpowiada kolejne dziecko, po czym następuje kasacja zgłoszenia
    mniej więcej tak by to miało wyglądać. przycisków byłoby potrzebne 10 plus jeden dla opiekuna, którym będą kasowane zgłoszenia, zapamiętane mogą być 2-3 zgłoszenia, nie ma potrzeby więcej, wyświetlanie na wyświetlaczu 7seg wskazania 0 do 9 (gdzie 0 to 10) lub na dwóch 7seg z pełnym wskazaniem 1 do 10. ale samo wyświetlanie to powiedzmy że wiem jak zrobić więc tu będę w razie potrzeby dopiero później szukał pomocy :)
    pozdrawiam i dziękuje za zainteresowanie tematem
  • Specjalista elektronik
    Przychodzi mi do głowy, że do czegoś takiego warto by zrobić rejestr, w którym dane krążą w kółko, i to dość szybko.
    To pozwala oszczędzić na połączeniach do ich adresowaniu - zamiast zmieniać adresy i przekierowywać dane czekamy
    z dostępem na moment, gdy są w miejscu, do którego jest połączenie, i wtedy je czytamy i ewentualnie zmieniamy.

    Każda pozycja zajmowałaby 5 bitów (albo można 4 - jeśli jakaś wartość, np. 1111 oznaczałaby "puste"); jakiś licznik liczy
    kiedy jest cyfra "pierwsza na liście" - a może przeznaczyć na pozycję jeszcze jeden bit, i ustawiać go dla tej "pierwszej"?

    Jeśli trzeba coś do tego wpisać, to czekamy na znak "pierwsza", potem na brak znaku "zajęte" i tam wpisujemy.
    I jak jest znak "pierwsza", to wyświetlamy (oczywiście można zrobić parę cyfr wyświetlacza, i pokazać 2 czy 3).

    Jak trzeba usunąć: na sygnał "pierwsza" zerujemy aktualne dane, i ustawiamy ten sygnał na następnych. Tylko...
    w takim układzie łatwo o zgubienie sygnału "pierwsza", lub jego powielenie - lepiej użyć licznika, może takiego,
    co daje na wyjściach przesuwającą się jedynkę - to gwarantuje, że żadnej takiej katastrofy nie będzie.
  • Poziom 12  
    witam
    jak już mówiłem nei jestem zbyt biegły w tych sprawach a Twoje wyjaśnienia nie za bardzo do mnie trafiają :) można prosić jakoś bardziej "po naszemu" w języku ludzi niezbyt związanych ze sprawami technicznymi? :)
    z góry wielkie podziekowania za wszelką okazaną pomoc :)
    pozdrawiam
  • Specjalista elektronik
    Pewien problem, który zaczynam dostrzegać: co będzie, jeśli jeden przycisk zostanie wciśnięty kilka razy?
    Albo dwa będą wciskane na zmianę - jeśli już zrobimy tak, że powtórzenie tego samego nie działa drugi raz?
    Choćby przez to, że komuś drgnie ręka, jak dwie osoby w pośpiechu spróbują nacisnąć przyciski, bo akurat
    pytanie "podejdzie", wiele osób będzie umiało odpowiedzieć, i wcisną 1,2,1... osoba z przyciskiem 1 zgłosi
    się dwukrotnie, nie pozwalając się zgłosić innej osobie, która swój przycisk wciśnie pół sekundy później.

    Trzeba albo zrobić układ tak, by zakazywał "powtórek", albo kolejkę tak krótką, by nie było na nie miejsca,
    albo pogodzić się z tym, że takie powtórki będą. Widzę dwa sposoby zrobienia zakazu powtórek - jeden to taki,
    że kiedy mamy sygnał, że ktoś nacisnął przycisk, przeglądać całą kolejkę i sprawdzać, czy już w niej nie ma;
    drugi - do każdego przycisku podłączamy układ, który zapamiętuje, że został on wciśnięty, i przekazuje to dalej,
    ale tylko po pierwszym wciśnięciu - żeby zadziałał znowu, musi zostać wyzerowany - oznaczałoby to, że osoba, która
    raz wciśnie przycisk i otrzyma prawo głosu, nie będzie mogła zgłosić się drugi raz do tego samego pytania (po
    zakończeniu wypowiedzi w sprawie jednego pytania prowadzący resetowałby te układy od przycisków); taki
    układ można zrobić na przerzutniku RS + przerzutniku D wyzwalanym zboczem - np. z układu 7474 - RS zapamiętuje
    naciśnięcie i daje zbocze dla D, ale tylko raz, bo potem już jest przestawiony na stan "przycisk wciśnięty".

    Wciąż się zastanawiam, jak prosto zrobić kolejkę danych - właśnie mi przyszedł do głowy taki pomysł, żeby
    użyć rejestru przesuwającego dwukierunkowo (właśnie sobie przypomniałem, że coś takiego było w postaci
    układu scalonego TTL), najlepiej chyba by pasował 74194, tylko czy to jest w jakimś sklepie w okolicy?
    Da się również użyć 7495, ale jest dużo mniej wygodny, przynajmniej do tego układu.

    Koncepcja wyglądałaby tak: mamy kilka rejestrów na dane, działających w ten sposób, że w zależności od
    sygnału zezwalającego na wpisywanie pamiętają one wpisany stan, lub przyjmują nowy; są one połączone tak,
    że pierwszy dostaje numer wciśniętego przycisku, drugi to, co jest w pierwszym, trzeci to co w drugim, itd.
    Steruje się nimi przy użyciu rejestru przesuwającego, który początkowo pozwala wpisywać do wszystkich rejestrów
    danych; po sygnale, że wciśnięto przycisk, rejestr się przesuwa i ostatni rejestr danych przełącza się na funkcję
    pamiętania - nowe dane mogą dochodzić tylko do przedostatniego. Kolejne wciśnięcia przycisków spowodują, że
    kolejne rejestry danych przełączą się na pamiętanie. Do tego miejsca to jest proste... ale dalej jest gorzej.
    Problem jest kiedy chcemy usunąć daną, która "zawędrowała" najdalej (czyli tę, która weszła pierwsza) - do tego
    trzeba będzie przesunąć rejestr w przeciwną stronę - dlatego jest on dwukierunkowy - ale co gorsza trzeba również
    przesunąć dane - to się daje prosto zrobić tylko z rejestrami danych, które zmieniają zawartość na zboczu sygnału
    zegarowego - wystarczy wszędzie dać sygnał zegarowy, i każda dana "przeskoczy" na następną pozycję. Jeśli
    mamy takie rejestry danych, to komplikuje się wpisywanie, które było takie proste - trzeba tym rejestrom, które
    nie mają pamiętać, podawać sygnał zegarowy cały czas, aż dane dotrą do ostatniego z tych rejestrów. I dopiero
    wtedy można przesunąć rejestr, żeby odtąd zabraniać zmieniania nowo wpisanej danej.

    Za to zaletą takiej wersji jest to, że do wyjść rejestrów danych można podłączyć parę dekoderów i wyświetlaczy,
    w najprostszy sposób, i cała kolejka będzie pokazywana - nie będzie komplikacji z konstruowaniem wyświetlania.

    Do rejestrów danych można użyć układów 74175 (cztery bity w jednym, czyli do 16-tu przycisków; więcej mają 74174
    - po 6 bitów, więc do 64-ch przycisków), do 4-ch sztuk (bo rejestr przesuwny jest 4-bitowy).

    A swoją drogą są jakieś układy scalone do robienia kolejek, tylko chyba w żadnym sklepie w Polsce ich nie ma. :(

    Wymyśliłem jak w prosty sposób skonstruować kolejkę FIFO z elementarnych układów - potrzebne są do tego
    przerzutniki D wyzwalane zboczem (o jeden więcej, niż ilość danych), bramka AND i bramka OR. Na rysunku są dwie
    linie danych: górna przenosi informację, że są dane, dolna same dane (oczywiście tych dolnych ma być więcej, jak
    chcemy zapisywać numer od 1 do 10, to potrzeba 4-ch tych "dolnych" danych - można użyć układy 74174, będzie ich
    6 - czyli 5 na informację, można by zapisywać w tym liczbę do 31, jak klasa nie będzie duża, to wystarczy...
    Kolejka składa się z wielu takich układów jak na rysunku, połączonych ze sobą. Ostatnie wyjście "górne dane" jest
    połączone z wejściem ZAJĘTE - ten sygnał nie pozwala wpisać danych tam, gdzie już jakieś są. Jeśli któraś pozycja
    kolejki nie jest zajęta, to na niej i na lewo od niej nie ma sygnału ZAJĘTE, i sygnał zegara powoduje tam przesuwanie
    danych - aż wszystkie dane znajdą się z prawej strony, bez żadnych dziur. Po skasowaniu danych w ostatniej pozycji
    nie ma nigdzie sygnału ZAJĘTE, i przy najbliższym sygnale zegara cała kolejka się przesuwa.