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



Teraz jest 28 mar 2024, o 18:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 26 ] 
Autor Wiadomość
PostNapisane: 4 paź 2018, o 19:04 
Offline
Nowy

Dołączył(a): 09 lip 2018
Posty: 12
Pomógł: 0

Cześć,
Jakie macie podejście do zwiększania zmiennej w przerwaniu zew. np. INT0, które reaguje na poziom niski sygnału(nie zbocze opadające)?

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


Takie rozwiązanie zwiększać będzie zmienną wileokrotnie, ze względu na to, że po wciśnięciu przycisku wyzwalającego przerwanie następuje wielokrotne wykonywanie się tego przerwania, aż do czasu puszczenia przycisku.
Próbowałem na różne sposoby z flagami ale nie potrafię tego zrobić bez timerów. Macie jakieś proste rozwiązanie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 paź 2018, o 19:09 
Offline
Nowy

Dołączył(a): 10 cze 2014
Posty: 20
Pomógł: 1

Witam
Po wejściu w przerwanie wyłącz to przerwanie. W pętli głównej jeśli klawisz puszczony to załączamy przerwanie.
Pozdrawiam


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 paź 2018, o 19:41 
Offline
Użytkownik
Avatar użytkownika

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

Możesz ustawić aby zbocze badało, a nie stan. Pokaż jak tą flagę robiłeś, bo akurat nie widzę tu problemu aby to zrobić.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 paź 2018, o 20:09 
Offline
Nowy

Dołączył(a): 09 lip 2018
Posty: 12
Pomógł: 0

Ok, z tego co się orientuje to, żeby wybudzić procka z uśpienia za pomocą INT0/INT1 to nie należy robić tego zboczem i do tego celu to potrzebuje.

Aktualnie staram się korzystać z pomysłu tprzemko ale dalej zdarzają się sytuacje, w których naliczy mi nieprawidłowo w momencie, gdy szybko wciskam przycisk:

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


Nie wiem, czy to te owiane złą sławą drgania styków mogą powodować, że po wyjściu z przerwania warunek w main się wykona i do przerwania znowu program wejdzie?
Te warunki z użyciem flag1 wydają się zbyteczne ale bez nich naliczanie niepoprawne występowało częściej



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 paź 2018, o 21:36 
Offline
Użytkownik
Avatar użytkownika

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

Do wybudzania tak - tylko stan niski.
Flagę możesz przecież zerować w pętli głównej programu w jakimś tam momencie dogodnym nawet z wykorzystaniem innego timera jeśli taka potrzeba będzie.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 paź 2018, o 22:43 
Offline
Nowy

Dołączył(a): 09 lip 2018
Posty: 12
Pomógł: 0

No zgadza się tylko, że założenie jest takie, że nie chce używać timera, a pętla programu jest taka jak wysłałem. Pytanie gdzie zerować w takim razie tę flagę albo jakie inne podejście mieć do tego programu, ponieważ nie działa poprawnie.
Sprawdzałem to analizatorem stanów i do przerwania program wchodzi niekiedy zaraz po jego odblokowaniu(w tym przypadku nic się nie dzieje, bo flaga nie pozwala na inkrementacje zmiennej), a niekiedy po zerowaniu flagi powodując błędne naliczanie.

EDIT: oczywiście nie chce stosować żadnych opóźnień w formie _delay_ms



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 paź 2018, o 22:51 
Offline
Moderator
Avatar użytkownika

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

po wyłączeniu przerwania - ZERUJ sprzętową flagę przerwania

_________________
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 paź 2018, o 23:36 
Offline
Nowy

Dołączył(a): 09 lip 2018
Posty: 12
Pomógł: 0

Nie jestem przekonany, czy poprawnie manewruje tą flagą, bo nie do końca rozumiem jej znaczenie. Zgodnie z obrazkiem wyciągniętym z datasheeta powinna się ona sama zerować w przerwaniu no ale skoro je wyłączam to może dlatego potrzebne jest manualne działanie.
Dla ustawień w main:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

zeruje 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.

ale to nic nie pomaga

Obrazek

Problem raczej leży gdzie indziej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 02:29 
Offline
Nowy

Dołączył(a): 10 cze 2014
Posty: 20
Pomógł: 1

Jak Masz wejście int0 skonfigurowane?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 06:11 
Offline
Moderator
Avatar użytkownika

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

