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



Teraz jest 28 mar 2024, o 23:07


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 
Autor Wiadomość
PostNapisane: 12 lis 2017, o 13:34 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

Witam!

Mam problem z obsługą klawiszy z bloga Pana Mirka. Chodzi o to, że chciałbym sobie napisać własne funcje do obsługi jednego klawisza, ale gdy robię zmiany w funkcji:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

to niestety nie działa tak jak bym chciał.

Mam trzy diody i niezależnie jakie teraz świecą to chcę żeby po dłuższym przytrzymaniu klawisza wszystkie zgasły, a po ponownym przytrzymaniu klawisza wszystkie się zaświeciły. I krótkotrwałym wciskaniem zmieniać świecące diody (ale to już druga funkcja). Zrobiłem sobie tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Mam zagwozdkę jak je teraz zaświecić po ponownym długotrwałym wciśnięciu klawisza bo już kombinuje długo i narazie nie wychodzi mi to, nie rozumiem czemu nie działa mi taki zapis:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Diody zgasną, ale już się nie zaświecą...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2017, o 17:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Cytuj:
Mam zagwozdkę jak je teraz zaświecić po ponownym długotrwałym wciśnięciu klawisza bo już kombinuje długo i narazie nie wychodzi mi to, nie rozumiem czemu nie działa mi taki zapis:

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


Diody zgasną, ale już się nie zaświecą...


Dzieje się tak dla tego, że sprawdzasz czy LEDS_ON jest różne od zera, prawda?
Jest to makro, coś w tym stylu:
#define LEDS_ON PORTC |= LED1 | LED2 | LED3
lub
#define LEDS_ON PORTC &= ~(LED1 | LED2 | LED3)
Czyli sprawdzasz czy PORTC |= LED | LED2 | LED3; jest różne od zera.
A kiedy będzie równe 0? Pomyśl nad tym.

Można to rozwiązać inaczej, na przykład do tego celu powołac dodatkową zmienną i na niej operować.
Jeżeli flaga jest równa 1 (lub różna od 0) to włącz diody i wyzeruj tą flagę (flaga=0).
Natomiast jeżeli jest równa 0 to wyłącz diody i ustaw flagę (flaga=1).


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


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


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2017, o 18:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Równie dobrze zamiast flagi (chociaż umiejętność ich stosowania jest jak najbardziej pożądana) wystarczy zrobić nowe makro, np. LEDS_TOGGLE :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2017, o 18:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

SylwekK napisał(a):
Równie dobrze zamiast flagi (chociaż umiejętność ich stosowania jest jak najbardziej pożądana) wystarczy zrobić nowe makro, np. LEDS_TOGGLE :)

No nie dokońca...
Powiedzmy, że zapaliliśmy sobie diodę LED1 i LED3 czyli LED2 będzie zgaszona.
Teraz chcemy zgasić wszystkie diody.
Proponujesz:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Gdy teraz nasza funkcja będzie wyglądała tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i zostanie wywołana, to jak myślisz czy wszystkie diody zostaną zgaszone? ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2017, o 18:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Aaa, faktycznie... Umknęło mi, że WSZYSTKIE mają się zgasić albo zapalić :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2017, o 12:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1146
Lokalizacja: Kraków
Pomógł: 93

A może zamiast flagi sprawdzić stan portu. A konkretnie tych pinów, do których podłączone są LEDy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2017, o 14:22 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

anshar napisał(a):
Można to rozwiązać inaczej, na przykład do tego celu powołac dodatkową zmienną i na niej operować.
Jeżeli flaga jest równa 1 (lub różna od 0) to włącz diody i wyzeruj tą flagę (flaga=0).
Natomiast jeżeli jest równa 0 to wyłącz diody i ustaw flagę (flaga=1).


Dzięki za dobre wytłumaczenie, zrobiłem tak i działa :) Dzięki temu podobnie zrobiłem w drugiej funkcji, powołałem sobie zmienną statyczną o nazwie "stan", zwiększam go o jeden "stan++" i sprawdzam sobie jaki jest aktualnie stan i na tej podstawie zapalam sobie odpowiednie diody.

Dzięki za podpowiedzi :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2017, o 16:41 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

Panowie znowu pojawił się problem przy zmianie mikrokontrolera na Attiny2313. Nie działa wyłączenie diod przy dłuższym przytrzymaniu przycisku. Myślę że dobrze ustawiłem Timer1:

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: 13 lis 2017, o 17:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1146
Lokalizacja: Kraków
Pomógł: 93

Linia 93 OCR1B? Masz OCR0B



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2017, o 17:37 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

