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.

CMSIS stm32f103 obsługi drgań styków w przerwaniu

pioter996 17 Maj 2018 09:15 1005 49
  • #31 17 Maj 2018 09:15
    3149400
    Użytkownik usunął konto  
  • #32 17 Maj 2018 09:29
    BlueDraco
    Specjalista - Mikrokontrolery

    Było wcześniej - są dwa przypadki - przycisk niezakłócany (tylko drgający) i zakłócany, Pierwszy - 2 linie kodu, drugi - 6..7 (z eleganckim switch trochę więcej, ale czytelniej).

  • #33 17 Maj 2018 09:36
    3149400
    Użytkownik usunął konto  
  • #34 17 Maj 2018 10:49
    3171327
    Użytkownik usunął konto  
  • #35 17 Maj 2018 12:43
    pioter996
    Poziom 3  

    Dzięki za wszelkie sugestie i dużą dawkę doświadczenia. W przerwaniu sprawdzam 2 ostatnie stany jeśli są takie same zakładam że przycisk został wciśnięty , wszystko funkcjonuje jak powinno. W przyszłości planuje wykorzystać rozwiązanie zaproponowane przez Pana BlueDraco z analizą 3 ostatnich stanów.
    Jeszcze raz dzięki wielkie za pomoc.

  • #36 17 Maj 2018 13:09
    3149400
    Użytkownik usunął konto  
  • #37 17 Maj 2018 18:06
    krisRaba
    Poziom 25  

    pioter996 napisał:
    Jakieś małe opóźnienie i kolejny raz sprawdzenie stanu

    No przecież po to
    pioter996 napisał:
    Ustawilem przerwanie co 30ms.

    To jest właśnie opóźnienie, którego potrzebujesz :) W kolejnych wywołaniach tego przerwania sprawdzasz sobie stan poprzedni i porównujesz z bieżącym. Jeśli są takie same, to uwzględniasz zmianę.

    Dodano po 8 [minuty]:

    Ewentualnie spróbuj podejścia z filtrami wejść timerów - bardzo przydatny "ficzer". Jeśli oczywiście ten przycisk masz podpięty do pinu "tajmerowego"
    Poszukaj w RM czegoś takiego jak IC1F / IC2F / IC3F itp. Zależnie od tego do którego TIMx_CHy masz podłączony przycisk.
    W te pola wpisujesz sobie "moc" filtracji, tj. przez ile taktów zegara sygnał musi być zgodny, by został uznany za zmianę stanu. Potem od input capture możesz sobie generować przerwanie itp.
    Dodatkowo możesz, jeśli chcesz mierzyć okres między dwoma zboczami opadającymi, przy wystąpieniu pierwszego resetować timer (Slave mode: Reset mode, czy jakoś tak), przy wystąpieniu drugiego masz zliczoną liczbę taktów zegara w CCR1 i licznik ponownie się resetuje...
    Coś mi się kojarzy, że nie wszystkie wejścia timera mogą służyć jako trigger w Reset mode, więc jak wybierzesz coś innego niż TIMx_CH1, to możliwe że będzie trzeba robić jakieś obejścia XORem itp. Więc żeby nie utrudniać sobie życia najlepiej wybrać CH1, który na bank zadziała z tym trybem.

    Nie wiem czy jasno to napisałem, w razie czego mogę doprecyzować, jeśli czegoś nie rozumiesz.

  • #38 17 Maj 2018 19:18
    BlueDraco
    Specjalista - Mikrokontrolery

    pioter996 napisał:
    Dzięki za wszelkie sugestie i dużą dawkę doświadczenia. W przerwaniu sprawdzam 2 ostatnie stany jeśli są takie same zakładam że przycisk został wciśnięty , wszystko funkcjonuje jak powinno. W przyszłości planuje wykorzystać rozwiązanie zaproponowane przez Pana BlueDraco z analizą 3 ostatnich stanów.
    Jeszcze raz dzięki wielkie za pomoc.


    Chyba jednak nie rozumiesz. żeby stwierdzić, że przycisk jest wciśnięty, nie potrzebujesz żadnych przerwań ani odliczania czasu. Przerwanie timer służy do wykrycia, że nastąpiło naciśnięcie - był zwolniony, a jest wciśnięty. Stwierdzasz to wtedy, kiedy w poprzednim przerwaniu był zwolniony, a teraz jest wciśnięty. Sprawdzenie, czy poprzednio był wciśnięty i teraz jest wciśnięty ma taki sam sens, jak pojedyncze sprawdzenie, czy teraz jest wciśnięty.

  • #39 17 Maj 2018 19:39
    krisRaba
    Poziom 25  

    BlueDraco napisał:
    Stwierdzasz to wtedy, kiedy w poprzednim przerwaniu był zwolniony, a teraz jest wciśnięty.

    No właśnie nie do końca ;-) Masz cały czas 1, sprawdzasz, że za pierwszym razem jest 1, po 30ms masz 0... i nie wiesz czy to zakłócenia, czy zmiana stanu. Dopiero gdy po kolejnych 30ms stwierdzisz ponownie 0 przyjmujesz, że stan się faktycznie zmienił.

    Dodano po 2 [minuty]:

    Tak naprawdę masz gdzieś zapisane info, że np. dotąd była 1, a po dwukrotnym wykryciu 0 stwierdzasz, że możesz przepisać nowy stan do swojej odfiltrowanej zmiennej.

  • #40 17 Maj 2018 19:40
    BlueDraco
    Specjalista - Mikrokontrolery

    Jeśli wrócisz do postu #5 i przejrzysz cały wątek ,to zobaczysz, że mowa głównie o wersji bez zakłóceń elektrycznych )tylko drgania styków) - wtedy wystarczy znać 2 stany. Przy zakłóceniach - 3.

  • #42 17 Maj 2018 21:51
    BlueDraco
    Specjalista - Mikrokontrolery

    Zawsze czytamy IDR - w każdej wersji kodu. Czy ktoś pisał o filtracji w tym rozwiązaniu? Tu tylko ignorujemy drgania. "Filtracja", a raczej eliminacja zakłóceń elektrycznych jest przy trzech próbkach.

  • #44 17 Maj 2018 23:07
    BlueDraco
    Specjalista - Mikrokontrolery

    Nic o żadnej pętli nie było. W 95% małych urządzeń (przyciski na płytce uC lub tuż obok) nie ma zakłóceń i nie może ich być.

  • #45 17 Maj 2018 23:15
    3149400
    Użytkownik usunął konto  
  • #46 17 Maj 2018 23:56
    BlueDraco
    Specjalista - Mikrokontrolery

    Wewnątrz obudowy?

  • #47 18 Maj 2018 07:15
    krisRaba
    Poziom 25  

    BlueDraco napisał:
    W 95% małych urządzeń (przyciski na płytce uC lub tuż obok) nie ma zakłóceń i nie może ich być.

    Generalnie nie mam dostępu do takich statystyk, więc wierzę na słowo, że aż 95% urządzeń się łapie do wspomnianej przez Ciebie grupy ;-)
    Moje doświadczenie jest inne, ale projektuję urządzenia na granicy przemysłu lub innych zastosowań profesjonalnych.. czyli w grupie pozostałych 5%, gdzie zwieszenie czy fałszywe zadziałanie, to nie tylko facepalm ;-)
    Jeżeli różnica między lepiej a dobrze, to pojedyncze linijki kodu, to dla mnie nie ma uzasadnienia, by robić to słabiej. Ale jeśli ktoś uważa inaczej, to nie mam z tym problemu i droga wolna :-)

  • #48 18 Maj 2018 07:41
    3149400
    Użytkownik usunął konto  
  • #49 18 Maj 2018 08:44
    BlueDraco
    Specjalista - Mikrokontrolery

    Zgoda, tylko czy w którymś z opisywanych przypadków miałeś do czynienia z całym urządzeniem w jednej, niewielkiej obudowie i przyciskami na płytce uC?
    Ja używam obu technik obsługi przycisków, o których pisałem wyżej. W większości urządzeń pierwszej. W tych, gdzie przyciski są na dłuższych niż 15 cm przewodach lub środowisko jest zakłócone (silniki, przekaźniki) - tej drugiej. Gdybym w urządzeniu zaobserwował jakiekolwiek efekty związane z ESD, zmieniłbym algorytm na drugi, z eliminacją zakłóceń - to tylko dodatkowych 6 linijek w switch() plus 6 żeby był switch() zamiast if(). if() zajmuje 2 linijki i załatwia 95% przypadków. Tu nie chodzi o oszczędność pamięci uC czy klawiatury, tylko oczu programisty przy czytaniu kodu.

  • #50 18 Maj 2018 09:26
    3149400
    Użytkownik usunął konto