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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-06-12T09:50:44+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=20864&amp;mode</id>
<entry>
<author><name><![CDATA[wawrzyc]]></name></author>
<updated>2018-06-12T09:50:44+01:00</updated>
<published>2018-06-12T09:50:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20864&amp;p=208889#p208889</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20864&amp;p=208889#p208889"/>
<title type="html"><![CDATA[RS485 wysłanie zapytania i odbiór]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20864&amp;p=208889#p208889"><![CDATA[
Mam problem z wysyłaniem i odebraniem z rs485. Jest to ATMEGA 8 + max485.<br /><br />Ma to działać następująco: Wysyłam ramkę pytającą, w odpowiedzi dostaję ramkę od innego urządzenia zawierającą dane które później wyświetlę na LCD. Wysyłanie działa okej. Problem występuje gdy mam odebrać odpowiedź. Gdy wyłączę wysyłanie (za komentuję funkcję TransmissionStart) układ odbiera prawidłowo. W momencie gdy wysyłanie jest uruchomione odbiór nie działa. Odbiera przy każdej ramce tylko jeden znak. Przypuszczam że problem jest w wyłączaniu nadajnika w rs485 (DisableTransmiter), robię to w złym miejscu w kodzie? <br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;HD44780.c&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />#include &lt;stdio.h&gt; <br />#include &lt;string.h&gt; <br />#include &lt;stdlib.h&gt;<br /><br /><br /><br />#define F_CPU 3686400UL<br />#define BAUD 19200                                //define baud<br />#define BAUDRATE ((F_CPU)/(BAUD*16UL)-1) <br /><br />#define KEYplus (1&lt;&lt;PC0)<br />#define KEYminus (1&lt;&lt;PC1)<br /><br />#define OUT_ON() PORTC |= (1&lt;&lt;PORTC4) <br />#define OUT_OFF() PORTC &amp;= ~(1&lt;&lt;PORTC4)<br /><br />#define DisableTransmiter() PORTD&amp;=~(1&lt;&lt;PD2);//transmiter dla RS485<br />#define EnableTransmiter() PORTD|=(1&lt;&lt;PD2); <br /><br />char bufferRx&#91;85&#93;, bufferTx&#91;85&#93;, UpLine&#91;8&#93;, DownLine&#91;8&#93;;<br />uint8_t BytesCount, FrameLenght, counterTx, counterRx, TimerTx;<br /><br />uint16_t DistanceActualMeter, DistanceAdj;<br /><br />void TransmissionStart(uint8_t lenght)<br />{<br />EnableTransmiter();<br />counterTx = 0;<br />FrameLenght = lenght;<br />UDR = bufferTx&#91;0&#93;;<br />}<br />ISR(USART_TXC_vect)//przerwanie WYSŁANY BAJT<br />{<br />EnableTransmiter();<br />if (counterTx&lt;FrameLenght)<br />{<br />counterTx++;<br />UDR = (bufferTx&#91;counterTx&#93;);<br />//jest jeszcze cos do wysłania<br /><br />}<br />else<br />{<br />DisableTransmiter();<br />}<br />}<br />ISR(TIMER0_OVF_vect)<br />{<br />TimerTx++;<br /><br />if(TimerTx == 50)<br />{<br />TimerTx = 0;<br />BytesCount = 0;<br /><br />bufferTx&#91;0&#93; = '&amp;'; //początek ramki<br />bufferTx&#91;1&#93; = ' '; <br />bufferTx&#91;2&#93; = '1';<br />bufferTx&#91;3&#93; = '2';<br />bufferTx&#91;4&#93; = '2';<br />bufferTx&#91;5&#93; = '8';<br />bufferTx&#91;6&#93; = '9';<br />bufferTx&#91;7&#93; = ' ';<br />bufferTx&#91;8&#93; = 'M';<br />bufferTx&#91;9&#93; = ' ';<br />bufferTx&#91;10&#93; = '0';<br />bufferTx&#91;11&#93; = '0';<br />bufferTx&#91;12&#93; = '6';<br />bufferTx&#91;13&#93; = '0';<br />bufferTx&#91;14&#93; = '9';<br />bufferTx&#91;15&#93; = 0x0D; //CR<br /><br />BytesCount += 15;<br />TransmissionStart(BytesCount);<br />}<br /><br /><br />//pętla<br /><br />sprintf(DownLine, &quot;%d&quot;, DistanceActualMeter);<br /><br />sprintf(UpLine, &quot;%d&quot;, DistanceAdj);<br /><br />LCD_Clear();<br /><br />LCD_GoTo(0,1);<br />LCD_WriteText(DownLine);<br /><br />LCD_GoTo(0,0);<br />LCD_WriteText(UpLine);<br />}<br /><br />ISR(USART_RXC_vect)<br />{<br />DistanceActualMeter += 1;<br />char byte;<br />byte = UDR;<br /><br />if (byte == 0x20)   //początek transmisji<br />{<br />counterRx = 0;<br />bufferRx&#91;counterRx&#93; = byte;<br /><br /><br />}<br />else<br />{<br />counterRx++;<br />bufferRx&#91;counterRx&#93; = byte;<br />}<br /><br />if (counterRx == 22) //koniec ramki<br />{<br /><br />}<br />}<br /><br /><br />int main (void)<br />{<br />DisableTransmiter();<br />    _delay_loop_2 (65500);<br />    <br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);//prescaler 1024<br />TIMSK |= (1&lt;&lt;TOIE0);<br /><br />//Wyjścia<br />DDRC |= (1&lt;&lt;DDC2);<br />DDRC |= (1&lt;&lt;DDC3);<br /><br />//WEJŚCIA<br />DDRC &amp;= ~(1&lt;&lt;DDC1);<br />DDRC &amp;= ~(1&lt;&lt;DDC0);<br />   <br /><br />   <br />   UBRRH = (BAUDRATE&gt;&gt;8);                      // shift the register right by 8 bits<br />UBRRL = BAUDRATE; <br /><br />//Enable receiver and transmitter//<br />UCSRB = (1&lt;&lt;RXEN)|(1&lt;&lt;RXCIE)|(1&lt;&lt;TXCIE)|(1&lt;&lt;TXEN);<br /> <br /> /* Set frame format: 8data, 1 bit stop //2stop bit */<br />UCSRC = (1&lt;&lt;URSEL)|(3&lt;&lt;UCSZ0); //|(1&lt;&lt;USBS)<br /><br />//LCD START//<br />LCD_Initalize();<br />_delay_loop_2 (65500);<br /><br />    <br />    LCD_Clear();<br />LCD_GoTo(0,0);<br />LCD_WriteText(&quot; Elecom&quot;);<br />LCD_GoTo(0,1);<br />LCD_WriteText(&quot;EM-3300&quot;);<br /><br />_delay_loop_2 (65500);<br />_delay_loop_2 (65500);<br />DistanceActualMeter = 0;<br /><br />sei();<br />    <br />    <br />    <br />    while(1)<br />{<br />}<br />}[/syntax]<br /><br />Zauważyłem, że znaczenie ma po jakim czasie od zapytania układ wyśle odpowiedź. Gdy robię to ręcznie i wyślę po około sekundzie działa dobrze, jednak ten układ który mi odpowiada robi to momentalnie i wtedy nie działa.<br /><br />Może dobrym pomysłem jest uruchomienie timera który odliczy 1,5 znaku przy każdym wysyłaniu i wywoła TransmissionDisable?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15536">wawrzyc</a> — 12 cze 2018, o 09:50</p><hr />
]]></content>
</entry>
</feed>