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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-04-18T21:41:50+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=15073&amp;mode</id>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-04-18T21:41:50+01:00</updated>
<published>2016-04-18T21:41:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158870#p158870</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158870#p158870"/>
<title type="html"><![CDATA[Re: UART Atmega8 przesylanie wartosci z ADC i generowanie PW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158870#p158870"><![CDATA[
Niestety kod używany mam w komercyjnych programach i musiałbym wybebeszyć go by móc go udostępnić. Nie wiem czy nie prościej byłoby od początku to napisać. Jak znajdę czas to może coś podrzucę. Ale nie obiecuję <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 18 kwi 2016, o 21:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[RafPe]]></name></author>
<updated>2016-04-17T17:50:27+01:00</updated>
<published>2016-04-17T17:50:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158749#p158749</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158749#p158749"/>
<title type="html"><![CDATA[Re: UART Atmega8 przesylanie wartosci z ADC i generowanie PW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158749#p158749"><![CDATA[
<div class="quotetitle">rskup napisał(a):</div><div class="quotecontent"><br />Stosowanie znaków końca linii jest dobra przy komunikacji z wykorzystaniem liter i cyfr. Lecz jak my przesyłane dowolnych wartości bajtów, to już takie coś nie przejdzie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> Dlatego w poważniejszych rozwiązaniach takie dane się ramkuje wysyłając ramkę typowo w postaci:<br />._______ ______ _____ ______<br />| START | DANE | CRC | STOP |<br />| ______|______|_____|_____|<br />gdzie:<br />   START - wybrany znak oznaczający początek ramki (np. znak ASCII STX)<br />   STOP - wybrany znak oznaczający koniec ramki (np. znak ASCII ETX)<br />   CRC - suma kontrolna liczona według wybranego algorytmu (może być więcej niż jeden bajt, ale jej długość jest stała i ustalona)<br />   DANE - przesyłane dane (dowolna, zmienna liczba bajtów)<br /><br />Aby można było przesłać wartości w danych pokrywające się wartością ze znakami START, STOP wykonuje się tzw. ESCejpowanie. Polega to na tym, że aby wysłać w polu DATA znak o wartości START, wysyła się znak ESC i następnie zanegowany znak START. Tak samo zamiast STOP wysyła się znak ESC i zanegowany znak STOP. Dodatkowo trzeba zrobić jeszcze jedno ESCejpowanie. Aby wysłać znak ESC wysyłamy ESC i zanegowany znak ESC.<br />Dzięki takiej operacji mamy zawsze łatwą synchronizację początku ramki (odebranie znaku START oznacza początek ramki). Wiemy także kiedy jest koniec ramki (odebranie znaku STOP). Oraz możemy przesłać dowolną wartość binarną w polu DATA.<br />A w kodzie odbiorczym wystarczy dodać jedno proste sprawdzenie. Jeżeli otrzymaliśmy znak ESC, to nie dodajemy go do bufora odbiorczego, tylko ustawiamy dodatkowy znacznik. Przy odbiorze bajtu jeżeli mamy znacznik ustawiony to taki bajt dodawany jest do bufora jako zanegowany (wysłany był jako zanegowany, więc podwójna negacja da właściwy znak). I tyle <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Nic więcej nie trzeba dodawać.<br /><br />Jako sumę kontrolną warto stosować sumę, która ma pewną dodatkową właściwość. Chodzi o to by suma wyliczona na bajtach DATA i bajtach samej sumy (pole CRC) dawała zero. Dzięki temu licząc ją na bieżąco przy kolejnym bajcie, jak dojdziemy do znaku STOP, to gdy suma kontrolna jest poprawna, to mamy wartość 0 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Taką właściwość ma np. bardzo popularny algorytm wyliczający sumę kontrolną CRC16.<br /><br />-- <br />Pozdrawiam,<br />Robert<br /></div><br />Fajnie opisane podejście - a masz może do tego juz opracowany kod którym mógłbyś się podzielić ?<br /><br />Sent from my GT-I9506 using Tapatalk<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4344">RafPe</a> — 17 kwi 2016, o 17:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[idzik15]]></name></author>
<updated>2016-04-14T12:18:46+01:00</updated>
<published>2016-04-14T12:18:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158511#p158511</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158511#p158511"/>
<title type="html"><![CDATA[Re: UART Atmega8 przesylanie wartosci z ADC i generowanie PW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158511#p158511"><![CDATA[
Witam.<br /><br />Zdecydowałem się na wykorzystanie tokenów. Z pomocą BB i GB wyszło coś takiego:<br /><br />[syntax=c]int main(void) {<br /><br /><br />PWM();<br /><br />USART_Init(__UBRR);<br /><br />register_uart_str_rx_event_callback( analizuj_dane_rs232 );<br />sei();<br />DDRB |= (1&lt;&lt;PB0) | (1&lt;&lt;PB1); <br /><br />    while(1)<br />    {<br /><br />    UART_RX_STR_EVENT( uart_buf );<br /> <br />}[/syntax]<br />[syntax=c]void analizuj_dane_rs232 (char *buf)<br />{<br />char *wsk;<br /><br />wsk = strtok( buf , &quot;,&quot; );<br /><br />  if ( !strcmp( wsk , &quot;$&quot; ) );<br />  {<br />wsk = strtok( NULL , &quot;,&quot; );<br /><br />if( !strcmp( wsk, &quot;dioda1&quot;) )<br /><br />{wsk = strtok( NULL , &quot;,&quot; );<br /><br />if ( !strcmp( wsk , &quot;zapal&quot;) ) PORTB |= (1&lt;&lt;LED1);<br />if ( !strcmp( wsk , &quot;zgas&quot;) ) PORTB &amp;= ~(1&lt;&lt;LED1);<br />}<br /><br />if( !strcmp( wsk, &quot;dioda2&quot;) )<br /><br />{wsk = strtok( NULL , &quot;,&quot; );<br /><br />if ( !strcmp( wsk , &quot;zapal&quot;) ) PORTB |= (1&lt;&lt;LED2);<br />if ( !strcmp( wsk , &quot;zgas&quot;) ) PORTB &amp;= ~(1&lt;&lt;LED2);<br />}<br /><br />/*if( !strcmp( wsk , &quot;serwo&quot; ) );<br /><br />{<br />wsk = strtok( NULL , &quot;,&quot; );<br /><br />//uint8_t data1 = atoi(&quot;15&quot;);//dziala ze stala<br /> *<br />uint8_t data1 = atoi(wsk);<br />pwm1_get_value(data1);<br /><br />}<br />*/<br />if( !strcmp( wsk , &quot;silnik2&quot; ) );<br /><br />{<br />wsk = strtok( NULL , &quot;,&quot; );<br /><br />uint8_t data2 = atoi(wsk);<br /><br />pwm2_get_value(data2);<br /><br />}<br /><br />if( !strcmp( wsk , &quot;silnik1&quot; ) );<br /><br />{<br />wsk = strtok( NULL , &quot;,&quot; );<br /><br />uint8_t data3 = atoi(wsk);<br /><br />pwm3_get_value(data3);<br /><br />}<br /><br />if( !strcmp( wsk , &quot;silnik0&quot; ) );<br /><br />{<br />wsk = strtok( NULL , &quot;,&quot; );<br /><br />uint8_t data4 = atoi(wsk);<br /><br />pwm4_get_value(data4);<br /><br />}<br /><br />  }[/syntax]<br /><br />Z nadajnika wysyłam coś takiego (narazie stałe wartości w ramach testowania, później będą to odczyty z ADC):<br /><br />[syntax=c]uart_puts( &quot;$&quot; );<br />    uart_puts( &quot;,&quot; );<br />    uart_puts( &quot;serwo&quot; );<br />    uart_puts( &quot;,&quot; );<br />    uart_putint( 25 , 10 );<br />    uart_puts( &quot;\r\n&quot; );<br /><br />    uart_puts( &quot;$&quot; );<br />    uart_puts( &quot;,&quot; );<br />    uart_puts( &quot;silnik2&quot; );<br />    uart_puts( &quot;,&quot; );<br />    uart_putint( 15 , 10 );<br />    uart_puts( &quot;\r\n&quot; );<br /><br />    uart_puts( &quot;$&quot; );<br />    uart_puts( &quot;,&quot; );<br />    uart_puts( &quot;silnik1&quot; );<br />    uart_puts( &quot;,&quot; );<br />    uart_putint( 15 , 10 );<br />    uart_puts( &quot;\r\n&quot; );<br /><br />    uart_puts( &quot;$&quot; );<br />    uart_puts( &quot;,&quot; );<br />    uart_puts( &quot;silnik0&quot; );<br />    uart_puts( &quot;,&quot; );<br />    uart_putint( 10 , 10 );<br />    uart_puts( &quot;\r\n&quot; );<br /><br />/*<br />    if ( !(PINB &amp; 1&lt;&lt;LED1) )<br />        {<br />        uart_puts(&quot;$&quot;);<br />        uart_puts(&quot;,&quot;);<br />        uart_puts(&quot;dioda1&quot;);<br />        uart_puts(&quot;,&quot;);<br />        uart_puts(&quot;zapal&quot;);<br />        uart_puts(&quot;\r\n&quot;);<br />        }<br />    if ( (PINB &amp; 1&lt;&lt;LED1) )<br />        {<br />        uart_puts(&quot;$&quot;);<br />        uart_puts(&quot;,&quot;);<br />        uart_puts(&quot;dioda1&quot;);<br />        uart_puts(&quot;,&quot;);<br />        uart_puts(&quot;zgas&quot;);<br />        uart_puts(&quot;\r\n&quot;);<br />        }<br />    if ( !(PINB &amp; 1&lt;&lt;LED2) )<br />        {<br />        uart_puts(&quot;$&quot;);<br />        uart_puts(&quot;,&quot;);<br />        uart_puts(&quot;dioda2&quot;);<br />        uart_puts(&quot;,&quot;);<br />        uart_puts(&quot;zapal&quot;);<br />        uart_puts(&quot;\r\n&quot;);<br />        }<br />    if ( (PINB &amp; 1&lt;&lt;LED2) )<br />        {<br />        uart_puts(&quot;$&quot;);<br />        uart_puts(&quot;,&quot;);<br />            uart_puts(&quot;dioda2&quot;);<br />            uart_puts(&quot;,&quot;);<br />            uart_puts(&quot;zgas&quot;);<br />            uart_puts(&quot;\r\n&quot;);<br />        }<br />/*[/syntax]<br /><br />Problem polega na tym, że funkcja odbiorcza nie rozróżnia mi (nie wiem czemu) poszczególnych, powiedzmy adresów. <br />To jest:<br /><br />Wysyłam z nadajnika tylko ramkę dla &quot;silnik0&quot;. Odbiornik odbiera, ale nie przypisuje tego &quot;silnikowi0&quot;, a pierwszemu napotkanemu (w funkcji analizuj_dane_rs232), czyli &quot;silnik2&quot;. Reszta komend w nadajniku jest zakomentowana.<br /><br />Z kolei kiedy wyślę tylko komendy dla diody1 i diody2 (lecz komendy dla silników i serwa są zakomentowane) to odbiornik już rozróżnia prawidłowo. Kiedy jednak dodam do tego jeszcze komendę dla np. serwa to już się sypie i serwo dostaje jakiś misz masz.<br /><br />Suma sumarum wydaję mi się, że błąd polega po stronie odbiorczej. Coś chyba nie tak ze wskaźnikiem. No chyba, że nadajnik też miesza bajty, choć mało prawdopodobne.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13563">idzik15</a> — 14 kwi 2016, o 12:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-04-09T19:57:05+01:00</updated>
<published>2016-04-09T19:57:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158166#p158166</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158166#p158166"/>
<title type="html"><![CDATA[Re: UART Atmega8 przesylanie wartosci z ADC i generowanie PW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158166#p158166"><![CDATA[
Stosowanie znaków końca linii jest dobra przy komunikacji z wykorzystaniem liter i cyfr. Lecz jak my przesyłane dowolnych wartości bajtów, to już takie coś nie przejdzie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> Dlatego w poważniejszych rozwiązaniach takie dane się ramkuje wysyłając ramkę typowo w postaci:<br />._______ ______ _____ ______<br />| START | DANE | CRC | STOP |<br />| ______|______|_____|_____|<br />gdzie:<br />   START - wybrany znak oznaczający początek ramki (np. znak ASCII STX)<br />   STOP - wybrany znak oznaczający koniec ramki (np. znak ASCII ETX)<br />   CRC - suma kontrolna liczona według wybranego algorytmu (może być więcej niż jeden bajt, ale jej długość jest stała i ustalona)<br />   DANE - przesyłane dane (dowolna, zmienna liczba bajtów)<br /><br />Aby można było przesłać wartości w danych pokrywające się wartością ze znakami START, STOP wykonuje się tzw. ESCejpowanie. Polega to na tym, że aby wysłać w polu DATA znak o wartości START, wysyła się znak ESC i następnie zanegowany znak START. Tak samo zamiast STOP wysyła się znak ESC i zanegowany znak STOP. Dodatkowo trzeba zrobić jeszcze jedno ESCejpowanie. Aby wysłać znak ESC wysyłamy ESC i zanegowany znak ESC.<br />Dzięki takiej operacji mamy zawsze łatwą synchronizację początku ramki (odebranie znaku START oznacza początek ramki). Wiemy także kiedy jest koniec ramki (odebranie znaku STOP). Oraz możemy przesłać dowolną wartość binarną w polu DATA.<br />A w kodzie odbiorczym wystarczy dodać jedno proste sprawdzenie. Jeżeli otrzymaliśmy znak ESC, to nie dodajemy go do bufora odbiorczego, tylko ustawiamy dodatkowy znacznik. Przy odbiorze bajtu jeżeli mamy znacznik ustawiony to taki bajt dodawany jest do bufora jako zanegowany (wysłany był jako zanegowany, więc podwójna negacja da właściwy znak). I tyle <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Nic więcej nie trzeba dodawać.<br /><br />Jako sumę kontrolną warto stosować sumę, która ma pewną dodatkową właściwość. Chodzi o to by suma wyliczona na bajtach DATA i bajtach samej sumy (pole CRC) dawała zero. Dzięki temu licząc ją na bieżąco przy kolejnym bajcie, jak dojdziemy do znaku STOP, to gdy suma kontrolna jest poprawna, to mamy wartość 0 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Taką właściwość ma np. bardzo popularny algorytm wyliczający sumę kontrolną CRC16.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 9 kwi 2016, o 19:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krafin]]></name></author>
<updated>2016-04-09T19:00:26+01:00</updated>
<published>2016-04-09T19:00:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158164#p158164</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158164#p158164"/>
<title type="html"><![CDATA[Re: UART Atmega8 przesylanie wartosci z ADC i generowanie PW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158164#p158164"><![CDATA[
Najlepszy sposób o ile nie mamy jakiś mega szybkości gdzie każdy bajt się liczy, to przesyłanie wartości tekstem z znacznikiem początku ramki (jakiś znak który na pewno nie będzie użyty w transmisji, np dwukropek) oraz CRC lub jakąś inna sumą kontrolną na końcu. Ramki kończymy wtedy znakiem końca linii lub pilnujemy ścisłych timingów pomiędzy bajtami i mamy piękną i bezproblemową transmisję. W dodatku odpadają wszelkie inne problemy typu little/big endian.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=487">krafin</a> — 9 kwi 2016, o 19:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[karolen]]></name></author>
<updated>2016-04-09T18:57:42+01:00</updated>
<published>2016-04-09T18:57:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158162#p158162</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158162#p158162"/>
<title type="html"><![CDATA[Re: UART Atmega8 przesylanie wartosci z ADC i generowanie PW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158162#p158162"><![CDATA[
Właśnie kończę jeden temat w którym po raz pierwszy w życiu wykorzystywałem UART'a.<br />Mi bardzo pomogły poradniki video Mirka &quot;WIFI232 - programowanie - Part &quot;. Tytuł wskazywałby na moduły wifi, ale na zwykłym kablowym połączeniu działa to identycznie.<br />Tak na szybko podpowiadając w Twoim przypadku najwygodniej byłoby wykorzystać tokeny, które również są omawiane w tych poradnikach.<br />Serdecznie polecam te kilka poradników, tylko dzięki nim ja zrealizowałem swój układ.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6210">karolen</a> — 9 kwi 2016, o 18:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sparrow-hawk]]></name></author>
<updated>2016-04-09T18:27:58+01:00</updated>
<published>2016-04-09T18:27:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158159#p158159</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158159#p158159"/>
<title type="html"><![CDATA[Re: UART Atmega8 przesylanie wartosci z ADC i generowanie PW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158159#p158159"><![CDATA[
Nie rejestr kołowy, a buffor <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br /><br />W tak prostym przypadku, nie używałbym stringów. Skoro odczytujesz dany kanał ADC, to znasz jego numer. Wobec tego proponuję skorzystać z takiej struktury:<br />[syntax=c]struct Data {<br />  uint8_t channel;<br />  uint8_t value;<br />};[/syntax]Następnie wysyłasz taką strukturę przez usart. Odbiornik odbiera dwa bajty, z których pierwszy jest numerem kanału ADC, a drugi wartością.<br />Problemem w takim podejściu może być odpowiednia synchronizacja, bo jeśli z jakiegoś powodu, jeden bajt się straci, to wartości zostaną zamienione ze sobą. A więc należy obudować te dane w bajt lub bajty określające początek i koniec transmisji. <br /><br />Może jeszcze odbiornik odpytywać pierwszy układ o dane z przetwornika. A jeżeli rolą nadajnika jest tylko pomiar, to może warto go zastąpić cyfrowym przetwornikiem A/C.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10614">Sparrow-hawk</a> — 9 kwi 2016, o 18:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ciamciak]]></name></author>
<updated>2016-04-09T13:57:15+01:00</updated>
<published>2016-04-09T13:57:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158136#p158136</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158136#p158136"/>
<title type="html"><![CDATA[Re: UART Atmega8 przesylanie wartosci z ADC i generowanie PW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158136#p158136"><![CDATA[
Jeżeli chcesz analizować więcej niż jeden bajt, to wypadałoby zrobić buforowanie odebranych danych (rejestr kołowy).<br />W BB jest to dobrze opisane.<br />Jak już odbierzesz kompletną komendę (tak żeby program wiedział gdzie jest jej początek i koniec), to analizujesz ją np. funkcjami do porównywania stringów.<br />Np. serwo1=1024 analizujesz do znaku = i wybierasz serwo, później analizujesz do końca(np. do znaku nowej linni, lub końca stringa) i ustawiasz to serwo na zadaną wartość.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1254">ciamciak</a> — 9 kwi 2016, o 13:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[idzik15]]></name></author>
<updated>2016-04-09T13:12:22+01:00</updated>
<published>2016-04-09T13:12:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158135#p158135</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158135#p158135"/>
<title type="html"><![CDATA[UART Atmega8 przesylanie wartosci z ADC i generowanie PWM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15073&amp;p=158135#p158135"><![CDATA[
Witam, <br /><br />Tworzę prosty nadajnik i odbiornik do sterowania wykorzystujący do tego dwie Atmegi8 (po jednej w każdym module). W nadajniku mam potencjometry. Sygnał jest konwertowany przez ADC i następnie wysyłany do odbiornika (przez UART), gdzie generowany jest sygnał PWM do serwomechanizmów. <br /><br />Problem polega na tym żeby odbiornik rozróżniał, z którego potencjometru wysyłana jest wartość i żeby odpowiedni serwomechanizm (a nie inny) tą wartość otrzymał . <br /><br />Myślałem nad jakimś sposobem adresowania każdego potencjometru i póki co najbliżej działający pomysł wygląda tak (fragment kodu): <br />[syntax=c]while(1) //petla glowna<br />    { if ( (PINC &amp; 1&lt;&lt;PC3) )<br />    {<br />    USART_transmit(0b11111111); //wartosc &quot;adresu&quot;<br />    USART_transmit(pwm1); //pwm1 - to wartosc z ADC<br />    }<br /><br />    if ( (PINC &amp; 1&lt;&lt;PC2) )<br />       {<br />       USART_transmit(0b10000001);<br />      USART_transmit(pwm2);<br />       }<br /><br />//kawalek funkcji odbierajacej<br /><br />while (! (UCSRA &amp; (1 &lt;&lt; RXC)) );<br />{<br />receiveData = UDR;<br />                        if (receiveData == 0b11111111)<br />{<br />pwm1 = UDR;<br />}<br />if (receiveData == 0b10000001)<br />{<br />pwm2 = UDR;<br />}[/syntax]<br /><br />Generalnie pomysł polega na tym, że idzie 1 bajt &quot;adres&quot;, następnie 1 bajt &quot;dana&quot;. I tak w kółko. Tylko mam problem z zaimplementowaniem tego. <br /><br />Sam ADC, PWM, UART itd działają OK kiedy przesyłam jedną wartość ( to jest tylko z jednego potencjometru, drugi mam zakomentowany). Kiedy mam oba, to też działa, ale ewidentnie sypią się błędy, bo jednym potencjometrem czasami steruję jednym serwem a czasami dwoma. <br /><br />Za wszelką pomoc i sugestie dzięki<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13563">idzik15</a> — 9 kwi 2016, o 13:12</p><hr />
]]></content>
</entry>
</feed>