Ok zaczęło mi reagować na dłuższe przytrzymanie klawisza, diody zgasną, ale jak ponownie nacisnę to odrazu wszystkie się zapalą i już nie reaguje na dłuższe przytrzymanie klawisza, dziwne bo na atmedze32 działało normalnie :(

Nie rozumiem, ten sam kod na atmedze32 działa normalnie a natomiast na attiny2313 nie chce działać, dziwne rzeczy się dzieją. Jedyne co zmieniałem to Timer1:

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


------------------------ [ Dodano po: 53 minutyach ]

Czy powodem może być rezonator kwarcowy?

Teraz mam ustawione wewnętrzne taktowanie 8MHz, mam wlutować rezonator 11,0592MHz i tak ustawić timer na przerwania co równe 100Hz tak jak w kodzie superdebounce na blogu Pana Mirka? Bo teraz jak liczyłem to mam 100,16Hz. Ale to chyba znaczenia nie ma? Bo jak wgrywałem kod do Atmegi32 to mam ustawione 8MHz i działa. A jak przeniose do Attiny2313 to głupoty się dzieją.

Nie mam już pomysłów :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2017, o 20:16 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

Panowie poradziłem sobie z problemem. Ustawiłem Timer0:

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


Teraz działa prawidłowo. Ale jestem ciekawy dlaczego na Timerze1 nie chciało działać? Źle skonfigurowałem czy coś innego miało na to wpływ np. pin do którego podłączyłem klawisz?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2017, o 20:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

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

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

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


Wartość 50000 raczej się nie zmieści w zmiennej 8 bitowej. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 kwi 2018, o 09:53 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

Witam!
Wróciłem do tego projektu, ponieważ chciałem go trochę ulepszyć o sterowanie PWM diodą RGB. Gdy do przerwania dodałem sterowanie wyjściami tak:

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


to jest brak reakcji na dłuższe przytrzymanie klawisza oraz dioda co jakiś czas mignie. Natomiast jak dodałem kolejny Timera1 to teraz nic nie działa. Możliwe, że może mieć to związek z tym, że wcześniej w tym temacie na Timerze1 też mi nic nie chciało działać? Ale dlaczego? Może ktoś będzie miał pomysł dlaczego tak jest? Poniżej zamieszczam cały kod:

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 kwi 2018, o 14:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Tom92 napisał(a):
Timerze1 też mi nic nie chciało działać
Jest taki prosty sprawdzony sposób do rozwiązywania takich problemów. O nim Mirek też ciągle wspomina ...
Zrób nowy projekt i wrzuć w nim obsługę Timer1 i miganie jedna diodą. Dzięki temu sprawdzisz sobie czy na pewno dobrze inicjalizujesz Timer1 (używasz dobre rejestry i wartości w nich) i korzystasz z jego przerwań. Jak Ci zadziała to należy szukać dalej w kolejnych częściach kodu.

--
Pozdrawiam,
Robert


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 kwi 2018, o 14:49 
Offline
Moderator
Avatar użytkownika

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

rskup napisał(a):
Zrób nowy projekt i wrzuć w nim obsługę Timer1 i miganie jedna diodą. Dzięki temu sprawdzisz sobie czy na pewno dobrze inicjalizujesz Timer1 (używasz dobre rejestry i wartości w nich) i korzystasz z jego przerwań. Jak Ci zadziała to należy szukać dalej w kolejnych częściach kodu.

I to trzeba powtarzać młodym adeptom programowania do znudzenia ... ;)

_________________
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: 19 kwi 2018, o 08:41 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

rskup napisał(a):
Zrób nowy projekt i wrzuć w nim obsługę Timer1 i miganie jedna diodą. Dzięki temu sprawdzisz sobie czy na pewno dobrze inicjalizujesz Timer1

Sorki, ale nie mam takiego doświadczenia dlatego nie przyszło mi na myśl, żeby tak sobie to sprawdzić. Dobrze, więc zrobiłem jak zasugerowałeś i faktycznie, źle inicjowałem Timer1. Powinno być tak:

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


oraz wektor A, a nie B:

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


Teraz wrzuciłem ten Timer do mojego projektu i kolory się wyświetlają, mogę przyciskiem je przełączać, ALE zauważyłem, że co ok. 1 sekunde dioda RGB lekko mrugnie i jest brak reakcji na dłuższe przytrzymanie klawisza.

Mam wrażenie jakby Timery przeszkadzały sobie na wzajem? Nie wiem jak to rozwiązać. Poniżej zamieszczam aktualny kod jakby ktoś był miły zerknąć.

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: 20 kwi 2018, o 09:24 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

Nie da się tak jak bym chciał?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 kwi 2018, o 23:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

W długim naciśnięciu wywołujesz funkcję change_ON_OFF() a ona robi LEDS_ON / LEDS_OFF. Tylko że w przerwaniu Timer1 zmieniasz stany tych LEDów cyklicznie na OFF i ON. Więc Twoje wyłączenie zadziała tylko do czasu następnego przelotu pwm-a.
Jak chcesz wyłączać LEDy to wyzeruj wartości w zmiennych pwm_r, pwm_g, pwm_b lub dodaj dodatkową zmienną pwm_on_off (lub zamień istniejącą statyczną zmiennej flaga) i ją zmieniaj w momencie zmiany stanu ON/OFF oraz sprawdzaj na jej podstawie w przerwaniu Timer1 czy możesz zmieniać stan LEDów.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 kwi 2018, o 09:12 
Offline
Użytkownik

Dołączył(a): 13 paź 2015
Posty: 303
Lokalizacja: Rybnik
Pomógł: 10

Metodą prób i błędów rozwiązałem problem.

Wydaje mi się, że było tak jak mówiłem czyli Timery sobie tak jakby przeszkadzały. Nie wiem czy dobrze myślę, ale właśnie tak myśląc podszedłem do tego inaczej.

Zainicjowałem timer wewnątrz funkcji "void change_color(void);" i teraz nie ma żadnych mignięć diody, tylko normalnie świeci z zadanym wypełnieniem zmiennych pwm_r, pwm_g, pwm_b 0-255. Przy krótkim wciśnięciu przycisku zmieniają się kolory oraz przy długim wciśnięciu zeruję zmienne pwm_r, pwm_g, pwm_b tak jak zaproponował rskup.

Wszystko działa tak jak chciałem. Dziękuję za zaangażowanie w temat :)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


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