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 10 lip 2025, o 01:19


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 
    Autor Wiadomość
    PostNapisane: 7 paź 2017, o 10:41 
    Offline
    Użytkownik

    Dołączył(a): 25 wrz 2014
    Posty: 137
    Lokalizacja: Konin/Poznań
    Pomógł: 0

    Szanowni Państwo,

    piszę w dwóch sprawach, o których chciałbym dowiedzieć się nieco więcej i rozwiać wątpliwości.
    Pierwsza z nich to debouncing przycisku w przerwaniu INT0/INT1 w ATmedze 328p. Napisałem sobie w programie taki oto kod wykorzystując debouncing wskazany przez p. Mirka:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Na moje oko działa on poprawnie w zaprojektowanym przeze mnie układzie ale chciałem się dowiedzieć czy to jest optymalne rozwiązanie do eliminacji drgań styków w microswitch'u przy użyciu przerwań.

    Druga sprawa to odbiór danych z UART przy użyciu funkcji p. Mirka z bluebooka. Mianowicie funkcji uart_getc(), - nazwa przerobiona ze względu na układ bluetooth BLE, który wykorzystuję:
    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.


    Za cholerę nie chce mi to działać przy wykorzystaniu tej funkcji np. w takim zapisie:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Jeśli ktoś zwróci uwagę na jakieś szczególne przypadki działania tej funkcji to byłbym wdzięczny. Na razie bez cudów - po prostu odbieranie jednego znaku nie działa. Procek ten sam ATmega328p. Dodam jeszcze, że funkcja:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Działa BEZ ZARZUTU - znaki odbiera. Tylko wolałbym wykorzystać bufor cykliczny i przerwania, a nie robić odbiór danych w pętli main.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 paź 2017, o 10:54 
    Offline
    Moderator
    Avatar użytkownika

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

    Vroobee napisał(a):
    Pierwsza z nich to debouncing przycisku w przerwaniu INT0/INT1 w ATmedze 328p


    Vroobee napisał(a):
    ale chciałem się dowiedzieć czy to jest optymalne rozwiązanie do eliminacji drgań styków

    Przepraszam uprzejmie, nie chodzi mi o to żeby dogryzać czy jakieś przytyki robić - no ale to jest pomysł zupełnie i to totalnie z kosmosu. W ogóle po co ten IF w przerwaniu ;) toż ty rozbroiłeś tę moją procedurę z bloga ... i jakieś resztki jej ciała wrzuciłeś do przerwania. Ten IF w przerwaniu nigdy nie zadziała - po co on tam w ogóle ? ;) Nie masz żadnego debouncingu - ot reaguje ci przerwanie przy pierwszym zboczu i to tyle - a jak przyjdą inne przerwania w wyniku drgań to też się wykona ich cała seria ;) ...

    sam przeanalizuj przez chwilę ten kod który pokazałeś to się zdziwisz ;) i solidnie uśmiejesz gwarantuję

    ustawiasz key_lock na 1, po to żeby za chwilę sprawdzać czy jest różny od zera i niby gdy klawisz wciśnięty to go zwiększasz o jeden i po co ? skoro za chwilę poleci kolejne przerwanie a ty znowu key_lock na 1 ustawiasz ;) toż te linie kompletnie nie mają sensu w tym przerwaniu, jak byś zostawił tylko te dwie

    menu_state = 1;
    timer = 0;

    to działać ci będzie tak samo ...

    CAŁA zaleta tej mojej procedury z bloga polega na tym, że działa bez użycia przerwań i działa bardzo dobrze ...

    Vroobee napisał(a):
    Za cholerę nie chce mi to działać przy wykorzystaniu tej funkcji np. w takim zapisie:

    Bo nie rozumiesz jak działa ta funkcja ... ona nie jest blokująca i gdy nic nie nadleci to zwróci ZERO ...

    ty może jeszcze nie do końca rozumiesz jak działają bufory cykliczne ... funkcja getc pozwala pobierać pojedyncze znaki z tego bufora ale jeśli coś do niego dotarło ...

    tyle razy pisałem i pokazuję w poradnikach wideo - że pełny i śliczny odbiór ale UWAGA! stringów czyli komunikację ASCII i to na zdarzeniach pokazałem dopiero w Greenbooku - którego polecam

    zaś w Bluebooku pokazałem jak za pomocą funkcji getc pobierać sobie pojedyncze znaki - ale pewnie nie zajrzałeś do tego przykładu w książce (na pendrive/albo na CD)

    _________________
    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: 2 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 8 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