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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-09-05T08:10:03+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=16115&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-09-05T08:10:03+01:00</updated>
<published>2016-09-05T08:10:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=168002#p168002</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=168002#p168002"/>
<title type="html"><![CDATA[Re: Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=168002#p168002"><![CDATA[
<div class="quotetitle">drezzill napisał(a):</div><div class="quotecontent"><br />a czy nie jest tak, że jeśli te zmienne są w różnych plikach i nie są extern to wtedy to są zupełnie różne zmienne?<br /></div><br />A skąd takie pomysły w ogóle ?<br /><br />Gdybyś dał specyfikator static każdej takiej zmiennej to wtedy nie będą sobie przeszkadzać nawzajem ... pomimo to nie jest w ogóle dobrym pomysłem dublowanie nazw zmiennych i to jeszcze globalnych dla pliku w różnych plikach. Sam widzisz że im więcej takich pomysłów tym więcej problemów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 5 wrz 2016, o 08:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[drezzill]]></name></author>
<updated>2016-09-05T08:00:30+01:00</updated>
<published>2016-09-05T08:00:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=168001#p168001</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=168001#p168001"/>
<title type="html"><![CDATA[Re: Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=168001#p168001"><![CDATA[
rskup a czy nie jest tak, że jeśli te zmienne są w różnych plikach i nie są extern to wtedy to są zupełnie różne zmienne?<br /><br />Situs nie czekam na flagę TX comlete tylko UDRE i wtedy wysyłam kolejny znak. jak skończą się znaki, to nie obsługuję już przerwania UDRE. Wyłączam to w tym miejscu<br /><br />[syntax=c]...<br /> else {<br />        // zerujemy flagę przerwania występującego gdy bufor pusty<br />        UCSR1B &amp;= ~(1&lt;&lt;UDRIE1);<br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5694">drezzill</a> — 5 wrz 2016, o 08:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Situs]]></name></author>
<updated>2016-09-04T19:03:52+01:00</updated>
<published>2016-09-04T19:03:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167961#p167961</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167961#p167961"/>
<title type="html"><![CDATA[Re: Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167961#p167961"><![CDATA[
A czekasz na ustawienie znacznika txc? a jak tak to czy zerujesz go wpisując mu jeden?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14339">Situs</a> — 4 wrz 2016, o 19:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-09-04T17:56:22+01:00</updated>
<published>2016-09-04T17:56:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167951#p167951</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167951#p167951"/>
<title type="html"><![CDATA[Re: Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167951#p167951"><![CDATA[
Twój problem nie ma nic wspólnego z inicjalizacją / obsługą UARTów. Jest to przyczyna o której napisałem na samym początku:<div class="quotetitle">rskup napisał(a):</div><div class="quotecontent"><br />A przypadkiem nie używasz tych samych buforów / zmiennych do obsługi obu UARTów?<br /></div><br />Dla obu UARTów używasz globalnych zmiennych dla Head-a i Tail-a o tej samej nazwie. Albo zmień UART_RxHead, UART_RxTail, UART_TxHead, UART_TxTail na nazwy zawierające numer portu (dodaj 1 jak dla innych elementów dotyczących UART1) albo zadeklaruje je jako static.<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> — 4 wrz 2016, o 17:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[drezzill]]></name></author>
<updated>2016-08-31T12:51:04+01:00</updated>
<published>2016-08-31T12:51:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167639#p167639</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167639#p167639"/>
<title type="html"><![CDATA[Re: Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167639#p167639"><![CDATA[
mkuart0.h<br /><br />[syntax=c]/*<br /> * mkuart.h<br /> *<br /> *  Created on: 2010-09-04<br /> *       Autor: Mirosław Kardaś<br /> */<br /><br />#ifndef MKUART0_H_<br />#define MKUART0_H_<br /><br /><br />#define UART0_BAUD 115200// tu definiujemy interesującą nas prędkość<br />#define __UBRR0 ((F_CPU+UART0_BAUD*8UL) / (16UL*UART0_BAUD)-1) // obliczamy UBRR dla U2X=0<br /><br />// definicje na potrzeby RS485<br />//#define UART_DE_PORT PORTD<br /><br /><br />#define UART0_RX_BUF_SIZE 128 // definiujemy bufor o rozmiarze 32 bajtów<br />// definiujemy maskę dla naszego bufora<br />#define UART0_RX_BUF_MASK ( UART0_RX_BUF_SIZE - 1)<br /><br />#define UART0_TX_BUF_SIZE 128 // definiujemy bufor o rozmiarze 16 bajtów<br />// definiujemy maskę dla naszego bufora<br />#define UART0_TX_BUF_MASK ( UART0_TX_BUF_SIZE - 1)<br /><br /><br /><br /><br />// deklaracje funkcji publicznych<br /><br /><br /><br />void USART0_Init( uint16_t baud );<br /><br />char uart0_getc(void);<br />void uart0_putc( char data );<br />void uart0_puts(char *s);<br />void uart0_puts_const(const char *s);<br />void uart0_putint(int value, int radix);<br />#endif /* MKUART0_H_ */[/syntax]<br /><br />mkuart1.h<br /><br />[syntax=c]/*<br /> * mkuart.h<br /> *<br /> *  Created on: 2010-09-04<br /> *       Autor: Mirosław Kardaś<br /> */<br /><br />#ifndef MKuart1_H_<br />#define MKuart1_H_<br /><br /><br />#define UART1_BAUD 115200// tu definiujemy interesującą nas prędkość<br />#define __UBRR1 ((F_CPU+UART1_BAUD*8UL) / (16UL*UART1_BAUD)-1) // obliczamy UBRR dla U2X=0<br /><br />// definicje na potrzeby RS485<br />//#define UART_DE_PORT PORTD<br /><br /><br />#define UART1_RX_BUF_SIZE 128 // definiujemy bufor o rozmiarze 32 bajtów<br />// definiujemy maskę dla naszego bufora<br />#define UART1_RX_BUF_MASK ( UART1_RX_BUF_SIZE - 1)<br /><br />#define UART1_TX_BUF_SIZE 128 // definiujemy bufor o rozmiarze 16 bajtów<br />// definiujemy maskę dla naszego bufora<br />#define UART1_TX_BUF_MASK ( UART1_TX_BUF_SIZE - 1)<br /><br /><br />// deklaracje funkcji publicznych<br /><br /><br />void USART1_Init( uint16_t baud );<br /><br />char uart1_getc(void);<br />void uart1_putc( char data );<br />void uart1_puts(char *s);<br />void uart1_puts_const(const char *s);<br />void uart1_putint(int value, int radix);<br />#endif /* MKUART1_H_ */[/syntax]<br /><br /><br />Rozmiar zmiennej zmieniłem, żeby przetestować ogromne bufory i taka została.<br /><br />edit:<br /><br />Może ktoś ma gotową bibliotekę do Atmegi 128? Albo Atmegę i sprawdziłby tą bibliotekę, może to wina hardwarowa?<br /><br />Na stronie 253 dokumentacji atmegi128A jest napisane &quot; When the function writes to the<br />UCSRC Register, the URSEL bit (MSB) must be set due to the sharing of I/O location by UBRRH and<br />UCSRC &quot;. Czy powinienem ustawić najwyższy bit w UCSRmC przy zapisie? w opisie rejestru UCSRmC nie ma nic o URSEL, a najwyższy bit jest na szaro. W podanym przez nich sposobie inicjalizacji na stronie 253-254 także nie ustawiają tego bitu.<br /><br />edit2:<br /><br />Użyłem biblioteki od Peter Fleury i działa, więc coś źle robię z inicjalizacją. Muszę przepisać tak jak jest u Petera <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5694">drezzill</a> — 31 sie 2016, o 12:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ShutDownSystem]]></name></author>
<updated>2016-08-31T12:47:11+01:00</updated>
<published>2016-08-31T12:47:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167638#p167638</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167638#p167638"/>
<title type="html"><![CDATA[Re: Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167638#p167638"><![CDATA[
[syntax=c]volatile uint16_t UART_RxHead;[/syntax]<br />Dlaczego w jednym pliku zmienna jest 2 bajtowa, a w drugim 1 bajtowa?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4804">ShutDownSystem</a> — 31 sie 2016, o 12:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-08-31T12:36:27+01:00</updated>
<published>2016-08-31T12:36:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167637#p167637</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167637#p167637"/>
<title type="html"><![CDATA[Re: Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167637#p167637"><![CDATA[
<div class="quotetitle">ShutDownSystem napisał(a):</div><div class="quotecontent"><br />Nie powinno być USCR1C ?<br /></div><br />Powinno, ale to nie ma w tym wypadku znaczenie, bo i tak używa domyślnych wartości konfiguracji portu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />A wszystko masz w porządku w mkuart1.h i mkuart0.h?<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> — 31 sie 2016, o 12:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[drezzill]]></name></author>
<updated>2016-08-31T12:32:04+01:00</updated>
<published>2016-08-31T12:32:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167636#p167636</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167636#p167636"/>
<title type="html"><![CDATA[Re: Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167636#p167636"><![CDATA[
Przejrzałem wszystkie takie błędy po twoim pierwszym poście i już je poprawiłem. Niepotrzebnie jeszcze raz zmieniałem bibliotekę przed wrzuceniem jej tutaj. Myślałem, że będzie &quot;czysta&quot; bez moich ingerencji, a przeoczyłem te dwie rzeczy. Już podmieniłem kod na taki, który mam uruchomiony i nie działa <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5694">drezzill</a> — 31 sie 2016, o 12:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ShutDownSystem]]></name></author>
<updated>2016-08-31T12:21:52+01:00</updated>
<published>2016-08-31T12:21:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167633#p167633</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167633#p167633"/>
<title type="html"><![CDATA[Re: Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167633#p167633"><![CDATA[
[syntax=c]UCSR0C = (1&lt;&lt;UCSZ11)|(1&lt;&lt;UCSZ10);[/syntax]<br />Nie powinno być USCR1C ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4804">ShutDownSystem</a> — 31 sie 2016, o 12:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[drezzill]]></name></author>
<updated>2016-08-31T12:18:15+01:00</updated>
<published>2016-08-31T12:18:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167632#p167632</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167632#p167632"/>
<title type="html"><![CDATA[Re: Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167632#p167632"><![CDATA[
Powinno być:) Poprawiłem, ale to i tak jest w przerwaniu odbiorczym i jeszcze go nie użyłem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5694">drezzill</a> — 31 sie 2016, o 12:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ShutDownSystem]]></name></author>
<updated>2016-08-31T12:14:12+01:00</updated>
<published>2016-08-31T12:14:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167631#p167631</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167631#p167631"/>
<title type="html"><![CDATA[Re: Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167631#p167631"><![CDATA[
[syntax=c]data = UDR0; //pobieramy natychmiast bajt danych z bufora sprzętowego[/syntax]<br />W obu plikach występuje ta linijka. Nie powinno być w mkuart1.c UDR1?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4804">ShutDownSystem</a> — 31 sie 2016, o 12:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[drezzill]]></name></author>
<updated>2016-08-31T12:21:16+01:00</updated>
<published>2016-08-31T11:56:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167630#p167630</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167630#p167630"/>
<title type="html"><![CDATA[Re: Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167630#p167630"><![CDATA[
tak wygląda plik mkuart1.h<br /><br />[syntax=c]/*<br /> * mkuart1.c<br /> *<br /> *  Created on: 2010-09-04<br /> *       Autor: MirosĹ‚aw KardaĹ›<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;mkuart1.h&quot;<br /><br /><br /><br />// definiujemy w końcu nasz bufor UART1_RxBuf<br />volatile char UART1_RxBuf&#91;UART1_RX_BUF_SIZE&#93;;<br />// definiujemy indeksy określające ilość danych w buforze<br />volatile uint16_t UART_RxHead; // indeks oznaczający „głowę węża”<br />volatile uint16_t UART_RxTail; // indeks oznaczający „ogon węża”<br /><br /><br />// definiujemy w końcu nasz bufor UART1_RxBuf<br />volatile char UART1_TxBuf&#91;UART1_TX_BUF_SIZE&#93;;<br />// definiujemy indeksy określające ilość danych w buforze<br />volatile uint16_t UART_TxHead; // indeks oznaczający „głowę węża”<br />volatile uint16_t UART_TxTail; // indeks oznaczający „ogon węża”<br /><br /><br />void USART1_Init( uint16_t baud ) {<br />/* Ustawienie prędkości */<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)|(1&lt;&lt;RXCIE1);<br />/* Ustawienie format ramki: 8bitów danych, 1 bit stopu */<br />UCSR1C = (1&lt;&lt;UCSZ11)|(1&lt;&lt;UCSZ10);<br /><br /><br />// jeśli nie  korzystamy z interefejsu RS485<br /><br /><br />}<br /><br />// definiujemy funkcję dodającą jeden bajtdoz bufora cyklicznego<br />void uart1_putc( char data ) {<br />uint16_t tmp_head;<br /><br />    tmp_head  = (UART_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 == UART_TxTail );<br /><br /><br />    UART1_TxBuf&#91;tmp_head&#93; = data;<br />    UART_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 />}<br /><br /><br />void uart1_puts(char *s)// wysyła łańcuch z pamięci RAM na UART<br />{<br />  register char c;<br />  while ((c = *s++)) uart1_putc(c);// dopóki nie napotkasz 0 wysyłaj znak<br />}<br /><br />void uart1_puts_const(const char *s)// wysyła łańcuch z pamięci RAM na UART<br />{<br />  register char c;<br />  while ((c = *s++)) uart1_putc(c);// dopóki nie napotkasz 0 wysyłaj znak<br />}<br /><br />void uart1_putint(int value, int radix)// wysyła na port szeregowy tekst<br />{<br />char string&#91;17&#93;;// bufor na wynik funkcji itoa<br />itoa(value, string, radix);// konwersja value na ASCII<br />uart1_puts(string);// wyślij string na port szeregowy<br />}<br /><br /><br />// definiujemy procedurę obsługi przerwania nadawczego, pobierającą dane z bufora cyklicznego<br />ISR( USART1_UDRE_vect)  {<br /><br /><br />    // sprawdzamy czy indeksy są różne<br />    if ( UART_TxHead != UART_TxTail ) {<br />    // obliczamy i zapamiętujemy nowy indeks ogona węża (może się zrównać z głową)<br />    UART_TxTail = (UART_TxTail + 1) &amp; UART1_TX_BUF_MASK;<br />    // zwracamy bajt pobrany z bufora  jako rezultat funkcji<br />    UDR1 = UART1_TxBuf&#91;UART_TxTail&#93;;<br /><br />    } else {<br />// zerujemy flagę przerwania występującego gdy bufor pusty<br />UCSR1B &amp;= ~(1&lt;&lt;UDRIE1);<br />    }<br />}<br /><br /><br />// definiujemy funkcję pobierającą jeden bajt z bufora cyklicznego<br />char uart1_getc(void) {<br />    // sprawdzamy czy indeksy są równe<br />    if ( UART_RxHead == UART_RxTail ) return 0;<br /><br />    // obliczamy i zapamiętujemy nowy indeks „ogona węża” (może się zrównać z głową)<br />    UART_RxTail = (UART_RxTail + 1) &amp; UART1_RX_BUF_MASK;<br />    // zwracamy bajt pobrany z bufora  jako rezultat funkcji<br />    return UART1_RxBuf&#91;UART_RxTail&#93;;<br />}<br /><br />// definiujemy procedurę obsługi przerwania odbiorczego, zapisującą dane do bufora cyklicznego<br /><br />ISR (USART1_RX_vect)<br />{<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 = ( UART_RxHead + 1) &amp; UART1_RX_BUF_MASK;<br /><br />// sprawdzamy, czy wąż nie zacznie zjadać własnego ogona<br />if ( tmp_head == UART_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 />UART_RxHead = tmp_head; // zapamiętujemy nowy indeks<br />UART1_RxBuf&#91;tmp_head&#93; = data; // wpisujemy odebrany bajt do bufora<br />}<br />}[/syntax]<br /><br />a tak plik mkuart0.c<br /><br />[syntax=c]/*<br />/*<br /> * mkuart0.c<br /> *<br /> *  Created on: 2010-09-04<br /> *       Autor: MirosĹ‚aw KardaĹ›<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;mkuart0.h&quot;<br /><br /><br /><br />// definiujemy w końcu nasz bufor UART_RxBuf<br />volatile char UART_RxBuf&#91;UART0_RX_BUF_SIZE&#93;;<br />// definiujemy indeksy określające ilość danych w buforze<br />volatile uint8_t UART_RxHead; // indeks oznaczający „głowę węża”<br />volatile uint8_t UART_RxTail; // indeks oznaczający „ogon węża”<br /><br /><br /><br />// definiujemy w końcu nasz bufor UART_RxBuf<br />volatile char UART_TxBuf&#91;UART0_TX_BUF_SIZE&#93;;<br />// definiujemy indeksy określające ilość danych w buforze<br />volatile uint8_t UART_TxHead; // indeks oznaczający „głowę węża”<br />volatile uint8_t UART_TxTail; // indeks oznaczający „ogon węża”<br /><br /><br /><br /><br /><br /><br />void USART0_Init( uint16_t baud ) {<br />/* Ustawienie prędkości */<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)|(1&lt;&lt;RXCIE0);<br />/* Ustawienie format ramki: 8bitów danych, 1 bit stopu */<br />UCSR0C = (1&lt;&lt;UCSZ01)|(1&lt;&lt;UCSZ00);<br />}<br /><br /><br />// procedura obsługi przerwania Tx Complete, gdy zostanie opóżniony UDR<br />// kompilacja gdy używamy RS485<br />#ifdef UART_DE_PORT<br />ISR( USART_TXC_vect ) {<br />  UART_DE_PORT &amp;= ~UART_DE_BIT;// zablokuj nadajnik RS485<br />}<br />#endif<br /><br /><br />// definiujemy funkcję dodającą jeden bajtdoz bufora cyklicznego<br />void uart0_putc( char data ) {<br />uint8_t tmp_head;<br /><br />    tmp_head  = (UART_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 == UART_TxTail );<br /><br /><br />    UART_TxBuf&#91;tmp_head&#93; = data;<br />    UART_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 />}<br /><br /><br />void uart0_puts(char *s)// wysyła łańcuch z pamięci RAM na UART<br />{<br />  register char c;<br />  while ((c = *s++)) uart0_putc(c);// dopóki nie napotkasz 0 wysyłaj znak<br />}<br /><br />void uart0_puts_const(const char *s)// wysyła łańcuch z pamięci RAM na UART<br />{<br />  register char c;<br />  while ((c = *s++)) uart0_putc(c);// dopóki nie napotkasz 0 wysyłaj znak<br />}<br /><br />void uart0_putint(int value, int radix)// wysyła na port szeregowy tekst<br />{<br />char string&#91;17&#93;;// bufor na wynik funkcji itoa<br />itoa(value, string, radix);// konwersja value na ASCII<br />uart0_puts(string);// wyślij string na port szeregowy<br />}<br /><br /><br />// definiujemy procedurę obsługi przerwania nadawczego, pobierającą dane z bufora cyklicznego<br />ISR( USART0_UDRE_vect)  {<br /><br /><br /><br />    // sprawdzamy czy indeksy są różne<br />    if ( UART_TxHead != UART_TxTail ) {<br />    // obliczamy i zapamiętujemy nowy indeks ogona węża (może się zrównać z głową)<br />    UART_TxTail = (UART_TxTail + 1) &amp; UART0_TX_BUF_MASK;<br />    // zwracamy bajt pobrany z bufora  jako rezultat funkcji<br />    UDR0 = UART_TxBuf&#91;UART_TxTail&#93;;<br />    } else {<br />// zerujemy flagę przerwania występującego gdy bufor pusty<br />UCSR0B &amp;= ~(1&lt;&lt;UDRIE0);<br />    }<br />}<br /><br /><br />// definiujemy funkcję pobierającą jeden bajt z bufora cyklicznego<br />char uart0_getc(void) {<br />    // sprawdzamy czy indeksy są równe<br />    if ( UART_RxHead == UART_RxTail ) return 0;<br /><br />    // obliczamy i zapamiętujemy nowy indeks „ogona węża” (może się zrównać z głową)<br />    UART_RxTail = (UART_RxTail + 1) &amp; UART0_RX_BUF_MASK;<br />    // zwracamy bajt pobrany z bufora  jako rezultat funkcji<br /><br />    char c=UART_RxBuf&#91;UART_RxTail&#93;;<br /><br />    UART_RxBuf&#91;UART_RxTail&#93;=0;<br />    return c;<br />}<br /><br />// definiujemy procedurę obsługi przerwania odbiorczego, zapisującą dane do bufora cyklicznego<br /><br />ISR (USART0_RX_vect)<br />{<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 = ( UART_RxHead + 1) &amp; UART0_RX_BUF_MASK;<br /><br />// sprawdzamy, czy wąż nie zacznie zjadać własnego ogona<br />if ( tmp_head == UART_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 />UART_RxHead = tmp_head; // zapamiętujemy nowy indeks<br />UART_RxBuf&#91;tmp_head&#93; = data; // wpisujemy odebrany bajt do bufora<br />}<br />}[/syntax]<br /><br />Bufory i wszystkie inne zmienne są w oddzielnych plikach.<br /><br />Zauważyłem, e jak zmniejszę czas pomiędzy nadaniami, to &quot;zjada&quot; końcówkę, np. wysyła tylko &quot;hell&quot;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5694">drezzill</a> — 31 sie 2016, o 11:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-08-31T11:45:13+01:00</updated>
<published>2016-08-31T11:45:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167628#p167628</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167628#p167628"/>
<title type="html"><![CDATA[Re: Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167628#p167628"><![CDATA[
A przypadkiem nie używasz tych samych buforów / zmiennych do obsługi obu UARTów?<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> — 31 sie 2016, o 11:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-08-31T11:31:46+01:00</updated>
<published>2016-08-31T11:31:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167627#p167627</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167627#p167627"/>
<title type="html"><![CDATA[Re: Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167627#p167627"><![CDATA[
<div class="quotetitle">drezzill napisał(a):</div><div class="quotecontent"><br />Czy jedynym wyjściem jest wstrzymywanie uarta na jakiś czas po nadaniu?<br /></div><br />Gdyby to miało być wyjście to w zasadzie takie rozwiązanie nadawałoby się tylko do kosza <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> to byłaby jakaś tragedia <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... nie po to są sprzętowe moduły .... Coś źle przerobiłeś po prostu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 31 sie 2016, o 11:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[drezzill]]></name></author>
<updated>2016-08-31T11:35:18+01:00</updated>
<published>2016-08-31T11:26:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167625#p167625</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167625#p167625"/>
<title type="html"><![CDATA[Atmega128A i 2 UARTY]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16115&amp;p=167625#p167625"><![CDATA[
Hej.<br /><br />Chcę wykorzystać w atmedze128A dwa uarty ale natknąłem się na problem. Jeśli napiszę coś takiego :<br /> <br />[syntax=c]while(1)<br />{<br />uart0_puts(&quot;hello\r\n&quot;);<br />uart1_puts(&quot;hello\r\n&quot;);<br />_delay_ms(1000);<br />}[/syntax]<br />to dostaję jakieś śmieci albo ucięte słowa. Jeśli użyję<br />[syntax=c]while(1)<br />{<br />uart0_puts(&quot;hello\r\n&quot;);<br />_delay_us(500);<br />uart1_puts(&quot;hello\r\n&quot;);<br />_delay_ms(1000);<br />}[/syntax]<br />to wszystko fajnie śmiga. I tu pojawia się pytanie. Czy zawsze trzeba odczekać jakiś czas po nadaniu wiadomości, żeby użyć drugiego uarta, czy to jakiś błąd np. na płytce i zakłócenia?<br /><br />Używam bibliotek Mirka. Myślałem, że sprawę załatwi dodanie<br />[syntax=c]UCSR0B &amp;= ~(1&lt;&lt;TXEN0);[/syntax]<br />w przerwaniu <br /><br />[syntax=c]USART1_UDRE_vect[/syntax]<br /><br />i dodanie<br />[syntax=c]ISR(USART1_TX_vect)<br />{<br />if(UART_TxHead==UART_TxTail)<br />{<br />UCSR0B |= (1&lt;&lt;TXEN0);<br />}<br />}[/syntax]<br />i o czywiście odpowiednio dla drugiego uarta. Ale to niewiele pomogło. Myślałem, że to zablokuje możliwość nadawania uart0 dopóki nie skończy nadawać uart1 i odwrotnie. Czy jedynym wyjściem jest wstrzymywanie uarta na jakiś czas po nadaniu?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5694">drezzill</a> — 31 sie 2016, o 11:26</p><hr />
]]></content>
</entry>
</feed>