<?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=58&amp;t=20965&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-07-09T17:58:17+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=20965&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-07-09T17:58:17+01:00</updated>
<published>2018-07-09T17:58:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209616#p209616</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209616#p209616"/>
<title type="html"><![CDATA[Re: Bufor cykliczny - proste pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209616#p209616"><![CDATA[
no ale taka nauka w twoim wydaniu to coś pięknego <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... podoba mi się takie analityczne podejście a jeszcze na dodatek umiejętne zadawanie pytań itp<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 lip 2018, o 17:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MateuszS]]></name></author>
<updated>2018-07-09T15:13:42+01:00</updated>
<published>2018-07-09T15:13:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209612#p209612</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209612#p209612"/>
<title type="html"><![CDATA[Re: Bufor cykliczny - proste pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209612#p209612"><![CDATA[
Nie do końca rozumiem jak miałbym dokonać zmian na podstawie tego kodu, który napisałeś na szybko, więc raczej test będę musiał zostawić Tobie ;/. Natomiast dziękuje za odpowiedź, bo już wyrywałem sobie włosy z głowy. Wracam do dalszego analizowania bufora, bo dopiero się tego uczę <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=19707">MateuszS</a> — 9 lip 2018, o 15:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-07-09T14:40:39+01:00</updated>
<published>2018-07-09T14:40:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209611#p209611</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209611#p209611"/>
<title type="html"><![CDATA[Re: Bufor cykliczny - proste pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209611#p209611"><![CDATA[
<div class="quotetitle">MateuszS napisał(a):</div><div class="quotecontent"><br />Head załaduje pierwszą wartość do UART_TxBuf[1]<br /></div><br />ale ja się nie kłócę - a też tak troszkę z pamięci piszę, ale masz rację, zapisanych zostanie 7 bajtów do bufora a nie 8 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> chyba trzeba byłoby lekko ten kod przerobić czyli w przerwaniu dać<br /><br /><br />[syntax=c]default : UART_RxBuf&#91;UART_RxHead&#93; = data; UART_RxHead = tmp_head;[/syntax]<br /><br />ale w odczycie (przy pobieraniu znaku z bufora w funkcji uart_getc() ) też trzeba byłoby lekko zmienić, np tak:<br /><br />[syntax=c]ATOMIC_BLOCK( ATOMIC_RESTORESTATE ) {<br />        // zwracamy bajt pobrany z bufora  jako rezultat funkcji<br />        data = UART_RxBuf&#91;UART_RxTail&#93;;<br />        // obliczamy i zapamiętujemy nowy indeks „ogona węża” (może się zrównać z głową)<br />        UART_RxTail = (UART_RxTail + 1) &amp; UART_RX_BUF_MASK;<br />    }[/syntax]<br /><br />aha i jeszcze przerwanie ISR( USART_UDRE_vect)<br /><br />w nim też trzeba byłoby nieco przemeblować <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><br />[syntax=c]if ( UART_TxHead != UART_TxTail ) {<br />    // zwracamy bajt pobrany z bufora  jako rezultat funkcji<br />#ifdef UART_DE_PORT<br />    UART_DE_NADAWANIE;<br />#endif<br />    UDR = UART_TxBuf&#91;UART_TxTail&#93;;<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 />    } else {[/syntax]<br /><br /><br />ale to też teraz tak piszę na szybko i z głowy ... i cieszę się, że zasygnalizowałeś ten problem - dziękuję. Jeśli akurat jesteś przy tym kodzie i możesz to sprawdzić to byłoby super. Ja sprawdzę nieco później i jeśli będzie ok - to dodam to gdzieś do uaktualnień do książki na stronie atnel<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 lip 2018, o 14:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MateuszS]]></name></author>
<updated>2018-07-09T14:21:04+01:00</updated>
<published>2018-07-09T14:21:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209610#p209610</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209610#p209610"/>
<title type="html"><![CDATA[Re: Bufor cykliczny - proste pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209610#p209610"><![CDATA[
Dzięki za odpowiedź i dodatkowe przykłady. <br />Natomiast według tego co opisałem(moje rozumowanie) i co umieściłem na rysunku - w tablicy 8 bajtowej zostaje zawarte tylko 7 bajtów. <strong>Head załaduje pierwszą wartość do UART_TxBuf[1]</strong>, a po zrobieniu pętli(czyli załadowaniu siedmiu bitów) nie będzie mógł załadować 8 bajtu do UART_TxBuf[0], ze względu na kod, który umieściłeś. Tutaj gdzieś leży problem w moim rozumowaniu i wierze Ci na słowo, że się da - nie chodzi mi o to żeby się kłócić broń Boże :]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=19707">MateuszS</a> — 9 lip 2018, o 14:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-07-09T13:46:52+01:00</updated>
<published>2018-07-09T13:46:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209607#p209607</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209607#p209607"/>
<title type="html"><![CDATA[Re: Bufor cykliczny - proste pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209607#p209607"><![CDATA[
A widział kolega w Bluebooku fragment kodu z przerwania? ten dokładnie <br /><br /><br />[syntax=c]// sprawdzamy, czy wąż nie zacznie zjadać własnego ogona<br />    if ( tmp_head == UART_RxTail ) {<br />    // tutaj możemy w jakiś wygodny dla nas sposób obsłużyć  błąd spowodowany<br />    // próbą nadpisania danych w buforze, mogłoby dojść do sytuacji gdzie<br />    // nasz wąż zacząłby zjadać własny ogon<br />    } else {[/syntax]<br /><br /><br />on spowoduje, że Head NIGDY się nie przesunie na TAIL i trzeba sobie ew samemu to oprogramować - bo inaczej po prostu kolejne nadsyłane bajty pójdą w kosmos. OCZYWIŚCIE bufor pomieści 8 bajtów tak jak sam to rozpisałeś - a nie 7 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Przecież nawet na twoim rysunku widać, że upchałeś tam 8 bajtów za to 9-ty już nie wlezie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Dlatego też wielkość bufora należy dobierać do potrzeb, czyli tak aby mieścił on MINIMALNIE jedną ramkę którą chcesz przesyłać, ale jeśli te ramki mają szybko sobie że tak powiem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> popierniczać ... no to może zabraknąć tego bufora prawda ? czyli co dalej zrobić ?<br /><br />1. albo zwiększyć bufor tak aby zmieściło się N-ramek więcej (to w zależności od tego ile masz wolnego RAM'u)<br />2. albo stosować krótsze ramki<br /><br />albo trzecie wyjście - stosować na raz dwa punkty wyżej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 6 minutach ]</span></strong><br /><br />krótko mówiąc tak trzeba projektować swój system wymiany danych aby zoptymalizować ilość i czas przesyłanych danych w stosunku do możliwości jak chodzi o przeznaczenie iluś tam bajtów pamięci RAM.<br /><br />No i bodajże NAAAJWAŻNIEJSZE - stosując to podejście NIGDY ale to NIGDY nie można już stosować blokującego sposobu pisania funkcji. Wszystko MUSI BYĆ NIEBLOKUJĄCE.<br /><br />Dla typowych komend AT - no powiedzmy o długości do kilkunastu bajtów, jak ustawisz wielkość bufora na np 64 albo na 128 i masz wszystko ładnie nieblokująco napisane to możesz spać spokojnie. Jeśli ramki (komendy AT będą dużo dłuższe np kilkadziesiąt znaków - to daj sobie bufor 256) a jeśli i ten będzie za mały bo ramki będą z jakiegoś urządzenia GPS np grubo ponad 100 bajtów no to wtedy musisz przerobić sobie całą obsługę tak aby bufor cykliczny mógł liczyć sobie więcej bajtów niż 256 jak w tym wypadku.<br /><br />No ale to takie gdybanie - lepiej jak byś napisał co konkretnie chcesz uzyskać - wtedy byłoby łatwiej pomóc.<br /><br />A zakładając że tylko pytałeś żeby zrozumieć - to mam nadzieję, że ten fragment kodu i wyjaśnienie na początku dało ci jakiś lepszy ogląd sytuacji.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 lip 2018, o 13:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MateuszS]]></name></author>
<updated>2018-07-09T12:48:26+01:00</updated>
<published>2018-07-09T12:48:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209603#p209603</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209603#p209603"/>
<title type="html"><![CDATA[Bufor cykliczny - proste pytanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20965&amp;p=209603#p209603"><![CDATA[
Hej,<br /><br />wyposażyłem się w BB i ogólne działanie bufora cyklicznego rozumiem, natomiast mam problem z wizualizacją tego/wyobrażeniem sobie poruszania się tych wskażników Head i Tail.<br />Z góry proszę o wyrozumiałość, jeżeli popełniam straszny błąd. Trochę nad tym już siedzę i nie umiem tego do końca pojąć<br />Fragment zapisu danych do bufora w przerwaniu odbiorczym z BB:<br /><br /><br />zakładam dla prostoty, że bufor ma 8bajtów, czyli:<br />[syntax=c]#define UART_RX_BUF_SIZE 8 // definiujemy bufor o rozmiarze 8 bajtów<br />#define UART_RX_BUF_MASK ( UART_RX_BUF_SIZE - 1) // definiujemy maskę dla naszego bufora<br />volatile char UART_RxBuf&#91;UART_RX_BUF_SIZE&#93;;<br /><br />volatile uint8_t UART_RxHead; // indeks oznaczający „głowę węża”<br />volatile uint8_t UART_RxTail; // indeks oznaczający „ogon węża”[/syntax]<br /><br /><br />Początkowo zarówno Head i Tail są równe(bufor jest pusty), czyli wskazują na np. UART_RxBuf[0]. Jeżeli zostaje coś zapisane do bufora to wykonuje się ta znana funkcja:<br />[syntax=c]ISR( USART_RXC_vect ) {<br /><br />    uint8_t tmp_head;<br />    char data;<br /><br />    data = UDR; //pobieramy natychmiast bajt danych z bufora sprzętowego<br /><br />    // obliczamy nowy indeks „głowy węża”<br />    tmp_head = ( UART_RxHead + 1) &amp; UART_RX_BUF_MASK;                             // &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;-------- Najważniejsza linijka<br /><br />    // sprawdzamy, czy wąż nie zacznie zjadać własnego ogona<br />    if ( tmp_head == UART_RxTail ) {<br /> // ew obsluga problemu<br />    } else {<br />UART_RxHead = tmp_head; // zapamiętujemy nowy indeks<br />UART_RxBuf&#91;tmp_head&#93; = data; // wpisujemy odebrany bajt do bufora<br />    }[/syntax]<br /><br />Moje rozumowanie: Jeżeli zostanie załadowany jakiś bajt do bufora to zostanie on załadowany do UART_TxBuf[1], ze względu na zwiększony o +1 indeks Head. Gdy zostanie załadowany nie jeden, a siedem bajtów to załadowane zostaną te bajty do:<br />UART_RxBuf[1], UART_RxBuf[2],UART_RxBuf[3].....UART_RxBuf[7]. Rozumiem działanie maskowania, które spowoduje, że przy próbie załadowania kolejnego bajtu wskaźnik nam powróci na początek i będzie wskazywał na UART_RxBuf[0]. <br /><br /><strong>PYTANIE</strong>: Załóżmy, że pętla główna programu była ciągle zajęta i program nie zdążył odczytać żadnego bajtu z bufora, więc wskaźnik TAIL stale wskazuje na UART_RxBuf[0]. Wydaje się, że w tym momencie wskazują na to samo miejsce w tablicy bufora, więc nie będzie można załadować tego kolejnego bajtu, ale przecież załadowaliśmy tylko 7 bajtów do bufora 8 bajtowego pozostawiając UART_RxBuf[0] pusty. Oznacza to, że tak naprawdę możemy załadować tylko 7 bajtów do bufora 8 bajtowego? Gdzie w moim rozumowaniu jest błąd?<br /><br /><a href="https://obrazkiforum.atnel.pl/19707/6804d788428a47c0c8b1346630965e82.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/19707/6804d788428a47c0c8b1346630965e82.png" alt="Obrazek" /></a><br /><br />Dla dopełnienia dodam tylko, że funkcja odbiorcza pierwsze co robi to sprawdza, czy Head i Tail sa sobie rowne - jeżeli tak, to uważa, że bufor jest pusty.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=19707">MateuszS</a> — 9 lip 2018, o 12:48</p><hr />
]]></content>
</entry>
</feed>