Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 18 sie 2017, o 06:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
Autor Wiadomość
PostNapisane: 11 sie 2017, o 12:46 
Offline
Nowy

Dołączył(a): 03 lip 2017
Posty: 9
Pomógł: 0

Witam! Mam pytanie co do bufora cyklicznego uart'a z bluebookowej biblioteki.
Mianowicie czy on powinien działać w taki sposób: w atmedze[1] wysyłam co sekundę inny char:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W atmedze[2] wyrzucam sobie na terminal zawartość tablicy bufora
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Po włączeniu atmegi[2] mam same zera (co raczej mnie nie dziwi :D) i powolutku zera zamieniają się na kolejne liczby naturalne, myślałem, że po zapisaniu 32 bajta zaczną się nadpisywać bajty od 1, jednak nic się nie dzieje :( Gdzie więc podziała się cykliczność mojego bufora?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2017, o 13:21 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 21201
Lokalizacja: Szczecin
Pomógł: 778

A co to ma w ogóle wspólnego z buforem cyklicznym ? Coś kolega chyba kompletnie nie zrozumiał IDEI działania takiego bufora

on jest po to żeby sobie działał w tle przy czym bufor nadawczy nie ma aż tak istotnego znaczenia przy większych prędkościach jak bufor odbiorczy

Co ty w ogóle testujesz i co chcesz osiągnąć ? sorki ale po twoim opisie kompletnie tego nie rozumiem - o czym piszesz ... no i ten test

uart_putc(i);

jak myślisz co ty zobaczysz na terminalu gdy 'c' będzie się zmieniać w zakresie od 0 do 128 ???? Zdajesz sobie sprawę z tego co to są znaki "niedrukowalne" o kodach chociażby od 0 - 32 ? ... znaki ASCII czyli te prawidłowo widoczne w terminalu zaczynają się dopiero od spacji od kodu = 32

w drugim przykładzie już coś sobie robisz dobrze bo korzystasz z uart_putint() ... ale nadal nie rozumiem co to ma mieć za związek z buforem cyklicznym ?

Bufor sobie działa a ty w takim przykładzie nawet nie wiesz o tym, że on działa "pod spodem" i tak ma być

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2017, o 15:05 
Offline
Nowy

Dołączył(a): 03 lip 2017
Posty: 9
Pomógł: 0

z atmegi[1] przesyłam do atmegi[2] char'a 0-127, a z tej drugiej do komputera na terminal zawartość UART_RxBuf[].
Okej, czyli rozumiem, że bufor sobie żyje jak chce i tylko mi wrzuca co odebrał do UART_RxBuf[]? Jak więc powinienem korzystać z odebranych danych kiedy owa tablica mi się zapcha? jakoś czyścić czy cuś?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2017, o 16:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 364
Lokalizacja: Trójmiasto
Pomógł: 51

Zrozum jak wysyłasz char'a od 0 - 127 to i tak te od 0 do 31 w terminalu nie ujrzysz nic albo krzaki bo znaki do 31 to są znaki specjalne i sterujące więc jak chcesz widzieć w terminali to wysyłaj znaki od 32 w górę (tablica znaków ASCII się kłania).
DarkMajster napisał(a):
Okej, czyli rozumiem, że bufor sobie żyje jak chce i tylko mi wrzuca co odebrał do UART_RxBuf[]? Jak więc powinienem korzystać z odebranych danych kiedy owa tablica mi się zapcha? jakoś czyścić czy cuś?

Jeżeli będziesz odbierać dane z bufora to Ci się nie przepełni. Każdy odczytany znak zwalnia miejsce z bufora. Przepełnienie może nastąpić gdy po stronie odbiorczej będziesz zbyt wolno odczytywał dane z bufora lub gdy masz za mały bufor a nadawana jest większa ilość danych ciurkiem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2017, o 16:21 
Offline
Nowy

Dołączył(a): 03 lip 2017
Posty: 9
Pomógł: 0

ale ja nie wysyłam chara do terminala! chara wysyłam do drugiej atmegi a ta wysyla zawartość UART_RxBuf[] jako inty do terminala, bo chciałem sprawdzić czy atmega druga odbiera dane tak jak myślałem czyli zapalnia UART_RxBuf[] a po zapisaniu 32 bajta nadpisuje po kolei UART_RxBuf[0], UART_RxBuf[1].. etc, ale widzę, że nie i stąd drugie pytanie jak odbierać te dane poprawnie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2017, o 16:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 364
Lokalizacja: Trójmiasto
Pomógł: 51

A jak sprawdzasz co jest w buforze odbiorczym?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2017, o 16:32 
Offline
Nowy

Dołączył(a): 03 lip 2017
Posty: 9
Pomógł: 0

tak jak w drugim kodzie, w 1 poście



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2017, o 17:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 364
Lokalizacja: Trójmiasto
Pomógł: 51

no to jeśli nie pobierasz danych z bufora cyklicznego funkcją która do tego służy a dobierasz się bezpośredni do samego bufora to nie dziw się że bufor się zatrzymuje ( jest tak napisany że jeśli tymczasowy head się zrówna z tail to dane nie są umieszczane w buforze, a w warunku nawet masz komentarz "tutaj możemy w jakiś wygodny dla nas sposób obsłużyć błąd spowodowany próbą nadpisania danych w buforze") Jeśli chcesz by bufor się nadpisywał po prostu wywal warunek, a do pobierania danych z bufora używaj dedykowanej do tego funkcji uart_getc (bo generalnie z bufora nie powinieneś bezpośrednio odczytywać).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2017, o 17:31 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 21201
Lokalizacja: Szczecin
Pomógł: 778

DarkMajster napisał(a):
ale ja nie wysyłam chara do terminala! chara wysyłam do drugiej atmegi a


Jak ja słyszę że ktoś mówi

"wysyłam chara"

"wysyłam inta"

to aż mi ciarki po kręgosłupie z lewej strony chodzą a włosy stają dęba i potrójna gęsia skórka się robi

Chłopie - zrozum co to są znaki ASCII ... weź że obejrzyj ten poradnik



ale tak od początku do końca

..... opisany w Bluebooku bufor cykliczny działa TYLKO na ZNAKACH ASCII - zrozum to.

Więc jak sobie wysyłasz dane binarnie (bo tak się mówi - a nie że "wysyłam chary" bo to jakaś kosmiczna bzdura) ... to jak myślisz jak druga twoja atmega rozpozna koniec ramki gdy wyślesz sobie kod znaku = 13 ???? wiesz co to jest 13 ? hexadecymalnie 0x0D ???

Na prawdę - na początek postaraj się zrozumieć o co chodzi ze znakami ASCII - i jak wygląda komunikacja ASCII bo robisz jakieś MEGA KARDYNALNE błędy

możesz wysyłać STRINGI z jednej atmegi do drugiej i to stringi zakończone znakiem CR (ENTER 0x0d)

a nie tam wysyłać sobie ciurkiem 128 bajtów czysto binarnie. Twoja biedna druga Atmega po prostu zwymiotuje najpierw jak zobaczy ZERO

później gdy nadleci znak 0x0d ... bo uzna że dotarła pierwsza ramka ale ramka zamiast ASCII to zawierająca znaki niedrukowalne

0,1,2,3,4,5,6,7,8,9 ... 11,12

dlaczego nie ma 10 ? bo 10 czyli 0x0a to z kolei znak LF (LineFeed) pomijany przez obsługę bufora cyklicznego ....

coś czuję, że chyba jednak nawet nie przeczytałeś tego rozdziału w Bluebooku na temat tych buforów cyklicznych hmmm ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2017, o 19:21 
Offline
Nowy

Dołączył(a): 03 lip 2017
Posty: 9
Pomógł: 0

No tak, powinienem użyć putint nie mam pojęcia o czym myślałem pisząc to ( zwalmy wszystko na grzejące słoneczko ). więc mam UART_RxBuf[] do którego wpadają odebrane dane, kradnąc je przez uart_getc zwalniam miejsce na kolejne, jeżeli tego nie zrobię to się bufor zapcha i obrazi?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sie 2017, o 21:32 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 21201
Lokalizacja: Szczecin
Pomógł: 778

DarkMajster napisał(a):
jeżeli tego nie zrobię to się bufor zapcha i obrazi?

;) no i fajnie w końcu widać - ze kolega załapał

