Na początek zastosuj poprawne kasowanie flagi przerwania. Zamiast: TIM3->SR &=~TIM_SR_UIF; Powinno być: TIM3->SR =~TIM_SR_UIF;
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?
W przerwaniu przydałoby się kasowanie flagi od przerwania (rejestr EXTI_PR)
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;
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...
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ą:...
Lepiej tak: void USART1_IRQHandler(void) { if (USART1->ISR & USART_ISR_TXE) { // jeśli zakończona wysyłka to coś... USART1->CR1 &= ~USART_CR1_TXEIE; // kasowanie flagi tak mi się wydaje że to to. } } A to jest źle każde przerwanie powinno wyglądać tak: [syntax=c] void XXXX_IRQHandler(void) { uint32_t isr; isr = XXX->ISR & XXX->IER; if( isr & flag)...
Niedawno programowałem LPC2478 i tam nie było tego problemu. No ale to już niemłody ARM7TDMI-S, a nie Cortex-M3. :)
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.
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....
Mam jeszcze pytanie, czy jest mozliwosc manipulowania przyciskiem reset? Tzn, mam wgrany prorgam stoper i po wcisnieciu przycisku reset np 2krotnie lub przytrzymaniu, chciałbym aby zmienil mi sie na program zegara. Jest taka mozliwosc? Przcisk 'Reset' na Arduino nie ma takiej możliwości, ani nie jest taka jego funkcja. Jego funcją jest uruchomienie...
Jak wyżej... dodam, że skoro chcesz obsługiwać dwie rzeczy w miarę asynchroniczne względem siebie, a bez zakłóceń w ich pracy - to musisz co najmniej jedną obsłużyć sprzętowo. Znaczy jeżeli zrobisz PWM na liczniku, to masz pewność jego pracy, a nie sądzę, żebyś przy tak małych założeniach projektu wysyłał tyle danych przez SPI, żeby nie było czasu na...
(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...
Kasowanie flagi powinno być w podprogramie. U ciebie nie ma kasowania w ogóle.
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.
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...
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.
(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...
Kasowanie błędu przez zapis do rejestru UARTRSR (dla niepoznaki w dataszicie określanego jako UARTECR). Ale tak jak rozumiem nie trzeba kasować flagi kiedy czyta się błędy z UARTDR (niezależnie czy FIFO jest włączony czy nie). Ona co prawda automatycznie się zeruje, ale dopiero po otrzymaniu prawidłowego CHARa w transmisji. Takie zachowanie dyskwalifikuje...
A gdzie masz kasowanie flagi przerwania ?
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...
a gdzie masz kasowanie flagi "odb_flaga" ?
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;
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.
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 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.
Podejrzewam, że w CubeMX nie wszystko da się ustawić. Co do obsługi to właściwie 2 wpisy do rejestrów, o których pisałem, a potem odczyt i kasowanie flagi CMF z rejestru USART_ISR.
Dzięki ;) Faktycznie, kasowanie flagi przerwań pomogło. Jedna linijka załatwiła problem. Co z tym przyciskiem zerującym ? Jakaś podpowiedź ?
Reti a kasowanie flagi to dwie różne rzeczy, domyślnie przerwania są załączone, wywołanie przerwania powoduje blokowanie reszty przerwań (żeby nienastępowały w czasie trwania jednego przerwania kolejne przerwanie), reti to powrót z przerwania.. powoduje ponowne załączenie przerwań i powraca do właściwego kodu programu, kasowanie flagi jest poto, że...
Mam problem z przerwaniem w trybie asynchronicznym - Amtega328. Załączam program uproszczony do niezbędnych elementów: [syntax=c]//co 0.5s ISR(TIMER2_OVF_vect) { ... _delay_us(30); //V1 //while(TIFR2 & (1<<TOV2)); //V2 //while(TIFR2 & (1<<TOV2)) _delay_us(1);//V3 //while(TIFR2 & (1<<TOV2)) TIFR2 |=1<<TOV2;//V4 //cli();...
Ogłoszenia! Uwzględniając uwagi Czytelników z wątku "wywiadowego" ( errata v1_2 ) otrzymuje oznaczenie 1.1. 6. Poradnik w wersji 1.1, po dodaniu najnowszych zmian (patrz plik errata v1_2a ) otrzymuje numerek 1.2 (jest świeży i jeszcze ciepły). 7. Poradnik w wersji 1.1 nie był publikowany. Ta "wirtualna" wersja została wprowadzona jedynie dla zachowania...
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...
Start: MOV SCON,11010000B ;... NIE SPRAWDZAM CZY JEST DOBRZE USTAWIONA TRANSMISJA MOV TMOD,00100000B ;... NIE SPRAWDZAM CZY JEST DOBRZE USTAWIONA TRANSMISJA MOV TH1,#243D ;..... brakowało "#" a samej wartości 243 nie sprawdzam :-) MOV TL1,#243D SETB TR1 ;................ włącz taktowanie SETB REN ;................ włącz odbiornik ELO: JNB RI,$ ;.....................
Jednoczesny odczyt i zapis danych - Wywaliłem niepotrzebne kasowanie flagi z kodu powyżej. [syntax=c]char SPI_RW(char data) { SPDR = data; while(!(SPSR & (1 << SPIF))); return SPDR; }[/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.
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.
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:...
Po sprawdzeniu flag nie zapomnij jej/ich skasować ale uwaga w tym rejestrze wyjątkowo kasujemy flagę przez wpis zera! N.
Witam! Właśnie piszę moduł UART w VHDL i mam takie pytanie. Jak realizowane jest w kontrolerach kasowanie flagi czy rejestru gdy zostanie on odczytany? Chodzi mi o rozwiązanie czysto sprzętowe tak aby nie trzeba było tego robić software-owo(np w MicroBlaze). Szukam i nie mogę nic na ten temat znaleźć. Przykładowo obsługuję przerwanie lub czytam którąś...
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]
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...
ok faktycznie, zapomniałem przepraszam. uC taktowany jest 16MHz, częstotliwość podniesiona do 32 mHz jest to ATxmega8 E5 Bez kasowania flagi przerwania nie wychodzi z niego. Czytałem o tym na jakimś zagranicznym forum, ręczne kasowanie flagi pomaga zmienna adc to float. Wrzuciłem do wyświetlenia samą wartość ADCA.CH0RES wpisując jądo zmiennej typu short...
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...
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...
Potrzebuję opóźnień rzędu 1-3 us, czasem kilkadziesiąt ns. Procesor taktowany jest 21MHz. Timer odpada, bo samo kasowanie flagi, ładowanie rejestru licznika i sprawdzanie w pętli flagi trwa zbyt długo. Używam pustego rozkazu NOP, ale nie wiem ile cykli zegarowych on trwa. Poza tym - czy asm("NOP"); nie jest pomijane przy optymalizacji?
Co to za procesor? Jaki jest jego częstotliwość zegara (kwarc + ewentualne dzielniki, a nie f_max z datasheet) PS. Bit SPI2X jest innym rejestrze w ATmega128. PS2. Kasowanie flagi SPIF w inicjalizacji mastera i slave'a możesz wywalić, nie jest potrzebne.
Żeby znaleźć jakiś punkt odniesienia spróbuję napisać co wiem na temat kasowania flag, podam dwa, które często stosuję - jak rozumiem dla Ciebie flaga to znacznik? Tak? Jako przykład będę się opierał na F303 1. Kasowanie flagi poprzez wpisanie jedynki. Na przykład taki rejestr: Interrupt clear register (I2C_ICR) "ALERTCF: Alert flag clear Writing 1...
Napisałem, że to pracuje na ATmega328P a tam nie ma takich zaleceń Słyszał kolega o erratach, niewykrytych błędach? Czy kolega sprawdził to, że kasowanie tej flagi nie ma znaczenia? Skoro jednak czytam Odczep się już od tej flagi. to pewnie tak.
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn ; Deklarujesz przerwanie na pin0 a oczekujesz go na pin9. Ustaw przerwanie na pin9 albo podepnij przycisk po pin0. Jaki to procesor? Niektóre STM32 mają łączone sygnały przerwań np.: STM32f100 ma pin9 na EXTI9_5_IRQn oczywiście mósisz wówczas zmienić również nagłówek: void EXTI0_IRQHandler(void) na: void...
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
kasowanie flagi przerwania attiny13 flagi własne flagi
oporność głośnik audio zdalne sterowanie poduszki rezystor
rns315 bluetooth junkers przygasa
Klapa bagażnika otwiera się mimo zamknięcia auta Różnice między KHM310AAA a KHM310AAA Q Version