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? 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 9 lip 2025, o 19:26


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
    Autor Wiadomość
    PostNapisane: 2 wrz 2018, o 17:18 
    Offline
    Użytkownik

    Dołączył(a): 22 sie 2018
    Posty: 27
    Pomógł: 0

    Hej, projektuję sobie dla zabawy i nauki taki sterownik do slidera na lustrzankę do timelapsów. Staram się właśnie stworzyć takie małe menu za pomocą którego można przejść np. do ustawienia czasu otwarcia migawki lub czasu bufora bezpieczeństwa. Zrobiłem sobie identyczny timer jak w bluebooku w rodziale o wyświetlaczu 7seg. Mój problem polega na tym że guziki nie zawsze reagują na wciskanie. Dołączam film na youtube oraz kod.

    [youtube] https://youtu.be/njwCyHHJ9ok[/youtube]

    main.c
    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.


    helper_functions.c
    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.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 wrz 2018, o 18:03 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    Nie wiem, jaką masz częstotliwość taktowania mikrokontrolera, ale podejrzewam, że nawet przy 1MHz naciśnięcie przycisku trwa wielokrotnie dłużej, niż odstęp pomiędzy przerwaniami timera. Kiedy trzymasz przycisk, procedura obsługi przerwania zostanie wywołana kilkakrotnie i za każdym razem stan zmiennej bufer_set zostanie zmieniony na przeciwny. To, w jakim stanie będzie ta zmienna po puszczeniu przycisku jest sprawą czysto losową.
    Myślę, że powinieneś dodać zmienną (logiczną), która zostanie ustawiona po wciśnięciu przycisku i zapobiegnie ponownej zmianie zmiennej bufer_set do momentu puszczenia i ponownego wciśnięcia przycisku.

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


    Dodam jednak jeszcze, że koncepcja obsługi klawiatury, w której w procedurze obsługi przerwania używasz funkcji, która blokuje mikrokontroler na 80ms (wywołanie funkcji _delay_ms(80); ) to niestety nie najlepszy pomysł.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 wrz 2018, o 20:57 
    Offline
    Użytkownik

    Dołączył(a): 22 sie 2018
    Posty: 27
    Pomógł: 0

    A jak proponował byś to zrobić?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 wrz 2018, o 17:08 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    Nie mam teraz czasu, żeby pisać przykładowy kod lub dokładnie opisywać algorytm. Mogę podpowiedzieć Ci jedynie z grubsza, jak uniknąć czekania w procedurze obsługi przerwania.
    Skoro używasz timera do cyklicznego sprawdzania stanu klawisza i ustaliłeś sobie stałą czasową debouncingu na 80ms, to spróbuj to zrobić tak (nie stosując oczywiście żadnych _delay_ms() w przerwaniu):
    • skonfiguruj timer tak, aby generował przerwanie co 80ms,
    • zdefiniuj sobie wewnątrz procedury obsługi przerwania zmienną statyczną, w której będziesz zapamiętywał poprzedni stan klawisza,
    • odczytaj aktualny stan klawisza i porównaj go z poprzednim,
    • jeśli poprzedni stan będzie "wciśnięty" i aktualny stan będzie "wciśnięty", to oznacza, że możesz uznać klawisz za wciśnięty,
    • na końcu procedury zapamiętaj aktualny stan klawisza jako "poprzedni", aby przy następnym wywołaniu porównać go z następnym, itd.
    Potraktuj procedurę obsługi przerwania jako funkcję która się wykonuje "w kółko", tylko robi sobie przerwy. Wtedy łatwiej będzie Ci zbudować właściwy algorytm.

    W ten sposób efekt jest ten sam, czyli sprawdzasz klawisz dwa razy w odstępie 80ms, ale nie musisz czekać w przerwaniu na ponowne sprawdzenie. Przerwanie zostanie po prostu wywołane dwukrotnie w odstępie 80ms, sprawdzi tylko stan klawisza i się zakończy, a czas pomiędzy przerwaniami może być wykorzystany przez mikrokontroler na inne czynności.
    80ms przy taktowaniu 16MHz to 1 280 000 taktów, więc mikrokontroler może w tym czasie zrobić naprawdę bardzo dużo pożytecznych rzeczy ;)

    Podejrzewam, że podobną technikę pokazał kolega Mirek w jakiejś książce, lub w którymś poradniku, ale to może ktoś inny podpowie (bo ja tego nie wiem), miałbyś się na czym wzorować, jeśli nie masz pomysłu, jak to zrobić.



    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ł: Bing [Bot] i 12 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:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO