Wydaje mi się, że podczas wykonywania komend obsługujących LCD (Locate, Lcd) dzieje się jedna z dwóch rzeczy: a) przerwania zewnętrzne są wyłączane (nie są obsługiwane przerwania, które są zagnieżdżone jedne w drugich), ...............) Tak ma być czy robię coś źle? Jakieś pomysły o co może chodzić i jak podejść do problemu? Pokaż gdzie i jak masz...
kardynalny błąd -> oczekiwanie na co, na TC==1 ? Oczekiwanie na cokolwiek w przerwaniu jest kardynalnym błędem. Przeciez w notce katalogowej zalecają poczekać po zakonczeniu transmisji na TC. Czy aby napewno piszą to w kontexcie przerwań, czy może poczekania przez wyłączeniem danego modułu peryferyjnego? Poza tym nie odpowiedziałeś na moje pytanie,...
Skoro problem startupa już rozwiązałeś, to może napiszę cokolwiek o tym drugim. Po pierwsze - po co chcesz zmieniać wartość I / F z poziomu kodu? W znakomitej większości przypadków - jeśli nie korzystasz z przerwań zagnieżdżonych - nie ma takiej potrzeby. Przerwania aktywowane są (lub nie) w rozbiegówce przy okazji ustawiania stosów dla różnych trybów....
Wielozadaniowość to duże słowo. Ale jeśli już go użyłeś, to zastanów się czy tego właśnie nie chcesz robić zagnieżdżonymi przerwaniami. Co do rozwiązań to wystarczy w przerwaniu robić krótką część roboty, a jeśli musimy czekać na coś to powrót i kontynuacja przy następnym wejściu. Wbrew pozorom łatwiej nad tym zapanować niż nad zagnieżdżonymi przerwaniami....
Zmienna jest równa zero, bo przerwania nie wywołują się podczas innych przerwań "same z siebie" - to chyba oczywiste, że żaden układ nie obsługuje "sam z siebie" zagnieżdżonych przerwań - nie bez powodu zresztą. Zupełnie inną kwestią jest to, że optymalizacja na 99% wywali Ci zmienną pom, bo jest bezsensowna. 4\/3!!
Potrzebne Ci w ogóle te przerwania zagnieżdżone? Bo wiesz że jak jest problem, to najłatwiej go rozwiązać dochodząc do podstawowej przyczyny na najprostszym kodzie - zagnieżdżone przerwania w tej definicji się nie mieszczą. Skoro program się wykłada, to pewnie jest zbyt mały stos, ale ja i tak bym wywalił te przerwania zagnieżdżone... 4\/3!!
3) Generalnie na początku makra SIGNAL wyłączane są przerwania (funkcja cli), a na końcu są odblokowywane (sei), tak więc nie ma zagnieżdżenia przerwań, po prostu niektóre pomiary gubisz. 2) wg noty katalogowej do masy przez kondensator 1) jeśli ich nie używasz, to należy je ustawić jako WYJŚCIE, i można na nich ustawić stan 0. Nie powinny wisieć w...
Najprostsze rozwiązanie - w przerwaniu od czujki uruchom sprzętowy timer. Przerwanie od timera powoduje włączenie alarmu. Jeśli użytkownik wyłączy system przyciskiem, to w procedurze przerwania przycisku wyłączasz timer. Żeby wszystko działało jak trzeba, musisz zezwolić na zagnieżdżone przerwania (czyli żeby ISR od timera mógł się wykonać w momencie,...
Hej, Mam pewną wątpliwość co do sposobu działanie przerwań w avr`ach i ich obsługi przez avr-libc 1.4.4. Co się stanie jeżeli w momencie, w którym procesor obsługuje jakieś przerwanie zostanie zgłoszone następne przerwanie. Z dokumentacji zrozumiałem że nie zostanie ono obsłużone od razu ponieważ ISR albo Signal mają wyłączone globalne zezwolenie na...
Zwiększ rozmiar stosów, bo przerwania mogą po prostu przepełniać stos. No i jeśli ich nie potrzebujesz, to wyłącz możliwość przerwań zagnieżdżonych. 4\/3!!
A przypadkiem żeby jedno przerwanie przerwało drugie nie trzeba w obsłudze każdego z nich rozpocząć od... włączenia przerwań (bo przecież domyślnie po wejściu do przerwania są zablokowane). Tym sposobem w ogóle przerwania zagnieżdżone mogą działać... 4\/3!!
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...
No to zwiększ stos, bo 96 bajtów to tyle co nic dla takiego układu, a jeszcze masz przerwania zagnieżdżone. Mając 128kB pamięci SRAM naprawdę nie ma sensu się ograniczać w tej ważnej kwestii. Pamiętaj, żeby wielkość ta byłą podzielna przez 8. 4\/3!!
Jeżeli w programie występuje nadpisywanie RAMu to można w dowolnym jego miejscu sprawdzać SP? Kiedy SP może się przepełnić, np w czasie przerwań albo wywoływania funkcji zwłaszcza gdy operuje się na większych buforach/ stringach? SP możesz odczytać w dowolnym miejscu, to przecież jeden z dostępnych rejestrów MCU, ale... średnio to pomaga. Owszem, zauważysz,...
No właśnie jak dla mnie to jest bardzo dziwne, bo wg mnie wszystko przed tą instrukcją jest ok... Jeśli włączasz PLL i MAM, to może spróbuj odpalić wszystko bez PLL i MAM - na niskich prędkościach? A nuż jest to problem sprzętowy... Z jakiego przerwania jest wywoływana ta funkcja? Masz tam przerwania zagnieżdżone? Nie mam już pomysłów... /; 4\/3!!
Priorytet jest zafixowany - po numerze wektora, tak jak zwykle. Co do przerwań zagnieżdżonych, to ze strony kompilatora problemu nie będzie, procek też zrobi co mu każesz, niemniej jednak napisanie kodu który to przeżyje jest dosyć skomplikowane [; Co do INTERRUPT, to może w jakiejś starej wersji or sth - teraz w każdym razie zalecane jest ISR() 4\/3!!
Warto, bo czasem przydają się wstawki asemblerowe. Tia, ja na razie użyłem w swoim życiu dwóch i to tylko dlatego że nagle zapragnąłem zrobić "premature optimization" (; 4\/3!! No dobra, ja jak sobie dobrze przypominam to używałem asm chyba tylko do załączania przerwań zagnieżdżonych... ALE, czasem, w niektórych bibliotekach można napotkać proste funkcje...
Witam, Przerwań zagnieżdżonych nie używam. Natomiast odnośnie tego kodu w przerwaniu, w którym odbieram dane bajt po bajcie, tworzę ramki danych a później liczę CRC sprawdzając czy naliczone CRC zgadza się z CRC z ranki danych to zauważyłem jeszcze taką rzecz: jak wyłączę inne przerwania, czyli procesor ma mniej do roboty, wówczas znów mam 100% poprawnych...
No ale co to ma za znaczenie. Na przerwanie może zareagować szybciej. "Chyba" należałoby sprawdzić, bo nie masz racji przy nowszych konstrukcjach. A co do przerwań zagnieżdżonych, to dałeś się ponieść. Póki korzystasz z kopii rejestrów a nie stosu to do tych 6 (i 12 oczywiście też) cykli musisz małe conieco doliczyć Także w wypadku cudownego Cortexa....
ups (; Zagnieżdżone przerwania trzeba obsługiwać w innym trybie. 4\/3!!
Nie reaguje, gdyż normalnie M8 nie obsługuje zagnieżdżonych przerwań.
Dlaczego przechowuje tablice 15 elementową folderów: Na przyszłość. mam zamiar wyświetlać albo foldery albo pliki, albo pół na pół. No ale to chyba nie ma sensu - skoro masz 15 linii, to wystarczy Ci 15 elementów, a nie 2x15 <; A masz może jakiś pomysł co zrobiłem źle z przerwaniami? Z przerwaniami można wiele rzeczy zrobić źle - począwszy od "standardowych"...
Tak są sprawdzane przy przyjmowaniu przerwania ale po powrocie z przerwania (RETI) skąd procesor wie jakie przerwanie, o jakim priorytecie wykonuje (ponieważ przerwania mogą być wielokrotnie zagnieżdżone)?
Cóż, teraz widzę że nie zrozumiałem do końca. Zostaw break jak był, teraz doczytałem że nie stosowanie break to mit, którego zresztą zostałem nauczony w szkole... A wracając do twojego pytania, zapoznaj się z debugerem to zrozumiesz dokładnie jak to działa. Break tak czy siak powinien przerwać pętlę for w obrębie której jest zagnieżdżony, a dopiero...
"obsługa zagnieżdżonych przerwań jest skopana" - czy jest jakaś możliwość obejścia tego problemu jeśli mam włączone kilka przerwań jednocześnie i mogą się wzajemnie nakładać w czasie ?
Kiedy zdarza się przerwanie, bit I w SREG zostaje wyczyszczony, podczas powrotu z przerwania RETI ustawia bit I z powrotem na 1. Zapobiega to kolejnemu wywołaniu tego samego przerwania dopóki jego obsługa nie zostanie zakończona, jak i zagnieżdżonym przerwaniom.
Ten sposób się czasem stosuje - tworząc tzw. zagnieżdżone przerwania, ale jest to ryzykowna zabawa i powinna zazwyczaj dotyczyć tylko obsługi jednego przerwania, jeżeli musi być ono dłuższe czasowo, aby nie blokować procesora i reszty programu. Pzdr. N.
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...
W żadnym normalnym systemie przerwań to samo przerwani się nie zagnieździ W AVR jest to możliwe, a dla większości jest to normalny system przerwań.
Nie neguję rozwiązania przerwanie-w-przerwaniu, w niektórych sytuacjach jest to rozwiązanie bardzo eleganckie i efektywne, tylko należy pamiętać aby dobrze wyłączać przerwania. Nie popieram natomiast pętli oczekującej w przerwaniu, kod warto przeprojektować względem tych pętli pozbywając się ich - czy to przez automat skończony zmieniając INT1 na przerwanie...
Witam! Na wstępie chciałem zaznaczyć, że od niedawna dopiero poznaję procesory z serii ARM. Bardzo dawno temu miałem styczność z 51- jedynką i keilem. Moje doświadczenie w programowaniu C też nie jest oszałamiające, natomiast asembler na ARM jak na razie jest przeze mnie mało zrozumiany. Proszę o wyrozumiałość przy pisaniu ewentualnych odpowiedzi, za...
Witam, w rzeczy samej, funkcje typu "delay" odbierają sterowanie na czas opóźnienia, nic się wówczas nie dzieje. W prosty sposób można jednak zrealizować taką "kooperacyjną" wielozadaniowość. Należy zrezygnować w ogóle z funkcji "delay", zamiast nich wywoływać w kółko w głównej pętli (czyli loop) funkcje, które będą odmierzały czas od jakiegoś momentu...
No cóż, jeśli używamy przerwań, to można tylko podprocedury zagnieździć do 2 poziomu, stos sprzętowy jest niewielki.
Dziękuję kolejny raz za pomoc :). Szukam jeszcze informacji odnośnie pojęciu "Stacking i Unstacking", udało mi mi się znaleźć takie wyjaśnienie: Stacking and Unstacking – pozwalają na obsługę zagnieżdżonych przerwań bez ryzyka utraty danych Stacking Kiedy wystąpi wyjątek wrzucane jest 8 rejestrów do stosu: •PC (program counter) •PSR...
Czy istnieje u ciebie przerwanie które wymusza dostęp na FSMC, tj. wyświetlacz? Jeśli nie, to nie ma opcji żeby praca FSMC miała wpływ na wykonywanie przerwań...Jeśli tak, to masz błąd w założeniach, bo dostęp do wyświetlacza nie powinien być w ISRrze.... Przerwania się skolejkują wtedy, gdy masz włączonych kilka przerwań i wszystkie wystąpią na raz...
Ja to robię "na maksa" przez co łatwo jest mi budować np. urządzenia zasilane z baterii o długim czasie pracy. Nie jestem przekonany, że otrzymujesz optymalne rozwiązanie. Choćby z powodu konieczności zachowywania kontekstu do zagnieżdżonych przerwań kod wydłuża się o dodatkowe instrukcje a to powoduje zwiększenie "żerności" Albert
Jakie Bez tego mechanizmu ciężko ogarnąć takie tematy jak zagnieżdżanie przerwań czy zmiana kontekstu po przerwaniu. Idea jest taka, że w twoim przypadku SysTick musi mieć wysoki priorytet (najwyższy w "systemie", w znaczeniu w RTOSie), tak aby tick był regularny i się nie gubił. Przełączanie kontekstu na najwyższym priorytecie zaś jest średnio zabawne,...
Czyli nie dość, że nie możesz wrzucić całego kodu, to jeszcze ten który wrzuciłeś nie ma nic wspólnego z tym który powoduje problem... Kod w "if" korzystał ze zmiennych "widocznych" z poziomu przerwania. Kod w funkcji po pierwsze korzysta np ze zmiennej lokalnej (parametru funkcji), niewidocznej i nie-istniejącej poza tą funkcją, a po drugie korzystając...
Procedura obliczenia() musi być wykonana po każdym przepełnieniu timera i tylko po przepełnieniu timera (musi się wykonać dokładnie tyle samo razy ile razy wystąpiło przerwanie timera). Wymagana jest też w szybka reakcja na inne przerwania - szybsza niż trwają obliczenia() Prawie dobre rozwiązanie nr 1(pseudokod): Proszę wytknięcie błędów, opinie który...
Przecież twój kod się nawet nie powinien kompilować, więc jest faktycznie zły :) Jak sobie wyobrażasz zagnieżdżenie ISR? Mieszasz nowe makra (ISR) ze starymi (SIGNAL). Poza tym ATMega nie ma czegoś takiego jak priorytety przerwań. Przerwanie TIMER1_COMPA_vect nie zostanie przerwane, chyba, że jawnie odblokujesz wszystkie przerwania co zapewne doprowadzi...
Dzięki za wskazanie błędu :) Chciałem dla jednego z przerwań zrobić wyższy priorytet od pozostałych poprzez dodanie do tych pozostałych opcji ISR_NOBLOCK, co powodowało najprawdopodobniej opisane wyżej przepełnianie stosu. Nie rozumiem tylko dlaczego tak się dzieje, ponieważ problemy ze zmienną pojawiają się w czasie, gdy możliwe są wystąpienia następujących...
Witam, to co chcesz zrobić wymaga moim zdaniem 2 procesorów, bo obydwa procesy są czasowo zależne, a zwłaszcza usb. Procesor jest zajęty kontrolą odbioru pakietów i jak opisuje ciekawy artykuł o destuffigu nie należy mu w tym przeszkadzać. sei w przerwaniu to tzw. zagnieżdżone przerwanie, bardzo ryzykowne i moim zdaniem nie do stosowania w C, bo nie...
rzeczytaj komentarz nad tymi dwoma wartościami w skrypcie linkera. Przeczytaj go BARDZO wnikliwie. Ok, wnikliwie. Moje wątpliwości budzi: Thread mode can use main stack Nie miałym dotąd potrzeby zastanawiania się nad tym, w jakim mode działam. Nie są zbyt zagnieżdżone przerwania, zresztą spod keila program działał. Teraz działa już z grubsza. Wykrzacza...
Sprawdź [; Nie znam tego kodu, więc nie wiem, niemniej jednak jeśli tylko jest on w miarę "standardowy" to nie powinno być problemów. Niestandardowe elementy które mogłyby być problematyczne to np. jakiś kod inicjalizacyjny w startupie (włączanie PLLa czy jakichś peryferiów) - wystarczy przenieść kod assemblerowy "ręcznie" do nowego pliku .S i nazwać...
Doczytałem dokumentację i muszę przyznać, że masz absolutną rację Andrzeju. Pozornie nie ma zagnieżdżonych przerwań: normally interrupts will remain disabled inside the handler until the handler exits Można jednak sobie poradzić z ręcznym priorytetowaniem. W obsłudze dowolnego przerwania można maskować tylko te przerwania, które faktycznie mogą być...
Do arturt134 Wyłączenie przerwania na czas odpowiadający pracy powiązanej z przerwaniem( oczywiście nie globalne wyłączenie przerwań, co byłoby po prostu odsuniętym przerwaniem bez zagnieżdżeń) jest dobrym rozwiązaniem. I skanowanie klawiatury zamiast przerwań też jest dobre. Ale nie mogę się zgodzić co do uniwersalności Twojego rozwiązania. Jest przejrzyste...
HEAP miał 8kB, STM32F103 ma 20kB SRAM, to może 12kB na stos USB, jakieś globale, konteksty zagnieżdżonych przerwań itp. to momentami dla niego za mało? Raczej nie ma opcji, żeby 12 kB na stos było zbyt mało. Poza sytuacjami extremalnymi mi się jeszcze nie zdarzyło używać więcej niż 4 kB, ale tylko w sytuacjach gdy "głęboko" są używane funkcje typu...
Widzę że się znasz na rzeczy wiec zadam Ci kilka pytań jeśli pozwolisz. 1. Czyli jeśli chcę żeby przerwanie od TB miało najwyższy priorytet to muszę odblokować w pozostałych przerwaniach GIE ponieważ chodziarz to przerwanie w Tabeli jest na wyzszym poziomie nie przerwie mi przerwania np Portu. 2 Czy dobrze rozumiem <bo to mi umsknęło podczas przeglądania...
Gdyby zostać w IRQ, trzeba by zrobić zagnieżdżone przerwania czyli takie które mogą być ponownie przerwane przez inne IRQ, a to sporo kłopot i ryzyko. Czemu zagnieżdżać, nie wystarczy po prostu poustawiać odpowiednie priorytety przerwań w VIC? Musze ogarnac pisanie tych skryptow w asmie. Bo widze ze bez tego daleko nie pojade. To jakos sensownie opisane...
Nie ma takiej zależności. Jeśli nie korzystasz z dynamicznej alokacji pamięci to możesz to bardzo zgrubnie oszacować po ilości zmiennych automatycznych (lokalnych), a szczególnie tablic. To co czyni takie oszacowanie szczególnie trudnym to określenie stopnia zagnieżdżenia funkcji - bo to zajmuje sporo pamięci na stosie. A zależy to od ilości przerwań,...
Zdefiniuj czym są atomiczne(/atomowe) przerwania? Procesor albo skacze do ISRa albo nie . (pomijając zagnieżdżone przerwania) Zgodnie z rozumowanie kolegi jeśli jakiś blok jest atomowy w części, to znaczy, że nie jest atomowy wcale. Ciekawe rozumowanie. A jeśli blok, załóżmy 10 instrukcji assemblera pracujące na ulotnej zmiennej, gdzie dereferencja...
W nowszych wersjach przykładów wszystkie stosy były zerowane, a wiec po "dłuższym" czasie działania swojego programu możesz sobie podejrzeć pamięć i po prostu zobaczyć ile jest wciąż wyzerowane i zmniejszyć dany stos o tą wartość (zostawiając sobie jakiś tam margines bezpieczeństwa). Generalnie dla aplikacji rzadko potrzeba więcej niż 1kB, a dla przerwań...
Zrób do migania timer zagnieżdżony, czyli coś co w przerwaniach będzie odliczać wstępnie do 200 i dopiero co każde takie odliczenie odliczaj ten Twój regulacyjny timer. Dzięki temu będziesz miał już nie 80kHz tylko 400Hz dla timera. Wtedy dopiero uzyskasz jakiś widzialny gołym okiem zakres zmian.
(at)koham, no masz rację, ale stwierdzenie, że jeśli fakty przeczą temu co napisałem, tym gorzej dla faktów idealnie tu pasuje. To drugie wywołanie nie służy ponownemu sprawdzeniu przycisków i jest bez sensu, bo nie mierzy wtedy czasu od poprzedniego (choć pełna ms i tak nie minie) stanu przycisku. To tylko potwierdza, że tym bardziej nie należy tego...
(at)WX3V To co napisałeś to jakiś zbiór życzeń i dziwnych przemyśleń. Albo dopiero zacząłeś programować, albo do tej pory pisałeś programy w asemblerze. Nie ma nic takiego jaki zachowanie kolejności zmiennych, sortowanie po typie czy innym kryterium. Zagnieżdżenie wstawki asm w funkcji obsługi przerwania jest możliwe i nie ma tutaj wątpliwości. Ale...
Przeanalizuj te swoje polecenia GOSUB pod względem możliwości wyjścia i ich zagnieżdżenia. Zwiększ również nieco stos HWStack bo masz przerwania i sporo odwołań przez GOSUB.
W Zmienne globalne — wiedz, kiedy są modyfikowane Zmienne globalne muszą być ostrożnie obsługiwane, gdy są używane z przerwaniami, ponieważ te są generalnie asynchroniczne. I jeżeli zmienna globalna jest modyfikowana przez ISR, może zostać zmieniona w dowolnym momencie. Musimy mieć na uwadze następujące aspekty: Odczyt/zapis zmiennych globalnych...
Aż mnie dziwi, że przy takiej ilości zagnieżdżonych skoków program się nie wysypuje. Albo może się wysypuje i stąd te dziwne wyniki. Za radą kolegi Mundi1970 zainteresuj się definicjami stosów i przebadaj zagnieżdżanie podprogramów.
Szum na wejściach raczej nie jest problemem, każde wejście ma wbudowany przerzutnik schmitta. Oprócz tego w trakcie zliczania wykonywane jest całe mnóstwo działań matematycznych, Gdzie są te obliczenia wykonywane? Jeśli w przerwaniu to być może trwa za długo. a chwilowe wyniki obliczeń i pomiarów na bieżąco przesyłane są po RS232 (9600 B/s) do komputera...
Niedawno zrobiłem mały egzamin tej 'inteligencji', marnie wypadła ze znajomości avrów ;) (nie można zagnieździć bold w code, więc będzie rozlazłe) procesor avr ze stosem sprzetowym ChatGPT Procesory AVR, takie jak te z rodziny ATmega, są wyposażone w stos sprzętowy, który jest używany do zarządzania wywołaniami funkcji, przerwami oraz przechowywaniem...
Korzystaj z nich, bo po to właśnie są, a zaoszczędzisz moc obliczeniową mikrokontrolera wszystko fajnie, ale łatwe programowanie (IDE) pozwala na użycie tylko Arduino Uno ma je tylko na pinie 2 i 3 nawiasem mówiąc, w zależności od trybu, może reagować na poziom, jedno zbocze lub oba zbocza. Zagnieżdżenie kodu w innych przerwaniach wymaga zapewne kodowania...
W pętli while, IF'y powinny być zagnieżdżone, żeby dobrze działał debouncing.
instrukcja SEI na początku ISR, avr-libc to załatwia Dla ścisłości, powinieneś użyć: ISR(XXX_vect, ISR_NOBLOCK) { ... } bo wpisanie na początku obsługi przerwania sei(); to nie to samo. Wtedy przerwania zostają włączone dopiero po prologu, czyli np. po odłożeniu na stos używanych rejestrów - to wprowadza pewne opóźnienie. To ma sens...
OK :) Enumeracja działa. Przechodzą deskryptory, wiec podstawa do budowy urządzeń już jest :D Pierwsze co trzeba było zmienić to podczas konfigurowania przerwań dodać na końcu linijkę: __ARMLIB_enableIRQ(); Oprócz tego zmiany w pliku startowym, aby możliwa była obsługa przerwań zagnieżdżonych. Czyli: irq_handler: //---- Adjust and save return...
99% osób używa po prostu DOBRYCH projektów, a ty na siłę chcesz uruchomić projekt, który po prostu jest kiepski. 1. W skrypcie linkera dopisz sobie gdzieś na początku ENTRY(_startup); (co w sumie nie jest do końca poprawne, ale tym sposobem jest najprościej) 2. W jakimś pliku z kodem musisz mieć funkcję void AT91F_LowLevelInit(void) - najlepiej pustą...
powf() jest kiepskie tylko dlatego, że wewnętrznie ta funkcja jest zrealizowana na logarytmach. Po prostu wystarczy pomnożyć - x * x. Co do teorii że "liczby całkowite będą kilkadziesiąt razy szybsze", to chciałbym tylko powiedzieć, że instrukcja VMUL (mnożenie zmiennoprzecinkowe) w tym układzie zajmuje JEDEN cykl. He, he, he, znów pułapka Freddiego....
Luźne dywagacje to znaczy takie sobie gdybania i rozważania. Czego nie wolno i dlaczego nie wolno, sztuczki i kruczki itp... Temat nie tylko dla mnie, mam nadzieję :) . Na początek konkretne zapytanie. Wywołujemy sobie przerwanie, załóżmy INT1. Wiemy, że dopóki trwa, nie wywoła się żadne inne przerwanie. Możemy sobie jednak włączyć globalne zezwolenie...
Czepia się, bo wszystkie funkcje (w tym ISR) umieściłeś w main. ISR z natury są globalne, więc nie mogą być zagnieżdżone w ciele innej funkcji.
Problem jest następującej natury. Do interfejsu SPI jest dorobiony zestaw funkcji, który realizuje buforowaną transmisję poprzez programowe FIFO i DMA. Do bufora FIFO ładowane są dane typu wskaźnik na dane do nadania, wskaźnik na tablicę dla danych odebranych, dane umożliwiające machnięcie linią CS oraz długość transmisji. Jednen "element" FIFO to jedna...
kolego atom1477 --> zanim zaczniesz komuś zarzucać, że gada bez sensu - to może najpierw przyjrzyj się swoim wypowiedziom i poradom ogólnym jak choćby o tym, że wszyscy używają starych bascomów to dlatego opowiadasz o max 255 dla waitms .... mógłbym tak cię co chwilę łapać za słówka - ale nie o to chodzi To akurat nie była porada ale stwierdzenie....
Witam, układ z ostatniego schematu może słabo działać. Mosfet będzie załączał się szybko ale wyłączanie będzie bardzo powolne, przez rezystor 10 kΩ. Poza tym dość duże napięcie zasilające wymusza stosowanie diody Zenera, w stanie załączenia przez rezystor w bramce 47 Ω oraz przez tę diodę będzie płynął bardzo duży prąd, elementy będą się grzały....
Kolego, zacznij od podstaw C, bo ten kod nie ma szans na kompilację. Np. konstrukcja: char usart_bufor[60] = ("napiencie") |(sprintf(wynik,"U=%1.3f [V]",adc)); kompletnie nie ma sensu, podobnie UDR = usart_bufor[60] = ("napiencie");. Co to ma być? Kolejna sprawa, że ISR zagnieżdżony w funkcji też nie ma sensu (funkcja obsługi przerwania nie może być...
Ten program nie działa dobrze, bo czasy zaświecania kolumn są różne. Poza tym masz pięć zagnieżdżonych pętli, zupełnie nie wiadomo, do czego. Tego nie da się zrobić dobrze bez przerwania timera - przeczytaj to, co napisałem wyżej i zastosuj. To nie takie trudne.
W zasadzie we wszystkich przykładach wykorzystania przerwania z UARTA nie było nigdzie czyszczenia flagi, więc założyłem, że jej nie potrzeba... gdzieś czytałem, że flaga jest automatycznie czyszczona, ale jestem laikiem więc mogę się mylić. Wdzięczny byłbym za wszelkie wskazówki jak do tego podejść. Zamiast zgadywać, zakładać i czekać na odpowiedzi...
Tam są głownie skomplikowane obliczenia rampy akceleracji i deceleracji. A ja to chciałem uprościć- acc i dec mają te same nachylenia prędkości. W dodatku przyspieszenie nie musi być liniowe- tylko zależne od czasu przerwania. Ale o ile graf rozumiem- to mam wrażenie że powyżej 10 if zagnieżdżonych program zaczyna żyć własnym życiem.
w trybie ISR_NOBLOCK może dojść do przepełnienia stosu jeśli przerwania będą się pojawiać zanim bieżące nie zostanie obsłużone. W takich sytuacjach warto sobie wstawić jakiś licznik zliczający zagłębienie wywołań. Tak by było, gdyby przerwanie pochodziło od poziomu niskiego a nie od zbocza albo przerwanie odbiorce USART. Gdy jest przerwanie od zbocza,...
Witam, nie mam czasu na dokładną analizę kodu ale problem raczej nie jest zabójczo skomplikowany. Powinieneś zastosować jakiś znacznik "właśnie wciśnięto przycisk zmiany efektu". W funkcjach poszczególnych efektów (dużo pętli for) analizujesz wspomniany znacznik i ewentualnie "wyskakujesz" z pętli (czasami chyba kilku zagnieżdżonych), na wyjściu z funkcji...
nie pytajcie się mnie o jakieś szczegóły 0. Załatwione :) Ja nie będę pytał. 1. Nie liczenie wcale nie nastąpi. 2. Nie, O będzie miało stale wartość 0. 3. Daje to tyle, że wynik będzie z sufitu. A teraz kilka słów wyjaśnienia: Ad.1. W funkcji main, masz pętlę opartą o while(1). Ta pętla zostanie przerwana tylko brakiem zasilania. Program nigdy nie...
M8 == ATMega8 Opcje można znaleźć w helpie BASCOMa Options Compiler Chip itd...np... XRAM Pamięć zewnętrzna (dla M8 nie wchodzi w grę) HW Stack Stos "hardwarowy" adresy wywołań GOSUB (każde zagnieżdżenie = 2 bajty), dla procedur obsługi przerwań ze składowanymi rejestrami kazde zagnieżdżanie=32 bajty). Używany także przez inne instrukcje BASCOMa. Soft...
Nawet jakby działało, to pewnego razu stos by się przewrócił :) ------------------------------ Edytowałem, ale chyba robak był szybszy :P Nie ma co kombinować, nawet jak się uda, to program będzie działał np przez 50 przyciśnięć, po czym nastąpi zwiecha. Nie ma też co dyskutować na temat sensu takiegoż programu, gdyż sensu on wówczas mieć nie będzie...
Tych wartości nie ustala się eksperymentalnie. Nawet podałem na forum przepis co i jak... Szukać! $HWSTACK = 32 - jak nie używasz przerwań to możesz zmniejszyć nawet dwukrotnie. Pamiętaj tylko by nie używać zbyt dużo zagnieżdżonych odwołań GOSUB. $SWSTACK = 18 - jak nie ma poleceń CALL, SUB, FUNCTION, LOCAL to to taka wartość to marnotrawstwo RAM. W...
To żaden debouncjing, przecież jak drgają styki to masz naprzemienne zbocza narastające/opadające, inaczej byłby to stabilny stan logiczny :) Oczywiście w większości przypadków to nie przeszkadza i można sobie robić na przerwaniach. Problem pojawia się w sytuacji, kiedy inne procedury wymagają niskiego, albo chociażby przewidywalnego czasu reakcji na...
Jeśli rzeczywiście będzie to po kolei to powinno się wykonać automatycznie stąd if nie są zagnieżdżone, ale kolega MNCHH z jakiegoś :) powodu broni się przed przerwaniami :( Więc nie ma gwarancji, że coś po drodzę się nie wydaży i wysłanie znaku będzie możliwe dopiero za jakiś czas, czyli kolejny znak będzie już czekał w bufforze :( więc trudno powiedzieć...
Tak samo, jak break nie przerwie Ci wszystkich poziomów pętli zagnieżdżonych, tak samo jest z rekurencją. Dokładnie jak kolega wyżej radzi - funkcja musi zwracać wynik, który będzie decydował o przerwaniu każdego z wyższego poziomu po kolei. Np tak: [syntax=c]int f(int a) { if (rand()%a==0) return 1; if (f(a+1)) return 1; if (f(a-1)) return 1; if (f(a))...
... Jednak dla spokoju mojej duszy jeżeli stworze program w pętli którego będę wyświetlał zmienną na wyświetlaczu LCD to jest możliwe że za którymś razem przerwanie przerwie w „połowie” transmisję danych do wyświetlacza co spowoduje wyświetlenie krzaków na wyświetlaczu tak? Pozdrawiam Jeśli w przerwaniu nie używasz LCD , to NIE MA PRAWA...
Ale właśnie z przerwania musisz "wrócić" poprzez instrukcję RETI - jak np. zrobisz przez RET to uP nie wejdzie powtórnie do tego przerwania ( tj. normalną drogą przez wywołanie tego przerwania ) Ja robiłem taką sztuczkę z PUSH xx PUSH xx RETI właśnie po to - ale zapewne w Twój program nie będzie wymagał takich "zabiegów" - po co chcesz wychodzić z przerwania...
Zajętość pamięci RAM jest oczywista - to po prostu rozmiar wszystkich zmiennych, jakie mogą zaistnieć w najgorszym przypadku przy największym poziomie zagnieżdżenia procedur plus po jakieś 20 bajtów na każdy poziom zagnieżdżenia To zależy od uC. AVR ma dużo rejestrów i stos jest w praktyce potrzeby tylko na adres powrotu. W przerwaniach, używane rejestry...
Witam mam problem z zrozumieniem warunków If w Bascomie ponieważ mam program dość zagnieżdżony więc już sam się pogubiłem .Oto kawałek programu Przerwanie: Incr P If P >= 1000 Then T0 = T0 - 1 T1 = T0 + 2 If R >= T0 And R <= T1 Then If Wylacz = 1 Then Kontrola = 0 End If Wylacz = 1 Else Kontrola = 1 Wylacz = 0 End If If R < T0 Then Incr...
Twój problem niewiele ma wspólnego z mikrokontrolerami. To raczej zagadneinie z podstaw programowania i budowy algorytmów. W sieci znajdziesz zapene całe mnóstwo podobnych projektów - szukaj, czytaj i się ucz. Spróbuj też zapisać program w taki sposób, żeby był przynajmniej 10 razy krótszy. Programowanie nie polaga na szybkim rozmnażaniu prawie-nic-nie-robiących...
A na czym polegałaby realizacja w main? Bo o przerwaniach nie wiem wiele. Tutaj mam mniej więcej algorytm jak to mogłoby wyglądać. Na początku był pomysł wybierania opcji po konkretnej ilości wciśnięcia przycisku. A teraz myślę, że łatwiej byłoby zrobić coś takiego: http://obrazki.elektroda.pl/4715666900_1... Tylko gdy zagnieżdżę pętle...
Żeby pisać na mikrokontrolery w C++ trzeba znać ten język bardzo dobrze. Niestety mikrokontroler to nie PC i nie "wybacza" nieprzemyślanych konstrukcji, które kończą się alokacją ogromnych ilości pamięci. Tak konkretniej to chodzi mi o nieprzemyślane używanie klas. C na mikrokontrolery jest znacznie łatwiejszy. A mógłby ktoś napisać w C++ i w C program...
Witam. Od kilku godzin próbuję uporać się z obsługą przerwań zewnętrznych. Znalazłem kod (zamieszczony poniżej) jednak nie działa on na mojej płytce. Jeśli się nie mylę, to działa on na Cortex M3, a nie M4. Czy ktoś byłby w stanie powiedzieć, lub nakierować w jaki sposób poprawić kod, by działał na mojej płytce? Dodano po 2 Problem się chyba rozwiązał,...
Dodatkowy wpływ na błąd ma niedokładność częstotliwości generatora kwarcowego. Błąd w sekundach na dobę, wyraża się wzorem: \Delta=86400*(1-\frac{fwzr}{f}) \Delta - błąd w sekundach na dobę (wartość ujemna oznacza spóźnianie się) fwzr - częstotliwość wzorcowa (czyli to co ma być np. 4000000 Hz) f - częstotliwość rzeczywista kwarcu lub generatora kwarcowego...
Instrukcja TCNT = 0 jest zbędna i fałszuje pomiar czasu. Wyrzuć ją z obsługi przerwania, a zostanie Ci tylko błąd oscylatora. Nie masz żadnego "wewnętrznego kwarcu", bo niczego takiego nie ma w mikrokontrolerze - używasz niedokładnego oscylatora RC. Ponadto bezsensownie sprawdzasz wartość min, gdy wiadomo, że nie mogła się zmienić. Zagnieźdź if () jeden...
qnrad - pojedynczy zapis do eepromu to ponad 8ms przy 1MHz - zobacz stronę 21. Zapis co kilka sekund do eepromu to dobry sposób, żeby go zarżnąć w kilka dni - wytrzymałość jest na poziomie 100k zapisów. do autora - żadnego polecenia return w przerwaniu bo będziesz miał tylko jeszcze gorzej. return na końcu funkcji void (a takie są przerwania) nie ma...
tak jak piszesz reti używasz tylko do powrotów z przerwań, natomiast samo ret do powrotów z funkcji (podprogramów) aby dosyć jasno pisać kod należałoby się trzymać pewnej zasady, o którą czasem wiadomo ciężko ale... .... otóż po tei inicjalizacji robisz tzw pętlę główną (zamkniętą) - występuje ona w każdym języku wyższego poziomu jak Bascom lub C. czyli...
no zrobiłeś sobie liczbę 3 bajtową 03_84_FFh, czyli 230655. Najbardziej znaczący bajt masz w R18, najmniej - w R16. No i dekrementujesz. Nie do końca natomiast wiem, skąd się doliczyłeś 230400. Chyba, że po drodze wchodzi Ci jeszcze przerwanie i modyfikuje zawartość któregoś rejestru. A to co chcesz zrobić powinienneś (czyli 3x132 itd.) napisać w pętli...
Ok, dzięki za odpowiedzi. To tylko rozważania teoretyczne, z czystej ciekawości. Przez wiele lat pisałem programy w asm wielu procesorów, więc siłą rzeczy było to pod moją kontrolą. Teraz zacząłem (od roku) w C. Dało mi to znacznie większe możliwości kosztem - niestety - utraty kontroli, a przynajmniej tak łatwej i bezpośredniej kontroli. Dlatego czasem...
Witam. Od końca: Kwarce najlepiej użyć takie, by odchyłka prędkości transmisji była jak najmniejsza (poniżej 5% powinno być ok.). Bascom ułatwia ich dobór. Wybierz z głównego menu Options => Compiler => Communication. W okienku które się otworzy wpisz/wybierz pożądaną prędkość transmisji, oraz częstotliwość rezonatora, a poniżej możesz odczytać jaka...
Bardzo dziękuję za krytykę. Zamiast operatora AND mam zbudować zagnieżdżone pętle. Wykorzystuję timer2, bo w M32 mam możliwość taktowania go zewnętrznym kwarcem (w moim przypadku 32768), ale docelowo będzie to pracowało w M8, więc program będę musiał delikatnie skorygować. Co do przerwania cosekundowego: -nie znalazłem metody na uzyskanie takowego,...
funkcje zagnieżdżone zagnieżdżone pętle renesas przerwania
eprom radmor kabel ethernet przerywa częstotliwość karetka
Wymiary o-ringów pompy paliwa 4B0919051E Satel Integra: Czułość Wejścia 0 ms - Znaczenie