nie nie obrazi - zajrzyj do BB do przykładów - masz tam moment w którym możesz reagować na błąd przepełnienia ... ale...

ale czy warto czekać na niego ?

nie ! ... warto wciąż odbierać stringi a nie pojedyncze znaki - wtedy nie uda ci się zapchać bufora cyklicznego

Jak to robić ?

To wyjaśniam już na końcu Greenbooka - ponieważ do tego potrzebne mi było aby czytelnik zrozumiał programowanie oparte o zdarzenia ...

czy można bez GB ? ,..... można - pewnie, że można - jakoś "ręcznie" ... na forum wielokrotnie czytelnicy podejmowali takie próby i z powodzeniem

pomimo to na końcu gdy zobaczyli jak warto to robić w oparciu o (EVENTS) zdarzenia - to ...

ALE tu warto obejrzeć chociażby ostatni poradnik o komunikacji UDP

nie obawiaj się, że mowa o UDP - zobacz o co w ogóle chodzi ;)

mówię ci obejrzyj to ;)



zdziwisz się jak prosto można to obsługiwać

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sie 2017, o 10:38 
Offline
Nowy

Dołączył(a): 03 lip 2017
Posty: 9
Pomógł: 0

Wczorajszy brak prądu mi chyba wyszedł na dobre bo drugi raz przeczytałem rozdział o uarcie, i wydaje mi się, że wiem więcej :D

