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

Przycisk szyfrowy - Attiny13

SylwekK 28 Lut 2011 14:56 15463 18
  • Przycisk szyfrowy - Attiny13
    Było już na elektrodzie prezentowanych wiele zamków szyfrowych – z pełną klawiaturą, dwoma przyciskami i jednym też. Mój projekt z serii pchełka zrealizowałem na Attiny13 i jednym przycisku. Potrzebne mi było rozwiązanie nieco inne – coś co nie będzie chronić sejfu w banku ale coś prostego i malutkiego co zabezpieczy układ przed np. zabawą dzieci (dorosłych też) we włączanie/wyłączanie jakiegoś urządzenia. Może też spełniać rolę włącznika gdzie wymagana jest trzeźwość umysłu lub po prostu immobilizer dla auta czy motoru. Pomyślałem, że może się komuś przyda taki gadżet więc umieszczam tu kompletny opis. Zdjęcie przedstawia jeszcze prototyp na płycie stykowej. Układ docelowy jest na kostce w wersji SMD. Myślę, że moderator przymknie oko, na brak gotowego układu - w końcu wartość intelektualna (program) to też coś co sam zrobiłem ;)

    Schemat jest bardzo prosty:
    Przycisk szyfrowy - Attiny13

    Program napisałem w BASCOM i po kompilacji zajmuje dokładnie 1024 bajty :) Plik .bin do zaprogramowania w załączniku. Fusy na nowym procku bez zmian (zegar na 1,2MHz). Źródła w BASCOM tym razem nie udostępnię...

    Działanie szyfrowego przycisku przypomina nieco alfabet Morse'a gdzie kodem jest krótkie i długie przyciskanie w odpowiednim czasie. Do dyspozycji mamy w sumie tylko ...256 kombinacji. Może to i nie dużo ale jak wspomniałem banku toto chronić nie będzie, a dodatkowym utrudnieniem jest właśnie czas wprowadzania kodu. Uwierzcie naprawdę należy się z tym oswoić ale jak już chwilkę poćwiczymy to problemu nie ma.

    Po włączeniu zasilania w ciągu 1,5s układ robi wewnętrzne porządki i jest gotowy do pracy. Posiada dwa tryby i wszelkie flagi konfiguracyjne są nieaktywne.

    Tryb OFF - przekaźnik wyłączony i oczekiwanie na kod. W zasadzie to jedyna funkcja w tym trybie...
    Przycisk włącza urządzenie (przechodzi w tryb ON) po wprowadzeniu 8-o bitowego kodu (podobnie jak w transmisji szeregowej).
    Czasy dla przycisku:
    - "0" krótki impuls 25ms - 150ms
    - "1" długi impuls 150ms - 1s
    - maksymalny czas przerwy między impulsami przy wprowadzaniu kodu 1,5s. - po tym czasie kod należy wprowadzać od nowa
    Przez cały czas trzymania przycisku aktywna jest czerwona dioda (dla wygody i pewności, że przycisk jest wciśnięty).

    Tryb ON - przekaźnik załączony. Wyłączenie (przejście do OFF) następuje po krótkim wciśnięciu przycisku (na długi nie zareaguje).
    W trybie tym możliwa jest też wszelka konfiguracja przycisku:

    - [A] przytrzymanie przycisku przez 2s do 3,5s - jednorazowe żądanie kodu warunkiem aby przejść do trybu OFF (czyli wyłączyć przekaźnik). Miga wtedy cały czas dioda zielona co 0,5s (moment wejścia w tą funkcję niewidoczny). Teraz jeśli nie wprowadzimy kodu to nie wyłączymy urządzenia.

    - [B] przytrzymanie przycisku przez 4s do 5,5s - wyłączenie żądania kodu. Przycisk wtedy działa jak zwykły ...przycisk (bez kodu). Włączenie bądź wyłączenie przekaźnika odbywa się prze krótkie (na długie brak reakcji) wciśnięcie przycisku. Tryb jest aktywny do momentu ponownego przytrzymania przycisku w trybie ON przez 4s do 5,5s lub do momentu wyłączenia zasilania (moment wejścia w tą funkcję niewidoczny).

    - [C}przytrzymanie przycisku przez 6s - wejście do zmiany kodu. Po tym czasie zaczyna szybko migać zielona dioda co 75ms i miga tak do momentu wyjścia z opcji zmiany kodu.
    Procedura zmiany kodu wygląda następująco:
    Wprowadzamy nowy kod z zachowaniem czasów dla przycisku, o których pisałem wcześniej. Po wprowadzeniu ostatniego ósmego stanu, wciskamy znowu przycisk i trzymamy przez 6s aż przestanie migać dioda. Czas przerwy od wprowadzenia kodu do przycisku zatwierdzającego nie może być dłuższy niż 1,5s - po tym czasie następuje automatyczne wyjście z trybu zmiany kodu bez jego zmiany. Wyjść z tego trybu można też przez przytrzymanie przez 6s przycisku po wprowadzeniu niepełnego kodu (program bada czy było 8 znaków).
    Wprowadzony kod jest zapamiętywany w pamięci EEPROM więc po wyłączeniu urządzenia i jego ponownym włączeniu będzie aktualny.

    Dodatkowe warunki:
    jeśli aktywna jest opcja [A] wtedy niemożliwe jest wejście w opcje [B] i [C] oraz dezaktywowana jest opcja [B] jeśli była aktywna,
    przy aktywności [C] nie możliwe jest wejście w opcje [A] i [B] oraz dezaktywowana jest opcja [B] jeśli była aktywna,

    A co się stanie jeśli zapomnieliśmy kodu? Odłączamy zasilanie, przytrzymując przycisk ponownie włączamy i mamy chwilowy kod "00000000" - w pamięci EEPROM jednak cały czas siedzi ten zapomniany więc dobrze jest wejść w tryb ON i go zmienić...

    Myślę, że jak na Attiny13 i BASCOM to sporo udało mi się upchać. Jeśli Wam się podoba to... klik FAJNE ;)
    Załączniki:

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
  • Relpol
  • #2
    ^Rachel
    Poziom 21  
    A zmierz napięcie na kolektorze tranzystora względem masy.

    "Układ docelowy jest na kostce w wersji SMD" - to co za problem zrobić zdjęcie tego układu ?
  • #3
    SylwekK
    Poziom 29  
    Po co mam mierzyć to napięcie? Zasilam w ten sposób przekaźniki nawet przez rezystory bazowe 10k i jeszcze nigdy nie miałem z tym problemu - układy bezawaryjnie działają wiele lat.
    Jest problem ze zdjęciem gotowca, bo został już zamontowany u znajomego i jakoś wtedy nie przyszło mi do głowy, żeby robić fotki :)
  • #4
    ^Rachel
    Poziom 21  
    Aż pewnego pięknego dnia, tranzystor w Twoim przycisku szyfrowym, nie przełączy przekaźnika i będzie wtedy szukanie, dlaczego ten układ nie działa.

    A wiesz może jak działa klucz tranzystorowy ? i wiesz, że tranzystor wtedy wchodzi w stan nasycenia ? a u Ciebie mi się wydaje, że on nie wejdzie w nasycenie..
  • Relpol
  • #5
    zdebel
    Poziom 14  
    Faktycznie, 5V chcesz przełączać 12V, by trzeba sprawdzić jakie wzmocnienie ma ten tranzystor żeby móc stwierdzić czy prąd 5V/4.7K [A] wystarczy aby nasycić tranzystor.
  • #6
    ^Rachel
    Poziom 21  
    Ale z tego co ja tu widzę, to pewnie ten układ nigdy nie był zmontowany, a już nie mówiąc, że nigdy nie widział przekaźnika ;)
  • #7
    SylwekK
    Poziom 29  
    @^Rachel, a czy Ty przypadkiem nie jesteś tylko czystym teoretykiem?? :) Ja wiem jak działa tranzystor ale... daleko szukać - z projektów na elektrodzie np. to bez problemu intensywnie działa od wakacji albo to też działa od zeszłego roku bez najmniejszych problemów i napięcie zasilające przekaźniki to nie 12 tylko 24V to raz, bo prockami zająłem się w tamtym roku, a dwa to pracują w ten sposób u mnie jeszcze układy na zwykłych TTL-ach, które mają 20lat(!)
    Zupełnie nie rozumiem dlaczego podważasz sprawdzone rozwiązanie, które od wielu lat z powodzeniem nie tylko ja stosuję, bo przeglądając nawet elektrodę można co chwilę na podobne sterowanie trafić...
    Nigdy, ale to nigdy nie zdarzyło mi się w ten sposób spalić tranzystor lub ten tranzystor nie miał siły uciągnąć przekaźnika. Zawsze zaskakuje szybko i pewnie. Nic się nie grzeje. Przeważnie stosuję tanie BC547 (dawniej BC237, BC107), a jeśli Pu nieco większy to BC211, BD135, itp. Nakupiłem kiedyś tego od groma to upycham gdzie się da...
    Pozdrawiam.
  • #8
    Sławek-K
    Poziom 15  
    Panowie ( i panie) elektrycy. Taki przekaźnik może brać poniżej 20mA (im wyższe napięcie tym prąd cewki będzie mniejszy) co przy wzmocnieniu prądowym ok 200 daje ok 0,1mA prądu bazy. Przy wyjściu z procka ok 5V i spadku na złączu baza-emiter ok 0,7V rezystor bazowy może mieć wartość 4,3V/0,1mA czyli 43k om. Każda mniejsza wartość gwarantuje pełne nasycenie w tym zakresach prądu. Więc 4,3k to już dawno pełne nasycenie! 20 LAT TAK ROBIĘ I WSZYSTKO DZIAŁA ! A co do napięć przełączających (tutaj 12V) co ma piernik do wiatraka ? Mżna sobie przełączać 200V (robiłem takie rzeczy) i o ile UCE0 jest większe od napięcia zasilania a wzmocnienie wystarczająco duże to wszystko gra ! No i z innej beczki - Może by dało radę jednak zamieścić program żródłowy, (w celach choćby edukacyjnych)?
  • #9
    SylwekK
    Poziom 29  
    A niech tam, może ktoś coś ciekawszego wymyśli... W samym programie jest tyle If-ów, że można dostać oczopląsu :) Dlaczego tak, a nie inaczej ? - spróbujcie ten sam program napisać czytelniej z zachowaniem większej estetyki i skompilujcie... ;)
    Oprócz założeń, o których pisałem w pierwszym poście nie ma tam nic nadzwyczajnego. Sercem programu jest mój algorytm badania czasu trwania przycisku krótki/długi (pisałem już o tym na elektrodzie), a wszystko jest upchane na maksa i zoptymalizowane, żeby jak najmniej miejsca zajmowało - z tym było najgorzej - walczyłem o każdy bajt ;)
    Główny program (czyli czekanie na kod i jego zmiana) na początku zajmował około 500 bajtów to szkoda mi było nie wykorzystać reszty, dodałem tryb, żądania kodu wyłączenia - nadal sporo miejsca. Dopiero jak zacząłem upychać opcję przycisku bez kodu zaczęły się schody - ciągle 10-12 bajtów brakowało.
    Można by to pewnie trochę inaczej wszystko rozpisać tylko trzeba by już wcześniej znać założenia, a nie dopisywać po kawałku - to rada dla początkujących - zawsze starajcie się sprecyzować wszystko od A do Z jak ma działać w programie. Późniejsza jego modyfikacja często komplikuje sam program i bywa, że lepiej go wtedy napisać od nowa...

    Aha, starsze wersje Bascoma mogą nie skompilować tego programu tak aby go wcisnąć w tiny13 (a takie było moje główne założenie - tylko ten i żaden inny).
    Mam pełną wersję Bascoma prosto od MSC w wersji 2.0.4.0 i ten ku mojej uciesze w odróżnieniu od wersji demo 1.11.9.8 (którą miałem wcześniej) tworzy średnio co najmniej 10% mniejsze pliki wynikowe (!) - to jeden z powodów dlaczego nie chciałem dawać źródła.
    Pozdrawiam
  • #10
    Nerwus
    Poziom 18  
    A słyszałeś o maszynie stanu? Bardzo ładnie nadaje się właśnie do małych procesorów.
    Daje Ci gwarancje ze kod na switch/case jest 10x mniejszy niż na if/else . I jest 1000x czytelniejszy.
    Jak ustawisz 0 pkt prowizji to Ci chętnie zademonstruje.
  • #11
    SylwekK
    Poziom 29  
    Wedle życzenia, punkty wyłączone. Lubię pooglądać fachowców przy pracy. Zawsze czegoś się można nauczyć :)

    Dodam jeszcze, że gdybym ten program pisał od nowa znając wszystkie jego zależności to zamiast pojedynczych zmiennych bitowych wykorzystał bym cały bajt i w nim ustawiane były by bity. Dzięki temu prawdopodobnie if-ów było by zdecydowanie mniej, a co za tym idzie i objętość samego programu dużo mniejsza.
  • #12
    musashimm
    Poziom 10  
    SylwekK napisał:
    Mam pełną wersję Bascoma prosto od MSC w wersji 2.0.4.0 i ten ku mojej uciesze w odróżnieniu od wersji demo 1.11.9.8 (którą miałem wcześniej) tworzy średnio co najmniej 10% mniejsze pliki wynikowe (!) - to jeden z powodów dlaczego nie chciałem dawać źródła.


    Czy możesz wyjaśnić ten powód? Z Bascomem nie mam za dużo do czynienia, więc mogło mi coś umknąć.
  • #13
    SylwekK
    Poziom 29  
    Nie wiem co tu wyjaśniać. Wnioskuję, że Mark Alberts zoptymalizował kompilator... Już otrzymałem PW z elki, że na którejś z wcześniejszych wersji moje źródło zajmuje o prawie 200 bajtów (!) za dużo przez co nie wchodzi do attiny13, więc chyba lepiej dać dla ogółu skompilowany i w pełni działający program...
  • #14
    szczupx
    Poziom 19  
    SylwekK napisał:
    Program napisałem w BASCOM
    (...)
    walczyłem o każdy bajt ;)

    Wyczuwam pewną niekonsekwencję ;)
    O rozmiar kodu oczywiście najlepiej walczyć w assemblerze. Kompilatory C też wygenerują mniejszy kod wynikowy niż dość wredny z punktu widzenia optymalizacji Basic.
  • #15
    SylwekK
    Poziom 29  
    Dawno temu programowałem w assemblerze (czasy commodore 64) i w zasadzie mało było rzeczy, których bym wtedy nie zaprogramował (przeważnie pisałem użytki ale zrobiłem też kilka gier). Pewne nawyki mi zostały i przynajmniej w części chcę je przełożyć do Bascom'a. Na C nie przechodzę, bo bliżej mi właśnie do asm i to w nim planuje robić wstawki w Bascomie. Znaczki w C mnie przerażają ;) - kod w nim nigdy nie był dla mnie czytelny...
  • #16
    leoha
    Poziom 16  
    SylwekK napisał:
    Na C nie przechodzę, bo bliżej mi właśnie do asm i to w nim planuje robić wstawki w Bascomie. Znaczki w C mnie przerażają ;) - kod w nim nigdy nie był dla mnie czytelny...


    Tak jakby w asmie byl...
  • #17
    SylwekK
    Poziom 29  
    @leoha - może po prostu nigdy nie miałeś do czynienia z asm. Jeśli assembler na atmela będzie mi niezbędny to zapeniam Cię, że przejdę na niego w ciągu tygodnia. Mam naprawdę solidne podstawy z programowania jeszcze 6502. Poza tym na studiach w ciągu dwóch zajęć po otrzymaniu od wykładowcy listy rozkazów 8051 (mój pierwszy kontakt z tego typu prockami), napisałem wersję programu na kilkanaście linijek, która u innych zajmowała po 3-4 strony zeszytu w kratkę(!) - mina wykładowcy - bezcenna :D
    Mam zasadę - zdobywam wiedzę w zależności od aktualnego zapotrzebowania :)
    Pozdrawiam
  • #18
    leoha
    Poziom 16  
    SylwekK napisał:
    ...

    Zle mnie zrozumiales. Chodzi mi o to ze asm w stosunku do C, jest bardzo nieczytelny no i oczywiscie dla kazdej architektury/procka moze wygladac inaczej.
    Jestem programista systemow embedded i z asmem roznych prockow i architektow spotykam sie na codzien (wiec chybiles z zalozeniem).
    Zdecydowanie polecam przerzucic sie na C a w asmie pisac tylko to co jest niezbedne lub jakies optymalizacje ewentualnie.
    Jak to mawia moj kolega: C to taki wysokopoziomowy assembler wraz z jego wadami, tyle ze skladnia jest niezalezna od architektury procka.

    --
    Pozdrawiam,
    Mateusz
  • #19
    SylwekK
    Poziom 29  
    Już parę osób mnie namawiało na C... No cóż może się kiedyś wreszcie przełamię :)
    Pozdrawiam

    EDIT:
    Kolego @Nerwus, będzie coś z tego zoptymalizowanego kodu ? Czekamy na demonstracje maszyny stanu... ;)