Ten sposób to tryb LinkedList w DMA. Opisujesz listę buforów, które DMA ma wysłać do wybranego interfejsu. Element listy pokazuje na następny bufor, który mechanizm DMA sam sobie wczyta i przygotuje do następnego transferu. Ostatni element listy niech pokazuje pierwszy i masz bufor kołowy... U mnie na SAM3U4(at)96MHz (CM3) transfer 4MBit/s po SSC działa...
Bufor cykliczny trzeba zorganizować na RS232 oraz wysyłanie na przerwaniach i po kłopocie.
Z poolingiem to ty tego dobrze nigdy nie zrobisz :( konieczne wydaje się użycie przerwań i buforów cyklicznych. Chyba że coś źle zrozumiałem. Więc jak możesz pisać że wykorzystujesz pooling i program ci się nigdzie nie zatrzymuje - to niestety jest sprzeczne zdanie.
-blokowanie przerwania następuje tylko w momencie kiedy pętla while czeka na zwolnienie bufora, czy się myle? Przerwań nie blokuje się w żaden sposób, żadnym while-m. co do bufora cyklinego to jego zasada działania z tego co czytałem polega na tym, że dane zmieniają swoją pozycje, w związku z tym nie będę mógł później wykorzystać w programie konkretnej,...
Charakterystyczną właściwością bufora cyklicznego (kolejki FIFO) jest to, że wskaźniki początku i końca (odczytu i zapełniania) przemieszczają się niezależnie - każdy w swoim tempie. Stąd w Twoim programie indeksy powinny być niezależnymi zmiennymi globalnymi/statycznymi. Przypisanie liczniku=usartbufferlicznik zakłóciłoby normalny tryb pracy bufora...
Mógłbym jeszcze prosić o podpowiedź odnośnie wykrycia ciągu znaków, pojawiającego się na uarcie? :) Tak, zastosuj bufor cykliczny do odbioru, a później w przerwaniu badaj wystąpienie albo ilość wystąpień znaku 0x0d czyli (ENTER) .... wtedy będziesz wiedział ile przyleciało stringów do bufora i kiedy można je w całości ładnie odczytać.
Procek ustawicznie się resetuje. Wyrzuć funkcje PWM_init i Timer1_init Attiny4313 ma tylko 256B RAM, wiec na pewno trzeba zmniejszyć wielkość buforów kołowych, a może nawet w ogóle zrezygnować z buforowanego UART. Pytanie czy w pozostałym kodzie nie ma czegoś pamięciożernego i nie następuje przepełnienie stosu.
W opisie do VDSP++ (dla procków BlackFin) jest napisane jak należy programować w C, aby kompilator wykorzystywał sprzęt DSP. Są tam przykłady jak organizowac pętle, mnożenia itp, a jak tego nie robić. Chociaż moim zdaniem i tak pełną kontrolę daje dopiero assembler.
Witam, próbuję zaprogramować mikrokontroler,aby obsługiwał USART do komunikacji przez RS232. Chcę wykorzystać do tego bufor cykliczny, który zaimplementowałem w następujący sposób: [syntax=c] #include <inttypes.h> #define BUFFER_SIZE 32 #define BUFFER_MASK ( BUFFER_SIZE - 1) typedef struct { uint8_t buffer[BUFFER_SIZE]; uint8_t head; uint8_t tail;...
Szukaj pod hasłem "ring buffer". Bufor cykliczny operuje na bajtach. A mnie interesuje bufor bitowy z jednoczesnym przesuwaniem tychże bitów. Spójrz na kody, które podesłałem. Rozumiem, że można stworzyć w ten sposób bufor cykliczny bitowy, ze wskaźnikiem bitu, ale to chyba będzie mistrzostwo nieefektywności.
Czyli Twój pseudokod to jest taka jakby kolejka FIFO? No niezupełnie. To co przedstawiłem buffer_is_empty() zwracająca prawdę lub fałsz) należy sobie dopisać. Sprawa jest dosyć prosta np. w przypadku USART. Wystarczy dodać bajt do bufora, później - jeśli bufor nie jest pusty - pobrać bajt i wysłać. W przypadku I2C sprawa jest o tyle skomplikowana,...
Bufor cykliczny, inaczej też nazywany kołowym, to najlepsze rozwiązanie do tego co chcesz zrobić. Tym bardziej, że jak zaznaczyłeś danych będzie sporo. Każdy odebrany znak wpisujesz do bufora i przesuwasz wskaźnik zapisu o 1. Możesz to robić przez obsługę przerwania od portu szeregowego, albo możesz do tego wykorzystać DMA. Dlaczego bufor? Ponieważ...
Scrolla można by zrobić w oparciu o bufor cykliczny. Co prawda nie mam arduino z wyświetlaczem więc pozwoliłem sobie go zasymulować w terminalu w oparciu o kody ANSII https://filmy.elektroda.pl/48_1667431218...
Witam, mam problem z buforem cyklicznym, nie bardzo wiem jak się za to zabrać :(. Używam Nut/Os do otwarcia strumienia danych z gniazda TCP. I strumień ten muszę zacząć buforować i tu jest problem bo za bardzo nie wiem jak :(. Proszę o wszelki sugestie.
To wszystko nie tak. Obsługuj ADC w funkcji obsługi przerwania od ADC. Przed wejściem do pętli głównej skonfiguruj ADC, włącz zezwolenie na przerwanie i wystartuj pierwszy pomiar, ew. startuj pomiar cyklicznie (z timera), ale nic poza tym. Skoro przerwanie jest włączone i wchodzisz w jego obsługę, to znaczy że na 100% konwersja się zakończyła i masz...
Witam ponownie. Po pierwsze: [syntax=c]while(1) { UART_RX_STR_EVENT( uart_buf );// zdarzenie odbiorcze UART //_delay_ms(500); - TO WYWAL KONIECZNIE !!!!! //LED_TOG; }//while[/syntax] Bo jeśli następny string przyjdzie szybciej, niż skończy się ten delay, to możesz go utracić !!! ( Zwróć uwagę, że przeglądarka wysyła w odpowiedzi więcej, niż rozmiar...
Moim zdaniem konfiguracja DMA jest trochę niepełna, a ponadto brakuje obsługi przerwania od DMA. Przynajmniej w jednym miejscu wpisz jawnie wartość do rejestru sterującego (CR = ...). Na razie wszędzie masz |= lub &=. Zakładając, że pierwszy transfer poleci i przerzucisz 19200 słów, to później DMA się zatrzyma i nic więcej nie prześle. I jak to ma coś...
Bufor cykliczny - tablica o długości N bajtów. Dwa wskażniki na elementy tegoż. Pierwszy wskażnik do odczytu (wo), drugi do zapisu (wz). Początkowo oba wskażniki ustawione na początek bufora. Zapis: Procedura przerwania po każdym odebranym bajcie zapisuje go w miejscu wskazanym przez wz. Następnie wz jest inkrementowany i jeżeli wskazuje na element...
Logi są w RAMie w buforze cyklicznym o stałym rozmiarze. Czyszczone po każdym restarcie.
Jeśli pobierasz dane z bufora cyklicznego, a do przetworzenia potrzebujesz mieć je w liniowym, to potrzebne są dwa indeksy: jeden do pobierania danych, drugi do ich wpisywania. Na ogół ich wartości nie są równe, więc to powinny być odrębne zmienne. Przy pobieraniu znaku z bufora cyklicznego wypada: (1) sprawdzać, czy indeks nie doszedł do końca bufora,...
Zrobiłem taki termometr na tych najtańszych modułach i tak jak pisze poprzednik jest tam rozbiegówka do synchro, na przykład ciąg 01010101 (0x55) i 10101010 (0xAA). Do tego on obsługuje ID dla kilku termometrów zewnętrznych. Przesyła też dane o napięciu baterii... Ma bufor cykliczny po to by się lepiej synchronizować. Zrobiłem go dawno temu bo w 2017...
Chciałbym jeszcze coś dodać, bo moim zdaniem zapotrzebowanie na RAM to nie jedyny problem w przypadku zagnieżdżania przerwań. Nie znamy programu, więc trudno przewidzieć, czy sprawa dotyczy tego konkretnego przypadku. W przypadku zagnieżdżania przerwań należy jednak pamiętać o pewnych zasadach. Procedury obsługi przerwań, które ustawiają globalną flagę...
To czy i w jakim stopniu RAM mikrokontrolera pośredniczy w wymianie danych z LCD zależy od programu/bibliotek do LCD. Można operować bezpośrednio na pamieci wyświetlacza, jak również na buforze w pamięci RAM mikrokontrolera i ten bufor cyklicznie albo po modyfikacji przesyłać do LCD. ATMega32 powinna spokojnie wystarczyć do operacji bezpośrednio na...
Pamięć DL to bufor cykliczny. Sukcesywnie wpisujesz tam rozkazy, które na bieżąco są wykonywane.
Pozostaje problem tych zakłóceń na AY3 kiedy są przerwania, ale to chyba będzie temat dekodera adresów i taki dekoder na GAL Czy te zakłócenia są też na emulatorze? Nie wiem, co jest ich przyczyną, ale jeżeli przyczyną jest wywołanie przerwania akurat w chwili wysterowania AY i przez to AY jest źle wysterowane, to myślę, że przed znalezieniem sprzętowego...
W książce jest to opisane. Bufor cykliczny.
Zrobilem cos podobnego, tyle ze zapis na karcie SD. Generalnie problem jest dosc prosty, tylko musisz zrobic bufor (np cykliczny) do odbioru znakow z uarta, bo bedziesz gubic dane. Mozesz zrobic tak, ze odbierasz np 30 znakow i dopiero cala paczke zapisujesz w eepromie, w tym czasie inne znaki sa zapisywane w buforze. Dlugosc bufora musisz tak dobrac...
odtwarzanie z dysku wcale nie jest smutne ,natomiast komfortowe, nie ma szumów wirującego napędu i po mojemu nie zużywa sie tak bardzo dvd rom poprzez cykliczne napełnianie bufora
Bufor cykliczny o nieco zmodyfikowanej funkcjonalności: - Nowy element można dodać zawsze; jeśli bufor jest pełny, zamazujemy najstarszy. - Oddzielone funkcje odczytu n elementów i usuwania z bufora - czytamy nie usuwając, następnie usuwamy oddzielnym wywołaniem. Tu trzeba uważać na synchronizację, bo nie będzie dobrze, jeśli pomiędzy odczytem i usunięciem...
janbernat : ale jaki jest problem z volatile ? register to jest raczej sugestia dla kompilatora. Niemożliwe jest obligatoryjne trzymanie zmiennej w rejestrze. Dlaczego najgorzej jest z interrupt ? Naczytał się kolega stek bzdur i teraz zdaje się mieć wątpliwości co do sensu programowania w C. Zapewniam, że nie jest tak źle. Co do kolejki/buforu cyklicznego/innych...
W moim przypadku to wygląda tak, że mam wypracowaną własną warstwę abstrakcji sprzętu. Przykładowo do SPI jest maszyna stanów co mieli strumień bajtów danych + nagłówek z kolejek (typu FIFO jako bufor cykliczny). Pod to callbacki do sprzętu (open, write, read, close, ioctl), i rybka czy w środku jest if (queue) wyslij czy na przerwaniach. Nagłówek zawiera...
(at)ElektrodaBot Robię algorytm bufora cyklicznego i jedna rzecz nie jest dla mnie oczywista. Pamięć EEPROM (model AT24C128) obsługuje zapis jednego bajta, całej strony jak i dowolnej liczby bajtów mniejszej od rozmiaru strony. Czy jeżeli zrobię zapis 2 bajtów na środku 64-bajtowej strony, to czy pozostałe 62 bajty zostaną "przepisane", a więc ich żywotność...
Czy jest mowa o implementacji buforu cyklicznego.
Czy ktoś ma jakiś pomysł?? Tak ja mam pomysł - zrobić transmisję UART tak jak się należy czyli z wykorzystaniem buforów cyklicznych zamiast analizą wszystkiego w przerwaniu - co owocuje tylko samymi problemami jak widzisz. Czytałeś kiedyś gdzieś o buforach cyklicznych do obsługi UART'a. Przerwanie tylko napełnia te bufory, a z poziomu programu pięknie...
Program jest mojego pomysłu i autorstwa.Sterownik zbiera dane co 20 minut w buforze w pamieci ram.Jest stworzony bufor cykliczny obejmujący 24h. czyli 72 pomiary. Programem mogę pobierać dane kiedy chce i dodatkowo zapisywać do archiwum w komputerze a potem można sobie przejrzeć i porównać. Generalnie jeszcze robię drobne poprawki a jak będzie wszystko...
Dziękuję wszystkim za odpowiedzi! Finalnie problem rozwiązałem poprzez pobieranie w pętli głównej pojedynczych znaków z bufora cyklicznego zamiast próbować zrzucić cały bufor za jednym razem. Rozwiązanie działa, więc spełnia swoje zadanie :) Co od obsługi wyswietlania na LCD w przerwaniu - tutaj fakt, moje przeoczenie, zamierzenie było takie, żeby ta...
mam jeszcze w buforze cyklicznym od uart ale było 18B i testowałem na 512 bo myślałem, że tutaj gdzieś gubi i aktualnie ustawiłem na 32B buforu USART
Dziękuje Panowie za pomoc. Jednak odechciało mi się z tym męczyć, zrobiłem to na przerwaniach wraz z buforem cyklicznym - wszystko pięknie działa. Zamykam. Dar.El
[syntax=c]void uart_putc( char data ) { // definiujemy funkcję dodającą jeden bajtdoz bufora cyklicznego uint8_t tmp_head; tmp_head = (UART_TxHead + 1) & UART_TX_BUF_MASK; while ( tmp_head == UART_TxTail ){} // pętla oczekuje jeżeli brak miejsca w buforze cyklicznym na kolejne znaki UART_TxBuf[tmp_head] = data; UART_TxHead = tmp_head; UCSR3B |=...
Nie lepiej 2 liczniki/wskaźniki? Jeden do odczytu, drugi do zapisu? Taką strukturę nazywa się buforem cyklicznym. Pozdrawiam, Dr.Vee
Chciałbym tylko nieśmiało zauważyć, że ten programowy arbiter plus obsługa DMA - to więcej kodu niż obsługa transmisji na przerwaniach z buforem cyklicznym bez DMA. ;)
Zastosuj ring buffer, a do kontroli poprawnosci mozesz tylko uzyc zewnetrznych linii (jesli chodzi o oprawnosci na linii a-bufor i b-bufor). W dziale AVr masz faw i tam jest moj temat gdzie dalem implementacje bufora cyklicznego.
Może trochę późno ... Może mi się tylko wydaje, ale chyba używam właśnie bufora cyklicznego. Odczyt i zapis ze sobą nie kolidują, ale zapis i zapis już tak.
Zastanawia mnie np. taka kwestia: w jaki sposób prawidłowo rozwiązuje się problem komunikacji UART z peryferyjną elektroniką? Nie mam markera końca nadawania a max. czas odpowiedzi nie jest określony dla każdej z komend. Jedyne co mi przychodzi do głowy to właśnie jakiś timeout od ostatniego odebranego znaku lub parsowanie zawartości bufora cyklicznego...
Przede wszystkim "wyciszacz" musi dostać ten dźwięk, który ma być wyciszony. w takim czasie, żeby mógł trafić z wyciszaniem - jeśli to ma być program (aplikacja), to może potrzebować sporo czasu na przetworzenie dźwięku (to zależy od techniki, np. od sterowników) - jeśli mikrofon jest np. o 1m bliżej źródła dźwięku, niż słuchacz, to na przetwarzanie...
Całkowanie przeprowadzasz na skończonej ilości próbek. Tworzysz po prostu bufor cykliczny rzędu "n", z którego pobierasz próbki do całkowania. Jest to nic innego jak cyfrowy, dolnoprzepustowy filtr typu FIR.
Tak, w wyżej wymienionej książce autor użył bufora cyklicznego. To co w takim razie ma zwracać funkcja? w jaki sposób odebrać na przykład jakiś wyraz?
Twoim podstawowym błędem jest to że ciągle czyścisz ekran. Ta operacja zajmuje prawie 2 ms Nie wiem po co to robisz ? Wystarczy zdefiniować bufor w który bedziesz wpisywać swoje wyniki i ten bufor cyklicznie wyświetlać ale tylko wtedy kiedy to będzie konieczne czyli w zależności od ustwienia ew. flag sygnalizujących np. zmianę czasu. Inna sprawa czy...
Przecież to nie działa. W przerwaniu timera wpychasz kolejno do UDR kilka danych nie sprawdzając, czy można to zrobić. Jeśli chcesz nadawać w przerwaniu timera, to musisz mieć przerwanie UART i (zapewne) bufor cykliczny.
Wystarczy policzyć. 19200 bps = 1920 znaków na sekundę, czyli znak co ~0,5 ms. Przy taktowaniu 4MHz masz +/- 2080 cykli procesora pomiędzy przerwaniami od UARTa, czyli duuużo czasu na wykonywanie instrukcji w pętli głównej. Na Twoim miejscu skupiłbym się na przetwarzaniu tekstu np. linia po linii - przerwanie wypełnia bufor, a po wykryciu sekwencji...
Te układy wymagają trochę więcej obsługi niż wysłąnie bajtu, ale całą tą obsługę załatwia za ciebie biblioteka, w tym bufor cykliczny(jeśli dobrze pamiętam). Ale większość tych układów jest na 3.3V Na pączątek, spróbowałbym wypuścić sinusa z głośnika
Jeśli chodzi o oszczędność czasu, to najlepiej wykorzystać przerwania. Dane wrzucamy z pełną prędkością do bufora cyklicznego (FIFO), a procedura obsługi przerwania SPI pobiera sobie z niego kolejne bajty do SPDR. Podobnie jak w poprzednim przypadku pierwszy bajt musimy wysłać "z wolnej ręki" badając ewentualnie flagę gotowości.
pomoge odgrzac kotleta :) dlatego najlepiej zawsze wykorzystywać system przerwań USART aby spokojnie i bez przeszkód wyrabiać się z operacjami odbioru - a do tego można wtedy zastosować własny bufor cykliczny - odbiorczy i wtedy wszystko działa - miodzio ;) Staram sie napisac program z analiza przewidzianych potwierdzen i nie przewidzanych zdarzen w...
W przypadku ramki transmitującej pojedynczy pomiar, wystarczy jeden bufor cykliczny na dane oraz ewentualna opcja powtarzania pojedynczej ramki (jeśli chcemy pilnować danych). Płacimy za to większym obciążeniem kanału, ale przy proponowanych parametrach spokojnie się mieścimy.
w JAKIM terminalu? Może liczbę wysyłasz jako 3 znaki? No skoro sam nie jesteś pewny i piszesz chyba to warto zacząć od tego sprawdzanie. Poza tym trochę dziwne jest to odbieranie "ramki" w przerwaniu - zastosuj jakiś normalny bufor cykliczny...
Z przerwaniami chodzi o to, że przy kopiowaniu nie blokujesz w ogóle procesora pętlą while, tylko robisz sobie coś innego i czekasz na przerwanie, żeby obsłużyć zdarzenie końca kopiowania bufora. Co do kopiowania tylko raz - wtedy w takim przerwaniu blokujesz kanał, a jak chcesz kopiować znowu, to gdzieś go sobie odblokowujesz. DMA nie kasuje rejestrów...
gubisz waść próbki gdzieś Nie gdzieś tylko w tych dwóch kodach, i to bardzo mocno gubisz ..... A dlaczego? No nie dziwne, żadnego śladu buforowania. 1. robisz bufor cykliczny (FIFO) 2. do bufora odbierasz dane przez RS232 na przerwaniach 3. z bufora (FIFO) odczytujesz w przerwaniu timera o zadanej częstotliwości próbkowania dane to wystarczy.
Nie uważasz przecież chyba, że da się zrobić wydajny i szybki kod realizujący kilka skomplikowanych funkcji przy użyciu 10-ciu linijek kodu, no nie? Poza tym wg mnie taka idea ("nadganianie" DMA w buforze cyklicznym) nie kosztuje nic więcej kodu niż normalna obsługa przerwania, za to ile mniej czasu... 4\/3!!
Udało mi się to teraz zrobić tak jak koledzy doradzają. Mam jeszcze pytanie jak sie będzie zachowywał uP w przypadku gdy będę chciał użyć bufora cyklicznego podczas przerwania wywoływanego np zboczem narastającym. Wydaję mi się że przerwanie od USARTA kłóci się z przerwaniem od zbocza narastającego, ponieważ nie chce działać poprawnie.
Coś czuje że częściej będzie to pisanie kodu "magicznego", czyli np. "jaka totalnie niezrozumiała operacja może zastąpić dzielenie" albo "jak użyć 8-bitowej liczby choć potrzebujemy 32-bitowej". Nie widzę w tym problemu, jeżeli zamkniemy tę magiczną operację w bibliotece/ funkcji/makro. Widziałem też magiczne kody w drugą stronę. Typu : jak w bajtowym...
Jeśli nie będziesz używać DMA, a zapewne nie będziesz;), to miejsce w pamięci powinno Cię guzik obchodzić. Potrzebujesz bufora cyklicznego, możesz wzorować się na moim rozwiązaniu http://www.elektroda.pl/rtvforum/topic13... Potem dane z bufora możesz przerzucić do innej tablicy i z niej pobierać dane do peryferii, bądź bezpośrednio z bufora.
[url=http://8052.com/codelib/files/efdUa... UARTa z buforami cyklicznymi - projekt ze strony 8052.com - sam nie używałem, ale możesz sprawdzić. Kod podobny do tego, który pokazałeś, ale na oko dużo lepiej dopracowany ;) Na początek zacznij od pollingu, bez przerwań, nie uruchamiaj wszystkiego na raz. Poza tym w keilu masz przecież świetny...
Pierwsze i tragiczne to co robisz źle - to w przerwaniu nie dość że wwaliłeś obsługę wyświetlacza LCD to jeszcze jakieś delay'e po 500ms ! - to już jakby masakra niestety :( poczytaj sobie coś na temat na razie obsługi zwykłego RS'a i do tego buforów cyklicznych na przerwaniach - zarówno dla nadawania jak i odbioru. Bo z taką próbą obsługi daleko nie...
Ulepszyłbym o tyle, że skoro wykorzystujesz soft posiadający bufor cykliczny, to zamiast tak jak napisałeś blokującej obsługi USART, zmieniłbym kod tak, żeby odbierał w przerwaniach kolejne znaki i po natrafieniu na CR/LF sygnaizował, że do sparsowania jest cały wiersz. W ten sposób odblokowujesz pętlę główną. Oczywiście warto też zrobić tak, żeby przerwa...
Nie wyświetlać, nie liczyć CRC i nie nadawać ciągu bajtów przez UART w obsłudze przerwania Rx UART. Tzn, CRC ew. można liczyć, ale po każdym bajcie. Wyświetlać nie można wcale, a nadawać można jeśli użyjesz przerwania Tx i bufora cyklicznego na dane, a w przerwaniu Rx będziesz je tylko wstawiał do bufora,
A obsługa bufora nie idzie w krzaczki ? Nie widzę porównywania z UART[01]_RX_BUF_SIZE/UART[01]_TX_BUF_SIZ... a jak rozumiem ma być to bufor cykliczny, czyli Tail(Ogon) goni Head(Głowa), pod koniec bufora wskakując znów na jego początek. Osobiście używam tylko "głowy" i licznika znaków w buforze. Ten delay 1s uważam za zbędny, lepiej uwarunkować odsyłanie...
Dobrze. Da się inaczej. Wersja łatwa: Tablicę (string) zrobić globalną i sprawdzać czy poprzednia transmisja została zakończona przed wysłaniem. Wtedy wywołanie dbguPrintf() zakończy się od razu, za to oczekiwanie nastąpi przy kolejnej okazji, ale czasu procesora zmarnuje się mniej, bo w trakcie transmisji będzie mógł coś robić. Wersja trudniejsza:...
Przemyślenia wymaga metodologia pomiaru. To się zgadza, ale czy : w buforze cyklicznym musimy mieć 4000 ostatnio odczytanych. Rany, jak będę mierzył prądy i napięcia 3 fazowe zużyję prawie 100kB RAM na same bufory Autor powinien podać założenia pomiaru. Bo w najprostszym przypadku spełniającym podane (sinus) to mierzymy wartość maksymalną i skalujemy....
Doceniam ideę mostka USB<->I2C ale argumentacja mnie totalnie zabiła. "UART stwarza problemy".. chyba gdy nie umie się zarządzać przerwaniami, bo poprawnie działające systemy z UARTami chodzącymi dobrze powyżej 115.2 kbps są dosyć często spotykane, miniaturowe FIFO w UART jest potrzebne tylko do wyjęcia bajtu w przerwaniu i przeładowaniu do bufora...
Mam problem z przesyłaniem danych między atemga a pc przez port rs232. Chce wysłać pakiet danych najczęściej składający się z 5 par liczb oddzielonych spacjami (np. 02 01 12 21 11). Próbowałem z różnymi prędkościami i nigdy nie uda się wysłać danych żeby nie zgubił przynajmniej jednego znaku. Wysyłanie danych robię w ten sposób: [syntax=c] dane[i]=0;...
Bufor cykliczny. Gotowy kod masz tutaj: http://www.elektroda.pl/rtvforum/topic13... Jesli zalozysz ze nigdzie zaden pakiet nie zginie i inne idealne warunki, mozesz w przerwaniu skladac dwa bajty do jednej zmiennej. Ale wystarczy ze stracisz jeden bajt i bedziesz laczyc drugi bajt poprzedniej ramki z pierwszym kolejnej.
Absolutnie i zdecydowanie będzie ci to wszystko pięknie działało i to bez mrugnięcia oka czy serwa , i to bez żadnych układów DMA, bez żadnych sztuczek cyrkowych jeśli chodzi o pisanie takiego programu. Po prostu będzie działało - tylko trzeba zrobić podstawową i prostą obsługę RS232 (nadawanie i odbieranie) na przerwaniach ale z użyciem buforów cyklicznych....
Nie musisz wywoływać ponownie, ponieważ w pętli sprawdzasz ten sam bufor pamięci, który jest wypełniany podczas przerwania. Ważne jest, aby bufor zadeklarowany był z modyfikatorem volatile, np. volatile uint8_t bufor[50];
Niezbyt to przemyślane. To nie może brzmieć dobrze. Odtwarzanie walnij do jakiegoś przerwania a odczyt niech sobie siedzi w programie głównym. Wtedy odczyty nie będą wprowadzamy ogromnego Jittera do sygnału. Dajesz bufor powiedzmy 512B. Robisz odczyt bufora i włączasz przerwanie. Przerwanie co raz odczytuje jedną próbkę i zmniejsza wskaźnik pozycji...
Mr_T_ -> ja z kolei zrobiłem z powodzeniem na ATtiny2313 obsługę RS232 a nawet RS485 i to w pełni z użyciem przerwań i buforem cyklicznym dla nadawania i odbioru - dzięki czemu wysyłanie czy odbieranie już z poziomu własnej aplikacji sprowadzało się tylko do wpisania czegoś do bufora lub odczytu stamtąd po sygnalizacji odpowiednim przerwaniem. Wszystko...
Zdecyduj się, co ma być podłączone do wejść. Jeśli logika, to użyj mojego programu i wywal delay_us(). Jeśli przyciski, to najpierw musisz przeprowadzić eliminację wpływu drgań styków, sprzętowo lub programowo. Programowo odczytujesz stany przycisków co kilka ms i sprawdzasz - jeśli najstarszy wynik jest różny od wszystkich późniejszych, to wykryłeś...
Zawsze duże wrażenie robi na mnie optymizm tych, którzy *wiedzą*, ile dokładnie bajtów odbiorą po UART. życzę sukcesów w idealnym świecie. No moje oko szanse, że to będzie działać poprawnie , są bliskie zeru. Moim zdaniem odbiór przez DMA sensu nie ma. Istnieją opublikowane rozwiązania z buforem cyklicznym i DMA, których niektórzy Koledzy z forum używają...
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....
Lepiej jest ustawić flagę iż ramka cała i do interpretacji a głównej pętli podejmować odpowiednią akcje. pewnie, że tak - no ale od tego to już tylko maleńki kroczek żeby zrobić po prostu odbiór do bufora cyklicznego w przerwaniu i tylko to. A odbieranie ramek już w dowolny sposób i widzi-mi-się ładnie z bufora - co będzie miało przy okazji mnóstwo...
Taka mała propozycja, odnośnie tych wszystkich problemów z czasem wykonania komend: zrób sobie bufor, który będzie odbierał dane z magistrali. Jedne komendy wykonują się krócej, inne dłużej, te szybsze będą nadganiać stracony czas. Bit zajętości ustawiaj dopiero wtedy, gdy masz już pełny bufor. Też ostatnio robiłem sterownik wyświetlacza (ale tekstowego)...
Pamiętaj, że funkcja _firFilterPut() implementuje bufor cykliczny. Wewnątrz struktury filtra zawsze będzie przechowywanych 'order' próbek. Ogólne użycie dla filtra 3 rzędu (pseudokod): _firFilterPut(ADC) _firFilterPut(ADC) _firFilterPut(ADC) for (i = 1..n) filteredsample usage: b = fir1(n, w Przeanalizuj działanie kodu i wypożycz z biblioteki jakąś...
0. Jeżeli słyszysz nie więcej niż 1s dźwięku, to program działa ok. Najpierw otwierasz plik, odczytujesz 31600 bajtów i zamykasz plik. Nic więcej nie odczytasz. Następnie przesyłasz dane do dekodera w paczkach po 32 bajty. Jeżeli masz bitrate rzędu 256kbit/s, to masz tam ~964ms dźwięku. Inna sprawa czy słyszysz ten fragment zapętlony, czy tylko raz...
Myślałem nad buforem cyklicznym.. Ale max rozmiar to ok 1024bajtów(na wiecej nie mam miejsca), więc i on niewiele pomoże w porównaniu do przesłania 130KB.. Tak czy owak i tak musiałbym wiedzieć co ile przychodzi kolejny bajt z RSA gdy np body są ustawione na 9600. Czy ktoś ma w ogóle pomysł jak to policzyć? Mogę ustawić timer w uC i włączyć przy pierwszym...
Coś Ci do końca z tym rysunkiem B nie wyszło ;) Ale obstawiał bym właśnie na niego.
Przejście na DMA uprości Ci komunikację i program. masz bufor cykliczny. DMA używasz po to aby za Ciebie wpisywał lub wyczytywał dane z rejestru UART. Po co robić to ręcznie. Lepiej skupić się na analizie danych. Zakładam że odbiór masz w przerwaniu. Zrób prosty bufor cykliczny o wielkości 256 bytes. GSM_communication.counter_RX - będzie bajtowy. Drugi...
Echo i pogłos na DSP to akurat pikuś. Wystarczy zrobić bufor cykliczny, który będzie działał jak linia opóźniająca. Echo realizujesz mieszając sygnał podstawowy z opóźnionym. Pogłos realizujesz mieszając sygnał podstawowy z sygnałem pobranym z różnych części linii opóźniającej i dodatkowo wprowadzając sprzężenie zwrotne (sygnał z wyjścia podajesz na...
Moduł mam uniwersalny, nie używając kontroli przepływu DMA pracuje w trybie circular na jednej wielkiej tablicy. W przypadku pracy z kontrolą przepływu jak na razie zmieniam tryb pracy na odczyt blokami, ale dalej używam jednej wielkiej tablicy którą traktuję jako bufor cykliczny, po odebraniu jednego bloku ustalam następny ciągły obszar w buforze do...
Konfiguracja UARTa: [syntax=c] #define UART_BAUD 76800 //9600 // tu definiujemy interesującą nas prędkość #define __UBRR F_CPU/16/UART_BAUD-1 // obliczamy UBRR dla U2X=0 void USART_Init( uint16_t baud ) { /* Ustawienie prędkości */ UBRRH = (uint8_t)(baud>>8); UBRRL = (uint8_t)baud; /* Załączenie nadajnika I odbiornika */ UCSRB = (1<<RXEN)|(1<<TXEN)|(1<&l...
Jeśli upierasz się przy "głównym wątku", to proponuję zrobić bufor cykliczny FIFO, odbiór znaków do bufora w przerwaniu i całą interpretację danych w głównym wątku. Przy innej dekompozycji (automat parsujący dane w przerwaniu) będziesz miał więcej roboty z utrzymaniem spójności, bo zapewne wątek główny musi się dowiedzieć, która dana przyszła i być...
Wrecie widać jakieś światełko w tunelu :D jednak obstawiłem ten 1 % i coś jest nie tak z ta biblioteka pana mirka36. Tylko jak to naprawić ? a wiec do rzeczy. Winowajca jest ten fragment kodu. [syntax=c] if (KEY2_down) { uart_puts("AT+CCALR?\r"); OUT1_ON; _delay_ms(300); OUT1_OFF; } [/syntax] zmieniłem na : [syntax=c] if (KEY2_down) { OUT1_ON; _delay_ms(300);...
Co może zakłócać generowanie Master Clock podczas transmisji I2S? Na moje oko to aliasing z częstotliwością próbkowania analizatora stanów logicznych. Pewnie próbkuje z częstotliwością 24 lub 25MHz. MCK zapewne jest w porządku. Z timerem to się już zorientowałeś, że niewypał. Dane muszą być oczywiście wysyłane w chwilach wyznaczanych przez opróżnienie...
Na prawdę jeszcze czegoś takiego to nie widziałem, żeby : 1. nie skorzystać ze sprzętowego UARTA - gotowca w bascomie COM1 to niestety sprzętowy port komunikacyjny. :P Tak samo jak COM2. Choć z nim to już trzeba nieco pokombinować z OPEN i kanałami by coś przez niego przesłać. 2. nie skorzystać z pięknych buforów cyklicznych - gotowca w bascomie Przy...
1ms spokojnie przerwanie zewnętrzne Ci zliczy (piny 2, 3) https://www.arduino.cc/reference/en/lang... dalej myślę, że musisz odliczać czas np. licznik 1 i przerwanie powiedzmy co 1 sekundę (konfigurujesz przez rejestry TIMER1), tam sobie liczysz sekundy i za każdym razem (może być w loop() ) przeliczasz...
Witam W bloku DB o wielkości 10000 bajtów można bez problemu zapisać 1000 pomiarów. DATA_BLOCK "Dane_Pom" TITLE = VERSION : 0.1 STRUCT Pomiary : ARRAY [1 .. 1000 ] OF STRUCT DiT : DATE_AND_TIME ; Wartosc : WORD ;//Z AI przed skalowaniem END_STRUCT ; END_STRUCT ; W OB1 w jego zmiennych tymczasowych jest aktualny czas...
Wszystko powinno poginac na buforach kolowych , powinien istniec regularny parser tego co przylazi ok, bufor cykliczny wydaje sie byc ciekawszym rozwiazaniem :) Zrobie dwa wskazniki jeden do odczytu drugi do zapisu. * Wskaznik do zapisu pokazuje nam gdzie zapisac kolejny znak, po czym jest inkrementowany. * Wskaznik odczyt u ustawiony na znaku ktory...
Najprościej tak: 1. Odczytujesz znaki i zapisujesz je do bufora aż do wystąpienia CR/LF (lub do długości najdłuższego oczekiwanego ciągu) Tylko że w przypadku tego CONNECT xxx oraz DISCONNECT xxxx nie występuje ani CRLF ani CR ;) Co nie oznacza oczywiście, że nie da rady tego zrobić. Tyle tylko, że ja bym sobie na miejscu autora najpierw na spokojnie...
można kilkoma metodami: 1. komora pogłosowa (duże pomieszczenie, w którym umieszczasz głośnik i mikrofon - reverb jest realizowany przez parametry pomieszczenia) 2. sprężyna pogłosowa (czyli tak jak w tym projekcie - reverb realizowany jest poprzez bezwładność sprężyny) 3. elektroniczne echo analogowe (tzw. układy BDD czy jakoś tak - rodzaj analogowego...
Wykorzystam chyba ramkę (A-wartoscA). Załózmy ze z PC przychodzi ramka: A-123\n Sprawdzanie czy pierwszy bajt 0 to A czy B ogarniam, nie wiem jak z bajtu 2, 3 i 4 odczytac całą liczbę do jednej zmiennej i jak sprawdzac ile bajtów nadeszło zeby nie odczytywac bajtow ktorych nie ma jak przyjdzie np ramka A-4\n. Wiem ze trzeba do tego zbudować bufor cykliczny...
[syntax=c] #define TableDim = 32 volatile char tablet[TableDim]; uint8_t tabint; [/syntax] [syntax=c] ISR(USART_RXC_vect) { tablet[tabint] = UDR; tabint++; if ((tablet[tabint]==0x3C) && (tablet[tabint-1] = 0xC3) && (tablet[tabint-2] = 0x33)&& (tablet[tabint-3] = 0xCC) ) {tabint=0;} if(tabint>=TableDim) { tabint=0; //tutaj sobie jakąś obsługę takiego...
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....
praca cykliczny samsung cykliczny odwołać cykliczny
rezystor objętościowy podsłuch usługa czarny ekran lenovo laptop
lutownica arduino lutownica arduino
Tranzystor IGBT: DPAK vs D2PAK - temperatura pracy Schemat pilota kierownicy Dacia Duster 1 (2010-2017)