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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 2 maja 2025, o 02:08


    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: 1968
    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: 1968
    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: 1168
    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 ] [ Zaznacz wszystko ]
    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: 1168
    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 ] [ Zaznacz wszystko ]
    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 ] [ Zaznacz wszystko ]
    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: 27378
    Lokalizacja: Szczecin
    Pomógł: 1043

    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 ] [ Zaznacz wszystko ]
    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 5 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