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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-12-04T21:45:47+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=9445&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-12-04T21:45:47+01:00</updated>
<published>2014-12-04T21:45:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=107432#p107432</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=107432#p107432"/>
<title type="html"><![CDATA[Re: Atmega 8 max485]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=107432#p107432"><![CDATA[
Program można znacznie uprościć. Nie musisz mieć dodanych opóźnień, ale po wpisaniu do rejestru nadawczego należy sprawdzać flagę TXC, która informuje o wysłaniu bajtu w świat. Flaga UDRE informuje, że bufor nadawczy został opróżniony i teraz bajt jest w wyjściowym rejestrze przesuwnym, ale nie gwarantuje to jeszcze, że został już wysłany. <br />Jak ustawiona zostanie flaga, że coś zostało odebrane to nie ma sensu czekać na zakończenie odbioru. Linie A należy podciągnąć do plusa a linie B do GND w urządzeniu, które pełni rolę mastera inaczej po zwolnieniu linii przez wszystkie urządzenia będą pojawiać się śmieci co w połączeniu z oczekiwaniem na zakończenie odbioru w twojej funkcji powoduje pewnie odbieranie śmieci, które pojawiają się zaraz za znakiem 'A'<br />Proponuję takie poprawki:<br />[syntax=c]#define PORT(x) XPORT(x)<br />#define XPORT(x) (PORT##x)<br /><br />#define PIN(x) XPIN(x)<br />#define XPIN(x) (PIN##x)<br /><br />#define DDR(x) XDDR(x)<br />#define XDDR(x) (DDR##x)<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define RS_BAUD 19200   // prędkość transmisji<br />#define RS_UBRR ((F_CPU+UART_BAUD*8UL) / (16UL*UART_BAUD)-1) //dokladniejszy wzor<br /><br />#define RS485_CONTROL_PORT              B<br />#define RS485_CONTROL_OUTPUT    0<br /><br />// inicjalizacja USART<br />void RS485_init(unsigned int ubrr) {<br />// Ustawienie prędkości transmisji<br />UBRRH = (unsigned char) (ubrr &gt;&gt; 8);<br />UBRRL = (unsigned char) ubrr;<br /><br />// 8 bitów danych, 2 bit stopu,//brak parzystości<br />//UCSRC = (1&lt;&lt;URSEL) | (1&lt;&lt;USBS) | (3 &lt;&lt; UCSZ0);<br />UCSRC = (1 &lt;&lt; URSEL) | (1 &lt;&lt; USBS) | (1 &lt;&lt; UCSZ1) | (1 &lt;&lt; UCSZ0);<br /><br />// Włączenie nadajnika i odbiornika<br />UCSRB = (1 &lt;&lt; RXEN) | (1 &lt;&lt; TXEN) | (1 &lt;&lt; RXCIE);<br /><br />//      ustawienie linii sterującej kierunkiem przepływu danych<br />DDR(RS485_CONTROL_PORT) |= (1 &lt;&lt; RS485_CONTROL_OUTPUT);<br />PORT(RS485_CONTROL_PORT) &amp;= ~(1 &lt;&lt; RS485_CONTROL_OUTPUT);<br /><br />_delay_ms(1);<br />}<br /><br />// wysłanie znaku<br />void RS485_send(unsigned char data) {<br />PORT(RS485_CONTROL_PORT) |= (1 &lt;&lt; RS485_CONTROL_OUTPUT); // ustaw układ max485 w tryb nadawania<br />while (!(UCSRA &amp; (1 &lt;&lt; UDRE)))<br />;<br />UDR = data; //wyślij dane<br />// poczekaj na zakończenie nadawania<br />while (!(UCSRA &amp; (1 &lt;&lt; TXC)))<br />;<br />PORT(RS485_CONTROL_PORT) &amp;= ~(1 &lt;&lt; RS485_CONTROL_OUTPUT); // ustaw układ max485 w tryb odbierania<br />}<br /><br />ISR(USART_RXC_vect) {<br />PORTC ^= (1 &lt;&lt; PC1);<br />char received_byte = UDR;<br />if (received_byte == 'A') {<br />PORTC ^= (1 &lt;&lt; PC0);<br />RS485_send('x'); // odpowiedź dla mastera<br />PORTC ^= (1 &lt;&lt; PC0);<br />}<br />}<br /><br />int main(void) {<br />sei();<br />RS485_init(RS_UBRR);<br />DDRC |= (1 &lt;&lt; PC0) | (1 &lt;&lt; PC1);<br />//PORTC |=(1&lt;&lt;PC0);<br /><br />while (1) {<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 4 gru 2014, o 21:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marzela]]></name></author>
<updated>2014-11-28T17:25:29+01:00</updated>
<published>2014-11-28T17:25:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=106419#p106419</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=106419#p106419"/>
<title type="html"><![CDATA[Re: Atmega 8 max485]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=106419#p106419"><![CDATA[
Poprawiłem kod i podłączenia i teraz mam nawiązane połączenie z procesorem. <br />Problem polega teraz na tym że nie każdy poprawnie wysłany znak 'A' otrzymuję odpowiedź z procesora.<br />Czy to może być spowodowane brakiem zewnętrznego kwarca ?? Czy może jeszcze mój program nie jest prawidłowy ??<br /><br />Poniżej listng<br /><br />[syntax=c]#define PORT(x) XPORT(x)<br />#define XPORT(x) (PORT##x)<br /><br />#define PIN(x) XPIN(x)<br />#define XPIN(x) (PIN##x)<br /><br />#define DDR(x) XDDR(x)<br />#define XDDR(x) (DDR##x)<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define RS_BAUD 19200// prędkość transmisji<br /><br />#define RS_UBRR (F_CPU / 16 / RS_BAUD - 1)<br /><br />#define RS485_CONTROL_PORTB<br />#define RS485_CONTROL_OUTPUT0<br /><br />volatile char received_byte;<br /><br /><br />// inicjalizacja USART<br />void RS485_init(unsigned int ubrr)<br />{<br />// Ustawienie prędkości transmisji<br />UBRRH = (unsigned char)(ubrr &gt;&gt; 8);<br />UBRRL = (unsigned char)ubrr;<br /><br />// 8 bitów danych, 2 bit stopu,//brak parzystości<br />//UCSRC = (1&lt;&lt;URSEL) | (1&lt;&lt;USBS) | (3 &lt;&lt; UCSZ0);<br />UCSRC = (1&lt;&lt;URSEL) | (1&lt;&lt;USBS)| (1&lt;&lt;UCSZ1) | (1 &lt;&lt; UCSZ0);<br /><br />// Włączenie nadajnika i odbiornika<br />UCSRB = (1 &lt;&lt; RXEN) | (1 &lt;&lt; TXEN) | (1&lt;&lt;RXCIE);<br /><br />//ustawienie linii sterującej kierunkiem przepływu danych<br />DDR(RS485_CONTROL_PORT) |= (1&lt;&lt;RS485_CONTROL_OUTPUT);<br />PORT(RS485_CONTROL_PORT) &amp;= ~(1&lt;&lt;RS485_CONTROL_OUTPUT);<br /><br />_delay_ms(1);<br />}<br /><br /><br /><br /><br />// wysłanie znaku<br />void RS485_send(unsigned char data)<br />{<br />PORT(RS485_CONTROL_PORT) |= (1&lt;&lt;RS485_CONTROL_OUTPUT);// ustaw układ max485 w tryb nadawania<br />_delay_ms(10);// dodałem opóźnienie, żeby port zdążył się ustawić, nie wiem czy to jest potrzebne<br /><br /><br /><br />UDR = data;//wyślij dane<br />// poczekaj na zakończenie nadawania<br />while(!(UCSRA &amp; (1&lt;&lt;UDRE)));<br /><br />_delay_ms(30);// dodałem opóźnienie, żeby port zdążył się ustawić, nie wiem czy to jest potrzebne<br />PORT(RS485_CONTROL_PORT) &amp;= ~(1&lt;&lt;RS485_CONTROL_OUTPUT);// ustaw układ max485 w tryb odbierania<br /><br />}<br /><br /><br />// odebranie znaku<br />unsigned char RS485_receive(void)<br />{<br />// poczekaj na odebranie danych<br />while(!(UCSRA &amp; (1&lt;&lt;RXC)));<br />// odbierz dane<br />return UDR;<br />}<br /><br />ISR(USART_RXC_vect)<br />{<br />PORTC ^=(1&lt;&lt;PC1);<br />received_byte = RS485_receive();<br />}<br /><br /><br /><br />int main(void)<br />{<br />sei();<br />RS485_init(RS_UBRR);<br />DDRC |= (1&lt;&lt;PC0)|(1&lt;&lt;PC1);<br />//PORTC |=(1&lt;&lt;PC0);<br /><br />while(1)<br />{<br /><br />if(received_byte == 'A'){<br />cli();<br />PORTC ^=(1&lt;&lt;PC0);<br />RS485_send('x'); // odpowiedź dla mastera<br />received_byte = '0';<br />PORTC ^=(1&lt;&lt;PC0);<br />sei();<br />   }<br /><br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6798">marzela</a> — 28 lis 2014, o 17:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marzela]]></name></author>
<updated>2014-11-27T07:57:31+01:00</updated>
<published>2014-11-27T07:57:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=106166#p106166</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=106166#p106166"/>
<title type="html"><![CDATA[Re: Atmega 8 max485]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=106166#p106166"><![CDATA[
Poprawiłem zgodnie z sugestią<br /><br />[syntax=c]#define PORT(x) XPORT(x)<br />#define XPORT(x) (PORT##x)<br />#define PIN(x) XPIN(x)<br />#define XPIN(x) (PIN##x)<br />#define DDR(x) XDDR(x)<br />#define XDDR(x) (DDR##x)<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define RS_BAUD 19200   // prędkość transmisji<br />#define RS_UBRR (F_CPU / 16 / RS_BAUD - 1)<br />#define RS485_CONTROL_PORT      B<br />#define RS485_CONTROL_OUTPUT   0<br /><br />// inicjalizacja USART<br />void RS485_init(unsigned int ubrr)<br />{<br />   // Ustawienie prędkości transmisji<br />   UBRRH = (unsigned char)(ubrr &gt;&gt; 8);<br />   UBRRL = (unsigned char)ubrr;<br /><br />   // Włączenie nadajnika i odbiornika<br />   UCSRB = (1 &lt;&lt; RXEN) | (1 &lt;&lt; TXEN) | (1&lt;&lt;RXCIE);<br /><br />      //   ustawienie linii sterującej kierunkiem przepływu danych<br />   DDR(RS485_CONTROL_PORT) |= (1&lt;&lt;RS485_CONTROL_OUTPUT);<br />   PORT(RS485_CONTROL_PORT) &amp;= ~(1&lt;&lt;RS485_CONTROL_OUTPUT);<br /><br />   // Ustawienie formatu ramki:<br />   // 8 bitów danych, 2 bit stopu,//brak parzystości<br />   UCSRC = (1&lt;&lt;URSEL) | (1&lt;&lt;USBS) | (3 &lt;&lt; UCSZ0);<br />   //UCSRC = (1&lt;&lt;URSEL) | (1&lt;&lt;USBS)| (1&lt;&lt;UCSZ1) | (1 &lt;&lt; UCSZ0);<br />}<br /><br /><br /><br /><br />   // wysłanie znaku<br />void RS485_send(unsigned char data)<br />{<br />   //PORTC &amp;= ~(1&lt;&lt;PC0);<br />   PORT(RS485_CONTROL_PORT) |= (1&lt;&lt;RS485_CONTROL_OUTPUT);   // ustaw układ max485 w tryb nadawania<br />   _delay_ms(10);   // dodałem opóźnienie, żeby port zdążył się ustawić, nie wiem czy to jest potrzebne<br /><br />   UDR = data;   //wyślij dane<br /><br />   // poczekaj na zakończenie nadawania<br />   while(!(UCSRA &amp; (1&lt;&lt;UDRE)));<br /><br />   PORT(RS485_CONTROL_PORT) &amp;= ~(1&lt;&lt;RS485_CONTROL_OUTPUT);   // ustaw układ max485 w tryb odbierania<br />   PORTC ^= (1&lt;&lt;PC0);<br /><br />}<br /><br /><br />   // odebranie znaku<br />unsigned char RS485_receive(void)<br />{<br />   // poczekaj na odebranie danych<br />   while(!(UCSRA &amp; (1&lt;&lt;RXC)));<br /><br />   // odbierz dane<br />   return UDR;<br />}<br /><br />int main(void)<br />   {<br /><br />   RS485_init(RS_UBRR);<br /><br />   //sei();<br />   DDRC |= (1&lt;&lt;PC0);<br />   PORTC |=(1&lt;&lt;PC0);<br /><br />   while(1)<br />      {<br /><br />         RS485_send('1');<br />         _delay_ms(1000);<br /><br />         }<br />   }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6798">marzela</a> — 27 lis 2014, o 07:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Waldek_jb]]></name></author>
<updated>2014-11-27T02:38:35+01:00</updated>
<published>2014-11-27T02:38:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=106158#p106158</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=106158#p106158"/>
<title type="html"><![CDATA[Re: Atmega 8 max485]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=106158#p106158"><![CDATA[
Pierwsza sprawa to Kolego popraw wstawienie kodu zgodnie z zasadami forum,link: <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic7402.html" >topic7402.html</a><!-- l --><br />wtedy lepiej go czytać.<br />Wyrzuć też ze swojego kodu: #define F_CPU 8000000 tego już się nie stosuje. (normalnie w oczy razi)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1693">Waldek_jb</a> — 27 lis 2014, o 02:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marzela]]></name></author>
<updated>2014-11-27T00:46:46+01:00</updated>
<published>2014-11-27T00:46:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=106150#p106150</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=106150#p106150"/>
<title type="html"><![CDATA[Atmega 8 max485]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9445&amp;p=106150#p106150"><![CDATA[
Witam,<br />Postanowiłem zrobić mój pierwszy projekt oparty o AVR-a i zdecydowałem się na komunikację pomiędzy Atmega8 a PC wykorzystując rs485. <br />Połączenie wygląda tak : pc --&gt;rs232/rs485 ---- &gt; max485----&gt;Atmega8.<br />Poniżej użyty kod, wzorowałem się na przykładach.<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent"> <br /><br /></div><br /><br />Do sterowania wysyłaniem wykorzystuję port PB0. Port PC0 to dioda do debugowania.<br />Atmega8 z wewnętrznym rezonatorem 8MHz.<br />Po uruchomieniu programu dioda sygnalizuje pracę ale nie mogę nawiązać komunikacji na porcie com. Używam RealTerm i brak jest jakiejkolwiek komunikacji.<br /><br />Proszę o pomoc w rozwiązaniu problemu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6798">marzela</a> — 27 lis 2014, o 00:46</p><hr />
]]></content>
</entry>
</feed>