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



Teraz jest 25 kwi 2024, o 06:25


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: 313
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

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 ]
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: 230
Pomógł: 26

Tak na początek bez zbytniej analizy kodu to podszedłbym inaczej do obsługi przerwania.
Składnia: [ Pobierz ] [ Ukryj ]
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: 313
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

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: 313
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

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: 27225
Lokalizacja: Szczecin
Pomógł: 1041

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: 313
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

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

Składnia: [ Pobierz ] [ Ukryj ]
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: 313
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

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: 313
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

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 ]
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: 313
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

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: 27225
Lokalizacja: Szczecin
Pomógł: 1041

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: 313
Lokalizacja: Czerwionka-Leszczyny
Pomógł: 22

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 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO