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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-10-29T13:54:34+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=16652&amp;mode</id>
<entry>
<author><name><![CDATA[pawkrol]]></name></author>
<updated>2016-10-29T13:54:34+01:00</updated>
<published>2016-10-29T13:54:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16652&amp;p=173128#p173128</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16652&amp;p=173128#p173128"/>
<title type="html"><![CDATA[Odebranie znaku UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16652&amp;p=173128#p173128"><![CDATA[
Mam takie pytanie. Znalazłem taki kod w sieci do wysyłania i odbierania danych poprzez układ 433mhz.<br /><br /><strong>Wysyłka TX</strong>. <br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;UART/uart.h&quot;<br /><br />#define SYNC 0XAA<br />#define RADDR 0x44D<br />#define LEDON 0x11<br />#define LEDOFF 0x22<br /><br />void Send_Packet(uint8_t addr, uint8_t cmd)<br />{<br />uart_putc(SYNC);//send synchro byte<br />uart_putc(addr);//send receiver address<br />uart_putc(cmd);//send increment command<br />uart_putc((addr+cmd));//send checksum<br />}<br />int main(void)<br />{<br />usart_init();<br />while(1)<br />{//endless transmission<br />//send command to switch led ON<br />Send_Packet(RADDR, LEDON);<br />_delay_ms(100);<br />//send command to switch led ON<br />Send_Packet(RADDR, LEDOFF);<br />_delay_ms(100);<br />}<br />return 0;<br />}[/syntax]<br />Tu kod jest jak najbardziej dla mnie zrozumiały. Wysyłamy paczkę składającą się z 4 bajtów. Jeden po drugim<br /><br /><strong>Odbiór RX</strong>. <br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;UART/uart.h&quot;<br /><br />#define SYNC 0XAA<br />#define RADDR 0x44 <br />#define LEDON 0x11<br />#define LEDOFF 0x22<br /><br />#define LED1 (1&lt;&lt;PB0)<br />#define LED_ON  PORTB &amp;= ~LED1<br />#define LED_OFF PORTB |= LED1<br />#define LED_TOG PORTB ^= LED1<br /><br />ISR(USART_RXC_vect)  <br />{<br />uint8_t raddress, cmd, chk;//transmitter address<br />//receive destination address<br />raddress=uart_getc();<br />//receive data<br />cmd=uart_getc();<br />//receive checksum<br />chk=uart_getc();<br />//compare received checksum with calculated<br />if(chk==(raddress+cmd))<br />{<br />if(raddress==RADDR)<br />{<br />if(cmd==LEDON)<br />{<br />LED_ON;<br />}<br />else if(cmd==LEDOFF)<br />{<br />LED_OFF;<br />}<br />else<br />{<br />LED_OFF;<br />_delay_ms(10);<br />LED_ON;<br />}<br />}<br />}<br />}<br />void Main_Init(void)<br />{<br />DDRB |= LED1; //PB0 jako wyjscie<br />LED_OFF; // Wylacz diode. Stan wysoki<br />sei();  // Wlacz globalne przerwania<br />}<br /><br />int main(void)<br />{<br />Main_Init();<br />usart_init();<br />while(1)<br />{<br />}<br />return 0;<br />}[/syntax]<br /><br /><strong>Funkcja odbioru znaku</strong><br />[syntax=c]unsigned char uart_getc (void) // Funkcja odbierania danych przez atemege<br />{<br />while(~(UCSRA) &amp; (1&lt;&lt;RXC));                   // Czy w buforze sa dane?<br />    return UDR;                                   // Dane z bufora<br />}[/syntax]<br /><br /><br />I tu nie do końca rozumiem jedną rzecz. Chodzi o to, że po wysyłaniu bajtu SYNC (0xAA), dochodzi on do układu odbiorczego. <br />W tym momencie zostaje wygenerowane przerwanie od odbioru danych ISR(USART_RXC_vect). Dlaczego więc pierwszą daną jaką pobieramy z bufora i zapisujemy w przerwaniu jest raddr (0x44), a nie właśnie SYNC, bo wydaje mi się, że właśnie ten bajt siedzi w tym momencie w buforze. <br /><br />Z góry dziękuję za odpowiedź<br /><br /><br /><strong><span style="text-decoration: underline">Dodane:</span></strong><br />Porobiłem kilka doświadczeń i już sobie odpowiedziałem. Przy pierwszym wywołaniu przerwania w buforze siedzi bajt SYNC.<br />Co 4 wywołanie przerwania będzie spełniało warunek if. Temat do zamknięcia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4067">pawkrol</a> — 29 paź 2016, o 13:54</p><hr />
]]></content>
</entry>
</feed>