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

Wolna zmiana rejestru w ATmega328p przy obsłudze klawiatury matrycowej 2R x 4K

Greebqmaster 06 Gru 2014 20:24 789 5
REKLAMA
  • #1 14197858
    Greebqmaster
    Poziom 12  
    Na wstępie dodam, że po prostu nie miałem pojęcia jak nazwać temat. Nie jest on też problemem samym w sobie, a jedynie pytaniem, czy ktoś się z tym spotkał, jak nazywa się takie zjawisko i kiedy należy na nie zwracać uwagę. Czym dokładnie?

    Aktualnie próbuję swoich sił w obsłudze klawiatury matrycowej 2R x 4K na ATMedze 328p. Połączenia:
    - PC1:0 to rzędy, ustawione na wyjścia
    - PC5:2 to kolumny, ustawione na wejścia z podpięciem do Vcc
    - PD7:0 to katody 7-segmentowego wyświetlacza ze wspólną anodą

    Kod obsługi klawiatury:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Otóż, z powyższym kodem (nie oceniajcie go, czy nadaje się do obsługi klawiatury, czy nie - dopiero wchodzę w zagadnienie i końcowo na pewno będzie to wyglądało inaczej) kiedy nacisnę przycisk odpowiedzialny za wyświetlenie pierwszego segmentu, wyświetla mi się segment piąty. Jeśli nacisnę przycisk odpowiedzialny za segment piąty, wyświetli mi się segment pierwszy. Jest tak tylko z tymi przyciskami. Po dłuższej rozkminie doszedłem do wniosku, że może pomiędzy przypisaniem do portu C nowej wartości, a pierwszym ifem jest hmm.. Za mało czasu? Dałem więc delaya na 5ms i nie do wiary, zadziałało.

    Czy ktoś jest w stanie wyjaśnić mi o co tu chodzi? Dlaczego tak się dzieje? Zapis do rejestru zajmuje więcej czasu niż wykonanie następnej linijki kodu? Czy, bądź co bądź, procedury w uC nie wykonywane są jedna po drugiej? No po prostu, że tak powiem, jestem zbity z tropu :D
  • REKLAMA
  • #2 14197894
    BlueDraco
    Specjalista - Mikrokontrolery
    Jest za mało czasu. Wystarczy dodać opóźnienie na kilka us (np. kilka NOP), nie trzeba aż 5 ms.
  • REKLAMA
  • #3 14198072
    Greebqmaster
    Poziom 12  
    5ms było pierwszą rzeczą, która przyszła mi do głowy, nic więcej. Masz jakieś źródła, z których mógłbym dowiedzieć się więcej na temat tego, dlaczego występuje takie zjawisko?
  • REKLAMA
  • Pomocny post
    #4 14198103
    matusz_88
    Poziom 10  
    DS 13.2.4 Reading the Pin Value
  • REKLAMA
  • Pomocny post
    #5 14199427
    linuxtorpeda
    Poziom 26  
    Krótko mówiąc, rejestr PINx jest aktualizowany pośrednio przez zatrzask (ang. latch), co wprowadza opóźnienie pomiędzy 1/2 a 1+1/2 taktu procesora.
  • #6 14201278
    Greebqmaster
    Poziom 12  
    Dzięki za Wasze odpowiedzi. Rozwiązały mój problem, zamykam temat.

    PS mateusz_88, w najnowszej dokumentacji 14.2.4 :D
REKLAMA