nie można flagi zerować tak

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


tylko i wyłącznie tak:

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: 2 minutach ]

MateuszS napisał(a):
Zgodnie z obrazkiem wyciągniętym z datasheeta powinna się ona sama zerować w przerwaniu

No bo tak się dzieje i przy wyzwalaniu zboczem nie miałbyś problemu, natomiast przy wyzwalaniu poziomem ... przecież ona znowu będzie ustawiona , i znowu ... cały czas w trakcie poziomu niskiego

_________________
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: 5 paź 2018, o 06:26 
Offline
Użytkownik
Avatar użytkownika

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

Jeśli korzystasz z przycisku to do prawidłowego działania bez jakiegoś czasomierza (najlepiej sprzętowego timera) ciężko będzie to przyzwoicie zrobić. Można bez timera, ale wtedy zaliczasz w pętli głównej inna zmienną, która posłuży za odliczanie czasu (mniej dokładne dla przycisku bez większego znaczenia).
Każde przerwanie od INT zwiększa twoją zmienną wystawiając flagę, która blokuje dalszą inkrementację. W pętli głównej jeśli ta flaga jest rozpoznana to zaczyna odliczać licznik, który po odpowiednim czasie (dopuszczalna częstotliwość wciskania przycisku) wyzeruje ta flagę.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 06:59 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Moim zdaniem pomysł z wyłączaniem zezwolenia na przerwanie wewnątrz procedury obsługi przerwania i włączaniem w pętli głównej programu po zwolnieniu przycisku jest dobry, tylko problemem tutaj mogą być właśnie (jak już sam autor wątku podejrzewał) drgania styków.
Aby to sprawdzić spróbowałbym zastosować sprzętowy debouncing ewentualnie podwójne sprawdzanie stanu wysokiego na pinie INT0 po jakimś opóźnieniu (rzędu około 10ms), i dopiero wtedy ponowne włączenie zezwolenia na przerwanie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 07:43 
Offline
Użytkownik
Avatar użytkownika

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

Po co wyłączać przerwania? Niech sobie pracują... to flaga nie pozwoli na zwiększenie wartości zmiennej.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 09:08 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

SylwekK napisał(a):
Po co wyłączać przerwania? Niech sobie pracują... to flaga nie pozwoli na zwiększenie wartości zmiennej.

Tylko że wtedy program w pętli głównej będzie wykonywany bardzo wolno, a kod innych przerwań może nawet wcale, bo mikrokontroler będzie prawie cały czas siedział w procedurze obsługi przerwania (do momentu puszczenia przycisku).

... i nie miałem na myśli wyłączenia przerwań w ogóle, tylko tego konkretnego ;)

EDIT:
Dodam, że flagą sprzętową przerwania nie należy się przejmować, czy też jej zerować, ponieważ mechanizm obsługi przerwania zewnętrznego wyzwalanego poziomem jest nieco inny, niż w przypadku wyzwalania zboczem, i flaga ta w tym przypadku wcale nie zostaje ustawiona.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 09:27 
Offline
Użytkownik
Avatar użytkownika

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

A w czym jest problem żeby dodatkowo po wybudzeniu procka przestawić INT na zbocze, a przy usypianiu z powrotem na stan niski? Nadal przycisk będzie wtedy blokował? ;-)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 10:42 
Offline
Nowy

Dołączył(a): 09 lip 2018
Posty: 12
Pomógł: 0

Dzięki za zaangażowanie chłopaki:)
Rzeczywiście przy ustawieniu na wykrywanie zboczem efekt jest trochę lepszy ale dalej nie zdaje to egzaminu, ponieważ procedura jest ta sama. Bez użycia timera albo zezwolenia na przerwanie w pętli głównej dopiero po jakiejś chwili od wyłączenia przerwania, program nadal czasem wchodzi do przerwania.

Dlatego problemu tego bez "odczekania" albo sprzętowego debouncingu nie umiem rozwiązać.

Natomiast w sytuacji, gdy zmienna miałaby być zwiększana tylko jednokrotnie to tego typu rozwiązanie się nadaje, więc pomysł z wyłączaniem przerwania uważam za dobry :

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: 5 paź 2018, o 10:56 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

