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

Zamek szyfrowy ATMega [C]

ArekBe 21 Kwi 2014 21:33 1626 8
  • Poziom 8  
    Witam!

    Mam problem z zamkiem szyfrowym. Mam taki kod:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Jest to zamek szyfrowy, dobry, ale niestety, dla mnie, bazujący na klawiaturze matrycowej 3x4. Ja chciałbym mieć takie coś, lecz zamiast klawiatury matrycowej chcę 3 przyciski. I jedyny problem tkwi w tym, że nie potrafię tego przerobić na zwykłe 3 przyciski, że np: 1 przycisk to jest 1, dugi to 2 i trzeci to 3, hasło to np: 1,2,3,2,3,1 i po wpisaniu tej kombinacji zamek się otwiera. Ktoś pomoże? Czy to da się tak łatwo przerobić? Kombinuję już trzeci dzień i nic..

    Z góry dziękuję i pozdrawiam,
    Prime!
  • Poziom 39  
    ArekBe napisał:
    Kombinuję już trzeci dzień i nic.
    Może zacznij od rozpisania sobie algorytmu na kartce papieru. Nie dałeś żadnego SWOJEGO kodu, nawet nie wiesz co nie działa (bo nie ma co nie działać, bo nic nie ma).
    Pokaż swój kod. Zacznij od http://mikrokontrolery.blogspot.com/2011/03/drzaskowy-pamietnik-wstep.html oraz http://mikrokontrolery.blogspot.com/2011/03/epp-drgania-stykow.html
    Nikt za ciebie roboty nie wykona, może najwyżej pomóc.
  • Poziom 8  
    Nie oczekuję gotowca, lecz podpowiedzi. Pisałem już dziesiątki wersji, ostatnia aktualna jest ta:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • Poziom 39  
    Zastanów się - co ten program naprawdę robi.
    W pętli sprawdza, czy dany pin portu C jest "0" i ustawia w pass[] odpowiednie wartości.
    Nie czeka ani na wciśnięcie klawisza, ani na zwolnienie (nie na darmo podałem ci link o drganiu styków, ale ty nawet nie wykrywasz faktu wciśnięcia/zwolnienia klawisza).
    Twój program wykrywa, czy na tych trzech pinach jest stan "0" - i tyle.
    Jeśli tak - to ustawia pass[0]=3 i pass[1]=2 (pewnie zapomniałeś o ustawieniu pass[2]).
    Ponieważ nie określiłeś jaka jest wartość pass[2] - więc wynik działania programu jest nieznany (domyślnie pewnie jest tam 0).
    Poza tym program reaguje na jednoczesne wciśnięcie tych przycisków (a nie sekwencyjne ich wciskanie).
    Może choć trochę podpowiedziałem, jak coś nie wiesz - pytaj.

    Odnośnie stylu pisania - czemu piszesz tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    a nie (np.) tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 8  
    Tak, bardzo mi Pan pomógł, dziękuję! Faktycznie, dużo błędów, na razie mój kod wygląda tak:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Chodzi mi także o to, aby kolejność wpisywania cyfr była rozróżniana, że np: pierwsze 1, potem 3 a potem 2, nie inaczej.
  • Poziom 39  
    Nie jestem pan - tylko Michał :)
    Może zrób tak:
    - dodaj zmienną "pozycja" -> pozycja aktualnego wciśniętego poprawnego klawisza kodu (to wykryjemy za chwilę).
    - wywołujesz funkcję "czekaj na klawisz".
    - po każdym wykryciu puszczenia klawisza wpisujesz jego "wartość" do pass[pozycja] - jeśli "wartość" bieżącej pozycji wprowadzonego hasła różni się od tej właściwej - zerujesz "pozycja" - co oznacza "wprowadzamy hasło od początku".
    - jeśli pozycja jest końcowa - co oznacza "zadeklarowaną długość hasła" - następuje otwarcie zamka i wyzerowanie pozycja (żeby wskazywała na pass[0] - i czekała na kolejne hasło).
    - dekodowanie klawisza zrób sobie w odrębnej funkcji - aby nie zaciemniać sobie tej pętli głównej.

    W dekodowaniu tym możesz użyć sposobu eliminacji drgań styków, oraz oczekiwania na zwolnienie klawisza.
    Robisz to tak:
    - wykrywasz czy jakiś pin z tych trzech ma stan "0". Jeśli tak, to sprawdzasz po pewnym czasie (zależnym od drgania styków), czy ten stan jest dalej 0. Jeśli tak to czekasz, aż stan będzie "1" (puszczenie klawisza).
    Niezależnie od długości naciśnięcia - tylko raz zarejestrujesz wciśnięcie.
    Jeśli stan jest "1" - wychodzisz z funkcji z gotową wartością (wiesz z niej - który klawisz wcisnąłeś)... i używasz tej wartości w pętli głównej.

    To rozwiązanie ma poważną wadę (blokuje Atmegę na czas wykrywania klawisza) - ale działa. Jak zrobisz taki program, poprawimy go, aby wykrywał klawisze bez przerywania pętli głównej.
  • Poziom 8  
    Witam, Arek, miło mi. :)

    Nie wiem, czy dobrze zrozumiałem wszystko, ale na razie mam takie coś:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Na jednym przycisku działa, na dwóch nie zawsze.
  • Poziom 39  
    Będę się czepiał, mogę?
    Nie wykrywasz drgań styków.
    Pętla wykonywana jest błyskawicznie (to tylko 10ms opóźnienia między iteracjami).
    Nigdzie nie masz zerowania "pozycja".

    Ja bym to napisał tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pisałem z głowy - nie wiem czy działa poprawnie.
  • Poziom 8  
    Wszystko pięknie śmiga, dziękuję bardzo!