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,...
Generalnie w takich przypadkach nota układu twoim przyjacielem. Poczytaj to co napisałem w komentarzach. [syntax=c]#include <avr/io.h> #include <avr/interrupt.h> int main(void) { uint8_t i = 0; DDRD = 0xff; //TCCR2A |= (1<<WGM21)|(1<<WGM22); // źle ten tryb jest zarezerwowany TCCR2A |= (1<<WGM21) // CTC //TCCR2A |= (1<<CS20)|(1<<CS21)|(1<&l...
Mylisz się, da się to zrobić bez przerwań. Na przerwaniach też się da, więc żeby poczuć różnicę i na coś się zdecydować po prostu zrób jakiś projekt, bo z filozofii nic nie wyniknie. Po to mikroprocesor ma te wszystkie timery, przetworniki itp. żeby z nich korzystać. Używając przerwań sprzętowych. Bo jak nie- to używasz "wykastrowanego" procesora....
a ja chce zauważyć pewien średnik po while
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....
Zmniejsz rozdzielczość, tworząc na przerwaniach programowy PWM. Przy 5 bitach wyciśniesz ponad 200kHz. Jak koniecznie ma być coś zewnętrznego to nawet NE555 można kontrolować załączając odpowiednie wartości rezystancji/pojemności. http://lmgtfy.com/?q=external+PWM+contro...
W AMEGA 2560 można to zrobić tylko programowo (podczas wchodzenia w przerwanie). Generalnie nie ma to sensu bo narzut na programowe ustalanie priorytetu będzie większy niż odpowiednio napisana funkcja obsługi enkodera na INT0. Tzn. lepiej szybko obsłużyć INT0 niż się bawić w ustawianie priorytetów przerwań.
... i zamiast sprzętowego zrób programowy.
Wartość początkową ustalam odejmując 256 i 125, stąd TCNT0 = 131. Dlaczego tak to liczysz? Używasz trybu normalnego Timera0. Timer 0 w trybie normalnym liczy od 0 lub wartości początkowej ustawionej w rejestrze TCNT0 do wartości 0xFF. Przy 8 MHz i podziale przez 256 obliczenia wyglądają następująco: 8Mhz/256 = 31 250 31 250/256 (od 0 do 0xFF) = 122...
np. Nie da się. TImer0 może zliczać tylko z pinu PD4. I to z PinD.4 a nie PortD.4 ;) Można i z PinD.0, ale nawet przerwania żadnego do tego nie ma więc trzeba by programowo. A nawet jak przerwanie by było (mowa o przerwaniach INTx) to Timer tego nie zliczy. Trzeba by programowo zwiększać zawartość licznika Timera0, ale po cholerę. Jeżeli to ma być...
Witam, Znalezione przez Google IRQL_NOT_LESS_OR_EQUAL (0x0000000A). Występuje, kiedy sterownik urządzenia wykorzystujący przerwanie programowe z danym priorytetem próbuje uzyskać dostęp do obszaru pamięci, zajętego przez proces korzystający z przerwania programowego z wyższym priorytetem
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...
:D Ale nadal mnie nurtuje dlaczego przy takim programie i włączonym wewnętrznym pull-up generuje Ci się przerwanie, pomimo stanu wysokiego na wejściu INT1. Co tam masz podłączone?
PCINT to specjalne przerwania aktywowane zmianą stanu pinu. Dodatkowo wszystkie przerwania PCINT w tych procesorach wywołują jedno przerwanie, w którym należy programowo określić, który pin je spowodował ważny jest też rejestr PCMSK, który odpowiada za maskowanie nieużywanych przerwań. Polecam lekturę datasheetów tych procesorów w celu dokładnego poznania...
Przerwanie od t1 nieblokowane lub w jego wnętrzu sprawdzasz flagę SPI i obsługujesz przerwanie programowo od SPI odbierając bajt
ale nie wiem jak podejsc do przerwan zewnetrznych (przyciski). Przyciski mam podlaczone pod: P3.3 (Int1), P3.5(T1), P3.4 (T0), P3.2 (Int0). Jak to jest mozliwe ze sterujac multiplekserowo wyswietlaczami segmentowymi wysylajac aktywny bit na port P3, moge jednoczesnie zglaszac zewnetrzne przerwania (z przyciskow)?? Możesz. Ale dlaczego przyciski mają...
Jak rozumiem chcesz defakto dzielić częstotliwość przebiegu jeżeli tak to nic prostszego: pętla for inkrementowana stanem wysokim np. i po osiągnięciu określonej ilości powtórzeń zmiana jakiegoś pinu "wynikowego" na stan przeciwny. problem się zacznie jak będziesz chciał podzielić przez liczbę inną niż wielokrotność 2 nie mam pomysłu jak takie dzielenie...
marco47 - przepraszam, nie zauważyłem. marek19951 - proste if-then nie załatwi problemu. Jeżeli masz zapał, a widzę , że masz, zacznij od procedury obsługi klawiatury , która nie powoduje opóźnień poprzez martwe pętle ( czyli m.in wait, debounce, bitwait itp). Ja to zrobiłem na przerwaniu programowym z timer1, które odliczało mi okresy 10 ms w połączeniu...
...Jakie jest zatem rozwiązanie tego problemu (jeśli jest)? Bascomowy UART programowy działa jedynie wtedy , kiedy wywołamy funkcję z nim współpracującą. W pozostałych przypadkach ( kiedy działają funkcje/procedury nie związane z programowym UART-em ) , nadchodzące dane są "niewidoczne" dla procka :( Np. jeśli masz w kodzie Wait 1 , a w czasie działania...
Może się mylę ale w kilku uC można wywołać przerwanie programowo, jeśli nie będzie oprogramowane to prawdopodobnie nastąpi !(at)#, lub inny powód gdy z powodu błędu oprogramowania zostanie skonfigurowane przerwanie i wyzwolone przerwanie pomoże znaczenie szybciej odnaleźć błąd.
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...
Usuń z katalogu projektu plik ..\Global\Language, to pozwoli Ci otworzyć dowolną wersję językową. OB121 to przerwanie wywoływane w przypadku błędu programowego. Wystarczy, że puste umieścisz w sterowniku. Jednakże nie spowoduje to braku błędu, a jedynie zapobiegnie przechodzeniu PLC w stan Stop.
Pin ICP nadaje się jeśli chcesz określić np. długość impulsu. Dla enkodera się nie nada - enkoder daje sygnał w kodzie Graya, ponieważ M8 nie ma sprzętowego dekodera tego kodu musisz to zrobić programowo. Aby nie czekać w pętli i ciągle nie sprawdzać czy coś się nie zmieniło wyjścia z enkodera trzeba podpiąć pod wejścia generujące przerwania. W handlerze...
Pewnie jest tylko gdzieś przerwane ( wypięte ) , programowo nie da się wyłączyć .
Dysponuję autorskim protokołem transmisji danych przez pojedynczy kabel. Szybki, niezawodny, odporny na zakłócenia . Wymaga jednego timera z jednym kanałem capture i jednym kanałem match. Oczywiscie mozna to zrobić po prostu na przerwaniach programowo, ale wtedy osiągane prędkości są raczej nie... imponujące. Protokół jest zasobożerny, lecz implementuje...
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....
Ale mieszasz. Ustawiłeś dwa cykliczne przerwania i dziwisz się, że coś nierówno miga. Tu w avr nie ma wielowątkowości sprzętowej i jedno przerwanie przeszkadza drugiemu. Przenieś i wyłącz to przerwanie to co masz w ISR(TIMER2...) do ISR(TIMER1...) . Idea programowego PWM i timerów jest właśnie w tym aby działało wszystko pod jednym wspólnym cyklicznym...
Fakt, tylko uart kasuje flage programowo. ... i to tylko przerwanie odbioru danych (RXC), bo już nadawania (TXC) także kasuje się po wejściu do przerwania.
możesz zrobić przerwanie z timera + programowy "watchodg" który sprawdzi co jakiś czas czy procesor działa. Jeśli nie (bo wartość w programowym watchdogu jest zbyt duża) to wtedy taka sekwencja: 0. sprawdzenie flagi "gotowy" - jeśli ustawiona to czekaj na reset z WD - nie rób nic 1. reset wd 2. zapis do eeprom 3. ustawienie flagi "gotowy" cóż, słyszałem...
Takie odwołanie powoduje zerowanie flagi. Wydaje się to dziwne ale już się sam przekonałem. Generalnie w symulatorze AvrStudio ustawienie flagi wywołuje przerwanie. Może wpis zera będzie powodował wygenerownie przerwania ??
A więc pod DOS-em też mogę używać tych procedur? :?: watpie bo widzialem tam cos w rodzaju win32 pod dosem mozna wykorzystac przerwanie programowe do odczytu sektorow z dysku (chyba int25h) i zabawa z tablica partycji chyba ze sa jakies biblioteki(prawie na pewno tylko gdzie ich szukac?) pozdro
Sprzętowo tylko na wyjściach OC. Przy tej częstotliwości można sterować dowolnymi wyjściami programowo, obsługując wszystkie przerwania timera.
Witam! ATCH - Blok funkcyjny łączący określony numer zdarzenia "EVENT" z wybranym numerem przerwania "INT". Operacja zostanie wykonana, gdy do wejścia "EN" podany zostanie sygnał. W momencie, w którym warunki określone numerem zdarzenia są spełnione zostanie automatycznie rozpoczęty proces wykonania fragmentu programu, któremu zosta! przydzielony numer...
Witam po długiej nieobecności. Atmega2560 odblokowana. Poprzestawiane fuse bity. Udało mi sie odblokowac programatorem równoległym . Przypuszczam ze przyczyną pomieszania fuse bitów było przerwanie wgrywania programu do mikrokontrolera (przerwanie programowe lub odciecie zasilania). Korzystajac z programu avrpp.exe odczytałem aktualny stan fusebitów...
Ja na razie zostaje przy przerwaniu programowym Może coś przespałem, ale wydaje mi się, że w AVR nie występują przerwania programowe.
To trzeba już nałożyć programowo na przerwanie PCINT. Ogólnie konfigurujesz PCMSK tak, aby były aktywne piny 3 i 4, a potem w programie przerwania sprawdzasz, który pin zmienił stan (wygenerował przerwanie) oraz w jakim był stanie przed przerwaniem (stąd wiesz jakie zbocze wygenerowało przerwanie). Można więc nawet programowo przypisać inne funkcje...
[syntax=C]void SysTick_Handler(){ SysTick_Config(prescaler_systic);[/synta... W jakim celu w obsłudze przerwania od SysTick, ponownie konfigurujesz licznik? Logika podpowiada, że raz uruchomiony działa i nie trzeba nic więcej robić. Jeżeli po odliczeniu czasu, przyjmujesz przerwanie, przechodzisz do ustawiania i na nowo startujesz licznik, to częstotliwość...
Można toggleować ale nie skrócisz cyklu timera do tych 4ms, to musi być wykonane poprzez ocr2a, ewentualnie zerujesz programowo w przerwaniu od ocr2b. To z tym read only musi być błędem, w datasheetach też się takowe zdarzają
(at)R-MIK z tego co piszesz wynika, że wpisujesz przerwanie programowe? Nie bardzo wiem do jakiej z moich wypowiedzi sie odnosisz. W całej tej dyskusji dałem propozycje użycia przerwań od timera i przerwań od zbocza opadającego. Dodano po 1 W takim razie, gdyby głównym zadaniem urządzenia był pomiar czasu, w jaki sposób zabezpieczyć jego pomiar przed...
Równie dobrze można restartować płytkę programowo. W jaki sposób ? Czytałem o pinie przerywającym, ale też trzeba napisać odpowiedni kod, wstawić w odpowiednie miejsca, pomyślałem że najprościej będzie odcinać masę. Jak tutaj wyglądałby kod z przerwaniem programowym ?
Witam wszystkich użytkowników CodeSys . Mam pytanie dotyczące wizualizacji . Musze zrobić wizualizację do pracy mgr . Niestety jest to mój pierwszy kontakt z wizualizacją . Na wstępie mam pytanie jak zrobić np żeby dana bitmapa zmieniala kolor co pewien czas . Czy należy zrobić np dwie bitmapy i umieścić je w global image pol . Tylko co np zrobić w...
Mi to wygląda na jakiś błąd w koncepcji projektu oprogramowania. Zawsze powtarzam, żeby nie ruszać programowo priorytetów przerwań, bo na ogół kończy się to katastrofą. To jak ruszasz priorytety przerwan ? Sprzetowo ?? (at)arcyimperator Jak masz ustawione PriorityGrouping ?
No cześć Tak się składa, że na myszkę mam napisany własny soft do mojego "OS" więc musiałem z tym ciutkę powalczyć :) i poznałem tego stwora od koszulki :) Obawiam się jednak że dalszą zabawę z myszą szeregową i Uniwersalną przejaciówką możesz sobie darować :( Jeszcze raz powtażam , myszka i COM to tylko rozwiązanie protezowe gdyż: - mysz wymaga obsługi...
To nie są przerwania na PB1, 2, 3, a sprzętowe wyjścia timerów. NA ATmega8 masz trzy wyjścia PWM - dwa z T1 i jedno z T2. Nie wiem, ilu w końcu potrzebujesz. Jednego powinieneś użyć do generowania 36 kHz, kolejnego (a może dwóch) do sterowania silnikiem. Czemu mają służyć te zabawy z przerwaniem timera i programowym machaniem nogą uC?
Witam Dla celów edukacyjnych w załączniku jest schemat i program do obsługi czterech wyświetlaczy na układzie 74164 W układach bardziej rozbudowanych programowo trzeba wykorzystać Przerwania Piotr
korbis - wywoływanie poleceń BIOSu odbywa się przy pomocy przerwań programowych (tzw. przerwania BIOS-u). Wywołujanie funkcji biosu polega więc na tym, że do rejestrów ładujesz parametry funkcji, a następnie wywołujesz odpowiednie przerwanie (instrukcja int). Jest tego sporo, więc nie będę tego tutaj opisywał. Nie wiem, czy współcześnie jest to potrzebna...
Witam, W przypadku XMEGA32E5 i timerówTC45 znacznik przerwania od Overflow/Underflow nie jest automatycznie kasowany po wejściu do obsługi przerwania. Należy go skasować programowo poprzez wpisanie "1" do bitu OVFIF w rejestrze INTFLAGS w obsłudze przerwania. U Ciebie występuje dokładnie efekt braku kasowania znacznika. Pierwszy okres jest poprawny,...
Czy RTC (zegar czasu rzeczywistego) używający Timera 2 w trybie asunchronicznym , działa nawet wtedy gdy wyłączone sa przerwania globalne ? ... kwarc, preskaler oraz Timer2 nie potrzebuje przerwań ale to nie wystarcza do zrobienia całego RTC to wystarcza do zrobienia przerwania co 1 sekundę a reszta zegara musisz zrobić programowo i to właśnie na przerwaniu...
Co zrealizować? Programowe zliczanie impulsów? Ustawiasz timer tak, żeby generował przerwanie co 100 us, sprawdzasz stan portu, robisz xor z poprzednim stanem i testujesz, które bity są ustawione - ustawiony, znaczy zaszła zmiana stanu, czyli inkrementujesz odpowiednią zmienną.
Jeśli to przerwanie masz wywoływać programowo, to ja nie widzę różnicy między takim rozwiązaniem a tym co masz teraz... 4\/3!!
Tak wiem, tylko nie wiem jak to napisać w kodzie:) Na razie używam timer1 jako przerwanie do programowego pwm, to dziala, teraz pracuje nad ulepszeniem kodu bez wait, jeżeli możesz pomóc to skróciło by to moje męki w pisaniu nieprawidłowych komend. Żeby dobrze sie zrozumieć, chciałbym napisać coś w stylu Set port(zmienna)=L1,L2,L3.... nie if(zmiennna=100)...
Masz narzucony zegar 12MHz i on jest podstawą do obliczeń. Timer będzie taktowany zegarem 1/12 Fosc czyli 1MHz i tego nie zmienisz. Masz do odmierzenia 2 czasy 3360us i 10640us. Wybierając tryb 2 Timera utrudniłeś sobie sprawę bo maksymalny okres który możesz zliczyć do 256us. W takim przypadku musisz zrobić dodatkowy programowy licznik. Największy...
W sumie jeśli pierwszy bajt wyślesz jako 0b01010101 a program rozpozna, że rozpoczęła się transmisja to dałoby się conajmniej dwukrotnie zmierzyć jaki czas trwa stan wysoki i na podstawie tego można już określić jaką prędkością transmisji nadawca się posługuje. Z tym, że trzeba taki bajt synchronizujący wysłać - a nie zawsze będzie to możliwe. Można...
Jeśli chcesz mierzyć czas pracy załączonego urządzenia to przerwania i metoda sumowania czasu kolejnych cykli pętli programowej maja podobną dokładność. Jeśli chcesz mieć dokładną sekundę, minutę, itd to tylko przerwania
Nie dasz rady podłączyć kilka pinów pod jeden kanał system events, jest tylko jeden CHnMUX na kanał. W formie protezy na przerwanie INT z kilku pinów możesz programowo włączać przerwanie events.
Gdzieś na forum był już podobny temat przerabiany. Instrukcja skoku do przerwania trwa z tego co wiem 4 cykle zegarowe. W trakcie obsługi jednego przerwania inne nie jest obsługiwane. Zostanie wykonane dopiero po zakończeniu obsługi poprzedniego przerwania. Jeżeli co najmniej dwa przerwania wystąpią w tym samym czasie to zostanie obsłużone to z niższą...
wykład był o mikrokontrolerach freescale, ale pytanie to raczej jest odnośnie samej idei przerwań
Witaj sysiek! O to mniej wiecej mi chodzi ale jest jedno ale...funkcja sklaowania i wysyłania sygnału na wyjście analoga musi być natychmiastowa ponieważ jest to maszyna która wykopnuje non stop ciąg cykli. Będa to sygnały na analogu podawane cyklicznie w bardzo którkich odstępach czasu i bardzo szybko i tu jest problem jak to ze sobą połączyć gdzie...
Dla ćwiczeń - jak najbardziej. Edit: Edytowałeś post więc dodam: Jeśli musisz oszczędzić piny PWM lub timery do innych celów, to oczywiście rób PWM programowo. Ale wtedy musisz zadbać, by każde przerwanie wykonywało się szybko, by PWM się wyrabiał, bo znowu serwa będą drgać :)
No a skąd ci przyszło do głowy, żeby programowy UART chcieć z przerwaniem od sprzętowego używać ??? Ta wersja programowego UART'a w ogóle nie generuje żadnego przerwania.
Witam! Tak ostatnio borykam się z tym, maksymalnie wykorzystuje zasoby timerów/liczników mikrokontrolerów w moich projektach, a że lubię mieć jakiś zapas, tak do wykorzystania na przyszłość, stąd mój post. ;) Zazwyczaj wykorzystuje liczniki do odmierzania niezbyt dokładnych czasów, nie mniejszych niż 100ms Czy koledzy mają może jakieś fajne patenty...
(at)atom1477 Jeśli ja wygeneruje przerwanie co 1 ms, to muszę mieć potem możliwość coś zrobić, czyli w przerwaniu muszę chociaż zmienną inkrementować, albo zrobię toggle pin i połączenie z głównym MCU przez INT0 tak jak pisałem post wcześniej . Mam kwarc 20ppm i nie jest on wystarczająco stabilny, dlatego poszedłem na DS3231 i źródło timera od T1....
Podczas wykonywania programu obsługi przerwania w mikrokontrolerach AVR zgłoszenie przerwania tego samego typu ( lub innego) zostaje przyjęte do realizacji. Zostanie zrealizowane po zakończeniu obsługi bieżącego przerwania(nie koniecznie natychmiast). Jeżeli w trakcie przerwania zostaną zgłoszone 2 przerwanie różnego typu to po zakończeniu obsługi tegoż...
Do regulacji obrotów silnika - w zależności od zamontowanego w pralce - będziesz musiał użyć regulatora napięcia, najlepiej z wejściem analogowym dla silnika szeregowego, lub falownika dla silnika klatkowego 3-fazowego. W przypadku silnika klatkowego 1-fazowego - strata czasu. Dla silnika szeregowego potrzebny będzie jeszcze układ przekaźników konieczny...
A co robi w kodzie takie coś? Nawet masz komentarz napisany. [syntax=c]/* Wygenerowanie przerwania EXTI_Line9 programowo */ EXTI_GenerateSWInterrupt(EXTI_Line9);[/s...
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ś?
Oj, coś mi się to nie widzi ... jeżeli dobrze patrzę to pokazałeś fragment pętli głównej. Jeżeli tak, to chyba generujesz sobie programowo przerwanie takim rozkazem (nie wiem, czy AVR tak mogą). Pokazałem cały kod w którymś z pierwszych postów. Nie generuję przerwań programowo. EDIT: A swoją drogą to takim rozkazem: 0x40 jest równoważne 1<<INT0...
Zafiksowany Kamyczku. Wykrycie naciśnięcia przecisku w przerwaniu timera - to 2 linijki kodu w C, wykonywane 50 razy na sekundę. Ty proponujesz rozwiązanie wymagające przerwania od przycisku, w którym to przerwaniu należy zablokować to przerwanie, ustawić znacznik/timer programowy, a następnie w przerwaniu timera odblokować przerwanie przycisku. Mamy...
Byc moze za duzo razy wyzwala Ci sie procedura detekcji zera. Kiedy zbocze narasta/opada powoli to tak moze byc. Kiedys pisalem program do podobnego zastosowania. Zero bylo wykrywane prostym sposobem przy pomocy komparatora wewnatrz Atmegi88. Po kilku godzinach prob i zastawianiu pulapek programowych okazalo sie ze przerwanie od komparatora bylo generowane...
Watchdog nie jest programowy tylko sprzętowy Możesz mi powiedzieć co tu miałeś na myśli? Watchdog nie jest programowy? pierwsze słyszę. programowo: 1. ustawiam watchdoga na jak najkrótszy czas 2. wyłączam przerwania (na wszelki wypadek) 3. pętla nieskończona. i masz programowy PEŁNY reset i skok do adresu ustawionego za pomocą fusebitów. (to jest najpełniejszy...
Najczęściej spotykane błędy typu STOP Bez dwóch zdań — pracując z systemem Windows XP mamy o wiele mniej okazji do oglądania niebieskiego ekranu śmierci niż w przypadku poprzednich wersji Windows. Ale gdy już nasz system przerwie pracę i wyświetli ten ekran, warto przynajmniej wiedzieć, gdzie szukać źródeł tego problemu. Na szczęście, 9 na 10...
Wyłącz przed wykonaniem skoku przerwania, inaczej w czasie inicjalizacji danych/przerwań (którą robisz na początku programu) mogłoby zostać wywołane jakieś przerwanie i namieszać
Ktoś zliczał impulsy przerwać programowo? Jaką częstotliwość maksymalną można zliczyć?
Domniemam, że ujarzmiasz jakiegoś Cortexa bo wspominałeś o stosie w startupie. W taki wypadku musisz trochę więcej doczytać o samej architekturze ( o ile jeszcze tego nie zrobiłeś) tego rdzenia. Chodzi o to, że Cortexy mają dwa wskaźniki stosu, jeden jest tak jakby dla przerwań( to ten który jest ustawiany w startupie) i drugi jest tak jakby na procesów...
Pin INT w PCF jest typu otwarty dren. Potrzebujesz więc rezystor podciągający. No dokładnie ale spokojnie wystarczy programowe podciągnięcie wejścia INT do VCC - na 100% też będzie działać poprawnie.
Przede wszystkim PCINT wymaga większego nakładu programowego. Przy włączonych wielu źródłach danego przerwania PCINT trzeba analizować, który pin zgłosił przerwanie i w jaki sposób się to odbyło (które zbocze). PCINT jest niżej w hierarchii przerwań, zatem na obsługę tego przerwania trzeba czasem dłużej poczekać (w zależności od konstrukcji programu)...
Jak dobierzesz priorytety przerwań (programowo) z TIMERA i ZCD, i transmisję z UART też zrobisz przerwaniowo to czym się martwisz. UART ma bufor 3 znakowy i jest jednostką samodzielną.
Da się, stosując rozwiązania sprzętowo-programowe. Przy czasach rzędu 1s o jakich wspominałeś nie ma problemu. Timer generujący pwm tez może generować przerwanie w określonym momencie, więc można różne cuda, w tym zmianę wypełnienia realizować w obsłudze przerwania. Tu generalnie nie ma znaczenia jaki masz procesor, bo każdy timer działa mniej więcej...
Problem pojawia się, kiedy próbuję w obrębie funkcji wyzwalanej przerwaniem wykonać operację dodawania i wyciągnąć wynik. napisz w przerwaniu tak: [syntax=c]stykx=stykx+1;[/syntax] albo krócej: [syntax=c]stykx++;[/syntax] Drgania styków kontaktronu będą powodować chaotyczne naliczanie. Zrób debouncing programowo albo sprzętowo.
Akurat robiłem coś podobnego, ale bez pilota RC5 bo znalazłem na alledrogo podobne rozwiązanie za 20pln... masz w programie opóźnienie 3ms - sprawdź czy nie będzie to kolidować z odczytem pilota. poza tym używasz 2 Timerów, więc dlaczego wprowadzasz procesor w pętlę bezczynności? Ustaw przerwanie jednego Timera na 10ms i w nim zmieniaj wypełnienie PWM....
Hehe... no to następny pomysł - a jak szybko obraca się pętla główna programu? Nie wiem jak masz skonstruowany program, czy w ogóle jest? Dużej precyzji czasów chyba nie potrzeba, nie ma różnicy, moim zdaniem, czy przytrzyma się przycisk 1s czy 1,1s, więc może ten pomysł wsadzić do pętli głównej i bez przerwań. Wtedy w zależności od szybkości pętli...
Tu znajdziesz trochę informacji (w j. angielskim)
Ja robiłem dokładnie to samo :) Programowy UART sprawdza się, ale jak program nie jest za bardzo pocięty przerwaniami timerów itp. Poza tym trzeba "czekać" na dane, chociaż w bascomie nie robi to większej różnicy.
Przecież masz gotowy "scalony odbiornik" ? Tym bardziej że ów scalony odbiornik daje na wyjściu stan niski jeśli odbierze właściwą częstotliwość. Jeśli nie ma potrzeby dekodowania np. RC5 to jest bez sensu. Jeśli ma być sama detekcja sygnału to przerwania i programowo sprawdzać stan.
Skoro zasilane, to pewnie optyczne. A jednak obu nas zaskoczył, czujnikami Halla :) nie bardzo rozumiem ta obsługa enkoderów programowo w przerwaniu z timera? To proste. Ustawiasz timer do generowania przerwania. W przerwaniu programowo sprawdzasz wejścia enkoderów i stwierdzasz zmianę stanów, kierunek obrotów.
Bo są timery sprzętowe- i dobrze że są. A z nich można zrobić przerwania programowe- wystarczy obliczyć ile razy timer sprzętowy się odezwie. A wstawianie Waitms albo _delay w przerwaniu- to jak napisał mirekk36- masakra. Ale wstawianie tego w główną pętlę- też.
Zgaduję, że o drgania styków chodzi - trzeba to programowo obsłużyć - przerwanie timera, czyli coś, co wraca tu 2 razy na tydzień (ostatnio wczoraj).
Co rozumiesz przez: Jak to zrobić na przerwaniu tego za bardzo nie rozumiem. Przerwanie INT0, czy jakiegoś timera?
Incr Reference If Reference < R Then : Set Portb.2 : Else : Reset Portb.2 : End If 'red If Reference < G Then : Set Portb.3 : Else : Reset Portb.3 : End If 'green If Reference < B Then : Set Portb.4 : Else : Reset Portb.4 : End If 'blue Całość wywoływana przez przerwanie - przepełnienie licznika....
Ale dlaczego chcesz wykorzystywać końcówkę przerwania zewnętrznego jako wyjście? Przecież logiczne jest, że ma to być wejście, chyba że chcesz generować przerwanie programowo, ręcznie ustawiając stan końcówki, co w praktyce raczej mija się z celem. Końcówkę deklarujesz jako wejście z pull-upem do plusa i wystarczy, końcówka jest wtedy podciągana poprzez...
Nie ,nie ma takiej możliwości ,żeby zmienić w prosty sposób priorytety przerwań. Można to zrobić przez zabiegi programowe lub zastosować mikrokontroler z rodziny x-mega ,który ma znacznie bardziej rozbudowany mechanizm przerwań i możliwość ustawienia priorytetów .Poza tym może warto przemyśleć sens takiego zabiegu ,bo to rzadka sytuacja kiedy uart miał...
No właśnie trzeba zapytać się autora dlaczego nie chce wracać poprzez RETI - bo pisze że obawia się przepełnienia stosu - a właśnie tak (RETI) go nie przepełni - no chyba że będzie coś umieszczać na stosie i nie zdejmować. ( w kontekście " normalnej " obsługi przerwań - bez programowego resetu ) musze zrobic przerwanie, z ktorego nie bede wracal przez...
Przykład. W pętli głównej jest zmienna, która jest zwiększana przez TIMER0. Zależnie od wartości owej zmiennej, jest wysyłany dany ciąg znaków przez instrukcję PRINT - uart sprzętowy oraz instrukcję Print#kanał - uart programowy. Mam też przerwanie od timera1 - do obsługi wyświetlaczy siedmioseg. i innych elementów. I co będzie, jak np. w momencie wykonywania...
Dlatego wolę zapisywać informację o kolejnych paczkach do FIFO i mieć gdzieś czy czeka czy nie. A taki bufor rozwiązuje wszystkie problemy. Ja tego nie neguję, ja tylko odnosiłem się do tych obliczeń autora tematu: No jest to powiedzmy 100kHz- dość szybko. Ale przy zegarze 16MHz oznacza to że przez 160 instrukcji procesor stoi i czeka na zakończenie...
Set EIRF to już etap kombinowania, pomijając ten zapis próbowałem z Eifr = &B00000011 jak i Eifr = &B00000000 efekt jest ten sam 2x przerwanie... zamysł jest taki by wyzerować flagę zgłoszenia przerwania INT0 czyli ostatni bit rejestru EIFR a to mi nie działa... i chyba nie da się wymusić przerwania programowo wpisując w rejestr, to musi pochodzić pinu...
Jak najbardziej jest poprawne, tyle że zauważ że w obydwu przypadkach nie masz zrealizowanej programowej eliminacji drgań styków
Jeden kanał steruje jednym wyjściem. Nie ma możliwości zerowania wyjścia od jednego kanału i ustawiania tego samego wyjścia przez inny kanał. Napisałem wyżej - ustaw okres 5 ms, tryb toggle i odpalaj swoją reakcję programową na timer w co drugim przerwaniu. Nie rozumiem, na czym polega problem. Będziesz miał falę prostokątną 100 Hz.
O dziwo, gdy taka linijka znalazła sie w porcedurze obsługi przerwania zewnętrznego, to nadal było źle. To nic dziwnego bo te przerwanie samo skasowało tę flagę. Jedynie kasowanie flagi ma sens tylko w momencie kiedy dane przerwanie jest jeszcze nieaktywne bo w każdym innym przypadku ty go nie zdążysz skasować bo zawsze szybsza będzie obsługa tego...
A może masz gdzieś funkcję obsługi tego przerwania? Dodano po 4 Dodam, że korzystam z programowego bufora cyklicznego, który w przerwaniach odbiera dane od UDR. Jedyne co mi przychodzi na myśl to to, że przerwanie tak szybko się wykona (odebranie danych do bufora i skasowanie flagi RXC), że część programu: while ( !(UCSRA & (1<<RXC)) ); nawet...
Nie czytalem twojego kodu, ale jezeli masz zwieche w SWI to znaczy ze masz gdzies programowe przerwanie procek skacze zeby je obsluzyc a tam tylko while(1); . Wyglada jakby twoj kod nie byl kompletny.
kodowanie programowe przerwania programowe timery programowe
warto uruchamia makro sterowa optotriakiem podłączyć przedni panel
apple watch wyłączniki dotykowe
Wybrany numer jest w tej chwili niedostępny - przyczyny i rozwiązania Uszkodzona płyta główna w JBL Charge 5 - diagnoza i naprawa