Trzeba pewnie włączyć jeszcze globalne zezwolenie na przerwania, tylko nie mogę się tego doszukać w RM. Domyślnie przerwania są globalnie "odblokowane". W przeciwieństwie do poszczególnych przerwań, więc jest taka funkcja NVIC_EnableIRQ() czy jakoś tak. P.S.1. Nie musisz deklarować przerwania na górze, przed main(), bo i po co? P.S.2. W obsłudze przerwania...
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...
Kosztem dokładności możesz zrobić to na jednym wspólnym 2-kanałowym timerze i przerwaniu EXTIi (oddzielnym dla każdego czujnika). Dwa kanały służyłyby do odmierzania czasu impulsu startowego i kasowania czujnika - wymuszenia kończenia pomiaru, a okres timera wyznaczałby cykl pomiarowy do kolejnego przeglądanai czujników.
Jak się bawisz Keilem, to prześledź sobie działanie programu w symulatorze jak nie masz debuggera. Zobacz też czy masz zdefiniowane przerwanie od systick i co ono robi, jak nie grzebałeś nic w pliku konfiguracyjnym, to z automatu on jest włączany na wartości domyślne.
A gdzie masz ustawienie bitów SW na PLL w RCC?
Hmm na początek może spróbuj coś prostego, spróbuj tak ustawić Timer żeby działał ci na jedno zbocze i np narastające w trybie InputCapture i generował w tym momencie przerwanie, a ty każdorazowo będziesz sobie zliczał (dodawał +1). Podpowiem tobie że Ciebie Timer15 posiada 2 kanały i może wygenerować dwa przerwania, spójrz sobie na stronę 377 w RM0041.
Przerwanie od zbocza jest kompletnie niepotrzebne do niczego - wystarczy TYLKO przerwanie od timera, w którym również można zrobić wykrywanie zbocza i filtrowanie - wystarczy kilka zmiennych pomocniczych (poprzedni stan, jakieś liczniki). Jest to skrajnie proste i działa idealnie. Angażowanie dwóch przerwań do czegoś co można zrobić w jednym jest kompletnym...
Zewnętrzne przerwania nadają się - przykładowo - do obsługi pinów sygnalizacyjnych z innych układów scalonych, a nie do zabaw z przyciskami. To po prostu nigdy nie zadziała... Zrób sobie przysługę i odczytuj po prostu wszystkie piny w okresowym przerwaniu od timera (co 20-50ms, albo i rzadziej) i będzie wtedy działało perfekcyjnie.
Wracając do tematu, czyli STM32F4DISCOVERY rozpoczęcie programowania. Chciałem sprawdzić działanie FPU wykonując proste dodawanie, mnożenie itd. float'ów w przerwaniu od timera. Ku mojemu zdziwieniu przy każdym wykonaniu instrukcji na float'ach wywala mi HardFault. Gdy wyłączyłem w opcjach korzystanie z FPU wszystko hula. Używam Keil'a w wersji dla...
Na początek zastosuj poprawne kasowanie flagi przerwania. Zamiast: TIM3->SR &=~TIM_SR_UIF; Powinno być: TIM3->SR =~TIM_SR_UIF;
sprawdź w dokumentacji czy aby po zresetowaniu flagi przerwania timera nie trzeba odczekać kilka instrukcji (2-3 NOP'y). Jeżeli tak jest, to w przeciwnym wypadku zaraz po wyjściu przerwanie otworzy się drugi raz i w tej sposób dioda mrugnie tak że tego nie zauważysz. Możesz to sprawdzić tak że diodę ustawisz na zapłoną (a nie stan przeciwny), to po...
Po naciśnięciu ikony "Build" w oknie "Debug" pojawiają się błędy. Rozumiem, że kod napisał ktoś inny, a Ty nie znasz języka C. Bo to dość podstawowa wiedza dla studenta, żeby umiał napisać program, który się skompiluje, a jak nie, to wiedział, jak poprawić błędy. Zadaj jakieś konkretne pytanie. To jest Twoje zadanie napisać tę pracę - m.in. ma Cię...
Kolego andrzej_nied, Proponuję zastosować timer do generowania przerwań co około 2.5ms. W przerwaniu testujemy wejścia portów nie zawracając sobie głowy jakimiś 'drganiami styków'. Sprawdzone, pewne, proste. Czas 2.5ms dobrany jest tak aby zwykły enkoder 20-32imp./obrót obracany energicznie ręką nie zgubił impulsu (gdy czas pomiędzy przerwaniami za...
Skoro nie masz problemu z timerem, to po co w ogóle o nim pisać i po co testować program który ma też przerwania od timera? Niemniej jednak na początek brawa za to, że NIE używasz słynnego i popularnego badziewia (; Wg mnie (skoro chodzi o pin zerowy), powinieneś konfigurować rejestr AFIO->EXTICR[0], a nie 1. Problemem jest manual niezgrany z plikiem...
Odpowiedź na Twoje pytanie jest trywialnie prosta. Rejestry które są buforowane (ARR, PSC i chyba jeszcze jakieś) aktualizują swój realny stan w momencie update'u, który występuje automatycznie w momencie przekręcenia licznika, czyli (w uproszczeniu) doliczenia do ARR. Ty w swoim wyjątkowo dziwnym kodzie fizycznie uniemożliwiasz wystąpienie update'u,...
W STM32 domyślnie podczas zatrzymania rdzenia timery pracują, więc podczas twojej pracy krokowej zgłaszane są setki kolejnych przerwań. Aby to zwalczyć należy w rejestrze DBGMCU->CR (w manualu DBGMCU_CR) zapalić stosowny bit dotyczący stosownego timera. Niestety nie zawsze jest to możliwe (bo aplikacja może wymagać aby timer naprawdę stale pracował...
TIM2->ARR=1; TIM2->PSC=0; To oczywiście spowoduje bład DMA o którym pisze poniżej przy drugiej transmisji i przerwanie transakcji DMA Ja używam Nucleo, tam nie mam kwarcu, Masz - sygnał idzie z ST-Linka i w cube iustawiasz jako bypass. Jaki jest procent wykorzystania czasu szyn przy tak częstych żądaniach DMA? Czy na cokolwiek jeszcze zostaje czas,...
Nie będę głębiej wnikał, bo dopiero zabieram się za ARMy, ale to: http://www.stm32.eu/index.php?option=com... może coś ułatwi, gotowy projekt, który sprawia wrażenie prostszego.
Nie ma żadnego dodatkowego przerwania... Przecież to się opiera na zwyczajnym mechanizmie zdarzeń - żaden z obiektów synchronizacyjnych nie zmienia stanu "sam z siebie" i bez powodu, tylko to Ty go przestawiasz (zwalniając mutexa, wpisując coś do kolejki, ...). Tak więc po prostu wszystkie operacje na takich obiektach na koniec zawierają - w uproszczeniu...
Nie zerowałem konkretnych flag przerwania od CCRx. Dziękuję za pomoc. Działający kod dla stm32f05: [syntax=c]timer2_init(void) RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; TIM2->PSC = 4799; // Set prescaler TIM2->ARR = 100; // Auto reload value TIM2->CCR1= 20; TIM2->CCR2= 40; TIM2->CCR3= 75; TIM2->CCR4= 99; TIM2->CR1|=TIM_CR1_ARPE ; //AUTO...
[syntax=c] RCC->APB1RSTR |= RCC_APB1RSTR_TIM2RST; //* [/syntax] ..... [syntax=c] NVIC->ICPR[0]=TIM2_IRQn; // * NVIC->ISER[0]=TIM2_IRQn; [/syntax] od tego jest CMSIS i jest całkowicie źle. [syntax=c]TIM2->SR &= ~TIM_SR_UIF; [/syntax] Nigdy na końcu przerwań. Unikałbym operacji read-modify przy zerowaniu flag. A to, że program niby nie...
Popularne stm32f103 lub wg. potrzeb może być coś mocniejszego z rodziny f2,f3,f4...
Twoje problemy rozwiązałby jakiś TMS320 z serii C2000. Ale to tylko moje dywagacje. Jeśli chodzi o STM32F4 to musisz przemyśleć czy rzeczywiście 4 MHz jest niezbędne dla ADC. Kiedyś bawiłem się timerami w Keil'u więc kod wstępny na pewno Ci się przyda (kanały timera3 działają na GPIO->C6-C9): odznacz NVIC_EnableIRQ !!! ): [syntax=c]void TIM3_IRQHandler(void)...
A nie widzę nigdzie innego użycia przerwań niż tylko przy wciśnięciu klawisza klawiaturki. Przerwania zewnętrzne mają wyjątkowo ograniczone zastosowania. Nadają się np. do tego, żeby obsługiwać sygnały od innych układów scalonych, świadczące o tym że dany układ ma coś ciekawego do powiedzenia. Do przycisków nadają się wyjątkowo słabo, bo żeby to działało,...
Prawdopodobnie o żaden konkretny tylko o samo porównanie. Prościej więc po prostu programowo sprawdzać ten warunek (w końcu wartości pewnie też będą generowane programowo). A co do Timera to faktycznie on tylko porównuje na równość (==). Więc na nim tego nie zrobisz.
Nie da się wywoływać przerwań co 1 us, bo jest to czas porównywalny z czasem wejścia i wyjścia z obsługi przerwania. Przyzwoitą obsługę DS1820 można zrobić na jednym timerze z trzema rejestrami compare - masz wtedy maksymalnie trzy przerwania na bit. Poszukaj w sieci przykładu obsługi OneWire dla LPC1114.
Tu na pewno jest błąd: if(released & btn == btn) to to samo co: (poprawiłem) if(released & 1) Jeśli nie masz nieblokującej obsługi LCD w przerwaniu timera, to skoro już bardzo chcesz pisać coś na LCD w przerwaniu - obniż priorytet tego przerwania.
TIM1 może generować żądanie DMA lub przerwanie co określoną liczbę okresów, niekoniecznie w każdym okresie. DMA może zmieniać parametry przebiegu. Na moje oko użycie drugiego timera niekoniecznie jest tu dobrym pomysłem
Próbuje uruchomić przerwania: vector.c wygląda tak [syntax=c]static void __Default_Handler(void) __attribute__ ((interrupt)); static void __Default_Handler(void) { while (1); } /* +=======================================... | assign all unhandled interrupts to the default handler +=======================================...
Mozę powtórzę, bo nie lubię patrzyć jak ktoś traci czas - wszystkie porady sugerujące że problemem jest 8-/16-/32-bitowy dostęp do rejestru DR lub jakieś nieistniejące w tym układzie FIFO są po prostu błędne. Jeśli bez optymalizacji ruszyło, to powód jest dokładnie taki jak w słynnym przypadku timerów - to co kasuje flagę (zapis do DR) jest zbyt blisko...
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!!
No to szukaj błędu w ustawieniach zegara - skąd bierzesz przebieg wejściowy, częstotliwość (sprawdź czy dobrze ustawiona w module startowym), wywołanie SystemCoreClockUpdate itp... Prosty test: zaprogramuj timer i procedurę przerwania od niego an miganie diodą z częstotliwością 1Hz i zmierz sekundnikiem czas np. 60 mignięć.
3 us to 63 cykle - niby to wcale nie mało dla rdzenia Cortex. Wygeneruj impuls startu konwersji na timerze, w przerwaniu timera na koniec impulsu odpal transmisję, po zakończeniu transmisji z ADC wyzwól ponownie timer. Nie jestem pewny czy zwalnianie uC do 21 MHz to dobry pomysł. Sama transmisja też zajmie trochę czasu, potem obróbka odebranych danych...
Po pierwsze, nie w żadnej pętli, tylko w przerwaniu timera, zgłaszanym z częstotliwością np. 2400 Hz Po drugie, w każdym przerwaniu timera należy: 1. W rejestrze GPIOD->CRL/CRH ustawić wszystkie używanie linie portu jako wejścia lub Analog. 2. Do rejestru ODR zapisać jedynkę na linii wyboru kolumny, zera na pozostałych. 3. Do rejestru CRL/CRH zapisać...
No i mamy przykład jak nie wolno kasować znaczników przerwań: TIM7->SR &= ~TIM_SR_UIF; // clear UIF flag Poprawnie robi się to tak: TIM7->SR = ~TIM_SR_UIF; Jeśli używasz przerwania końca okreu (update), to w przypadku TIM1 będzie to: TIM1_UP_TIM16_IRQn
Witam, Po inicjalizacji timera i przed jego włączeniem przeładuj timer (zapisz bit UG do rejestru EGR),a następnie wyczyść flagę w Status Register (TIM4->SR &=~TIM_IT_Update). Dopiero po tych czynnościach włącz timer - przerwanie powinno przyjść dopiero po odmierzonym czasie.
Możesz mnie nakierować w jaki sposób mogę zmienić ten atrybut? Pracuję w Keilu
Bardziej chodzi o to, ze timer może zostać ustawiony jako trigger transferów dma (nie chodzi tu o przerwania.). Samo GPIO nie potrafi "poprosic" DMA o transfer.
Trzeba dodatkowo włączyć taktowanie bloku przerwań. Wstaw np. zaraz przed while(1) RCC_APB2PeriphClockCmd(RCC_APB2Perip... ENABLE); Jak dojdziesz do timera to też dodatkowo trzeba włączyć taktowanie RCC_APB2PeriphClockCmd(RCC_APB2Perip...
A jakiś przykład kodu jest kolega w stanie pokazać? Ustawiasz timer, tak aby się przepełniał po czasie np. 1,5 znaku. W przerwaniu odbioru, zerujesz licznik timera. W przerwaniu przepełnienia timera ustawiasz flagę - koniec transmisji. Oczywiście w zależności od konkretnych peryferiów dostępnych w MCU, można ten proces zoptymalizować. Do tego dodałbym...
Nawet dla takiego małego Miki jak ja już na pierwszy rzut oka jest jasne że te kody to potężne źródło problemów. Co widać bez wgłębienia się w szczegóły: * Funkcja main() jako rozbiegówka to słaby pomysł. Kolega stmx napisał coś na ten temat (nawet podaje link w promowanych tematach), warto to przeczytać. * Stos musi mieć odpowiednie wyrównanie, zwykle...
/* case 0: // menu główne // -------------------------------... lcd.setCursor(8, 0); lcd.print(hours); lcd.setCursor(10, 0); lcd.print(minutes); lcd.setCursor(12, 0); lcd.print(seconds); lcd.setCursor(8, 2); lcd.print(day);...
1. Przycisków nie obsługuje się na przerwaniach portów. 2. Nie potrzebujesz do tego trzech przerwań - wystarczy przerwania timera i UART. 3. Nie zmieniaj priorytetów przerwań - jeden poziom zdecydowanie wystarczy. Nie potrzebujesz zagnieżdżania, a próbując je zrobić brniesz w ślepą uliczkę, bo 5. Ogólną zasadą jest, że w procedurze obsługi przerwania...
Witam wszystkich, Wykorzystując 2 timery TIMER3 kanał 3 i TIMER2 kanał 2 generuję przebiegi PWM. Timery pracują w trybie FAST PWM1 zliczają do góry i wykorzystują przerwania. Niestety nie ma poszczególnych flag dla poszczególnych zdarzeń timerów. Każdy z Timerów ma po jedym globalnym przerwaniu. Koniecznie muszę wystartować oba przebiegi w tym samym...
Dobra,ogarnąłem makra.W avr'ach wyglądały trochę inaczej. Zamieszczam cały poprawiony i niedziałający kod: [syntax=c] #include "stm32f0xx.h" #include"core_cm0.h" #define zapal GPIOC->BSRR|=(GPIO_BSRR_BS_9);//zapal diode #define zgas GPIOC->BSRR|=(GPIO_BSRR_BR_9);//zgas diode int main(void) { RCC->AHBENR |=(RCC_AHBENR_GPIOCEN);//wlacz port C RCC->AHBENR...
Jeśli chcesz mieć periodyczne przerwanie, to ustaw stosowny okres timera i użyj przerwania końca okresu. Czy zablokowałeś wywołanie SystemInit lub wyedytowałeś ustawenia? Jeśli nie, to zapewne masz zegar 72 MHz, co by wiele wyjaśniało.
SysTimer jest wykorzystywany w FreeRTOS jako zegar systemowy. Ale jeżeli potrzebujesz timera(dla zliczania czasu będącego wielokrotnością zegara systemowego) dla jakiejs innej biblioteki możesz wykorzystać vApplicationTickHook(), gdy tylko masz symbol configUSE_TICK_HOOK zdefiniowany na 1 (plik FreeRTOSConfig.h). Funkcja ta jest wywoływana w przerwaniu...
Cieszę się, że mogłem pomóc. Fakt - ciężko się w tym odnaleźć, tym bardziej, że czasem są dziwne zależności. Jak np. żeby włączyć PWM dla TIM1 trzeba ustawić bit w rejestrze od break'a i dead-time: Dodano po 57 Pomogło dzięki. Ogólnie biorąc to w tych ARM'ach strasznie dużo rejestrów trzeba poustawiać, żeby coś działało ;) Mam jeszcze pytanie dotyczące...
Kiedy timer jest zatrzymany (CEN=0), rejestry ARR i PSC ładują się natychmiast, bez UG. Przerwanie zostaje zgłoszone przy wyzerowanieu CNT na końcu okresu. W przerwaniu Autor po kolei czyta rejestr CNT (prawdipodobnie równy w tym momencie 0), wyświetla górny bajt (co zajmuje jakiś czas), po czym PO CZASIE POTRZEBNYM na wyświetenie CZYTA CNT jeszcze...
Błędów całe mnóstwo. 1. Nie robi się przerwań od przycisków. Zrób przerwanie timera np. 100 Hz, w nim sprawdzaj stany przycisków. 2. __attribute__ ((interrupt)) jest zbędne. 3. Znacznik przerwania kasuje się na początku, nie na końcu obsługi przerwania. 4. Do zmiany stanu linii portów służą rejestry BSRR- jeden zapis zmienia stany dowolnie wybranych...
Idź przez instrukcje asma zamiast instrukcjami C i zobacz co sie dzieje pod &TIM4->SR gdy wykonuje sie sekwencja rozkazow BIC i STR. Takie dwa powinny tam być. Sprawdź również, czy proces zatrzymania rdzenia zamraża timer. Jeśli nie, to timer chodzi caly czas nawet przy zatrzymanym rdzeniu, i nie zauważysz najpewniej momentu kiedy ten bit jest zerem.
Było (jakieś milion razy) (; W manualu znajdujesz rozdział RCC, Clocks, a w nim coś takiego na samym końcu (pod obrazkiem Clock Tree): The timer clock frequencies are automatically fixed by hardware. There are two cases: 1. if the APB prescaler is 1, the timer clock frequencies are set to the same frequency as that of the APB domain to which the timers...
Bo tak to zostało wymyślone - to najprostsza odpowiedź. Jeden moduł może generować wiele różnych przerwań, np. koniec okresu timera, porównanie, przechwycenie zbocza. W timerze ustawiasz, które z tych zdarzeń mają generować przerwania. W NVIC ustawiasz, z których urządzeń chcesz obsługiwać przerwania.
Sprawdzalem, co jest w rejestrach SystTicka: Pod adresem 0E000E010 jest wartosc 07 00 00 00 (po skonfigurowaniu) i 07 00 01 00 (po odliczeniu czasu) - czyli OK Może ktoś ma pomysł o co chodzi? Czy czegoś brakuje? Nie jest OK! Zamiast 07 powinno być 03 ! SysTick control and status register (STK_CTRL) Bits 31:17 Reserved, must be kept cleared. Bit 16...
Po ponad tygodniowej przerwie STM32 znowu zagościł na moim biurku. Aktualnie walczę z Timerem, na szybko skonfigurowałem go tak aby odliczał do góry, teraz chciałbym aby było z niego wyzwalane przerwanie. Z tego co wyczytałem w przeróżnych manualach udsotępnianych przez STM trzeba to zrobić w rejestrze ISERx, pytanie tylko co podstawić za x i pod którym...
Cześć, nie analizowałem kodu, ale kiedyś wykorzystałem to: http://www.keil.com/download/docs/370.as... . Porównaj może się przyda. Są wykorzystywane te rzeczy co potrzebujesz chociaż nie pamiętam czy ac jest wyzwalane timerem. Pozdrawiam
Hej, Wróciłem po dość długim czasie do STM i chcę stworzyć na początek kilka prostych programów. Natrafiłem jednak na problem, z którym nie mogę sobie od paru godzin poradzić, a wydaje mi się dość trywialny - może będzie ktoś w stanie wskazać co robię źle. Program ma być prosty: po naciśnięciu przycisku chcę, by dioda kilkukrotnie zamrugała. Chcę do...
I tu był pies pogrzebany. Sądziłem iż skoro obsługuje callbacky to nie muszę głównego przerwania. Mam teraz kolejny problem. To oznacza że jak na projekt używający HAL masz źle to wszystko zrobione. HAL jest tak dziwnie zrobiony, że jeżeli nie wygenerujesz kodu startowego w Cube to zginiesz. Gdybyś tak zrobił to wtedy w pliku "..._it.c" miałbyć ten...
Zupełnie inny układ, zupełnie inne timery obsługiwane przez zupełnie inne rejestry :) I tak, przerwania też trochę inne (nvic).
OK, dzieki użyłem gotowca Nie używaj gotowców w takiej banalnej sytuacji. Doczytaj co to jest ten Systick. W dużym skrócie to licznik 24 bitowy - to ważna informacja, może zliczyć maksymalnie do ok. 16 mln (2 do 24). Po doliczeniu do zaprogramowanej wartości zgłasza przerwanie. Do ustawiania wartości można użyć funkcji Systick_Config(), ale najlepiej...
Debouncing w przerwaniu - tylko nie mów, że robisz to przez aktywne oczekiwanie wewnątrz przerwania. Jeśli tak, to zauważ, że to, że skasowałeś flagę przerwania i jesteś w przerwaniu wcale nie oznacza, że flaga nie może zostać ustawiona ponownie. Możliwy jest taki scenariusz: wciskasz przycisk, pojawia się zbocze opadające które ustawia flagę a więc...
Jeśli opierałeś się na moim przykładzie, to proponuję zajrzeć do dokładnie 35 linijki skryptu linkera i dobrze zrozumieć to co jest napisane w jej okolicy.
Jeśli mierzysz to timerem to nie ma takiej możliwości. Za to na ADC można coś takiego ustawić i nazywa się to "analog watchdog". 4\/3!!
Skoro plik main.cpp jest plikiem C++, a wektory są funkcjami z C, to handler obsługi przerwania musi mieć ozdobnik `extern "C"`. Wstawiaj kod i logi w odpowiednich znacznikach (code/syntax), bo nie da się tego czytać.
https://obrazki.elektroda.pl/6302104700_... Strona 198 (przynajmniej u mnie)
Albert: dość mocno mijasz się z prawdą. Niektóre uC z rdzeniami Cortex mają sprzętowy mechanizm gwarantujący czas odpowiedzi na przerwanie, który umożliwia redukcję drżenia (jitter) przerwania o najwyższym priotrytecie do zera również wtedy, kiedy mamy w systemie inne przerwania. Jeśli użyjesz tego mechanizmu, to sam decydujesz jawnie o czasie od przerwaia...
Jakie ostrzeżenie generuje kompilator? Poinformowałeś go w pliku stm32f4xx_it.h o tym jak wygląda funkcja void TIM2_IRQHandler(void); ? Chyba nie i dlatego lądujesz w Default_Handler, który jest na końcu pliku startup. Dodaj deklarację funkcji, dołącz plik nagłówkowy do main.c i pewnie będzie działać.
Logika użycia DMA i timerów jest błędna. Inne "splątanie" wynika z tego. Nie wiem po co EXTI jak nie używasz sprzętowego IRQ
Witam serdecznie. Jak poradzić sobie z SysTickiem i przerwaniem, ponieważ po kompilacji środowisko zwraca taki błąd: [syntax=bash]D:\workspaceAtolic\Cortexy\... multiple definition of `SysTick_Handler' src\main.o:D:\workspaceAtolic\Cortexy\De... first defined here [/syntax] [syntax=c] #include "stm32f10x.h"...
Kilka dni temu wkleiłem kod inicjowania timera w STM32, zresztą podobnych przykładów znajdziesz całe mnóstwo. Bez SPL byłoby to 5 linijek kodu. Preskaler powinien mieć wartość o 1 mniejszą.
Czy proponujesz zatem taki zapis: ... Jeśli w tym rejestrze wcześniej jest coś co chcesz zachować to może zostać, ja proponuje użyć operacji przypisania "=" zamiast sumy bitowej "|=" - używając sumy zakładasz że wcześniej jest tam "znana wartość", co niekoniecznie jest prawdą i czasem można się nieźle przejechać na takim założeniu... Widocznie przekroczenie...
Chyba trochę uprościłeś. No dobra - warunek jest taki, że pomiędzy kolejnymi odczytami nie może upłynąć więcej niż max jeden pełny okres timera, może być max jedno przepełnienie (; Z testowaniem flagi przepełnienia można by niby wykombinować więcej, ale tu pojawiają się bardzo nieprzyjemne sytuacje brzegowe: - jeśli odczytujesz najpierw CNT a potem...
Timery i dokładne odmierzanie czasu w różnych miejscach kodu. Zamiast korzystać z kilku timerów, można w różnych blokach kodu konfigurować 1 timer i wstrzykiwać odpowiednią funkcję przerwania. Oczywiście pod warunkiem, że nie będziemy musieli odmierzać czasu dla dwóch bloków jednocześnie. Wygląda na to, że potrzebujesz po prostu callbacka w jednym...
Stos dla przerwań ustawiłeś? 4\/3!!
To jakiś cud, biorąc pod uwagę, że pokazany program nic przez UART nie wysyła. Czy zweryfikowałeś częstotliwość zegara procesora (np. miganie diodą w przerwaniu timera)? Na rejestrach BSRR i BRR nie wykonuje się operacji logicznych, bo nie ma to żadnego sensu.
Udało mi się przywrócić projekt. Buduje się, wróciłem do punktu wyjścia. Według linka, który mi wysłałeś, pod zmienną pc, powinien kryć się licznik programu. Czy to jest adres, w którym wystąpił błąd przed wejściem do obsługi błędu? Nie mogę ustawić breakpointa żeby debugger zatrzymał się na tym adresie, przynajmnej nie wiem jak to zrobić żeby nie wyskakiwał...
Robię program składający się głównie z przerwań. Program steruje 6 silnikami krokowymi. Uruchomiłem więc 6 timerów dla kazdego silnika w trybie PWM, wypełnienie zawsze 50%, sterowanie częstotliwością. Żeby każdy silnik mógł wykonać zadaną ilość kroków (a zalezności miedzy silnikami są skomplikowane i nieprzewidywalne), każdy timer po wykonaniu impulsu...
(at)Piotrus_999 Te tajemnicze biblioteki są dostępne w internecie od ponad 10 lat bo sam używałem ich do pracy magisterskiej. Użycie google pozwoli Ci rozwikłać ta zagadkę. (at)Soberro Według mnie masz problem z problem z obsługą przerwań od przycisku. Byćmoże robisz tam coś czego nie powinieneś. Bez kodu nie da się więcej powiedzieć. Powinieneś zrezygnować...
P.S: W timerze delay jest mi potrzebny bo wysyłam dane po rs485 i muszę odczekać czas ze względu na konwerter. Wiesz dobrze, że wcale nie musisz do tego używać delay'a... 4\/3!!
Jak to zrobić: 1. włączasz przerwanie od timera w NVIC 2. Konfigurujesz timer, żeby generował jakieśtam przerwanie Odpowiedzi na pytania: 1. No bez timera raczej nie zrobisz przerwań co jakiś czas [; 2. Funkcja przerwania po prostu musi nazywać się DOKŁADNIE TAK SAMO jak jest wpisana w tablicy przerwań (zwykle CośtamCośtam_IRQHandler() ) 3. Hę? Przykłady...
Nie moge tego tak rozwiązać, nie po to wymyślono system przerwań zewnętrznych żeby je timerem zastępować. Dodam, iż kod ten działa poprawnie dla portu A, nie poprawnie dla portu C.
Przerwanie z timera może Ci zdekrementować zmienną przed jego wyzerowaniem. Skoro i tak czekasz w while'u to nie lepiej użyć trybu single shot? (edit: albo one shot. Nie pamiętam, chodzi generalnie odliczanie z zatrzymaniem przy końcu+zapalenie flagi)
Przykładowy program przedstawiający opóźnienie przycisku. Jak przycisnę to program i tak musi dojść do miejsca sprawdzania warunku. Chodzi mi o takie samo tylko z użyciem przerwania (wyłączenie migania natychmiast) /** ****************************************... * (at)file main.c * (at)author Ac6 * (at)version V1.0...
Jak byś przeczytał 1E10 postów na elektroda.pl na temat osbługi klawisza to byś wiedział że nie robi sie tego w takim przerwaniu. A dlaczego - poszukaj na elektrodzie. Temat przewija się średnio 2 razy w tygodniu. Właściwe miejsce to pętla while gdzie masz pisanie na UART w main (co będzie niewątpliwie dla Ciebie łatwiejsze) lub przerwanie timera -...
2 zmiennych dokładnie w tym samym czasie ( A nie prościej wyłaczyć przerwania na te 4 takty zegara. Zamiast systicka zastosuj inny timer np 32 bitowy. Wtedy przepełnienie będzie następować przy 72MHz co ok 60 sekund. Powinno wystarczyć. Masz tez specjalny rejestr co liczy cykle zegara przy wykonaniu programu (proponuję zapoznać się z DWT). Dlatego...
Dzięki za odpowiedzi, wczoraj szybko padłem i zasnąłem:> Też początkowo chciałem obsłużyć przyciski w pętli bo mógłbym, albo timerem, ale dostałem na praktykach sugestię, żeby zrobić wszystko na przerwaniach i tak też się męczę. Co do flagi, wiem i próbowałem kasować ją na początku, ale to nie pomaga. W programie na F4 mam w ogóle pętle sprawdzające...
Wyzwalasz timerem sprzętowo, odbierasz wyniki do bufora przez DMA, po odebraniu bloku o długości, którą sam wymyślisz - przetwarzasz wyniki. Dane możesz pewnie przetwarzać w przerwaniu DMA. Jeśli masz inne, ważniejsze przerwania - obniż priorytet przerwania DMA.
Teraz ogólnie ciekawe rzeczy wychodzą w ramach TINY. Ostatnio czytałem jakąś AppNote, gdzie w TINY był timer pracujący na 64MHz To już AtTiny24/45/85 miał (wbudowany PLL). AT90PWM chyba też. Mapowanie peryferii ma Tiny167. On tez ma wbudowane źródło prądowe przydatne przy pomiarze rezystancji czy pojemności.
Rada praktyczna: ustaw preskaler tak, żeby podzielony zegar timera miał jakiś "okrągły" okres, np. 1, 10 lub 100 us, wtedy nie będziesz musiał pracowicie wyliczać wartości okresu timera, np. preskaler 7200 -> okres zegara 100 us; w celu uzyskania jednej sekundy ładujesz do ARR 10000-1. Twój problem, jak napisano wyżej, wynika z braku kasowania znacznika...
No racja, dzięki. jeszcze tak dla pewności: to w ten sposób mam przerwanie co 0,2s: SysTick_Config(CLK_FREQ/14400000); Nie. Taka konfiguracja spowoduje to, że przerwania będą bardzo szybko występować (co kilka cykli zegara). Jak chcesz mieć przerwanie co 200ms to skonfiguruj timer tak: I automatycznie za każdym przerwaniem powinna wykonywać się powyższa...
Czy ja dobrze czytam, że w przerwaniu od timera robisz set/reset pinów i to Twój PWM? To jest źle zrealizowane i nie da się wycisnąć prawdopodobnie więcej w ten sposób. Tutaj temat do poczytania https://www.elektroda.pl/rtvforum/viewto... Bez podawania ryby - to co powinieneś zrobić, to skonfigurować PWM sprzętowy i PIDem obliczać tylko...
Witam, prosiłbym bym o pomoc, żeby ktoś wytłumaczył, albo podał przykład jak skonfigurować przerwania zewnętrzne w tym mikrokontrolerze bo walczę z tym i nic mi nie wychodzi i zaczynam podejrzewać, że to procek jest zepsuty, albo tej sztuki jeszcze nie opanowałem :D na początku pisałem własne kody, ale po nieudanych próbach w końcu wkleiłem gotowca,...
natomiast reset systemu w main() - pomaga. Sprecyzuj ten "reset w main". Reset resetowi nierówny, ale o tym chyba wiesz? Niestety - z racji braku kodu każesz nam patrzeć w kryształową kulę chyba. Pokaż co się wykonuje w main (jak wspomniał kolega wyżej - wszelkiego rodzaju inicjacja itd.). Gdzie są ustawiane przerwania, ów timer itd...
Na tego typu problemy jest jeden prosty sposób, wielokrotnie dyskutowany na forum: automat w przerwaniu UART. Jeśli ma być wykrywana "przerwa w transmisji" najpierw trzeba zdefiniować, co to jest ta "przerwa". Jeśli "przerwa" - to brak nowych danych przez czas np. potrzebny na transmisję jednego bajtu - UART potrafi takie coś wykryć w sprzęcie. Jeśli...
A jak nadejdzie krótsza a potem nic? Dalsze komplikowanie, jakies timeouty - po co? DMA jest wygodne i użyteczne do pewnych celów a do innych nie. Nie przesadzaj. Robi się to właśnie timeoutami i działa całkiem nieźle. DMA odbiera ciągiem (w trybie circular z przerwaniem od połowy i całego transferu), masz też przerwanie okresowe (albo timer programowy)...
Czy aby na pewno częstotliwość przerwań od timera powinna wynosić 1kHz? Skoro masz (w teorii) 24MHz podzielone przez 24000 (preskaler), to faktycznie zegar dochodzący do samego timera będzie równy 1kHz, ale wg mnie przerwanie timera będzie co dwa jego cykle, bo timer liczy tak: 0 ... 1 (przerwanie) ... 0 ... 1 (przerwanie) ... EDIT: sekundy... normalnie...
Na samym końcu funkcji której używasz- TIM_TimeBaseInit() - jest wymuszany "update", co powoduje ustawienie flagi przerwania które włączasz. BTW - używasz bibliotek które zostały oficjalnie porzucone przez producenta. Takie był dobre, że stwierdzili, że trzeba to wywalić do kosza bo nic się z tym nie da zrobić [; Miliony ludzi, którzy twierdzili, że...
(at)BlueDraco Przerwania nie blokuję. W funkcji EINT3_IRQHandler(void) po wykonaniu obsługi przerwania robię. Moim zdaniem zawsze łatwiej wrzucić do obsługi przerwania timera dwie linijki kodu, które załatwią obsługę przycisku, niż robić wyrafinowaną obsługę przerwania od przycisku plus przerwania timera. Jest to dobry pomysł. W przerwaniach timerów...
Witam, z góry przepraszam za mój nikły poziom obeznania w świecie STM32. Myślę, że problem będzie błahy dla wielkich myślicieli elektrody :) Otóż skonfigurowałem sobie TIM7 do pracy tak: [syntax=c]TIM_TimeBaseInitTypeDef TIM_InitStructure; TIM_InitStructure.TIM_Period = 4; TIM_InitStructure.TIM_Prescaler = 999; TIM_TimeBaseInit(TIM7, &TIM_InitStructure);...
Aby nie zakładać specjalnie nowego tematu to spytam się jeszcze tutaj. Czy powyższa metoda może zostać wykorzystana do odmierzania czasu rzędu 1 mikrosekundy. W teorii tak, ale nie jest to chyba najlepszy pomysł... Wejście i wyjście z przerwania to - z tego co pamiętam - 18 cykli. Do tego sama obsługa przerwania to też kilka instrukcji, powiedzmy więc...
stm32 przerwa przerwa przerwa stm32 stm32 timer
oświetlenie ściana telewizor jaskrawe kolory analiza spalin wyniki
pralka regulator obrotów suszarka bosch serie4
Opornik porcelanowy w zasilaczu ZN5 50/12/1 UNITRA ZATRA Marantz NR1606 - Samoczynne Przestawianie Przekaźników