logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Zamek szyfrowy ATMega16 - problem z kodem w C, nie działa klawiatura

21 Kwi 2014 21:33 2241 8
REKLAMA
  • #1 13531129
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #2 13531145
    mickpr
    Poziom 39  
    Posty: 4630
    Pomógł: 579
    Ocena: 295
    Cytat:
    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.
  • #3 13531159
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #4 13531182
    mickpr
    Poziom 39  
    Posty: 4630
    Pomógł: 579
    Ocena: 295
    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 / C++
    Zaloguj się, aby zobaczyć kod

    a nie (np.) tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 13531225
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #6 13531301
    mickpr
    Poziom 39  
    Posty: 4630
    Pomógł: 579
    Ocena: 295
    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.
  • REKLAMA
  • #7 13531382
    Konto nie istnieje
    Poziom 1  
  • #8 13531531
    mickpr
    Poziom 39  
    Posty: 4630
    Pomógł: 579
    Ocena: 295
    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 / C++
    Zaloguj się, aby zobaczyć kod


    Pisałem z głowy - nie wiem czy działa poprawnie.
  • #9 13532153
    Konto nie istnieje
    Poziom 1  

Podsumowanie tematu

✨ Użytkownik zgłosił problem z zamkiem szyfrowym opartym na mikrokontrolerze ATMega16, w którym nie działa klawiatura. W odpowiedzi na pytania, użytkownik przedstawił fragmenty kodu w języku C, które nieprawidłowo obsługują wciśnięcia przycisków. Uczestnicy dyskusji zasugerowali poprawki, takie jak dodanie detekcji drgań styków, sekwencyjne wprowadzanie kodu oraz poprawne zarządzanie zmiennymi. Ostatecznie, po wprowadzeniu poprawek, użytkownik potwierdził, że program działa poprawnie.
REKLAMA