SylwekK napisał(a):
A w czym jest problem żeby dodatkowo po wybudzeniu procka przestawić INT na zbocze, a przy usypianiu z powrotem na stan niski? Nadal przycisk będzie wtedy blokował?

Tak też można, ja nie napisałem, że to jedyne słuszne rozwiązanie, tylko w czym problem, żeby wyłączyć obsługę przerwania? ;)
Uważasz, że to złe rozwiązanie?
Nie mam w tej chwili czasu rozpisywać się na temat zalet i wad obu rozwiązań (choć rozwiązanie z wyłączeniem obsługi przerwania jest moim zdaniem prostsze, choćby dlatego, że tak naprawdę nie wymaga dodatkowej zmiennej volatile o nazwie flaga. Tak czy inaczej problem drgań styków dotyczy obu metod, pytanie tylko który sposób pozwoli na jego łatwiejsze rozwiązanie.
Czasami jednak najprostszym rozwiązaniem jest rozbudowanie układu o debouncing sprzętowy i sporo problemów znika.



Ostatnio edytowano 5 paź 2018, o 10:59 przez andrews, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 10:58 
Offline
Użytkownik
Avatar użytkownika

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

Podejdź do tego z innej strony. Przerwanie niech tylko wybudza, a liczenie (badanie przycisku) zrób w pętli głównej. Może tak będzie ci łatwiej. Nie ma tak, że czegoś się nie da zrobić ;-) Nie wiem co to za urządzenie i na ile sprzętowo idzie to uprościć (czasem takie działanie uniemożliwia dalszą rozbudowę urządzenia!), ale obstawał bym przy programowej eliminacji drgań.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 14:01 
Offline
Nowy

Dołączył(a): 10 cze 2014
Posty: 20
Pomógł: 1

Witam
Tak logicznie czy to będzie sprzętowy czy programowy debouncing, zawsze gdzieś będziesz miał jakieś opuźnienie. Nie ma co bać się tego debouncingu i go gdzieś zrobić. Iść można dalej czekając na puszczenie klawisza.
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 15:23 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

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

Powinno działać prawidłowo nawet przy szybkim naciskaniu, chyba że masz mocno zabrudzone styki lub potrafisz naciskać szybciej niż 100 razy na sekundę ;) ewentualnie masz jakieś zakłócenia na tym pinie.

Wprawdzie została użyta funkcja _delay_ms(), jednak opóźnienie nie jest duże, nie jest wewnątrz procedury obsługi przerwania i będzie uruchamiane tylko raz (no może 2, 3 razy) po puszczeniu przycisku.

Włączanie przed uśpieniem możesz sobie dodać sam, tak jak to wcześniej pokazałeś.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 16:43 
Offline
Nowy

Dołączył(a): 09 lip 2018
Posty: 12
Pomógł: 0

No tak, z delayami/timerami/sprzętowym debouncingiem to będzie śmigać. Zastawiałem się, czy istnieje sposób np. na tą przykładową inkrementacje zmiennej bez użycia wymienionych możliwości.
Gdybyśmy chcieli tylko inkrementować zmienną w przerwaniu INT0 wyzwalanym nawet zboczem opadającym to i tak złapią nas drgania styków, które będzie trzeba pominąć poprzez zrobienie jakiegoś opóźnienia, ponieważ inaczej raz na 'n' razy zliczy nam zmienną niepoprawnie. Dlatego gdy stosuję już w programie jakiś timer(który w miarę często się wykonuje) to przy okazji w jego obsłudze umieszczam obsługę takiej zmiennej w sytuacji wykrycia wciśnięcia przycisku i INT0 odstawiam w niepamięć, bo w 'pojedynkę' jego działanie bywa błędne.

Andrews pisałeś:
Cytuj:
// lepiej najpierw włączyć podciąganie
PORTD |= (1<<PD2);
// dopiero później włączyć zezwolenie na przerwanie
// (można nawet dać kilka NOP opóźnienia)
GICR |= (1<<INT0);

//lcd init

sei();


W jakim celu, skoro przerwania załączasz dopiero później?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 17:45 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

MateuszS napisał(a):
No tak, z delayami/timerami/sprzętowym debouncingiem to będzie śmigać. Zastawiałem się, czy istnieje sposób np. na tą przykładową inkrementacje zmiennej bez użycia wymienionych możliwości.

