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



Teraz jest 28 lut 2026, o 18:06


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 1 maja 2015, o 14:50 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

Próbuję napisać własną funkcję filtrowania drgań styków, wzorując się delikatnie na przykładzie z niebieskiej książki. Jestem jednak zmuszony wprowadzić kilka zmian:

1) Konieczna jest możliwość sprawdzania kilku przycisków jednocześnie. Dla każdego mam przygotowane osobne zmienne, które podaję przez wskaźnik.
2) Funkcja ma zwracać wartość 1, gdy wykryje kompletną sekwencję: wciśnięcie przycisku -> przytrzymanie przez minimum 200 ms, puszczenie przycisku. W każdym innym przypadku zwraca wartość 0.
3) Funkcja operuje nie na timerach sprzętowych obsługiwanych w przerwaniu, ale na funkcji millis(), działającej dokładnie jak w Arduino (chodzi mi o kompatybilność kodu z tą pratformą).
4) Funkcja debounce_key() będzie wywoływana kolejno w ramach funkcji nadrzędnej, z różnymi paramtrami. Gdy któreś wywołanie zwróci 1, funkcja nadrzędna zwróci numer klawisza, który będzie dalej wykorzystywany w pętli głównej.

Kod wygląda tak:

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


W funkcji nadrzędnej funkcje obsługiwane są następująco:

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


Niestety, kod nie chce działać. Zwieranie pinów do których mają być podpięte przyciski nie daje żadnego rezultatu.
Ktoś z Was widzi błąd?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 maja 2015, o 15:02 
Offline
Moderator
Avatar użytkownika

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

Atlantis napisał(a):
Konieczna jest możliwość sprawdzania kilku przycisków jednocześnie

To się zaczyna od obsługi klawiatury matrycowej a nie od obsługi pojedynczych klawiszy. Tu jest twój pierwszy i podstawowy błąd

_________________
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: 1 maja 2015, o 16:23 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

mirekk36 napisał(a):
Atlantis napisał(a):
Konieczna jest możliwość sprawdzania kilku przycisków jednocześnie

To się zaczyna od obsługi klawiatury matrycowej a nie od obsługi pojedynczych klawiszy. Tu jest twój pierwszy i podstawowy błąd


Wyraziłem się mało precyzyjnie. Nie chodzi mi o możliwość sprawdzania, czy wciśnięta została kombinacja przycisków.
Przyciski wciąż będą sprawdzane pojedynczo. Nie chcę jedynie, żeby wciśnięcie kolejnego przycisku przed puszczeniem pierwszego zakłóciło działanie układu. Czyli:

1) Wciskamy przycisk 1 - funkcja filtruje odbicia i czeka na jego puszczenie. Do tego czasu funkcja nadrzędna zwraca 0 do pętli głównej.
2) Wciskamy przycisk 2 - funkcja filtruje odbicia i czeka na jego puszczenie. Do tego czasu funkcja nadrzędna zwraca 0 do pętli głównej.
3) Puszczamy przycisk 1 - funkcja nadrzędna zwraca wartość 1 do pętli głównej.
4) Puszczamy przycisk 2 - funkcja nadrzędna zwraca wartość 2 do pętli głównej.
5) Funkcja nadrzędna wraca do stanu domyślnego - przy każdym wywołaniu zwraca do pętli głównej 0.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 maja 2015, o 19:10 
Offline
Moderator
Avatar użytkownika

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

zajrzyj do projektu wielozadaniowego - na DVD - masz tę wersję funkcji?

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


chyba nie?

widzisz co tu jest dodatkowo ? --> key_state

_________________
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: 2 maja 2015, o 10:07 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

Tak, widziałem ten kod. Okazuje się, że problem leży gdzie indziej. Po bliższym przyjrzeniu się pracy układu okazuje się, że nie wykonuje się przerwanie timera. Początkowo używałem w tym celu tryby CTC w Timer2, potem spróbowałem też na Timer1.

W tej chwili kod obsługi przerwania wygląda następująco:

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


Wartość zmiennej mil nie wzrasta, dioda podłączona do PC0 nie pulsuje.
W funkcji main() została wywołana funkcja init_time() oraz sei(). Działa też UART, więc wygląda na to, że globalne przerwania są w porządku. Co może być powodem takiego zachowania? Uszkodzona Atmega?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2015, o 10:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

UART działa bez sei - jeszcze się upewnię, bo to było wczoraj.
Wydaje mi się, że init_time() to nie time_init() - ale sprawdź to.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2015, o 10:21 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

Wirnick napisał(a):
UART działa bez sei - jeszcze się upewnię, bo to było wczoraj.
Wydaje mi się, że init_time() to nie time_init() - ale sprawdź to.


To oczywiście pomyłka popełniona podczas pisania posta...
Co jeszcze w takim razie może przeciwdziałać wykonywaniu przerwań? Jakiś fusebit?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2015, o 10:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

A co myślisz o wartości TOP. Jaką wartość przyjmuje?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2015, o 10:44 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

Wirnick napisał(a):
A co myślisz o wartości TOP. Jaką wartość przyjmuje?


Co konkretnie masz na myśli?
Co do przewań, to one MUSZĄ działać z dwóch powodów:

1) Używam biblioteki UART na buorach cyklicznych, gdzie kolejne bajty są odbierane i wysyłane w przerwaniu.
2) Używam też odtwarzania dźwięku z karty SD, który korzysta z Timer0 - ta część też działa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2015, o 11:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

Atlantis napisał(a):
Co konkretnie masz na myśli?

Mam na myśli MODE Timer1 - CTC. Wydaje mi się, że wartością TOP jest 0.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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