Warunek w if nie będzie spełniony bo raczej te kilka instrukcji w przerwaniu nie bedzie się wykonywać 20ms. Czas wykonywania tego ISR nie ma nic wspólnego z wartością _debounce_timer w momencie porównania.
Nie będę sie rozpisywał: Dim T1 As Single , T2 As Integer ... T1 = -123.50 T2 = T1 'bez części ułamkowej T2 = Round(T1) 'zaokrągli zgodnie z prawami arytmetyki ... Pozdrawiam Piotrek
Brutus_gsm : Radził bym Ci przeprojektować trochę ten kod: ustawianie flagi I (sei()) w przerwaniu jest największym błędem (chyba, że wiesz co robisz oraz to kontrolujesz). Przed wyjściem z funkcji przerwania ustawiasz flagę I (jeśli przyjdą kolejne przerwania, pojawią się kolejne wywołania i przepełni się stos - błąd), po czym usypiasz procesor (zakładając...
Moim zdadniem najlepiej jest w przerwaniach ustawiać flagi zezwalające na wykonanie danej czynności, np. odświerzenie ekranu, a samą czynność wykonywać w programie głównym. Jest z tego taki zysk, że przerwania, które jednak blokują wykonywanie się kodu, wykonują się szybko. Program główny, który może być przerywany wykonuje się w chwilach wolnych. Oczywiście,...
W trakcie obsługi przerwania przychodzi następne i czeka w kolejce. I czekać będzie nie ważne jak bardzo zostanie "przeciągnięte" przerwanie.
Oczywiście to co pokazuję jest w C ale jestem otwarty na pomoc i propozycję rozwiązań mojego problemu z tego względu jest napisane powyżej, w moim poprzednim poście "...C/C++...". C czy C++ nie jest mi straszne i tym bardziej obce. Drgania wyeliminowałem jak na razie sprzętowo i tak zgodzę się odczyt odczyt przycisku w przerwaniu. Podpowiedzcie mi...
Pomyśl, ile przerwań i w jakich odstępach czasu wygeneruje jedno naciśnięcie przycisku? Wiesz to? Bo ja nie wiem, wiem tylko, że na ogół będzie ich więcej niż jedno. W jakim celu miałbyś czekać w obsłudze tego przerwania? przykład obsługi przycisku w przerwaniu timera masz tu: http://mikrokontrolery.blogspot.com/2011...
a1: in r17,pina ; cpse r17,r31; czy moze byc "cp" ? ret ; dec r23 brne a1 Zmień na: a1: in r17,pina ; cpse r17,r31; czy moze byc "cp" ? jmp DALEJ ; ;Tutaj daj wszystkie POP z końca procedury "delay" RET DALEJ: dec r23 brne a1 Dawno nie pisałem w ASM, więc może być błąd ... ale pokazałem algorytm...
A nie widzę nigdzie innego użycia przerwań niż tylko przy wciśnięciu klawisza klawiaturki. Przerwania zewnętrzne mają wyjątkowo ograniczone zastosowania. Nadają się np. do tego, żeby obsługiwać sygnały od innych układów scalonych, świadczące o tym że dany układ ma coś ciekawego do powiedzenia. Do przycisków nadają się wyjątkowo słabo, bo żeby to działało,...
Jakoś nie widzę żebyś tu korzystał z przerwania od Timera... Bo nie musisz ;p mogłbyś pokazać jakiś przykład obsługi przycisku w przerwaniu timera ? Nawet jakiś URL do innego projektu. Więc chyba oczywistym jest że ten fragment kodu należy umieścić w przerwaniu od Timera.
Piszesz, że masz doświadczenie z LCD i Atmega8. Więc mogę Ci pomóc to zrobić.
Co do Twojego problemu deklaracji typu układu - typ ten zdefiniowany jest w Makefile (MD, HD, CL, ...) Jeśli używasz przerwań, to ustaw jakąś wielkość stosu dla przerwań w skrypcie linkera (domyślnie jest 0, bo nie ma przerwań w przykładach). 4\/3!!
Zapoznaj się z [url=http://mikrokontrolery.blogspot.com... dedykowanym dla STM32.
Nie uzyskałem odpowiedzi. Temat zarzuciłem na boczny tor. Pozdrawiam
A liczenie Ci samo idzie bo umieściłeś kod "liczący" w jakimś przerwaniu: SIGNAL(SIG_OVERFLOW0) { licz++; } Nie wiem co to jest, ale wygląda jak przerwanie od Timera0. Dodano po 2 Już pomijam fakt że obsługa przycisków w przerwaniu (bez żadnego odkłócania, bo samo wykorzystanie przerwania to może jeszcze nie jest tragedia) jest trochę...
boohoo -> przecież jeśli masz AVR-GCC to masz taki folder: \WinAVR-20080610\avr\include\avr zajrzyj tam sobie, masz tam definicje wszystkiego czego chcesz i do każdego procka w tym twojego iotn2313.h poza tym ten twój kod ładnie się kompiluje i bez żadnych ostrzeżeń jeśli zrobisz tak: #include <avr\io.h> #include <util\delay.h> //#include...
Takie podejście jest fatalne. Wyłączaj przerwanie od przycisku w obsłudze tego przerwania. Włączaj je ponownie w przerwaniu timera. W praktycznie każdym urządzeniu potrzebujesz przerwania timera. Na czas uśpienia może go nie być, ale w czasie aktywności jest niezbędne. Kiedy urządzenie nie śpi, przerwanie timera odlicza wszystkie czasy i w odpowiednich...
Można też zrobić sobie ładną strukturę do przechowywania danych o przycisku, a potem z tych struktur utworzyć tablicę i dodatkowo tablice wskaźników na funkcje dla każdej akcji każdego przycisku i mamy wszystko rozwiązane w eleganckiej i szybkiej pętli w przerwaniu.
Jak wyrzucisz z przerwania obsługę przycisków- to będzie krótkie. Jak masz przerwanie co 10ms to daj flaga++ kasowanie w głównej pętli co 3-4 przerwania- 30-40ms. w linkach -nie pamiętam. Ale niektórzy zamiast napisać "wykorzystując przerwanie" piszą "w przerwaniu" Ja napisałem tak: "Wystarczy w przerwaniu ustawiać jeszcze jakąś flagę. Potem w głównej...
if((PIND & _BV(PD2)) PORTB |= _BV(PB2); else PORTB &=~_BV(PB2); Jak to ewentualnie zapisać w jednej linii to już sam pomyśl.
"Zbyt dużo" - to może być 200 linii, ale nie 10 czy dwie, jak w Twoim przypadku. Ja bym raczej radził nie pakować kodu do pętli głównej, o ile potrafisz zrobić obsługę DS18xx w przerwaniu.
Powyżej podałem przykład co powinno się znajdować w obsłudze przerwania od timera. Natomiast same przyciski możesz sprawdzać w pętli while() jeżeli nie chcesz angażować do tego osobnego przerwania.
Witam, Kiedyś znalazłem gdzieś na necie takie rozwiązanie problemu małej ilości przerwań zewnętrznych w atmega16. Czy może ktoś wytłumaczyć dokładniej działanie tego tworu ? Chodzi mi głównie o techniczną sprawę i sens użycia tych diod. Te diody, łącznie z pull-up resistorem tworza bramkę OR. Prawdopodobnie autor tego tworu wykorzystał wew. programowe...
Nie każę stosować timera. Tylko takie użycie delay powoduje dość sporą jego niedokładność. Jeżeli mamy stałe skoki czasu to można to zrobić tak: [syntax=c]uint8_t delayTimeInSeconds; void delay() { int i; for (i = 0; i < delayTimeInSeconds; i++) { delay(1000); } }[/syntax] I obsługę przerwania/przycisku zrealizować tak: [syntax=c]#define MAX_DELAY_TIME_IN_SECONDS...
Podejrzewam, że te Waitms w obsłudze przycisków blokują wyświetlanie. Spróbuj je do testu usunąć. Oczywiście przyciski nie będą wtedy działać poprawnie, ale sprawdzisz wyświetlanie. Obsługa wyświetlania powinna być przeniesiona do obsługi przerwania, ale to już większa przeróbka programu. To przygasanie tak bardzo przeszkadza?
Witam, Chcę obsłużyć przycisk USER za pomocą przerwania. Myślę, że wcale tego nie chcesz. Przycisk obsługiwany przez przerwanie nadaje się do jednego - do wybudzania procesora z głębokiego uśpienia. Do wszystkich innych celów dużo łatwiej jest użyć do obsługi przycisków przerwania timera.
Skoro upierasz się na przerwanie od przycisku, to w obsłudze przerwaniu musisz zablokować to przerwanie i uruchomić timer, od którego przerwanie odblokuje przerwanie przycisku - i trzeba to zrobić dla każdego przycisku oddzielnie. Moim zdaniem zawsze łatwiej wrzucić do obsługi przerwania timera dwie linijki kodu, które załatwią obsługę przycisku, niż...
Jest taka jedna święta zasada: w przerwaniu się NIE CZEKA. Na nic! Zgłaszanie przerwania od przycisku w zasadzie służy tylko do jednego - budzenia systemu z głębokiego uśpienia, co u Ciebie nie ma zastosowania. W każdym innym przypadku prawidłowa obsługa przerwania od przycisku jest znacznie bardziej złożona, niż obsługa przycisków w przerwaniu timera....
Nie wiem w jakim celu wyłączasz timer na czas obsługi przycisku. Procedura obsługi przerwania powinna być jak najkrótsza. Niepotrzebnie wywołujesz za każdym razem funkcję setNum(). Warto byłoby ją wyrzucić do pętli głównej i wykonywać tylko w momencie zmiany prędkości. Utwórz sobie tablicę trzech elementów, w których przechowywał będziesz kolejne cyfry....
Zafiksowany Kamyczku. Wykrycie naciśnięcia przecisku w przerwaniu timera - to 2 linijki kodu w C, wykonywane 50 razy na sekundę. Ty proponujesz rozwiązanie wymagające przerwania od przycisku, w którym to przerwaniu należy zablokować to przerwanie, ustawić znacznik/timer programowy, a następnie w przerwaniu timera odblokować przerwanie przycisku. Mamy...
Rozwiązaniem jest obsługa przycisku na przerwaniu bądź to INT bądź PCINT
Musiałbyś obsługiwać sterowanie przynajmniej jednego silnika w przerwaniu, bo w przeciwnym wypadku procedury te będą się zakłócać. Spróbuj napisać program z wykorzystaniem zewnętrznych linii przerwań, tak, aby przy naciśnięciu przycisku program wykonywał skok do odpowiedniej funkcji obsługi przerwania :]
Witam Czy i jak można umieścić procedurę obsługi przerwania w innym pliku niż plik z główną funkcją programu "main(){}". procedura obsługi przerwania będzie mi potrzebna do obsługi 4 przycisków. Przerwanie będzie od Timera0. Procedurę obsługi przerwania chcę umieścić w pliku w którym się znajduje funkcja obsługi przycisków. Czy jeśli umieszczę procedurę...
(at)Piotrus_999 Te tajemnicze biblioteki są dostępne w internecie od ponad 10 lat bo sam używałem ich do pracy magisterskiej. Użycie google pozwoli Ci rozwikłać ta zagadkę. (at)Soberro Według mnie masz problem z problem z obsługą przerwań od przycisku. Byćmoże robisz tam coś czego nie powinieneś. Bez kodu nie da się więcej powiedzieć. Powinieneś zrezygnować...
Umieść obsługę przycisków w przerwaniu timera.
Problem jest prozaiczny. Przycisk obsługujesz czy on tego chce czy nie. Polecam rozwiązać obsługę przycisku w przerwaniu wtedy będzie działało.
Proponował bym samemu usiąść i spróbować cos napisać (bez obrazy). Tak najszybciej się nauczysz. Podzielić projekt na małe fragmenty które łatwo zrealizować: komunikacja z lcd, obsługa przycisku, obsługa przerwań do zliczania. Dla tak prostego projektu to i Baskom w zupełności wystarczy.
Najłatwiej to zrób tak: Wszystkie przyciski podłacz do pinów procka, daj podciągnięcie za pomocą rezystorów wewnętrznych ,oprócz tego za pomocą diod zsumuj te sygnały ,a nastęnie zsumowane sygnały daj na wejście przerwania np INT0. Musisz to zrobić tak że przyciśnięcie któregokolwiek przycisku spowoduje zmiane (spadek napięcia ) na wejściu przerwania...
Poza tym zarówno autor jak i pozostałe przedstawione tu przykłady nie adresują stanów spoczynkowych portów wejściowych Tyle, że raczej normalnym jest ustalanie stanów spoczynkowych przy użyciu np. rezystorów 10k do masy bądź uruchamiając wewnętrzne rezystory podciągające przy użyciu INPUT_PULLUP. A czy autor to zrobił - tego już nie wiemy. Aby eliminować...
Zrób obsługę przycisków w przerwaniu obsługującym multipleksowanie wyświetlaczy. Powinno się udać.
Równolegle z przyciskiem podłącz kondensator 100nF. Jak nie pomoże to większy. W procedurze obsługi przerwania możesz dać opóźnienie kilka - kilkanaście ms, też pomaga, ale jeśli nie może to być zrobione w ten sposób to tylko kondensator + wymiana przycisku na jakiś lepszy. Wszystkie te sposoby można łączyć ;)
Można spróbować z jednym timerem. Ale wtedy było by więcej zmian w programie. Dlatego, że co każde przerwanie (co 100ms) wykonywała by się obsługa przycisku a co 10 przerwań także obsługa odczytania alarmów. Czyli istniejące teraz dwa podprogramy trzeba by było połączyć w jedną obsługę przerwania od timera0 lub timera1. Jeśli zaś program ma nie korzystać...
Obsługa przycisku w przerwaniu jest niezbyt wskazana. Owszem przycisk uruchomi przerwanie ale do tego należy również doliczyć drgania styków. Jak wiadomo opóźnienia w przerwaniu to niepożądane zjawisko. Dobrym sposobem jest dodanie kondensatora który będzie się ładował i rozładowywał tym samym eliminując drgania styków.
2. Takie ogólne pytanie gdzie w kodzie należy umieszczać obsługę przycisków, pomiar czasu, pomiar temperatury, obliczenia (przerwania czy w pętli while(1) ) czy może jeszcze gdzieś indziej ? Z jednej strony w wielu postach jest napisane aby w przerwaniach było jak najmniej instrukcji z drugiej strony gdzieś to wszystko trzeba przetworzyć. W przerwaniu...
Nie pokazałeś całości, a problem może właśnie tkwić w rzeczach, których nie pokazałeś. Ale kilka uwag - po pierwsze przyciski drgają, w efekcie nie dostajesz jednego przerwania tylko dziesiątki. Twoja procedura obsługi to eliminuje, bo jest strasznie długa, ale i tak co najmniej 2 razy zostanie wywołana. Przyciski jak rozumiem masz podciągnięte rezystorem?...
W pętli głównej obsługuj przycisk. Przynajmniej mnie zawsze uczono, żeby unikać obsługi mechanicznych przycisków przez przerwania, aczkolwiek Twoje rozwiązanie jak najbardziej będzie działać prawidłowo.
Jako przykład podam program dla 8051 napisany przeze mnie w asemblerze realizujący funkcje zegara: - obsługa 4 wyświetlaczy 7seg poprzez rejestry szeregowe 74595 - obsługa 5 przycisków przez rejestry 74165 - obsługa przerwania do generowania dźwięku "piknięcia" przy naciskaniu przycisków, czasu lampki i synchronizacji DCF, wszystko na jednym liczniku...
W takim razie obsługa wyświetlacza za pomocą przycisku jest niemożliwa? Czy program składa się tylko z przerwań? Nic innego już nie ma? PS Oczywiście często tak się pisze że nie ma nic poza przerwaniami ale chyba to nie o to chodzi.
To nie do końca odpowiedź na tytułowy problem, ale: - obsługa przycisku w przerwaniu jest bez sensu - w żaden sposób nie eliminujesz drgań styków. Wpisz w wyszukiwarce hasło keyhist - znajdziesz post kolegi BlueDraco z przykładowym kodem obsługującym przyciski w przerwaniu timera. - procedura obsługi przerwania, w której jedynie ustawiasz flagę też...
Nic sobie nie robi z naciskania guzika bo właśnie obsługuje przerwanie. Ja bym to zrobił w ten sposób. Przerwanie od czujki uruchamia jakiś timer i kończy się obsługa przerwania. Timer odmierza czas i po jego upłynięciu sprawdza jakąś zmienną i w zależności od niej uruchamia alarm bądź nie. I tak jeśli przed przyjściem przerwania z tego timera naciśnięty...
Sciślej rzecz biorąc, likwidacja drżenia styków zazwyczaj jest realizowana na przerwaniach, jeśli nie, to korzysta ze zmiennych modyfikowanych w przerwaniu. Z tego powodu w przerwaniu (np od wejścia INT) nie można takiej funkcji użyć. Na ARM jest na to proste lekarstwo zwane priorytetami przerwań, na AVR (poza najnowszymi) prostego rozwiązania nie ma....
Problem polega na tym co zawsze, czyli na drganiu styków, które to sprawia, że pomysł użycia przerwań do obsługi przycisków po prostu nie ma prawa działać.
Obsługę przycisków też zrób w przerwaniu timera, jak radzi BlueDarco - nie ma sensu obsługa przerwania zewnętrznego, bo zniszczy Cię drganie styków...
Poczytaj o przerwaniach.
Możesz dać przyciski w przerwania.
Nie rozumiem konstrukcji tego programu, ale żeby coś takiego mogło sensownie działać, to nie można stosować czekania, jeśli nie ma obsługi przerwań od wciśnięcia przycisku, a i wtedy pewnie potrzebna będzie możliwość zmiany czasu czekania w procedurze obsługi przerwania - np. wciśnięto przycisk, włączyło się zasilanie modułu, uruchomiło czekanie przez...
Witam, pomijając kod, to Twój pomysł skąd się wziął? Z grubsza to masz 3 możliwości: - zliczasz timerem zmiany na pinie z pominięciem drgań - mierzysz czas między stanami wysokimi za pomocą Input Capture i zliczasz tylko te z minimalnym założonym odstępem - robisz normalną obsługę przycisku (w przerwaniu timera) i liczysz wciśnięcia. Nie używasz do...
A ustawienie stosu to gdzie ? Kodu w obrazkach się nie wstawia, tylko w tagach code] ] Kod w ogóle to masakra, użyj preprocesora... Co to za "delaje" w przerwaniu ? Obsługa przycisków przez przerwanie to mi bascomem zalatuje...
Sugerujesz wywołanie jakiegoś innego timera? Możesz na początek użyć biblioteki [url=https://github.com/PaulStoffregen/T... do generowania i obsługi przerwań jeżeli chcesz realizować obsługę serw lub przycisków w przerwaniach.
Poprzez przerwanie. Podłączenie przycisków do wyprowadzeń INT0 i INT1. Po naciśnięciu przycisku następuje obsługa przerwania. Przerwanie ma na celu: wygenerowanie krótkiego impulsu zera logicznego niezależnie czy przycisk trzymamy nadal czy nie. Grzegorz.
Błędów całe mnóstwo. 1. Nie robi się przerwań od przycisków. Zrób przerwanie timera np. 100 Hz, w nim sprawdzaj stany przycisków. 2. __attribute__ ((interrupt)) jest zbędne. 3. Znacznik przerwania kasuje się na początku, nie na końcu obsługi przerwania. 4. Do zmiany stanu linii portów służą rejestry BSRR- jeden zapis zmienia stany dowolnie wybranych...
Kondensatory przy rezonatorze należy podłączyć do GND a nie do Vcc. Oj, ale babol - przegapiłem go :) Dodam jeszcze, że to nadawanie 2 razy jest efektem drgań styków (jak się ich pozbyć podałem Ci link w poprzednim poście). Twoje przerwania długo trwają. Gdy styk drga, to wywoła pierwsze przerwanie, a po rozpoczęciu jego obsługi zerowana jest flaga...
w ten sposob pozbylem sie delaya w ogole Jeżeli nie masz żadnych delay w loop() to tym bardziej możesz przenieść obsługę przycisku w to miejsce. Proponuję użycie EasyButton: https://github.com/evert-arias/EasyButto... Funkcja read() z tej biblioteki też nie wprowadza żadnych delay(), a detekcję naciśnięcia przycisku można sobie elegancko podpiąć pod...
Nim zdążysz pomyśleć, kolejne przerwania się pojawiają i kończą, tak nawet około 300 na sekundę... ;) Użycie przerwań zewnetrznych to nienajlepszy pomysł na obsługe przycisku. Wystarczy algorytm w pętli + dobrze przemyślana obsługa przerwania timera.
Sprawa dotycząca modbus, powinna być wykonywana co każde przejście pętli, bez żadnych opóźnień ponieważ w module mamy obsługę 8 wejść i fatek musi o tym wiedzieć bardzo szybko, aby wykonał odpowiednią procedurą obsługującą dany przycisk. Powinieneś więc w pierwszej kolejności przenieść obsługę modbus do przerwania, tylko w ten sposób będziesz miał...
Ja nie chcę blokować przerwań bo w domu będę miał moduł na około 30 różnego rodzaju włączników światła - w sensie tyle wejść. I jak ktoś w tym samym czasie wciśnie inny przycisk to zablokowanie obsługi przerwań spowoduje, że przegapię rozkaz z innego przycisku. Dlatego pomysł mam taki aby pod każdy przycisk podpiąć układ formowania impulsu który będzie...
jak przyciskam i trzymam to KEY1 powoduje znaczne zwolnienie pracy licznika można to jakoś ominąć aby on liczył stabilnie gdy KEY1 jest wciśnięty cały czas ? Dzieje się tak za sprawą _delay_ms(80); w funkcji uint8_t klawisz_wcisniety(uint8_t klawisz) Aby to zlikwidować skorzystaj i innej metody eliminacji drgań styków a najlepiej umieść obsługę przycisków...
Może to zły kierunek podpowiedzi: Tak napisany program powoduje przerwanie na każde drganie przycisku podczas jego naciśnięcia. Może w tym jest przyczyna? Aby to sprawdzić albo zmień program albo dodaj kondensator do przycisku + zmień wywołanie INT1 na wywołanie poziomem nie zboczem.
Kolego ten procesor ma 64 bajty pamięci RAM, którą jeszcze współdzieli ze stosem. A Ty zarezerwowałeś tylko na wstępie 63 bajty pod zmienne. Na dodatek pod zmienne bajtowe zarezerwowałeś inty. O zmiennych w procedurach nie wspomnę. Po drugie, skąd Ci przyszło do głowy, że Timer 0 będzie działać w głębokim uśpieniu? Jeszcze tak na marginesie. Czy nie...
Poczytaj kartę katalogową DS18B20 ! W kominku potrzebujesz odczytu temperatury z dokładnością około 0.1°C , a nie wystarczyłoby do 1° C. Poza tym użyj obsługi klawiatury w przerwaniu.
No widzę, że kolega voytaschec fajnie to opisał. Ja to mniej więcej też tak robię, a na pewno też tak dzielę kod na przerwania i main. Co do czasu wykonywania przerwania to nie będzie trwało 100ms. Tylko dużo, dużo, krócej bo tylko musi się wykonać przypisanie jednej zmiennej + wejście i wyjście z obsługi przerwania. Zatem przerwanie będzie trwało pewnie...
Przecież wiesz, że delay w przerwaniu nie powinieneś stosować to dlaczego ponownie je tam wstawiasz? Przyjmij wreszcie postawę, że delay jest be i przestań go używać, oraz że do odliczania odcinków czasowych należy wykorzystywać timery. Patrząc na to co zaproponowałeś powyżej nie wiesz natomiast, że: - wchodząc w przerwanie przerwania są blokowane (flaga...
witam wszystkich mam problem z obsługą przerwań chodzi o to że procesor generuje przerwania z wejść PCINT8 i 9 reagując na przyciski jakie mam na tych pinach . obsługa przycisków nie jest w przerwaniach tylko w pętli głównej programu a przerwania jakie wykorzystuje to tylko timer1. jak wyłączyć wszystkie pozostałe przerwania ? kawałek kodu dotyczący...
A jak ci powiem że jeżeli wciskam przycisk co pół minuty to mi śmiga całość ?... i to bez pomyłki ? Jak masz podłączony ten przycisk?
Nie miałem na myśli obsługi przycisku w przerwaniu tylko o przycisk, który wykonuje przerwanie w którym jest wysyłanie komendy lub odbieranie (SLAVE). Nie wiem, czy dobrze to rozumiem, ale na wszelki wypadek. Nie wpadnij czasem na rozwiązanie, aby przycisk generował przerwanie. To raczej kiepskie, ale jeśli już, to pamiętaj o debouncingu przycisku...
Jak nie zostaje wyłączone... Przecież podczas wykonywania przerwania inne są automatycznie blokowane, właśnie poprzez wyzerowanie globalnej obsługi przerwań - tak więc nie ma nawet potrzeby stosowania specjalnych zabiegów (cli) w tym celu, to właśnie żeby włączyć stosuje się sei w przypadku, gdy trzeba odblokować przerwanie tak, aby możliwe było jego...
Witam, zmodyfikuj swój program: http://www.elektroda.pl/rtvforum/topic33... W programie obsługi przerwania timera dopisz: Badanie stanu przycisku z uwzględnieniem drgań styków. Obsługę programowego timera liczącego przerwania pomiędzy przyciśnięciami przycisku, w zależności od długości słowa tego timera możesz mierzyć czasy rzędu minut, godzin,...
Musisz chyba użyć timera ustawionego tak aby przerwanie z niego następowało później niż czas między kolejnymi wysyłanymi paczkami z pilota. Z tego co pamiętam to pilot w standardzie RC5 wysyła przy stale wciśniętym klawiszu kod co jakieś 89ms. Jeśli używasz przerwań do czytania kodu to dajesz mu wyższy priorytet niż timerowi. W timerze zerujesz pin...
Ja bym to zrobił tak: Poświęć jeden Timer na obsługę przycisków w procedurze przerwania. Ustaw czas np. na 1ms. Do każdego przycisku daj osobną zmienną która, jeżeli przycisk będzie przyciśnięty będzie się zwiększać, jeżeli nie zerować. I tak otrzymasz dane nt. jak długo jaki przycisk jest wciśnięty no i czy 2 czy więcej są wduszone..
Sprawdź, czy w module startup masz w ogóle w tablicy wyjątków nazwę procedury obsługi tego przerwania. Kiedy ostatni raz bawiłem się AC6, generował puste tablice wyjątków. Po drugie, przerwania portów nie służą do obsługi przycisków - jedno wciśnięcie przycisku może generować np. 2 przerwania, i wtedy stan diody się nie zmieni.
Do obsługi przycisków NIE używa się przerwań zmiany stanu, a przerwania timera (w którym programowo testuje się stan przycisków). http://mikrokontrolery.blogspot.com/2011...
Impulsator nie do końca działa elegancko z powodu kompromisu z przyciskami. Impulsator i przyciski działają jednocześnie i to jest OK w miarę. To znaczy, że masz źle napisany program. Obsługa enkodera + przycisków w przerwaniu timera powoduje, że nic się nie może gryźć i wszystko powinno płynnie działać. Te impulsatory to napradę fajna sprawa i niesamowicie...
Przycisk jest sprzętowo pozbawiony drgań styków (płytka STM32F3Discovery) Doprawdy? Czyżbyś dołożył coś do płytki DISCOVERY? Mniej więcej co dwa tygodnie piszemy tutaj komuś, że do obsługi przycisków nie używa się przerwań od portów.
Od każdej reguły są wyjątki. D wybudzania z głębokiego uśpienia możesz użyć przerwań od przycisków, tylko wtedy musisz również użyć przerwania timera i obsługa przycisków z 2 linii na pojedynczy przycisk rośnie do jakichś15..20. Masz też timer LPTIM, pracujący w trybach głębokiegu uśpienia - do testowania przycisków wystarczy jakieś 20 Hz.
Konfiguracja dobra. Brakuje jeszcze: pętli głównej, obsługi przerwania i globalnego włączenia przerwań. Load Timer ma inną składnię.
No to na początek zastanów się, co robi procedura obsługi przerwania kiedy przycisk nie jest wciśnięty i jak w związku z tym zachowa się ona kiedy wciżniesz przycisk na krótko, a następnie zwolnisz i tak kilka razy pod rząd.
-te dławiki na AVCC nie są potrzebne - nie korzystasz z ADC (nawet jeśli korzystasz to wymagane są one przy superdokładnych pomiarach), - przez rezystor 1 MOm łączysz do masy osłonę gniazda USB, masy USB i układu łączysz bezpośrednio, - na USB nie ma 3,3V, jest 5V, które ci upali procka. Jeśli zasilasz układ z USB potrzebny jest LDO na 3,3V, - do realizacji...
W życiu bym nie wpadł na to że kompilator zoptymalizuje program, tak że nie będzie działać. Raczej szukałem problemu w moim kodzie i logice działania. W planie procesor ma obsługiwać wyświetlacz, przerwania zewnętrzne (pomiar prędkości maszyny) oraz sterowanie PWM i przekaźnikami. Wracając do tematu powinienem zadeklarować całą strukturę jako volatile...
Wyrzuciłem z procedury przerwania obsługę przycisków, ale po co do tego zmieniać samą procedurę jak przecież zegar czas odlicza. Pozostaje właśnie tylko problem z ustawianiem minut i godzin.
Przerwania są zagnieżdżone,tzn. jestem w przerwaniu od timera, wysyłam wynik z przetwornika do uarta, a potem czekam na przerwanie od przycisku nie wychodząc z przerwania od timera. Gdy wcisnę przycisk to CPU idzie to obsługi przycisku i mam przerwanie zagnieżdżone. Tu nie pomoże żadna wiedza o wielkości stosu. Program trzeba przepisać. A przedtem...
Witam Mam pytanie do osób które "bawiły" się tym zestawem uruchomieniowym. Czy uruchamiał ktoś projekt przykładowy z płyty cd dołączanej przy zakupie - getting-started....? Jest tam bardzo prosta obsługa przerwań od przycisków i timerów, jednak gdy wgrywam ten program to po zwarciu pinu od przycisku program się zatrzymuje i ląduje "w polu". Dziękuję...
DDRD |= 0<<PD2; Czyli "nie zmieniaj wartości DDRD". Bez tej linii będzie działać tak samo, jak z nią. No i oczywiście do obsługi przycisku nigdy nie używamy przerwania zgłaszanego sprzętowo zboczem. Od "nigdy" są dwa wyjątki, ale Twojego przypadku nie dotyczą.
No zrobiłem tak jak napisałeś, ale zadnej zmiany w działaniu to nie wniosło :( po wcisnięciu przycisku nadal program rusza od nowa a nie uruchamia sie obsługa przerywania.
A ja stawiam na błąd w oprogramowaniu - zła obsługa przycisków bez eliminacji zakłóceń, ktśre - jak widać - w tym środowisku występują. Oprócz tego przyjrzałbym się połączeniom przekaźników i zasilaniu płytki mikrokontrolera. Na początek pokaż procedurę obsługi przerwania timera z obsługą przycisków.
Ja robię w ten sposób, ale niestety powoduje to kilku krotne wykonanie danej akcji przy dłuższym przytrzymaniu przycisku i muszę stosować dodatkowe flagi/znaczniki by określić czy (i ile razy) akcja została wykonana. if(bit_is_clear (PINC,PC4)) { delayms(100); <-- eliminacja drgań if (bit_is_clear (PINC,PC4))...
Drobna sugestia, o wiele lepiej jest podłączyć przycisk do którejś z zewnętrznych linii przerwań (INTx) i ustawić wyzwalanie przerwania zboczem opadającym. Wówczas nie musisz ciągle odczytywać stanu portu. Po prostu po naciśnięciu przycisku wywołana zostanie funkcja obsługi przerwania.
A po co 8 pętli do obsługi 4 przycisków? Przerwanie nie przerywa pętli tylko wstrzymuje ją na czas wykonania programu przerwania. Wystarczy jedna pętla główna w której sprawdzasz stan całego portu do którego są podpięte przyciski, wtedy w tej samej chwili masz odczytany stan przycisków. Jak rozumiem z opisu robisz pętle do obsługi każdego przycisku?...
Skonfiguruj port do którego podpięte masz SW1 i SW2 jako wejście z podciągnięciem (jeśli przycisk ściąga do masy). Zamiast wartości AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE użyj AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, w obsłudze przerwania sprawdzaj faktyczny stan przycisku. Na końcu zamień w kolejność 2 ostanie linijki, najpierw zerowanie ew. przerwań, następnie...
Proponuję zrezygnować z obsługi klawiszy poprzez INTX, gdyż jest przeznaczone dla stabilnych i krytycznych czasowo sygnałów, a przyciśnięcie przycisku to ruletka impulsów, zwłaszcza, gdy już jest sporo czasu używany. Klawisze najlepiej sprawdzać cyklicznie, np. w procedurze obsługi przerwania, przypisując mu jakiś jednobajtowy kod i tworząc ogólny dekrementowany...
Jeśli dasz dodatkowo pin do identyfikacji z którego urządzenia przyszło przerwanie i w obsłudze przerwania sprawdzisz ten pin to będzie ok.
sprawdzanie przycisku przerwaniu obsługa klawiatury przerwaniu bascom obsługa przycisku
zapalać check mercedes otwieranie centralnego zamka awaryjne tulejki zaciskowe
Piaggio Zip, Typhoon – napięcie cewki zapłonowej statora AC-CDI, pomiar i typowe wartości Zasilacz 24V do hulajnogi Kawasaki KX-FS5.5 – parametry, dobór, wtyk 5,5x2,1 mm, SLA 4,5Ah