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.

MegaSuperDebounce - Biblioteka zaawansowanej obsługi przycisków AVR, ARM PIC ...

spy89 23 Lis 2014 00:56 13641 59
  • #1 23 Lis 2014 00:56
    spy89
    Poziom 12  

    Moderowany przez dondu:

    Temat wyznaczony do dyskusji o bibliotece "MegaSuperDebounce".

    Można dopisywać swoje uwagi i pytania dot. eliminacji drgań styków i obsługi przycisków, kontaktronów i innych elementów stykowych obsługiwanych za pomocą tej biblioteki.



    Link do biblioteki: http://mikrokontrolery.blogspot.com/2011/04/jezyk-c-biblioteka-obsluga-klawiatury.html

    Mam problemy z zaimplementowaniem powyższej biblioteki do ATmega8.
    Napisałem już całość jak mi się wydaję, ale jakoś nie chce to działać:
    Program kompiluje bez błędów, wgrywam też bez błędów, ale samo naciśnięcie przycisku nic nie robi.
    Na początek program ma działać tak:
    Naciśnięcie monostabilnego PC0 ma powodować odwócenie stanu całego portu B.

    Program główny:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Plik keyb.c
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Plik keyb.h
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 29
  • #2 23 Lis 2014 01:33
    michalko12
    Specjalista - Mikrokontrolery

    Nie widzę nic co mogłoby powodować niedziałanie tego kodu.

    Są tylko niewielkie niuanse, które nie mają większego wpływu

    Brak sufiksu UL i symbol powinien być zadeklarowany w opcjach projektu, a nie bezpośrednio w kodzie.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Źle zadeklarowany KEY_DOWN (miał być PC1, a jest PC2)
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #3 23 Lis 2014 12:46
    spy89
    Poziom 12  

    Teraz widzę, że doszło mi ostrzeżenie (nie pytajcie mnie się jak, po prostu pojawiło się bez żadnych zmian):

    Kod: text
    Zaloguj się, aby zobaczyć kod

    0
  • #4 23 Lis 2014 13:02
    excray
    Poziom 39  

    Nie masz jej zadeklarowanej w keyb.h stąd ten problem.

    0
  • #5 23 Lis 2014 13:30
    spy89
    Poziom 12  

    No ok, dopisałem do keyb.h:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ostrzeżenia niema, ale program nadal nie działa. Jakieś pomysły jeszcze?

    0
  • #6 23 Lis 2014 19:52
    michalko12
    Specjalista - Mikrokontrolery

    A jakieś zwykłe miganie diodą działa?

    0
  • #7 24 Lis 2014 14:19
    spy89
    Poziom 12  

    Działa, chociaż z podejrzaną częstotliwością. Ale chyba te 10ms co jakie powinno być wyzwalane KeyProc() nie jest jakieś sztywne

    0
  • #8 24 Lis 2014 14:37
    michalko12
    Specjalista - Mikrokontrolery

    spy89 napisał:
    Działa

    Napisz co było przyczyną niedziałania.

    spy89 napisał:
    chociaż z podejrzaną częstotliwością

    Co to znaczy podejrzana częstotliwość?

    spy89 napisał:
    Ale chyba te 10ms co jakie powinno być wyzwalane KeyProc() nie jest jakieś sztywne

    Jeśli jest tak jak w kodzie zamieszczonym we wcześniejszym poscie to jest to sztywne i ma prawie 10ms. Autorepetycje następują z różnymi czasami zgodnie z tym co jest umieszczone w tablicy DefaultAutoRepeatTab.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Możesz podstawić swoją własną tablicę autorepetycji z innymi czasami, przykład:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    i gdzieś w kodzie wywołać funkcję ustawiającą nowe czasy autorepetycji
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 24 Lis 2014 15:46
    spy89
    Poziom 12  

    Miałem na myśli działanie diody LED. Jak wywołam miganie w przerwaniu (po prostym wydłużeniu jakąś zmienną) to miganie działa, więc to coś innego.
    Dodam, że sam odczyt klawiszy też działa - sprawdzane na zwykłym odczycie bez uwzględnienia drgań styków.

    0
  • Pomocny post
    #10 24 Lis 2014 18:56
    michalko12
    Specjalista - Mikrokontrolery

    spy89 napisał:
    Dodam, że sam odczyt klawiszy też działa - sprawdzane na zwykłym odczycie bez uwzględnienia drgań styków.

    Może i działa, ale chyba już wiem w czym jest problem. Problem jest w tej linii kodu:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    a konkretnie z klawiszami KEY2 i KEY3. Te dwa bity na porcie C mogą mieć stan niski bo nie ustawiłeś podciągania
    Kod: c
    Zaloguj się, aby zobaczyć kod

    W tym momencie powinieneś odpowiednio podciągnąć wszystkie porty klawiszy, albo zmienić procedurę pobierania stanu klawiatury ograniczona tylko do klawiszy KEY0 i KEY1.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    albo
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #11 25 Lis 2014 16:19
    spy89
    Poziom 12  

    Ok, działa wszystko. Dzięki! Niechaj ten temat służy pokoleniom :)

    0
  • #12 25 Lis 2014 22:12
    dondu
    Moderator Mikrokontrolery Projektowanie

    spy89 napisał:
    Ok, działa wszystko. Dzięki! Niechaj ten temat służy pokoleniom :)

    Dołączę więc link do artykułu, a do Ciebie prośba, byś tematu nie zamykał - niech zostanie otwarty, dla innych pytających.

    0
  • #13 16 Gru 2014 14:16
    1376867
    Użytkownik usunął konto  
  • #14 18 Gru 2014 11:04
    szelus
    Specjalista - Mikrokontrolery

    Skąd wiesz, że problem jest w obsłudze klawiszy? Z kodu, który pokazałeś, nic na to nie wskazuje. Albo inaczej. Z kodu, który pokazałeś nic nie wynika. Skąd możemy wiedzieć, o jakie keyb.h chodzi?

    Jaka jest początkowa (inicjalna) wartość "b"?

    0
  • #15 18 Gru 2014 11:11
    1376867
    Użytkownik usunął konto  
  • #16 18 Gru 2014 11:37
    szelus
    Specjalista - Mikrokontrolery

    Nie odpowiedziałeś na pytanie:

    szelus napisał:
    Jaka jest początkowa (inicjalna) wartość "b"?

    0
  • #17 18 Gru 2014 11:58
    1376867
    Użytkownik usunął konto  
  • #18 18 Gru 2014 14:36
    szelus
    Specjalista - Mikrokontrolery

    Nie napisałeś też jakiego typu jest b, ale jakiego by nie było, jeżeli b == 0 to ~b nigdy nie będzie równe 1. "~" to operator negacji bitowej.

    0
  • #19 18 Gru 2014 16:23
    1376867
    Użytkownik usunął konto  
  • #20 18 Gru 2014 17:35
    michalko12
    Specjalista - Mikrokontrolery

    A co to jest typ bool?

    0
  • #21 18 Gru 2014 17:44
    szelus
    Specjalista - Mikrokontrolery

    :arrow: Ujemny
    To nie ma znaczenia. W C nie ma typu bool, a nawet w C++ bool jest naprawdę typu int, gdzie wartość 0 oznacza false, a nie-zero oznacza true.
    Jeżeli to byłoby C++, to porównanie "b == true" nawet by zadziałało, ale w C to już zależy, jak zostanie zdefiniowane "true", bo jest to normalne porównanie arytmetyczne.
    Ale jeżeli piszesz "(bool)b == 1" to nawet w C++ wymuszasz konwersję zmiennej b do typu int, wiec jak b ma jakąkolwiek inną wartość niż 1, to nie zadziała.
    Poza tym, operatorem negacji logicznej jest "!", a "~" jest arytmetycznym operatorem negacji bitowej. Tylko znowu, jeżeli piszesz "b = !0", to nie wiadomo, jaką wartość arytmetyczną uzyska b, z wyjątkiem tego, że różną od zera.

    0
  • #22 18 Gru 2014 17:55
    1376867
    Użytkownik usunął konto  
  • #23 18 Gru 2014 18:30
    michalko12
    Specjalista - Mikrokontrolery

    Przestań używać typu bool i jemu podobnych w C, a uchronisz się od problemów z nimi związanych. Pod wskazanym linkiem w pierwszym poście masz przykładowy projekt jak można używać tej biblioteki. Przykład z pętli głównej:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #24 18 Gru 2014 20:06
    szelus
    Specjalista - Mikrokontrolery

    Natomiast jak potrzebujesz negowaną flagę, to możesz pisać w ten sposób:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Albo wykorzystywać tylko jeden, konkretny bit.
    Tylko to wszystko nie ma nic wspólnego z tą biblioteką. :)

    0
  • #25 28 Gru 2014 15:50
    1376867
    Użytkownik usunął konto  
  • #26 28 Gru 2014 15:59
    dondu
    Moderator Mikrokontrolery Projektowanie

    Nie. Jak to policzyłeś?

    Dodatkowo uwaga dot. zerowania TCNT2 w funkcji przerwania. Nie musisz tego robić, ponieważ ustawiłeś podstawowy tryb pracy timera i przerwań od przepełnienia. W związku z tym TCNT2 gdy się zeruje (przepełnia) wywołuje przerwanie.

    Jeszcze jedno pytanie: TOIE0 - funkcję obsługi tego przerwania rozumiem, że także masz?

    0
  • #27 28 Gru 2014 16:16
    1376867
    Użytkownik usunął konto  
  • #29 28 Gru 2014 16:35
    1376867
    Użytkownik usunął konto