Zrobiłem w atmedze wysyłającej tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


A w odbierającej wymyśliłem coś takiego:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I myślę, że powinno to działać tak:
czekam sobie na znak start of text, jeżeli go nie mam to uart_getc'harem usuwam z bufora jeden znak, a jeżeli już będzie ten oczekiwany znak 2, to wiem ze następne piec znaków to interesujące mnie dane.
Mam tylko jeden problem - nie działa :C co zrobiłem źle?

(dekoder to poprostu zamiana cyfr z ascii na zwykłe oraz kilka interersujących mnie liter na liczby 10-15
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sie 2017, o 14:03 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 21201
Lokalizacja: Szczecin
Pomógł: 778

DarkMajster napisał(a):
co zrobiłem źle?


funkcja get_char() pobiera po jednym znaku z bufora cyklicznego a jeśli NIC nie ma w buforze to zwraca ZERO

a zatem jeśli nie masz GB to musisz sobie sam na razie jakoś napisać odbiór stringów z bufora cyklicznego. Krótka podpowiedź jak to zrobić tak "na piechotę"

badasz cyklicznie czy get_char() zwraca NIE ZERO, jeśli znak ASCII to doklejasz go do jakiegoś już swojego bufora i wciąż oczekujesz na znak CR czyli 0x0D - jeśli get_char() zwróci CR to wtedy wiesz że nadleciał koniec stringa i możesz odczytać swój bufor z ładnym stringiem.

Polecam jednak GB tam pokazane jest to pięknie jak się robi na zdarzeniach

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sie 2017, o 14:21 
Offline
Nowy

Dołączył(a): 03 lip 2017
Posty: 9
Pomógł: 0

Coś takiego?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sie 2017, o 16:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 364
Lokalizacja: Trójmiasto
Pomógł: 51

No niezupełnie - zauważ że dwa razy użyłeś funkcji uart_getc zanim odczytałeś docelowo znak. pierwsze użycie uart_getc w ifie pośle odebrany znak w niebyt, to samo w warunku pętli while dopiero trzeci znak wyląduje w Twoim buforze, ale już 4 znów poleci w nicość itd. Każde użycie funkcji uart_getc bezpowrotnie wyjmuje jeden znak z bufora więc od razu musisz wynik tej funkcji gdzieś umieścić.

Jeśli już chcesz bez zdarzeń to
najpierw załaduj wynik funkcji uart_getc do jakiejś tymczasowej zmiennej, następnie jeśli jest tam znak to umieść go w swoim buforze.
Możesz też w przerwaniu gdzie bufor cykliczny jest ładowany dodaj sobie zmienną/flagę która w momencie gdy w buforze będzie cokolwiek zostanie ustawiona na 1 a gdy bufor pusty na zero. A w pętli głównej programu sprawdzaj flagę i gdy ustawiona na 1 inicjuj odbiór danych z bufora cyklicznego do swojego bufora.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sie 2017, o 16:26 
Offline
Nowy

Dołączył(a): 03 lip 2017
Posty: 9
Pomógł: 0

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

A teraz?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sie 2017, o 16:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 364
Lokalizacja: Trójmiasto
Pomógł: 51

powinno zadziałać



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sie 2017, o 17:47 
Offline
Nowy

Dołączył(a): 03 lip 2017
Posty: 9
Pomógł: 0

No niby działa, ale nie działa :(

jedna atmega wysyła ciągle tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


druga odbiera i wyrzuca bufor stringowy do putty na zasadzie: indeks, zawartość dziesiątkowo, no i raz jest dobrze
Obrazek

a raz nie wiem co tu sie w ogóle wyprawia, nawet spacje ukradli :(

ObrazekObrazek

dodam, iż przy resetowaniu procka odbiorczego czasem zaczyna działać, potem się chrzani, a jak po resecie jest schrzanione to już naprawić się nie chce ;c

czyżby jednak wonsz sie zjadał? No i co tu teraz mądrego zrobić?



EDIT:
Problem rozwiązany! Choć nie wiem czy to tak elegancko :D, mianowicie: muszę przesłać 6 bajtów, więc dorzuciłem dwa byle jakie, zmniejszyłem rozmiar bufora odbiorczego do 8 bajtów, pozwoliłem mojemu wonszowi się zjadać, i teraz jeżeli przyjdą nowe dane[a będzie to dokładnie 8 bajtów], to dany bajt (oznaczający np stan przycisku) będzie miał nie zmieniony indeks, a na wypadek jakiegokolwiek przesunięcia - sprawdzam czy te zbędne 2 bajty są na swoim miejscu, jeżeli nie to ustawiam wonża na początek. Do moich celów sprawdza się wyśmienicie, co o tym sądzicie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO