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? 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 11 cze 2025, o 05:19


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
    Autor Wiadomość
    PostNapisane: 25 cze 2017, o 20:54 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    Mam taką zagwozdkę. Działam na ATB.
    Napisałem sobie w programie,że po naciśnięciu klawisza zapalają mi się diody, przechodzą diody jak w typowym robalu, czyli z lewej do prawej. Robal powtarzany jest cztery razy i diody gasną. wszystko trwa około 3 sekund. Zrobiłem obsługę klawisza i po naciśnięciu, robal jest uruchamiany. Wszystko działa z delajami, więc program jest blokujący się. Ale działa według moich założeń.
    Następnie uruchomiłem sobie timer, w którym mrygam jedną diodą(niezależnie od pętli głównej), którą pożyczyłem sobie z wyświetlacza 7-mio segmentowego i chcę, aby ta dioda z timera mrygałą mi tylko i wyłącznie podczas momentu, gdy wykonuje się cztery razy robal w pętli głównej, następnie ma zgasnąć. I z tym mam problem.

    W timerze napisałem sobie obsługę klawisza, tego samego co w pętli głównej i gdy go naciskam, to dioda przestaje migać i świeci ciągle. Gdy puszczę klawisz, to dioda znów zaczyna mrygać z timera

    Myślałem, aby powołać zmienną o wartości 1.

    Na mój chłopski rozum po naciśnięciu klawisza w pętli głównej powinienem zamieścić tą zmienną z wartością =1, gdy robal wykona się cztery razy, zeruję tą zmienną. Ale to tak nie chce działać.

    proszę o podpowiedź.

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2017, o 21:12 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 23 paź 2014
    Posty: 1036
    Lokalizacja: Trójmiasto
    Pomógł: 190

    Bez zobaczenia kodu który naskrobałeś trudno będzie cokolwiek pomóc.
    Czy pod pojęciem uruchomienia timera i mrugania w nim diodą rozumiesz timer sprzętowy i mruganie diodą w przerwaniu od niego?
    Jeśli tak to pomysł z dodatkową zmienną jest jak najbardziej prawidłowy (potocznie taką zmienną się nazywa flagą), tylko taka zmienna musi być globalna (bądź typu static) i opatrzona dopiskiem volatile...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2017, o 21:19 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    to o co pytam jest częścią kodu, ale już udotępniam kodzik. Jestem początkujący, więc proszę o wyrozumiałość, ponieważ zdaję sobie sprawę,że wiele rzeczy można by napisać w mniej liniowy sposób. Ja jednak dopiero się uczę :)
    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: kilkunastu sekundach ]

    nie oczekuję gotowego rozwiązania, tylko podpowiedzi, w którą stronę mam pójść. :)

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2017, o 21:34 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 23 paź 2014
    Posty: 1036
    Lokalizacja: Trójmiasto
    Pomógł: 190

    No to jak na osobę początkującą to zmajstrowałeś potężny kawał kodu ;)
    Jeszcze mógłbyś wskazać o którą konkretnie diodę chodzi bo analizować taki kod to nie wiem czy ktokolwiek się podejmie...
    Tak czy siak jedno co kłuje w oczy to znacznych rozmiarów procedura obsługi przerwania, a przy przerwaniach trzeba się starać by trwało ono jak najkrócej...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2017, o 21:42 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    co do przerwania, to chodzi o to, aby było jak naj mniej tekstu pisanego? w późniejszym czasie zamięnię w przerwaniu na modulo.
    a chodzi mi o trzy diody
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    każda dioda ma być przypisana do jednego z klawisza
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    na wstępie zapytałem o jeden klawisz i jedną diodę.
    Ale chodzi mi o to, że gdy nacisnę klawisz pierwszy,to ma mi mrygać z timera dioda pierwsza i ma tak długo mrygać, aż się wykona cała funkcja z pierwszego klawisza. Analogicznie będzie z druga diodą i drugim klawiszem, oraz z trzecią diodą i trzecim klawiszem.
    Z tym mam właśnie kłopot.

    z częścią kodu pomagał mi Daro69. Głównie pomagał z obsługą serwa, bo z tym też było ciężko.



    Po kolejnym zastanowieniu myślę sobie,że może tutaj powinienem tą zmienną przypisać? w tej części kodu?
    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.

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2017, o 21:59 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 sie 2015
    Posty: 205
    Lokalizacja: UK
    Pomógł: 10

    wojciechgorzolka napisał(a):
    co do przerwania, to chodzi o to, aby było jak naj mniej tekstu pisanego?

    Nie do końca, chodzi o to, aby wykonywać jak najmniejszą liczbę operacji. Zmiana stanu wyjścia i sprawdzanie takiej ilości ifów zajmuje sporo czasu i może zablokować w pewnym momencie program, gdyż "nie będzie się on po prostu ze wszystkim wyrabiał".

    wojciechgorzolka napisał(a):
    #define LED_1_PIN (1<<PC0)
    #define LED_2_PIN (1<<PC1)
    #define LED_3_PIN (1<<PC2)
    #define LED_4_PIN (1<<PC3) // diody 8szt.
    #define LED_5_PIN (1<<PC4)
    #define LED_6_PIN (1<<PC5)
    #define LED_7_PIN (1<<PC6)
    #define LED_8_PIN (1<<PC7)


    A propos robala, zauważyłem, że wszystkie diody masz podłączone do tego samego portu. Żeby uzyskać prosty efekt migania wystarczy, że zastosujesz przesunięcie bitowe (np. w przerwaniu). Z każdym przerwaniem możesz przesuwać logiczne 1 w prawo. Jeżeli oczywiście o taki efekt ci chodzi ;)

    Dobrze jest to wyjaśnione w tym poradniku mirka:
    https://www.youtube.com/watch?v=tIS1LX6if3E

    Pozdrawiam, :)
    Michał


    Autor postu otrzymał pochwałę

    _________________
    MMT Technologies



    Ostatnio edytowano 25 cze 2017, o 22:03 przez Makowka, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2017, o 22:03 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    ok, postaram się nad dym pochylić. i to poprawię w miarę własnych możliwości :)
    Wiele rzeczy jest tam jeszcze do poprawy, ale na tą chwilę nie mogę sobie poradzić z tym problemem, o który pytam na początku.

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2017, o 22:08 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 lis 2015
    Posty: 1448
    Lokalizacja: okolice Warszawa
    Pomógł: 149

    hejka, :)
    Ale tasiemiec już powstał. ;D
    Wojtku, gdyby udało się Tobie ogarnąć wszystko na timerach, to nie musiał byś wciskać takich ilości poleceń do przerwania. ;)
    A tak jeżeli chcesz by wraz z wykonującą się jakąś funkcją zawierającą delaye wykonało się równorzędnie inne mryganie, to trzeba by wcisnąć to mryganie pomiędzy wiersze tej funkcji - albo zapchać przerwanie :).
    A jak dojdzie coś jeszcze to co wtedy zapchamy. :?
    Lepiej pomęcz timery bo jeszcze parę pomysłów tam upchniesz i i może zacząć się blokować.
    :)



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

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    to już jest ostatnia rzecz, która będzie w tym programie.

    ------------------------ [ Dodano po: 41 minutach ]

    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.
    trochę przerobiłem przerwanie.

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 cze 2017, o 11:11 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 23 paź 2014
    Posty: 1036
    Lokalizacja: Trójmiasto
    Pomógł: 190

    wojciechgorzolka napisał(a):
    co do przerwania, to chodzi o to, aby było jak naj mniej tekstu pisanego?
    Niezupełnie, na podstawie kodu pisanego w C jest generowany plik *.asm w którym są instrukcje asemblerowe dla procesora, trzeba odnaleźć sekcję przerwania i sprawdzić ile instrukcji asemblerowych zawiera dane przerwanie (w bluebooku masz to opisane w rozdzielne o sterowaniu PWM (kolorowa dioda RGB)). Większości instrukcji wykonuje się w jednym takcie zegara więc stosunkowo łatwo można policzyć czas wykonywania przerwania. A nie może on być zbyt długi bo jeśli będzie a przerwanie będzie wywoływane częściej niż zdąża się wykonywać wówczas podczas trwania przerwania zostanie zgłoszone już kolejne, co będzie skutkować tym że jak w końcu skończy się wykonywać, wróci do programu głównego wykona jeden rozkaz i jako że było międzyczasie kolejne zgłoszenie przerwania to znów zacznie się ono wykonywać. W rezultacie raz że same wywołania przerwania mogą się pogubić (podczas wykonywani przerwania może zbuforować się tylko jedno kolejne wywołanie) a dwa że program główny będzie praktycznie zamrożony (będzie się wykonywał po jednej instrukcji asemblerowej między przerwaniami)

    wojciechgorzolka napisał(a):
    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.
    Co do tego tworu to nie lepiej zmniejszyć wartość do której zlicza "zliczanie" i dodać drugą zmienną która będzie zawierała liczbę mrugnięć (po każdym mrugnięciu liczba będzie dekrementowana, czyli zliczanie będzie odpowiedzialne za czas świecenia, i zgaszenia diody, a druga zmienna za liczbę mrugnięć jeśli wogule liczba mrugnięć jest potrzebna), przez co warunki ifa będą dużo mniej czasochłonne dla procka?

    Co do przycisków, to w jakim celu ich obsługę masz zarówno w przerwaniu timera i w pętli głównej programu? Samo załączenie migania ledów możesz zrobić dodając po jednej zmiennej/fladze dla każdej diody ze specyfikatorem volatile, i w pętli głównej, w warunkach od przycisków jeśli wciśnięty masz kod który ma się wykonać, to na początku dodajesz by flaga dla danej diody została ustawiona na 1, a po wszystkich poleceniach które od przycisku mają się wykonać dajesz zerowanie flagi. Natomiast w przerwaniu dajesz tylko warunek jeśli flaga 1 to mrugaj, jeśli 0 to nie mrugaj.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 cze 2017, o 15:37 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    teraz mam dużo bardziej jaśniejszy obraz. Wieczorem się tym pobawię i będę próbował. a jak mi się nie uda, to wywalę timer i zrobię tylko zapalanie diody na początku funkcji klawisza i gaszenie na samym końcu. A temat będę zagłębiał w osobnych ćwiczeniach :)

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 cze 2017, o 20:36 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    powracam z poprawionym kodem.
    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.



    Poprawiłem kod w przerwaniu i gdy wpisuję zmienne z wartością jeden w pętli głównej (dla sprawdzenia poprawności działania kodu), to wszystko pięknie działa. Diody migają z założoną częstotliwością. Gdy zmieniam wartość kontrolki_3, na zero, to oczywiście przestaje migać.
    Następnie usunąłem z pętli głównej moje zmienne i wrzuciłem je odpowiednio do funkcji trzech klawiszy. Czyli na początku funkcji wystawiam wartość jeden, na końcu funkcji zeruję i wystawiam jedynkę kolejnej kontrolki.
    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.


    Teoretycznie powinno działaś poprawnie. I działa, pięknie się zmieniają moje trzy kontrolki. Tylko niestety przy kontrolce drugiej jest awaria w postaci takiej,że jest zapalona ciągle z takim bardzo delikatnym mruganiem. Pierwsza natomiast raz mi zgaśnie, a raz świeci się ciągłym światłem. Dodam jeszcze,że gdy zmienna od kontrolek ma wartość =0, to kontrolka, czyli dioda powinna się świecić.
    Reasumując. Jeśli robiłem testy w pętli głównej, to działało poprawnie, natomiast w funkcjach klawiszy już jest problem.

    Czy taka usterka mojego kodu może być spowodowana licznymi delajami, czy może tym,że w przerwaniu mam sporo kodu?

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 cze 2017, o 20:59 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 23 paź 2014
    Posty: 1036
    Lokalizacja: Trójmiasto
    Pomógł: 190

    Zmienne kontrolka_X masz zadeklarowane jako globalne z dopiskiem volatile?

    Co do kodu w przerwaniu to dla każdej kontrolki możesz wywalić po jednym ifie - wystarczą 2np przy zliczanie==0 zgaś, a przy zliczanie==10 zapal (lub odwrotnie wedle uznania), licznik nadal powinien tykać do 20.
    Warunek gaszenia kontrolek najlepiej wyrzucić poza ify sprawdzające kontrolki - chyba że nie zależy ci na stanie w jakim zostaną po zatrzymaniu (co jest zresztą powodem tego że kontrolka_1 czasem gaśnie a czasem świeci po jej zatrzymaniu).



    Ostatnio edytowano 27 cze 2017, o 21:06 przez xentis, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 cze 2017, o 21:06 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

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

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 cze 2017, o 21:22 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 23 paź 2014
    Posty: 1036
    Lokalizacja: Trójmiasto
    Pomógł: 190

    zauważ że wszystkie warunki kontrolek, zarówno zapalające jak i gaszące, masz wrzucone na koniec funkcji przycisków po wszystkich poleceniach gdzie masz jeszcze _delay_ms(500)...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 cze 2017, o 21:28 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    To zdanie:

    "Warunek gaszenia kontrolek najlepiej wyrzucić poza ify sprawdzające kontrolki - chyba że nie zależy ci na stanie w jakim zostaną po zatrzymaniu (co jest zresztą powodem tego że kontrolka_1 czasem gaśnie a czasem świeci po jej zatrzymaniu)."

    pisałeś odnośnie ifów w przerwaniu, czy w funkcji klawisza?

    ------------------------ [ Dodano po: 5 minutach ]

    zależy mi na stanie w jakim pozostaną po zatrzymaniu. Bardzo mi zależy. :)

    _________________
    Nikt nie mówił,że będzie łatwo...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 cze 2017, o 21:34 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 23 paź 2014
    Posty: 1036
    Lokalizacja: Trójmiasto
    Pomógł: 190

    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: 27 cze 2017, o 21:36 
    Offline
    Użytkownik

    Dołączył(a): 28 maja 2016
    Posty: 469
    Lokalizacja: Katowice
    Pomógł: 1

    już poprawiam

    _________________
    Nikt nie mówił,że będzie łatwo...



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Majestic-12 [Bot] i 0 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