Na początek zastosuj poprawne kasowanie flagi przerwania. Zamiast: TIM3->SR &=~TIM_SR_UIF; Powinno być: TIM3->SR =~TIM_SR_UIF;
W przerwaniu przydałoby się kasowanie flagi od przerwania (rejestr EXTI_PR)
Witam! Timer generuje przerwanie periodyczne. W procedurze obsługi testowo chciałem przełączać stan na jednej z linii portu GPIO (prymitywny debug na LED), ale... okazało się, że nie działa. W pierwszej chwili szukałem błędów w inicjalizacji timera, ale później się okazało, że przerwania się generują, tylko ja tego nie widzę, bo nie wykonuje się przełączenie...
Może wbiję kij w mrowisko: Po co właściwie Ci ten bitbanding? Wyjmę kij z mrowiska i odrzucę - świat nie składa się tylko z jednowątkowych programików, a w mikrokontrolerach zwykle trzeba zrobić więcej niż machanie GPIO i kasowanie flag przerwań.
wychodzi mi jakieś 8 8 cykli to zajmuje pierwsza linijka <; wejście do przerwania to następne kilkanaście + wyjście. Sugerujesz bitbanding dla kasowania flagi przerwania? No przecież właśnie o to chodzi - żebyś nie musiał odczytywać, modyfikować i zapisywać z powrotem. Czyli twiedzisz że 6*10kHz takich przerwań to dla tego procesora pikuś i nie...
Wiem jak działają przerwania, nie wiem z kolei jak je konfigurować. W takiej sytuacji, najprostsza droga to HAL. Akurat konfigurowanie peryferii dobrze w nim działa. Podejrzysz co robi HAL i po robocie, chyba, ze chcesz na nowo wynajdować koło. Niby wiesz jak działają. Dlaczego więc pytasz o rejestr maski przerwań zewnętrznych? To pytanie nowicjusza...
Prawidłowe kasowanie flagi w przerwaniu: TIM3->SR = ~TIM_SR_UIF; Prawidłowe używanie rejestrów BSRR: GPIOC->BSRR = GPIO_BSRR_BR13; Piszesz że "NVIC_EnableIRQ(TIM3_IRQn);" zawiesza układ. Używasz debuggera czy wnioskujesz to po tym, że nie zapala się żadna dioda? Jeśli używasz debuggera, to raczej powinieneś widzieć na czym dokładnie się zawiesza. Jeśli...
Tak na szybko bez analizy to nie widzę abyś kasował flagi od przerwania. RTC.INTFLAGS = RTC_OVF_bm; RTC.PITINTFLAGS = RTC_PI_bm; I może pokaż kod inicjalizujący, będzie łatwiej analizować niż ze zdjęcia.
Nie działa Ci, bo nie przeczytałeś dokumentacji... http://obrazki.elektroda.net/0_118799421... Flagi przerwań czyści się przez wpisanie do nich logicznej jedynki. Trochę może paradoksalnie to wygląda, ale ma swoje logiczne uzasadnienie. Chodzi o to, że czyszcząc flagi w ten sposób da się to zrobić o wiele szybciej i co najważniejsze - bezpieczniej....
W ogóle nie używamy _delay() -nie tylko w przerwaniach. Poza tym- po co jest to kasowanie flagi przerwania w przerwaniu- po obsłudze przerwania ta flaga sama się kasuje.
A gdzie masz kasowanie flagi przerwania ?
pomiędzy włączeniem licznika a kasowaniem flagi przerwań miałem opóźnienie, które powinno spowodować to że zdążą sie wpisać nowe wartości do rejestrów. Mógłbyś pokazać ten kod z opóźnieniem o którym piszesz?
Miałem kiedyś podobne problemy i może chodzić o kasowanie flagi przerwania. Ja w Atmega8 po prostu kasowałem tę flagę przez wpisanie 1 do całego rejestru na końcu przerwania i problem zniknął: GIFR=0xff;
W zasadzie dlugiiii chyba robisz w tym przerwaniu "masło maślane". To chyba będzie działać bo kasowanie flagi przerwania następuje po obsłudze ale rozumiem irytację tadzik85. Mnie taki kod też nieco irytuje.
Dzięki ;) Faktycznie, kasowanie flagi przerwań pomogło. Jedna linijka załatwiła problem. Co z tym przyciskiem zerującym ? Jakaś podpowiedź ?
Kolega R-MIK ma racje. Natomiast ja się zdziwiłem. Zazwyczaj nie czytałem/nie zapisywałem flagi związanej z przerwaniem tylko pisałem obsługę przerwania gdzie flaga sama była kasowana. Jako "Appendix" chciałbym przypomnieć, bo może kiedyś kolega użyje Xmegi serii E, że tam wejście w procedurę obsługi przerwania nie kasuje flagi "sprzętowo" czyli samym...
Dobra praktyka nakazuje aby po grzebaniu w konfiguracji któregoś z peryferii które obsługuje przerwania, kasować na końcu flagi, tak samo dobra praktyka nakazuje kasować flagi przerwań gdy włączamy zezwolenie na nie czy to globalne czy lokalne (dla danego zasobu).
Proponuję poczytać o EIFR... I proszę zastanowić się, czy warto (i dlaczego) kasować flagi przerwań w procedurze jego obsługi...
'51 nie wymaga sprzętowego kasowania flagi przerwania, załatwia to rozkaz RETI Wystarczy spojżeć do dokumentacji. I tak było od wieków istnienia '51
Tablicami NVIC się nie przejmuj. Korzystaj z funkcji dostarczonych przez CMSIS, w tym przypadku nie warto stosować rejestrów wprost. Konfiguracja Timera OK, choć kolejność nie należy do poprawnych. Przyjrzyj się jeszcze rejestrowi EGR. Przerwanie? Brak kasowania flagi skutkuje ciągłym jego wywoływaniem. Flagę kasuje się na początku przerwania. I taka...
Pierwszy pomysł nic nie dał. Za to drugi rewelacja :D Wstawiłem kasowanie flag przerwań tuż przed Enable Interrupts i działa jak należy. Czyli coś skopane w kompilatorze Bascoma... Wielkie dzięki.
TIM2->SR&=!TIM_SR_CC1IF ; // Zeruję flage - to inaczej TIM2->SR &= 0; Ten and to w jakim celu? Do autora ten wykrzyknik to herezja. Poprawne kasowanie : [syntax=c]TIM2->SR = ~TIM_SR_CC1IF; [/syntax] Flagi przerwania nie kasuje się na końcu obsługi. Ponownie się wykona.
Dawałem breakpointa, również dioda na płytce zasygnalizuje mi wejście do void DMA2_Stream1_IRQHandler(void) W kodzie obsługi przerwania jest tylko włączenie diody, a potem kasowanie flagi przerwania. Ale gafa...zapomniałem ustawić bit TCIE w rejestrze CR :| ehh
Za wiele nie pomogę, bo HAL mnie odstrasza, ale to co się rzuca w oczy: - w przerwaniu TIM2 przenieś czyszczenie flagi przerwania zaraz za warunek sprawdzający źródło przerwania (flagi nie należy kasować na końcu procedury) - w przerwaniu TIM3 nie kasujesz flagi przerwania w ogóle
Jakiego typu jest zmienna adc? float? Jakie jest taktowanie IO? Jaki model XMEGA? Generalnie nie podoba mi się to kasowanie flagi przerwania, podobnie odblokowanie układu wzmacniacza na wejściu ADC. Odpal powyższy kod w symulatorze i sprawdź po inicjalizacji czy rejestry ADC wyglądają rzeczywiście tak jakbyś sobie tego życzył.
tadzik85 odniosę się do twojej wypowiedzi. 1. Dlaczego nie powinienem kasować flagi przerwania wewnątrz programu? Przerwanie odblokowane zostaje wtedy dopiero po wykonaniu zadania, które zostało za jego pomocą wykonane. 2. Skoro tak skrytykowałeś moją metodę wykonania menu, może podasz mi jakieś inne rozwiązanie, które nie jest herezją?
Ja pisze w C18 Microchipa i nie korzystam z zadnych wbudowanych funkcji w stylu setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16)... sprobuj wlaczyc timer wpisujac wartosci bezposrednio do rejestrow cos jak: TMR1IF = 1; TMR1IE = 1; T1CON = 0b01110000; TMR1L = 0xEF; // 20 ms TMR1H = 0xD8; TMR1ON = 1; Nie widze u Ciebie kasowania flagi TMR0IF w obsludze przerwania
spróbuje zastosować pacha ze stronki, którą podałem wyżej i wtedy zobaczę. Przerzucę się też w najbliższym czasie na mcp2515 bo widzę że jest szybszy dzięki automatycznemu kasowaniu flag przerwań. Szkoda, że nie mam pakietu SocketCan. Muszę spróbować go jakoś dodać do Buildroota
(at)KamilCWK: nadal kasujesz flagi poza blokiem if {} sprawdzającym źródło przerwania, najlepiej kasuj flagę zaraz po if. [syntax=c] void PIOINT3_IRQHandler (void) { LPC_TMR16B0->TCR = 0;// stop timer CTB0 if (RC5_PORT->MIS & RC5_PIN)// sprawdzenie czy przerwanie od P3.0 { RC5_PORT->IC = RC5_PIN;// zerowanie flagi przerwania od P3.0 // ... dlasza czesc...
Idzmy głównym wątkiem bez cofania sie. Tak, uaktywnia ale już wiem, ze było ono przechowywane w SREG. To jest wyjaśnione. W SREG przechowywana jest informacja o fladze I, czyli fakt włączenia lub wyłączenia przerwań globalnych. Nie ma to nic wspólnego z "przechowywaniem" informacji o przerwaniach INTx. Instrukcjami operującymi na fladze I w SREG są:...
Co do kasowania przez wpisywanie jedynki - to jest jak najbardziej poprawne: http://www.elektroda.pl/rtvforum/viewtop... Nie analizowałem kodu zbyt dokładnie, ale jakkolwiek brakuje właśnie kasowania flagi przerwania TWINT. Dodatkowo (z tego co wyczytałem) trzeba flagę kasować po wprowadzeniu dodatkowych danych do transmisji....
1. Dla SysTicka nie włączasz NVIC, bo to przerwanie jest w NVIC zawsze włączone (w ogóle nie da się go wyłączyć inaczej niż wyłączając globalne zezwolenie na jakiekolwiek przerwania). 2. Generowanie przerwania włączasz w SysTicku [; Reasumując: - SysTick->LOAD - wartość "przeładowania" - SysTick->CTRL - dla takiego działania jak chcesz ustawiasz tam...
Nie widzę zamieniania Long na Byte. W tym przypadku trzeba zrobić albo: 1. Odpytywać układ po kolei o każdą część zmiennej Long (czyli 4 razy). 2. Zrobić ramkę danych która to prześle w całości (coś jak mój kod tylko jakoś prościej może na początek). Da to kontrolę błędów a więc pewniejszą transmisję jak się przesyła raz zmienne Byte a raz Long. 3....
Witam mam lekki problem, mianowicie staram się oprogramować zewnętrzne przerwanie, standardowo wywoływane po wciśnięciu przycisku, reagujące na zbocze opadające. Okej, wszystko elegancko ale po wejściu w przerwanie nie jest kasowana flaga przerwania. Przeglądając RM, nie odnalazłem żadnego rejestru w EXTI, który by za to odpowiadał. Pytanie brzmi zatem:...
Kasować licznik- a nie przerwania- na początek. Kasować licznik i musisz zastosować dwie flagi, inaczej nie da rady. Jedna sprawdzająca czy już możesz odczytać dane, drugie sprawdzająca czy już możesz wysłać żądanie odczytu:)
W cośtam - kasowanie flagi przerwania. Stwierdzam na podstawie takiej, że ustawiłam sobie break point'a na cośtam i nigdy się nie zatrzymuje. Zresztą używam Keila i tam na zielono zaznacza linijki kodu, które zostały chociaż raz wykonane, a ta nie jest nigdy. Zmieniam w debugerze w I/O port, bo wydaje mi się, że to wychodzi na to samo jak i na sprzęcie....
zgodność z M103C jest również wyłączona Dodano po 4 http://obrazki.elektroda.pl/6058123100_1... ustawienie fusów Dodano po 30 Podstawa programowa do obsługi tego przerwania wygląda wydaje mi się standardowo. Dodano po 2 Schemat czujki podałem wyżej. http://www.elektroda.pl/rtvforum/topic20...
Wg RM0091 (strona 629) m.in. bit RXFRQ w rejestrze RQR USART'u kasuje flagę przerwania. [syntax=c] USART1->RQR |= USART_RQR_RXFRQ; [/syntax] Flagi new_data nie chcę kasować póki co. Ważne żeby po opuszczeniu przerwania była ustawiona na true i żeby dioda się zapaliła. Wtedy będę rozbudowywać program i dodam kasowanie flagi zaraz po zapaleniu diody.
Witam ! Jest gdzieś udokumentowane zjawisko samoczynnego kasowania flagi przerwania ADC (ADINT) przy odczycie przetworzonej wartosci ? np.: void isr_handler_adc(void) __irq { odczyt = (AD0DR1 & AD0DR1_RESULT_MASK)>>AD0DR1_RE... // jakis kod VICAddress = 0; /* Acknowledge Interrupt */ } Wykładowca kazał mi udokumentować...
Witam. U mnie zrobone jest to w ten sposb. Nie sprawdzalem tego na symulatorze, kodzik dziala w makiecie. Korzystam z IAR v3.20. #define INT_PIN 0x01 [....] P1IFG = 0x00; // Kasowanie flag przerwań na P1 P1DIR &= ~INT_PIN; P1IES |= INT_PIN; P1IE |= INT_PIN; // Zezwolenie na przerwanie _BIS_SR(GIE); // Globalny bit przerwania [...] #pragma vector = PORT1_VECTOR...
Jeśli faktycznie TIM2 jest taktowany z częstotliwością 42MHz to Twoje przerwanie powinno być wywoływane co 10ms (konfiguracja RCC). Niemniej jednak kasowanie flagi przerwania powinno być pierwszą czynnością jaką przerwanie wykonuje a Ty kasujesz flagę raz na 100 wywołań. Poza tym umieszczanie funkcji USART_putint i USART_SendData wewnątrz przerwania...
Cenna uwaga z tym |=, bo to przeciez też operacja odczytu A błąd był w konfiguracji bo przecież ostatnia linijka psula wszystko: USART3->BRR = freq/4/115200; USART3->CR1 |= (USART_CR1_RE | USART_CR1_TE); USART3->CR1 |= USART_CR1_UE; USART3->CR1 = USART_CR1_TCIE; Dodano po 1 Włączenie przerwania usuwało całą konfigurację..... jednak...
Bascom powinien po wywołaniu procedury obsługi przerwania skasować flagę a tego nie robi...i po obsłużeniu przerwania znów jest ono natychmiast wywoływane i program się zapętla. Trzeba ręcznie ustawić flagę w rejestrze GIFR.. Ale posłuchaj, Bascom nie wywołuje żadnej procedury obsługi przerwania. To ty piszesz ją w Bascomie i jest ona wywoływana automatycznie...
A tuż przed "enable interrupt" kasujesz obie flagi od przerwań INTX ?? Kasowanie flagi oczywiście poprzez wpisanie do niej "Jedynki". Mam nadzieję że PIND3 i PIND4 nie wisi w powietrzu, aaaaaa napisałeś że włączyłeś podciąganie.
(at)lazor Dlaczego patrzysz przez pryzmat architektury, którą znasz, a nie odnosisz się do artykułu? Wszystkie 3 części dotyczą prostych struktur 8-bitowych jakie były na rynku 10-20 lat temu, gdzie jedynym efektem przejścia do obsługi przerwania jest załadowanie licznika rozkazów adresem ISR i ustawienie flagi obsługi przerwania. A jeśli robisz w userlandzie...
Generalnie przy LEVEL przerwania są tak długo emitowane, aż zniknie ich przyczyna, w efekcie wywoływane jest ISR i natychmiast zgłaszane jest kolejne przerwanie. Musiałbyś więc po zmianie z LEVEL na RISING jawnie kasować flagę przerwania. W większości przypadków się więc nie używa LEVEL. Piszesz strasznie skomplikowany kod - nie prościj dać BOTH_EDGES...
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
Pomóżcie, bo nie mogę doczytać, jak się kasuje flagę przerwania od output compare match w ISR? (...) W dokumentacji stm32 zapomnieli napisać czy 0 czy 1 Npalisali :) kasuje się na pewno poprzez zapisanie bitu zerem. Przy opisie rejestru masz zawsze odpowiedni "komentarz" przy każdym bicie. W tym przypadku rc_w0. read/clear (rc_w0) Software can read...
Ciekawe - ja u siebie mam wszystkie transmisje działające przy CPOL/CPHA=1 - no, ale może ten wyświetlacz ma inne wymagania. Przydałby się podgląd tego co wychodzi ze scalaka za pomocą analizatora stanów logicznych. Zmiana baudrate nie powinna na nic wpływać poza samą prędkością transmisji. Ja u siebie szybkość zmieniam tak: [syntax=c] //======================================...
tak, musisz kasować ją ręcznie - tak samo jak VICVectAddress. Inaczej nie da się tego zrobić - jedno przerwanie może zostać wywołane przez wiele źródeł (przepełnienie, porównanie, złapanie nowej wartości, ...), więc nie ma innego uniwersalnego sposoby niż ręczne kasowanie odpowiednich flag Dodam może, że przy debuggowaniu wewnątrz przerwania, czasem...
ldi R16,0 Out &H38 , R16 spróbuj to zamienić na : ldi R16,1 Out &H58 , R16 Co do tłumaczeń to jednak w oryginale brzmi to tak: -When an edge or logic change on the INT7:0 pin triggers an interrupt request, INTF7:0 becomes set (one). Co dla mnie w wolnym tłumaczeniu brzmi -Kiedy zbocze lub poziom logiczny na pinie przeniwania 7-0 się zmieni wywoła to...
Zegar z kwarcem 8MHz. Chciałbym aby w przypadku uszkodzenia (lub np. wyjęcia) kwarcu, zostało wywołane przerwanie w którym mógłbym skonfigurować PLL z HSI. Ale nie wiem do którego kanału NVIC jest ono przypisane. Inicjalizuję RCC_IRQn: Dodano po 52 Dodam, że po wyjęciu kwarcu system prawidłowo przełącza się na HSI i procesor nadal pracuje, tyle że 3x...
Zawsze obsługa przerwania powoduje skasowanie flagi I, aby pod koniec obsługi flaga została ponownie ustawiona przez instrukcję reti. Jeśli program się przerywa po kilku linijkach, to znaczy posiadasz nie obsłużone wektory przerwań, a to jest błąd w kodzie. Albo wyłącz przerwanie od danego źródła, albo wyłącz przerwania, jeśli z nich nie korzystasz.
Masz na myśli kasowanie flagi zgłoszenia przerwania ADC poprzez wpisanie jedynki na bit flagi? Robiłem na 328P, nie działa. Jutro spróbuję na m168...r Dodano po 26 W projekcie z ATtiny zdarzenie porównania generuje przerwanie i pewnie tutaj jest "pies pogrzebany". To przerwanie kasuje sprzętowo flagę porównania...ale to bez sensu, żeby angażować przerwanie...
Myślę, że istnieje taki kod. Coś podobnego co napisałem poniżej praktycznie załatwia sprawę. Jedyna możliwość "zgubienia" zdarzenia będzie w momencie włączenia przerwań. Myślę, że i ten przypadek można wyeliminować. ... nop; nop; __disable_irq; test globalnej flagi ustawianej we wszystkich przerwaniach, jak ustawiona to goto skip_it __enable_irq; ---->tutaj...
Jak pisałem nie mam jak teraz sprawdzić na sprzęcie. Może to tylko błąd wyświetlania. Mogę także wpisać bezpośrednio wartość dla tego przerwania (37). Więc ta linia jest ok? Dodano po 3 Dodano po 2 Dla upewnienia - nie trzeba kasować flagi przerwania, jest kasowana czytaniem DR, tak?
Wielkie dzięki. A da się jakoś wyczyścić (ew. zablokować) to przerwanie? Próbowałem juz wpisywać w procedurze przerwania cli(), wyłączać INT0 w rejestrze GICR, ustawiać flagę w GIFR. Póki co z marnym skutkiem. możesz zarówno zarówno zablokowac każde przerwanie z osobna, a także wyczyścić flagę od ich zgłoszenia. Możesz to uczynić także w przerwaniu....
Ten rejestr CTRLC jest chyba ogólny ale coś nie mogłem dobrać się do wybranego pinu ,którym w moim przypadku jest PA2 to chyba powinno kryć się pod nazwą "CMP2OV" . Próbowałem TCA.SINGLE.CMP2OV = 0; i TCA0_SINGLE_CTRLC = ale tutaj w ogóle nie miałem czegoś adekwatnego no i kompilator nie przyjmował moich wypocin. Tutaj pytanie czy jest to prawidłowe...
Ja się z tym spotkałem przy obsłudze CAN'a. Do chwili gdy używałem bibliotek od ST to było OK. Jak z nich zrezygnowałem to nagle jedna ramka CAN generowała 2 przerwania. Wstawienie kasowania flagi na początek załatwia sprawę.
W c to wygląda tak: Konfiguracja: [syntax=c]PCFwrite(0x00, 0);//kasowanie testc PCFwrite(0x01, 0b00000001);//tie PCFwrite(0x0f, 64); PCFwrite(0x0e, 0b10000001);//64hz [/syntax] I w procedurze obsługi przerwania kasowanie flagi [syntax=c] PCFwrite(0x01, 0x01);// tf=0 [/syntax]
Miałem identyczny problem. Rozwiązanie jest proste. Jedną z ostatnich instrukcji procedury obsługi przerwania było kasowanie flagi INT0. Potem powrót RETI i wszystko chodziło ok. Pozdrawiam.
Ten typ tak ma- wpisanie 1 kasuje ustawioną flagę - a była ustawiona na 1. Tak że w komentarzu wpisz- kasowanie flagi. Str.68 datasheet. Zresztą większość flag tak się w AVR kasuje.
Witam ewentualnych czytelników tego tematu. Zamykam temat, jako że problem rozwiązałem. Obsługa timerów została poprawnie zrealizowana po skompilowaniu projektu w Bascomie dla procesora Atmega48, Jedynie przy obsłudze przerwań pojawił się problem. W moim programie była konieczność "ręcznego" kasowania flagi przerwania INT1 za pomocą instrukcji: SET...
MODI, zrobiłem tak jak mówiłeś, teraz mam na same zera. Żadna dioda na PORTA się nie zapala. (Wysoki poziom zapala diodę) Aktualny kod programu: #include <avr/io.h> // dostęp do rejestrów #include <avr/interrupt.h> #define F_CPU 16000000 volatile uint8_t RC5cmd; volatile uint8_t RC5addr; //volatile unsigned char T; volatile unsigned char...
Witam, Mam taki problem, że chciałem ustawić przerwania równe 1 ms (1000 us), ale zależnie od ilości instrukcji w przerwaniu trwa ono 1000us lub 1001us, czyli 1000 lub 1001 cykli zamiast zawsze 1000. Jeżeli w funkcji przerwań, poza ustawianiem Timera i kasowaniem flagi przerwania, jest nieparzysta liczba instrukcji (np. 1,3,5,...itd.), to trwa ono 1000...
W obsłudze przerwania nie musisz kasować flagi, to robione jest sprzętowo. A przeciwnie może spowodować wygenerowanie kolejnego przerwania. Zmień i daj znać.
Dobry pomysł z tą dodatkową flagą. Muszę się zastanowić w jaki sposób mógłbym go wykorzystać. Jeszcze jedno pytanie. Padło hasło "kasowanie przerwań", rozumiem to jako programowe zerowanie flagi wystąpienia przerwania od komparatora (ACI), czy mam rację ?? Jeżeli nie to jak wykonuje się takie kasowanie przerwań ? Co jeśli wystąpi kilka przerwań po sobie...
Jeśli poprawność transmisji przez UART jest ważniejsza niż terminowa obsługa przerwań to ustawianie/kasowanie bitu 7 w SREG (a więc CLI i SEI) ma sens. Pamiętaj że flagi przerwań są zapamiętywane (można je kasować wpisując jedynki w zapalone flagi) i po wyjściu z procedury objętej CLI/SEI i podprogramy ich obsługi i tak zostaną wykonane. http://impuls.elektroda.eu/joomla/index....
i to może być powód, nie kasowałem flagi ;) , dzięki, sprawdzę w poniedziałek
Choć dopiero zaczynam przygodę z STM32 to po mojemu nadpisujesz strukturę i dlatego zawsze działa Ci ostatnie zdefiniowane przerwanie. O ile przed napisanie jest funkcja inicjująca przerwanie nic takiego nie ma miejsca. Prędzej brak kasowania flag.
Ab ovo. Cli wyłącza zezwolenie obsługi przerwań- a czym innym jest ustawianie flagi że przerwanie było. Jak ponownie włączysz obsługę przerwań- SEI- to zostaną "obsłużone". Można kasować poszczególne flagi- jeśli jest to potrzebne- zwykle wpisując 1 do odpowiedniego bitu w odpowiednim rejestrze.
Przerwanie od INT0 powinno aktywować przerwania od timera, które co 50ms będą zmieniać stan portu c: INT0: - blokuj przerwania INT0 - licznik sekwencji na portc = 0 - aktywuj przerwanie timera INT TIMERA: - switch (licznik sekwencji) ..... w ostatnik case czy default: 1) blokuj przerwania timera 2) kasuj flagę INT0 3) włącz przerwania int0
Witam, Programuję sobie procesorek AT89C2051 i magistralę 1-Wire. O ile z odczytem danych z magistrali nie było problemów, o tyle z wysłaniem tego przez RS-232 jest problem. Czy ktoś z użytkowników ma jakieś gotowe procedury zapisu i odczytu do porty RS232? W BASCOM wszystko działa, ale chcę to zrobić w C. Na razie doszedłem do: //funkcja obsługująca...
Samo wejście i wyjście z przerwania nie kasuje sprzętowo flagi w typie Ex. Skasuj flagę przerwania "ręcznie" w przerwaniu i daj znać jak taka akcja się skończyła :D
A dlaczego boisz się wyłączania przerwań? Normalną procedurą jest globalne wyłączanie przerwań na czas krytycznych operacji np. kasowanie w programie głównym flagi, która jest ustawiana w przerwaniu. Oczywiście nie można ich blokować na zbyt długo, bo można coś zgubić. Najważniejsze jest, aby w czasie gdy przerwania są zablokowane nie pojawiły się DWA...
Bo nie zerujesz flagi przerwania. Podczas porównania ustawia Ci się flaga przerwania OCF0A w TIFR0. Normalnie w czasie obsługi przerwania taka flaga się kasuje samoistnie ale u Ciebie nie ma obsługi przerwania od Timer/Counter Compare Match A więc flaga zostaje ustawiona. Musisz w obsłudze przerwania od zakończonej konwersji ADC dołożyć ręczne kasowanie...
Kasowanie flagi z & nie podoba mi się bardzo (TXE się nie kasuje bitem tylko zapisem do DR może zbyt blisko końca obsługi to robisz) . Gdzie funkcja wysyłania?
Bit RXNEIE włącza przerwanie od dwóch flag: RXNE i ORE (overrun) - patrz tabelka USART interrupt requests . Odczyt z DR kasuje RXNE. ORE jest kasowane przez (cytat z opisu bitu ORE): "an read to the USART_SR register followed by a read to the USART_DR register".
Jesli chodzi o rejestr ICCR to nie pomaga. Jestes pewien ze trzeba kasowac te flage? Bo w procedurach obslugi przerwan z projektow przykladowych nie ma na koncu kasowania zadnej flagi. Doczytalem sie ze kasowanie flagi zdaje egzamin tylko przy przerwaniach wyzwalanych poziomem, mi natomiast jest potrzebne wyzwalanie zboczem. Jak w takim razie sygnalizuje...
To zanim zabierzesz się za 2 UARTy oprogramuj 1? obsługa takiego UARTu do zaledwie 50 linii kodu z obsługą buforów. Masz przykładu w SPLu skorzystaj. W przerwaniu od obioru nie odczytujesz rejestru DR. Kasujesz flagę na końcu przerwani - błąd. Uporządkuj ten program. Włączenie przerwania TXE i nie obsłużenie go to poważny błąd, zawiesisz się. A jego...
Śmiem twierdzić, że w (0<<ISC11) | (1<ISC10) jest błąd, powodujący, że wyrażenie to ma wartość równą 1 (podczas gdy powinno mieć wartość równą 4). Jeśli flaga jest ustawiana na zbocze, to w kodzie głównym powinny występować jakieś opóźnienia albo zmiana algorytmu, bo inaczej flaga zostanie sprawdzona raz - będzie ustawiona,...
Tak tak, wiadomo. Jeszcze dla pewności sprawdziłem co się stanie jeśli w przerwaniu mam tylko kasowanie flagi, i teraz jest już bez push i pop. Wcześniej miałem tam wywoływaną jeszcze jedną funkcję od obsługi timera.
Albo ustawić flagę i w pętli głównej ją sprawdzać i wykonywać skok, albo ręcznie potem kasować flagę przerwania i ponownie je aktywować
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...
Chodzi o to ze po przyjeciu przerwania nie kasuje automatycznie flagi D wiec zaleca sie w procedurze przerwania ja skasowac Dotyczy to wszystkich flag (poza I). Są takie jakie były w chwili przyjęcia przerwania. I jest kasowane. Warto zaznaczyć, ze w 6502 wejście w przerwanie odkłada na stosom, poza adresem powrotu, także rejestr statusu. Rejestr ten...
Jeśli funkcja obsługi przerwania powoduje ponowne wyzwolenie samego siebie, to jest to wynikiem tego, że flaga przerwania jest kasowana tylko podczas wchodzenia do przerwania. Podczas wykonywania funkcji obsługi przerwania flaga INTF0 może zostać ponownie ustawiona, co spowoduje ponowne wejście do ISR zaraz po zakończeniu (ISR_BLOCK nie powoduje zablokowania...
przerwanie od timera dla przycisku jest ok próba wyświetlania czegoś na wyświetlaczu z przerwania nie jest ok kasuj flagę przerwania na jego początku usuń te trzy tony zduplikowanego kodu który tam masz
Cały program może coś da. Powinieneś poza tym w obsłudze przerwania kasować flagę przerwania oraz wyłączać przerwania a nie robić to w programie. Tak jak masz teraz to wydaje mi się że po obsłudze przerwania wyzwalane jest kolejne przerwanie i zanim wykona się kolejna operacja po wybudzeniu procesora znów wykonywana jest instrukcje obsługująca przerwanie...
użycie ich jest tylko wtedy możliwe jak flaga danego przerwania jest automatycznie kasowana przez sprzęt. W innym przypadku najpierw trzeba ją skasować później dopiero włączyć przerwania. Dotyczy to odbiorczych od UART ale od poziomu wejścia INT nie. Nie da się skasować flagi, jest ustawiona tak długo, jak długo wejście INT ma poziom niski. Dodano...
Może dostajesz jakieś inne przerwanie, i wtedy ten Twój IF nie wchodzi do środka i nie kasuje flagi (oraz nie miga LEDem). Kasowanie flag daj bezpośrednio bez żadnego IFa.
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...
Ja bym to ujął w takiej kolejności: 1. Konfiguracja priorytetów, rejestrów sterujących itp. (oprócz odblokowania przerwania). 2. Skasowanie flagi sygnalizującej przerwanie. 3. Odblokowanie przerwania. Naistotniejsze jest, aby flaga sygnalizująca przerwanie była kasowana po zmianie rejestrów sterujących/konfigurujących przerwanie, ponieważ częstot jest...
Musisz sprawdzać czy to przerwanie jest włączone. To nie ma znaczenia (przynajmniej dla zawieszania się programu). Skoro przerwanie wystąpiło to czy było włączone czy nie (swoją drogą nie mogło wystąpić gdy było wyłączone) to jego bit trzeba skasować. Generalnie ja mam zwyczaj kasować w przerwaniu wszystkie flagi (wszystkie od danej części, czyli np....
Bo ARM to taki składak - kto inny robi rdzeń a kto inny peryferia i jak widać nie skleiło im się to do końca poprawnie. "Dzięki temu" masz kilka różnych miejsc gdzie musisz aktywować przerwanie a flagi od nich musisz sobie sam ręcznie kasować.
Tylko, że ja nigdy żadnego problemu nie miałem, bo wiem dokładnie jak wszystko działa. Twoje "ważne że działa" jest wątpliwe, prawdopodobnie sam nie wiesz jak działa Twój kod. Nie spotkałem się, żeby ktoś, kto nie kasował i ustawiał flagi I w przerwaniu miał z tego powodu problemy z programem. ps. Ei incumbit probatio qui dicit, non qui negat.
Witam! W związku z powyższym kodem który zamieściłeś nasunęła mi się jedna uwaga która pewnie nie rozwiąże twojego problemu w jakimkolwiek procencie, aczkolwiek powinieneś sobie z niej zdawać sprawę. Chodzi mi o kasowanie flag przerwań np. tak jak w przykładzie: TIFR|=1<<TOV1; //wyzeryj flage od przepeln Wiadome jest że aby wyzerować flagę od...
Klawisz się sprawdza w przerwaniu timera z uwagi na drgania styków, to raz. Dwa (zakładając, że masz filtry RC na klawiszach) - gdzie kasujesz flagę przerwania od portu (klawisza). One się nie czyszczą przy wejściu do przerwania. Bool a _Bool - w AVR gcc jest <stdbool.h> który należy zainclude'ować. Nie pamiętam jak tutaj. pzdr.
Nie wykonuj operacji logicznych na rejestrach FIOSET i FIOCLR. Powinno być: LPC_GPIO3->FIOCLR3 = 1 << 1 | 1 << 2; Trzymasz włączony reset timera - nie wiem, czy w tym stanie reaguje on poprawnie na zapisz rejestrów. Znacznik przerwania należy kasować na początku obsługi, po wykryciu, że jest ustawiony.
Można opalić timer w trybie CTC z preskalerem 1024 i ICR ustawić na 122. Wtedy osiągniesz przepełnienie zegara miej więcej z częstotliwością 128 Hz. W przerwaniu od timera ustawiać flagę, a w przerwaniu od ADC wysyłać dane tylko gdy flaga jest ustawiona, a następnie ją resetować. Inaczej: włączyć Auto Triggering dla ADC, jako źródło wyzwalania Compare...
(at)niveasoft To nie ten przypadek. Wyjaśnienie tej zagadki jest raczej proste - flaga przerwania jest kasowana, ale zwieranie mechaniczne powoduje bouncing, więc zgłaszanych jest więcej niż jedno przerwanie. Samo wyłączenie przerwania nie wpływa na odpowiednią flagę, więc przy kolejnym drganiu jest ona ustawiana, ale przerwanie nie jest obsługiwane...
flagi przerwania kasowanie flagi flagi funkcji
heterodyna niestabilnie czyszczenie fusera schemat crocodile clips
problemy smart switch barracuda agregat
Audi A4 B5 1.9 TDI 1999 - Przewód siłownika zamka bagażnika Termostat: Zasada działania i zastosowania w elektronice