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 12 lip 2025, o 04:54


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
    Autor Wiadomość
    PostNapisane: 25 kwi 2020, o 19:24 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 mar 2015
    Posty: 324
    Lokalizacja: Rybnik
    Pomógł: 23

    Witam wszystkich i pozdrawiam serdecznie.
    Korona wirus uziemił nas skutecznie ale za to mamy więcej czasu na hobby.
    Mam taki problem do rozwiązania.
    Poniżej wstawiam kod testowy i opiszę o co chodzi.
    1. Próbuję walczyć z funkcjami zdarzeniowymi i callback-ami.
    2. Poniższy program ( na razie działa) ma mi posłużyć do opanowania posługiwania się eventami i callbackami
    3. Założenie potrzebne do nauki:
    a) wykorzystać przerwanie co 10ms jako timer sprzętowy (konfiguracja załatwiona, mam nadzieję, że poprawnie dla ATmega8 8MHz)
    b) skorzystać z funkcji zdarzeniowej, która będzie wywoływana w pętli głównej.
    c) w obsłudze przerwania - sprawdzanie stanu pinów na których są klawisze (przyciski) i reakcja tej funkcji zdarzeniowej jak któryś z przycisków naciśnięty
    d) przekazanie do mojej funkcji " klawisze()" informacji , że został naciśnięty przycisk i który był naciśnięty (na razie do testów bez callbacka użyłem funkcji bez argumentów)
    Dalej z obsługą jak mają działać klawisze, to już chyba sobie poradzę.
    Wiem też, że moja funkcja musi być zarejestrowana. Walczę z tym sporo czasu, posiłkując się BB, GB i nawet poradnikiem o callbackach i nadal nie wiem jak tego użyć w poniższym kodzie.
    Chyba wiek też robi swoje. Na razie robię to wszystko w jednym pliku ale na tym etapie to chyba nie istotne.
    Proszę szanownych kolegów aby mnie ktoś naprowadził jak to ugryźć.

    Proszę o wyrozumiałość dla laika.


    Acha, biblioteka do lcd trochę pozmieniana, dlatego takie dziwne zapisy.
    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.

    _________________
    http://www.avrboss.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 kwi 2020, o 20:56 
    Offline
    Użytkownik

    Dołączył(a): 29 paź 2017
    Posty: 232
    Pomógł: 26

    Tak na początek bez zbytniej analizy kodu to podszedłbym inaczej do obsługi przerwania.
    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.



    Po prostu w przerwaniu robiłbym jak najmniej.
    Resztą niech się zajmie zdarzenie.
    Zauważ że piny masz podpięte do jednego portu.
    To taki pierwsza uwaga.
    P/S
    Pewnie narobiłem jakiś baboli ale chodzi mi o idee.

    _________________
    Jestem na GG 31324
    Nowy soft, nowa nadzieja.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 kwi 2020, o 21:58 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 mar 2015
    Posty: 324
    Lokalizacja: Rybnik
    Pomógł: 23

    Tak. Zgadzam się i wiem, że w przerwaniu muszę "szybko działać"
    może źle się wyraziłem. W przerwaniu chcę tylko sprawdzić, czy doszło do zdarzenia. Jeśli tak to do jakiego tzn. który klawisz został naciśnięty? Przekaż to funkcji zdarzeniowej EVENT, jeśli żaden klawisz , to nic nie rób.
    Jeśli przekazałeś te dane do funkcji EVENT, to wywołaj callbacka z funkcją, której na tym etapie nie znam ale przekaż argument np: Tak naciśnięty klawisz nr.1

    Acha, PIN-y celowo są podpięte do jednego portu. To na potrzeby zrozumienia i nauki.

    _________________
    http://www.avrboss.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 kwi 2020, o 08:51 
    Offline
    Użytkownik

    Dołączył(a): 24 sty 2012
    Posty: 1469
    Pomógł: 56

    Ale może napisz bardziej konkretnie z czym właściwie masz problem.
    Gdzie potrzebujesz pomocy, wytłumaczenia.
    Przeczytałem Twój post 3 razy i nadal nie wiem :-( pewnie wiek robi swoje...

    _________________
    Jestem początkujący i moje porady mogą być błędne



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 kwi 2020, o 15:47 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 mar 2015
    Posty: 324
    Lokalizacja: Rybnik
    Pomógł: 23

    MirkoT, mi chodzi o to, żeby przedstawiony program działał w następujący sposób:
    W przerwaniu co 10ms sprawdzam stan klawiszy. Jeżeli nie zostanie naciśnięty żaden klawisz , to oczywiście nic się nie dzieje.
    Teraz z kolei funkcją zdarzeniową KEY_EVENT() , chciałbym jeśli dojdzie do zdarzenia, wysłać do funkcji klawisze(),
    wiadomość, że został naciśnięty np. klawisz nr.2 za pomocą callback-a i nie wiem jak się zabrać do tego.
    Na przykładzie tego programu, nie wiem co powinno się znaleźć w obsłudze przerwania, jak napisać tę funkcję KEY_EVENT() a
    moja funkcja, żeby była wywołana za pomocą callback-a. Nie wiem, myślę że teraz trochę jaśniej wytłumaczyłem mój problem.

    _________________
    http://www.avrboss.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 kwi 2020, o 16:53 
    Offline
    Moderator
    Avatar użytkownika

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

    0. Przygotuj funkcję do rejestracji Callbacka - który wywoła funkcję użytkownika i przekaże jej info jaki przycisk został wciśnięty


    1. Wyprowadź w obsłudze Timera co 10ms, funkcję która będzie sprawdzała stan przycisków - i daj jej nazwę np KBD_EVENT() - to będzie obsługa zdarzeń

    2. Gdy ta funkcja zobaczy że jakiś przycisk został wciśnięty to może wywołać callbacka .... ale najpierw zrób jego rejestrację na początku - może w pkt.nr 0 - już go dodaję ;)

    Przykłady takich zachowań masz w GB tzn tam jest najwięcej takich przykładów jak z tym postępować - postaraj się prześledzić książkę w tym zakresie

    _________________
    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: 27 kwi 2020, o 12:15 
    Offline
    Użytkownik

    Dołączył(a): 13 mar 2013
    Posty: 123
    Pomógł: 1

    Witam
    Właściwie wszystko co istotne powiedział w poprzednim poście Mirek. Może jednak ja spróbuję wytłumaczyć Ci to jak początkujący początkującemu (lub jak wolisz hobbysta hobbyście).
    Mianowicie - tak jak ja to rozumiem - mechanizm EVENT został stworzony po to aby ograniczyć się tylko do jednego miejsca w programie w którym wywoływana jest reakcja na dane zdarzenie. Tak więc musisz najpierw określić takie zjawisko które w sposób jednoznaczny potwierdzi ,że zaszło działanie które Cię interesuje. Musi to być coś jednoznacznego i unikalnego. Tak jak poradził Mirek można zrobić to w osłudze przerwania, co np. 10ms.
    Wprowadzasz dodatkową zmienną, np. key_flag i w obsłudze przerwania sprawdzasz czy którykolwiek z klawiszy nie został naciśnięty. Jeśli tak , to stan key_flag zmienia się na 1. Wyjście z przerwania zwraca stan flagi oraz numer naciśniętego klawisza.
    Stan flagi, key_flag jest warunkiem uruchomienia funkcji KEY_EVENT(). Jeśli flaga nie jest ustawiona KEY_EVENT nic nie robi, nie zajmując czasu w pętli głównej, jeśli jest ustawiona wdraża akcję wywołując Twoją funkcję obsługi.
    Oczywiście można w prosty sposób wywołać funkcję obsługi, wpisując jej nazwę lub wskażnik do niej. Aby jednak uzyskać dodatkowe funkjonalności wprowadzono bardzo sprytny mechanizm callback.
    W zasadzie sprowadza sie on do tego że funkcję, która ma wykonać działanie wywołujemy z pomocą wskaźnika który w momencie definicji nie jest określony (jest wskaźnikiem pustym) . Dopiero w trakcie działania programu, a dokładnie najczęściej w trakcie inicjacji ten pusty wskaźnik "kierujemy" na jakąś wybraną przez nas funkcję. Ten mechanizm kierowania (czy też może błędnie ale bardziej obrazowo) przypisania konkretnej funkcji do wywołującego , pustego początkowo wskaźnika nazywamy rejestracją i wykonujemy za pomocą wywołania specjalnej funkcji register. Taką rejestrację możemy wykonywać dowolnie w trakcie działania programu zmieniając w dowolny sposób funkcje które będą wywoływane w wyniku zdarzenia EVENT().
    Funkcja register działa tak,że przypisuje ten pusty wskaźnik do wskaźnika funkcji którą chcemy wywołać . W ten sposób ten pusty dotychczas wskaźnik zaczyna wskazywać od tego momentu (wywołnia funkcji register) na okresloną przez nas własną funkcję.
    Reasumując:
    Tworzymy jakiś pusty wskaźnik na funkcję mającą argumenty w postaci (argumenty)
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

    nazewnictwo jest zupełnie dowolne, ale przyjęta przez Mirka konwencja wykorzystywania nazw związanych z działąniem wydaje się być doskonała

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


    I to wszystko. Musisz tylko pamiętać aby przed uruchomieniem pętli głównej przypisac wskaźnik key_action_wsk do jakiejś swojej funkcji obsługi przez wywołanie funkcji register

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


    Jeśli tego nie zrobisz , pierwsza część warunku w funkcji EVENT będie niespełniona i nie zostanie wywołane żadne działanie.
    Mnie osobiście największą trudność sprawiła składnia:
    1. w definicji pustego wskaźnika key_action_wsk i w funkcji register trzeba jak argumenty wpisać takie same argumenty, jakie będą występowac w Twojej własnej funkcji bsługi
    2. Funkcję register wywołujesz wpisując jak argument tylko nazwę Twojej własnej funkcji, bez żdnych argumentów dodatkowych.
    To tyle . Przepraszam, że tyle nudziłem na tematy oczywiste, ale mnie to sprawiało w pewnym momencie spore trudności
    Oczywiście to wszystko jest dokładnie i szcegółowo opisane w książkach Mirka, ale niestety w różnych miejscach. Gdy człowiek jeszcze niedokładnie wie czego i gdzie szukać to jest to nieco kłopotliwe.
    Pozdrawiam
    W


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 kwi 2020, o 17:17 
    Offline
    Użytkownik

    Dołączył(a): 28 wrz 2016
    Posty: 215
    Pomógł: 14

    Poprosiłbym o rozwianie mich wątpliwości, bo nie wiem czy dobrze rozumuje.
    Próbowałem ogarnąć callback'i, ale poległem. Teraz próbuje na nowo.
    MisterWhite napisał(a):
    mechanizm EVENT został stworzony po to aby ograniczyć się tylko do jednego miejsca w programie w którym wywoływana jest reakcja na dane zdarzenie
    nie rozumiem, jak to możliwe, przecież zmienna key_flag będzie widoczna w całym programie
    MisterWhite napisał(a):
    Wyjście z przerwania zwraca stan flagi oraz numer naciśniętego klawisza.
    funkcja obsługi przerwania nie zwraca żadnej wartości
    MisterWhite napisał(a):
    Stan flagi, key_flag jest warunkiem uruchomienia funkcji KEY_EVENT()
    a nie jest tak, że funkcja KEY_EVENT() jest wywoływana za każdym obiegiem petli głównej programu, i pierwsze co sprawdza to stan flagi, i jeżeli nie jest ustawiony to kończy swoje działanie

    Działanie funkcji rejestrującej to tylko nadanie wartości wskaźnikowi, po co pisze sie funkcje, skoro wystarczy tylko przypisanie. A może nie wystarczy?
    MisterWhite napisał(a):
    void *key_action_wsk (argumenty)
    czy *key_action nie powinno być w nawiasie void (*key_action)(argumenty), zapis bez nawiasu oznacza funkcje zawracającą pusty wskaźnik. Proszę mnie poprawić jeśli się mylę.

    Pytam, bo nie wiem, a chce się dowiedzieć i zrozumieć

    _________________
    de gustibus non est disputandum



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 kwi 2020, o 18:41 
    Offline
    Użytkownik

    Dołączył(a): 13 mar 2013
    Posty: 123
    Pomógł: 1

    Alef2 napisał(a):
    MisterWhite napisał(a):
    mechanizm EVENT został stworzony po to aby ograniczyć się tylko do jednego miejsca w programie w którym wywoływana jest reakcja na dane zdarzenie
    nie rozumiem, jak to możliwe, przecież zmienna key_flag będzie widoczna w całym programie

    Zgadza się , będzie widoczna w całym programie, chodzi o to, że tylko zmiana tej jednej zmiennej jest warunkiem koniecznym i wystarczającym do uruchomienia zdarzenia EVENT. Jej ustawienie jest jedynym liczącym się świadectwem naciśnięcia klawisza (Naciśnięcia w ogóle, któregokolwiek). A to że jest widoczna w całym programie nie ma nic do rzeczy , pozwala jedynie aby zdarzenie EVENT() wywołać gdziekolwiek, choć jedynym sensownym miejscem wydaje się pętla główna.
    Alef2 napisał(a):
    MisterWhite napisał(a):
    Wyjście z przerwania zwraca stan flagi oraz numer naciśniętego klawisza.
    funkcja obsługi przerwania nie zwraca żadnej wartości

    W sensie programistycznym ,trzymając się formalnej terminologii masz oczywiście rację. Ja wyrażałem sie bardziej literacko mając na myśli iż w trakcie obsługi przerwania uzyskujemy informację o fakcie naciśnięcia klawisza. Oczywiście nie jest ona uzyskiwana w postaci "return" - bo takiego czegoś w przerwaniu nie ma, lecz w postaci ustawienia flagi i jakiejś zmiennej zawierającej numer naciśniętego lawisza. Można to potraktować jako przekazanie lub też (może mniej szczęśliwie, bo niejednoznacznie ) zwracanie informacji.
    Alef2 napisał(a):
    MisterWhite napisał(a):
    Stan flagi, key_flag jest warunkiem uruchomienia funkcji KEY_EVENT()
    a nie jest tak, że funkcja KEY_EVENT() jest wywoływana za każdym obiegiem petli głównej programu, i pierwsze co sprawdza to stan flagi, i jeżeli nie jest ustawiony to kończy swoje działanie.

    No właśnie dokładnie tak jest z tym że pod pojęciem uruchomienia funkcji KEY_EVENT rozumiem podjęcie przez nią dalszych działań - w tym wypadku wywołania Twojej funkcji obsługi - a nie stwierdzenia że nie ma nic do roboty i zakończenia działalności. Myślę,że to oczywiste
    Alef2 napisał(a):
    Działanie funkcji rejestrującej to tylko nadanie wartości wskaźnikowi, po co pisze sie funkcje, skoro wystarczy tylko przypisanie. A może nie wystarczy?

    Mirek to tłumaczył kilka razy, a ja też napisałem chwilę dalej. Uzyskujemy w ten sposób parę możliwości . Przede wszystkim możemy bardzo elastycznie,wywołując w trakcie programu funkcję register z róznymi funkcjami obsługi - jako argumentami, zmieniać reakcję programu na to samo zdarzenie. Możemy np. tak napisać program , aby pierwsze naciśnięcie klawisza wywoływało inną reakcję, drugie inną a trzecie jeszcze inną.
    Poza tym - o czym wspominał Mirek przy "siłowaniu się z callback'ami" - callback pozwala na uruchomienie własnej funkcji obsługującej coś w bibliotece , bez ingerencji w tę bibliotekę.
    Alef2 napisał(a):
    MisterWhite napisał(a):
    void *key_action_wsk (argumenty)
    czy *key_action nie powinno być w nawiasie void (*key_action)(argumenty), zapis bez nawiasu oznacza funkcje zawracającą pusty wskaźnik. Proszę mnie poprawić jeśli się mylę.

    Tak , oczywiście masz rację , przepraszam za literówkę.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 kwi 2020, o 22:15 
    Offline
    Użytkownik

    Dołączył(a): 11 sty 2015
    Posty: 166
    Pomógł: 24

    MisterWhite napisał(a):
    Alef2 napisał(a):
    Działanie funkcji rejestrującej to tylko nadanie wartości wskaźnikowi, po co pisze sie funkcje, skoro wystarczy tylko przypisanie. A może nie wystarczy?

    Mirek to tłumaczył kilka razy, a ja też napisałem chwilę dalej. Uzyskujemy w ten sposób parę możliwości . Przede wszystkim możemy bardzo elastycznie,wywołując w trakcie programu funkcję register z róznymi funkcjami obsługi - jako argumentami, zmieniać reakcję programu na to samo zdarzenie. Możemy np. tak napisać program , aby pierwsze naciśnięcie klawisza wywoływało inną reakcję, drugie inną a trzecie jeszcze inną.
    Poza tym - o czym wspominał Mirek przy "siłowaniu się z callback'ami" - callback pozwala na uruchomienie własnej funkcji obsługującej coś w bibliotece , bez ingerencji w tę bibliotekę.


    Dokładnie to samo można uzyskać bezpośrednio przypisując do wskaźnika adres funkcji i do samego działania to wystarczy. Natomiast w bibliotece zazwyczaj nie udostępniamy samego wskaźnika tylko funkcję która go rejestruje. Tak jest bardziej "elegancko" i bezpieczniej. Nie operujemy bezpośrednio na wskaźniku tylko pośrednio przez funkcję do tego przeznaczoną.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 kwi 2020, o 16:26 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 mar 2015
    Posty: 324
    Lokalizacja: Rybnik
    Pomógł: 23

    MisterWhite, idąc za twoimi radami, skleciłem coś takiego.

    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.


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

    eclips krzyczy warningiem:
    " warning: implicit declaration of function 'register_key_actioin_wsk' [-Wimplicit-function-declaration] register_key_actioin_wsk (klawisze);"
    Oprócz tego nie wiem jak teraz obsłużyć przerwanie , jak się do tego wszystkiego zabrać.
    Porównywałem też kod do IR w GB ale nie ogarniam tego.
    Co robię nie tak?

    _________________
    http://www.avrboss.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 kwi 2020, o 16:47 
    Offline
    Użytkownik

    Dołączył(a): 14 sie 2016
    Posty: 905
    Pomógł: 39

    Masz literówkę w kodzie:
    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łę

    _________________
    Moje porady są błędne,nie czytać,zbanować od razu.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 kwi 2020, o 16:55 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 mar 2015
    Posty: 324
    Lokalizacja: Rybnik
    Pomógł: 23

    Dzięki Harry, to chyba z przemęczenia już nie dowidzę ale i tak nie wiem co dalej, co wstawić do przerwania.

    _________________
    http://www.avrboss.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 maja 2020, o 20:39 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 mar 2015
    Posty: 324
    Lokalizacja: Rybnik
    Pomógł: 23

    Szanowni koledzy.
    Dzięki waszej pomocy udało mi się sklecić coś takiego jak poniżej.
    Callback i funkcja KBD_EVENT() chyba działają prawidłowo ponieważ program działa zgodnie z moim oczekiwaniem.
    Prosił bym jednak forumowiczów o sprawdzenie kodu, czy aby na pewno jest poprawnie napisany, czy też wymaga poprawek albo może optymalizacji.
    Wydaje mi się, że zrozumiałem zagadnienie. Brakowało mi tylko wyjaśnienia jak tworzyć funkcje zdarzeniowe i callbacki ale dzięki wam
    chyba mi się udało.
    Proszę o komentarze co jeszcze jest nie tak i co mam poprawić.


    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.

    _________________
    http://www.avrboss.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 maja 2020, o 22:44 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 mar 2015
    Posty: 324
    Lokalizacja: Rybnik
    Pomógł: 23

    Szkoda, że nikt nie chce więcej pomóc...

    _________________
    http://www.avrboss.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 maja 2020, o 07:26 
    Offline
    Moderator
    Avatar użytkownika

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

    kilka podpowiedzi:

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


    Jaki jest sens wywoływania miliard razy na sekundę tego "lcd_int()" ?

    mario2015 napisał(a):
    ISR(TIMER2_COMP_vect)
    {
              if( (!key_lock && !(PINC & KEY1 )) || (!key_lock && !(PINC & KEY2 )) || (!key_lock && !(PINC & KEY3 )) ) {
               key_lock=1;
     
               // reakcja na PRESS (wcinięcie przycisku)
               nr = (PINC & 0x07 );
     
              } else if( (key_lock && (PINC & KEY1 )) || (key_lock && (PINC & KEY2 )) || (key_lock && (PINC & KEY3 )) ) key_lock++;
     
            if(nr!=7) key_flag = 1;
            else key_flag = 0;
     
    }


    Pomijając już fakt, że taka obsługa klawiszy (z mojego bloga) nie nadaje się do obsługi wewnątrz przerwań - to na dodatek próbujesz ogarnąć jedną taką sekcją wiele przycisków naraz tzn więcej niż jeden - a to znowu jest niemożliwe nawet poza przerwaniem i wyjaśniam to na blogu - jak to się robi dla kilku przycisków.

    Ja bym na twoim miejscu porzucił tę obsługę przycisków z bloga i w przerwaniu cyklicznie sprawdzał zwykłą metodą stan przycisków - po prostu stan pinów np co 30-40ms i w zależności od stanu robił dalej to co tutaj czyli uwstawiał sobie flagi

    _________________
    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: 4 maja 2020, o 08:52 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 mar 2015
    Posty: 324
    Lokalizacja: Rybnik
    Pomógł: 23

    Dzięki Mirku, odnośnie instrukcji lcd_int w pętli głównej, to było mi to potrzebne tylko na potrzeby testu a z tym przerwaniem to jeszcze powalczę.
    Pozdrawiam.

    _________________
    http://www.avrboss.pl



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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