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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-03-25T22:12:27+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=2637&amp;mode</id>
<entry>
<author><name><![CDATA[shoc]]></name></author>
<updated>2013-03-25T22:12:27+01:00</updated>
<published>2013-03-25T22:12:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31766#p31766</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31766#p31766"/>
<title type="html"><![CDATA[Re: Obsługa dwóch USART-ów na ATMEGA 1284p]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31766#p31766"><![CDATA[
Np można zrobić tak:<br /><br />- stwórz nowy bufor przeznaczony do tego celu (odbieranie i parsowanie danych),<br />- napisz funkcje która będzie Tobie zwracała aktualną ilość znaków odebraną w buforze UART'a,<br />- w pętli głównej sprawdzaj za pomocą prędzej stworzonej funkcji (uart_available) czy jest coś odebranego,<br />- jeżeli tak to odbierz to i wrzuć do bufora<br />- a następnie sprawdzaj warunek - np czy został odebrany konkretny znak a jeżeli tak to porównaj ciąg ze wzorcem.<br /><br />- pamiętaj o czyszczeniu bufora i o zabezpieczeniu się przed jego przepełnieniem.<br /><br />Przykład:<br />[syntax=c]<br />/*************************************************************************<br />Function: uart_available()<br />Purpose:  Determine the number of bytes waiting in the receive buffer<br />Input:    None<br />Returns:  Integer number of bytes in the receive buffer<br />**************************************************************************/<br />int uart_available(void)<br />{<br />   return (UART_RX_BUF_MASK + UART_RxHead - UART_RxTail) % UART_RX_BUF_MASK;<br />}<br />[/syntax]<br /><br />PS. co to jest STOP? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=269">shoc</a> — 25 mar 2013, o 22:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gedeon]]></name></author>
<updated>2013-03-25T20:27:10+01:00</updated>
<published>2013-03-25T20:27:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31759#p31759</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31759#p31759"/>
<title type="html"><![CDATA[Re: Obsługa dwóch USART-ów na ATMEGA 1284p]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31759#p31759"><![CDATA[
Próbowałem zastosować  się do zaleceń i skorzystałem z biblioteki mirka, poproszę o zerknięcie i poradę co dalej.<br />[syntax=c]<br />// definiujemy w końcu nasz bufor UART0_RxBuf<br />volatile char UART0_RxBuf[UART0_RX_BUF_SIZE];<br />// definiujemy indeksy określające ilość danych w buforze<br />volatile uint8_t UART0_RxHead; // indeks oznaczający „głowę węża”<br />volatile uint8_t UART0_RxTail; // indeks oznaczający „ogon węża”<br /><br /><br /><br />// definiujemy w końcu nasz bufor UART0_RxBuf<br />volatile char UART0_TxBuf[UART0_TX_BUF_SIZE];<br />// definiujemy indeksy określające ilość danych w buforze<br />volatile uint8_t UART0_TxHead; // indeks oznaczający „głowę węża”<br />volatile uint8_t UART0_TxTail; // indeks oznaczający „ogon węża”<br /><br />// definiujemy w końcu nasz bufor UART1_RxBuf<br />volatile char UART1_RxBuf[UART1_RX_BUF_SIZE];<br />// definiujemy indeksy określające ilość danych w buforze<br />volatile uint8_t UART1_RxHead; // indeks oznaczający „głowę węża”<br />volatile uint8_t UART1_RxTail; // indeks oznaczający „ogon węża”<br /><br /><br /><br />// definiujemy w końcu nasz bufor UART1_RxBuf<br />volatile char UART1_TxBuf[UART0_TX_BUF_SIZE];<br />// definiujemy indeksy określające ilość danych w buforze<br />volatile uint8_t UART1_TxHead; // indeks oznaczający „głowę węża”<br />volatile uint8_t UART1_TxTail; // indeks oznaczający „ogon węża”<br /><br /><br /><br /><br />void usart0_init( uint16_t baud )<br />{<br />UBRR0H = (uint8_t)(baud&gt;&gt;8);<br />UBRR0L = (uint8_t)baud;<br />/* Za│czenie nadajnika I odbiornika */<br />UCSR0B = (1&lt;&lt;RXEN0)|(1&lt;&lt;TXEN0);<br />/* Ustawienie format ramki: 8bitˇw danych, 1 bit stopu */<br />UCSR0C = (3&lt;&lt;UCSZ00);<br />}<br />void usart1_init( uint16_t baud )<br />{<br />UBRR1H = (uint8_t)(baud&gt;&gt;8);<br />UBRR1L = (uint8_t)baud;<br />/* Za│czenie nadajnika I odbiornika */<br />UCSR1B = (1&lt;&lt;RXEN1)|(1&lt;&lt;TXEN1);<br />/* Ustawienie format ramki: 8bitˇw danych, 1 bit stopu */<br />UCSR1C = (3&lt;&lt;UCSZ10);<br />}<br />void usart0_send(unsigned char rx0_data)<br />{<br />uint8_t tmp_head;<br /><br />    tmp_head  = (UART0_TxHead + 1) &amp; UART0_TX_BUF_MASK;<br /><br />          // pętla oczekuje jeżeli brak miejsca w buforze cyklicznym na kolejne znaki<br />    while ( tmp_head == UART0_TxTail ){}<br /><br />    UART0_TxBuf[tmp_head] = rx0_data;<br />    UART0_TxHead = tmp_head;<br /><br />    // inicjalizujemy przerwanie występujące, gdy bufor jest pusty, dzięki<br />    // czemu w dalszej części wysyłaniem danych zajmie się już procedura<br />    // obsługi przerwania<br />    UCSR0B |= (1&lt;&lt;UDRIE0);<br />}<br />void usart1_send(unsigned char rx1_data)<br />{<br />uint8_t tmp_head;<br /><br />    tmp_head  = (UART1_TxHead + 1) &amp; UART1_TX_BUF_MASK;<br /><br />          // pętla oczekuje jeżeli brak miejsca w buforze cyklicznym na kolejne znaki<br />    while ( tmp_head == UART1_TxTail ){}<br /><br />    UART1_TxBuf[tmp_head] = rx1_data;<br />    UART1_TxHead = tmp_head;<br /><br />    // inicjalizujemy przerwanie występujące, gdy bufor jest pusty, dzięki<br />    // czemu w dalszej części wysyłaniem danych zajmie się już procedura<br />    // obsługi przerwania<br />    UCSR1B |= (1&lt;&lt;UDRIE1);<br />}<br />// definiujemy procedurę obsługi przerwania nadawczego, pobierającą dane z bufora cyklicznego<br />ISR( USART0_UDRE_vect)  {<br />    // sprawdzamy czy indeksy są różne<br />    if ( UART0_TxHead != UART0_TxTail ) {<br />    // obliczamy i zapamiętujemy nowy indeks ogona węża (może się zrównać z głową)<br />    UART0_TxTail = (UART0_TxTail + 1) &amp; UART0_TX_BUF_MASK;<br /><br />    // zwracamy bajt pobrany z bufora  jako rezultat funkcji<br />    UDR0 = UART0_TxBuf[UART0_TxTail];<br />    } else {<br />// zerujemy flagę przerwania występującego gdy bufor pusty<br />UCSR0B &amp;= ~(1&lt;&lt;UDRIE0);<br />    }<br />}<br />// definiujemy procedurę obsługi przerwania nadawczego, pobierającą dane z bufora cyklicznego<br />ISR( USART1_UDRE_vect)  {<br />    // sprawdzamy czy indeksy są różne<br />    if ( UART1_TxHead != UART1_TxTail ) {<br />    // obliczamy i zapamiętujemy nowy indeks ogona węża (może się zrównać z głową)<br />    UART1_TxTail = (UART1_TxTail + 1) &amp; UART1_TX_BUF_MASK;<br /><br />    // zwracamy bajt pobrany z bufora  jako rezultat funkcji<br />    UDR1 = UART1_TxBuf[UART1_TxTail];<br />    } else {<br />// zerujemy flagę przerwania występującego gdy bufor pusty<br />UCSR1B &amp;= ~(1&lt;&lt;UDRIE1);<br />    }<br />}<br />void usart0_send_string(const char *s)<br />{<br />   while(*s)<br />   {<br />      usart0_send(*s++);<br />   }<br />}<br />void usart1_send_string(const char *s)<br />{<br />   while(*s)<br />   {<br />      usart1_send(*s++);<br />   }<br />}<br /><br />unsigned char usart0_recive(void)<br />{<br /> // sprawdzamy czy indeksy są równe<br />    if ( UART0_RxHead == UART0_RxTail ) return 0;<br /><br />    // obliczamy i zapamiętujemy nowy indeks „ogona węża” (może się zrównać z głową)<br />    UART0_RxTail = (UART0_RxTail + 1) &amp; UART0_RX_BUF_MASK;<br />    // zwracamy bajt pobrany z bufora  jako rezultat funkcji<br />    return UART0_RxBuf[UART0_RxTail];<br />}<br />unsigned char usart1_recive(void)<br />{<br /> // sprawdzamy czy indeksy są równe<br />    if ( UART1_RxHead == UART1_RxTail ) return 0;<br /><br />    // obliczamy i zapamiętujemy nowy indeks „ogona węża” (może się zrównać z głową)<br />    UART1_RxTail = (UART1_RxTail + 1) &amp; UART1_RX_BUF_MASK;<br />    // zwracamy bajt pobrany z bufora  jako rezultat funkcji<br />    return UART1_RxBuf[UART1_RxTail];<br />}<br /><br />//przerwanie odbiorcze dla USART0<br />ISR( USART0_RX_vect ) {<br /><br />    uint8_t tmp_head;<br />    char rx0_data;<br /><br />    rx0_data = UDR0; //pobieramy natychmiast bajt danych z bufora sprzętowego<br /><br />    // obliczamy nowy indeks „głowy węża”<br />    tmp_head = ( UART0_RxHead + 1) &amp; UART0_RX_BUF_MASK;<br /><br />    // sprawdzamy, czy wąż nie zacznie zjadać własnego ogona<br />    if ( tmp_head == UART0_RxTail ) {<br />        // tutaj możemy w jakiś wygodny dla nas sposób obsłużyć  błąd spowodowany<br />        // próbą nadpisania danych w buforze, mogłoby dojść do sytuacji gdzie<br />        // nasz wąż zacząłby zjadać własny ogon<br />    } else {<br />        UART0_RxHead = tmp_head;                // zapamiętujemy nowy indeks<br />        UART0_RxBuf[tmp_head] = rx0_data;   // wpisujemy odebrany bajt do bufora<br />    }<br />}<br />//przerwanie odbiorcze dla USART1<br />ISR( USART1_RX_vect ) {<br /><br />    uint8_t tmp_head;<br />    char rx1_data;<br /><br />    rx1_data = UDR1; //pobieramy natychmiast bajt danych z bufora sprzętowego<br /><br />    // obliczamy nowy indeks „głowy węża”<br />    tmp_head = ( UART1_RxHead + 1) &amp; UART1_RX_BUF_MASK;<br /><br />    // sprawdzamy, czy wąż nie zacznie zjadać własnego ogona<br />    if ( tmp_head == UART1_RxTail ) {<br />        // tutaj możemy w jakiś wygodny dla nas sposób obsłużyć  błąd spowodowany<br />        // próbą nadpisania danych w buforze, mogłoby dojść do sytuacji gdzie<br />        // nasz wąż zacząłby zjadać własny ogon<br />    } else {<br />        UART1_RxHead = tmp_head;                // zapamiętujemy nowy indeks<br />        UART1_RxBuf[tmp_head] = rx1_data;   // wpisujemy odebrany bajt do bufora<br />    }<br />}<br />[/syntax]<br />Teraz nie bardzo wiem jak mam przekazywać wartość do zmiennej aby sprawdzać czy odebrana wartość to np &quot;1&quot;, wczesniej miałem <br />[syntax=c]<br />                        rx_usart0 = usart0_recive();<br />        rx_usart1 = usart1_recive();<br />        if(rx_usart0 == STOP)<br />        {<br />        usart0_send_string(&quot;Wyslano polecenie STOP: \n&quot;);<br />        usart1_send_string(&quot;st \r&quot;);<br /><br />        }<br />[/syntax]<br />i teraz po kompilacji też nic nie działa<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 33 minutach ]</span></strong><br /><br />Oczywiście sei(); włączone.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=963">gedeon</a> — 25 mar 2013, o 20:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[shoc]]></name></author>
<updated>2013-03-25T16:30:46+01:00</updated>
<published>2013-03-25T16:30:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31718#p31718</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31718#p31718"/>
<title type="html"><![CDATA[Re: Obsługa dwóch USART-ów na ATMEGA 1284p]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31718#p31718"><![CDATA[
W skrócie:<br />robisz w bibliotece kopię wszystkiego z uarta 0 dla uarta 1 - czyli kopię zmiennych, funkcji, deklaracji itp.<br /><br />Następnie dobrze jest stworzyć funkcję uart_avaible() i sprawdzać w niej czy coś przyszło, jeżeli tak to wykonuje się odpowiednie działania (uart_getc, przekazywanie do bufora, parsowanie odebranych danych itp.)<br /><br />Wygodnie jest też przepisać bibliotekę w stylu uart_puts(uint8_t _uartNo, char *_string);<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=269">shoc</a> — 25 mar 2013, o 16:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gedeon]]></name></author>
<updated>2013-03-25T15:00:39+01:00</updated>
<published>2013-03-25T15:00:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31711#p31711</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31711#p31711"/>
<title type="html"><![CDATA[Re: Obsługa dwóch USART-ów na ATMEGA 1284p]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31711#p31711"><![CDATA[
Dzięki za szybką odpowiedz, będę się zabierał za przerwania, mogę liczyć na jakąś podpowiedz jak się do tego zabrać?<br />Z tego co wiem to powinienem zacząć od:<br />[syntax=c]<br />//przerwanie odbiorcze dla USART0<br />ISR( USART0_RX_vect ) {<br /><br />    uint8_t tmp_head;<br />    char data;<br /><br />    data = UDR0; //pobieramy natychmiast bajt danych z bufora sprzętowego<br /><br />    // obliczamy nowy indeks „głowy węża”<br />    tmp_head = ( UART0_RxHead + 1) &amp; UART0_RX_BUF_MASK;<br /><br />    // sprawdzamy, czy wąż nie zacznie zjadać własnego ogona<br />    if ( tmp_head == UART0_RxTail ) {<br />    // tutaj możemy w jakiś wygodny dla nas sposób obsłużyć  błąd spowodowany<br />    // próbą nadpisania danych w buforze, mogłoby dojść do sytuacji gdzie<br />    // nasz wąż zacząłby zjadać własny ogon<br />    } else {<br />UART0_RxHead = tmp_head; // zapamiętujemy nowy indeks<br />UART0_RxBuf[tmp_head] = data; // wpisujemy odebrany bajt do bufora<br />    }<br />}<br />//przerwanie odbiorcze dla USART1<br />ISR( USART1_RX_vect ) {<br /><br />    uint8_t tmp_head;<br />    char data;<br /><br />    data = UDR1; //pobieramy natychmiast bajt danych z bufora sprzętowego<br /><br />    // obliczamy nowy indeks „głowy węża”<br />    tmp_head = ( UART1_RxHead + 1) &amp; UART1_RX_BUF_MASK;<br /><br />    // sprawdzamy, czy wąż nie zacznie zjadać własnego ogona<br />    if ( tmp_head == UART1_RxTail ) {<br />    // tutaj możemy w jakiś wygodny dla nas sposób obsłużyć  błąd spowodowany<br />    // próbą nadpisania danych w buforze, mogłoby dojść do sytuacji gdzie<br />    // nasz wąż zacząłby zjadać własny ogon<br />    } else {<br />UART1_RxHead = tmp_head; // zapamiętujemy nowy indeks<br />UART1_RxBuf[tmp_head] = data; // wpisujemy odebrany bajt do bufora<br />    }<br />}<br />[/syntax]<br />i tu się zatrzymałem. Jakaś podpowiedź?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=963">gedeon</a> — 25 mar 2013, o 15:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gedeon]]></name></author>
<updated>2013-03-24T00:43:49+01:00</updated>
<published>2013-03-24T00:43:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31520#p31520</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31520#p31520"/>
<title type="html"><![CDATA[Obsługa dwóch USART-ów na ATMEGA 1284p]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2637&amp;p=31520#p31520"><![CDATA[
Witam serdecznie , zakupiłem atmege 1284p która posiada dwa USART-y, potrzebuje na jednym USARTcie komunikować sie z komputerem a na drugim z innym uC.<br />Niestety napotkałem problem z którym nie potrafię sobie poradzić stąd moja prośbą o pomoc.<br />Na samym początku zabawy odpaliłem notę pdf odnośnie uC i skonfigurowałem USART-y(jak narazie nie bazując na przerwaniach)<br />[syntax=c]<br />void usart0_init( uint16_t baud )<br />{<br />UBRR0H = (uint8_t)(baud&gt;&gt;8);<br />UBRR0L = (uint8_t)baud;<br />/* Załączenie nadajnika I odbiornika */<br />UCSR0B = (1&lt;&lt;RXEN0)|(1&lt;&lt;TXEN0);<br />/* Ustawienie format ramki: 8bitˇw danych, 1 bit stopu */<br />UCSR0C = (3&lt;&lt;UCSZ00);<br />}<br />void usart1_init( uint16_t baud )<br />{<br />UBRR1H = (uint8_t)(baud&gt;&gt;8);<br />UBRR1L = (uint8_t)baud;<br />/* Za│czenie nadajnika I odbiornika */<br />UCSR1B = (1&lt;&lt;RXEN1)|(1&lt;&lt;TXEN1);<br />/* Ustawienie format ramki: 8bitˇw danych, 1 bit stopu */<br />UCSR1C = (3&lt;&lt;UCSZ10);<br />}<br />void usart0_send(unsigned char rx0_data)<br />{<br />   while (!( UCSR0A &amp; (1&lt;&lt;UDRE0))); //czekaj na opróżnienie bufora transmisji<br />   UDR0 = rx0_data; //załaduj dane do UDR0 i wyślij<br />}<br />void usart1_send(unsigned char rx1_data)<br />{<br />   while (!( UCSR1A &amp; (1&lt;&lt;UDRE1))); //czekaj na opróżnienie bufora transmisji<br />   UDR1 = rx1_data; //załaduj dane do UDR0 i wyślij<br />}<br /><br />void usart0_send_string(const char *s)<br />{<br />   while(*s)<br />   {<br />      usart0_send(*s++);<br />   }<br />}<br />void usart1_send_string(const char *s)<br />{<br />   while(*s)<br />   {<br />      usart1_send(*s++);<br />   }<br />}<br /><br />unsigned char usart0_recive(void)<br />{<br />   while (!(UCSR0A &amp; (1&lt;&lt;RXC0))); //Czekaj na ukończenie transmisji<br />   return UDR0; //Zwróć dane z UDR0<br />}<br />unsigned char usart1_recive(void)<br />{<br />   while (!(UCSR1A &amp; (1&lt;&lt;RXC1))); //Czekaj na ukończenie transmisji<br />   return UDR1; //Zwróć dane z UDR0<br />}<br />[/syntax]<br />ustawiłem parametry:<br />[syntax=c]<br />#define UART0_BAUD 38400// tu definiujemy interesującą nas prędkość<br />#define UART1_BAUD 38400// tu definiujemy interesującą nas prędkość<br />#define __UBRR0 (F_CPU/16/UART0_BAUD-1)  // obliczamy UBRR dla U2X=0<br />#define __UBRR1 (F_CPU/16/UART1_BAUD-1)  // obliczamy UBRR dla U2X=0<br />[/syntax]<br />oraz przeszedłem do pliku main.c i ostawiłem potrzebne rzeczy:<br />[syntax=c]<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;MKUART/mkuart.h&quot;<br /><br />#define STOP 0x31  //0x31 odpowiada w ASCII &quot;1&quot;<br />#define START 0x32 //0x34 odpowiada w ASCII &quot;2&quot;<br />#define SPEED 0x33 //0x34 odpowiada w ASCII &quot;3&quot;<br /><br />int main(void) {<br /><br />usart0_init(__UBRR0);// inicjalizacja UART0<br />usart1_init(__UBRR1);// inicjalizacja UART1<br /><br />//sei();// globalne odblokowanie przerwań<br /><br />uint8_t rx_usart0; // zmienna do przechowywania odebranych danych od usart0<br />uint8_t rx_usart1; // zmienna do przechowywania odebranych danych od usart1<br /><br />        // pętla nieskończona<br />        while(1) {<br />        rx_usart0 = usart0_recive();<br />        rx_usart1 = usart1_recive();<br />        if(rx_usart0 == STOP)<br />        {<br />        usart0_send_string(&quot;Wyslano polecenie STOP: \n&quot;);<br />        usart1_send_string(&quot;stop \r&quot;);<br /><br />        }<br />        if(rx_usart0 == START)<br />        {<br />                usart0_send_string(&quot;Wyslano polecenie START: \n&quot;);<br />                usart1_send_string(&quot;run \r&quot;);<br />        }<br />        if(rx_usart0 == SPEED)<br />        {<br />                usart0_send_string(&quot;Ustawienie predkosci: \n&quot;);<br />                usart1_send_string(&quot;speed 90 \r&quot;);<br />        }<br /><br />        }<br />}<br />[/syntax]<br />przy takiej konfiguracji uC się blokuje, i to w momencie jak wpisuje wartość rx_usart1 = usart1_recive(); wystarczy że wezmę ją w komentarz i wszystko rusza. Nie bardzo wiem jak sobie z tym poradzić ponieważ nie mam dużego doświadczenia w zabawie z dwoma USART-ami. Może powinienem jednak pobawić się z przerwaniami i problem by zniknął, na razie proszę was o pomoc. Może też ktoś podpowiedziałby jak poprawnie skonfigurować uC z dwoma USART-ami?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=963">gedeon</a> — 24 mar 2013, o 00:43</p><hr />
]]></content>
</entry>
</feed>