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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-12-21T06:22:11+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=19828&amp;mode</id>
<entry>
<author><name><![CDATA[JarekB]]></name></author>
<updated>2017-12-21T06:22:11+01:00</updated>
<published>2017-12-21T06:22:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200889#p200889</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200889#p200889"/>
<title type="html"><![CDATA[Re: rs485]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200889#p200889"><![CDATA[
Przerwanie jest generowane gdy pojawi się cały bajt w rejestrze UDR.<br />Wtedy od razu należy przepisać bajt to jakiegoś buforka i  wyjść z przerwania.<br />Dopiero wtedy mając dane w takim buforze pośrednim, możesz funkcją sprawdzać jakie dane odebrałeś.<br />To co robisz nadaje się do jednego bajtu.<br /><br />A co będzie gdy będziesz chciał odebrać kolejno 10 różnych bajtów?<br />UDR jest  co prawda buforowany, ma dodatkowo dwa lub trzy rejestry do zapisania kolejnych znaków.<br />Czyli stosując Twoją metodę w UDR i buforze będzie na Ciebie czekać 3 bajty <br />Reszta pójdzie w powietrze.<br /><br />(nie pamiętam ilości tych rejestrów dwa są na odbiór trzy na nadawania albo na odwrót)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18188">JarekB</a> — 21 gru 2017, o 06:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mateusz19955]]></name></author>
<updated>2017-12-20T21:45:21+01:00</updated>
<published>2017-12-20T21:45:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200875#p200875</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200875#p200875"/>
<title type="html"><![CDATA[Re: rs485]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200875#p200875"><![CDATA[
Dobrze, można użyć przerwania. Ale czy to nie jest tak, że to przerwanie wykona się gdy już wszystkie dane przyjdą(ustawi się flaga tego przerwania)? Tak jak jest z tym przerwaniem od transmit. A po za tym żeby coś doszło to muszę załączyć ten odbiór. <br />Chyba że źle to rozumiem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3621">mateusz19955</a> — 20 gru 2017, o 21:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[JarekB]]></name></author>
<updated>2017-12-20T18:54:19+01:00</updated>
<published>2017-12-20T18:54:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200860#p200860</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200860#p200860"/>
<title type="html"><![CDATA[Re: rs485]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200860#p200860"><![CDATA[
Konwerter 485 &gt;&gt; USB od 7,49 na alledrogo<br />PuTTY                       za darmo<br />Ten zestaw i dostaniesz &quot;oczy&quot; na to co biega po liniach <br />Bez tego ani rusz.<br /><br />Poza tym mam niejasne przeczucie że kompletnie mi się ta funkcja nie podoba.<br />[syntax=c]unsigned char USART_Receive(void) {<br />        PORTD &amp;=~(1&lt;&lt;PD2);<br />        while(!(UCSRA &amp; (1&lt;&lt;RXC)));<br />        return UDR;<br />}[/syntax]<br />Zobacz<br />Załączasz odbiór RS485 i czekasz na dane<br />A co będzie gdy dane przyszły wcześniej?<br />Raczej użyłbym przerwania (przyszły dane)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18188">JarekB</a> — 20 gru 2017, o 18:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mateusz19955]]></name></author>
<updated>2017-12-20T17:32:49+01:00</updated>
<published>2017-12-20T17:32:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200859#p200859</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200859#p200859"/>
<title type="html"><![CDATA[Re: rs485]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200859#p200859"><![CDATA[
Walczę z tym rs485 już kilka godzin i nie mogę sobie poradzić. Na zwykłym rs232 wszystko działa jak chcę a na tym nie.<br />Program ma działać tak:<br />-SOFT1 wysyła do SOFT2 wartość 1,<br />-jeżeli SOFT2 odbierze tą wartość 1, to na wyświetlaczu wyświetla napis &quot;ok&quot; i wysyła do SOFT1 wartość 2<br />-jeżeli SOFT1 odbierze tą wartość 2 to ma zaświecić diodę na PB2.<br /><br />I tu mam problem bo na wyświetlaczu wyświetla mi się ten napis &quot;ok&quot;, czyli SOFT2 odbiera, a SOFT1 wysyła wszystko dobrze.<br />Ale gdy SOFT2 odsyła do SOFT1 to dioda się nie zaświeca czyli coś źle wysyła albo SOFT1 źle coś odbiera.<br />Pomóżcie bo już naprawdę nie wiem co jest źle.<br /><br />SOFT1:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define UART_BAUD 9600// tu definiujemy interesującą nas prędkość<br />#define __UBRR F_CPU/16/UART_BAUD-1  // obliczamy UBRR dla U2X=0<br /><br />void USART_Init( uint16_t baud );<br />void USART_Transmit( unsigned char data );<br />unsigned char USART_Receive(void);<br /><br />volatile uint8_t koniec_odbioru, koniec_nadawania;<br />uint8_t dane;<br /><br />int main(void)<br />{<br />DDRD |=(1&lt;&lt;PD2);//PD2 JAKO WYJŚCIE<br />PORTD &amp;=~(1&lt;&lt;PD2);//ZAŁĄCZ ODBIORNIK<br />DDRB |= (1&lt;&lt;PB2);<br />PORTB |= (1&lt;&lt;PB2);<br />sei();<br /><br />USART_Init(__UBRR);<br />_delay_ms(1);<br /><br />while (1) {<br />USART_Transmit(1);<br /><br />dane=USART_Receive();<br />if (dane==2) {<br />PORTB &amp;=~(1&lt;&lt;PB2);<br />}<br />}<br />}<br /><br />void USART_Init( uint16_t baud )<br />{<br />UBRRH = (uint8_t)(baud&gt;&gt;8);<br />UBRRL = (uint8_t)baud;<br />UCSRB |= (1&lt;&lt;RXEN)|(1&lt;&lt;TXEN)|(1&lt;&lt;RXCIE)|(1&lt;&lt;TXCIE);<br />UCSRC = (1&lt;&lt;URSEL)|(3&lt;&lt;UCSZ0);<br />}<br /><br />void USART_Transmit( unsigned char data )<br />{<br />PORTD |=(1&lt;&lt;PD2);//ustaw nadajnik<br />while (!(UCSRA &amp; (1&lt;&lt;UDRE)));<br />UDR = data;<br />}<br /><br />unsigned char USART_Receive(void) {<br />PORTD &amp;=~(1&lt;&lt;PD2);<br />while(!(UCSRA &amp; (1&lt;&lt;RXC)));<br />return UDR;<br />}<br /><br />ISR( USART_TXC_vect ) {<br />PORTD &amp;=~(1&lt;&lt;PD2);// zablokuj nadajnik RS485<br />}<br /><br />ISR( USART_RXC_vect ) {<br />koniec_odbioru = 1;<br />}[/syntax]<br /><br />SOFT2:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;lcd44780.h&quot;<br /><br />#define UART_BAUD 9600// tu definiujemy interesującą nas prędkość<br />#define __UBRR F_CPU/16/UART_BAUD-1  // obliczamy UBRR dla U2X=0<br /><br />void USART_Init( uint16_t baud );<br />void USART_Transmit( unsigned char data );<br />unsigned char USART_Receive(void);<br /><br />volatile uint8_t koniec_odbioru;<br />uint8_t dane,dane_wyslij;<br /><br />int main(void)<br />{<br />DDRD |=(1&lt;&lt;PD2)|(1&lt;&lt;PD7);<br />PORTD |=(1&lt;&lt;PD7);//PD2 JAKO WYJŚCIE<br />PORTD &amp;=~(1&lt;&lt;PD2);//ZAŁĄCZ ODBIORNIK<br />    sei();<br /><br />USART_Init(__UBRR);<br />lcd_init();<br />lcd_cls();<br /><br />_delay_ms(1);<br /><br />    while (1) {<br />dane=USART_Receive();<br /><br />if (dane==1) {<br />lcd_locate(0,0);<br />lcd_str(&quot;ok&quot;);<br />dane_wyslij=2;<br />USART_Transmit(dane_wyslij);<br />} else {<br />lcd_cls();<br />}<br />    }<br />}<br /><br />void USART_Init( uint16_t baud ) <br />{<br />UBRRH = (uint8_t)(baud&gt;&gt;8);<br />UBRRL = (uint8_t)baud;<br />UCSRB |= (1&lt;&lt;RXEN)|(1&lt;&lt;TXEN)|(1&lt;&lt;RXCIE)|(1&lt;&lt;TXCIE);<br />UCSRC = (1&lt;&lt;URSEL)|(3&lt;&lt;UCSZ0);<br />}<br /><br />void USART_Transmit( unsigned char data )<br />{<br />PORTD |=(1&lt;&lt;PD2);//ustaw nadajnik                            <br />while (!(UCSRA &amp; (1&lt;&lt;UDRE)));<br />UDR = data;<br />}<br /><br />unsigned char USART_Receive(void) {<br />PORTD &amp;=~(1&lt;&lt;PD2);<br />while(!(UCSRA &amp; (1&lt;&lt;RXC)));<br />return UDR;<br />}<br /><br />ISR( USART_TXC_vect ) {<br />PORTD &amp;=~(1&lt;&lt;PD2);// zablokuj nadajnik RS485<br />}<br /><br />ISR( USART_RXC_vect ) {<br />koniec_odbioru = 1;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3621">mateusz19955</a> — 20 gru 2017, o 17:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mateusz19955]]></name></author>
<updated>2017-12-20T11:41:55+01:00</updated>
<published>2017-12-20T11:41:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200839#p200839</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200839#p200839"/>
<title type="html"><![CDATA[Re: rs485]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200839#p200839"><![CDATA[
Ten delay jest po to aby max485 zdążył się przełączyć. To że wysyłam w pętli głównej cały czas wartość 2, to tylko tak napisałem, opcjonalnie będzie inaczej. Ale co jeszcze jest nie tak, pomijając już że nie mam napisanej procedury odbioru?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3621">mateusz19955</a> — 20 gru 2017, o 11:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2017-12-19T23:18:54+01:00</updated>
<published>2017-12-19T23:18:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200825#p200825</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200825#p200825"/>
<title type="html"><![CDATA[Re: rs485]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200825#p200825"><![CDATA[
Nie ma procedury obsługi przerwania odbioru.<br />Po co ten delay po ustawieniu nadawania?<br />W pętli głównej non top chcesz wysyłać daną. Kod wygląda jak jakaś wprawka / testy a nie użyteczne funkcje,<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> — 19 gru 2017, o 23:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mateusz19955]]></name></author>
<updated>2017-12-19T22:14:47+01:00</updated>
<published>2017-12-19T22:14:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200821#p200821</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200821#p200821"/>
<title type="html"><![CDATA[Re: rs485]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200821#p200821"><![CDATA[
Ok, dzięki za podpowiedź. A teraz jest dobrze?<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define UART_BAUD 9600// tu definiujemy interesującą nas prędkość<br />#define __UBRR F_CPU/16/UART_BAUD-1  // obliczamy UBRR dla U2X=0<br /><br />void USART_Init( uint16_t baud );<br />void USART_Transmit( unsigned char data );<br /><br />int main(void)<br />{<br />DDRD |=(1&lt;&lt;PD2);//PD2 JAKO WYJŚCIE<br />PORTD &amp;=~(1&lt;&lt;PD2);//ZAŁĄCZ ODBIORNIK<br />    sei();<br /><br />USART_Init(__UBRR);<br /><br />    while (1) {<br />USART_Transmit(2);<br />    }<br />}<br /><br />void USART_Init( uint16_t baud ) <br />{<br />UBRRH = (uint8_t)(baud&gt;&gt;8);<br />UBRRL = (uint8_t)baud;<br />UCSRB |= (1&lt;&lt;RXEN)|(1&lt;&lt;TXEN)|(1&lt;&lt;RXCIE)|(1&lt;&lt;TXCIE);<br />UCSRC = (1&lt;&lt;URSEL)|(3&lt;&lt;UCSZ0);<br />}<br /><br />void USART_Transmit( unsigned char data )<br />{<br />PORTD |=(1&lt;&lt;PD2);//ustaw nadajnik<br />_delay_ms(1);                              <br />while (!(UCSRA &amp; (1&lt;&lt;UDRE)));<br />UDR = data;<br />}<br /><br />ISR( USART_TXC_vect ) {<br />PORTD &amp;=~(1&lt;&lt;PD2);// zablokuj nadajnik RS485<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3621">mateusz19955</a> — 19 gru 2017, o 22:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2017-12-19T19:13:59+01:00</updated>
<published>2017-12-19T19:13:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200807#p200807</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200807#p200807"/>
<title type="html"><![CDATA[Re: rs485]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200807#p200807"><![CDATA[
Transmisja RS485 różni się od transmisji RS232 tylko sterowaniem kierunkiem przesyłania danych. Więc uruchom najpierw poprawnie transmisję RS232 na podstawie BB a potem przejdź na RS485 - także masz w BB dostępną bibliotekę do tego.<br /><div class="quotetitle">mateusz19955 napisał(a):</div><div class="quotecontent"><br />[syntax=c]UCSRB |= (1&lt;&lt;RXEN)|(1&lt;&lt;TXEN)|(1&lt;&lt;RXCIE)|(1&lt;&lt;TXCIE);[/syntax]<br /></div><br />Jak uruchamiasz przerwania, to musisz napisać procedury ich obsługi.<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> — 19 gru 2017, o 19:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mateusz19955]]></name></author>
<updated>2017-12-19T17:08:56+01:00</updated>
<published>2017-12-19T17:08:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200803#p200803</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200803#p200803"/>
<title type="html"><![CDATA[rs485]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19828&amp;p=200803#p200803"><![CDATA[
Witam, potrzebuję uruchomić transmisję po RS485. Kod inicjalizacji jest zaczerpnięty z niebieskiej książki Mirka a kod do transmisji z noty pdf atmega. Chciałem to zrobić z użyciem przerwania od USART i wyszło mi coś takiego tylko nie wiem czy to jest dobrze napisane. Może mi ktoś to sprawdzić i napisać czy jest dobrze?<br /><br />[syntax=c]void USART_Init( uint16_t baud ) <br />{<br />UBRRH = (uint8_t)(baud&gt;&gt;8);<br />UBRRL = (uint8_t)baud;<br />UCSRB |= (1&lt;&lt;RXEN)|(1&lt;&lt;TXEN)|(1&lt;&lt;RXCIE)|(1&lt;&lt;TXCIE);<br />UCSRC = (1&lt;&lt;URSEL)|(3&lt;&lt;UCSZ0);<br />}<br /><br />void USART_Transmit( unsigned char data )<br />{<br />PORTD |=(1&lt;&lt;PD2);//ustaw nadajnik<br />_delay_ms(1);                              <br />while (!(UCSRA &amp; (1&lt;&lt;UDRE)));<br />UDR = data;<br /><br />while (!(UCSRA &amp; (1&lt;&lt;TXC)));//zerowanie flagi TXC?????<br />PORTD &amp;=~(1&lt;&lt;PD2);//ustaw odbiornik[/syntax]<br /><br />Jak wszystkie dane zostaną wysłane to zostanie ustawiona flaga TXC. I ja sprawdzam to za pomocą tego fragmentu kodu<br />[syntax=c]while (!(UCSRA &amp; (1&lt;&lt;TXC)));//zerowanie flagi TXC?????[/syntax]<br />ale ją trzeba potem wyzerować. Czy ja to dobrze robię z tą pętlą?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3621">mateusz19955</a> — 19 gru 2017, o 17:08</p><hr />
]]></content>
</entry>
</feed>