No dawanie w przerwaniu delaya to nie jest dobry pomysl ;)
Przerwać delay możesz tylko przerwaniem. Jeśli chcesz mieć możliwość normalnie przerwania delay to rozbij je na sekwencje kilku mniejszych opóźnień pomiędzy którymi sprawdzaj stan przycisków. A najlepiej zrobić to przy pomocy timerów i przerwań.
Całkiem możliwe... bo masz delaya w przerwaniu... Spróbuj jeszcze w pętli głównej zrobić tylko miganie diodą bez użycia przerwań... z delay(1000) i 2x delay(500), albo jakimś mniejszym... potestuj
SIGNAL(SIG_OVERFLOW0) - w ten sposób definiowały obsługę przerwania jeszcze nasze babcie i jeszcze za ich czasów wprowadzono nowy sposób - ISR(TIMER0_OVF_vect) 3-sekundowy delay w przerwaniu? "Super" pomysł.
Klawiszy (poza wyjątkowymi sytuacjami typu wybudzanie uC) nie robi się na przerwaniach INT. Delaye w przerwaniu to nieporozumienie. Twoje przerwanie realizuje się tylko po wciśnięciu przycisku, więc trudno by było, aby zwróciło informację o jego zwolnieniu. Zrób przerwanie zegarowe co 25-50ms i cyklicznie sprawdzaj stan klawiatury. Opanujesz w ten sposób...
Porada: napisz to od nowa. W obecnej wersji masz delay w przerwaniu EXTI i brak przerwania timera do obsługi wyświetlacza.
Czy jest możliwość, aby po powrocie z przerwania na PORTC pojawiła się ostatnia wartość sprzed wywołania tegoż przerwania? O ile dobrze zrozumialem twoj problem to rozwiazanie jest proste - na poczatku przerwania zapamietaj stan PORTD w jakiejs zmiennej i odtworz go na koncu obslugi przerwania. Co do delay w przerwaniu to sie nie przejmuj tym co pisza...
W dobrze napisanym kodzie delay nie jest potrzebny. OW robi się na przerwaniach - UART albo timer.
W przerwaniu delay na 10 sekund? Przerwanie ma działać jak najkrócej. Do poczytania: http://mikrokontrolery.blogspot.com/2011...
(at)Piotr79611 Na ARM delay jest już realizowany przy pomocy timera - SysTick. Stąd zresztą wynika kolejny problem - jeśli przerwanie przerwie delay i samo odpali delay to wszystko się pokaszani. Także zmień sposób rozwiązania problemu. Możesz w przerwaniu włączyć te diody, jednocześnie odpalić timer, który wywoła przewanie gaszące diody.
To przerwanie w którym wykonujesz odświeżanie musi działać z dużą częstotliwością, a co do używania delay w przerwaniu napisałem Ci już wcześniej - w każdym wywołaniu przerwania zapalasz kolejną cyfrę, która świeci się do momentu kolejnego wystąpienia przerwania. W kolejnym przerwaniu zwiększasz sobie jakiś licznik, który teraz wskaże na drugą cyfrę,...
A czy przerwanie zdąży się wykonać zanim wystąpi następne? Masz OCR0=2.
funkcji HAL_Delay(1000); w callbaku przerwania to zawiesza mi przerwanie Zadnych delay w przerwaniu.
Wiem że się nie daje delaya w przerwaniu i właśnie dlatego się pytam dlaczego z tym delay-em przerwanie działa prawidłowo a bez niego już nie?
Jak przeprowadzałeś ten test dla tych 2 kanałów (wschód - zachód)? Uzywając już docelowych fototranzystorów? Co z wejściami dla sensorów północ-południe, też miały coś podłączone czy wisiały w powietrzu? Co do kodu to przydałaby się jakaś histereza, i zmiana algorytmu żeby nie blokował się na jednym kierunku - aktualnie jak jest nierówność na jednym...
Źle podchodzisz do problemu - zmienna i (czyli numer wyświetlanej cyfry) powinna być zmienną globalną, którą w przerwaniu od timera zwiększasz, a następnie wykonujesz blok switch (i) { ... }. Oczywiście delay w przerwaniu to "bluźnierstwo" :) Preskaler ustaw sobie na 64, wtedy przerwanie od timera dostniesz ok. 400x na sekundę, czyli odświeżanie całego...
Zgadza się, ale autor miał już problem z ogólnym działaniem programu. Wybór delay, millis, czy przerwania timera, to raczej szczegóły. Kod z #6 zadziała tak samo, ale łatwiej do niego dojść. Chyba. Pozdrawiam.
Myślałem nad tym, ale to rodzi pewien problem; nie mogę w *dowolnym* momencie przerwać pętli. Przykładowo: [syntax=c] delay(1000); if(flag == true){ flag == false; break; } //dalszy kod [/syntax] W takim wypadku pętla zostanie przerwana dopiero po upływie czasu w delay(), a mi zależy aby przerwać ją w *dowolnym* momencie. Mógłbym oczywiście rozbić ten...
Nie no w ten w ten sposób obsługa przerwania wywoływanego co 16ms twa 12ms z czego 11.99 to czekanie na nie wiadomo na co i dopiero powrót do pętli głównej. 80% pracy procesora to czekanie. Poz tym multipleks tak zrealizowany nie będzie równy, ponieważ w przerwie między przerwaniami nic się nie pali. W żadnym razie delaye w obsługach przerwań !!! Zamiast...
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().
delay w przerwaniu?! Nie przesadzasz? Dlaczego 2 razy ustawiasz TOIE2? Po co zerujesz TCNT2? Po co ustawiasz TOV2? Spróbuj najpierw sprawdzić ten kod z taktowaniem timera z podstawowego zegara, nie z kwarcu zegarkowego. Wtedy będziesz wiedział, czy problem leży w oprogramowaniu, czy w braku oscylacji.
Powtórzę ponownie: Wyrzuć wszystkie delay i zrób animacje na przerwaniach, czyli "Po Bożemu".
Jaka jest aktualna częstotliwość zegara? Jak często uruchamiane jest przerwanie? Ile trwa naciśnięcie przycisku? Musisz zmieniać opcje tylko kiedy przycisk został naciśnięty, nie przytrzymany. Dodaj do przerwania warunek sprawdzający poprzedni stan przycisku. Pomyśl nad wyeliminowaniem delay.
Spora szansa, że problemem są priorytety przerwań. We FreeRTOS (w sumie w większości RTOSów) przerwanie które używa funkcji systemu musi mieć priorytet niższy lub równy wartości którą sobie skonfigurowałeś jako progowa w pliku FreeRTOSConfig.h. Ponieważ zwykle w tym pliku jest to skonfigurowane tak głupio, że nie wiadomo nigdy o co chodzi, na szybko...
Wszystko się da,o ile pozbędziesz się tych pętli i delay() i będziesz zadawał stan serw w przerwaniu timera.
Musisz w swojej aplikacji dodać gdzieś swoją własną funkcje HAL_Delay(), która po prostu będzie wywoływała task-delay z FreeRTOSa.
Problem pewnie leży w procedurze. therm_read_temperature(temp); Tam zapewne masz jakiegoś delay-a ustawionego (na czas potrzebny na konwersje temperatury przez DS-a). Musiał byś pokombinować, żeby przebudować tą funkcję a delay-a wbudować najlepiej w obsługę przerwań z timera z którego korzystasz. Np. Timer przerywa częściej, za każdym razem...
A jak masz 10 przycisków wykorzystasz 10 przerwań? marnotrawstwo. wykorzystasz jeden licznik i po kłopocie zero opóźnień typu delay. Same zalety. minus? jeden: wykorzystany licznik.
Stos dla przerwań ustawiłeś? 4\/3!!
Powinno być [syntax=C] PORTC &= ~(1<<PC5); [/syntax]. Linia taka ustawia maskę kod [syntax=C] PORTC |= (1<<PC5); [/syntax]. wykonuje operację OR rejestru PORTC z maską 00100000, czyli ustawi bit 6-ty (PC5). Operacja [syntax=C] PORTC &= ~(1<<PC5); [/syntax]. Spowoduje wykonanie operacji AND rejestru PORTC z maską 11011111, czyli...
Musisz całkowicie zmienić obsługe slave. Po pierwsze musisz wprowadzić synchronizację, czyli machać linią SS. Po drugie odbiór w slave należałoby oprzeć na przerwania SPI - SPI nie ma wielostopniowego bufora, kolejne bity nadpisują poprzednie. W efekcie musisz mieć pewność, że zdążysz z odbiorem. To w miarę gwearantują ci przerwania, na pewno nie delaye...
Przypisywać powinieneś wartość zwracaną przez metodę getTempCByIndex - tak jak to robisz wyświetlając wynik, a nie metodę requestTemperatures która tylko wykonuje pomiar do zmiennej wewnątrz klasy a później nie zwraca nic (dlatego void). Poza tym twój kod jest tak samo zły jak wspomniany delay - poczytaj o przerwaniach.
Dorobilem w przerwaniu od USB SUSPEND (wywolywane przy odpieytm kablu), że tak co okolo 1 sekunde zeruje USB, czeka okolo 200ms (zwykly delay w przerwaniu) i konfiguruje USB. Po takim zabiegu jest ponownie wykrywany. Ale to jest tylko obejście (i to w nielegancki sposób) problemu, a nie go rozwiązanie. Racja. Eleganckie i powszechnie stosowane jest...
kolega ma kompletnie skopane procedury obslugi przerwań, nie wiem czemu nikt dotychczas tobie nie napisał że obsługa przerwania to nie jest miejsce na stosowanie procedury delay(). To także nie jest miejsce na to aby wstawiać tam instrukcje case-select choć to jeszcze od biedy przejdzie. Przerwanie musi byc maksymalnie zwięzłe. Dla wyświetlacza musisz...
Już wszystko działa. Dziękuje wszystkim za pomoc. A tak poza tym to delay w przerwaniu wpisałem tylko dlatego, że myślałem że pomoże a w innych programach nie zamierzam używać delay w przerwaniach, a w programie głównym też zamiast delay stosuje funkcje do odczytu czasu i instrukcje if co daje o wiele lepszy efekt.
Tak, niedokładność czasu delay wynika głównie z tego, że dodaje się do tego czas wykonania innych funkcji, w tym szczególnie funkcji obsługi przerwań. W przypadku odpowiedniego użycia timera tej niedokładności nie ma, a w każdym razie nie akumuluje się ona, tak jak w przypadku delay. Oczywiście jeśli coś ma być wykonywane w superdokładnych odstępach...
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...
Więc już działa poprawnie. Teraz powstał inny problem którego się nie spodziewałem, aczkolwiek jest problem z przerwaniem, a dokładniej wstawiam kod programu Jeśli aktywne są przerwania to delay będzie opóźniał. Pokaż całość programu.
Stała rada - żadnych delay(), tylko przerwanie timera i zmiana sterowania serw w tym przerwaniu.
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...
Nie licz na gotowe biblioteki, które najczęściej zawierają masę błędów. Napisz swoją obsługę serwa. Timerem wygeneruj impuls zależnie od tego jaki kąt chcesz uzyskać. Wiele serw nie wymaga przerwy pomiędzy impulsami ok 20ms, jeśli jednak ma ona być to też jest proste, po wygenerowaniu impulsu, wywołane zostanie przerwanie, które zmieni konfigurację...
Jeśli nie delay, to zastanawiam się jak inaczej to rozwiązać... Ustawić przerwanie od timera, albo przenieść delay do głównej pętli programu.
Reaguj na zmiane stanu przycisku a nie na jego stan. Zamiast delay, użyj millis() i maszyny stanów. Dzięki temu będziesz mógł innym przyciskiem awaryjnie przerwać proces w dowolnym momencie. Teraz to niemożliwe.
stdbool.h przeoczyłem, sorry. to teraz przejdź z Debuga na Release i zobacz czy nadal wszystko działa, imho raczej się posypie, bo d1 i d2 powinny być volatile. A tak w ogóle: kompilator masz z CodeComposera, czy MSPGCC? Bo jak ten pierwszy, to owszem, i bez volatile'a może podziałać, defaultowe opcje optymalizacji puszczają tam takie cuda, ale to nie...
Przycisk nie zadziała dopóki nie skończą sie delay(). Pozdr
Normalna praca sterownika PLC polega na cyklicznym wykonywaniu: odczytu wejść, sekwencji kolejnych rozkazów składających się na program oraz ustawieniu wyjść. Wyobraź sobie taki ciąg rozkazów umieszczony w OB1: 1. A = 1 2. B = 2 3. CALL FC1 4. B = 1 5. A = 2 6. CALL FC1 Wewnątrz FC1 zawsze zmienna A <> B. Podprogram (FC1) jest wykonywany tylko...
Twój sposób odczytywania jest ciekawy ale nie jestem pewny czy praktyczny. Program przy takim przerwaniu i odczytywaniu kodu RC5 dość dużo czasu będzie spędzał na pętlach delay. W związku z tym, że będziesz wykorzystywał też różne inne przerwania nie jestem pewny czy program się nie pogubi i poprawnie odczyta kod RC5.
Najlepiej zapomnij o używaniu funkcji delay i używaj timerów/liczników oraz przerwań. Na tym Forum wyszukasz wiele tematów na ten temat. Na innych stronach będzie tego miliony. Na przykład tutaj: http://www.elektroda.pl/rtvforum/viewtop...
Kazdy czujnik niech generuje przerwanie, w przerwaniu badasz ktory czujnik sie odezwal i wlaczasz diody dla tego czujnika.
Zapamiętaj jedna generalna zasadę: żadnych delay w przerwaniach. Do tego ten delay o ile się już uprzesz użyć go w handlerze wymaga aby systick miał wyższy priorytet, inaczej zdechnie w deadlocku
Czujniki to ds'y? Czytasz je z delayem?
Zobacz w nocie jak działa timer, w szczególności funkcje pinów OCx. Zauważ, że impuls wyzwalający triak może być generowany całkowicie sprzętowo. Dzięki OCx możesz ten impuls wygenerować z zadanym opóźnieniem, w takiej sytuacji wyzwalasz tylko timer w przerwaniu detekcji zera. Tak jak kolega wyżej sugerował zapomnij o delay, szczególnie w przerwnaiu....
Najprymitywniej: [syntax=c]void mydelay(uint16_t delay) { int f; for (f = 0; f<delay; f++) _delay_ms(1); } [/syntax] A powinienes zrobic w przerwaniu timera.
Zwłaszcza jak NWW wyjdzie dosyć wysoki np 1000. Jesteś optymistą. Przy podanych parametrach (50 i 0,1s) Maksymalne NWW (najmniejsza wspólna wielokrotność a nie dzielnik) to NWW=47*43*41*37= ponad 3000000. Zastanowiłbym się także nad użyciem przerwania od timera zamiast pętli z delayem. Nie ma się nad czym zastanawiać. Użycie timera to konieczność....
Jakie środowisko? Zakładam, że CooCox, ponieważ w innych takie rzeczy raczej nie występują. Odkąd pamiętam, to taki zapis zawsze poprawnie konfigurował SysTick do generowania przerwań co 1ms (1000Hz): [syntax=C] #include core_cm4.h #define FREQUENCY 168000000ul // lub dowolna inna, ale prawdziwa ///... jakiś fragment programu... if (SysTick_Config(FREQUENCY...
Kod jest poprawny. Czy w projekcie masz wybrany prawidłowy procesor? A co do delay to pewnie masz źle ustawione F_CPU.
Nie w głównym a raczej: w innym przerwaniu wstawiają delay() albo pętlę oczekującą na cokolwiek. P.S. Poczekajmy co Autor wymyśli.
1. Wobec tego korzystaj z funkcji opóźnień dostępnych we FreeRTOS. 2. Nic dziwnego, że opóźnienia tak działają - system ma swój timer i procedury obsługi przewań, a one zajmują czas procesora. 3. OneWire tak na pewno nie obsłużysz. Zajrzyj do najnowszej EP - zobaczysz, jak można to zrobić. Na pewno nie z delay(), a przerwanie timera obsługującego 1W...
Biblioteka odbiera dane z użyciem delay w przerwaniu od pinu RX, a wysyła w delay wyłączając przerwania. Dla niskich prędkości równoczesną transmisję i odbiór z detekcją bitu start możnaby zrobić w przerwaniu timera, albo użyć USI. Tak czy inaczej, z Arduino już by w tym projekcie nic nie zostało. Problem z odbiorem danych masz taki, że w ogóle niepotrzebnie...
Twoim problemem jest wykorzytanie funkcji delay która jest niczym innym tylko pętlą o określonej ilości iteracji. Poczytaj o licznikach i przerwaniach.
Dlatego tak się dzieje, że _delay_ms(50); powoduje, że procesor mieli sobie coś w pętli przez 50ms nie interesując się niczym innym niż przerwaniami. Jeżeli chcesz coś robić w pewnych określonych interwałach czasowych użyj przerwań od timera.
dlaczego ta instrukcja nie działała jak dodałem średnik na końcu tej linijki while((SPI1->SR & SPI_SR_BSY) == 0) ,a jak go usunąłem to zadziałało? Bo `while (warunek);` jest tożsame z `while (warunek) { /* kompletnie nic */ }`. Jeśli dasz średnik, to następna linijka _NIE_ jest częścią pętli while, tylko po prostu jedną instrukcją która się wykona...
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...
Witajcie, Zastanawia mnie pewna sprawa; czas zapisu do pamięci EEPROM w AVR-ach to 3-4ms. Czy w przypadku kiedy mam do zapisania więcej niż jeden bajt, po każdym poleceniu EEPROM.write() powinienem wrzucić delay ustawiony na 4ms żeby dać czas procesorowi na zapis? Czy mogę odpalić np pętlę, która od razu, bez żadnych opóźnień zapisze np 64 bajty? Jak...
Ok, dzięki. Nie rozumiem, ponieważ wpisując do licznika SysTick wartość początkową 24000, przy zegarze 24MHz (8MHz x3), mam przerwanie co 1ms, bo wywołując opóźnienie Delay(1000); - zlicza 1000 przerwań, dioda świeci 1 sek. Gdyby podział przez 8 dzialał, to powinna swiecić 8 sek.
Czyli gdyby sobie tak to wyobrazic, to ten delay(100) jest "poszatkowany" przerwaniami, w ciagu jego trwania wystepuje mnostwo przerwan zapalajacych diode i stad efekt migania, dobrze rozumiem? Delay wielokrotnie może zostać przerwany przez przerwania. Czy oraz ile razy w Twoim przypadku jest przerywany można byłoby policzyć znając Twój aktualny program.
A jeśli w programie głównym akurat wykonuje się _delay - program jest wstrzymany - i nastąpi zgłoszenie przerwania to czy delay jest "urywany" w momęcie wystąpienia zgłoszenia przerwania przez timer i wykonuje się procedura przerwania, a gdy ta się skoczy to program wróci "dokończyć" delaya? Czy rozgrywa się to w inny sposób?
NIGDY nie używaj opóźnień w przerwaniach bo tym zabijesz sobie resztę programu. Chciałem uniknąć drgania styków. Jak temu zapobiec nie używając delay? INT0 ma wyższy priorytet niż INT1 więc gdyby w INT0 miało dojść do przerwania, to doszło by do niego nawet gdyby właśnie wykonywany był delay z przerwania INT1, prawda?
Filozofujesz o czymś co dalej ma mały sens, a przy okazji mylisz się (zresztą tak samo jak Piotrus_999). Funkcja będzie niedokładna tylko i wyłącznie wtedy, jeśli przed końcem odliczania nastąpi przerwanie (jedno), które będzie trwało dłużej niż czas który pozostał do końca tego delaya. Po prostu delay nie ma możliwości się skończyć, bo... rdzeń jest...
(at)Gunis-92: Możesz wykorzystać do odmierzania czasu np. SysTick [syntax=c] volatile uint32_t licznik_tykniec;// zmienna globalna /* obsluga przerwania od licznika/timera SysTick */ void SysTick_Handler(void) { licznik_tykniec++;// inkrementacja licznika } void delay(uint32_t czas) { uint32_t aktaualny_licznik_tykniec; aktaualny_licznik_tykniec = licznik_tykniec;...
W kodzie jest jedno Delay :) wykorzystane tylko do celu eksperymentu bazujące na przerwaniu Systicka. Niestety po wpisaniu: GPIOA->BSRR = 1 << 5; //set bit Delay(1000); GPIOA->BSRR = 1 << 21; //reset bit układ zachowuje się podobnie jak pisałem wcześniej albo dioda cały czas świeci, a po zamianie linijek jest gaszona. A czego spodziewasz...
Z początku wydawało mi się trochę nadmiarowe patrząc po cyklach CPU wskakując w przerwanie co przesłany bajt, dlatego wolałem sprawdzać czy już się wysłało w pętli Jeśli będziesz wysyłał dane odpowiednio szybko, to przerwanie od TC będzie tylko jedno - na samym końcu. Jeśli użyjesz DMA, to właśnie tak będzie, jeśli nie, to tak czy iak co bajt będziesz...
Wykonuje się 16384 razy, ale jak wywołam jednorazowo inne przerwanie i w nim dam jakiś delay (wiem, że tak się nie robi) to częstotliwość spada do 8192Hz. Ktoś zna przyczynę dlaczego tak jest? Nie podajesz jaki delay taki efekt generuje. Zapewne jest tak, że przerwania gubione są przez fakt, iż flaga przerwań nie jest buforowana. Jeśli więc wystąpi...
Na Mega328 z KB RAM uruchamianie OS nie bardzo ma sens. Zrób wielowątkowość opierając cały program o maszynę stanów. Zapomnij, że istniej delay. Owszem, krótkich delay (mikrosekundy) w AVR przeważnie nie da się przeskoczyć ale nie zawsze. Na 1-Wire, można obsłużyć USARTem. Nie ma żadnych delay i 1-Wire działa na przerwaniach. Masz więc już pierwszy...
Wysyłasz procesor pod przerwanie którego niema. To jak myślisz co biedny procesor ma robi jak tam niema nic. [syntax=c] ISR(TIMER0_COMP_vect) { }[/syntax] To musi być dodane. Resztę zrobi kompilator i przestanie się zawieszać.
Pytasz, w jaki sposówb zrealizować "to" w przerwaniu", tylko nie piszesz nic o tym, czym jest "to" - a to jest klucz do całego problemu. Bez podstawowych informacji o funkcjonalności urządzenia nie da się dokładnie NIC doradzić. Wbrew tem, co napisał kol. mjurczuk, cały kod Twojego programu zapewne powinen mieścić się w przerwaniach. Na pewno nie ma...
Spróbuj w programie użyć przerwań dla przycisku. Teraz program działa już tak jak powinien, pętla działa bez delaya dlatego co obieg pętli wyświetlacz się odświeża. Żeby pisać na wyświetlaczu po wciśnięciu przycisku musisz tekst dodać w warunkach przycisku a nie w głównej pętli.
Podaję ładniejszą formę obsługi opóźnienia na SysTick: [syntax=c] #include "LPC17xx.h" #include "lpc17xx_gpio.h" volatile uint32_t licznik_tykniec; /* obsluga przerwania od licznika/timera SysTick */ void SysTick_Handler(void) { licznik_tykniec++;// inkrementacja licznika } void delay(uint32_t czas) { uint32_t aktaualny_licznik_tykniec; aktaualny_licznik_tykniec...
(at)szelus Wiekszość startupów ma ten sam adres obłsugi tych wyjątków. Dlatego nazwą się nie sugeruj o ile nie zostały napisane ich handlery Nie wiem jak za bardzo działa "Instrution Stepping Mode", Nie. Normalnie wykonuje to na uC Macie pomysł co może być winą albo jak dojść do problemu? 1. Jeżeli masz zainstalowany Atolloc albo CubeIDE to znajdź...
#define F_CPU 1000000 Jak uzyskałeś częstotliwość 1MHz? ATTINY13 ma wewnętrzny RC=9.6MHz. Po podziale przez 8 daje 1.2MHz. Bez zewnętrznego sygnału albo grzebania w OSCCAL ciężko jest uzyskać 1MHz. Tak na marginesie to częstotliwość powinno się definiować w ustawieniach projektu. Dodatkowo delay w pętli głównej przerywanej przerwaniami nie będzie wiarygodny....
Nie do końca tak, obsługa przerwań powinna być możliwie krótka, ale realizować założone zadanie. Same ustawienie flagi i pooling w main jest tak samo złym podejściem jak delay w przerwaniu. Ale nie komplikujmy :) Jeśli masz odliczać co 1 sekundę, to dlaczego po prostu przerwanie timera nie zrobisz co sekundę, przy każdym przerwaniu dekrementujesz licznik...
Ja nie próbuję zbudować kompletnego kitu AVT 2623 tylko wykorzystać moduł sterujący w innym układzie stąd inne wyprowadzenia. Póki co zmontowałem sobie pełen układ wykonawczy oraz na płytce prototypowej elementy sterujące. W moim układzie informacja o przejściu przez 0 jest na PD2 (tak jak w oryginale) natomiast wyjście sterujące jest na PB0. Jeśli...
Jak na mój gust to ty nie wychodzisz z obsługi przerwań. W przerwaniu masz "delayms(DS18B20_TCONV_12BIT);" (to jest pewnie 750ms...) jeżeli przerwanie się wywołuje częściej niż co 750ms (+ew czas na obsługę LCD itd.) to w praktyce procesor działa tak: 1.uruchamia się w main(); 2.... 3.Włączenie przerwania sei(); 4.Wywołanie przerwania 5.Długo trwa przerwanie......
kompilator nie zgłaszał zastrzeżeń, ale poprawiłem i bez zmian. Dałem zaraz za NoInterrupts delay 50 a nawet 250, ale często zlicza podwójnie, potrójnie, tak, jakby nie zdążył wyłączyć przerwań. Bez delaya zlicza i po kilkanaście, ale z delay-em również często zbyt dużo. Bardzo bym również prosił o pomoc przy wyjaśnieniu tego zachowania funkcji - czy...
A dlaczego nie można używać do przerwań elementów "mechanicznych". Ps. ten delay jest po to, aby wyeliminować wpływ drgania styków
ok ok co do testu chciałem sprawdzić czy jak zatrzymam wszystko używając delay to czy przerwanie się nie wykona na szczęście się wykonało co świadczy że zdarzenie czyli zmiana stanu pinu nie jest sprawdzane przez procesor. Dzięki Dodano po 19 Teraz dam taki bardziej praktyczny przykład np kiedy chce pobierać dane szeregowo to zamiast dawać if w pętli...
W przykładzie Blink są używane przerwania właśnie na potrzeby procedury delay() do odmierzania czasu. Domyślnie w Arduino przerwania są włączone. Zostaw przerwania w spokoju (nie wyłączaj ich). Jak ma działać Twój program, co chcesz uzyskać?
Może masz jakiś lepszy pomysł kolego jak zrealizować takie zadanie nie używając funkcji dealy? :) To sposób wybrałeś. Dobrze sie domyślałem. Akurat robię coś takiego i akurat teraz na AVR. Uruchomiłem przerwania od obu zboczy na wejściu INT. Do wejścia tego podłączony jest układ wykrywania zera. Przerwanie to zeruje timer 1. Do OCR1A wpisuję wartość...
W najprostszej postaci, która w tym przypadku wystarczy to dwa warunki i niezalecany delay Taka sekwencja nie może zostać użyta wewnątrz obsługi przerwania, ponieważ wtedy licznik delay() jest zablokowany i obsługa się zawiesi. A czy ja gdzieś napisałem aby używac tego w przerwaniu?
Jeżeli nie potrzebujesz dokładnych opóźnień a takich Π•oko, to IMHO delay na pętlach w zupełności wystarczy. Timerów w stm32 niby wiele...ale prawie zawsze, w większych aplikacjach znajdzie się szczytniejsze dla nich zastosowanie. Z drugiej strony stosowanie pętli opóźniających na ARM-ach trąci profanacją :) Jeżeli nie interesuje Cie korzystanie...
Kilka uwag: - korzystaj z funkcji i rozbijaj program na funkcje. Niektórzy twierdzą, że jeśli blok ma więcej niż 10 instrukcji to należy go wyrzucić do funkcji. Moze to przesada, ale ułatwia czytanie kodu. - nie zostawiaj niewykorzystanych pinów jako wejścia w układzie - łapią zakłócenia, co w centralce alarmowej nie jest zalecane. - wewnętrzny pull...
Idzmy głównym wątkiem bez cofania sie. Tak, uaktywnia ale już wiem, ze było ono przechowywane w SREG. To jest wyjaśnione. W SREG przechowywana jest informacja o fladze I, czyli fakt włączenia lub wyłączenia przerwań globalnych. Nie ma to nic wspólnego z "przechowywaniem" informacji o przerwaniach INTx. Instrukcjami operującymi na fladze I w SREG są:...
Zacznij od przerwania timera i wszystko rób w obsłudze tego przerwania. żadnych "delay" i żadnych czynności w pętli głównej (ma być pusta, tylko z usypianiem procesora). Na dobry początek masz coś o przyciskach: http://mikrokontrolery.blogspot.com/2011...
delaye w przerwaniach .... Uuuueeeee, kto tak pisze, trudno powiedzieć jak to się w ogóle zachowa
Do RS485 są biblioteki, może lepiej to zadziała. Nadawanie w Arduino jest na przerwaniach, wysyłasz napis do bufora i funkcja Serial.print się kończy, w tle uruchamia się funkcja do faktycznego wysyłania w przerwaniach i nadaje znak po znaku, ale ty przełączasz na odbiór, więc nie wysyła. Pierwszy wysyła bo masz delay 500. Po wysłaniu tekstu możesz...
Witam! Napotkałem problem przy obsłudze przerwań zewnętrznych (jestem początkujący). Oto mój programik: volatile int przerwanie=0; ISR(INT1_vect) { przerwanie=1; } int main() { LCD_Initalize(); LCD_WriteText("START")... _delay_ms(1500); DDRD &= ~(1<<DDD3); //pin PD3 jako...
A msza włączone przerwania ? Pamiętaj że przerwania na pewno wydłużą czas. Pamiętaj również że to nie jest precyzyjne odmierzenie czasu tylko szacunkowe. Sprawdź również opcje optymalizacji jak są ustawione. Włączenie optymalizacji mocno !!!! skróci delaya . Pozdrawiam
Przede wszystkim masz błędną koncepcję obsługi UART - przenieś to na przerwania. Tak jak masz to teraz, z delay w pętli głównej to będzie działać tylko przez przypadek i okresowo. Po drugie, jeśli w funkcji odbioru znaku czekasz w nieskończoność na jakiś stan to nic dziwnego, że ci to blokuje pętlę główną. Moja rada - podepnij rxd pod pin z przerwaniem,...
Zmienną używaną w przerwaniu deklaruje się jako volatile (wykluczona z optymalizacji), inaczej będzie cyrk... volatile unsigned char licznik Ładniej by to wyglądało scalone... tzn... void czekaj(void) { licznik = 30; TCCR0 = 0x05; do{}while(licznik); } ISR(TIMER0_OVF_VECT) { licznik--; TCCR0 = 0; //wypadałoby...
Zrób to bez delay() a będzie dobrze ;-) Ja, wpisuję dane wtedy gdy host odbierze poprzednie. Sygnalizuje to przerwaniem lub flagą. Albert
funkcja delay relay delay efekt delay
stukają zawory centrowanie koła suzuki wagon
skrzynia schemat skrzynia schemat
Naprawa zamka schowka w Mazdzie CX-7: porady i części Opel - Rozruch tylko po podaniu paliwa do przepustnicy