Elektroda.pl
Elektroda.pl
X
Computer ControlsComputer Controls
Proszę, dodaj wyjątek dla 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 28 Gru 2014 16:58 15093 66
  • #31
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • Computer ControlsComputer Controls
  • #32
    dondu
    Moderator Mikrokontrolery Projektowanie
    Tylko Ty wiesz, co siedzi w KeybProc() i jak masz podłączony przycisk :)
  • #33
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #34
    dondu
    Moderator Mikrokontrolery Projektowanie
    Połączyłem Twój temat ze zbiorczym tematem o tej bibliotece, którą wykorzystujesz.
    Jej autor (michalko12) udziela tutaj pomocy z jej implementacją.
  • #35
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #36
    michalko12
    Specjalista - Mikrokontrolery
    Ujemny napisał:
    Jeżeli wywoływałem w kodzie KeyProc() co 10ms to było ok

    A teraz skąd wywołujesz i co ile czasu?

    Tą funkcję masz dostosować do swojego projektu i ma ona być wywoływana co 10ms np. z jakiegoś przerwania.
  • Computer ControlsComputer Controls
  • #37
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #38
    michalko12
    Specjalista - Mikrokontrolery
    Zaraz bo ja już w końcu nie wiem co jest nie tak

    Napisz jaki masz problem z tą biblioteką, jaki procesor i wklej kod z inicjalizacją licznika TIMER2.
  • #39
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #40
    michalko12
    Specjalista - Mikrokontrolery
    Dondu już napisał Ci w czym jest problem, ale źle go zrozumiałeś

    dondu napisał:
    1MHz / 1024(preskaler) / 256(bo 8 bitowy timer) = 3,814697265625 przerwania na sekundę.
    Okres wynosi więc 262,14ms.


    Te twoje dodatkowe 25 jest niczym innym jak tylko pogorszeniem całe sytuacji bo KeybProc() wywołujesz co 262,14ms*25.


    Wyłącz całkowicie preskaler i zamień 25 na 39;
  • #41
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #42
    spy89
    Poziom 12  
    Witam ponownie :)
    W moim projekcie nastąpiły duże zmiany i klawisze mam podpięte pod 2 porty: PORTC i PORTB. Jak w tym wypadku musi wyglądać funkcja GetKeybSample?
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • #43
    michalko12
    Specjalista - Mikrokontrolery
    spy89 napisał:
    Witam ponownie :)
    W moim projekcie nastąpiły duże zmiany i klawisze mam podpięte pod 2 porty: PORTC i PORTB. Jak w tym wypadku musi wyglądać funkcja GetKeybSample?
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Nie podałeś o jakie konkretne porty chodzi więc masz przykład na wszystkie 16 i sobie dopasuj.

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Kod: c
    Zaloguj się, aby zobaczyć kod
  • #44
    spy89
    Poziom 12  
    Coś mi nie gra. Klawisze nie reagują teraz. Dokładnie to chodzi mi o 6 klawiszy (4 z portu C i 2 z portu B):
    Kod: c
    Zaloguj się, aby zobaczyć kod



    Kod: c
    Zaloguj się, aby zobaczyć kod


    Czy aby niepotrzebnie deklarujesz KEY0-KEY15? To samo mogą robić PB_KEY i PC_KEY
  • #45
    michalko12
    Specjalista - Mikrokontrolery
    spy89 napisał:
    Czy aby niepotrzebnie deklarujesz KEY0-KEY15? To samo mogą robić PB_KEY i PC_KEY



    Nie, nie to samo. Podstawą pomocy jest dostarczenie dokładnych informacji o problemie!

    KEYx używane są w programie w odniesieniu do zmiennej posiadającej już złożoną postać stanu klawiatury, tak samo ANYKEY. PB_KEYx wykorzystywane są tylko podczas składania stanu klawiatury do jednej zmiennej z dwóch portów w funkcji GetKeybSample().

    W tym przypadku numery portów nie pokrywają się więc można wszystko uprościć.

    Kod: c
    Zaloguj się, aby zobaczyć kod




    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Computer ControlsComputer Controls
  • #46
    adbi68
    Poziom 10  
    Na początek (to mój pierwszy post) pozdrawiam wszystkich forumowiczów. Oby takich jak wy, bezinteresownie pomagających innym było jeszcze więcej. Ale do rzeczy...
    Wszystko zgodnie z opisem na mikrokontrolerach. Przerwania wykonują się co 10ms, o czym świadczy dioda LED2 zmieniająca stan co sekundę, ale na przycisk nie reaguje dioda LED1. Pliki keyb.h i keyb.c z pliku keyb.zip, przerobione zgodnie ze wskazówkami. Sprzętowo wszystko OK, bo sprawdzałem przyciski i diody innymi programami.
    Macie jakieś pomysły?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod
  • #48
    adbi68
    Poziom 10  
    michalko12 napisał:

    Czytałem już wcześniej. Volatile nie zastosowałem z premedytacją, chociaż pewnie masz rację, że lepiej żebym - jako początkujący - "dmuchał na zimne".

    Cytat:
    I nie includuje się plików z rorszerzeniem "c"!

    W ogóle, oczywiście masz rację. W szczególe (AtmelStudio 6.2) - nie. Nie includowanie keyb.c wyrzuca:

    Warning 1 implicit declaration of function 'KeybProc' [-Wimplicit-function-declaration]
    Error 2 undefined reference to `GetKeys'
    Error 3 undefined reference to `KeybProc'
    Error 4 ld returned 1 exit status collect2.exe

    #include "keyb.c" sprawę rozwiązuje.
    Problem był już poruszany na mikrokontrolerach, bodajże na kursie C, Dondu miał się przyjrzeć sprawie, ale - jak wnioskuję z braku ostatecznej odpowiedzi - nie zrobił tego. Co ciekawe, mogę (powinienem?) wręcz zrobić odwrotnie - załączyć tylko keyb.c, jako że na początku tegoż mam: #include "keyb.h"


    Wracając do tematu:
    Przyjrzałem się keyb.h i odkryłem, że chociaż definiuje się tam piny przycisków, to tylko dla "ścisłych" potrzeb biblioteki, a nie jako wejścia.
    Dodanie w głównej pętli:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    rozwiązuje problem:) Szkoda tylko, że opis nic o tym nie mówi. Pewnie nawet mało zaawansowani nie dadzą się na to nabrać, ale - jak widać na załączonym obrazku - początkujący, jak najbardziej.
    [Oczywiście ostatnia linia jest niezbędna, tylko jeśli nie stosujemy zewnętrznego rezystora podciągającego].

    Na koniec - żeby nie wyjść na malkontenta - gratuluję niesamowitej roboty. Biblioteka jest chyba najbardziej kompleksowym rozwiązaniem przycisków w C na AVR. Oszczędza programiście wiele czasu, a niekiedy nawet - przycisków.
  • #49
    michalko12
    Specjalista - Mikrokontrolery
    adbi68 napisał:
    Szkoda tylko, że opis nic o tym nie mówi.

    Opis o tym nic nie mówi, ponieważ klawiatura może być zrealizowana na wiele sposobów, np.:
    - poszczególne przyciski podłączone bezpośrednio do osobnych pinów,
    - klawiatura matrycowa
    - klawiatura analogowa
    - klawiatura na magistralach I2C, SPI
    - wirtualna zdalna klawiatura UART, CAN, ETHERNET itp

    Ponadto biblioteka nie jest ograniczona do jednego rodzaju procesora , może być zaimplementowana na dowolnym systemie mikroprocesorowym, co uniemożliwia opisanie wszystkich przypadków. Z tego powodu procedura dostarczenia fizycznego stanu klawiatury została opisana tylko w minimalnym stopniu. Do rozwiania wszelkich wątpliwości został założony ten wątek.

    adbi68 napisał:
    Biblioteka jest chyba najbardziej kompleksowym rozwiązaniem przycisków w C na AVR. Oszczędza programiście wiele czasu, a niekiedy nawet - przycisków.


    Biblioteka jest w wersji minimalistycznej, można ją rozszerzyć i zrealizować obsługę klawiatury w oparciu o system callback'ów, ale wtedy nie byłaby opcją dla początkujących.
  • #50
    adbi68
    Poziom 10  
    W bibliotece jest procedura na sprawdzenie długiego naciśnięcia przycisku. Chciałbym jednocześnie sprawdzić, krótkie naciśnięcie tego przycisku, ale tak, aby nie następowało przed każdym długim, czyli:
    - WCISKAM -> ZWALNIAM: czas krótszy niż długie wciśnięcie -> krótkie wciśnięcie
    - WCISKAM -> ZWALNIAM: czas dłuższy (równy) niż długie wciśnięcie -> długie wciśnięcie
    Jak widać, przy krótkim wciśnięciu reakcja musi nastąpić dopiero po zwolnieniu przycisku (analogicznie jak przy długim), a nie jak typowo, przy wciśnięciu.

    Jak to zrobić z poziomu biblioteki?
  • #51
    michalko12
    Specjalista - Mikrokontrolery
    Nie jest to dokładnie to co opisałeś, ale powinno spełnić Twoje oczekiwania

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • #52
    adbi68
    Poziom 10  
    Druga dioda reaguje prawidłowo, choć nie tak jak myślałem: nie czeka na puszczenie klawisza, ale przełącza natychmiast po czasie wciskania 3sek. Ale tak też może być.
    Coś jest nie tak z drugim warunkiem - brak reakcji. Rozumiem chyba teorie - drugi warunek ma spełnić zwolnienie przycisku.
    Wstawiam LED1_TOG po pierwszym warunku i działa "po staremu", oczywiście reaguje też na początku długiego wciśnięcia, później powtarza itd.
  • #53
    michalko12
    Specjalista - Mikrokontrolery
    adbi68 napisał:
    Coś jest nie tak z drugim warunkiem - brak reakcji.

    Tu rzeczywiście jest problem. Trzeba byłoby przerobić trochę tą bibliotekę do obsługi tego przypadku, tak jak napisałem jest to minimalistyczna wersja tej biblioteki. Teraz tak na szybko możesz zamiast !IsKeyPressed( KEY0 ) sprawdzać bezpośrednio stan portu i powinno być OK.
  • #54
    adbi68
    Poziom 10  
    Spróbuję w ten sposób. Dziękuję za pomoc:)
    Jeśli nie pomyliłem się w definicji makr w keyb.h:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    coś takiego powinno działać:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    ... ale nie działa. Makro KEYx_DOWN przepisałem z "BlueBooka" M. Kardasia, więc jest pewne. Nie wiem tylko czy dla przeciwnego przypadku wystarczy pominąć negację?
    Co dziwne, jeśli zamiast if(KEY_UP) dam if(KEY_DOWN), działa tak samo, jak przy odkomentowaniu pierwszego LED1_TOG. Czyżby biblioteka jakoś "wymuszała" stan "przycisk wciśnięty" (niski) po wykonaniu GetKeys() ?
  • #55
    tomciu1
    Poziom 9  
    A ja mam pytanie skąd pobrać bibliotekę bo próba pobierania z mimkrokontrolery.blogspot.com kończy się inormacją o nieosiągalnej witrynie :/ .?
  • #56
    kamil12239
    Poziom 16  
    Skopiuj sobie ze strony. Ja też tak robiłem i wszystko śmiga.

    Dodano po 1 [minuty]:

    Szanowni Państwo zwracam się do was z uprzejmą prośbą ponieważ w moim kodzie wywala mi bład:
    MegaSuperDebounce - Biblioteka zaawansowanej obsługi przycisków AVR, ARM PIC ...

    Tutaj listingi moich kodów:

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


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


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


    Co może być przyczyną tego błędu?
    Jeśli zmienię w pliku keyb.h linijki od 14 do 18 z ( 1 << 0 ) na (1 << PB0) to powstają dodatkowe błedy krytyczne takie takie jak z PINB ze nie jest zadeklarowane.

    Pozdrawiam
  • #57
    michalko12
    Specjalista - Mikrokontrolery
    W pliku keyb.c wstaw #include <avr/io.h> przed #include "keyb.h"
  • #58
    kamil12239
    Poziom 16  
    Nie wiem jak mogłem tego nie zauważy. Taki prosty podstawowy błąd. Pomogło pozdrawiam
  • #59
    dominiv2605
    Poziom 1  
    Witam, mój problem z tą biblioteką polega na tym że zczytywanie kilku klawiszy z funkcji Get_Keys(), jeden po drugim, tj.

    if(Get_Keys(JAKIS_KLAWISZ1){Instrukcja}
    if(Get_Keys(JAKIS_KLAWISZ2){Instrukcja}
    if(Get_Keys(JAKIS_KLAWISZ3){Instrukcja}

    zczytuje tylko JAKIS_KLAWISZ1. Czy jest w ogóle możliwe zrealizowanie tej funkcjonalności przy wykorzystaniu tej biblioteki? Pozdrawiam
  • #60
    michalko12
    Specjalista - Mikrokontrolery
    dominiv2605 napisał:
    Get_Keys()

    Nie widzę takiej funkcji w tej bibliotece.
    dominiv2605 napisał:
    if(Get_Keys(JAKIS_KLAWISZ1){Instrukcja}
    if(Get_Keys(JAKIS_KLAWISZ2){Instrukcja}
    if(Get_Keys(JAKIS_KLAWISZ3){Instrukcja}

    Błędy w składni, brak znaczników syntax, za mało kodu, zbyt lakonicznie opisany problem.
    Z takim poziomem postu nie otrzymasz pomocy.