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



Teraz jest 6 kwi 2026, o 17:41


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 12 lis 2014, o 21:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

Hej ;-)
Mam pytanie odnośnie bufora NADAWCZEGO w obsłudze RS'a
Dokładnie to odnośnie jego 'użyteczności i przydatności'
Na wstępnie dodam, że bufor odbiorczy to naprawdę świetna sprawa, ale chyba nie do końca rozumiem bufor nadawczy.

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

No i teraz to wg. mojego rozumowania wysyłany jest do bufora jest dodawany 1 char i OD RAZU leci przerwanie ISR( USART_UDRE_vect), które wysyła ten znak.

Generalnie chodzi mi o to, że chyba NIE DA SIĘ zapełnić bufora nadawczego, bo niby w jaki sposób, skoro od razu po ustawieniu tej flagi: UCSRB |= (1<<UDRIE); realizowana jest obsługa przerwania..

Generalnie czym się różni obsługa wysłania znaku przez przerwanie od zwykłego chamskiego wysłania np. bez procedury przerwania.
Mamy taką funkcję:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


////////////////////////////////////////////////////////////////////
Popatrzmy na funkcje do wyslania stringa.
Czym się różni,
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

od

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


Wg.mnie oba przypadki będą działały tak samo, a nawet ta bez obsługi przerwań SZYBCIEJ!
Powiecie.. ta bez obsługi przerwań, blokuje program główny.. no tak, ale ta z przerwaniami też, bo przecież od razu ustawia maskę przerwania i bierze się za obłsugę przerwania.

Chodzi mi o to, że bufor ODBIORCZY, to rzeczywiście ma SENS, ale nie potrafię sie doszukać sensu użycia bufora nadawczego.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2014, o 21:27 
Offline
Moderator
Avatar użytkownika

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

xamrex napisał(a):
ale chyba nie do końca rozumiem bufor nadawczy.

No nie do końca rozumiesz ;)

powiem krótko - spowalniać nic nie spowalnia ;) .... za to pomyśl sobie co by się działo gdybyś np miał baudrate już chociażby 4800, 2400 albo mniej i chciałbyś wysłać kilkadziesiąt bajtów szybko ;) 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: 12 lis 2014, o 21:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

mirekk36 napisał(a):
za to pomyśl sobie co by się działo gdybyś np miał baudrate już chociażby 4800, 2400 albo mniej i chciałbyś wysłać kilkadziesiąt bajtów szybko ;) hmmm?

Dzięki Mirku, za to że Akurat ty odpisałeś.
ale dalej nie rozumiem,
Nawet gdybym miał Baudrate=300 to co?

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

To ja to widzę tak:
1.Obsługiwana jest funkcja uart_putc('N');
1a.Czyli jest do tablicy UART_TxBuf dodawana literka 'N'
1b.Ustawiamy falgę przerwania UCSRB |= (1<<UDRIE);
2.Zaraz po tym jest realizowana funkcja przerwania ISR( USART_UDRE_vect)
2a.Która wysyła literkę 'N"
3.Teraz jes powrót do funkcji uart_puts
4 i jest realizowana funkcja uart_putc('A')
4a.Czyli jest do tablicy UART_TxBuf dodawana literka 'A'
4b.Ustawiamy falgę przerwania UCSRB |= (1<<UDRIE);
5.Zaraz po tym jest realizowana funkcja przerwania ISR( USART_UDRE_vect)
5a.Która wysyła literkę 'A"
6.Teraz jes powrót do funkcji uart_puts

No więc w jaki sposób zapełnić ten buforek, skoro od razu jest realizowane przerwanie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2014, o 21:48 
Offline
Moderator
Avatar użytkownika

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

no widzisz ;) po to podałem ten przypadek bo ty się zapętlasz panie w swoim punkcie 2a

oblicz sobie ile CZASU zajmie transmisja znaku z prędkością 300 bps ;) to zacznie ci świtać - kiedy ten kolejny znak będzie mógł być wysłany a tym samym ILE CZASU byś musiał czekać w pętli głównej gdybyś chciał wysyłać to bez buforowania

a poza tym zwróć też uwagę na to co wyżej napisał kolega mokrowski bo to kolejne istotne aspekty

_________________
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 lis 2014, o 21:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

No Mirku, ale przecież przerwanie ISR( USART_UDRE_vect) nie leci RÓWNOLEGLE z programem głównym?
Więc dopiero będzie można powrócić do funkcji uart_putc po skończeniu się funckji/przerwania ISR( USART_UDRE_vect)

Więc tak czy siak chyba będe musiał czekać?!

##############################
Przeciez nie wykona się funkcja uart_putc('A'); dopóki nie wrócimy z funkcji przerwania ISR( USART_UDRE_vect)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2014, o 21:57 
Offline
Moderator
Avatar użytkownika

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

Cytuj:
Więc tak czy siak chyba będe musiał czekać?!

no ale teraz sam się chyba zakręciłeś ;) co ? przecież pytałeś co daje buforowanie w porównaniu do wysyłania bez buforowania....

a teraz rozpatrujesz znowu z kolei jakby dziwny przypadek tak jakby nagle samo przerwanie pojedyncze miało ci rozwiązać problem bo się znak sam wyśle ... więc jeszcze raz powtarzam - odpuść sobie rozważanie wysyłania pojedynczego znaku a weź pod uwagę - do swoich rozważań jakiś długi string, kilkadziesiąt bajtów rozumiesz ?

wtedy zobaczysz że co z tego że przerwanie łyknęło pierwszy znak .... a co panie z kolejnymi ?

_________________
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 lis 2014, o 22:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

Nie zagmatwałem się..
Chyba trudno mi to wytłumaczyć..
Przeciez rozważamy string NAPIS.

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


Załóżmy że prędkość to nawet 1 bps. to tak czy siak będę MUSIAŁ CZEKAĆ, bo:

najpierw jest realizowana funcja puts, która skacze do szybicutkiej funkcji uart_putc('N'), która ta z kolei ustawia flagę i OD RAZU SKACZE DO obsługi przerwania,
ISR(), ta ISR trwa długi(bo prędkość to 1bps), ale no nic musi się skończyć wysyłanie znaku, dopiero potem funkcja skoczy do uart_putc('A') która ta znowu skoczy do strasznie długiej obsługi przerwania które wyśle znak A, no i dopiero po wysłaniu znaku A, lecimy do szybiciutkiej funkcji uart_putc('P')...
itp. więc jakim cudem mogłoby się niby w buforze nadawczym mógłby się znaleźć więcej niż 1 znak, skoro od razu po dodaniu znaku do bufora nadawczego jest realizowana obsługa przerwania, która BLOKUJE program główny, kttóry mógłby w tym czasie coś dodać znowu do bufora..



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2014, o 22:08 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

No a po co są przerwania?
Właśnie po to żeby nie czekać ;-)
Tylko program główny wrzucił wszystko do bufora i robi
swoje.
A po zgłoszeniu przerwania, na które przecież nie czeka, obsługuje je
wrzucając do wysłania kolejny znak z buforka i znowu zajmuje się zwoimi
>bardzo ważnymi< sprawami

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2014, o 22:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

MirkoT nic mnie nie zrozumiałeś. Twoja odpowiedź mnie nie satysfakcjonuje.
Poczekam co odpowie MIrek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2014, o 22:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Wyobraź sobie, że masz program który wysyła przez UART napis o długości stu znaków i np. mruga sobie w pętli głównej diodą.

Przy wysyłaniu napisu bez bufora nadawczego na czas wysyłania napisu program siedzi w funkcji wysyłającej. Przez ten czas pętla główna leży odłogiem i dioda nie miga.

Ale wystarczy ten napis załadować szybciutko do bufora nadawczego i można wrócić do migania diodą w pętli głównej. Dioda miga a napis ładnie się wysyła w tle.

Tu nie chodzi o to, która metoda szybciej wyśle ten napis tylko o to, że przy użyciu bufora nadawczego napis się wysyła a program w pętli głównej może robić sobie coś innego.

Ja tak to rozumiem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2014, o 22:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

jacekk232 napisał(a):
Ale wystarczy ten napis załadować szybciutko do bufora nadawczego i można wrócić do migania diodą w pętli głównej. Dioda miga a napis ładnie się wysyła w tle.

Z tym się NIE ZGADZAM!!

Bo przecież program czeka tak czy siak!
Jeśli używamy bufora nadawczego, to tak i tak czekamy!
(Proszę powiedzieć gdzie się niby mylę)

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