Problem drgań styków znany jest praktycznie od początku powstania elektroniki cyfrowej i (o ile wiem) do dzisiaj nie znaleziono sposobu na ich eliminację "bez użycia wymienionych możliwości" (choć mogę się mylić). Myślę, że człowiek, który taki sposób by znalazł, ma szansę zarobić ogromne pieniądze, o ile nikt wcześniej nie okradnie go z pomysłu (myślę, że każdy się domyśli, o kogo chodzi).

Wprawdzie znam rozwiązanie bez opóźnień, na przerzutniku RS, ale wymaga ono z kolei styku przełącznego (czyli potrzebne by też były zapewne dwa piny mikrokontrolera), ale osobiście nie spotkałem się, aby ktoś w technice mikroprocesorowej takie rozwiązanie stosował.

MateuszS napisał(a):
Andrews pisałeś:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W jakim celu, skoro przerwania załączasz dopiero później?

Masz rację, trochę się rozpędziłem. Zdecydowanie częściej stosuje się przerwania wyzwalane zboczem i wtedy kolejność ma znaczenie. W tym przypadku faktycznie kolejność może być dowolna.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 17:48 
Offline
Użytkownik
Avatar użytkownika

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

Bo tak naprawdę to, jak już pisałem, przerwanie tylko do wybudzenia, a dalsza obsługa przycisku w pętli głównej programu. Co innego gdybyś zaliczał jakieś wyższe częstotliwości ze stabilnym zboczem wtedy jak najbardziej kod można umieścić w przerwaniu.
I swoją drogą nie rozumiem dlaczego tak panicznie boisz się użyć timera do wspomagania całego procesu??

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 18:43 
Offline
Nowy

Dołączył(a): 09 lip 2018
Posty: 12
Pomógł: 0

Nie boje się, nie boję :D Dotychczas właśnie z nich korzystałem ale chciałem się upewnić, czy nie ma innej drogi. Dzięki za udzielone odpowiedzi ;)

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

Możesz to wyjaśnić, bo wydaje mi się, że kolejność nie ma znaczenia dla żadnego ze sposobów wyzwalania, jeżeli instrukcja sei(); znajduje się po inicjalizacji pinu i załączeniu INT0.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 19:37 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Tak jak napisałem, chciałem przy okazji coś sprostować, potraktowałem to jako temat poboczny i się po prostu nad tym nie zastanowiłem dokładnie. Chodziło mi raczej o kolejność podciągania i przełączenia bitów Input Sense Control w rejestrze MCUCR. Ich zmiana z "low level" na "edge" w sytuacji, kiedy pin INT jest w stanie nieustalonym (wejście niepodciągnięte do żadnego potencjału) z dużym prawdopodobieństwem może spowodować ustawienie flagi tego przerwania w efekcie czego po włączeniu zezwolenia na nie (czy też włączenie globalne przerwań) następuje niezamierzone wejście w procedurę jego obsługi. Zachowanie odpowiedniej kolejności może przed tym uchronić. Ewentualnie można przed włączeniem przerwań wyzerować tę flagę.

Pamiętałem, że w jakimś projekcie miałem z tym problem, tylko nie pamiętałem dokładnie. Ostatecznie i tak doszedłem do wniosku, że przed zezwoleniem na przerwanie zewnętrzne wyzwalane zboczem i tak najlepiej wyzerować jego flagę (tak dla pewności), chyba że to nie stanowi problemu. Teraz pisząc odpowiedź coś mi tam zaświtało, poprawiłem na szybko i stąd to zamieszanie.

Niemniej brawa za czujność i dociekliwość. Mimo tego, że postawiłeś mnie tu do kąta, lubię odpowiadać ludziom, którzy czytają uważnie i analizują odpowiedzi, bo to raczej niezbyt częste zjawisko. Myślę, że każdemu zdarza się pomylić. Dzięki takim dociekaniom można ewentualnie skorygować pewne błędy czy nieścisłości.

Mam nadzieję, że tym razem będziesz usatysfakcjonowany ;) A może - zachęcony pochwałą - będziesz mnie nadal egzaminował... :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2018, o 21:42 
Offline
Nowy

Dołączył(a): 09 lip 2018
Posty: 12
Pomógł: 0

Pewnie, że jestem usatysfakcjonowany ;) Dzięki za wyjaśnienia i poświęcony czas - sporo się dowiedziałem ;]



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

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