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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-05-14T11:04:30+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=3105&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-05-14T11:04:30+01:00</updated>
<published>2013-05-14T11:04:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36893#p36893</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36893#p36893"/>
<title type="html"><![CDATA[Re: usart po raz kolejny]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36893#p36893"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Nie wiem, jak się zamyka temat...<br /></div><br /><br />Na naszym forum nie ma takich rzeczy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 14 maja 2013, o 11:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[min]]></name></author>
<updated>2013-05-14T11:00:43+01:00</updated>
<published>2013-05-14T11:00:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36892#p36892</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36892#p36892"/>
<title type="html"><![CDATA[Re: usart po raz kolejny]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36892#p36892"><![CDATA[
Okazało się, że problem był jednak w sprzęcie, a ściślej mówiąc w transmisji RS485. Dawno temu, na potrzeby jakiejś aplikacji (chciałem odbierać dane z jednego układu i posyłać je wraz z innymi danymi do innego układu a miałem tylko jeden USART - nie chciałem w tamtym konkretnym przykładzie stosować UARTA'a programowego) trochę na zasadzie &quot;ciekawe, czy się uda&quot; połączyłem bezpośrednio dwa transcivery MAX232 oraz MAX485. To znaczy, do pinu RXD procesora podłączyłem jednocześnie piny RX MAX485 i MAX232 a do TXD procka odpowiednie piny Max'ow. Układ działał (zresztą pracuje do dziś), tyle tylko, że należało restrykcyjnie pilnować sterowania w odpowiednich momentach pinami sterującymi &quot;485&quot; - stan tego pinu miał także wpływ na możliwości pracy MAX232. Tutaj to przeoczyłem, stąd problemy, o których pisałem na początku.<br /><br />Czyli &quot;od... się pan od mojego programu&quot; mógłby powiedzieć Mirek i miałby rację.<br />Wracam do wskaźników, bo przy okazji szukania błędów w programie zobaczyłem swoje braki.<br /><br /><br /><br /><br /><br />     <br /><br />Nie wiem, jak się zamyka temat...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1317">min</a> — 14 maja 2013, o 11:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-05-13T21:26:12+01:00</updated>
<published>2013-05-13T21:26:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36873#p36873</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36873#p36873"/>
<title type="html"><![CDATA[Re: usart po raz kolejny]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36873#p36873"><![CDATA[
<div class="quotetitle">min napisał(a):</div><div class="quotecontent"><br />bo sucha teoria trudniej do mnie trafia<br /></div><br /><br />No ale ja właśnie suchej teorii jak widzisz mało napisałem w niebieskiej książce - za to ZDECYDOWANIE przeniosłem przykłady do części praktycznej czyli do rozdziałów warsztatowych - tam gdzie piszemy przykładowe różne biblioteki .... tylko czasem czytelnicy pomijają sobie co niektóre rozdziały sądząc, że ja po prostu zaparłem się aby komuś na siłę pokazać jak zrobić sobie np samemu obsługę do: LCD, multipleksowania, RC5 itp itd<br /><br />tymczasem jest CAŁKIEM INACZEJ - ponieważ do mnie też o wiele lepiej trafia praktyka niż sucha teoria to postanowiłem tą teorię przekazywać przy okazji na ciekawych przykładach - dlatego warto czytać po kolei te wszystkie rozdziały i z niebieskiej i zielonej książki bo uwierz mi, że po kolei robię TYLE ćwiczeń tzn jak najwięcej żeby na końcu drugiej (zielonej) książki przejść do fajnej obsługi UART'a <br /><br />Jak widzisz nie przypadkowo jest to OSTATNI rozdział <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> nie przypadkowo <br /><br />ale w miarę czytania i ćwiczenia wskaźników śmiało pytaj ... bo to warto jak najszybciej zaskoczyć a przynajmniej ich dobre podstawy<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 maja 2013, o 21:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[min]]></name></author>
<updated>2013-05-13T20:24:27+01:00</updated>
<published>2013-05-13T20:24:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36862#p36862</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36862#p36862"/>
<title type="html"><![CDATA[Re: usart po raz kolejny]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36862#p36862"><![CDATA[
Dzięki za tak szybki odzew.<br /><br />   Już po wysłaniu tej wiadomości przyszło mi do głowy, że powtórzenie tego warunku sprawia, że funkcja jest bardziej uniwersalna i może ktoś chcieć jej użyć w inny sposób niż przez to zdarzenie.<br />   W bibliotekach z książki trochę grzebałem i nie jestem pewien, czy czegoś tam nie zepsułem, dlatego je zamieściłem.<br />Z tym buforem i wskaźnikiem do niego od razu coś mi nie pasowało. Pomyślę jeszcze o tym. Ze wskaźnikami u mnie faktycznie bardzo kiepsko,  miałem nadzieję zacząć coś ćwiczyć na żywym organiźmie, bo sucha teoria trudniej do mnie trafia. W masterze, który będzie musiał rozebrać te dane i reagować odpowiednimi akcjami na poszczególne temperatury, nie obejdzie się bez szczególowego zrozumienia Twojego pliku AT.c i funkcji, o których piszesz. Tutaj zasugerowałem się faktem, że na początku tego pliku, zanim jeszcze zaczynasz parsować zawartość bufora, wysyłasz<br />jego zawartość na LCD prostym poleceniem lcd_str(pBuf) - myślałem, że skoro można go tak po prostu wyświetlić (a także - sprawdziłem to - wysłać na terminal poleceniem uart_puts(pBuf)), to również można go w prosty sposób porównywać. To jest proste urządzenie (w Bascomie poszło mi z nim bardzo łatwo) i miałem nadzieję &quot;szybko&quot; to załatwić, żeby mieć układ wysyłający dane, które już w masterze móglbym szczegółowo rozgryzać, analizować i parsować z wykorzystaniem specjalistycznych funkcji. Widzę, że niezbędne będzie to &quot;rozgryzanie&quot; już w tym slavie.<br />Jeszcze poczytam i odezwę się.<br /><br />pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1317">min</a> — 13 maja 2013, o 20:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-05-13T18:05:36+01:00</updated>
<published>2013-05-13T18:05:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36842#p36842</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36842#p36842"/>
<title type="html"><![CDATA[Re: usart po raz kolejny]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36842#p36842"><![CDATA[
<div class="quotetitle">min napisał(a):</div><div class="quotecontent"><br />Nie wiem np. po co w funkcji &quot;..get_str&quot; jest warunek <br /><br />if( ascii_line )...<br /></div><br /><br />jest właśnie po to, że można tą funkcję get_str() używać niezależnie albo nawet bez wywoływania zdarzenia USART_EVENT() rozumiesz ? <br /><br />pomyśl - gdy nie używaż ZDARZENIA, a tylko get_str() ... to jeśli nic nie pojawiło się w buforze - to po co ma coś być sprawdzane ? następuje od razu opuszczenie funkcji. Dopiero gdy pojawiła się linia (ramka) to funkcja ładnie zareaguje i zwróci ci odebraną linię<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 6 minutach ]</span></strong><br /><br />[syntax=c]/* a tutaj na razie takie parsowanie, na jakie mnie w tej chwili stać - w Bascomie to było łatwiejsze - stringi */  <br /> <br />  if (bufor&#91;0&#93;=='R' &amp;&amp; bufor&#91;1&#93;== 'O' &amp;&amp; bufor&#91;2&#93;== 'K') pomiar_temperatur(); // jeśli master wyśle ciąg &quot;ROK&quot;[/syntax]<br /><br />No widzisz ... po PIERWSZE masz do tej funkcji ładnie przekazany wskaźnik bufora *pBuf a ty posługujesz się niepotrzebnie tablicą bufor[] <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />Po DRUGIE - twoje kłopoty ze zrozumieniem działania tego parsowania wcale mnie nie dziwią, bo to co robisz wyżej świadczy, że troszkę rzuciłeś się na zbyt głęboką wodę .... i na razie w ogóle nie rozumiesz wskaźników <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> ..... więc nie dziw się, że tu wszystko wydaje ci się obce i niezrozumiałe <br /><br />gdybyś po drodze czyli dużo wcześniej poćwiczył wskaźniki to szybko byś zrozumiał jak porównywać stringi w C , zresztą przykłady masz w zielonej książce w tym rozdziale o parsowaniu - no WŁAŚNIE ale tam jest sporo o wskaźnikach<br /><br />widzisz tam funkcje:<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">strncasecm()<br />strncasecmp_P()<br />strlen()<br />strpbrk()</div><br /><br />i podobne ?<br /><br />przecież to dzięki nim można sobie pięknie porównywać to co wpadło ci do bufora np:<br /><br />[syntax=c]strncasecmp_P(pBuf, PSTR(&quot;ROK&quot;), 3)[/syntax]<br /><br />poczytaj sobie jak działa taka funkcja i podobne ....<br /><br />ale jednak najpierw zabierz się mocniej za wskaźniki i ćwiczenia z pierwszej książki a jak czegoś nie rozumiesz to śmiało pytaj, nawet łap mnie na Skype - zawsze chętnie pomogę jak będziesz miał jakieś konkretne pytanie - zapraszam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 maja 2013, o 18:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[min]]></name></author>
<updated>2013-05-13T17:05:58+01:00</updated>
<published>2013-05-13T17:05:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36837#p36837</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36837#p36837"/>
<title type="html"><![CDATA[usart po raz kolejny]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3105&amp;p=36837#p36837"><![CDATA[
Dzień dobry.<br /> <br />Witam wszystkich - to mój pierwszy post.<br /><br />Usart po raz kolejny, bo przejrzałem chyba wszystkie posty na ten temat, ale wciąż czegoś nie mogę pojąć.<br />Biblioteki Mirka z zielonej książki. Urządzenie pracujące jako slave (kilka lat pracowało bezbłędnie pod Bascomem, teraz w ramach nauki C próbuję przepisywać programy moich urządzeń z Bascoma na C). Jego zadaniem jest odczytywać temperatury z czujników DS1820 (czterech) i na żądanie mastera wysłać wyniki. Będąc na etapie książki niebieskiej, stworzyłem kod pozwalający realizować to zadanie, ale w sposób trochę prymitywny. W pętli głównej jedną z instrukcji było<br />[syntax=c]if(uart_getc()==82)  tutaj_wywołanie_funkcji_wysyłającej();[/syntax]<br /><br />Po zakupie i przeczytaniu książki zielonej chciałem to zrobić prawie jak komendy AT, ale na początek prościej. Układ działa, ale trochę dziwnie. Po resecie mikroprocesora, w odpowiedzi na odpowiedni ciąg znaków z mastera, w buforze pojawiają się na początek dwa przypadkowe znaki (o kodach 67 i 225 a dopiero po nich znaki wysyłane przez mastera). Co ciekawe, jeśli ręcznie zmuszę mastera do wysłania ponownie sekwencji znaków, program zaskakuje i działa dobrze do najbliższego resetu. Tak jest przy komunikacji (po RS485) z masterem. Jeśli podłączam terminal i łącze się po RS232, pierwsze wysłanie odpowiednich znaków nie wywołuje żadnej reakcji, dopiero drugie powoduje &quot;zaskoczenie&quot; programu jak powyżej.<br /><br />Podejrzewam, że problem może być w okolicach funkcji UART_RX_STR_EVENT(char * rbuf), albo uart_getc(void), albo uart_get_str(char * buf), albo w przerwaniu odbiorczym. Nie wiem np. po co w funkcji &quot;..get_str&quot; jest warunek <br /><br />if( ascii_line )... <br /><br /> Przecież funkcja ta jest wywoływana tylko w jednym miejscu (UART_RX_STR_EVENT) pod warunkiem, że &quot;ascii_line&quot; i tak jest różne od zera....?<br /><br />Wstawię tu pełny kod, gdyby komuś chciało się rzucić okiem i coś podpowiedzieć, byłbym wdzięczny.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />//#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdlib.h&gt;<br />//#include &lt;string.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;ds18x20.h&quot;<br />#include &quot;mkuart.h&quot;<br /><br />void wyslij_wyniki(uint8_t x);<br />void pomiar_temperatur(void);<br />void parse_uart_data(char * pBuf);<br /><br /><br />uint8_t czujniki_cnt;/* ilość czujników na magistrali */<br />uint8_t subzero, cel, cel_fract_bits;<br />char bufor&#91;100&#93;;// bufor na potrzeby odebranych danych z UART<br /><br /><br />int main(void) {<br /><br />DDRD |= (1&lt;&lt;3);      /* port magistrali 485 jako wyjście */<br />PORTD &amp;= ~(1&lt;&lt;3);    /* magistrala RS485 &quot;na odbiór&quot; */<br /><br />register_uart_str_rx_event_callback( parse_uart_data );  // callback<br /><br />USART_Init( __UBRR );<br /><br />sei();/* włączamy globalne przerwania */<br /><br />/* sprawdzamy ile czujników DS18xxx widocznych jest na magistrali */<br />czujniki_cnt = search_sensors();<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />_delay_ms(750);<br /><br />while(1) {<br /><br />UART_RX_STR_EVENT(bufor);// zdarzenie odbiorcze UART<br /><br />}<br />}<br /><br /><br />void pomiar_temperatur(void){<br /><br />PORTD |= (1&lt;&lt;3);       // RS485 na nadawanie    <br />_delay_ms(1);        // bez opóźnienia nie chce działać<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) wyslij_wyniki(1);<br /><br />else {<br />     }<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) wyslij_wyniki(2);<br /><br />else {<br />     }<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;2&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) wyslij_wyniki(3);<br /><br />else {<br />     }<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;3&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) wyslij_wyniki(4);<br /><br />else {<br />     }<br /><br />czujniki_cnt = search_sensors();                              <br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );             // po zakończeniu pomiarów wyślij od razu rozkaz do następnych pomiarów - wyniki odbierzesz przy następnej transmisji <br />PORTD &amp;= ~(1&lt;&lt;3);                                             // RS485 na odbiór<br /><br />                            }<br /><br />void wyslij_wyniki(uint8_t x) {<br /><br />uart_puts(&quot;T&quot;);<br />uart_putint(x,10);<br />if(subzero) uart_puts(&quot;=-&quot;);/* jeśli subzero==1 wyślij znak minus (temp. ujemna) */<br />else uart_puts(&quot;=&quot;);      /* jeśli subzero==0 wyślij spację zamiast znaku minus (temp. dodatnia) */<br />uart_putint(cel,10);     /* wyślij temperaturę  */<br />uart_puts(&quot;C &quot;);            /* wyślij znak jednostek (C - stopnie Celsiusza) */<br />if (czujniki_cnt==x){       // jeśli to był ostatni czujnik, ...<br />uart_putc('\r');       // ... wyślij &quot;enter&quot;<br />}<br />      }<br /><br />void parse_uart_data( char * pBuf ) {<br /><br />/* tutaj kilka linijek testów pozwalających zobaczyć zawartość bufora */<br /><br />PORTD |= (1&lt;&lt;3);       // RS485 na nadawanie<br />_delay_ms(1);<br />uart_puts(bufor);<br />uart_puts(&quot; &quot;);<br />uart_putint(ascii_line,10);<br />uart_puts(&quot; &quot;);<br />_delay_ms(5);<br />PORTD &amp;= ~(1&lt;&lt;3);<br /><br />/* a tutaj na razie takie parsowanie, na jakie mnie w tej chwili stać - w Bascomie to było łatwiejsze - stringi */<br /><br />  if (bufor&#91;0&#93;=='R' &amp;&amp; bufor&#91;1&#93;== 'O' &amp;&amp; bufor&#91;2&#93;== 'K') pomiar_temperatur(); // jeśli master wyśle ciąg &quot;ROK&quot;<br />  <br />}[/syntax] <br /><br />W plikach mkuart.c i mkuart.c raczej mało grzebałem, ale na wszelki wypadek:<br /><br /><span style="color: #FF0000">[ posłuchaj zasada i moja prośba jest taka - aby nie publikować na forach bibliotek z książki - no chyba że sam je znacznie przerabiasz ok ? .... mirekk36 ]</span><br /><br /><br />pozdrawiam wszystkich<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1317">min</a> — 13 maja 2013, o 17:05</p><hr />
]]></content>
</entry>
</feed>