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



Teraz jest 15 lis 2024, o 23:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 26 sty 2021, o 22:53 
Offline
Użytkownik

Dołączył(a): 09 sty 2021
Posty: 66
Pomógł: 0

Witam, w jednym ze swoich projektów chciałbym aby po 3-sekundowym przytrzymaniu przycisku pewna liczba była szybko inkrementowana, a wynik był wyświetlany na LCD. Tutaj pojawia się moje pytanie o technikę wyrywania jak długo dany przycisk jest naciśnięty. No więc pierwszą, rzeczą, która przychodzi mi do głowy jest ustawienie przerwania od timera co sekundę i zapisywanie czasu w sekundach do jakiejś zmiennej. Potem po naciśnięciu przycisku tworzę "busy loop" (tak to się chyba nazywa), sprawdzam czy przycisk dalej jest naciśnięty i czy "czas teraz" - "czas wciśnięcia przycisku" jest większy albo równy 3. Jeżeli tak to wykonuję daną czynność. Drugi sposób, o którym myślałem to kiedy przycisk jest naciśnięty odpalam timer, który po odliczeniu 3 sekund wykonuje daną czynność. Wiem jak ustawić timer aby przerwanie występowało co 3s , ale czy da się ustawić timer w taki sposób aby zaczął odliczać czas i w momencie odmierzenia 3s wykonał daną czynność? Jakie są jeszcze techniki do wykrywania jak długo klawisz jest naciśnięty (także te bez użycia timera jeżeli taki są)? Jak macie jakiś przykładowy kod w C to nie pogardzę :D.

Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sty 2021, o 23:51 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2583
Pomógł: 128

Popatrz na superdebounce Mirka na jego blogu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2021, o 07:22 
Offline
Użytkownik

Dołączył(a): 29 gru 2013
Posty: 82
Pomógł: 3

antos, pokaż swój przykładowy kod, pokażemy Ci co jest nie tak, a pomysł przecież jakiś tam podałeś.
Jeśli busy loop polega na zawieszeniu działania programu w obsłudze przerwania na 3 sekundy to od razu Ci mówię, że to zła droga.
A co do częstości przerwań, nie musisz ich "wołać" co 3 sekundy, przecież wewnątrz przerwania możesz mieć jakąś zmienną static, której wartość będziesz inkrementować w przerwaniu i na jej podstawie będziesz ustalać czy minęły już 3 sekundy, czy nie. :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2021, o 09:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2019
Posty: 145
Pomógł: 37

O busy waits zapomnij. Oczywiście zastosowanie ma timer, ale konkretne implementacje mogą być różne. Poczynając od prymitywnego dekrementowania zmiennej w przerwaniu timera i pollingu w pętli głównej po zastosowanie przepakowanego ficzerami podsystemu w RTOSie lub też coś pomiędzy: https://www.sax.de/~joerg/avr-timer/ .

_________________
Think for yourself and question authority.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2021, o 10:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2019
Posty: 145
Pomógł: 37

Lib Wuenscha jest dosyć kłopotliwy ze względu na alokację dynamiczną więc może coś prostszego. A więc zwykłe dekrementowanie zmiennej w przerwaniu timera i test w pollingu. Dla zachowania jakiejś uniwersalności i nadania cywilizowanego sznytu operacje na zmiennych zostaną zamknięte w funkcjach. Żeby uniknąć narzutu na wywołaniach funkcji, szczególnie z procedur obsługi przerwania, funkcje będą typu inline. Kod (całość jest w pliku ngłówkowym i tak ma być):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Sposób użycia

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


Gdy odmierzane czasy zmieszczą się w zakresie zmiennej uint8_t (tak jak w podanym przypadku) można zmienną softTimer zrobić ośmiobitową oraz pozbyć się strażników ATOMIC_BLOCK co będzie korzystne wydajnościowo.

_________________
Think for yourself and question authority.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2021, o 11:08 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2583
Pomógł: 128

Btw - Mirek w YB poruszał kwestię timerów programowych



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2021, o 21:18 
Offline
Użytkownik

Dołączył(a): 09 sty 2021
Posty: 66
Pomógł: 0

micky napisał(a):
Popatrz na superdebounce Mirka na jego blogu.


