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



Teraz jest 12 maja 2024, o 15:30


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