W przerwaniu przycisku blokujesz przerwanie przycisku i uruchamiasz timer sterujący wyświetlaniem, który kiedyś tam, gasząc wyświetlacz, włącza przerwanie przycisku. To "czekanie 20 ms" i powtórne sprawdzanie przycisku to jakaś magia i nie ma ani trochę sensu.
Przerwanie od INT0 powinno aktywować przerwania od timera, które co 50ms będą zmieniać stan portu c: INT0: - blokuj przerwania INT0 - licznik sekwencji na portc = 0 - aktywuj przerwanie timera INT TIMERA: - switch (licznik sekwencji) ..... w ostatnik case czy default: 1) blokuj przerwania timera 2) kasuj flagę INT0 3) włącz przerwania int0
Uśpiłeś procesor w przerwaniu. W przerwaniu jak wiadomo są blokowane przerwania więc kolejne przerwanie wybudzające już nie wystąpi. Stąd Twój problem. sleep_cpu nie może znajdować się w obsłudze przerwania.
Nie pamiętam, jak działa makro sleep_mode(); ale przecież przechodzisz do trybu uśpienia w przerwaniu od timera a jak wiadomo wejście w dowolną procedurę obsługi przerwania blokuje globalne zezwolenie na obsługę przerwań, wiec prawdopodobnie w chwili uśpienia skutecznie blokujesz także przerwanie zewnętrzne, przez co nie możesz później wzbudzić procesora...
Pamiętaj że sama transmisja też swoje trwa :) a poza tym nie pokazałeś funkcji printf (może ona bawi się w _delay_ms() ?) Zauważ również że przerwanie występuje niezależnie od transmisji, może dochodzić do takiej sytuacji ze raz przerwanie zmienić Ci wartość zmiennej tuż przed transmisją a raz tuż po niej i to spowoduje Twoje opóźnienia. Spróbuj blokować...
Biblioteka Adafruit_NeoPixel blokuje przerwania więc Możesz mieć problem z obsługą klawiatury podczas jej działania.
Sama idea co najmniej dziwna, plus brak blokowania przerwania. A tak swoją drogą po co angażujesz timer T0 skoro go nie używasz? I jak ma się wywołać przerwanie od T1 skoro nigdzie go nie skonfigurowałeś?
No to mamy winowajcę. Robienie czegokolwiek długotrwałego w przerwaniu to chory pomysł, ale problem polega na tym, że procedury obsługi LCD nie blokują przerwań na czas wykonywania operacji na LCD - dołóż blokowanie i odblokowanie przerwań na prymitywach LCD i zadziała (jako proteza). żeby zadziałało dobrze - przenieś obsługę 1Wire do pętli głównej.
Domyślnie Atmel Studio w czasie debugowania blokuje przerwania podczas śledzenia krok po kroku, co ma za zadanie ułatwić śledzenie funkcji. Dodatkowo przerwanie od USART wystąpi bardzo późno - dopiero po wysłaniu bajta, co może trwać nawet kilka tysięcy cykli CPU.
Jednym z wielu błędów w Twoim kodzie jest przetwarzanie w pętli głównej zmiennych adc1 i adc2 zapisywanych w przerwaniu timera. To są zmienne 16-bitowe, więc pomiędzy odczytem jednej i drugiej połówki przerwanie timera może zmienić wartość zmiennej. Blokuj przerwania na czas ich odczytu, czytaj je w pętli głównej raz, skopiuj do innej zmiennej roboczej...
To zależy co masz na myśli, delay też nie blokuje przerwań, ale jest uznawana za funkcję blokującą. Jak w loop wywołasz pulseln() i będziesz będziesz mierzył impuls 500ms to w tym czasie żadna funkcja z loop się nie wykona, tak samo jak z delay().
Nie ma to jak stworzyć sobie problem a potem dziwaczne metody rozwiązania. Trochę programów na Cortexy napisałem, i nigdy nie miałem potrzeby zapamiętywania stanu przerwań przy ich chwilowym blokowaniu, i samo blokowanie bardzo rzadko jest potrzebne. Nie znaczy to oczywiście, że taka potrzeba w ogóle nie występuje, ale poza bebechami RTOS występuje...
Jeżeli komuś zależy na szybkim "machaniu" pinami na AVR z Arduino HAL, to polecam bibliotekę [url=https://pololu.github.io/fastgpio-a... Ustawianie i czytanie pinów odbywa się bez blokowania przerwań i zdecydowanie szybciej.
O to mi chodziło - czyli printf nie blokuje przerwań na czas wysyłki. To standardowa funkcja języka C, więc nie może mieć nic wspólnego z przerwaniami, bo te są różne w różnych mikrokontrolerach. Istotne jest jednak miejsce jej użycia, więc nadal prosimy o materiały, bo nie ma jak Ci pomóc.
Wyrzuc pojemność, daj dwie bramki szeregowo (żeby ujemny sygnał na fototranzyztorze dawał ujemny na uP) i zliczaj nie na T0 tylko na INT, w obsłudze przerwania zliczaj programowo. Eliminację kilku po sobie następujących lini zrób progarmowo w taki sposób że pierwsze zbocze opadające jest zliczane a nastepnie blokuje przerwania na INT przez czas np....
Nie znam BASCOMa ale mi wyszło 8000000/256/156=200Hz czyli 5ms :?: W pętli głównej chyba należałoby w trakcie pobierania wyniku na moment blokować przerwania albo w przerwaniu przesyłać dane przez jakis bufor żeby nie wyszlo tak, że mamy dwa bajty z różnych pomiarów (procesor jest ośmiobitowy, a wynik ADC chyba 16?).
Klasa TwoWire (której obiektem jest Wire) też używa przerwań. Po wejściu do ISR przerwania są blokowane. Jeżeli chcesz, aby dane ISR nie blokowało innych przerwań można użyć ISR_NOBLOCK:[syntax=c]ISR(TIMER2_OVF_vec... ISR_NOBLOCK) { ... }[/syntax]Byłbym jednak z tym bardzo ostrożny, ponieważ może przydarzyć się przepełnienie stosu. https://www.nongnu.org/avr-libc/user-man...
Dodatkowo rozpinam i zapinam przerwanie po rozpoznaniu kodu i po wykonaniu akcji bo chyba w ESP nie ma blokowania przerwań. Jest w postaci definiowania sekcji krytycznych, ale trzeba robić to z "umiarem".
Pomyśl, co się stanie, gdy przerwanie timera zostanie zgłoszone w trakcie wykonywania modyfikacji portu w pętli głównej, po odczycie PORTB, a przed jego zapisem. Jeśli wyjścia są modyfikowane w przerwaniach - nie należy modyfikować innych wyjść tego samego portu w wątku głównym. To jedna z wielu przesłanek za tym, by "pętla główna" była pusta. Inaczej...
Powiem tak: od realizacji mniej wiecej takiej funkcjonalności istnieje w C para funkcji setjmp()/longjmp(). I pewnie nawet na AVR ma to szansę zadziałać wywołane z obsługi przerwania, ale nie jest to najlepszy pomysł - bo nie kontrolujemy co się dzieje w programie w momencie zgłoszenia przerwania. Teoretycznie można się zabezpieczać przez blokowanie...
Kolejne nie zostanie obsłużone, jeśli wejście to przerwania blokuje przerwania, lub zostanie ponownie wywołane w trakcie obsługi poprzedniego jeśli obsługa przerwań w obsłudze przerwań nie jest zablokowana. Jeśli przerwania są zablokowane w obsłudze przerwania, a obsługa trwać będzie dłużej niż ponowne zgłoszenie. To natychmiast po wyjściu z przerwania...
Pętla jest, ale zanim w nią wejdziesz blokowane są przerwania :( To while(1) z tego powodu jest niezbędne.
Ogólnie mówiąc blokowanie przerwań stosuje się we fragmentach kodu gdzie gdzie program główny i przerwanie operują na tych samych zasobach. Bez przeanalizowania kodu nikt Ci nie poda konkretnej odpowiedzi.
Łopatologicznie: Najpierw ładowana jest stara zawartość rejestru odpowiedzialnego za włączanie lub blokowanie przerwań (korzysta z tego np. polecenie ENABLE). Potem włączane jest przyjmowanie przerwań z linii INT4, tak jakbyś wykonał ENABLE INT4. A na końcu nowa zawartość rejestru zostaje zapisana w pamięci procesora. I od tej pory przerwania z INT4...
Ogólnie pod windowsem... Windows blokuje przerwania, na pewno w XP i wyżej. 95,98 Me itd. pewności nie mam ale pewnie też. Bajdewej ten kod jest poprawny i pod VS działa: char c; __asm { mov AH, 0x31 mov c, AH } cout << c << endl; Wypisuje na ekranie "1", więc ok.
Coś z tym kodem jest mocno nie tak. Oba powinny być obsłużone w kolejności w jakiej zostały zgłoszone. Symulator AVR Studio pozostawia wiele do życzenia. W obsłudze int0 możesz wyłączyć to przerwanie i ponownie włączyć w obsłudze int1. Pamiętaj aby oprócz wyłączenia skasować profilaktycznie również flagę.
W urządzeniu było mało USART, został użyty układ SC16IS760IPW. Teraz musze dodać kolejny SC16IS762IPW czyli dwa USART. Procek z USARTEM komunikuje się po SPI. Komunikacja to wysłanie adresu rejestru i zapis/odczyt danej. Teraz wszystko odbywa sie w pętli głównej, muszę jednak odbiór przenieść na przerwania. Jak sie łatwo domyśleć, nie może byc tak,...
Standardowo nie masz zegara o potrzebnej rozdzielczości. Ja bym zrobił tak: napisał własną obsługę przerwania timera systemowego (nie RTC) aby uzyskać licznik do pomiaru z zadana dokładnością, podłożył ją pod tę standardową, podkręcił częstotliwość przerwań (standardowo jest to ok 18 Hz) do takiej jak potrzeba. Wtedy w przerwaniach od transmisji używał...
Od strony AVR napisz to od nowa. Napisz asynchroniczną obsługę wysyłania danych po RS, bo tak jak masz być nie może - blokujesz przerwania na długi czas potrzebny na wysłanie danych przez wolny interfejs szeregowy. Kolejna rzecz - jak ten program działa? Na losową pozycję bufora zapisuje odebrany bajt z PC (w dodatku blokując cały MCU do czasu jego...
IMHO to nie jest dobry pomysł. Z jaką częstotliwością taktujesz CPU? Uwzględnij latencję wejścia w przerwanie i to, że coś to przerwanie może blokować. A ty być potrzebował nie rozdzielczości 1 us lecz takiej dokładności co IMHO jest bardzo trudne do zapewnienia. Także nie tędy droga.
(at)stachul Wydaje mi się że kontrolery przerwań z tamtej generacji blokowały to jedno przerwanie które zaszło, aż do zakończenia, ale pozostawiając aktywne pozostałem. Disclaimer: 30 lat (at)electronaut To że LUBISZ DOSa (słowa z sąsiedniego wątku). Bez urazy, ale aby podziałać bardzo aktywnie, a ten projekt tego potrzebuje, tzreba mieć DOS/BIOS/hardware...
Kolega snaap nie napisał jeszcze, jak ma skonfigurowane przerwanie INT1. Ja podejrzewam, że ma wyzwalanie stanem niskim, a nie tak jak kolega ravmar (autor wątku) zboczem opadającym. Różnica między tymi dwoma typami przerwań polega na tym, że w tym pierwszym (wyzwalanym stanem niskim) flaga INTF1 jest zawsze zerowana, niezależnie od tego, czy przerwanie...
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ł...
Spojrzałem w ten kod i niestety jest tam o wiele więcej problemów. Typowy kod początkującego, ale OK - każdy kiedyś zaczynał i pisał takie potworki ;-) Co można naprawić? Już Ci to mówili w innym wątku: przede wszystkim wywalić czasochłonne operacje z przerwania. W ISR ustawiasz tylko flagę, a w pętli głównej sprawdzasz jej stan i, jeśli zachodzi warunek,...
0. PORT_ISC_LEVEL - jak sama nazwa wskazuje, generuje przerwanie tak długo, jak długo jest stan niski. Skasowanie flagi przerwania nie eliminuje przyczyny przerwania. Gdybyś blokował przerwania INT0 dla portu, to miałbyś pojedyncze wyzwolenia, a tak to obserwujesz 2 (i pewnie też więcej) dla przytrzymanego przycisku. 1. Xmegi mają sprzętowe odwracanie...
Widzę że muszę trochę sprostować. 1. Nawet kosmicznie często wywoływane przerwanie zdąży się wykonać choć by nie wiem jak długo ono trwało, bo przerwania po wejściu w obsługę jakiegoś przerwania są blokowane i odblokowywane są dopiero po zakończeniu się obsługi tego przerwania. Więc twierdzenie że przerwanie nie zdąży się wykonać w ciągu 128us bo samo...
Witam Panowie mam takie pytanie: używając pętli for kopiowanie np 5 tys elementów z jednego bufora od drugiego trwa jakieś ~1,85ms. Mierzę to timerem robiąc przerwania co 50us. Jak używam memcpy to 5tys elementów kopiuje w 50us a dla 10 tys jest 100us . Czy to możliwe ? czy po prostu memcpy blokuje przerwania od mojego timera
No, nie zupełnie. Kiedy kończy się półokres, pojawia się zbocze narastające na INT, a moment póżniej sieć przechodzi przez zero. Ciężko oszacować ile wynosi ten "moment", ale jeżeli nie zdążysz wyłączyć sygnału triaka (obsługa przerwania się opóźni itp.) zanim sieć przejdzie przez zero, to triak włączy się ponownie i pozostanie włączony przez cały następny...
Odpowiedź znajdziesz na tej stronie -> http://www.avrside.ep.com.pl/Opisy/tips.... Avr-gcc posiada dwa typy handlerów przerwań : SIGNAL() - utrzymujący sprzętowe wyłączenie przerwania ( wszelkie pozostałe przerwania są zablokowane do momentu zakończenia obsługi bieżącego ); oraz INTERRUPT() - wyposażony w prologu w odblokowanie /sei()/ przerwań. Zasadniczym...
Czy to jest przerwanie czy odwołanie się do podprogramu? Jeśli przerwanie- to jakie zdarzenie je wywołuje? Po co w przerwaniu- jeśli jest to przerwanie- blokujesz przerwanie od przepełnienia Timera? Przecież i tak jest zablokowane. Funkcja jest zdeklarowana?
Cześć Robie nadajnik i odbiornik podczerwieni w jednym korzystam z przerwania od przechwytywania czy na czas nadania muszę zablokować przerwanie wywołane zboczem opadającym lub narastającym (Timer1).Czy może nie muszę?????????
Początkujący to widać. Wielokrotnie na tym forum powtarzana jest złota rada: obsługa przerwania musi być jak na krótsza, czyt. nie w ilości linii kodu a w czasie. Dlatego często ustawiana jest flaga w przerwaniu a dopiero w pętli głównej wykonywane jest to co należy. System przerwań jest zależny od architektury procesora można je dowolnie włączać i...
Moze inne przerwanie blokuje przerwanie timera, sam z siebie nie ma prawa sie zablokowac ;) Sprawdzasz przebiegi na oscyloskopie, czy tylko zgadujesz ze sie przycina ?
No więc tak, ze schematu na stronie 11 user manuala, widać że DMA i EMC jest na tej szynie. Ja i tak musiałem zmniejszyć odświeżanie LCD, bo mi pamięć nie wyrabia. Teraz mam LCD 800x480 24bity na kolor(tu chyba trochę przesadziłem;) ) czyli, jeśli dobrze rozumiem po AHB1 z samego LCD leci 23MB/s, przypuszczam że przez to zostaje niewiele na DMA z MCI....
A mówią Ci coś takie pojęcia jak: atomowość zmiennej, semafory, kolejka ..... Jeżeli nie to tu szukałbym przyczyny. Pamiętaj że przerwania, to tak jakby wielowontkowy system.
W programie przytoczonym powyzej jest tylko jedno zrodlo przerwania wiec nie ma co tu wogole sie rozwodzic nad priorytetami. Kolega napisal ze blokuje przerwania na czas nadawania. Problem w tym ze gdy nadawanie trwa za dlugo to flaga przerwania jest ustawiana ale nie nastepuje skok do przerwania. Dopiero gdy skonczy sie nadawanie przerwania sa odblokowane,...
A ile czasu może trwać obsługa którego przerwania? Jeśli czas obsługi przerwania do synchronizacji fazy może być porównywalny z okresem timera, to może ono powodować gubienie przerwań timera. A może da się użyć jakiegoś timera 16-bitowego do wykrywania gubienia przerwań timera? Poza tym, mam nadzieję, że timer działa samodzielnie jakimś w trybie cyklicznym,...
W takim przypadku w przerwaniu uruchamiam zegar , koncze przerwanie i blokuje przerwanie - wylaczam INT. Procesor moze dalej wykonywac program . Po ustawionym czasie procesor sprawdza jeszcze raz stan styku . Ponownie wlacza INT dla nastepnego ewentualnego nacisniecia przycisku .
Nie da się na to pytanie odpowiedzieć nie widząc kodu. USART obsługujesz w przerwaniach? Pamiętaj, że na czs jego wykonania inne przerwania są blokowane, użycie nieblokujących handlerów przerwań wymaga głębszej analizy. Ale generalnie spójrz na to w ten sposób - procesor przez 40% czasu się nudzi. Więc dla 16MHz masz sytuację taką, jakbyś miał cały...
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...
Nie trzeba ich wcale wywoływać z przerwania. Wystarczy wszystkie funkcje USB wywoływać z bloku kodu w którym jest zablokowane przerwanie od USB (albo zmodyfikować te funkcje tak aby blokowały przerwanie na czas swojego wykonania). Problem w istocie teoretycznie występuje, niemniej jednak nie jest aż tak dramatyczny jak to maluje BlueDraco - jeśli byś...
Przerwanie wyzwalasz poziomem czy zboczem? Kolejna sprawa. Gdzieś czytałem, że AVR po wyjściu z przerwania wykonuje JEDNĄ INSTRUKCJĘ i przechodzi znów do obsługi przerwania (jeśli jest nowe). Jeśli chcesz blokować wskoczenie do nowego przerwania , to musisz w OBSŁUDZE POPRZEDNIEGO PRZERWANIA na samym końcu sprawdzać bit zgłoszenia ponownego przerwania....
Witam, w dobrym kierunku idziesz, ale to ci nie zadziała bo jak? skoro na początku programu tylko raz ustawiasz piny klawiszy jako wejścia oraz pin przerwania INT0 też jako wejście. Więc co ma tutaj wymuszać stan niski na wejściu INT0? nic!. Aby ten sposób zadziałał - musisz jeszcze pomyśleć o zmianie kierunków portów wtedy gdy trzeba. Generalnie założenie...
Jeżeli masz nowe AS6, to musisz przeinstalować do starszej wersji albo poczekać na kolejną. Niestety, powrócił stary błąd i symulator blokuje wykonywanie przerwań w trybie krokowym. Jak puścisz program z ustawionym breakpointem w przerwaniu, to wtedy będzie działać. To samo dotyczy pracy z żywym kontrolerem. Edit: Cofam co powiedziałem powyżej. [url=http://www.elektroda.pl/rtvforum/to...
Nowe windy skutecznie blokują połączenia telefonów komórkowych. Po zamknięciu drzwi łączność zostaje przerwana. Zapoznaj się z budową klatki takiej windy i będziesz miał gotowca.
> stoowa Twoje kłopoty powodują 3 ostatnie linijki w pętli while czyli obsługa LCD. W ciele funkcji obsługujących lcd na pewno sa instrukcje blokowania przerwań na czas transmisji danych do lcd. Powoduje to pomijanie wywołań przerwań a co za tym idzie zegarek będzie się spóźniał. Chcemy skrócić czas do następnego przerwania o czas opóźnienia obsługi...
Owszem stosować kiedy wynika to z zastosowania i algorytmu to jak najbardziej, ale nie, żeby stosować zawsze ("takie zabezpieczenie dodatkowe - nawyk"). Sam mam jeden projekt, w którym przerwania są odblokowywane w przerwaniu.. przerwanie od timera wywołuje funkcję od zmiany wykonywanego wątku, ale jeśli wszystkie wątki są uśpione, to wtedy funkcja...
W miejscach krytycznych korzystaj z sei() i cli(), aby blokować i zezwalać na globalne przerwania.
To da się bardzo prosto zrobić z przerwaniem od zbocza: - przerwanie od zbocza blokuje przerwanie od zbocza i uruchamia timer w trybie one shot, - przerwanie timera włącza przerwanie od zbocza. Jak widać wystarczy dedykowany timer i dwa przerwania i już można obsługiwać przycisk przerwaniem od zbocza. Zamiast dedykowanego timera może być programowy...
Nie wiem, czy nie mąci wszystkiego sprawa taka, że ten warunek sprawdzany jest podczas realizacji przerwania - ale jak zaczynam obsługę przerwania, to je wyłączam (cli). Obsługa ISR automatycznie na czas jego wykonania blokuje przerwania więc nie ma potrzeby blokować ich po raz drugi. Trochę mało czytelny ten kod, ale pierwsze co się rzuca w oczy,...
Przestaje działać po jednym pomiarze ponieważ brakuje sei(); na końcu obsługi przerwania To chyba jednak nieprawidłowa sugestia. Inną sprawą jest że cli() na początku przerwania jest niepotrzebne. No chyba, że się mylę. Czemu tak uważasz? :roll: W obsłudze przerwania, na samym początku blokowane są wszystkie przerwania i nigdzie już nie są odblokowywane,...
Typ tranzystora jest praktycznie bez znaczenia - dowolny nie za duży pnp. Mylisz częStotliwość przerwń z częstotliwością zegara timera. Zegar ma w tym przypadku częstotliwość 1000000 / 64, a ty dzielisz to timerem przez 254, co daje jakieś marne 64 Hz - sporo za mało, wyświetlacz wibruje jak wściekły. Powinno być ok. 1200 Hz, a minimum 600 Hz. Przy...
No to bardzo ciekawe. Bot elektrodowy (ChatGPT) twierdzi, że "`vPortEnterCriticalSafe()` / `vPortExitCriticalSafe()` mogą zastąpić `std::atomic` w kodzie zadań, ale kosztem blokowania przerwań i gorszej skalowalności." "Mój" ChatGPT twierdzi, że "W systemach embedded (jak ESP32 + FreeRTOS), operacje atomowe są często cięższe niż po prostu wejście w...
1.Każdy Timer działa niezależnie- to jest licznik sprzętowy działający jak zewnętrzny układ. To że został "wsadzony" w układ scalony OBOK procesora to tylko żeby użytkownikom było wygodniej. Dlatego nazywa się to "układem peryferyjnym", peryferiami itp. Takich "układów peryferyjnych" w mikroprocesorach jest dużo. Nie tylko liczniki ale też przetworniki...
Ludzie momentami mnie PRZERAŻACIE. Ja robiłem multipleksowanie 4 cyfr 7-segm., linijki swietlnej i klawiatury z DS1820 w systemie pod AT89C2051 i nie mam żadnych problemów - blokuje przerwanie po całym kompletnum obiegu wykonuje transmisję przez 1wire po czym wlaczam przerwanie i dziala mi TAAK. p.s. nie uzywajmy bascoma i wszystko sie da
Można bibliotekę Arduino zmodyfikować tak aby nie blokowała przerwań Ale gdzie ja napisałem że biblioteka blokuje przerwania? Podczas "wykonywania" efektu przerwanie od przycisku jest wykonywane bo zwiększa się wartość licznika "count". Tylko żeby ta zmiana przyniosła skutek efekt musi się zakończyć program skoczy wtedy do pętli głównej i wykona się...
Po namyśle stwierdzałem, że chyba zrobię odwrotnie. Będę wyzwalać przerwanie zboczem opadającym. Linia będzie cały czas na + z poprzez wbudowany rezystor pullup w procesorze. Dzięki temu uniknę zakłóceń. Włączenie przycisku będzie skutkowało zwarciem do masy. No i teraz szukam takiego układu. Przecież to niczego nie zmienia, opadających zboczy też...
Znów pokazujesz kod, w którym jest mnóstwo błędów. Jeśli modyfikujesz ten sam port w przerwaniu i poza nim, to na czas modyfikacji w pętli (co jest tutaj zresztą zbędne, bo wszystko powinno chodzić w przerwaniu) musisz blokować przerwania.
Dziwny ten twój program. Po pierwsze wywal te swoje procedury obsługi EEPROM i użyj tych z biblioteki AVR-libc, wyeliminujesz jedną z możliwych przyczyn. Poza tym w przerwaniu nie używaj cli i sei, nie jest to potrzebne - wejście w przerwanie automatycznie blokuje kolejne. sei() na końcu może być niebezpieczne, jeśli twoje przerwanie SPI jest za długie,...
Witam... i temat zamykam :-) Zastosowałem jednak obsługę enkodera na przerwaniu Int1. Jedno z wyprowadzeń podpiąłem pod Int1, przerwania ustawiłem na wyzwalane opadającym zboczem a w samym przerwaniu sprawdzam co jest na drugiej "nodze" enkodera i zmniejszam lub zwiększam wybraną daną a którą wiem po indeksie zmienianym w petli głównej do loop. W przerwaniu...
dawid512 : ?. "CLI" blokuje wywoływanie przerwań, ale nijak nie przekłada sie na równoważność z wyjściem z funkcji. dreidel : Funkcji obsługi przerwania napisanej w C nie opuszcza się przez reti - wtedy tylko możesz spowodować przepełnienie stosu (na stosie zawsze są odkładane co najmniej 2 rejestry), zresztą powracasz nie do miejsca, w którym nastąpiło...
Witam. (at)zdaj A nie masz czasem uszkodzonego wyłącznika w drzwiach ten do ryglowania ze środka lub przerwane przewody w przednich dziwach od kierowcy w gumowej osłonie ? Sprawdź to woda i częste zamykanie drzwi powoduje pękniecie izolacji instalacji sterowania centralnym zamkiem koroduje i przewód zostaje przerwany.
o dzięki, szukałem dzisiaj tego bitu w PM, ale nie mogłem znaleźć. Rzeczy związane z samym rdzeniem są opisane na stronie ARM - w dokumentacji od ST można czasem coś znaleźć, ale zwykle nie ma to sensu. http://infocenter.arm.com/help/index.jsp... Mam takie pytanie co do atomowego przepisania zmiennej nr. 1 do...
Nie raz obserwowałem, jak przerwania stoją bo ktoś w głównym wątku zwalnia stertę. To jest raczej zła organizacja programu/systemu operacyjnego. Nie ma potrzeby blokowania przerwań w czasie operacji na stercie, chyba że przerwania również z niej korzystają; tego jednak nie powinno się robić w przerwaniach. Pół biedy, kiedy dostępne jest źródło managera...
Nie, w programie nie ma żadnej innej instrukcji która używałaby timera0 (nie ma nawet żadnego waita), a przerwanie od timer2 skacze tylko do jednego podprogramu. Gdzies wyczytałem że getrc5 blokuje przerwania, ale znowu zewnetrzne przerwanie podłączone do INT1 działa... ;/ I bądź tu człowieku mądry...
Moim zdaniem jest prostsza metoda. Tworzy się dwa indeksy i tablice buforującą. Oprogramowanie zapisuje znaki to bufora i zwiększa pierwszy indeks (umownie indeks programowy). Po takim zapisie przed wyjściem zezwala na przerwanie. Przerwanie z kolei jak wykryje, że bufor programowy jest różny od drugiego buforu (umownie bufor sprzętowy) to z aktualnie...
Zmiana czasu albo dodanie kolejnej funkcji delay nie zmienia nic . Próbowałem coś x tym wymyślić Niepotrzebnie. Funkcja delay() z Arduino HAL nie blokuje przerwań, więc jeżeli enkoder jest obsługiwany tylko w obsłudze przerwań, to co wstawisz w pętle loop() nie ma znaczenia. Oczywiście, o ile nie będziesz blokował świadomie tych przerwań w loop()....
To skorzystaj z mutexów, ten RTOS je ma? Albo blokuj przerwania na czas odczytu zmiennej zawierającej datę i czas. Czyli blokujesz przerwania, przepisujesz datę i czas do zmiennej tymczasowej na której dalej działasz, odblokowywujesz przerwania.
Tylko i wyłącznie w sytuacji, gdy zmienna local_data jest jednobajtowa. Dla wielobajtowych zmiennych to też zadziała, ale... to jest wolniejsze niż blokowanie przerwań. Pokazana konstrukcja wymaga co najmniej 2 odczytów, a czasami nawet 4. To będzie kosztowne czasowo. Zwykłe zablokowanie/odblokowanie przerwań to instrukcje jednotaktowe na AVR (odnosze...
Witam, Znalazłem Data Logger na NodeMcu ets Jan 8 2013,rst cause:2, boot mode:(3,6) load 0x4010f000, len 1392, room 16 tail 0 chksum 0xd0 csum 0xd0 v3d128e5c ~ld U kolegi był wgrywany w zeszłym roku na starszej wersji IDE Arduino i wszystko działało. Czyżby nowa wersja blokowała przerwania. Nie wiem jak to dopasować.
Chech elektryk błąd powodowała procedura "delayus" zawarta w kompilatorze miałem ją w przerwaniu low porta.1 delayus xxx high porta.1 nie wiedzieć dlaczego zamazywała dobry adres a wpisywała adres powrotny PFG czyli początku przerwania i tak w kółko niestety w instrukcji picbasica nic nie pisze że wstawienie tej procedury w przerwanie blokuje jego działanie...
Zgaduję, że problemem jest komunikacja po USART - wysyłanie znaków pewnie blokuje program w przerwaniu na spory odcinek czasu.
Nie da się tego precyzyjnie wyliczyć. Dekodowanie impulsów z enkodera na M328 odbywa się programowo - np. tak, że impulsy z jednego kanału generują przerwania (nie jest to idealne rozwiązanie, ale na początek nie komplikujmy). W efekcie to jak często mogą się one pojawiać zależy od czasu jaki MCU spędza w funkcji obsługi tego przerwania, ale także od...
Funkcja Serial.print() jest funkcją blokującą, Blokującą ale nie blokuje przerwań. Nie widzę powodu aby musiała blokować.
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, 1. wg. mojej wiedzy w tym konkretnym przypadku jest to operacja atomiczna (przypisanie do zmiennej 'Pomiar', domyślam się że to jakiś uint) i wyłączenie przerwań/przerwania nie jest konieczne. Gdybyś jednak miał np. strukturę Pomiar {int srednia_z_10, srednia_z_5; } to wtedy należałoby to zabezpieczyć. 2. Możesz wyłączać tylko jedno przerwanie(UART)...
wykonuje program w którym nie może być przerwań ...wychodził z głóœnego programu i robiłby konieczną przerwę... Sztuczny problem to i rozwiązanie musi być przekombinowane. Nie wierzę, że program nie może obsługiwać przerwań i mieli wszystko w main, a do tego wychodzi z głównego programu w ramach "przerwy". Skoro algorytm nie może być przerwany,...
największe znaczenie będzie miał sposób dostarczenia zasilania do przetwornika (grube ścieżki a najlepiej przewody) oraz filtr (kondensator i może dławik?) Swoją drogą wyłącz BOD albo zmniejsz granice do 3,7V i sprawdz reakcję. Moze wszystko jest winą błedu w programie? Mam podobny dylemat, tez mi sie procek wiesza po OK minucie. Problemy ze stosem?...
tryb user da się tylko przełączyć przez SWI, co sprowadza się mniejwięcej do tego co napisałem. Nie słyszałem o makrach realizujących atomowość, jakby to wyglądało od strony procesora? Na mój gust tylko tak że blokuje się przerwanie i odblokowuje.
Rozwiązałem w międzyczasie ale dzięki bardzo. Przyjrzę się Twojemu rozwiązaniu. Ja nie mam ograniczenia liczby bajtów. Zapisuję je do tablicy a tablice wysyłam na LCD po Stopie. Adres mam ustawiany sprzętowo z portu mikrokontrolera. Obsługuję tez General Call. Do czasu wyświetlenia blokuje przerwanie od TWI aby niczego nie stracić - nie robiłem bufora...
Muszę zrobić tak że niezależnie od ilości czasu otwarcia wyrażonego w ms pierwsza część czyli pick (pierwszy stan na oscyloskopie) zawsze ma wynosić 1ms a reszta to naprzemienne otwarcie/zamknięcie w tempie które uniemożliwia zamknięcie cewki. Pierwszy pik możesz zrobić po prostu używając delay w microsekundach, kolejne piki używając PWM Caość można...
Przerwanie wykonuje kilka rozkazów niezależnie od tego jak napiszesz obsługę. Musi przecież zapamięteć stan procesora, aby potem wrócić do wykonywanego programu. Nie wiem czy o to pytałeś. A więcej niż jedno przerwanie w tym samym czasie musisz sam dobrze przemyśleć w swoim konkretnym przypadku. To trochę niebezpieczne, gdy będzie ich za dużo, albo...
Jak nie ruszymy sei i cli to wejście w jedno przerwanie blokuje wszystkie inne?
Można też podejść do problemu od drugiej strony. Nie blokować przerwań, tylko sprawdzić czy został spełniony warunek do zajścia zmiany (minął czas t). Jeżeli tak to ustawić odpowiedni pin/flage/cokolwiek a jeżeli nie, to nie robić nic.
Podejrzewam że program miał kłopoty z synchronizacją z sinusoidą . Tak jak robisz tylko daj wyprostowane obie połówki sieci na nogę procka która generuje przerwanie, ewentualnie jeśli noga generuje przerwanie przy każdej zmianie stanu może być jedna połówka sinusa. Będziesz miał na każdą połówkę jedno przerwanie. I tak jak pisałem to przerwanie uruchamia...
Nie- jak wchodzisz w przerwanie to blokujesz inne przerwania. Jak uniknąć drgań styków- to jest parę sposobów oprócz _delay() No ale jako potępieniec nie mam prawa nic o tym powiedzieć- spytaj mirka o debounce.
Datasheet o tym mówi wyraźnie. Stosowanie przerwań nieblokowanych jest ryzykowna i trzeba używać ich roztropnie. Flagi niektórych przerwań trzeba zerować ręcznie, gdyby to przerwanie nie było blokowane ciągle przerwania byłoby wywoływane. procek się wiesza.
Zasada działania jest dość prosta: Jeden Timer odmierza czas 5ms i w jego przerwaniu zapalana jest odpowiednia dioda a gaszona druga oraz zezwolone jest przerwanie ICP drugiego Timera. Drugi Timer pracuje jako częstotliwość wzorcowa z uruchomionym przerwanie ICP zatrzaskującym wartość tego Timera. W przerwaniu ICP sprawdza się dwa kolejne zbocza rosnące...
Witam Czy obsługa przerwań STM32F1 od UARTa nie koliduje z jednoczesnym zapisem do pamięci flash mikrokontrolera (czy podczas zapisu do pamięci flash nie są blokowane przerwania) ?
Parę uwag: Disable Urxc - zbędne, po co? If Kod_znaku <> 13 Then Enter = 0 If Kod_znaku = 13 Then Enter = 1 Po co dwa sprawdzenia? Bascom jest okrutnie wolny i bez tego. Ale tak naprawdę to chodzi o to: Waitms 20 Co 3 dni piszę tutaj to samo zdanie: "żadnego oczekiwania w obsłudze przerwania!" Skoro specjalnie blokujesz przerwanie na 20 ms, to...
xmega blokować przerwać stm32 przerwać przerwać bascom przerwać przerwać
zamiennik tda7560 iskrownik ustawić wałka laserowej
skoda octavia błędy programatora ch341
Odblokowanie hamulca ręcznego w Citroen C6 Ionization Flame Sensor Error in Gas Appliances