Bo program będzie akurat w tej chwili w innym przerwaniu o wyższym piorytecie Szukasz rozwiązania na około dla problemu który stworzyłeś sam? Złe założenia do algorytmu ot co.... w razie W jest DMA.... Ale nadal ciekawi mnie jakie przerwanie będzie trwało dłużej niż 200us co jest wiecznością dla STMa.
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...
[syntax=c]RCC_APB2PeriphClockCmd(RCC_AHB... ENABLE);[/syntax] Zdecyduj się, czy konfigurujesz szynę APB2, czy AHB?
Mój problem polega na tym, że atmega ma otrzymać polecenie w trakcie wykonywania pętli, wysyłam więc 100 razy jedną liczbę w każdym cyklu pętli sprawdzając stan linii RX. Mógłbyś wyjaśnić w jakim celu wysyłasz 100 razy to samo. Gdy program wychwyci zmiany na RX robi goto do funkcji odczytującej jedną ze 100 wysłanych identycznych liczb Nie bardzo rozumiem...
Skorzystaj z opcji RTS/CTS.
Procedura "USART_Transmit" wykorzystuje sprzętowego USARTa ATmegi8. Działa ona w ten sposób, że najpierw sprawdza czy bufor w którym przechowywane są dane do transmisji jest pusty. Jeżeli nie jest pusty to czeka na jego wyczyszczenie, gdy stwierdza, że jest już pusty to wpisuje dana którą przekazujesz jako parametr do rejestru UDR, i transmisja odbywa...
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;...
[syntax=c]if (poz_odczyt > ROZMIAR) { poz_odczyt = 0; }[/syntax] tablice w C są indeksowane od zera. Jak masz rozmiar = 3 to ostatnim indeksem tablicy jest 2. Powyższy kod powinień więc wyglądać tak: [syntax=c]if (poz_odczyt > ROZMIAR - 1) { poz_odczyt = 0; }[/syntax]
Pracowałem ostatnimi dniami nad małym kontrolerkiem, sterowanym przez RS232. Obsługa niektórych poleceń, wydawanych do niego, trwała nawet po kilka milisekund i... okazało się, że użyty przeze mnie 16F628A ma bufor wejściowy USARTa rozmiaru... 2 bajtów. Tak, to nie pomyłka :| Dlatego postanowiłem napisać obsługę cyklicznego bufora wejściowego - o rozmiarze...
Pamiętaj, że rejestry SPI, w zależności czy to jest M/S, czy realizujesz przez USART, mają bufory. Jeśli więc coś nadajesz, a nie odczytasz SPDR, to ta wartość i tak tam jest, zostanie odczytana przy kolejnej okazji. Stąd możesz mieć opisane problemy z odczytem jakiś wcześniej przesłanych bajtów. Stąd też najlepiej albo jednocześnie zapisywać i odpisywać...
Problem leży tu: SIGNAL(USART_RXC_vect) { if(UDR=='$') zapis=1; if((i<14)&&(z... { buf[i]=UDR; i++; } if(i>=14) { k=1; zapis=0; i=0; } } Otóż odczyt z rejestru UDR powoduje jego wyzerowanie a następnie załadowanie następnego odebranego znaku (jeżeli...
Jak zaprogramować przerwanie od pojawienia się bajtu w buforze usart.
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
No to bez problemu, wykorzystaj SPI/USART w trybie SPI, wtedy dane musisz podawać 8 razy rzadziej niż pixelclock (a nawet rzadziej, bo USART ma bufor), czemu podoła zwykła ATMega. XMEGA to nawet może spać podczas generowania obrazu, bo generacją linii zajmuje sie DMA, a synchronizacji timery :)
Ale Kolego, SPRZĘTOWY bufor nadawczy/odbiorczy tego procesora ZAWSZE ma rozmiar 1 bajta. Tego nie da się zmienić - tak jest z punktu sprzętu i koniec. Aby stosować większe bufory musisz zastosować przerwania (RX_vect, UDRE_vect), bufory kołowe i zrealizować teoretycznie ograniczony tylko dostępnym RAM'em bufor programowo. Załączam kompletny przykład...
Ja kiedyś na AVRku zrobiłem bufor kołowy zapis do końca bufora a potem od zera. Jeden wskaźnik na zapis do bufora (wyzwalanie pomiaru z timera), jeden wskaźnik na odczyt (w wolnej chwili procesora) zapis inkrementował jedną zmienną a odczyt wysłanie RSem dekrementował (jak zmienna za wysoko urosła to przepełnienie bufora (usart się nie wyrabiał ) Ograniczenie...
Witam, napisałem program korzystający z USART-u. Zmiana stanu na wybranych wejściach uC ma powodować wysyłanie trzybajtowych pakietów danych. Wysyłanie odbywa się za pomocą przerwania USART_UDRE_vect. I oto dziwna rzecz: Pomimo, iż w SREG ustawiony jest najstarszy bit, w UCSRA sprzęt wystawia flagę pustego bufora, czyli UDRE jest ustawiony i wreszcie...
PC wysyła wszystko co ma w buforze bajt za bajtem bez czekania. Można zwiększyć odstęp między bajtami, z tego co pamiętam to jest do wyboru szerokość przerwy 1, 1 1/2 lub 2 bity. A jak odbierasz dane? AVR'y nie mają buforu (no jest na 1 bajt, ale to nie bufor), najlepiej umieścić w przerwaniu wywoływanym przez USART podprogram który zapisze kolejne...
Pokaż jak wygląda ta funkcja transmit i jak jest zdefiniowany bufor odebrane_dane.
To zależy co chcesz mierzyć [z jaką częstotliwością]. Jeśli są to wolne przebiegi wówczas ustawiasz przerwanie timara a w nim: - uruchomienie pomiaru ADC [pojedyńczy pomiar] - wysłanie przez USART [syntax=c]ADCSRA |= (1<<ADSC);// start konwersji while(ADCSRA & (1<<ADSC));// oczekiwanie na zakończenie konwersji USART_Transmit(ADCH); [/syntax]...
Zacznę bez zbędnego wstępu. Do czujnika PMSA003 wysyłam kilka ramek w trakcie działania programu - wszystkie mają 7 bajtów. Xmegę debuguję, a USART obserwuję analizatorem stanów. Dwie pierwsze instrukcje docierają do czujnika poprawnie. Kiedy jednak wychodzi trzecia, to po 5 bajtach stan linii TX pozostaje niski, a flaga DREIF wskazuje na brak miejsca...
Ja bym nie ufał i dopisał przed skopiowaniem bufora [syntax=vbnet] If Flaga Then Return[/syntax] a [syntax=vbnet] In_pos = 1 'Zmniejszamy wskaźnik bufora do 0 (usuwamy ramkę)[/syntax] przeniósł przed ten warunek.
Odbiór danych o nieznanym rozmiarze przez DMA jest bardzo problematyczny... Ponieważ włączyłeś tryb "circular", to w zasadzie jedyna opcją jest późniejsze składanie danych w dodatkowym buforze - będziesz musiał skopiować to co jest na końcu bufora DMA i potem to co jest na początku - tak aby dane znów były w poprawnej kolejności. DMA realizuje po prostu...
Poczytaj o instrukcji Config Serialin. To jest bufor wejściowy w USART w bascomie.
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...
(at)ElektrodaBot /* Program realizujący obliczanie i wysłanie przez moduł HC-05 (Bluetooth z interfejsem SPP, czyli RS-232) wyniku funkcji kwadratowej y = 0.3187x^2 + 2x - 7 na podstawie x odebranego wcześniej także za pomocą HC-05. Szczegóły: http://mikrokontrolery.blogspot.com/...
Zrób odbiór na przerwaniu, a w pętli głównej tylko sprawdzaj jakąś zmienną, ustawianą w przerwaniu, czy coś przyszło, jeśli nie, to goń procka do innej roboty... ;) Acha, jak już wszystko będzie odczytane to tą zmienną sobie zerujesz... Ogólnie to można zrobić bufor, a ta zmienna będzie licznikiem nieprzetworzonych bajtów.
Wydaje mi się , że funkcja wysyłająca znak na LCD jest zbyt czasochłonna i poprostu gubisz część znaków wysłanych przez telefon.Spróbuj zapisać je do tablicy , a potem wyświetlić na LCD , pamiętając o pominięciu znaków o kodach < niż np. 0x20.Najpewniejszym wyjściem z sytuacji , jest jednak bufor FIFO , zaimplementowany w procedurze obsługi przerwania...
Nie pokazałeś całego kodu. W obsłudze przerwania nie stosuje się numerów z LCD i czymkolwiek czasochłonnym. Co do realizacji odczytu USART w przerwaniu to podpowiedź brzmi " bufor kołowy". Dodam też że po około 30min wysypują też się atmego8A, No ja się wcale temu nie dziwię, w ogóle nie dbasz o zapisanie SREG ani używanych rejestrów w obsłudze przerwania.
To dalej nie jest dobry kod. Co, wg Ciebie, sprawdza poniższy warunek? Zamiast zerować bufor, zapewne wystaczy poprawnie sprawdzać długość. Zwracając message przez wartość kopiujesz ją jeszcze raz.
to od razu w tym przerwaniu zapisuj dane do bufora i je analizuj.
Pingi z pakietem 1400 dochodzą bez problemów (max to 1454). http://obrazki.elektroda.pl/7503654600_1... Bufor uIP ustawiony mam na 1500 (UIP_CONF_BUFFER_SIZE)
$crystal = 8000000 $regfile = "M16def.dat" $hwstack = 128 Tu zmieniasz wg wlasnych parametrow '- deklaracja zmiennych dla usart ---------------------------------------- Dim Index As Byte 'kolejny znak w buforze odbioru Dim Odebrano As Bit 'flaga ustawiona po odebraniu znaku Dim Buf(10) As Byte 'bufor wejsciowy - 10bajtow '- konfiguracja...
Porcje danych to okolo 10 bajtow. Czestotliwosc transmisji to okolo kilku minut wiec nie sadze zeby bufor byl potrzebny.
Witam, Używam w Bascomie polecenia: Dane_uart1 = Inkey() Gdy chcę wyświetlić dane na LCDku to wyświetla mi liczbę po liczbie. Np. Gdy wysyłam do tego procka za pomocą polecenia PRINT "1234" To otrzymuję kolejno 1, 2, 3, 4 . Chciałem otrzymać 1234 a nie kolejne liczby w stringu. Już trochę się z tym męczę i proszę o pomoc w tej sprawie....
Wartością funkcji jest adres bufora data. Ten adres jest stały. To dobry powód, żeby zadeklarować bufor na poziomie zewnętrznym i odwoływać się do niego bezpośrednio w main(). Funkcja receive nie powinna w takim przypadku zwracać nic. ew. może zwracać liczbę znaków w buforze, jeśli miałoby to coś uprościć. Nie ma również sensu zapisywać '\r' do bufora;...
Najprostszym rozwiązaniem będzie chyba zrobienie jakiegoś małego bufora komend. z tym buforem tak jak napisał TMF, to nie takie hop-siup :D Bo oczywiście, że mógłbym komendy wysłać ciągiem, w końcu korzystam z cyklicznego buforu programowego USART, one by się tam gromadziły, a ja bym zapomniał o wszystkim. Tylko, że ja po każdym wysłaniu komendy sprawdzam...
W przerwaniu USART_RXC musisz odczytać UDR niezależnie od warunków umieszczonych w kodzie, najlepiej, kopiując wartość tego rejestru do lokalnej zmiennej, tuż na początku funkcji. Jeżeli tego nie zrobisz, procesor zakolejkuje kolejne przerwanie. Piszę to na podstawie dokumentacji AVR8. W Twoim przypadku, gdy bufor odbiorczy się zapełni i nadejdzie kolejny...
Zakładając, że dobrze ustawiasz zegary i że funkcja od wysyłania której używasz automatycznie czeka na pusty bufor to powinno działać. Nie znam tej bzdurnej biblioteki, więc nie wiem co te funkcje dokładnie robią. 4\/3!!
Oto czesc programu na procku Atmega8: while(1) { unsigned char USART_Receive(); pomiar1=UDR;//wchodzacy ltoa(pomiar1,bufor1,10); } Wyglada to tak jakby USART_Transmit(tmp); zmienialo wartosc zmiennej pomiar1 przed petla. Troche zamotalem ale prosciej nie umie. Gdzie robie blad? Biblotek nie wklejam bo wydaje mi sie...
40 linii to tylko 5 portów a ATmega128 ma ich przeszło 6 czyli w zupełności Ci wystarczy. Niektóre porty mają możliwość generowania przerwania jak się zmieni ich stan ale przy tej rozdzielczości (5ms) wystarczy skanowanie wszystkich wejść a po wykryciu zmiany zapisać bieżący czas w buforze. Po zerwaniu się wszystkich przewodów cały bufor możesz wysłać...
"GPGGA" jest na początku bufora - tam gdzie jest robione memcmp (tak swoją drogą warto jeszcze sporawdzić czy w ogóle wczytano przynajmniej 5 bajtów). W swoim kodzie wysyłałeś od około 15. bajtu. Tylko nie zalecam wysyłania - jak widzę działasz na AVR, one nie mają dużych sprzętowych buforów na USART (coś około 1 bajtu), więc w trakcie wysyłania kilkudziesięciu...
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...
Tak, że zostanie wykryte jako początek ramki. Skanujemy cały bufor odbiorczy, więc również dane.
Więc w funkcji odbioru znaku jeśli bufor pusty zeruj zmienną c.
Widzisz jest sobie serwerownia ma jako bufor upsy i akumulatory. Na tym pociągnie chwilkę. Mogą troszkę oszczędzić zmniejszając moc klimy ale w pewnym momencie potrzebują z agregatu. I tam agregat musi uciągnąć wszystko. Agregaty startują od razu i wszystko działa sprawnie. No ale załóżmy ze mamy poważny fail sieci w normalnych warunkach dowóz paliwa...
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.
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...
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...
A z jakiego terminalu korzystasz? Bo na obrazkach masz ustawienia portu tylko. Kiedy korzystasz z usartu nie musisz ustawiać kierunkowości portu. Po włączeniu RXEN i TXEN piny te automatycznie są wykorzystywane przez usart i procek sam nimi steruje (przynajmniej w usart0). A dlaczego nie korzystasz z usart0? Wykorzystujesz go juz? uint8_t uart_getchar(void)...
Witam, Zwracam się z prośbą o pomoc przy moim projekcie. Tematem projektu jest obsługa termometru DS18B20 poprzez interfejs USART pracujący w trybie half duplex z przerwaniami i buforem kołowym. Wyszukiwanie urządzeń na magistrali 1-Wire, odczyt co zadany interwał pomiarowy podawany w milisekundach. Wiem mniej więcej, jak obsługiwać ten termometr poprzez...
Jak czytałeś lub nie :) karta ma sekwencje "startu" , nie pamiętam teraz jaki ma format, jest to jakiś 5bit znak, ja najpierw z czytuje cały bitstream od czytnika i potem funkcją szukam startu jak nie znajdę to "przekręcam" bufor (znaczy ostatni bit staje się pierwszym w strumieniu) i jeszcze raz szukam znaku startu, potem już tylko na podstawie tablicy...
Ale na pewno bufor nie ma 2 bajtów. Ma - jeden bajt od razu jest ładowany do "shift register", a drugi czeka w rejestrze USART->DR. Dopiero trzeci i kolejne się nie mieszczą i muszą czekać na zakończenie wysyłania poprzednich.
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,...
W twoim main brak jest na koncu petli i procesor sie resetuje. Po drugie jeli korzystasz z przerwan to musisz zdeklarowac ile bajtow jest do wyslania np. w sposob w jaki pokazalem w swoim kodzie. NAQ tym to polega wskazujesz skad wyslac dane(bufor), w jakiej ilosci i procesor zajmuje sie czyms innym np. kolejnymi obliczeniami nie martwiac sie o obsluge...
Oczywiście, że ma. Zarówno bufor odbiornika, jak i bufor nadajnika. Jeśli w UDR jest już bajt danych, to kolejny zapis odbędzie się do bufora (automatycznie załatwia to hardware MCU). Stąd też zazwyczaj zapisując dane do UDR sprawdzasz flagę UDRE, czy masz miejsce w buforze. Flagę zakończenia transmisji sprawdza się rzadko, zazwyczaj jeśli po zakończeniu...
To ten sam rejestr, tylko przy odczycie zwraca bufor odczytu, a zapis powoduje zapisem do bufora zapisu. Zobacz rejestr stanu USART i przeczytaj jego opis, a nastanie jasność :)
Przerwanie od odbiornika jest wywoływane w momencie kiedy dana jest gotowa w rejestrze, więc ta pętla do while jest niepotrzebna (zresztą ona jest wręcz nie wskazana bo wydłuża obsługę przerwania o nie wiadomo ile czasu). Poza tym proponuję jeszcze w M8 sprawdzac rejestr UCSRA, w nim są zgłoszone ewentualne błędy (szczegóły w manualu). Poniżej działająca...
obsłużyć wydarzenie jakim jest skonczenie odbierania znaku ? Chodzi mi to to aby program w pętli głównej robił co do niego należy, nie wiedząc kiedy ma spodziewac się znaku, jednakże cały czas byłby na to gotowy-aby go odebrać. tak na szybko algorytm: volatile char bufor[50]; volatile int ilosc_znakow; volatile char bufor_2[50]; int...
przy okazji - przerwanie zakłóca działanie millis() z tego co wiem Przeglądałem ten link i tam było napisane, że millis() jest sprzętowe. Jeśli tak to przerwania nie wpływają na pracę timera, chyba, ze "sprzętowe" to ściema. Wszystko wskazuje, ze ściema, bo jeśli i micros() jest sprzętowe to dwa timery zostają zużyte. Dodano po 1 Przerwania powinno...
[syntax=c] volatile unsigned char odb_x; //odebrana liczba X volatile char odebrane[3]={0}; volatile unsigned char odb_flaga =0; //flaga informująca main() o odebraniu liczby volatile unsigned int usart_bufor_ind; //indeks bufora char usart_bufor[30] = "H"; void usart_inicjuj(void) { #define BAUD 9600 //tutaj podaj żądaną prędkość transmisji #include...
Witam, mam problem z nawiązaniem połączenia przez układ MCP2200. Jest to konwerter USART=>USB. Korzystam z programu z strony: http://mikrokontrolery.blogspot.com/2011... Kod programu: http://obrazki.elektroda.pl/3793960700_1... Wszystko robię tak jak jest opisane na stronie, po podłączeniu układu...
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. ;)
Poprawiłem post wyżej :D. I jeszcze raz ponawiam pytanie czy konfiguracja DMA jest poprawna do Twoich założeń? Start: programujesz ADC na jednorazową konwersję wszystkich kanałów z wyzwalaniem przez timer, timer do wyzwalania ADC i DMA do odbioru danych z ADC do bufora 1.
Jak używasz sprzętowego USART to nie musisz w zasadzie liczyć czasu jaki jest potrzebny na odbiór/nadanie bajtu. USART robi to sprzętowo i ładuje do bufora, a można go tak ustawić że po odebraniu bajtu zgłasza przerwanie, i wtedy odpowiednio reagujesz. Co innego z programowym, tu już timingi mają znaczenie.
Ogólnie to coś działa ale....... 1. Czemu dla takiego użycia ITOA wyskakują ostrzeżenia ? 2. Myślałem że jak zdeklaruję wielkość bufora mniejszą niż zmienna np http://obrazki.elektroda.pl/8716705500_1... [syntax=c]#include <avr/io.h> #include <avr/pgmspace.h> #include <util/delay.h> #include "usart-lib/usart.h" void...
Witam! Stawiam na błędne sterowanie buforami. Najprawdopodobniej w jednym momencie masz wysterowane co najmniej 2 odbiorniki RS485 i dochodzi do konfliktu poziomów. Proponuję odpiąć wszystkie RS485 prócz jednego i testować, albo po prostu podglądnąć analizatorem wszystkie wyjścia buforów... Pozdrawiam! Sławek
Całego bajtu- i wtedy odczytujesz go w czasie pojedynczych us. Mało tego- możesz to zapisać w bufor kołowy i odczytywać po kolei.
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...
W dziele Transmisja danych znajdziesz przykład USART na przerwaniach z buforem: http://mikrokontrolery.blogspot.com/p/sp...
Witam wszystkich Forumowiczów. Szczerze mówiąc to moja pierwsza tak poważna przygoda z asemblerem...ale do rzeczy...znalazłem na necie programik który przekształciłem na swoje potrzeby. Program ten jest odpowiedzialny za odbieranie łańcucha znaków (tekstu złożonego z ok. 15 znaków) przesyłanego z modułu Bluetooth (wt11) do interfejsu USART (w trybie...
Dekoder to helix mp3, do bufora fifo(51200B) wkladam dane w przerwaniu od usart rxne. Stos i stera ustawione na 0x1000
Przecież wyraźnie widać, że STM odbiera 8 bitów, a w Realterm jest ustawione 7 bitów. Stąd różnica i obcięty najstarszy bit. Poza tym, dane się zgadzają. Format danych musi być ten sam. STM to pewnie 8N1, Realterm 7E1.
Witajcie moi drodzy. Chciałem zrobić komunikację po RS232, na początek w jedną stronę - z atmegi do komputera. Niestety, ciągle pojawia się taki błąd: http://obrazki.elektroda.pl/4311460800_1... Korzystam z zewnętrznego kwarca 16MHz bez kondensatorów. Takie mam fuse bits: http://obrazki.elektroda.pl/7171078000_1... Podłaczenia...
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ż...
Moim zdaniem jest prostsza metoda. Tworzy się dwa indeksy i tablice buforującą. Oprogramowanie zapisuje znaki to bufora i zwiększa pierwszy indeks (umownie indeks programowy). Po takim zapisie przed wyjściem zezwala na przerwanie. Przerwanie z kolei jak wykryje, że bufor programowy jest różny od drugiego buforu (umownie bufor sprzętowy) to z aktualnie...
Czy jakbym zrobił to w ten sposób, miałoby to sens? Nie ma sensu! Czemu służy "delay(3);"? Para ma iść w gwizdek? W ten sposób to nie wiadomo jak szybki będzie uC, delay "zabije" jego prędkość. Zmienna (tablica) "readString " ma jakiś rozmiar, tajemnicą jest jaki, ale większość Arduino ma 2kB (2048) RAM. Stos (ok20 bajtów zależnie od skomplikowania...
Witajcie moi drodzy. Udało mi się obsłużyć (częściowo) klawiaturę matrycowa. Proszę o sprawdzenie kodu (kod bazuje na przykładzie dondu bo przez rs232 wysyłam to co kliknięto) http://obrazki.elektroda.pl/2692005700_1... 1. Co można ulepszyć/usprawnić? 2. Czy idea (oraz tryby pracy portów) są poprawne? 3. Czy wartość rezystora jest odpowiednia?...
Witam Od jakiegoś czasu próbuję przeprowadzić odbiór danych z UART z wykorzystaniem DMA. Jeśli chodzi o konfigurację UART to jest ona przeprowadzona prawidłowo, ponieważ mogę dane wysyłać jak i odbierać ręcznie. Problem pojawia się przy próbie zaprzęgnięcia do odbioru DMA. Dane w buforze odbiorczym nie są aktualizowane (po zainicjalizowaniu bufora wartościami...
Z tym zasilaniem chodziło o to, że JTAGi zwykle potrzebują napięcia zasilającego mikrokontroler do zasilania swoich buforów.
Więc tak. Pierwsza ciekawostka która wyszła, to jakiś kłopot z układem watchdog, więc go wyłączyłem aby sprawdzić czy to jedyny błąd. Wszystko działa elegancko do momentu gdy program zaczyna generować instrukcje dla odbiornika - w tym miejscu nagle uaktywnia się przerwanie 'STOP' (co pokrywa się z zachowaniem całości w praktyce), a uK utyka w martwej...
Mam również problem z ATmega8L. Nie moge odczytać informacji z UARTa. Robię tak, jak jest to opisane w datasheet ale nie dziala - odczytuje "śmieci". Zastosowałem przerwanie które wywoływane jest przy RXC=1 czyli wtedy jeśli coś jest w buforze. Proszę o pomoc.
W ATMega nie ma takiej opcji - włączenie USART powoduje przejęcie kontroli nad pinem IO i ustawienia rejestrów portu dotyczące tego pinu nie mają znaczenia. Poza tym dla TxD nie miałoby to sensu, skoro jest to wyjście push-pull. Takie numery można zrobić na AVR XMEGA, gdzie wyjście z USART przechodzi przez bufor pinu, w efekcie konfiguracja pinu wpływa...
tu jest kod prostego programu który podgląda to co dzieje się na magistrali, filtruje odpowiedź jednego z urządzeń i obrazuje na ekranie to co jest odbierane. jest tam też pomocniczy licznik który pozwala mi analizować ile tych ramek (które są odpowiedzią urządzenia może być pomijane. Jedyne "przetwarzanie" ramki to wyświetlenie jej zawartości na ekranie....
Jak to testujesz? Wpisujesz znaki na terminalu czy wysyłasz z programu? Jeśli to drugie - musisz czekać na odpowiedź mikrokontrolera po wysłaniu każdego łańcucha. Proponuję też wyczyścić kod procedury odbioru łańcucha: [syntax=c]while (StringLen < MaxLen - 1 && (NextChar = USART_receive()) != '\n') { *Buffer++ = NextChar; StringLen++; } [/syntax]...
Klepnąłęm kawałek kodu na STM32F0x dla obsługi transmisji uK=>PC. Jednak pojawił się dziwny objaw. Może ja nie widzę błędu.... Warto aby ktoś zerknął w ten kod: #define TBUF_SIZE_UART2 128 struct uart2_tx_buf_st { u16_t in; /* indeks zapisu */ u16_t out; /* indeks odczytu */ u16_t dat; /* licznik danych w buforze */ char buf [TBUF_SIZE_UART2];...
Witam! Obsługa przerwania trwa z reguły krócej, niż odbiór pojedyńczego bitu przez USART. Drugim zabezpieczeniem jest bufor FIFO - odbierze kolejny znak, zanim odczytasz poprzedni. Pozdrawiam!
Problem został rozwiązany! Zainspirował mnie kol. TvWidget uwagami o buforze. Okazało się, że trzeba było ustawić we właściwościach ComPort Timeouts.Constant tak, aby wystarczyło czasu na odczyt bufora. Temat zamykam, wszystkim autorom dziękuję.
OK, dzięki. Ale chodziło mi o coś porządnego. Np. dla usart: aby było na przerwaniach, oparte na buforze kołowym, z pełną sygnalizacją stanu transferu w przerwaniach. To co jest na stronach Atmela to jakieś przedszkole.... To tylko przykład podany przeze mnie dla usart. Z innymi peryferiami jest podobnie... Pozdrawiam.
A jakby zrobić coś takiego. W przerwaniu timera 1 i poza nim uruchomić przerwanie od Usarta w którym znaki będą zapisywane do tablicy, a w pętli głównej programu sprawdzać tylko zapełnienie tablicy. Po jej zapełnieniu analizować dostarczone dane przy wyłączonym przerwaniu z Usarta. Pytanie czy Usart daje przerwanie przy zakończeniu odbioru znaku (wypełnieniu...
Można użyć USART w trybie SPI, bufor działa, ale niewiele to zmienia. Jeśli obsługa przerwania (łącznie z czasem potrzebnym na obsługę hardwarową - to jakieś 4-6 taktów) zajmie więcej niż owe 32 takty, to problem będzie się kumulował, aż dojdzie do przepełnienia bufora i koniec zabawy. Można zrobić tak jak piszesz - w pierwszym przerwaniu czekać na...
Mam następujące zadanie; stworzyć projekt na laboratoria z mikroprocesorów. Męczę się z tym już od początku semestru i szczerze nie mam pojęcia gdzie robię błędy. Liczę na moc internetu i oczywiście odpłatnie na pomoc. Pełna specyfikacja projektu: 1. Komunikacja z komputerem za pomocą interfejsu USART z buforem kołowym. 2. Zaprojektowanie i implementacja...
A skoro obsługujesz nadawanie z bufora. Zapewne warto sprawdzić czy przerwanie od TXE jest włączone.
Na Mega328 z KB RAM uruchamianie OS nie bardzo ma sens. Zrób wielowątkowość opierając cały program o maszynę stanów. Zapomnij, że istniej delay. Owszem, krótkich delay (mikrosekundy) w AVR przeważnie nie da się przeskoczyć ale nie zawsze. Na 1-Wire, można obsłużyć USARTem. Nie ma żadnych delay i 1-Wire działa na przerwaniach. Masz więc już pierwszy...
Do końca nie rozumiem. Chcesz byśmy podpowiedzieli Ci jak napisać funkcję która wartość ze zmiennej przerobi na ciąg znaków ASCII zapisanych w buforze- czy tak?
Ofkoz ze tak. Blokowanie w funkcji wsadzajacej znak do bufora imho jest paskudne/straszne/przerazajace/odpychaja... Nawet w najwolniejszym procku zawsze warto implementować programowe FIFO o wielkości nawet tylko 16 bajtów, a sam tx realizować tylko i wyłącznie w przerwaniu... Jak ma się wykonywać pseudowielowątkowo...
Nie skrosowałem kabli, poprawione, coś działa, ale nie tak jak trzeba ;) Zwiększyłem bufor odbiorczy do 64B, wysyłam pytanie o pozycję co ok. 100ms. [syntax=c]while(1){ char flag=1,stan=1,znak=0; COM0_send('?'); while(flag){ znak=uart_getc(); if(znak){ switch(stan){ case 1: if(znak==':')stan=2;break; case 2: { enc_pos.pos8bit.old=znak-'0';stan=3; break;...
Teraz mam: [syntax=cpp] void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1,USART_IT_RXN... sie gdy bufor odbiorczy nie jest pusty { RxBuf[i++] = USART_ReceiveData(USART1); if(i>7){ USART1->CR1&=~(1<<2);// Odbiornik wylaczony USART1->CR1&=~(1<<5);//blok... przerwania odbioru i=0; j=0; for(l=0;l<=7;l++)...
1. Jakie prędkości masz po obu stronach? 2. Nie możesz tego zrobić sprzętowo? 3. Programowo robisz odbiór i nadawanie na przerwaniach i przepisujesz z jednego bufora dane do drugiego... 4. Jakie funkcje ma pełnić Atmega? Czy ma to być tylko monitor połączenia czy co?
Witam, Mam problem z odbieraniem danych po RS485 (a w zasadzie to chyba raczej z RS232). Mam dwa procesory. Jeden master, drugi slave master.c: #include <avr/io.h> #include <avr/interrupt.h> #include "lcd.h" #include <util/delay.h> unsigned char z,licznik; char bufor[10]; /*****************************Inicjaliza...
usart bufor kołowy atmega128 usart bufor przerwa usart
volvo silnika ademco express amica wymiana pompy
pomiar indukcyjności pomiar indukcyjności
Jak samodzielnie sprawdzić jakość wody w studni? Ford Focus C-Max 2004: Problemy z elektryką po wymianie żarówek na LED