drogi starosto int0 jako przerwanie zewnętrznę może posłużyć np tak jak na laborkach do obsługi odbioru rc5 gdy podczas wystąpienia tego przerwania odbierany jest kod rc5 z odbiornika podczerwieni . pml11
To działa: [syntax=c] #define Port_USART3 USART3 #define Port_USART3_CLK RCC_APB1Periph_USART3 #define Port_USART3_TX_PIN GPIO_Pin_10 #define Port_USART3_TX_GPIO_PORT GPIOB #define Port_USART3_TX_GPIO_CLK RCC_AHB1Periph_GPIOB #define Port_USART3_TX_SOURCE GPIO_PinSource10 #define Port_USART3_TX_AF GPIO_AF_USART3 #define Port_USART3_RX_PIN GPIO_Pin_11...
Przerwanie nie powinno byc zgubione, procesor przerwania odbiera tylko nie wywoluje procedur obslugi a stan przerwan zapamietuje w wewnetrznych przerzutnikach i jak tylko przerwania sa odmaskowane to wykonuje ich procedury obslugi. Oczywiscie stan ten nie moze byc dlugi dlatego trzeba to robic na czas najkrotszy jak sie da, nie ma innej mozliwosci synchronizacji...
Witam Przepraszam za tak długą absencję. Program udało mi się uruchomić - po sugestiach kolegi chudybyk wyłączyłem przerawnia odbierania. Teraz potwierdził to kolega papikus :) Narazie zakładam że wszystko jest idealne - chciałem zacząć od "czegoś" :) Co ewentualnie możnaby jeszcze poprawić / na co zwrócić uwagę (oprócz wyrzucenia procedury odbioru...
Sposób najprostszy - użyć przewodów zamiast mikrokontrolera. Jeśli nie stać nas na dwa przewody, można zaprogramować DMA w tryb cykliczny na bezpośrenią transmisję pomiędzy rejestrami danych obu UARTów. Jeśli oprócz kopiowania dane mają być jeszcze przetwarzane, to należy oprogramować oba UARTy na przerwaniach i w nich zrobić przetwarzanie danych i...
A może masz gdzieś funkcję obsługi tego przerwania? Dodano po 4 Dodam, że korzystam z programowego bufora cyklicznego, który w przerwaniach odbiera dane od UDR. Jedyne co mi przychodzi na myśl to to, że przerwanie tak szybko się wykona (odebranie danych do bufora i skasowanie flagi RXC), że część programu: while ( !(UCSRA & (1<<RXC)) ); nawet...
Wydaje mi się że powinno to zadziałać. Podziel sobie program tak aby najpierw odbierał kod w przerwaniu INT a inny podprogram odbierałby dane z klawiatury i wyświetlał cośtam na lcd. Gdybanie gdybaniem ale nigdy nie sprawdzisz lepiej co sie stanie dopóki nie zbudujesz pcb.[/quote]
Być może przeczytanie mojego tematu pomoże: [url=http://www.elektroda.pl/rtvforum/to...
Zacznij od opisania formatu danych. Po czym odbiorca ma poznać, że zakończono przesyłanie liczby? Tego ne napisałeś powyżej. Odbiór łatwo zrobisz w przerwaniu, pisząc obsługę przerwania w konwencji automatu. Najpierw poczytaj, co oznacza poprzednie zdanie. Potem możesz zacząć pisać automat. Potrzebne tylko dwa stany: - oczekiwanie na 'L' - skanowanie...
A ja słyszałem, że w Ameryce biją murzynów. Na oscylatorze wewnętrznym mogą się dziać różne rzeczy, do UART potrzebny jest kwarc, chyba, że używasz XMega, lub wiesz co robisz. Po drugie, jeśli mamy ci pomóc to daj nam chociaż szansę. Popraw błędy o których pisałem. Jeśli masz krzaki to powodem jest albo transceiver, albo niedopasowanie częstości taktowania...
Jesli chodzi o C++ to niestety nie pomoge, pewnie funkcja wysiwetlajaca liczby interpretuje je jako signed i stad ten problem.
U mnie działa ;) inputString musisz kasować zawsze po odebraniu pełnej ramki a nie tylko wtedy gdy jest kierowana do Ciebie.
Co masz na myśli pisząc "przekierowuje dane do poszczególnych baz" ? W przerwaniu odbierasz ramkę, sprawdzasz ID i w zależności od wartości ID podejmujesz jakąś akcję.
I teraz sygnał po Transceiverze chciałbym pościć po SPI na uP(Atmega128 lub Atmega162) I tutaj moje pytanie czy jest to dobre rozwiązanie, i czy układ wyrobi się z odbiorem danych po SPI???? Wydaje mi się że na SPI nie bedzie to pracowac. Musisz podłączyc sygnał z transceivera do jakiegoś portu z przerwaniem i z odpowiednią częstotliwością (zależną...
Witam, nie powiem, że to będzie najlepszy sposób, ale myślę że będzie prosty. W przerwaniu odbierasz bajt pierwszy komunikatu MIDI, zerujesz zmienną uint32_t i zaczynasz budować ją od nowa. Po odebraniu wszystkiego porównujesz, i kopiujesz do bufora.
Ustawiłem właśnie maske na 0, jeśli dobrze rozumiem wtedy filtr przyjmuje wszystko jak leci. No i dalej nic. Może musze to w przerwaniu odbierać? Wracam walczyć z tym dalej :).
Kolejne pytanie: Jeśli chcę odebrać kilka znaków z klawiatury to powinienem wpisać to w jakąś tablicę? Jeśli chcę wysłać do PC cały wyraz to jak to robić? Możesz to zrobić różnie. Zależy czego potrzebujesz i na ile jesteś wprawny w programowaniu w C. W każdym z przypadków trudno jednak będzie się obyć bez tablic dla ciągów znaków odbieranych i wysyłanych....
Nie do końca rozumiem ten kod ale proponuję wykorzystać UART sprzętowy i obsługiwać go poprzez przerwania. Odbierasz pierwszy bajt i dostajesz przerwanie. Zapisujesz go sobie gdzieś i czekasz na następny. Jak odbierzesz wszystkie zamierzone bajty wykonujesz to co trzeba.
Złe podejście. Zrób to na przerwaniach. W przerwaniu odbieraj znaki do bufora i sprawdzaj czy przyszło to co trzeba. Jak przyszło to ustaw flagę po czym w main załaduj do bufora nadawczego co trzeba i wyślij (też w przerwaniu).
Jesli ramka ma max 20 bajtow to zadeklarowac pole o tej dlugosci, w przerwaniu odbierac kolejne bajty i je zapisywac. Dodatkowo jeden bajt jako flaga, ze cala ramka zostala odebrana (w przerwaniu trzeba porownac odebrana informacje o dlugosci ramki z iloscia faktycznie odebranych bajtow). Ta flaga w programie glownym mowi o tym, ze jest gotowy pakiet...
Funkcja (w takiej ostatecznej formie jak przedstawiona przez Ciebie), wygląda na poprawną, tzn. powinna działać tak jak tego oczekujesz, chociaż sprawdzałem pobieżnie i głowy nie dam :D "Poprawność" rozumiem tu w sensie użytej sekwencji instrukcji. Przypuszczam, że kłopot może wynikać z zależności czasowych. Robisz dużo operacji na LCD. Być może użyte...
Odbieraj znaki w przerwaniu, a obsługę rób w pętli głównej, lub wyłączaj przerwanie po odebraniu pierwszego znaku, a potem załączaj. Możesz też sprawdzać czy nie pojawia się Twoje "jedynie pewne znaki" I po ich odebraniu "odciąć" ciąg. Masz jeszcze Ischarwaiting do zabawy.
Weis, tak tutaj głównie błąd leżał. dzięki. _Robak_, czy tym przerwaniem odbierasz stringa: ISR(USART_RXC_vect) { UARTBuffer[UARTCount] = UDR; UARTCount++; rx_counter++; if ( UARTCount == BUFF_SIZE ) { UARTCount = 0; } }
Mam pytanie odnoście AVR Studio, programuje w gcc z kompilatorem WinAVR i muszę wykonać przerwanie i zależy mi na czasie wykonania przerwania. Tutaj moje pytanie, czy są jakieś opcje kompilatora, które wyłaczają wysyłanie rejestrów na stos przy przerwaniu? Bo wysyłanie i odbieranie rejestrów nawet tych których nie używam w przerwaniu trwa dłużej niż...
Witam. MAm problem z T2 w tym procku. Próbuje zmusić dziada do tego, by zgłaszał przerwania przy zrównaniu zawartości T2CNT i T2PR- zlicza - bo zgłasza żadanie przerwania - ale CPU nie chce odebrać. IMR - ustawione dobrze - poziom INT3 (100b) EVIMRB - #1h (T2PINT) EVIFRB - zgłasza #1h (#5h) mam problem z wyzerowaniem EVIFRB sekwencją: LACC EVIFRB SACL...
strstr poda ci wskaźnik na pierwszą pozycję RING. Jeżeli chcesz dalej przeszukiwć to robisz buffor+offset i daje szukasz. Jak znajdziesz to znowu zwiększasz offset. Np: char *s; char offset; offset=0; s = strstr(bufor+offset, szukany_łańcuch); pozycja=s-bufor; offset=pozycja; s = strstr(bufor+offset, szukany_łańcuch); pozycja=s-bufor; itd :) Dodano...
Po pierwsze enkoder możesz obsługiwać sprzętowo na XMEGA - w tym celu konfigurujesz event system na QDEC, a dowolny timer będzie ci zliczał impulsy i pracował jako enkoder. Co do transmisji USART - można paczki odbierać przez DMA, co jest wygodne, można to zrobić w oparciu o przerwania. W tym celu odblokowujesz przerwanie RXComplete sygnalizujące gotowy...
Wywołując nadawanie długiego ciągu znaków przez UART w przerwaniu odbioru gwarantujesz gubienie odbieranych danych. Wyrzuć uart_printf z przerwania, a problem zniknie,
Witam. A jak nie włączysz przerwań i sprawdzasz flagę [syntax=c]if (CAN1->RF0R & CAN_RF0R_FMP0) { // tu jak coś jest z CAN1 }[/syntax] To odbierasz coś.. Pozdrawiam
Odniosłem sie do tego że OT przerwanie ustawił co 1ms i zlicza w nim do 20ms. Napisałem też że będąc w przerwaniu co 1ms można "przeoczyć" inne przerwanie. Jeśli odbieramy szybko dane na przerwaniach to niekoniecznie takie 10ms jest najważniejsze.
To by tłumaczyło dlaczego odbierasz 3 znaki - (at)tmf miał rację. Odbierasz pierwszy i np wyświetlasz, w tym czasie przychodzą kolejne, AVR ma bufor na dwa znaki, więc dwa odbierzesz poprawnie, resztę gubisz. Niestety nie wiesz o tym, bo nie sprawdzasz w USARTReadChar() flagi przepełnienia :-( Odbieraj na przerwaniach, zrób sensowny bufor na dane a...
wszystko niby dobrze i fajnie, działać będzie, ale błagam, nie dawajcie instrukcji typu Lcd i Wait w przerwaniu!!!
A ja się zastanawiam po co Ci to: [syntax=basic4gl]Config Serialout = Buffered , Size = 20[/syntax] Bo jeżeli ręcznie odbierasz znaki w przerwaniu (a odbierasz) to to jest zbędne. Albo może i nawet szkodliwe.
Nie przepełniasz go jednym znakiem, a składowaniem kontekstu przy przerwaniu - być może. Zacznij od prostego echa - co odbierzesz, to natychmiast nadawaj z powrotem. Zwykle tak się właśnie uruchamiało transmisję, kiedy nie było możliwości debugowania. Najpierw zrób to w pętli, potem w przerwaniu - będziesz wiedział, że przerwania działają.
Tego Ci trzeba (gotowy przykład): http://mikrokontrolery.blogspot.com/2011... a to przy okazji: http://mikrokontrolery.blogspot.com/2011...
Koncepcja jest dobra, tylko szczegóły złe. W odbiorniku: 1. W przerwaniu odbieraj tylko jeden znak a nie dwa. 2. Nie używaj w przerwaniu i pętli głównej tych samych zmiennych dr1 i dr2 bo nie wiesz kiedy dane przyjdą. Albo daj jakiś znacznik. Zacznij od opracowania jakiegoś prostego protokołu (ramki) bo może się zdarzyć (a może nie) że nie otrzymasz...
Obsługa UART jest przerywana TIMEREM i dlatego gubi znaki. Zrób odbiór UARTU na przerwaniach, odbieraj w nim tylko pojedynczy znak i ładuj go do bufora (nie czekaj w tej funcji,aż odbierzesz wszystkie znaki), a po odebraniu końcowego znaku ustawiasz flagę, że skończył. I w pętli głównej dekodujesz sobie na spokojnie tą ramkę. Popróbuj może jeszcze ze...
Dodam, że w obsłudze przerwania występuje takie ostrzeżenie przy kompilacji: "usart.c:60: warning: passing argument 1 of 'USART_puts' makes pointer from integer without a cast". Tylko nie wiem o co w nim chodzi, wszystkie typy zmiennych się zgadzają. Nieprawda, podajesz char tam gdzie powinno być char *. Ale po prostu wołasz złą funkcję. W przerwaniu...
Timerem. Chyba że w jednym przerwaniu chcesz odbierać całą ramkę RC5. Wtedy można zrobić programowe odliczanie czasu.
od tego są flagi UARTU. Odbiór w przerwaniu odbierasz tylko znak, i instrumentujesz zmienna static oznaczająca ilość danych już odebranych, gdy odbierasz 0x55 (początek ramki - nigdzie indziej nie może zostać przypadkiem wysłana) zmienna ustawiasz na 0. dalej dekrementacja licznika dalej warunek końca ramki. sprawdzasz komendą i robisz co chcesz. Co...
A globalną flagę przerwań odblokowałeś?
Witam. Włącz przerwania, inaczej dane nie wpadną do bufora.
najlepiej odbierać i nadawać w przerwaniach od uart'u a nadawanie zaczynać przez wysłanie na magistralę np określonego bytu który powoduje że inne urządzenia które dokonują nasłuchu na magistrali są zablokowane na nadawanie danych przez np 2 sekundy oczekując w ciągu tego czasu danych które będą wysyłane
Zdefiniuj "nie działa". Nic nie odbiera? Bo w sumie to nie powinien. Żeby odebrać coś za pomocą przerwania należy te przerwania włączyć [syntax=c] NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemp... = 0; NVIC_InitStructure.NVIC_IRQChannelSubPri... = 0; NVIC_InitStructure.NVIC_IRQChannelCmd...
wylaczyc przerwania w momencie wyswietlania danych... ewentualnie zrobic program tak, aby nie bylo problemu... nie wiem jak wyswietlasz dane, ale ogolnie powinna w programie byc petla, w ktorej sprawdzana jest pewna flaga, jesli jest ona ustawiona, to nastepuje wyswietlenie czegos tam na ekranie, jesli nie, to procek nic nie robi. w przerwaniu odbierasz...
w czym kolega to napisał? W języku C. To wychodzi bardzo mała procedurka. Fajnie by umieścić start dźwięków sywtemowych w przerwaniu - wówczas można by uzyskać takie dźwięki jak w sekwecerze Win wołane z poziomu aplikacji zboczem lub wpisaniem wartości do jakiegoś rejestru... A oto inny COBRA1 szlagier. 1093627 Czy można przerwanie INT odbierać z końcówki...
Jeżeli mogabym wtrącić się do dyskusji, to chciałabym zwrócić uwagę koledze KEN, aby zmienił algorytm w programie. Jak dobrze zrozumiałam, w obsłudze przerwania odbierane są całe pakiety (jako odpowiedzi na pytanie). Poprawan obsługa transmisji szeregowej powinna polegać na odbiorze jednego znaku i umieszczeniu go w jakimś buforze do interpretacji poza...
Dokładnie prawdopodobnie problem dotyczy przerwań. Ramkę odbieram w założonym czasie zliczania przez timer w przerwaniu. Założony czas wystarczy na całkowity odbiór ramki a jednak tak nie jest. Może ktoś miał ten sam problem. Dodatkowo założyłem odpowiednio priorytety przerwań, ale nic to nie pomogło.
To, kiedy jest generowane przerwanie i jakie, nie zależy od tego, jakie napiszesz procedury obsługi przerwań, a od tego, jakie przerwania włączysz w odpowiednim rejestrze. Do każdego włączonego przerwania musisz napisać procedurę jego obsługi. Jeśli włączasz TOIE - musisz mieć procedurę timerX_ovf_vect, jeśli włączasz OCIE1A - musisz mieć TIMER1_COMPA_vect....
zgadzam się z przedmówcą ,włącz przerwania i odbieraj dane w przerwaniach ,dodaj : UCSRB = _BV(RXEN) | _BV(TXEN) | _BV(RXCIE); oraz : ISR(USART_RXC_vect) //przy odebraniu znaku { bufor = UDR ; }
Nie sprawdzalem tego jeszcze na uC ale zalozenie mam takie, ze w przerwaniu odbieram znaki, skladam je w buforze i pozniej w glownej petli porownuje z "wzorcem komend" i np. ustawiam czas w zegarze lub budzik z poziomu PC if (!strncmp_P(string_buffer, PSTR("+CLK=?"),6)&... { // ustawianie zegarka }
Symulatora nie używam, gdyż nie wiem jak mam wprowadzać do niego transmisję z klawiatury PS2, za pomocą której uruchamiam różne fragmenty mojego programu. Rzeczywiście domyślam się że następuje interakcja przerwań z programem głównym. Przerwaniami odbieram PS2, Timer0 uruchamia 1600x/sek przerwanie zajmujące się odświeżaniem wyświetlacza i opcjonalnie...
To po prostu odbiór danych zrób na przerwaniach. Procesor odbiera dane,zapisuje je w buforze i sygnalizuje, że są nowe dane. Program główny jak ma czas sprawdza flagę nowe_dane i je obrabia.
Ad 1 - Właśnie tak - nie da się. Ad 2 - Zapewne tak. Jak wiesz, ja nie RTOSowy, ale ogólnie kiedy mam coś wysłać do hosta w oprogramowaniu device - zgłaszam przerwanie o tym samym priorytecie, co przerwanie USB i wysyłam (wołam jakieś tam Send) w tym przerwaniu właśnie. Podobnie w przerwaniach wołam procedurę Receive, która, jak wiadomo, nic nie odbiera,...
cześć potrzebuje napisać odbieranie danych z UARTa w uP(ARM LPC2142). znalazłem bardzo dużo przykładów konfiguracji UARTa i odbierania danych ale napisanych w C, a ja natomiast muszę to napisać w asemblerze no i odbieranie musi działać na przerwaniach. bardzo proszę o jakieś wskazówki jak to napisać, jeśli chodzi o UARTa to w miarę sie orientuje a problem...
To może zamiast wyłaczać przerwanie od timer1 trzebaby pomysleć od odblokowaniu niektórych przerwań w przerwaniu.
Używasz przerwania serial do odbierania? w bascomie? Mi to nigdy nie chciało działać. Zawsze jak tylko po właczeniu przerwania procek wchodził w obsługę przerwania i tak sobie tam biegał. Nie potrafię wyjaśnić czy to jest błąd bascoma czy może trzeba jeszcze coś ustawić. Ja zawsze robię krótkąpętle w której sprawdzam flage TI i jak coś przyjdzie to...
Daj coś, co pokaże jak rzeczywiście podłączyłeś to wszystko w całość (schemat, zdjęcie). W Slave pin SS ma być ustawiony jako wejście, no i wysyłaj cokolwiek w przerwaniu oprócz odbierania, taki to jest urok SPI...
A to co? USART1->SR &= ~USART_SR_RXNE; Zacznij od UARTa bez przerwań, kiedy uruchomisz echo - zabierz się za przerwania.
Tak na oko wydaje się być OK, skoro przerwania przychodzą to oznacza że odbiera pakiety. Na początek zmnień wartość Dcrval na &H48 i zobacz co się stanie. Dalej zmień wartość Imrval na &H1F (aby uaktywnić raportowanie o błędach). Następnie spróbuj odczytywać także wartosć rejestu RSR o adresie &H0C (tak jak RCR tylko do odczytu) i daj znać o efektach....
Ale odbieranie znaku, a analiza ramki to dwie inne rzeczy. W przerwaniu tylko odbierasz znaki i zapisujesz do buforu. A w pętli głównej co jeden obieg sprawdzasz czy w buforze są znaki. Jeżeli są to z kontekstu Maina wybierasz znaki z bufora i analizujesz i parsujesz. Potem uznajesz czy adres w ramce był dla tego urządzenia czy nie. A przerwanie jedynie...
Pytanie do Andrzej__S lepiej, zmienić wywołanie przerwania na stan niski, czy zostawić zbocze opadające ? Kolega snaap skorzystał z wyzwalania stanem niskim ze względu na to, że miał potrzebę wybudzania mikrokontrolera ze stanu uśpienia. Dodatkowo w obsłudze przerwania ustawiał tylko odpowiednią flagę, a resztę operacji wykonywał w głównej pętli programu....
Wyświetlanie: - inicjalizacja wyświetlacza 4 lub 8 bitów + procedura ustawiania kursora + procedura zapisu do wyąwietlacza itp Klawiatura: - procesor wyposażony jest w uart i łatwiej będzoie jego użyć. W tym celu potrzebna inicjalizacja prędkości i systemu przerwań. - w przerwaniach odbierasz znaki - potrzebny będzie parser realizujący funkcje jak kasuj...
No dobrze to jest rozwiązanie, jak najbardziej trzeba zmigrować do nowszej wersji. Ale zanim to się stanie chciałbym maksymalnie zabezpieczyć obecną sytuację. Może ktoś coś jeszcze podpowie. W chwili obecnej połączenie zostaje zerwane w różnych odstępach czasu. Błędy CPU które się pojawiają powodują przerwanie odbierania danych na kilka chwil ale jeden...
Czy ten zapis jest koniecznie potrzebny: USART1->SR=0x80;. Powinno działać bez ingerencji w rejestr SR w przerwaniu.
1) w przerwaniu odbierającym bajt lepiej wrzucić do do zmiennej albo buforka i opuścić przerwanie. Obsługę polecenia zrobić w pętli głównej. Tym bardziej że wysyłasz tam wiadomość - nie wiem czy nie powoduje to złej interakcji. 2) zamiast pwm1value = pwm1value+wiadomosc*10; powinno być pwm1value = 10*pwm1value+(wiadomosc-'0'); 3) najlepiej rozdzielić...
pewnie piszesz w bascom ,wiec masz kod odbierania danych (całych stringów ) w przerwaniu :) : Config Serialin = Buffered , Size = 20 do If Ischarwaiting() = 1 Then '1 - odebrano znak,0 - pusty bufor Call Read_rs232 End If loop Sub Read_rs232 Dim Bufor As String * 24 Input Bufor Noecho end sub
Aha, a jeśli w sekwencji transmitowanych danych może pojawić się 0xffaa, W czym problem w takiej sekwencji? Zamieni się ją na wartość 0xFA 0xAA 0xAA. Protokół Sensiriona transmituje wyniki pomiarów w postaci floatów, gdzie dozwolone są dowolne wartości i nie ma z niczym problemu. Po prostu jeżeli pojawi się wartość oznaczająca początek ramki jako dane...
(at)Freddie Chopin po pierwsze odbieranie po rs232 mam zrobione w przerwaniu więc odbieram. A po drugie czy to takie istotne ma moim etapie? Tak jak wcześniej wspomniałem wpinam się i podglądam co pojawia się na linii za pomoca przejściówki usb/rs232 którą wpinam do układu tak jak poniżej: http://obrazki.elektroda.pl/1606248600_1...
Witam, Mam problem z obsługą przerwania w mikrokontrolerze STM32l. Mam projekt postawiony na FreeRTOS'ie (jeśli ta informacja ma znaczenie). Otóż w przerwaniu odbieram z UARTA znaki odpowiedzi AT modemu: [syntax=c] void USART1_IRQHandler(void) { uint8_t ch = UsartGetChar(GSM_USART); rawCommandBuffer[rawCommandBufferCounter... = ch; rawCommandBufferCounter++;...
częstotliwość procka, szyny VPB oraz SPI opanowana. napisałem też PWM i jego wyjście puściłem na wejście zegara SPI0(slave) teraz chciałbym za pomocą przerwań obsługiwać odbieranie z SPI. jak do tej pory nie pisałem obsługi przerwań pod ARM i nie wiem za bardzo jak się za to zabrać. jeśli ktoś miałby jakiś przykładowy kod albo opis jak to uczynić to...
Po co wysyłasz poprzez polling a odbierasz w przerwaniu? Bez sensu to kompletnie.
Wysyłanie możesz dać w przerwaniu. Pasowało by jednak żeby ten drugi UART był szybszy od pierwszego aby nadążał z wysyłaniem. Inaczej może Ci przyblokować przerwanie. Przy równych prędkościach UARTów lepiej dać jakiś bufor i wysyłanie w programie głównym. Ale masz błąd w tym programie co zamieściłeś bo w jednym przerwaniu chcesz odebrać 2 znaki. A to...
Nie nie, właśnie chodzi o to, że program cały czas coś wysyła, bez przerwy. Tylko że zrobiłem to na przerwaniach tak, że wysyła kiedy pojawi sie przerwanie od TXRDY a odbiera przy przerwaniu RXRDY. Myślałem, że TXRDY jest ustawiane tylko kiedy ostatni znak zostanie odebrany i wtedy mozna wysłać nowy. Ale wygląda na to, że znaki sa nadpisywane bez odbierania....
Mam zwykłą 51ke z odpalonymi praktycznie wszystkimi przerwaniami, dodałem tam 1wire i wychodzi delikatny problem. Żeby jedno z drugim się nie gryzło na czas wysyłania lub odbierania bitu wyłączam przerwania. Pomiędzy odbieranymi/wysyłanymi bitami przerwania są włączone po to aby procesor mógł wrócić do ważniejszych zajęć. Nota DS18b20 mówi że czas pomiędzy...
Oczywiście, że delay będzie opóźniał pętlę loop. Akurat z Serial to nie ma znaczenia, bo to jest robione na przerwaniach w Arduino, nawet jak loop jest zablokowany to po odbiorze czegoś na uart robi to sprzętowo, odbiera bajt, przenosi do bufora i zgłasza przerwanie, zaczyna odbierać kolejny. W tym czasie funkcja obsługi przerwania odczytuje ten bajt...
Czy ktos uzywał CAN2 w STM32105? Czy CAN1 i CAN 2 to są pełnoprawne niezalezne CAN ? Próboje uruchomic oba interfejsy: CAN1 działa a CAN2 nie chce za nic ruszyc na tych samych procedurach (inne tylko piny i handlery obslugi przerwań)- nie odbiera równolegle danych z tej samej szyny co CAN1 odbiera.
Nie masz dostępu do zmiennej, czy po prostu odczyt zawsze zwraca tą samą wartość (efekt braku volatile przy deklarowaniu zmiennej używanej przez przerwanie)? Bez "volatile" kompilator zoptymalizuje odwołania do zmiennej "status" w funkcji main - zmienna nie jest nigdy odczytywana (kompilator nie uwzględnia tego, że może przyjść przerwanie - widzi tylko...
Dodajmy, że kiedfy pilot nie nadaje, odbiornik odbiera śmieci i wystawia na wyjściu przebieg prostokątny, któego zbocza są dużo gęstsze niż podczas odbioru danych, a każde zbiocze będzie w takim przypadku generowało przerwanie. Dlatrego lepiej jest odbierać w przerwaniu timera, a nie używać przerwań od zboczy.
To tego są przerwania. Generalnie ja nie lubię odbierania w pollingu.
Masz jakąś specyfikację tego modemu? Jeśli nie RTOS, to automat, czyli po "polsku" - "state machine" (maszyna stanów - brrr...). RTOS odpada. Jak widziałbys rozwiązanie tego typu przy pomocy maszyny stanów? Jaki mechanizm wykorzystać w tym przypadku by nie zatrzymywać main? Cykliczne przerwanie timera? Jak je powiązać z przerwaniem odbierania statusów....
Jeśli chodzi o to podciąganie do zasilania to nie wystarczy : GPIOA->PUPDR|=(1<<16)|(1<<... ? A przerwań używam do odbierania informacji ale tego nie pisałem bo ja nawet jeszcze nie wysyłam.
Witam! Robię transmisje na podczerwieni i mam problem z przerwaniem zewnętrznym . Chce z pomocą przerwań odbierać dane, ale narzazie mam tylko prosty program reagujący na jakąkolwiek zmianę na INT0 , INT1 , program oczywiście nie działa. Proszę o pomoc, oto kod : int main() { DDRA = 0x11111111; //mam diody na dwóch najstarszych bitach palące...
jeśli w przerwaniu odbieram tylko 1 bajt to mogą być duże problemy. Np odbiorę poprawnie bajt synchro w 1 przerwaniu. W 2 będę myslał, że teraz przyleci bajt 2 z np pozycją, a potem bajt 3 z nr serwa. A qC przy odbieraniu zachowa się tak : odbierze 3 bajty do bufora, okaże sie , że 3cim jjest bajt synchro (jakis tam błąd 0,2%...) odbiorę ten 3ci bajt...
Lecz nie potrafię wymodzić alternatywy dla odbioru danych i kożystam z przerwania RXNE: W przerwaniu masz odbieranie 3 bajtów i 3 pętle oczekiwania? ale on na odczycie wartości ze status register po prostu się zatrzymuje Jakbyś warunek pętli i jej ciało rozpisał w dwóch linijkach to byś się przekonał, że nic się nie zatrzymuje (zakładam, że używasz...
Podczas odbioru danych z pinu PD2 ( funkcja zgłoszenie ) występuje błąd tylko wtedy gdy przerwanie z timera 0 jest aktywne. Gdy na czas odbioru danych zablokuję to przerwanie procesor ładnie odbiera wysyłane do niego dane. I moje pytanie brzmi: Co jest nie tak z przerwaniem? Konkretnie to, co wskazał albertb: ... jeśli masz włączone przerwanie to jego...
Pod koniec obsługi przerwania timera startuj ADC, a wynik odbieraj na początku procedury obsługi przerwania timera, czyli w następnym przerwaniu. No i przypadkiem nie używaj równocześnie przerwania timera i ADC - pożytku żadnego, a kłopoty mogą być.
Ja tam nie wiem, ale jakoś podejrzanie wygląda, że jest włączone przerwanie odbioru danych UART (a handlera ani widu) a nie ma włączonego przerwania końca odbioru DMA.
Przede wszystkim masz błędną koncepcję obsługi UART - przenieś to na przerwania. Tak jak masz to teraz, z delay w pętli głównej to będzie działać tylko przez przypadek i okresowo. Po drugie, jeśli w funkcji odbioru znaku czekasz w nieskończoność na jakiś stan to nic dziwnego, że ci to blokuje pętlę główną. Moja rada - podepnij rxd pod pin z przerwaniem,...
Wysyłasz znaki z bufora innego, niż ten, do którego odbierałeś - przyjrzyj się operacjom na zmiennej nr_buf. Ile masz ostrzeżeń kompilatora?
I nie będzie można odbierać w przerwaniu. Sam niedawno miałem problem i skończyło się na kilku procesorach połączonych po SPI.
Co do przerwań, powinny być jak najkrótsze. W przerwaniu np. odbierasz dane, wsadzasz do bufora i aktywujesz flagę, że dane są, a program główny sprawdza flagę i w razie potrzeby obsługuje dane. Napisałbym to trochę inaczej - w systemie to raczej wsadza się dane do bufora i budzi się wątek/proces czekający na te dane.
Czy w obsłudze przerwania wyłączasz globalna obsługę przerwań do czasu zakończenia obsługi przerwania ?
0,000000069s - 1/14,475MHz - czas jednej instrukcji procesora 0,000086806s - (1/115200) *10 - najkrótsza ramka(8 bitów danych + start + stop) - co taki okres może przyjść przerwanie od portu szeregowego. Jak widać czasu jest dość(ponad 1000 instrukcji na przerwanie) pytanie co jeszcze robi procesor. Jak odbierasz impulsy z enkodera?
Jeszcze zajmę zdanie w kwestii przerwania od UART. Mimo wszystko lepiej obsługę UART zostawić przerwaniom generowanym przez SBUF. Przecież mimo że adres odwołania do przerwania jest ten sam to masz przecież flagi TI, RI, które sprawdzasz w przerwaniu i albo odbierasz bajt albo zapisujesz następny do SBUF. Nic trudnego a ile oszczędności i mniej zachodu
Teraz to odbiór na przerwaniach i bufory cykliczne - to załatwi wszystko.
dzięki za pomoc. Żeby mikroprocesor odbierający nie musiał długo oczekiwać na dane, zrobiłem tak, ze uC nadający wywołuje przerwanie w programie uC odbierającego, po czym nadaje (printbin). Natomiast uC odbierający w programie obsługującym przerwanie odbiera dane (inputbin). Dzięki za podpowiedzi
Możesz użyć Inkey. Tylko funkcja ta ma taką cechę że nawet jak nic nie ma w UDR to zwraca 0. Także najlepiej zrób to w ten sposób że najpierw sprawdzasz czy jest znak (Ischarwaiting) a potem jeśli jest, to odbierasz Inkeyem. Można też zrobić to w przerwaniu. Jeśli początek odbieranego tekstu masz stały to można też zrobić pętlę w któej ciągle pytasz...
Odbiór z RS nie mam na przerwaniach, jak za każdym razem jak odbieram znak mieć przerwanie to chyba trochę bez sensu Dlaczego bez sensu?
A jakiej porady oczekujesz na problem w postaci próbuje, nie wychodzi mi? Może wskazania co robię źle? Dodano po 4 200 linii kodu by uruchomić UART1. Aż chce się to czytać. Bawisz się nimi i nie wiadomo o co tam chodzi. Jeden uart przerwaniowy 2 kierunkowy, drugi przerwanie od jednego kierunku. Tylko jedno przerwanie w NVICu wlączone. Burdel. ot co...
odbieranie smsów odbieranie faksów odbieranie polsat
instrukcja centrali paradox vectra błędy komputera bezpiecznik wycieraczka tylny
Jak podłączyć grzałkę 400V w instalacji trójfazowej? Kod błędu EC na płycie indukcyjnej Amica - przyczyny i rozwiązania