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

Gra "teleturniej" na Attiny2313

Wojtek001 20 Sie 2012 21:00 8025 14
  • Gra "teleturniej" na Attiny2313
    W obliczu tego że przez dłuższy czas posiadałem kilka niepotrzebnych mikrokontroklerów Attiny2313 i dwa duże wyświetlacze LED postanowiłem
    je w jakiś twórczy sposób wykorzystać. W ten sposób wpadł mi do głowy pomysł na zbudowanie urządzenia przeznaczonego do
    przeprowadzania teleturniejów. Głównym jego zadaniem miało być wskazywanie który z graczy pierwszy zgłosił się
    do odpowiedzi na pytanie. Jednak jak się okazało zostało mi jeszcze sporo miejsca dlatego wprowadziłem parę efektów
    wizualnych , zapamiętywanie i dokonywanie zmian w aspekcie punktów posiadanych przez danego gracza (w przedziale od 0 - 99) ,a także funkcje pozwalającą wskazać przez urządzenie gracza który wygrał rozgrywkę (bądź też kilku zwycięzców
    w przypadku remisu) i możliwość uruchomienia sygnalizacji dźwiękowej po skończeniu czasu na odpowiedź (działa to w ten sposób że gdy ustawimy np. 5s to gdy dany gracz
    zgłosi się to po 5s dojdzie do "piknięcia" sygnalizującego koniec czasu). Program napisałem w BASCOMIE.

    Prezentowane urządzenie jest układem bardzo prostym ale oryginalnym. Nie znalazłem bowiem w internecie
    tego typu projektu dlatego postanowiłem go tutaj przedstawić

    Kontroler działa na wewnętrznym oscylatorze 8Mhz (m.in. dlatego że chciałem użyć jeszcze portu.a).
    Jak wiadomo procesor Attny2313 posiada 17 nóżek uniwersalnego zastosowania. W związku z tym było mi trochę ciasno
    na podłączenie wszystkiego do uC. Teraz jak patrzę na to z perspektywy czasu (projekt robiłem miesiąc temu) to trochę przekombinowałem
    i dało by się to wszystko lepiej podłączyć ,ale już trudno (np. można by było przyciski podłączyć w formie matrycy).
    Diody w wyświetlaczu oraz 4 diody 10mm steruje multipleksowo więc zajęło mi to w sumie 10 pinów. Ciekawostką jest tu fakt że
    do załączania tranzystorów kluczujących nie stosowałem 2 wyjść tylko 1 wyjście (ponieważ zbudowałem bramkę NOT przy jednym
    z tranzystorów kluczujących). Działa to w ten sposób ,że gdy na wyjściu pojawia się stan wysoki to zapala się lewa cyfra, gdy niski zapala
    się prawa. Dodatkowo 4 wejścia zostały użyte do podłączenia przycisków graczy, a jedno wyjście do buzera. Zostały mi
    więc 2 wejścia a ja musiałem jeszcze podłączyć 3 przyciski do wprowadzania ustawień - w związku z tym zdecydowałem się
    podłączyć tak naprawdę 2 przyciski ,natomiast 3 przycisk zachowuje się tak że zwiera oba przyciski (za pośrednictwem diod prostowniczych).

    Program pisałem w BASCOM-AVR, zajął 99% miejsca z pośród 2kb pamięci. Zawsze piszę programy tak aby zapełniały całą
    dostępną pamięć w procesorze (bo czemu mam nie korzystać z całej pamięci skoro za nią zapłaciłem). Gdy napisze jakiś program i zajmuje on




    mniej niż się spodziewałem to staram się dodawać nowe funkcje do urządzenia.Tak też było w tym przypadku. Poznałem
    też kilka trików pozwalających na zmniejszenie objętości programu w BASCOMie (np. kto by się spodziewał że
    lepiej użyć kilku poleceń If...End niż logicznych funktorów).

    Elektronika została wykonana na bazie dwóch płytek PCB (zaprojektowane w programie Design Spark PCB), jedna parowała katody wyświetlaczy do multipleksów, na drugiej znajdowała
    się cała elektronika. Urządzenie zasilam 4 bateriami AA (6V). Jak ktoś byłby zainteresowany to mogę udostępnić wzór PCB, ale mogą być problemy
    co gdzie trzeba podłączyć ponieważ nie posiadam schematu.

    Filtr na wyświetlacz wykonałem z foli do przyciemniania szyb. Producent oraz poradnik na który akurat natrafiłem w internecie
    podawał aby najpierw oczyścić powierzchnię do której przyklejamy folie, następnie spryskać ją roztworem wodnym mydła/
    detergentu, a następnie przykleić folię (z foli trzeba było zdjąć warstwę ochronną pod którą znajdował się klej,
    było to dość trudne i musiałem wspomóc się nożykiem do tapet).

    Cała elektronika znajduje się w obudowie wykonanej z pomalowanej na czarno blaszanej puszcze po kremie. Przyciski dla
    (graczy również wykonane zostały z pojemników po jakiś kremach) połączone są z główną płytką za pomocą metrowych przewodów.

    Jeśli chodzi o obsługę praktyczną to z grubsza widać to na filmie:

    Link


    Kiedy uruchomimy układ pojawia się kilku sekundowa animacja,
    następnie układ czeka (wyświetla wtedy 2 poziome kreski) na naciśnięcie przycisku przez któregoś z użytkowników.
    W tym momencie mamy także możliwość ustawienia czasu jaki gracz będzie posiadał na dokonanie odpowiedzi (po jego minięciu
    usłyszymy "piknięcie"(można też ustawić "00" i wtedy czas na odpowiedź będzie nieograniczony). Służą do tego przyciski "góra" i "dół" obok wyświetlacza. Gdy naciśniemy któryś z tych przycisków
    układ na kilka sekund pokaże aktualną wartość po czym wróci dalej do trybu "czuwania" (pokaże znów poziome kreski). Jeśli jednak szybko zwolnimy przycisk i jeszcze raz
    go naciśniemy będziemy mogli dokonać zmiany. Na uwagę zasługuje tu system tzw. "inteligentnego przycisku". Rozbudowałem go nieco
    względem mojego wcześniejszego projektu.Działa on teraz tak że szybkie zmniejszanie/ zwiększanie wartości zmiennej odbywa się dopiero
    gdy użytkownik przytrzyma przycisk co najmniej sekundę. Zacznie ułatwia to precyzyjne wpisywanie danej wartości.

    Kiedy natomiast w trybie "czuwania" naciśniemy środkowy przycisk urządzenie wyświetli animacje oraz wskaże który z
    uczestników otrzymał największą ilość punktów (może też wskazać remis) - zwycięzca wskazany jest za pomocą diod 10mm natomiast ilość
    punktów ,które zgromadził pokazuje wyświetlacz LED. W tym momencie przyciski "góra" i "dół" są nieaktywne natomiast
    przycisk "środkowy" przenosi nas znowu do trybu "czuwania".

    Kiedy układ jest w trybie "czuwania" a któryś z graczy naciśnie swój przycisk,urządzenie pokazuje ilość punktów zgromadzoną przez tego gracza (i jednocześnie blokuje przyciski
    innym graczom dzięki czemu wykrywa różnice w zgłoszeniu się uczestników na poziomie kilku ms),
    przyciski "góra", "dół" służą do zmiany ilości punktów (tu też działa system "inteligentnego przycisku") a przycisk "środkowy" pozwala na powrót
    do trybu "czuwania".

    Starałem się wyeliminować wszystkie błędymogące prowadzić do nieoczekiwanego zachowania układu bądź jego zawieszenia. Np. gdy kod
    był jeszcze "nie oczyszczony z wszelakich błędów" pojawiały się problemy tego typu że np. wciśnięcie kilku przycisków na raz (w konfiguracji nieprzewidzianej przez program)
    powodowało problemy w działaniu - teraz tego typu sytuacje są zażegnane.

    Errata: Program posiada jedną wadę której nie udało się wykryć podczas testów (i tak już niestety zostanie, poza tym i
    tak nie wiem czy naprawa tego błędu zmieściła by się w programie). Wada ta związana jest z "piknięciem" sygnalizującym
    użytkownika o zakończeniu czasu na odpowiedź. Otóż gdy uruchomimy funkcję wskazującą zwycięzce to układ również piknie
    po żądanym czasie.

    Gra "teleturniej" na Attiny2313


    Fajne!
  • #2 21 Sie 2012 00:01
    luc52
    Poziom 9  

    Kiedyś na polecenie nauczyciela zbudowałem podobne , tylko że dla trzech uczestników a zamiast mikro-kontrolera użyłem trzech potrójnych przekaźników przełączających . Do tego centrala z brzęczykiem i przyciskiem reset .

  • #3 21 Sie 2012 11:21
    SylwekK
    Poziom 28  

    Ogólnie może być. Podoba mi się rozwiązanie z bramką NOT dla multipleksu chociaż by tu zwykły tranzystor wystarczył. Troszkę drażniące te piski są. Lepiej już było wygenerować coś przez uC.

    Cytat:
    Poznałem też kilka trików pozwalających na zmniejszenie objętości programu w BASCOMie (np. kto by się spodziewał że lepiej użyć kilku poleceń If...End niż logicznych funktorów).

    Konkretnie to chodzi o operator "AND" - ta zaraza w kilku warunkach potrafi zatkać mały uC i o ile możliwe to lepiej go zastąpić IF'am (zdarzają się sytuacje jednak gdzie jest niezbędny i łatwiejszy w użyciu). Program nieco straci na czytelności ale wykonuje się szybciej i mniej zajmuje. Tak w ogóle to jest dużo więcej podobnych niespodzianek w BASCOM - z czasem do nich dojdziesz. Nie będę psuł Ci zabawy 8-)

  • #4 21 Sie 2012 11:44
    Wojtek001
    Poziom 15  

    SylwekK Ale ja tą bramkę NOT zbudowałem właśnie na jednym tranzystorze :D - czyli są 2 tranzystory kluczujące + 1 tranzystor w funkcji bramki NOT.

    A co do operatorów to nie dotyczy to tylko AND, np. czasami lepiej napisać kilka warunków If...End If ze skokami do podprogramu (gdzie wykonuje się dana procedura) niż jeden If...End z kilkoma operatorami OR.

    Dodano po 1 [minuty]:

    SylwekK napisał:
    Tak w ogóle to jest dużo więcej podobnych niespodzianek w BASCOM - z czasem do nich dojdziesz. Nie będę psuł Ci zabawy 8-)

    Może jednak zdradzisz mi te niespodzianki? Zaoszczędził byś mi sporo pracy.

  • #5 21 Sie 2012 12:27
    SylwekK
    Poziom 28  

    Wojtek001 napisał:
    Może jednak zdradzisz mi te niespodzianki? Zaoszczędził byś mi sporo pracy.


    Teraz tak z rękawa nie posypie, hmm... przykładowo Do...Loop jest mniejsze niż while...wend. Generalnie chodzi o zastępowanie, niektórych instrukcji BASCOM'owych własnymi rozłożonymi na części pierwsze warunkami. O działaniach na liczbach zmiennoprzecinkowych już nie wspomnę, zamiast Wait - timery programowe, przy dzieleniu przez 2/4/8... lepiej używać przesuwania bitowego, itd... :)

    Odnośnie OR - ten operator jeszcze nie jest zły i szkoda czasu na jego zastępowanie. Sprawdź sobie co AND wyprawia...

  • #6 21 Sie 2012 21:48
    Flaman11
    Poziom 17  

    Wojtek001 napisał:
    Zawsze piszę programy tak aby zapełniały całą
    dostępną pamięć w procesorze (bo czemu mam nie korzystać z całej pamięci skoro za nią zapłaciłem).


    Dziwne podejście. A jak za jakiś czas poddasz kod optymalizacji, to będziesz wymyślał nowe funkcje by znów zapełnić pamięć? Tak tylko pytam, ogólnie fajna zabawka.

  • #7 21 Sie 2012 23:06
    Wojtek001
    Poziom 15  

    Flaman11 napisał:
    Wojtek001 napisał:
    Zawsze piszę programy tak aby zapełniały całą
    dostępną pamięć w procesorze (bo czemu mam nie korzystać z całej pamięci skoro za nią zapłaciłem).


    Dziwne podejście. A jak za jakiś czas poddasz kod optymalizacji, to będziesz wymyślał nowe funkcje by znów zapełnić pamięć? Tak tylko pytam, ogólnie fajna zabawka.

    Program próbuje zoptymalizować na maxa, potem uzyskuje trochę miejsca, dodaje nowe funkcje, znów optymalizuje i tak dalej. Kiedy uznam że nie wiele już poradzę (przetestuje różne drogi rozwiązania danych problemów, rozbije niektóre procedury na części pierwsze itd. kończę).

    Dodano po 13 [minuty]:

    SylwekK napisał:
    , zamiast Wait - timery programowe

    Zastąpienie "Wait" timerem zapewne zwiększy objętość - jeśli nie jest potrzebna duża dokładność (np. przy usuwania efektu drgania styków w przyciskach itp) lepiej użyć po prostu jakieś zwiększającej się zmiennej.
    Niemniej zdecydowanie polecenia "wait" wystrzegam się jak ognia bo zatrzymuje program w jakiejś wewnętrznej pętli i to jest jego niewybaczalną wadą.
    SylwekK napisał:
    Generalnie chodzi o zastępowanie, niektórych instrukcji BASCOM'owych własnymi rozłożonymi na części pierwsze warunkami.


    Też tak robiłem, np. miałem zmienną punkty w której zapisywana była liczba w zakresie od 0 - 99 (ta którą widzimy aktualnie na wyświetlaczu). Musiałem tą zmienną przepisać jednak do 2 innych zmiennych - "jednosci" i "dziesiatki" przed wyświetleniem.
    Najpierw stosowałem polecenie "Makebcd" i kilka innych poleceń (przesunięcie bitów i maskę z feralnym poleceniem AND). Później znalazłem na elektrodzie algorytm zamiany liczby binarnej na BCD i opracowałem go w BASCOMIE.
    Ostatecznie odkryłem że najmniejszą objętość można uzyskać stosując dzielenie na liczbach całkowitych i funkcja MOD (reszta z dzielenia).

  • #8 21 Sie 2012 23:18
    Flaman11
    Poziom 17  

    Wojtek001 napisał:
    Program próbuje zoptymalizować na maxa, potem uzyskuje trochę miejsca, dodaje nowe funkcje, znów optymalizuje i tak dalej. Kiedy uznam że nie wiele już poradzę (przetestuje różne drogi rozwiązania danych problemów, rozbije niektóre procedury na części pierwsze itd. kończę).


    A czy wiesz, że zastępując funkcją select case każde if-then oszczędzasz 2B? Czyli, np. zastępując 4 if'y jednym select case zaoszczędzisz 6B. Każda powtarzająca się funkcja skokiem do niej( o ile się w miarę często powtarza), kosztem przejrzystości kodu rzecz jasna również daje sporo oszczędności. Poza tym, dobrze pisać programy na płytce prototypowej przed wyborem uP końcowego i po napisaniu kodu dobrać odpowiedni.

    Wojtek001 napisał:
    Później znalazłem na elektrodzie algorytm zamiany liczby binarnej na BCD i opracowałem go w BASCOMIE.


    W bascomie masz gotową funkcję i nazywa się makebcd() i w drugą stronę makedec().

    Wojtek001 napisał:
    Ostatecznie odkryłem że najmniejszą objętość można uzyskać stosując dzielenie na liczbach całkowitych i funkcja MOD (reszta z dzielenia).


    Również korzystam z tego sposobu.

  • #9 21 Sie 2012 23:44
    Wojtek001
    Poziom 15  

    Flaman11 napisał:

    W bascomie masz gotową funkcję i nazywa się makebcd() i w drugą stronę makedec().
    .

    A czy przeczytałeś mój post wcześniej w całości :D ? - bo pierwotnie właśnie korzystałem z "makebcd" (i napisałem to w poście wcześniej),ale zazwyczaj pisząc dane procedury samemu oszczędzamy miejsce (w stosunku do tego co oferuje gotowa funkcja bascomowa). Jeszcze mniej miejsca można uzyskać stosując polecenia MOD i "\10".

    Mówisz że Select case zajmuje mniej niż kilka If'ów - powiem szczerze że sprawdzałem to i nie zauważyłem zmiany, ale spróbuje się dokładniej temu przyjrzeć.

    Dodano po 8 [minuty]:

    Flaman11 napisał:
    Każda powtarzająca się funkcja skokiem do niej( o ile się w miarę często powtarza)

    Nawet jeśli się tylko 2 razy powtarza to najczęściej się opłaca (oczywiście musi mieć przynajmniej kilka linijek kodu bo inaczej więcej zajmą procedury odkładania danych na stos i wczytywanie ich ze stosu niż oszczędność wynikająca ze stosowania podprogramu).
    Tworzenie podprogramów to podstawa - aż boje się pomyśleć ile zajął by kod bez nich.

  • #10 01 Wrz 2012 07:36
    IMEX
    Poziom 20  

    Dopisze swoje 3 grosze

    Jeśli chodzi o filmik i przykładowe 5 sekund czasu na naciśnięcie - cała reszta wszystko OK
    Ale co załącza ten czas i od kiedy jest on liczony - wydawało by sie ze jest potrzebny przycisk dodatkowy Start/OK (jak te wielkie) i giną punkty i zaczyna sie odliczanie "wyświetlanie" od przysłowiowych 5 z filmu do 0 i wtedy sygnał "przy sygnale w jego trakcie czyści cyfry i wyświetla punkty" po kolejnym nacisnieciu przycisku startuje od nowa kto pierwszy .....

    Sorka jeśli zagmatwałem ale tylko to mi nie pasowało w tym projekcie reszta SUPER

    pozdrawiam

  • #11 01 Wrz 2012 15:05
    Wojtek001
    Poziom 15  

    Według mnie dobrze jest tak jak jest teraz.
    Po upłynięciu czasu (w filmie przykładowo 5s) urządzenie informuje że czas upłynoł poprzez chwilowe uruchomienie buzzera.

    Dzięki temu prowadzący nie musi posiadać stopera ponieważ mniej więcej słyszy czy uczestnik zdążył odpowiedzieć.

    Nie wiem jak to miało by wyglądać z tym dodatkowym przyciskiem Start/OK - to by wymagało dodatkowej uwagi ze strony prowadzącego żeby to uruchamiał. Zresztą nie było już ani wolnych pinów ani zbyt wiele miejsca w programie.

  • #13 23 Wrz 2012 19:27
    Wojtek001
    Poziom 15  

    Proszę bardzo źródło programu: Fusebity należy ustawić na wewnętrzny oscylator 8Mhz. Do pinów b.0 - b.3 podłączamy przyciski uczestników odciągając je do masy. Na port.d podłączamy do wyświetlacza LED. B.4 i B.5 do przycisków do ustawiania (też odciągamy do masy). B.6 do głośnika. B.7 do tranzystora kluczującego i bramki NOT. PortA. do diod LED (podłączamy w pary do multipleksu)

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    I jeszcze w załączniku dorzucam 2 pliki PDF jako wzory ścieżek.

  • #14 29 Wrz 2012 20:37
    matisek2
    Poziom 9  

    Ja mam jeszcze 2 pytanka:
    1.Te PDF'y są w lustrzanym odbiciu czy normalnie??
    2.Mógłbyś dać jeszcze rozmieszczenie elementów na tych PDFach?? Bo się pogubiłem w tym opisie słownym :P

  • #15 29 Wrz 2012 23:58
    Wojtek001
    Poziom 15  

    1. PDF nie są w odbiciu lustrzanym (i w żadnym wypadku nie należy odwracać ich na odbicie lustrzane - no chyba że robisz płytkę jakimś dziwnym sposobem zamiast termo transferem).
    Płytki są jednostronne tak więc posiadają jedynie dolną warstwę. Wówczas nie stosujemy odbicia lustrzanego.

    2. Sam już za bardzo nie pamiętam jak to było przylutowane. Niestety nie zrobiłem żadnego zdjęcia. Mogę postarać się sobie coś przypomnieć ale już nie dziś.
    Proponuje najpierw złożyć układ na płytce prototypowej (według moich opisów słownych) a później spróbować ustalić co gdzie powinno być na płytki wlutowane.
    Co gorsza musisz podłączyć odpowiednio te płytki ze sobą aby prawidłowo zasilać segmenty więc i tak musisz wykonać prototyp i sam zrozumieć działanie układu. Dodatkowy problem to to że możesz mieć inny układ pinów zasilających konkretne segmenty cyfr LED, tak więc mój opis(schemat) może nie zgadzać się z twoim i będziesz musiał po swojemu połączyć obie płytki PCB.