dondu: Ja wcale tego pisać nie muszę :-) Po prostu zastanawiam się skąd taka maniera bierze. Ale dzięki za dbałość o mnie. Właściwie to ciekawsza byłaby dla mnie odpowiedź niż zlikwidowanie tej maniery. Do autora: Nie wnikając czy procedura skanowanie robi to co chciałbyś, aby robiła czy nie poniższa robi to samo trochę krócej, nieprawdaż? [syntax=c]...
Czyli zgadza się, ta flaga to czujnik wyjścia papieru. Czujnik pokrywy jest pod pokrywą w otworze z przodu.
Atmega 328P z kwarcem 18432000 (w specyfikacji mozna ja kręcić do 20MHz) spokojnie potrafi wygenerować trzy PWM przesunięte w fazie o 120 stopni z krokiem 256 z częstotliwością 50Hz przy tym nadając na USART o aktualnych warunkach jednego potencjometru. Pewnie że potrafi, ja na attiny 861 wygenerowałem 3 sinusy co 120 st z regulacją F od 20 do 250Hz...
ISR(USART_RXC_vect) { register u08 c; rxbuff = UDR; if (bit_is_clear(UCSRA, RXC)) { rxbuff = c; flaga.rx_int = 1; // ustaw flage } } Tutaj po coś przypisujesz do rxbuff c, które jest niezainicjalizowane... ?
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)...
ogolnie jest zasada tak ze w przerwaniach nie powinno byc jakis procedur opozniajacych, przerwanie powinno sie wykonac , obliczyc i wylaczyc jak najszybciej,glowny program jest od czasowek , komunikacji i2c itp. przynajmniej ja sie staram trzymac tych zasad.czasami mozna je nagiac oczywiscie.to zalezy od zlozonosci projektu. ja PCF8583 obsluguje zawsze...
Dzięki wielkie- ale to nie do mnie pisałeś. O Atomic_Block dowiedziałem się w czwartek- sprawdziłem- od czwartku jest to pierwsza wiadomość na ten temat. A wracając do tematu Fir3man- wymyśliłem taki schemat programu: #include <stdint.h> #include <avr/io.h> #include <stdlib.h> #include <avr/interrupt.h> volatile uint8_t dol;...
Pokaż Cały kod. Ale nie jako obazek.. W handlerze nie widzę zerowania flagi.
Teraz przypomniałem sobie, że miałem podobne problemy i wydaje mi się, że coś wspólnego miało z tym Fusing. Spróbuj wyświetlać na razie bez konwersji single na tekst. Ach te problemy miałem na wersji 1.11.9.8 http://www.elektroda.pl/rtvforum/topic17...
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".
Tryb jest 4 bitowy(chyba),bo korzystam z programu powyżej kolegi sp3uqw piny ma mam podłączone nastepująco PD0->D0.....PD7->D7(atmega8) to chyba nie nie przeszkadza że mam podłączone wszystkie 8 pinów w trybie 4 bitowym?? a mój program wygląda tak: #include <avr/io.h> #include "funkcje.c" #define RS_ON sbi(DDRC,PC5);sbi(PORTC,PC5) #define...
Mam drugi tongou z 25a i pomiarem i nadal jest ten sam problem, teraz z najnowszym oprogramowaniem 1.17.441. Flaga 38 nie jest tak naprawdę opcją, ponieważ z powodu przerwy w zasilaniu urządzenie uruchamia się i przechodzi w stan włączenia. Ale oprogramowanie sprzętowe nie rozpoznaje tego i nadal nie jest aktywny pomiar.
Odświeżę temat Zrobiłem tak, jak zasugerował niveasoft , czyli na Case Nie wiem czy tak to miało wyglądać. Zostaje ~994ms na inne sprawy do mnie przemawia, tylko może trzeba inaczej do tego podejść. Póki co będę próbował przenieść MAX na sprzętowe SPI - Wtv020SD nie ma pinu CS, więc może sterowanie obydwu układów poprzez pin CS może być utrudnione.
W przerwaniach masz _delay()- to wielki błąd. A _delay() w pętli- to duzy błąd. Masz Timer i masz go ustawić na przerwanie co 20ms. W tym przerwaniu ustawiasz sobie tyle flag ile trzeba i je zwiększasz. W głównej petli sprawdzasz czy flaga1==1, zerujesz i wykonujesz jakiś warunek. Potem sprawdzasz czy flaga2==5, zerujesz i robisz to co ma być robione...
mickpr - zły pomysł bo będzie mu blokowąło program A kto mówił, żeby przerwa była typu "waitms/delay". Przerwa może być zrealizowana jako flaga blokująca odczyt RC5 przez określony czas - a pętla odbierająca zdarzenia może chodzić cały czas z pełną prędkością wykonując inne zdarzenia. Zaletą "mojego" rozwiązania jest to, że regulując ten czas można...
Proponuję następujące zmiany: Dla zegara 8MHz Config Timer0 = Timer , Prescale = 8 wtedy jeden cykl = 1us - łatwo się liczy. Następnie w przerwaniu: Przerwanie: Timer0 = Timer0 + 213 If Flaga = 1 Then Toggle Portc.7 Else Portc.7 = 0 End If Return Dalej w podprogramie "Send_transmit" zamiast: Portc.7 = 1 napisz: Flaga = 1 a zamiast: Portc.7 = 0 napisz:...
W rejetrze GIFR pojawia się flaga żądania obsługi przerwania INTF0. I czeka. Gdy w rejestrze GICR pojawi się ponownie flaga INT0 (czyli w Bascomie enable INT0) przerwanie jest obsłużone i flaga INTF0 jest wtedy kasowana. Flaga INTF0 może byś skasowana ręcznie.
A co to jest UART0TxEmpty? Flaga ustawiana w innym przerwaniu? Bo jeśli tak, to chyba nie sądzisz, że jedno przerwanie ot tak sobie przerwie drugie, bez ręcznego wymuszenia takiego stanu? Nawiasem mówiąc, sposób w jaki chcesz to zrobić (przerwanie przerywające przerwanie, sprintf(), oczekiwanie w przerwaniu) woła o pomstę do nieba. Nie mówiąc już o...
poza tym dlaczego nie używasz sprzętowych timerów jako timerów tylko do generowania przerwań? Kolego może źle mnie zrozumiałeś ale do ustawiania flagi używam Timer0 i właśnie mnie dziwi dlaczego mi się te czasy nie zgadzają Jak do wyznaczenia czasu używam tego samego timera. Tak wygląda obsługa przerwania u mnie : Timer może zliczać czas wprost i w...
Więc warunkiem pętli niech jest i warunku który został podany i flaga, flagę ustawisz gdy wejście przyjmie stan przeciwny zostanie wykryta przerwa.
Nie da się skasować flagi, jest ustawiona tak długo, jak długo wejście INT ma poziom niski. Jest to prawdą (i to częściową) w przypadku wyzwalania przerwania poziomem niskim. W przypadku wyzwalania zboczem, lub zmianą poziomu flaga jest jak najbardziej kasowalna czy to sprzętowo czy programowo. Wracając do wyzwalania poziomem niskim: flaga nie "jest...
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...
Odblokowałeś globalne przerwania ale nie odblokowałeś indywidualnego od UART_RXC. Flaga RXCIE w rejestrze UCSRB. JarekC
A mógłby mi Kolega podpowiedzieć odnośnie odtwarzania plików, jeden po drugim ? Zrobiłem to tak: [syntax=vbnet] Godziny = 20 Minuty = 34 Do If Powiedz_czas = 1 Then If Powiedz_godzina = 1 Then Godziny_plik = Lookup(godziny , Godziny_mow) '************ odtwarzanie pierwszego pliku w pierwszym folderze Tf16p_data(4) = &H0F ' CMD Tf16p_data(6) = &H02 '...
Ś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,...
To Ci powinno ruszyć, napisałem kiedys pod Keila uVision3 V3.63. Dziala z Makieta Olimex'u LPC-2378-STK-A: // (LPC2378) mandaryn 2009 #include <lpc23xx.h> int flaga=0; // 0 -> dioda OFF, 1 -> dioda ON __irq void przerwanie (void) { if(flaga==0) // Gdy dioda wylaczona { FIO2SET|=0x00000001; // Wlaczenie diody...
W PDF jest napisane, że flaga jest zerowana gdy : "interrupt routine is executed". Ja to tłumaczę jako obsługa przerwania jest WYKONANA. CZYLI po ZAKOŃCZENIU. W PDF jest też napisane, że zerujemy ją wpisując do rejestru wartość na określonym bicie 1.Czyli EIFR.0=1. Dlatego wpisując EIFR.0=0 NIE ZEROWAŁEŚ FLAGI!. Spróbuj ja wyzerować następująco If EIFR.0=1...
Spróbuj zrobić od przepełnienia. W proteus'ie też port zmieni raz stan i nic. volatile int flaga; #include <avr/io.h> #include <avr/interrupt.h> int main (void) { DDRC = 0xff; // Ustaw jako wyjście LED TIMSK = 0x04; // Włącz przerwania przepełnienia (1 <<TOIE1) SREG = 0x80; // włącz przerwania globalne sei()...
To zapewne nie przechodzi przez kompilację: Pułapka 1: Zerowanie bitu przez wpisanie jedynki Czyli zamiast zgasić flagę ustawiłeś ją ponownie :) Inna sprawa że robisz to niepotrzebnie, ponieważ flaga ta jest gaszona sprzętowo zaraz po wejściu do funkcji obsługi przerwania: Bit 6 – INTF0: External Interrupt Flag 0 ... The flag is cleared when the...
- Nie do końca wiem co poszczególne linijki kodu powodują w samym układzie. Jeśli masz problem ze zrozumieniem rejestrów uC ich obsługi, co robi flaga, dlaczego i kiedy trzeba ją kasować, użyj HAL. Następnie podejrzyj (nie zawsze jest łatwo, bo HAL jest uniwersalny przez co czasem nieźle "zakręcony") jak to jest zrobione. Łatwiej będzie Ci zrozumieć...
Średnio chce mi się analizować ten kod, ale jeśli załączasz przerwania w przerwaniu od INT1 po wcześniejszym wyłączeniu przerwania od INT1 - jest poprawnym rozwiązaniem, gdyż nie ma możliwości wejścia do funkcji przerwania od INT1 podczas jej wykonywania niezależnie od okoliczności; tak ponowne zezwolenie na przerwanie od INT1 bez wcześniejszego zablokowania...
Przerwania PCINTx wykonują się przy każdej zmianie stanu logicznego, niema możliwości konfiguracji np. tylko dla zbocz narastającego lub opadającego. Stan zbocza na poszczególnym pinie sprawdzasz w przerwaniu. Attiny13 ma 6 pinów PB.0-PB.5 (PCINT0 do PCINT5) które mogą wywołać przerwanie. I tu jest jedna myląca rzecz :) dla tych pinów jest tylko jeden...
Przecież wiesz, że delay w przerwaniu nie powinieneś stosować to dlaczego ponownie je tam wstawiasz? Przyjmij wreszcie postawę, że delay jest be i przestań go używać, oraz że do odliczania odcinków czasowych należy wykorzystywać timery. Patrząc na to co zaproponowałeś powyżej nie wiesz natomiast, że: - wchodząc w przerwanie przerwania są blokowane (flaga...
A po co tak teoretyzować - wystarczy zajrzeć do PDF'a scalonego odbiornika TFMS czy TSOP żeby zobaczyć jak należy postąpić nie tylko z linią sygnału wyjściowego ale też jak podać zasilanie. Ludziom nie chce się tam zajrzeć a potem zdziwienie, że nawet jak działa - to jednak jakieś błędy się wkradają, czasem jakieś zakłócenia itp (jak tam już zajrzysz...
Przerwania nadawcze są dwa - TX Complete oraz UDRE empty. Przerwanie "USART_TX_vect" to przerwanie Complete generowane flagą TXCIE lub (w wypadku wyłączonego przerwania) testowane flagą TXC. Natomiast flaga UDRE w powiązaniu z flaga UDRIE generuje przerwanie Empty.
No dokładnie, o poolingu zapomnij. Najprościej zrobić tak jak pisze Mirek, bufor (niekoniecznie cykliczny), ale po prostu tablicę zawierającą wskaźniki do kolejnych komunikatów. W procedurze obsługi przerwania TX, wysyłasz bieżący komunikat, jeśli wysyłka jest zakończona to sprawdzasz czy w tablicy jest jakiś oczekujący i rozpoczynasz jego wysyłkę....
Miałem podobny problem: Control Status Register (0x00) ustawiony na 0x04 Alarm Control (0x08) ustawiony na 0x90 chciałem uzyskać alarm codziennie o określonej godzinie, a skorzystać chcę z wyjścia INT PCF8583. Wszystko ustawione, a flaga się nie zmienia, nie zmienia się też stan wyjścia INT (ma się zmienić z Hi na Lo) Po sprawdzeniu rejestrów okazało...
Mam już gotową płytkę, impulsy z obrotomierza kieruję na ICP tak jak zasugerował tmf. I teraz pytanie do Was czy pomożecie w pisaniu programu, żeby odpalić obsługę tego ICP ? Obecnie mój program wyglada tak: [syntax=vb]'--------------------KONFIGUR... $regfile = "m16def.dat" 'informuje kompilator o pliku...
Manual o IDLE mówi: An Idle character is interpreted as an entire frame of “1”s followed by the start bit of the next frame which contains data (The number of “1” ‘s will include the number of stop bits). Czy ktoś może sprawdzał praktycznie kiedy faktycznie pojawia się flaga IDLE? Ja z powyższej informacji wnioskuję, że...
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...
Wzorowy temat - są wszystkie istotne informacje, m.in. to o jaki układ chodzi! Niby wszystko działa, ale zawsze na starcie, zaraz po uruchomieniu Timera występuje przerwanie od przepełnienia. Tak jakby jakaś flaga byla ustawiona. To nie jest przerwanie od przepełnienia, tylko od "update event". Jeśli przed uruchomieniem timera wywołasz owy "update event"...
Jeżeli używasz klasy Serial, to tam to już jest zaimplementowane. Jeżeli nie, tu uważaj na możliwe problemy linkera (duplicate reference, symbol already defined), bo domyślna funkcja main, ta, która w pętli odwołuje się do funkcji loop, ma referencję do klasy Serial i przez to, może nie być możliwe instalowanie własnej obsługi przerwania UDRE_vect,...
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...
tryb CTC zerowany licznik jest po porównaniu z jakim rejestrem?? COMPA !! może i jestem laikiem, ale licznik w trybie CTC zerowany jest po zrownaniu z wartoscią zapisaną w rejestrze OCR. OCRA będąc dokładnym nie dowolnym OCR TCNT jaka ma wartość początkową? 0 TCNT używany jest do normalnej pracy licznika TCNT używane jest zawsze nie wiem skąd pomysł,...
Tak jak pisali ci wcześniej koledzy. Obsługę przerwania zrób jako zaznaczenie jakiejs flagi np: flaga_przerwanie =1; a potem już w Mainie rób z nią co chcesz czyli if (flaga_przerwanie) { rób coś tam} Wtedy zrobisz to samo, ale będą mogły swobodnie spływać inne przerwania. Przerwanie od UARTU to najlepszy sposób na prawidłową transmisje po UARCIE, jeśli...
Gdy procesor jest w trakcie wykonywania procedury przerwania, następne przerwanie nie będzie przyjęte , gdyż procesor (nie kompilator!) zeruję flagę globalnego zezwolenia na przerwania. Tak samo flaga bieżącego przerwania (tego, którego procedura obsługi jest wykonywana) zostaje automatycznie wyzerowana. Po zakończeniu przerwania flaga globalnego zezwolenia...
Koniecznie zadbaj o to, żeby wychodząc z tego przerwania jego flaga była wyzerowana, a wtedy to o czym kolega _marek_ mówi nie będzie miało miejsca. --- Podczas puszczania przycisku są zdecydowanie mniejsze drgania styków niż podczas jego przyciskania i o to mi chodziło. Poza tym reagujesz wciąż na zbocze opadające a tylko czekasz z powrotem na narastające,...
mała podpowiedź było troche błędów w Twoim programie i przeczytaj co dopisałem wyżej odnośnie pull up [syntax=basic4gl]'----------------------... '--------------------KONFIGURACJA-------... $regfile = "m8def.dat" 'informuje kompilator o procesorze $crystal = 8000000...
Ale nadal pozostaje pytanie: Dlaczego flaga INTF1 jest ustawiona, skoro po resecie powinna być 0? Skoro pull-up wewnętrzny nie daje właściwego rezultatu, a rezystor 1k tak, to czy nie masz czasem jakichś zakłóceń na płytce - zasilanie itp. prawidłowe?
a co jest nie tak z pętlą while(1) bo nie mogę się dopatrzeć To, że jest pusta. Stan zmiennej flaga sprawdzasz tylko raz na początku programu, po czym zapętlasz go w pustej pętli. Poza tym sprawdzanie if(flaga=1) jest błędem, zapewne miało być if(flaga==1) - przeczytaj ostrzeżenia kompilatora generowane w czasie kompilacji.
(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...
Początkujący to widać. Wielokrotnie na tym forum powtarzana jest złota rada: obsługa przerwania musi być jak na krótsza, czyt. nie w ilości linii kodu a w czasie. Dlatego często ustawiana jest flaga w przerwaniu a dopiero w pętli głównej wykonywane jest to co należy. System przerwań jest zależny od architektury procesora można je dowolnie włączać i...
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....
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...
Tak prosto to niezrobisz. W standardowej 51 nie można zamaskować rzeczywistego żródła przerwania do SIO. Jeżeli decydujesz się na przerwania to musisz obsłużyć wszystkie. W twoim przykładzie będziesz ciągle zajmował procesor tą pustą obsługą przerwania od nadawania bo nie skasowałeś jej przyczyny. Synchronizację nadawania musisz wtedy zrealizować na...
Jeżeli Twoja funkcja transmisji wygląda podobnie jak ta: ... niektóre przerwania przestają się wykonywać. A konkretnie są tracone, jeżeli były zgłoszone wielokrotnie w czasie, gdy nie zostały obsłużone. Tak na wszelki wypadek: http://mikrokontrolery.blogspot.com/2011... Rozwiąż to także flagami, a wtedy okaże się czy to było...
Mam prośbę do tych znających lepiej BASCOMA, o przeanalizowanie tego kodu. Program po pewnym czasie wysypuje się. Temperatura co jakiś czas waruje. Podprogramy działają, ale całość nie chce współpracować. Z góry przepraszam za jakość kodu. [syntax=vb]'--------------------KONFIGUR... $regfile = "m16def.dat"...
No to chyba tak, jak kombinowałem ( tylko może źle to opisałem ). Wybrałem grupę interruptów PCINT, a potem wybrałem dwa interesujące mnie PCINT'y. I w następnej linii kodu ustawiłem flagę "I" komendą sei(). Czyli spełniłem trzy warunki GIMSK = (1<<PCIE); (albo GIMSK = 0b00100000;) -> Włączyłem przerwania PCINTx PCMSK = 0b00011000 ; (albo...
Jak zmusić diodę alarmu do migania nie używająć procedur waitms ? Mam teraz zrobine tak: Używasz Timer0 jako pewnego rodzaju 'swoisty' prescaler: (4 ms; 100 ms; i 1 sec). Dlaczego okazyjnie nie wykrzystać tych 100 ms na miganie diodą? Wstaw tą wyżej procedure (troche zmodyfikowana - zamiast "set Porta.5" daj "toggle") w przerwaniu timera0 w miejscu...
Zmienne globalne powinny być modyfikowane tylko w kilku koniecznych obszarach wewnątrz programu. Gdyż, jeśli odbywa się to w oparciu o wiele wątków (tj. poprzez główny proces, ISR i inne funkcje sprzętowe, takie jak DMA w mikrokontrolerze), istnieje ryzyko uszkodzenia zmiennej w pamięci. To ryzyko zawsze istnieje, jeśli niepoprawnie odwołujemy się...
Witam Piszę procedurę wysyłającą na daną końcówkę portu 1ms impulsy w zadanych odcinkach czasu. Według wyliczeń kalkulatora dla AVR wychodzi iż przy 4HMz kwarcu, preskalerze ustawiony na 64 i początkowej wartości licznika 193 zegar generuje przerwanie w granicach 1ms. I tak mam ustawioną konfigurację: Config Timer2 = Timer , Prescale = 64 Load Timer2...
To co napisałem to wiem po co od razu taka uszczypliwość , timery wykorzystuje do sterowania pinem CSN i CE chyba że powiesz mi jak to lepiej zrobić to zamieniam się w słuch, ok same flagi może trochę zaciemniają obraz bo brak do nich komentarzy, po krótce wygląda to tak. -gdzieś w programie wywołuje sobie softwerowo przerwanie od pinu IRQ -w przerwaniu...
Nie prościej by było zamiast używać pól bitowych przejść na "tryb szestnastkowy"? [syntax=c] #define FLAGA1 0x01 #define FLAGA2 0x02 unsigned char flaga; flaga |= FLAGA1; //ustawienie flagi 1 flaga |= FLAGA2; //ustawienie flagi 2 flaga &= (~FLAGA1); //usunięcie flagi 1 flaga &= (~FLAGA2); //usunięcie flagi 2 [/syntax] Z tego co pamiętam prowadzący od...
Witam, Pracuje nad kodem programu do komunikacji przez UART (mikrokontroler <-> komputer) i zastanawiam się nad sposobem implementacji w przerwaniach. Na razie zrobiłem to w taki sposób: - Nadawanie danych wykonuje w taki sposób, że w programie głównym zmieniam w wskaźniku adres początku tablicy którą aktualnie przesyłam przez UART, w przerwaniu...
Mam napisaną taką obsługę wyświetlania: [syntax=basic4gl]Dim Cas As Byte 'zapamietuje aktualną pozycje wświetlania Dim Display_lcd As Byte Dim Trybprzycisk As Bit Dim Trybpomocnicza1 As Bit Do If Flaga_100ms = 1 Then 'co 100ms Flaga_100ms = 0 Gosub Disp_lcd End If If Flaga_1s = 1 Then 'co 1s Flaga_1s = 0 Gosub Alarm End If Loop End '---------------------------------------...
w trybie ISR_NOBLOCK może dojść do przepełnienia stosu jeśli przerwania będą się pojawiać zanim bieżące nie zostanie obsłużone. W takich sytuacjach warto sobie wstawić jakiś licznik zliczający zagłębienie wywołań. Tak by było, gdyby przerwanie pochodziło od poziomu niskiego a nie od zbocza albo przerwanie odbiorce USART. Gdy jest przerwanie od zbocza,...
A co znaczy "zerwanie"? Transmisja szeregowa co do zasady nie ma początku ani końca. To strumień znaków. Niektóre peryferia mają możliwość aktywowania wykrywania przerw między znakami (Break). Długość przerwy można zdefiniować. Nie wiem czy RP2040 to ma. Ale jeśli ma to nie jest to raczej flaga FE czyli jak przypuszczam Frame Error. To jest flaga wskazująca...
Czyli rozumiem że najlepszą praktyką jest ustawianie w flagi w procedurze przerwania a resztę wykonywać w main? W Twoim przypadku na pewno. I tak robić dla każdego rodzaju przerwania? Nie, tylko tam gdzie masz kod, który wykonuje się sporo czasu. Co znaczy "sporo czasu"? A to już zależy, od przypadku :) Innymi słowy chodzi o to, by nie utracić tych...
Właczasz/ wyłączasz flagi zezwolenia na obsługę przerwań. A nie kasujesz flag przerwań- tych w rejestrze GIFR. One tam zostają- i jak tylko ponownie zezwolisz na obsługę przerwania- to się wykona, no bo flaga przerwania jest ustawiona. Czym innym jest flaga przerwania a czym innym flaga zezwolenia na obsługę przerwania. Co zresztą pozwala na obsługę...
Najprościej to chyba tak: [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #define TIMERSTART 6 volatile uint8_t FLAGA_50 = 0; volatile uint8_t FLAGA_1000 = 0; // funkcja obslugi przerwania TIMER0_OVF 8MHz / 64 * 250 wychodzi co 2ms // dla innego taktowania nalezy ustawic inny preskaler i/lub inne liczniki stawiania flag ISR(TIMER0_OVF_vect)...
timera powinien ustawiać flagi (np stan=port_z_czujnikami) i koniec przerwania (żadnego wyłączania przerwań i innych śmieci). Drugi timer odlicza sekundy (czy tam inne dt dla kolejnych diod), led_port(i)=schody(i) (środkowe 6 bitów, więc trzeba przesunąć i maskować); + flaga wejścia Generalnie ta idea jest bezsensowna. Zauważ że absolutnie zupełnie...
a po co na końcu dawac komende #asm("cli")? Czy kompilator nie zrobi tego natychmiast sei ? Kompilator nie dodaje SEI. Flaga I w SREG jest automatycznie - sprzętowo, a nie programowo - czyli procesor sam ją ustawia w momencie wyjścia z procedury obsługi przerwania. Jednak obsługa przerwania nie kończy się w momencie zakończenia wykonywania kodu napisanego...
Strona 117, notka numer 2. flagę w rejestrze PIR czyści się przed włączeniem przerwań i po obsłudze przerwania związanego z tą flagą. Nie kolego. Ta notka mówi że należy się upewnić, że flaga jest wyczyszczona przed włączeniem przerwań i po obsłużeniu przerwania. Nie mówi NIC o tym kiedy czyścić. Albert
Witam W obsłudze przerwania nie powinno być żadnych waitms itp poleceń które blokują program, Wykorzystaj timer i flagi do odliczania konkretnych odcinków czasu a wszystko inne powinno leżeć w do loop. W przerwaniu nie ma po co wyłaczać timera, tylko trzeba zrobić dzielnik tak aby flaga była ustawiana co 4ms lub 3ms tak jak chciałeś mieć. Potem trzeba...
Jest coś nie tak z UART_BUFOR. W przedstawionym fragmencie brak definicji tego tworu więc nie wiadomo dlaczego. Poza tym typowy błąd AVRowca - nieskasowana flaga przerwania. Powtórzę to co przedmówca: poradnik szczywronka wyłuszcza to prosto i zrozumiale. Nazwy wektorów przerwań biorę z Reference Manuala albo z plików startowych np. vectors_stm32f10x.c...
no wykonuje ci się wszystko bardzo wolno - ponieważ w procedury obsługi przerwań pakujesz sobie czaso-żerne procedury w tym te najgorsze czyli opóźniające. popatrz ile np u mnie zajmuje kod przerwania od zegarka PCF // przerwanie INT1 generowane jest przez PCF8583 co 1 sekundę // ustawiana jest flaga od której zależy wyświetlanie // czasu, daty, temperatury...
Jedynie nie wiem jak obsłużyć odczytywanie danych. Do tego chyba ten bufor nie jest potrzebny, tylko jak to uwzględnić w przerwaniu? Sprawa z odczytem jest nieco bardziej skomplikowana, ale to też idzie rozwiązać. Niestety nie przedstawię na forum ani gotowego kodu, ani szczegółowego algorytmu. Mogę podpowiedzieć tyle. Przykładowo, jeśli chcesz odczytać...
Ja klawiaturkę taką 4x4 zrobiłem odrobinę inaczej, tj. http://obrazki.elektroda.net/65_11882088... a program obsługi działa na zasadzie wykrycia naciśnięcia jakiegoś klawisza a następnie na tej podstawie sprawdzenia który to klawisz został wciśnięty: void sprawdz(volatile int x) //sprawdza ktory przycisk zostal nacisniety { volatile int wsk=0;...
Możesz zrobić to tak: Zmienne które wykorzystywane są w przerwaniach mają "duchy" czyli np zmienna znak wykorzystujesz w programie, natomiast zmienna znak_duch w przerwaniu. Teraz jeżeli odebrany zostanie znak zapisujesz go do zmiennej znak_duch i sygnalizujesz flagą (jakas dodatkowa zmienna) że zmienna ma nową zawartość. Teraz w głównej pętli, na jej...
" za niski poziom paliwa do uruchomienia nagrzewnicy " My też nie wiemy skąd wziąłeś taki numer w INS a tym bardziej ten opis. :) Podaj ten nieszczęsny VIN, albo prawdziwy identyfikator modułu z błędem. I jaką nagrzewnicę chcesz uruchamiać, świecę czy ogrzewanie kabiny? FLA - 0302 Zawór elektromagnetyczny ma przerwę. ZHE - 0302 Napięcie dolne
Trochę wróżycie z fusów. Nigdzie nie wyczytałem, że jest to przerwanie od UART tylko przerwanie w którym wysyłamy przez UART chyba 2 bajty. Tylko autor postu tak naprawę wie "o co chodzi" w tym programie. Jeśli utrata przerwania nie zakłóci działania programu można je wyłączyć. Jeśli nie, potrzebna będzie flaga "dane gotowe" i obsługa w przerwania przypadku...
A kto powiedział że musisz go wyłączać? Istnieje lepszy sposób: robisz sobie flagę którą resetujesz w pzrerwaniu od timera. Potem wystarczy dodać coś takiego: Set Flaga : While Flaga = 1 : Wend Takie coś wstawiasz tam gdzie wcześniej musialeś wyłączać przerwania. Działa to tak że uc czeka aż wykona się przerwanie i dzięki temu wiemy że miało...
2. Takie ogólne pytanie gdzie w kodzie należy umieszczać obsługę przycisków, pomiar czasu, pomiar temperatury, obliczenia (przerwania czy w pętli while(1) ) czy może jeszcze gdzieś indziej ? Z jednej strony w wielu postach jest napisane aby w przerwaniach było jak najmniej instrukcji z drugiej strony gdzieś to wszystko trzeba przetworzyć. W przerwaniu...
Jeśli chcesz aby w trakcie jednego przerwania zostało obsłużone drugie, ważniejsze, dopisz w przerwaniu SEI. Wchodząc do przerwania flaga I jest zerowana i są wyłączane przerwania, rozkaz RETI ponownie ustawia flagę I.
A propos: zastosowałem flage w przewaniach lecz to nic nie dało. Sprawdzasz ją tylko raz w dodatku przed pętlą główną i przed wystartowaniem pierwszej konwersji. Jaki więc to ma mieć sens? Przeanalizowałeś i wypróbowałeś przykłady z artykułu, który Ci wskazałem w poście #4? Jeśli nie, to poświęć na to swój czas.
Jeśli zajrzysz do definicji funkcji NVIC_SetPriority((), zobaczysz, że dla SysTick nie rusza ona wcale NVIC. Racja, wpisuje do innych rejestrów. Ale Manual pisze że SysTick też wchodzi o NVIC. Jeszcze kolejna sprawa. Skoro Aby mogło wystąpić przerwanie należy zarówno ustawić i to co generuje przerwanie np Timer jak i NVIC. Ale co np ze znacznikiem...
Wypadałoby poczekać z obliczaniem, aż to przerwanie na pewno wystąpi. cos jak: while (flaga == 0); dodane w main pomiędzy uruchom_timer1(); a czas = oblicz_czas(); Chyba bardziej dokładny wynik otrzymasz, gdy obliczenia od razu uruchomisz w przerwaniu od INT0, a zmienna flaga będzie sygnalizować, że wynik już jest.
Jeśli zmienna ta będzie jednobajtowa, to problemów z atomowością generalnie nie będzie, pod warunkiem że nie używasz RMW (_co20ms++) poza przerwaniem. W przypadku zmiennej dwubajtowej, wszystko zależy od rdzenia: jeśli jest on w stanie odczytać dwa bajty za pomocą jednej instrukcji (np.arm: ldrh), to problemu też nie będzie. W przypadku procesorów 8-bitowych...
Witam, hmmm czy może być powodem to, że jeśli dokonuję dość długich procedur w obsłudze przerwania TWI to może się właśnie tak zdarzyć, że jakby nakładają się na siebie 2 przerwania i to ze statusem &HA8 zostaje "zeżarte" ??? Tak to brzmi z tego co piszesz, ale z drugiej strony slave powinien "przetrzymać" SCL w stanie niskim tak długo, jak długo nie...
Poza tym jeśli się wie co się pisze to debuger jest zbędny. Czasami lepiej wykorzystać UART DBGU i wysyłać sobie interesujące nas zmienne na terminal. Co to za podejscie ? Debugger to NIEZBEDNE narzedzie przy profesjonalnych produktach i nie raz uratowal mi tylek przy poprawkach bledow w nieswoim kodzie. Spotkalem sie z tym ze rozne debuggery roznie...
Mozemy pomoc w pisaniu, ale z helpem Bascoma powienienes dac rade, obslyga lcd ->gotwa funkcja -klawisze dasz rade, zmieniasz jedynie zmienne - odmierzanie czasu sporbuj na timer1 co np sekunde bedzie zwiekszal Ci zmienna Czas, w petli gl musisz kontrolowac by wartosc nie przekroczyla zakresu - prostym if'em sprawdzasz wartosc tej zmiennej Czas z czasem...
Witam mam bardzo nietypowy jak dla mnie problem z układem który ostatnio wykonałem. Mianowicie jest to centralka alarmowa oparta o uC ATmega16. Działa na tej zasadzie że pod wejście PB2(INT2) podpięty jest kontrakton (zwiera do masy) do którego przykładam magnes i albo rozbrajam albo uzbrajam centralkę. Z grubsza to wygląda tak: PB2(INT2) skonfigurowane...
A nazywaj sobie jak to chcesz... pętla zdarzeń czy jakies cos innego. Dla mnie to jest normalny main w którym ma sie wykonywać kod programu. Przerwanie służy mi sygnalizowania ze jakis czas juz upłynął i pętla main moze sobie na to jakos reagować i cos robić. Ewentualnie w przerwaniu jakies niewielkie kawałki kodu. Nie. Nie ma sensu robić pętli zdarzeń,...
W oparciu o Wasze rady oraz [url=http://www.avrfreaks.net/index.php?... Guide to AVR Timers i przydatną stronę [url=http://www.et06.dk/atmega_timers/]A... Timer/Counter/Prescaler Calculator w wolnym czasie sklepałem taki kawałek kodu: [syntax=c]#include <avr/io.h> #include <avr/interrupt.h>...
Najdłużej tam pewnie trwa oczekiwanie na wynik pomiaru ADC który jest dodatkowo podwójny. Bascom robi dwa odczyty jeden za drugim. Można to wyłączyć, ale pomyśl o samym oczekiwaniu na konwersję. Gdyby to było poza przerwaniem to inne przerwanie spokojnie mogłoby to oczekiwanie przerwać tak jak można przerwać każde Waitms. Spróbowałbym w przerwaniu ustawić...
Witajcie, moją przygodę z STM32 zacząłem stosunkowo niedawno, praktycznie od samego początku staram się stworzyć "protokół" do bezawaryjnej komunikacji po USARcie, który wykorzystany będzie do transmisji danych z małego robota typu LineFollower. Nie mam większej wiedzy, ani doświadczenia z tej dziedziny. Stworzyłem trochę kodu na podstawie własnych...
Mniej więcej, to znaczy flaga jeśli nie jest niegdzie zerowana, to po odebraniu pierwszego bajtu zostanie ustawiona i koniec dalszych zmian (kazdy kolejny bajt bedzie wpisywal w nią jedynke ale nic to nie zmieni bo tej jedynki nic w miedzyczasie nie kasuje). Stan wysoki na linii SS również jej nie wyzeruje. Zauważ tez że odczyt najpierw SPSR z ustawiona...
Jak wyrzucisz z przerwania obsługę przycisków- to będzie krótkie. Jak masz przerwanie co 10ms to daj flaga++ kasowanie w głównej pętli co 3-4 przerwania- 30-40ms. w linkach -nie pamiętam. Ale niektórzy zamiast napisać "wykorzystując przerwanie" piszą "w przerwaniu" Ja napisałem tak: "Wystarczy w przerwaniu ustawiać jeszcze jakąś flagę. Potem w głównej...
instrukcja tst spraawdza czy rejestr jest wyzerowany (cały = $00) a instrukcja sbrc sprawdza czy dany bit w rejestrze jest wyzerowany. Może w przypadku 1 nie masz wyzerowanego całego rejestru, lub sknocone coś z SREG (flaga Z lub C). Na nie reaguje instrukcja brne. Czy zachowałeś SREG na stosie przy wejściu do obsługi przerwania? Pozdrawiam
Witam, od jakiegoś czasu próbuję stworzyć sobie zegarek z termometrem + napięcie akumulatora do auta. Wszystkie programy osobno działają bez zarzutu. Problem zaczął się z chęcią wprowadzenia przełączalnych ekranów i wprowadzeniu przerwań. Doczytałem że przerwania skutecznie psują komunikację z DS'ami przez co temperatura się nie odczytuje. Ogólnie to...
flaga przerwa atmega8 flaga bascom obsługa flaga
dekoder odbioru polsatu skrzypienie skręcaniu transformator jonizator
gdzie kupić potemcjometr suwakowy1m gdzie kupić potemcjometr suwakowy1m
Pionowy pas z prążkami na wyświetlaczu Toshiba C870 Numer PNC 91107700308 - Co oznacza?