Biblioteka Adafruit_NeoPixel blokuje przerwania więc Możesz mieć problem z obsługą klawiatury podczas jej działania.
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.
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.
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ś?
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().
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.
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.
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.
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...
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...
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?).
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...
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...
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...
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.
Ł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...
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....
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.
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.
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...
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ę.
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".
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...
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...
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ł...
Krokus22- popatrz na datę. To już ma 7 lat. Wystarczy że na początku zainicjalizujesz peryferia a potem włączysz przerwania.
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ł...
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
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,...
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...
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ę?????????
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.
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....
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...
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...
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...
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,...
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...
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...
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,...
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...
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...
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...
> 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...
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...
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...
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,...
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...
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...
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....
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.
W miejscach krytycznych korzystaj z sei() i cli(), aby blokować i zezwalać na globalne przerwania.
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()....
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ć...
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ć.
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...
Funkcja Serial.print() jest funkcją blokującą, Blokującą ale nie blokuje przerwań. Nie widzę powodu aby musiała blokować.
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...
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.
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ę...
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) ?
Czyli mogę zrobić tak albo blokuje i wykonuje operacje RMW a potem odblokowuje przerwania albo bit banding. Zaleta tego jest tylko taka że nie muszę blokować przerwań oraz odblokowywać, nie wiem dlaczego wszyscy robią z tego takie show jak to tylko rozbija się (tak mi się przynajmniej wydaje) o owe blokowanie i odblokowywanie przerwań.
Już po problemie - informacja o tym, że getrc5 blokuje przerwania nakierowała mnie na rozwiązanie. Komenda ta rzeczywiście blokuje przerwania, przynajmniej te wewnętrzne mikrokontrolera (dlatego chyba zewnętrzne INT1 w dalszym ciągu działa). Przeorganizowałem program tak, że odczyt RC5 umieściłem w stosownym podprogramie, który tuż przed powrotem do...
Tak, dobrze rozumiesz. Ale mierzwi w oczy twoje stosowanie SIGNAL mimo iż i tak blokujesz przerwania przez CLI()
Tak przerwania mogą zakłócać komunikację 1wire. Na czas komunikacji z DSem blokuj przerwania.
Witam, bezpośrednio nie pomogę, ale może odezwie się ktoś, kto przeczytał dokumentację tego wyświetlacza. Problem z odbieraniem możesz rozwiązać dość "łatwo". Nie blokuj przerwań na czas dłuższy, niż trwa transmisja jednego bajtu. Czym konkretnie zajmuje się Arduino, że nie może jednocześnie obsłużyć portu szeregowego na czas? Ile to coś trwa? Pozdrawiam.
Moim zdaniem, blokowanie przerwań jest całkowicie zbędne, a wręcz niewłaściwe. Możemy sobie wyobrazić sytuację w której ktoś naruszy pierwszą barierę ale nie przejdzie drugiej, bo się rozmyśli - co wtedy? uwzględniłeś to w kodzie?
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...
Wiele makr jest źle napisanych (nie przemyslane użycie inne niż pojedyncze, i dają chore efekty oboczne). Tyle mi fusy od kawy powiedziały.
Przyczyną braku synchronizacji była zbyt duża ilość operacji na czujnikach DS118B20 - zbyt długo były blokowane przerwania. Na razie zrobiłem tak, że na czas synchronizacji blokuję odczyt temperatury - sprawdza się. Teraz zacząłem "męczyć" temat odbiornika. Czy Kolega próbował odbierania danych poprzez odczyt jednego z bitów rejestrze ? Takie informacje...
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...
Czy sekcje atomowe w ogóle są tu potrzebne. PortB jest w zakresie niskich adresów I/O więc operacje na pojedynczych bitach powinny zostać zoptymalizowane do SBI/CBI. Jak się zachowuje układ gdy wyłączysz te sekcje (czyli przestaniasz na chwilę blokować przerwania)?
W kodzie widziałem _delay_us(2), _delay_us(15) przy obsłudze magistrali 1W bez wcześniejszego użycia cli(). Sprawdzałeś jak długo wykonują się twoje przerwania? Dotyczy to sytuacji: //wykonanie funkcji w tym miejscu powoduje błędne wyświetlenie lecz nie powoduje migania Miganie zaś (gdy wynik pomiaru ok) jest spowodowane tym, ze w przerwaniu masz _delay_us(15)...
Sprawdzałem z funkcja getrc5 w przerwaniu (przykład z książki Marcina Wiązani) i też nie działa. Coś skutecznie blokuje przerwania
Można odblokowywać i blokować przerwania w dowolnym momencie. Można. Ale po co w tym programie? Uważasz, że powinno się je odblokowywać za każdym obiegiem pętli głównej? często blokuje się przerwania nawet na czas trwania jednej instrukcji aby chwilę po tym odblokować je ponownie .
Ta sam sytuacja, zawiesiłem przerwania na 50ms (ok 240 razy dłużej niż w poprzednim przypadku!). W swoim programie zawieszasz przerwania na 50ms!!! po co? co takiego ważnego procek musi zrobić żeby tyle blokować przerwania.
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.
Ja bym powiedział że "ten typ tak ma" transmisja 1wire jest oparta na ścisłych zależnościach czasowych w impulsach i prawdopodobnie na czas transmisji są blokowane przerwania.
To zadziała Jutro rano sprawdzę na sprzęcie. Czekać, ale na co... ? Na konwersję Hmm.. no ok. Zatem Jaką mam pewność, że w przerwaniu od Timera nie będę czekał na tę konwersję? Nie mogę blokować "czasowo" funkcji przerwania od Timera... ja nie gotowa to ja olewasz i sprawdzasz w następnym przerwaniu. Ale oczywiście nie chodzi tu o ustawinie jakiejs...
Nie, nie możesz (przynajmniej nie powinieneś). Nie blokuj przerwania od odbioru w ten sposób. Użyj flagi i wykonaj ten kod w mainie. Pokaż inicjalizację USART2.
Na pierwszy rzut oka: 1) inicjalizacja stosu niepoprawna kolejność: Resetuj: ; zainicjalizuj stos: cli ldi R16, low(RAMEND) out SPL, R16 ldi R16, high(RAMEND) out SPH, R16 -wpisać należy najpierw SPH potem SPL -cli tu niepotrzebne 2) tu też cli niepotrzebne bo procesor sam w przerwaniu blokuje inne przerwania IRQ_INT1: cli ; blokujemy przerwania 3)...
Hmm, ja swego czasu popełniłem matrycę LED przemiataną ręcznie z ATMega8 1000Hz przemiatania w przerwaniu i odczyt ds18b20 w oparciu o machanie pniem IO z blokowaniem przerwania - nic nie było widoczne dla oka :)
W takim przypadku warto by było zainteresować się komunikacją z czujnikiem ale po Uarcie ewentualnie w krytycznych momentach blokować przerwania na krótką chwile co z pewnością pomoże.
Obsługa 1wire w przerwaniu to porażka do tego jeszcze waitms. W przerwaniu ustawiaj tylko jakąś flage i na jej podstawie czytaj 1wire w pętli głównej. W trakcie odczytu blokuj przerwania - i tak nie są wtedy potrzebne.
Blokować przerwania na czas odczytu, lub zrobić tak, żeby w ogóle nie czytać tego poza przerwaniem, np. tylko wyświetlanie na LCD w pętli, a konwersja w przerwaniu. Nowy C ma słowo kluczowe _Atomic, które dałoby plokadę przerwań na czas odczytu.
To jest parametr konfiguracyjny systemu - chyba wciąż 1 milisekunda Chyba masz na myśli max czas wykonywania tasku. Przy przełączaniu tasku przerwania mogą być blokowane ale nie na ms, raczej to będą ns. Na Arduino nie ma systemu, który by blokował przerwania Ale robią to wszelkiej maści i rodzaju biblioteki jak 1-Wire, WS2812. przerwań są po kilka...
Nie blokuje przerwań, LOAD i SAVE jest tylko z poziomu programu głównego, po co 10ms skoro przed każdą operacją sprawdzana jest flaga zajętości?
Jak blokuje przerwania przy obsłudze DS, i czeka min. 750 ms, to działa. Jak próbuje licznikiem zrobić odstęp 750 ms to już nie działa. Kombinowałem na różne sposoby już.
Chyba ma to sens tylko jako element kodu bootloadera i ma służyć do przeprowadzenia resetu procesora. Autor chce mieć pewność, że WDT nie zostanie przypadkowo skasowany bądź wyłączony w przerwaniu które mogłoby wystąpić, dlatego na wszelki wypadek blokuje przerwania.
Witam, spotkałem się ostatnio z takim problemem, po umieszczeniu programu w pamięci flash pod innym adresem (np. 0x8000) niż standardowy (0x0000) i przesunięciu wektora przerwań pod ten adres, po restarcie program nie działa oraz blokowany jest każdy dostęp do mikrokontrolera poprzez: 1. J-Linka (dioda mruga na czerwono i wyskakuje błąd: "Fatal error...
Może być. A nie prościej wykorzystać przerwania EEPROM? Dodajesz funkcję zapisującą strukturę, która tak naprawdę tylko kopiuje dane do bufora, któy wygodnie zapisujesz w kolejnych przerwaniach EEPROM. Jest to najszybsze rozwiązanie, w dodatku nie wymaga blokowania przerwań.
http://www.avrfreaks.net/comment/1353666... Zanim AVR wykona skok do przerwania, musi dokończyć wykonywanie bieżącej instrukcji, która może trwać od 1 do 4/5 cykli. (zakładając oczywiście stabilne taktowanie oraz że w pętli głównej nic nie blokuje przerwań)
(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...
Dokładnie będę musiał wykorzystać sprzętowy. Ale co do szczegółów to jeszcze nie wiem. Blokowanie przerwań zdecydowanie :) tak naprawdę cały algorytm i sterowanie wykonam w aplikacji pc. Zacząłem od uC bo na tym się znałem najmniej :)
A tu zalecałeś blokowanie przerwania, w celu likwidacji drgań styków i zabezpieczenia się przed ponownym wywołaniem przerwania. http://obrazki.elektroda.pl/7094155700_1...
stm32 blokowanie przerwania renesas przerwania flagi przerwania
zamienie komputer interfejs ev2300 stilo stilo
ekspres krups problemy czujnik ziarna kombajn
Ubytek oleju w silniku Andoria 1HC102 po 3 godzinach pracy Jak sprawdzić szczelność głowicy i karteru silnika Andoria 1HC102?