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



Teraz jest 3 sty 2025, o 11:29


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 ]
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: 27324
Lokalizacja: Szczecin
Pomógł: 1041

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 4 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