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



Teraz jest 20 kwi 2024, o 14:51


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
PostNapisane: 18 wrz 2019, o 10:55 
Offline
Nowy

Dołączył(a): 30 sty 2017
Posty: 19
Pomógł: 0

Cześć, chcąc uzyskać dwie funkcjonalności wykorzystując 1 przycisk skorzystałem z poradnika pana Mirka "Obsługa klawiszy - zwłoka czasowa CD...3".

Wyprowadzenie PB0 odpowiada za sterowanie diodą, a PB1 za przycisk, który jest za pomocą rezystora podciągnięty do zasilania Attiny 13.

Krótkie naciśniecie przycisku prawidłowo wykonuje funkcję change_led1(void); powodując jedno mignięcie diody. Niestety to co umieściłem w funkcji change_led2(void);, czyli kilkukrotne mignięcie, nie jest już wykonywane pomimo przytrzymania przycisku. Proszę o pomoc lub ewentualne naprowadzenie co robię źle.

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: 18 wrz 2019, o 12:23 
Offline
Użytkownik

Dołączył(a): 26 mar 2014
Posty: 34
Pomógł: 11

Problemem są tutaj wywołania funkcji _delay_ms, które blokują obsługę przycisku. Zauważ że jak naciśniesz przycisk to program wykonuje funkcje change_led (tak jak piszesz) i trwa to 8s, blokując na 8s obsługę przycisku zanim wogule przejdzie ona do ustawienia flagi jego naciśnięcia. Musisz napisać funkcje change_led i change_led2 tak żeby nie używały _delay_ms, tylko np: timerów programowych.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2019, o 12:50 
Offline
Nowy

Dołączył(a): 30 sty 2017
Posty: 19
Pomógł: 0

Cześć, faktycznie tutaj był pies pogrzebany. Dzięki! Teraz mam kolejne pytanie. Obecnie funkcja przycisku działa tak, że wykrywane jest zwarcie do masy. Ja natomiast chciałbym uzyskać efekt odwrotny. Czyli na pinie podczas bezczynności jest stan niski, a reakcję na naciśnięcie przycisku wywołuje stan wysoki. Próbowałem trochę modyfikować funkcję np linię:

register uint8_t key_press = (*btn->KPIN & btn->key_mask);
zamieniłem na:
register uint8_t key_press = !(*btn->KPIN & btn->key_mask);

Jakiś efekt osiągnąłem, ale niestety program nie działał do końca dobrze.

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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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