Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 2 maja 2025, o 18:21


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
    Autor Wiadomość
    PostNapisane: 29 mar 2015, o 23:09 
    Offline
    Nowy

    Dołączył(a): 28 mar 2015
    Posty: 2
    Pomógł: 0

    Witam,

    Prawdopodobnie znalazłem pewien drobny błąd. Oczywiście bawię się zaktualizowaną wersją ze strony - o poprawionym błędzie z pierwszego wydania wiem.

    Konkretnie chodzi o ten kawałek funkcji SuperDebounce:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Po wciśnięciu klawisza zmienia się stan na "debounce" i zaczynamy odliczać czas aby wyeliminować ewentualne drgania styków. Po tym czasie następuje spełnienie warunku z 7 linii. Lecz co się stanie gdy podczas tego odliczania odpuścimy klawisz? Stan zostanie nadal ten sam, czyli "debounce", warunek z 7 linii nie zostanie spełniony, ani żaden inny do końca tej funkcji. Warunek z linii 7 zostanie spełniony natychmiast po ponownym naciśnięciu klawisza, bez "debouncigu" tego kolejnego wciśnięcia.

    Efekt: podwójne kliknięcie, przy czym pierwsze o czasie trwania poniżej wynikającego z 4 linii powoduje jednokrotne wykonanie callbacku do push_proc() lub rep_proc() (w zależności od czasu drugiego kliknięcia). Pewnym rozwiązaniem może być zmniejszenie czasu oczekiwania na ustabilizowanie się styków, lecz po próbach na stole bezproblemowo udawało się wcisnąć i odpuścić microswitch w czasie poniżej 30ms, a w wersji hardcorowej przy kątowym atakowaniu słicza z dużą szybkością, nawet poniżej 10ms. O ile kojarzę niektórzy producenci podają czas drgania styków do 20ms. Więc drastyczne zmniejszenie wartości z linii 4 nie jest satysfakcjonującym mnie rozwiązaniem.

    W celu eliminacji tego zjawiska wstawiłem na szybko sprawdzanie po drodze jeszcze jednego warunku, linie 7, 8 i 9:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    W tym momencie do funkcji dodano 8 rozkazów maszynowych. Być może jest jakiś bardziej elegancki sposób aby wyeliminować to zjawisko?

    Pozdrawiam



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 mar 2015, o 23:27 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27378
    Lokalizacja: Szczecin
    Pomógł: 1043

    haloon napisał(a):
    Lecz co się stanie gdy podczas tego odliczania odpuścimy klawisz? Stan zostanie nadal ten sam, czyli "debounce", warunek z 7 linii nie zostanie spełniony, ani żaden inny do końca tej funkcji. Warunek z linii 7 zostanie spełniony natychmiast po ponownym naciśnięciu klawisza, bez "debouncigu" tego kolejnego wciśnięcia.

    Nie jest mi prosto po pięciu latach analizować kod ;) ale chyba masz rację ;) ... zaraz dopiszę coś jeszcze - chwilka

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 mar 2015, o 23:28 
    Offline
    Nowy

    Dołączył(a): 28 mar 2015
    Posty: 2
    Pomógł: 0

    Dziękuje :) dopiero zaczynam, i nie odpuszczam dopóki czegoś nie zrozumiem; zabawę z Bluebookiem przeprowadzam na ATtiny2313 więc jest dodatkowa, pozytywna zabawa z dopasowywaniem rejestrów.

    Odpowiadając: warunek z linii nr.2 nie zostanie spełniony ponieważ key_state zostało z wartością 1.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 mar 2015, o 23:39 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27378
    Lokalizacja: Szczecin
    Pomógł: 1043

    haloon napisał(a):
    Odpowiadając: warunek z linii nr.2 nie zostanie spełniony ponieważ key_state zostało z wartością 1.

    tak tak - dlatego skasowałem wcześniejszą wypowiedź zanim napisałeś swoją ... teraz jeszcze patrzę na to i za chwilę napiszę kilka słów

    ------------------------ [ Dodano po: 13 minutach ]

    Po pierwsze to ogromna radość, że TAK głęboko wszedłeś w tę funkcję ... to mnie bardzo cieszy.

    Po drugie - rzeczywiście w pewnych sytuacjach może dojść do tego co mówisz - chociaż ja tu założyłem właśnie możliwości REGULACJI tym doborem czasu na różnych etapach .... Nie mniej jednak biorąc pod uwagę aż takie coś:

    haloon napisał(a):
    a w wersji hardcorowej przy kątowym atakowaniu słicza z dużą szybkością, nawet poniżej 10ms.

    No to rzeczywiście .... jak się "postarać" to można.

    Ja bym może dodał nieco krótszy ten warunek .... bo nie musimy czekać aż Timer1 będzie równy 0, tylko od razu i ZAWSZE gdy klawisz zwolniony a stan jest = debounce to .... zrobiłbym to tak

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    ------------------------ [ Dodano po: 18 minutach ]

    Generalnie - to powiem tak - CELEM albo inaczej GŁÓWNE CELE jakie mi przyświecały pisząc tę funkcję to:

    1. Pokazać czytelnikowi jak działają timery programowe
    2. pokazać jak należałoby próbować podchodzić do obsługi klawisza (szczególnie chodzi o repetycję)
    3. pokazać jak korzystać w prosty sposób ze wskaźników na funkcje przekazywanych do innej funkcji - czyli pierwsze zetknięcie z TAK WAŻNYMI z mojego punktu widzenia CALLBACKAMI (czyli mechanizmem funkcji zwrotnych)
    4. pokazać jak pisać funkcje nieblokujące z nieco rozbudowaną tzw maszyną stanów
    5. Na pewno nie miała to być NAJLEPSZA FUNKCJA na świecie do obsługi klawiszy i nawet pomimo tej poprawki nadal wg mnie nie będzie pretendować do tego tytułu .... bo obsługuje wciskanie tylko pojedynczych klawiszy (dwóch naraz nie da się wykryć) ;) a też np by się przydało w wielu sytuacjach

    Jak dla mnie punkty od 1 do 4 kolega zaliczył na piątkę ! ... dlatego piszę, że to miło słyszeć - że się przydało to co napisałem ;)

    ------------------------ [ Dodano po: 22 minutach ]

    O! nawet jeszcze inaczej nieco bym to zrobił - tego IF'a zabezpieczającego umieściłbym na końcu łańcuszka - aby nie tracić cennego czasu funkcji nieblokującej!

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO