<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=9213&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-11-12T23:13:13+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=9213&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-11-12T23:13:13+01:00</updated>
<published>2014-11-12T23:13:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103682#p103682</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103682#p103682"/>
<title type="html"><![CDATA[Re: Budor nadawczy do UArt'a - wyjaśnienie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103682#p103682"><![CDATA[
<div class="quotetitle">xamrex napisał(a):</div><div class="quotecontent"><br />najpierw jest realizowana funcja puts, która skacze do szybicutkiej funkcji uart_putc('N'), która ta z kolei ustawia flagę <span style="color: #FF0000"><strong>****####!!!!!####****</strong></span> i OD RAZU SKACZE DO obsługi przerwania<br /></div><br /><br />Tu jest pierwszy MEGA BABOL jakiego szukasz w swojej analizie<br /><br />co to znaczy &quot;skacze do osbługi przerwania&quot; .... 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 &quot;skoczyła&quot; do przerwania <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />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.<br /><br />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.<br /><br />[syntax=c]// sprawdzamy czy indeksy są różne<br />    if ( UART_TxHead != UART_TxTail ) { //******************* &lt;---- tu nadajemy dane z bufora<br />    // obliczamy i zapamiętujemy nowy indeks ogona węża (może się zrównać z głową)<br />    UART_TxTail = (UART_TxTail + 1) &amp; UART_TX_BUF_MASK;<br /><br />    // zwracamy bajt pobrany z bufora  jako rezultat funkcji<br />    UDR = UART_TxBuf&#91;UART_TxTail&#93;;<br />    } else {  //******************* &lt;---- tu kończymy nadawać gdy bufor nadawczy jest pusty<br />// zerujemy flagę przerwania występującego gdy bufor pusty<br />UCSRB &amp;= ~(1&lt;&lt;UDRIE);<br />    }[/syntax]<br /><br />widzisz komentarze jakie dodałem z gwiazdkami ???<br /><br />rozumiesz teraz ?<br /><br />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 &quot;pod spodem&quot; bufor cykliczny &quot;SAM SIĘ NADAJE&quot;<br /><br />tak to działa<br /><br />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<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 12 lis 2014, o 23:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2014-11-12T22:53:09+01:00</updated>
<published>2014-11-12T22:53:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103677#p103677</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103677#p103677"/>
<title type="html"><![CDATA[Re: Budor nadawczy do UArt'a - wyjaśnienie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103677#p103677"><![CDATA[
mokrowski Dziękuję Ci serdecznie!<br />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)<br /><br />Temat uważam za zamknięty i wyczerapny.<br />Raz jeszcze serdeczne dzięki.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=74">xamrex</a> — 12 lis 2014, o 22:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2014-11-12T22:40:55+01:00</updated>
<published>2014-11-12T22:40:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103672#p103672</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103672#p103672"/>
<title type="html"><![CDATA[Re: Budor nadawczy do UArt'a - wyjaśnienie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103672#p103672"><![CDATA[
<div class="quotetitle">jacekk232 napisał(a):</div><div class="quotecontent"><br />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.<br /></div><br />Z tym się NIE ZGADZAM!!<br /><br />Bo przecież program czeka tak czy siak!<br />Jeśli używamy bufora nadawczego, to tak i tak czekamy!<br />(Proszę powiedzieć gdzie się niby mylę)<br /><br />Jeszce raz podaje moje rozumowanie:<br />Więc mamy <br />[syntax=c]int main (void){<br />    uart_puts(&quot;NAPIS&quot;);<br />    }[/syntax]<br /><br />Załóżmy że prędkość to nawet 1 bps. to tak czy siak będę MUSIAŁ CZEKAĆ, bo:<br /><br />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,<br />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')...<br />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..<br /><br />Gdzie tu jest błąd?<br />W skrócie <br />Wydaje mi się, że dopiero po wysłaniu pioerwszej literki &quot;N&quot;, (czyli po skończeniu obsługi przerwania) program wróci do funkcji putc i dodaj literkę &quot;A&quot; do bufora i od razu skoczy do funkcji przerwania.. wiec nie da się naraz mieć w buforze więcej niż 2 literek?!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=74">xamrex</a> — 12 lis 2014, o 22:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-11-12T22:33:31+01:00</updated>
<published>2014-11-12T22:33:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103670#p103670</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103670#p103670"/>
<title type="html"><![CDATA[Re: Budor nadawczy do UArt'a - wyjaśnienie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103670#p103670"><![CDATA[
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ą.<br /><br />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. <br /><br />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.<br /><br />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.<br /><br />Ja tak to rozumiem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 12 lis 2014, o 22:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2014-11-12T22:33:19+01:00</updated>
<published>2014-11-12T22:33:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103669#p103669</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103669#p103669"/>
<title type="html"><![CDATA[Re: Budor nadawczy do UArt'a - wyjaśnienie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103669#p103669"><![CDATA[
MirkoT nic mnie nie zrozumiałeś. Twoja odpowiedź mnie nie satysfakcjonuje.<br />Poczekam co odpowie MIrek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=74">xamrex</a> — 12 lis 2014, o 22:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2014-11-12T22:08:57+01:00</updated>
<published>2014-11-12T22:08:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103664#p103664</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103664#p103664"/>
<title type="html"><![CDATA[Re: Budor nadawczy do UArt'a - wyjaśnienie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103664#p103664"><![CDATA[
No a po co są przerwania?<br />Właśnie po to żeby nie czekać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br />Tylko program główny wrzucił wszystko do bufora i robi<br />swoje.<br />A po zgłoszeniu przerwania, na które przecież nie czeka, obsługuje je<br />wrzucając do wysłania kolejny znak z buforka i znowu zajmuje się zwoimi<br />&gt;bardzo ważnymi&lt; sprawami<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=189">MirkoT</a> — 12 lis 2014, o 22:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2014-11-12T22:04:00+01:00</updated>
<published>2014-11-12T22:04:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103663#p103663</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103663#p103663"/>
<title type="html"><![CDATA[Re: Budor nadawczy do UArt'a - wyjaśnienie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103663#p103663"><![CDATA[
Nie zagmatwałem się..<br />Chyba trudno mi to wytłumaczyć..<br />Przeciez rozważamy string NAPIS.<br /><br />Więc mamy <br />[syntax=c]int main (void){<br />    uart_puts(&quot;NAPIS&quot;);<br />    }[/syntax]<br /><br />Załóżmy że prędkość to nawet 1 bps. to tak czy siak będę MUSIAŁ CZEKAĆ, bo:<br /><br />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,<br />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')...<br />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..<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=74">xamrex</a> — 12 lis 2014, o 22:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-11-12T21:57:14+01:00</updated>
<published>2014-11-12T21:57:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103660#p103660</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103660#p103660"/>
<title type="html"><![CDATA[Re: Budor nadawczy do UArt'a - wyjaśnienie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103660#p103660"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Więc tak czy siak chyba będe musiał czekać?!<br /></div><br />no ale teraz sam się chyba zakręciłeś <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> co ? przecież pytałeś co daje buforowanie w porównaniu do wysyłania bez buforowania....<br /><br />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 ?<br /><br />wtedy zobaczysz że co z tego że przerwanie łyknęło pierwszy znak .... a co panie z kolejnymi ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 12 lis 2014, o 21:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2014-11-12T21:52:24+01:00</updated>
<published>2014-11-12T21:52:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103655#p103655</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103655#p103655"/>
<title type="html"><![CDATA[Re: Budor nadawczy do UArt'a - wyjaśnienie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103655#p103655"><![CDATA[
No Mirku, ale przecież przerwanie  ISR( USART_UDRE_vect) nie leci RÓWNOLEGLE  z programem głównym?<br />Więc dopiero będzie można powrócić do funkcji  uart_putc po skończeniu się funckji/przerwania    ISR( USART_UDRE_vect)<br /><br />Więc tak czy siak chyba będe musiał czekać?!<br /><br />##############################<br />Przeciez nie wykona się funkcja uart_putc('A'); dopóki nie wrócimy z funkcji przerwania ISR( USART_UDRE_vect)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=74">xamrex</a> — 12 lis 2014, o 21:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-11-12T21:48:44+01:00</updated>
<published>2014-11-12T21:48:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103651#p103651</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103651#p103651"/>
<title type="html"><![CDATA[Re: Budor nadawczy do UArt'a - wyjaśnienie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103651#p103651"><![CDATA[
no widzisz <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> po to podałem ten przypadek bo ty się zapętlasz panie w swoim punkcie 2a<br /><br />oblicz sobie ile CZASU zajmie transmisja znaku z prędkością 300 bps <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> 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<br /><br />a poza tym zwróć też uwagę na to co wyżej napisał kolega mokrowski bo to kolejne istotne aspekty<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 12 lis 2014, o 21:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2014-11-12T21:36:58+01:00</updated>
<published>2014-11-12T21:36:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103644#p103644</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103644#p103644"/>
<title type="html"><![CDATA[Re: Budor nadawczy do UArt'a - wyjaśnienie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103644#p103644"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> hmmm?<br /></div><br />Dzięki Mirku, za to że Akurat ty odpisałeś.<br />ale dalej nie rozumiem,<br />Nawet gdybym miał Baudrate=300 to co?<br /><br />Rozważmy przypadek użycia bufora nadawczego.<br />[syntax=c]int main (void){<br />uart_puts(&quot;NAPIS&quot;);<br />}[/syntax]<br />To ja to widzę tak:<br />1.Obsługiwana jest funkcja  uart_putc('N');<br />  1a.Czyli jest do  tablicy  UART_TxBuf dodawana literka 'N' <br />  1b.Ustawiamy falgę przerwania  UCSRB |= (1&lt;&lt;UDRIE);<br />2.Zaraz po tym jest realizowana funkcja przerwania  ISR( USART_UDRE_vect)<br />  2a.Która wysyła literkę 'N&quot;<br />3.Teraz jes powrót do funkcji uart_puts<br />4 i jest realizowana funkcja uart_putc('A')<br />   4a.Czyli jest do  tablicy  UART_TxBuf dodawana literka 'A' <br />   4b.Ustawiamy falgę przerwania  UCSRB |= (1&lt;&lt;UDRIE);<br />5.Zaraz po tym jest realizowana funkcja przerwania  ISR( USART_UDRE_vect)<br />   5a.Która wysyła literkę 'A&quot;<br />6.Teraz jes powrót do funkcji uart_puts<br /><br />No więc w jaki sposób zapełnić ten buforek, skoro od razu jest realizowane przerwanie?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=74">xamrex</a> — 12 lis 2014, o 21:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-11-12T21:27:43+01:00</updated>
<published>2014-11-12T21:27:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103639#p103639</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103639#p103639"/>
<title type="html"><![CDATA[Re: Budor nadawczy do UArt'a - wyjaśnienie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103639#p103639"><![CDATA[
<div class="quotetitle">xamrex napisał(a):</div><div class="quotecontent"><br />ale chyba nie do końca rozumiem bufor nadawczy.<br /></div><br />No nie do końca rozumiesz <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />powiem krótko - spowalniać nic nie spowalnia <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... 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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> hmmm?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 12 lis 2014, o 21:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xamrex]]></name></author>
<updated>2014-11-12T21:20:28+01:00</updated>
<published>2014-11-12T21:20:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103636#p103636</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103636#p103636"/>
<title type="html"><![CDATA[Budor nadawczy do UArt'a - wyjaśnienie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9213&amp;p=103636#p103636"><![CDATA[
Hej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br />Mam pytanie odnośnie bufora NADAWCZEGO w obsłudze RS'a<br />Dokładnie to odnośnie jego 'użyteczności i przydatności'<br />Na wstępnie dodam, że bufor odbiorczy to naprawdę świetna sprawa, ale chyba nie do końca rozumiem bufor nadawczy.<br /><br />załóżmy, że chcemy wysłać stringa<br />[syntax=c]uart_puts(&quot;NAPIS&quot;);<br /><br />void uart_puts(char *s)// wysyła łańcuch z pamięci RAM na UART<br />{<br />  register char c;<br />  while ((c = *s++)) uart_putc(c);// dopóki nie napotkasz 0 wysyłaj znak<br />}<br /><br />void uart_putc( char data ) {<br />uint8_t tmp_head;<br /><br />    tmp_head  = (UART_TxHead + 1) &amp; UART_TX_BUF_MASK;<br /><br />          // pętla oczekuje jeżeli brak miejsca w buforze cyklicznym na kolejne znaki<br />    while ( tmp_head == UART_TxTail ){}<br /><br />    UART_TxBuf&#91;tmp_head&#93; = data;<br />    UART_TxHead = tmp_head;<br /><br />    // inicjalizujemy przerwanie występujące, gdy bufor jest pusty, dzięki<br />    // czemu w dalszej części wysyłaniem danych zajmie się już procedura<br />    // obsługi przerwania<br />    UCSRB |= (1&lt;&lt;UDRIE);<br />}[/syntax]<br />No i teraz to wg. mojego rozumowania wysyłany jest do bufora jest dodawany 1 char i OD RAZU leci przerwanie <strong>ISR( USART_UDRE_vect)</strong>, które wysyła ten znak.<br /><br />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&lt;&lt;UDRIE); realizowana jest obsługa przerwania..<br /><br />Generalnie czym się różni obsługa wysłania znaku przez przerwanie od zwykłego chamskiego wysłania np. bez procedury przerwania.<br />Mamy taką funkcję:<br />[syntax=c]void USART_Transmit(unsigned char data){<br />while (!(UCSRA &amp; (1&lt;&lt;UDRE)));<br />UDR=data;<br />}[/syntax]<br /><br />////////////////////////////////////////////////////////////////////<br />Popatrzmy na funkcje do wyslania stringa.<br />Czym się różni, <br />[syntax=c]void uart_puts(char *s)// wysyła łańcuch z pamięci RAM na UART<br />{<br />  register char c;<br />  while ((c = *s++)) uart_putc(c);// dopóki nie napotkasz 0 wysyłaj znak<br />}[/syntax]<br />od<br /><br />[syntax=c]void uart_puts(char *s)// wysyła łańcuch z pamięci RAM na UART<br />{<br />  register char c;<br />  while ((c = *s++)) USART_Transmit(c);// dopóki nie napotkasz 0 wysyłaj znak<br />}[/syntax]<br /><br />Wg.mnie oba przypadki będą działały tak samo, a nawet ta bez obsługi przerwań SZYBCIEJ!<br />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. <br /><br />Chodzi mi o to, że bufor ODBIORCZY, to rzeczywiście ma SENS, ale nie potrafię sie doszukać sensu użycia bufora nadawczego.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=74">xamrex</a> — 12 lis 2014, o 21:20</p><hr />
]]></content>
</entry>
</feed>