Załóżmy że prędkość to nawet 1 bps. to tak czy siak będę MUSIAŁ CZEKAĆ, bo:

najpierw jest realizowana funcja puts, która skacze do szybicutkiej funkcji uart_putc('N'), która ta z kolei ustawia flagę i OD RAZU SKACZE DO obsługi przerwania,
ISR(), ta ISR trwa długi(bo prędkość to 1bps), ale no nic musi się skończyć wysyłanie znaku, dopiero potem funkcja skoczy do uart_putc('A') która ta znowu skoczy do strasznie długiej obsługi przerwania które wyśle znak A, no i dopiero po wysłaniu znaku A, lecimy do szybiciutkiej funkcji uart_putc('P')...
itp. więc jakim cudem mogłoby się niby w buforze nadawczym mógłby się znaleźć więcej niż 1 znak, skoro od razu po dodaniu znaku do bufora nadawczego jest realizowana obsługa przerwania, która BLOKUJE program główny, kttóry mógłby w tym czasie coś dodać znowu do bufora..

Gdzie tu jest błąd?
W skrócie
Wydaje mi się, że dopiero po wysłaniu pioerwszej literki "N", (czyli po skończeniu obsługi przerwania) program wróci do funkcji putc i dodaj literkę "A" do bufora i od razu skoczy do funkcji przerwania.. wiec nie da się naraz mieć w buforze więcej niż 2 literek?!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2014, o 22:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

mokrowski Dziękuję Ci serdecznie!
Powiem szczerze, że właśnie tak podejrzewałem, ale nie chciałem tutaj nikogo naprowadzać w żaden sposób (bo myślałem, że źle podejrzewam)

Temat uważam za zamknięty i wyczerapny.
Raz jeszcze serdeczne dzięki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2014, o 23:13 
Offline
Moderator
Avatar użytkownika

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

xamrex napisał(a):
najpierw jest realizowana funcja puts, która skacze do szybicutkiej funkcji uart_putc('N'), która ta z kolei ustawia flagę ****####!!!!!####**** i OD RAZU SKACZE DO obsługi przerwania


Tu jest pierwszy MEGA BABOL jakiego szukasz w swojej analizie

co to znaczy "skacze do osbługi przerwania" .... no to albo nie wiesz jeszcze jak działają przerwania albo coś ci się mocno pokrębasiło że tak powiem. A żeby wytłumaczyć - NIC NIE SKACZE DO ŻADNEGO przerwania, bo nie ma czegoś takiego żeby funkcja "skoczyła" do przerwania :(

funkcja uart_putc() (Uważaj teraz) .... dodaje znak do bufora nadawczego i totalnie CZOCHRA ją przerwanie. Skoro tak? to co ? to znaczy że za chwilę doda kolejny znak ze stringa i kolejny i kolejny i kolejny .... dokąd tak będzie dodawać te znaki do bufora ? dokąd nie dotrze do krańca jego pojemności. A zatem reasumując funkcja uart_puts() doda najszybciej jak może CZAŁY STRING DO BUFORA nadawczego rozumiesz ? I program dalej robi to co ma robić ... na nic nie czeka i nic się nie BLOKUJE. Zaś obsługą wysyłania całej paczki danych z bufora już zajmuje się samo przerwanie.

i teraz .... (Uważaj!) czym innym jest przerwanie UDRE niż DODANIE znaku do bufora. W przypadku bufora odbiorczego zaskoczyłeś, a tutaj jakoś nie możesz. Więc spójrz na procedurę obsługi tego przerwania.

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


widzisz komentarze jakie dodałem z gwiazdkami ???

rozumiesz teraz ?

ten dwuczłonowy IF() else .... załatwia samoistne wysłanie WSZYSTKICH znaków z bufora cyklicznego ... i może to robić POWOLI i OSPALE gdy mamy baudrate 300 .... a NIC TO Z KOLEI nie obchodzi programu w pętli głównej który sobie popiernicza i w ogóle nie wie że "pod spodem" bufor cykliczny "SAM SIĘ NADAJE"

tak to działa

więc różnica jest gdy mamy prędkość baudrate np 115200 bo wtedy rzeczywiście czas nadania stringa będzie niewspółmiernie krótki w porównaniu do nadania tego samego stringa przy 2400 bps albo jeszcze wolniej

_________________
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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