Przed chwilą zerknąłem i mam pewien problem. Kod przepisałem z tą różnicą, że zmieniłem porty na, których podłączone mam diody.
Reakcja na wciśnięcie klawisza jest poprawna, ale druga dioda nie chce się zaświecić po przytrzymaniu klawisza. Gdzie mam tutaj błąd?

Składnia: [ Pobierz ] [ Ukryj ]
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: 29 sty 2021, o 23:44 
Offline
Użytkownik

Dołączył(a): 09 sty 2021
Posty: 66
Pomógł: 0

Próbowałem też z takim kodem wzorowany na kodzie z bloga Pana Mirka, ale nie działa.

Składnia: [ Pobierz ] [ Ukryj ]
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: 30 sty 2021, o 13:56 
Offline
Użytkownik

Dołączył(a): 09 sty 2021
Posty: 66
Pomógł: 0

Problem udało mi się rozwiązać kodem jak poniżej. Wzorowałem się na tym co przedstawił Pan Mirek na swoim blogu.

Składnia: [ Pobierz ] [ Ukryj ]
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: 30 sty 2021, o 14:55 
Offline
Moderator
Avatar użytkownika

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

tylko zastanów się - bo ta linijka oznaczona na czerwono jest kompletnie niepotrzebna w tym twoim kodzie. Co więcej po warunku ID jeśli nie ma nawiasów klamrowych to wykona ci się zawsze tylko pierwsze polecenie - nie WAŻNE że w jednej linii sobie wpiszesz kilka. Ale i tak warunek jest kompletnie niepotrzebny skoro nad nim i tak zerujesz flagę i i tak zerujesz Timer1




Cytuj:
else if(lkey && PINB & KEY1)
{
lkey++;
flag = 0;
Timer1 = 0;
if(!lkey) Timer1 = 0; flag = 0;
}

_________________
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: 30 sty 2021, o 14:58 
Offline
Użytkownik

Dołączył(a): 09 sty 2021
Posty: 66
Pomógł: 0

Witam, próbuję wykorzystać timer programowy do eliminacji drgań styków [zmienna Timer2]. Chciałbym aby sprawdzanie czy przycisk jest nacisnięty występowało co 60ms, dlatego do warunku dodałem jeszcze "!Timer2". Przerwanie sprzętowego timera0 (10ms), tam właśnie odejmuję od zmiennej liczbę 10 i kiedy wartość tej zmiennej równa jest zero to dzięki warunkowi, o którym wspomniałem wcześniej powinny zostać wyeliminowane drgania styków. Co prawda drgań styków raczej nie doświadczam natomiast, kiedy naciskam przycisk bardzo szybko to dioda led zmienia swój stan o wiele wolniej. Dziwi mnie to, bo przy poprzednim programie usuwałem drgania styków sprawdzając czy przycisk jest wciśnięty w przerwaniu (60ms) timera sprzętowego i wszystko działało poprawnie. Gdzie mam tutaj błąd? Mikrokontroler, którego używam to Atmega328PU. Dodam jeszcze, że czasami przy puszczaniu klawisza dioda zmienia swój stan, ale to chyba wynika bardziej z jego mechanicznej budowy niż jakiegoś błędu w programie.

Składnia: [ Pobierz ] [ Ukryj ]
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: 30 sty 2021, o 15:45 
Offline
Moderator
Avatar użytkownika

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

nie mnóż wątków skoro dalej o to samo pytasz - przecież w poprzednim ci odpowiedziałem - poza tym w przerwaniu robisz MASAKRĘ amerykańską piłą tarczową - odejmując wartość 10 ! ... nie możesz zajrzeć do Bluebooka żeby zobaczyć jak działa mechanizm timera programowego - tylko tak na czuja coś sobie zmieniasz na zasadzie, że może wyjdzie albo nie wyjdzie ?

_________________
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: 31 sty 2021, o 00:44 
Offline
Użytkownik

Dołączył(a): 09 sty 2021
Posty: 66
Pomógł: 0

Dziękuję za podpowiedź. Mam tylko jeszcze pytanie co do tematu drgań styków. Rozumiem, że są one eliminowane przez przepełnienie się zmiennej. Ale czy kiedy będę miał dłuższy program to będzie to działać? Czas w jakim pętla znowu wróci to miejsca, w którym zmienna jest inkrementowana będzie wtedy dłuższy?



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: 13 ] 

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