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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-10-30T19:05:23+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=13389&amp;mode</id>
<entry>
<author><name><![CDATA[mk89]]></name></author>
<updated>2015-10-30T19:05:23+01:00</updated>
<published>2015-10-30T19:05:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143824#p143824</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143824#p143824"/>
<title type="html"><![CDATA[Re: Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143824#p143824"><![CDATA[
słuchajcie panowie śmiech na sali normalnie <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" />  Ja te 12MHz to chyba sobie uroiłem i to nie wiem skąd. UART zaczął ze mną w końcu gadać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />  na baudrate 19200.<br /><br />Wielkie dzięki za pomoc<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11504">mk89</a> — 30 paź 2015, o 19:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jnk0le]]></name></author>
<updated>2015-10-30T16:34:15+01:00</updated>
<published>2015-10-30T16:34:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143816#p143816</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143816#p143816"/>
<title type="html"><![CDATA[Re: Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143816#p143816"><![CDATA[
A jaką masz pewność że chiński kwarc 12MHz ma na pewno 12MHz a nie 16?<br /><br />popróbuj różnych F_CPU aby sekunda była sekundą.<br />2. <a href="https://github.com/jnk0le/Easy-AVR-USART-C-Library"  class="postlink">Zmień bibliotekę</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8491">jnk0le</a> — 30 paź 2015, o 16:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2015-10-30T15:24:52+01:00</updated>
<published>2015-10-30T15:24:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143806#p143806</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143806#p143806"/>
<title type="html"><![CDATA[Re: Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143806#p143806"><![CDATA[
Czy masz na pewno na 1000% tam kwarc 12MHz?<br />Czy sprawdzałeś jak masz ustawione fuse bity, bo może nie korzystasz z zewnętrznego kwarcu - choć między wierszami można wyczytać że sugerujesz uzyskiwanie większej szybkość niż zakładana, co raczej wymaga zewnętrznego kwarcu (podaj jaką masz częstotliwość na LCD).<br /><br />Testowałeś na ustawieniach kwarcu jaki teoretycznie mają oryginalne płytki - 16MHz (tylko obowiązkowo zrób clean projektu po zmianie kwarcu)?<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> — 30 paź 2015, o 15:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mk89]]></name></author>
<updated>2015-10-30T13:41:46+01:00</updated>
<published>2015-10-30T13:41:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143794#p143794</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143794#p143794"/>
<title type="html"><![CDATA[Re: Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143794#p143794"><![CDATA[
Podłączyłem sobie LCD dzisiaj i chyba coś nie tak u mnie z częstotliwością procka gdyż coś za szybko ta sekunda wygląda na LCD'iku.<br />Zakładając projekt wpisuję tam w okienku 12000000 gdyż mam fizycznie 12MHz XTAL ale procek chyba nie śmiga na takowej f w związku z czym może ta chińszczyzna się pojawia przy UART'cie <img src="https://forum.atnel.pl/images/smilies/icon_e_confused.gif" alt=":?" title="Boi się" /> <br /><br />Poniżej przedstawiam ten kod do wyświetlania na LCD<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 30 paź 2015<br /> *      Author: MK<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;HD44780.h&quot;<br /><br />int main(void){<br />int i=0;<br />char txt&#91;7&#93;;<br />LCD_Initalize();<br />LCD_Clear();<br /><br />while(1)<br />{<br />itoa(i,txt,10);<br />LCD_WriteText(txt);<br />i++;<br />LCD_Home();<br />_delay_ms(1000);<br />}<br /><br />}[/syntax]<br /><br />Co nie tak u mnie z tymi częstotliwościami?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11504">mk89</a> — 30 paź 2015, o 13:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2015-10-29T22:51:06+01:00</updated>
<published>2015-10-29T22:51:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143766#p143766</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143766#p143766"/>
<title type="html"><![CDATA[Re: Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143766#p143766"><![CDATA[
Jak masz Atmega328P to masz w nazwach rejestrów dla USARTa jeszcze jego numer, więc kod będzie wyglądał tak:[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define RS232_BAUDRATE9600<br />#define RS232_UBRR_VALUE(uint16_t)(F_CPU / 16.0 / RS232_BAUDRATE - 0.5)<br /><br />int main ( void ) {<br />UBRR0H = RS232_UBRR_VALUE &gt;&gt; 8;<br />UBRR0L = RS232_UBRR_VALUE &amp; 0xFF;<br />UCSR0C = (1 &lt;&lt; UCSZ01 ) | (1 &lt;&lt; UCSZ00);<br />UCSR0B = (1 &lt;&lt; RXEN0) | (1 &lt;&lt; TXEN0);<br /><br />while (1) {<br />UDR0 = 0x41;<br />_delay_ms(500);<br />}<br />}[/syntax]<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> — 29 paź 2015, o 22:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mk89]]></name></author>
<updated>2015-10-29T22:26:56+01:00</updated>
<published>2015-10-29T22:26:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143762#p143762</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143762#p143762"/>
<title type="html"><![CDATA[Re: Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143762#p143762"><![CDATA[
jutro posiedzę przy tym i mam nadzieję, że coś ruszy. Dam znać jutro jak mi z tym poszło. Dzięki za pomysły.<br />pzdr<br /><br />procek na pokładzie to atmega328p z xtalem 12MHz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11504">mk89</a> — 29 paź 2015, o 22:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2015-10-29T22:17:44+01:00</updated>
<published>2015-10-29T22:17:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143761#p143761</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143761#p143761"/>
<title type="html"><![CDATA[Re: Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143761#p143761"><![CDATA[
Proponuję zacznij od sprawdzenia czy działa Ci RS232 w najprostszej konfiguracji, czyli ustaw w main parametry portu szeregowego a następnie wpisuj coś w pętli do UDR (tylko rób przerwy).<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define RS232_BAUDRATE9600<br />#define RS232_UBRR_VALUE(uint16_t)(F_CPU / 16.0 / RS232_BAUDRATE - 0.5)<br /><br />int main ( void ) {<br />UBRRH = RS232_UBRR_VALUE &gt;&gt; 8;<br />UBRRL = RS232_UBRR_VALUE &amp; 0xFF;<br />UCSRC = (1 &lt;&lt; URSEL) | (1 &lt;&lt; UCSZ1 ) | (1 &lt;&lt; UCSZ0);<br />UCSRB = (1 &lt;&lt; RXEN) | (1 &lt;&lt; TXEN);<br /><br />while (1) {<br />UDR = 0x41;<br />_delay_ms(500);<br />}<br />}[/syntax]<br /><br />Tylko pamiętaj, że musisz poprawnie ustawić prędkość oscylatora w Eclipse.<br /><br /><em><span style="color: #9FAA00">Edit: To jest wersja dla ATmega32. Jaki procek masz na swojej płytce?<br /></span></em><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 29 paź 2015, o 22:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[molvin]]></name></author>
<updated>2015-10-29T21:15:16+01:00</updated>
<published>2015-10-29T21:15:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143750#p143750</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143750#p143750"/>
<title type="html"><![CDATA[Re: Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143750#p143750"><![CDATA[
Sprawdź, czy na pewno terminal masz ustawiony na odbiór takiej ramki, jaką wysyłasz z procka. Czy zgadzają się bity parzystości, prędkość itp.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2083">molvin</a> — 29 paź 2015, o 21:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mk89]]></name></author>
<updated>2015-10-29T19:48:38+01:00</updated>
<published>2015-10-29T19:48:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143743#p143743</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143743#p143743"/>
<title type="html"><![CDATA[Re: Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143743#p143743"><![CDATA[
Dzięki Robert za sugestię ale niestety po wprowadzeniu tej zmiany dalej chińszczyzna w terminalu się pojawia <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11504">mk89</a> — 29 paź 2015, o 19:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2015-10-29T18:53:33+01:00</updated>
<published>2015-10-29T18:53:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143722#p143722</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143722#p143722"/>
<title type="html"><![CDATA[Re: Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143722#p143722"><![CDATA[
A dobrze ustawiasz baudrate? Bo tak patrząc na szybko to chyba nie ...<br />W funkcji mamy<div class="codetitle"><b>Code:</b></div><div class="codecontent">/*************************************************************************<br />Function: uart_init()<br />Purpose:  initialize UART and set baudrate<br />Input:    baudrate using macro UART_BAUD_SELECT()<br />Returns:  none<br />**************************************************************************/<br />void uart_init(unsigned int baudrate)<br />{<br />...<br />#if defined(UART0_UBRRH)<br />UART0_UBRRH = (unsigned char)((baudrate&gt;&gt;8)&amp;0x80) ;<br />#endif<br />UART0_UBRRL = (unsigned char) (baudrate&amp;0x00FF);<br /></div>Czyli wpisuje podaną wartość do rejestru a nie przelicza baudrate na nią.<br />Sprawdź czy nie zadziała:<div class="codetitle"><b>Code:</b></div><div class="codecontent">uart_init(UART_BAUD_SELECT(9600, F_CPU));</div>bo taka funkcje masz w tej bibliotece.<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> — 29 paź 2015, o 18:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mk89]]></name></author>
<updated>2015-10-29T17:55:59+01:00</updated>
<published>2015-10-29T17:55:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143712#p143712</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143712#p143712"/>
<title type="html"><![CDATA[Re: Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143712#p143712"><![CDATA[
oryginały są chyba właśnie na 16MHz ale egzemplarz, który posiadam jest na 12MHz. Mkavr kalkulator mówi aby ustawić baudrate 16000 dla takich f ale nie da się takiej wartości ustawić na terminalu<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11504">mk89</a> — 29 paź 2015, o 17:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[szymon12w]]></name></author>
<updated>2015-10-29T17:46:06+01:00</updated>
<published>2015-10-29T17:46:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143711#p143711</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143711#p143711"/>
<title type="html"><![CDATA[Re: Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143711#p143711"><![CDATA[
A czy w Arduino uno nie ma czasem kwarcu 16MHz?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2336">szymon12w</a> — 29 paź 2015, o 17:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mk89]]></name></author>
<updated>2015-10-29T17:14:47+01:00</updated>
<published>2015-10-29T17:14:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143709#p143709</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143709#p143709"/>
<title type="html"><![CDATA[Re: Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143709#p143709"><![CDATA[
mam nadzieję, że teraz już ok<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11504">mk89</a> — 29 paź 2015, o 17:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jaglarz]]></name></author>
<updated>2015-10-29T17:07:11+01:00</updated>
<published>2015-10-29T17:07:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143706#p143706</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143706#p143706"/>
<title type="html"><![CDATA[Re: Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143706#p143706"><![CDATA[
No nie poprawione. A chyba instrukcja zapisana zrozumiale. Jaśniej się chyba już nie da...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=471">Jaglarz</a> — 29 paź 2015, o 17:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mk89]]></name></author>
<updated>2015-10-29T17:16:24+01:00</updated>
<published>2015-10-29T16:14:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143702#p143702</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143702#p143702"/>
<title type="html"><![CDATA[Chińszczyzna na UART'cie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13389&amp;p=143702#p143702"><![CDATA[
Witam,<br />posiadam arduino uno oraz przejściówkę .... <br /><br />uprocek jest na 12MHz, a baudrate na 9600 ustawiony. Próbowałem na innych baudratach ale za każdym razem chińszczyna pojawia się na terminalu. Proszę o jakieś wskazówki.<br /><br /><br />main.c<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 29 paź 2015<br /> *      Author: MK<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include &quot;uart.h&quot;<br /><br /><br /><br />//#define UART_BAUD_RATE      9600<br /><br />int main(void){<br /><br /><br />uart_init(9600);<br /><br />sei();<br /><br />_delay_ms(10000);<br /><br /><br /><br />uart_puts(&quot;avr&quot;);<br /><br /><br /><br /><br /><br />}[/syntax]<br /><br />uart.c<br /><br />[syntax=c]/*************************************************************************<br />Title:    Interrupt UART library with receive/transmit circular buffers<br />Author:   Peter Fleury &lt;pfleury@gmx.ch&gt;   http://tinyurl.com/peterfleury<br />File:     $Id: uart.c,v 1.15.2.4 2015/09/05 18:33:32 peter Exp $<br />Software: AVR-GCC 4.x<br />Hardware: any AVR with built-in UART,<br />License:  GNU General Public License<br /><br />DESCRIPTION:<br />    An interrupt is generated when the UART has finished transmitting or<br />    receiving a byte. The interrupt handling routines use circular buffers<br />    for buffering received and transmitted data.<br /><br />    The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE variables define<br />    the buffer size in bytes. Note that these variables must be a<br />    power of 2.<br /><br />USAGE:<br />    Refere to the header file uart.h for a description of the routines.<br />    See also example test_uart.c.<br /><br />NOTES:<br />    Based on Atmel Application Note AVR306<br /><br />LICENSE:<br />    Copyright (C) 2015 Peter Fleury, GNU General Public License Version 3<br /><br />    This program is free software; you can redistribute it and/or modify<br />    it under the terms of the GNU General Public License as published by<br />    the Free Software Foundation; either version 2 of the License, or<br />    any later version.<br /><br />    This program is distributed in the hope that it will be useful,<br />    but WITHOUT ANY WARRANTY; without even the implied warranty of<br />    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br />    GNU General Public License for more details.<br /><br />*************************************************************************/<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &quot;uart.h&quot;<br /><br /><br />/*<br /> *  constants and macros<br /> */<br /><br />/* size of RX/TX buffers */<br />#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1)<br />#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1)<br /><br />#if ( UART_RX_BUFFER_SIZE &amp; UART_RX_BUFFER_MASK )<br />#error RX buffer size is not a power of 2<br />#endif<br />#if ( UART_TX_BUFFER_SIZE &amp; UART_TX_BUFFER_MASK )<br />#error TX buffer size is not a power of 2<br />#endif<br /><br /><br />#if defined(__AVR_AT90S2313__) || defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || \<br />    defined(__AVR_AT90S4434__) || defined(__AVR_AT90S8535__) || \<br />    defined(__AVR_ATmega103__)<br /> /* old AVR classic or ATmega103 with one UART */<br /> #define UART0_RECEIVE_INTERRUPT   UART_RX_vect<br /> #define UART0_TRANSMIT_INTERRUPT  UART_UDRE_vect<br /> #define UART0_STATUS      USR<br /> #define UART0_CONTROL     UCR<br /> #define UART0_DATA        UDR<br /> #define UART0_UDRIE       UDRIE<br /> #define UART0_UBRRL       UBRR<br /> #define UART0_BIT_U2X     U2X<br /> #define UART0_BIT_RXCIE   RXCIE<br /> #define UART0_BIT_RXEN    RXEN<br /> #define UART0_BIT_TXEN    TXEN<br />#elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__)<br /> /* old AVR classic with one UART */<br /> #define UART0_RECEIVE_INTERRUPT   UART_RX_vect<br /> #define UART0_TRANSMIT_INTERRUPT  UART_UDRE_vect<br /> #define UART0_STATUS      UCSRA<br /> #define UART0_CONTROL     UCSRB<br /> #define UART0_DATA        UDR<br /> #define UART0_UDRIE       UDRIE<br /> #define UART0_UBRRL       UBRR<br /> #define UART0_BIT_U2X     U2X<br /> #define UART0_BIT_RXCIE   RXCIE<br /> #define UART0_BIT_RXEN    RXEN<br /> #define UART0_BIT_TXEN    TXEN<br />#elif defined(__AVR_AT90PWM216__) || defined(__AVR_AT90PWM316__)<br /> /* AT90PWN216/316 with one USART */<br /> #define UART0_RECEIVE_INTERRUPT   USART_RX_vect<br /> #define UART0_TRANSMIT_INTERRUPT  USART_UDRE_vect<br /> #define UART0_STATUS      UCSRA<br /> #define UART0_CONTROL     UCSRB<br /> #define UART0_CONTROLC    UCSRC<br /> #define UART0_DATA        UDR<br /> #define UART0_UDRIE       UDRIE<br /> #define UART0_UBRRL       UBRRL<br /> #define UART0_UBRRH       UBRRH<br /> #define UART0_BIT_U2X     U2X<br /> #define UART0_BIT_RXCIE   RXCIE<br /> #define UART0_BIT_RXEN    RXEN<br /> #define UART0_BIT_TXEN    TXEN<br /> #define UART0_BIT_UCSZ0   UCSZ0<br /> #define UART0_BIT_UCSZ1   UCSZ1<br />#elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega8A__) || \<br />      defined(__AVR_ATmega16__) || defined(__AVR_ATmega16A__) || \<br />      defined(__AVR_ATmega32__) || defined(__AVR_ATmega32A__) || \<br />      defined(__AVR_ATmega323__)<br /> /* ATmega with one USART */<br /> #define UART0_RECEIVE_INTERRUPT   USART_RXC_vect<br /> #define UART0_TRANSMIT_INTERRUPT  USART_UDRE_vect<br /> #define UART0_STATUS      UCSRA<br /> #define UART0_CONTROL     UCSRB<br /> #define UART0_CONTROLC    UCSRC<br /> #define UART0_DATA        UDR<br /> #define UART0_UDRIE       UDRIE<br /> #define UART0_UBRRL       UBRRL<br /> #define UART0_UBRRH       UBRRH<br /> #define UART0_BIT_U2X     U2X<br /> #define UART0_BIT_RXCIE   RXCIE<br /> #define UART0_BIT_RXEN    RXEN<br /> #define UART0_BIT_TXEN    TXEN<br /> #define UART0_BIT_UCSZ0   UCSZ0<br /> #define UART0_BIT_UCSZ1   UCSZ1<br /> #define UART0_BIT_URSEL   URSEL<br />#elif defined (__AVR_ATmega8515__) || defined(__AVR_ATmega8535__)<br /> #define UART0_RECEIVE_INTERRUPT   USART_RX_vect<br /> #define UART0_TRANSMIT_INTERRUPT  USART_UDRE_vect<br /> #define UART0_STATUS      UCSRA<br /> #define UART0_CONTROL     UCSRB<br /> #define UART0_CONTROLC    UCSRC<br /> #define UART0_DATA        UDR<br /> #define UART0_UDRIE       UDRIE<br /> #define UART0_UBRRL       UBRRL<br /> #define UART0_UBRRH       UBRRH<br /> #define UART0_BIT_U2X     U2X<br /> #define UART0_BIT_RXCIE   RXCIE<br /> #define UART0_BIT_RXEN    RXEN<br /> #define UART0_BIT_TXEN    TXEN<br /> #define UART0_BIT_UCSZ0   UCSZ0<br /> #define UART0_BIT_UCSZ1   UCSZ1<br /> #define UART0_BIT_URSEL   URSEL<br />#elif defined(__AVR_ATmega163__)<br />  /* ATmega163 with one UART */<br /> #define UART0_RECEIVE_INTERRUPT   UART_RX_vect<br /> #define UART0_TRANSMIT_INTERRUPT  UART_UDRE_vect<br /> #define UART0_STATUS      UCSRA<br /> #define UART0_CONTROL     UCSRB<br /> #define UART0_DATA        UDR<br /> #define UART0_UDRIE       UDRIE<br /> #define UART0_UBRRL       UBRR<br /> #define UART0_UBRRH       UBRRHI<br /> #define UART0_BIT_U2X     U2X<br /> #define UART0_BIT_RXCIE   RXCIE<br /> #define UART0_BIT_RXEN    RXEN<br /> #define UART0_BIT_TXEN    TXEN<br />#elif defined(__AVR_ATmega162__)<br /> /* ATmega with two USART */<br /> #define ATMEGA_USART1<br /> #define UART0_RECEIVE_INTERRUPT   USART0_RXC_vect<br /> #define UART1_RECEIVE_INTERRUPT   USART1_RXC_vect<br /> #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect<br /> #define UART1_TRANSMIT_INTERRUPT  USART1_UDRE_vect<br /> #define UART0_STATUS      UCSR0A<br /> #define UART0_CONTROL     UCSR0B<br /> #define UART0_CONTROLC    UCSR0C<br /> #define UART0_DATA        UDR0<br /> #define UART0_UDRIE       UDRIE0<br /> #define UART0_UBRRL       UBRR0L<br /> #define UART0_UBRRH       UBRR0H<br /> #define UART0_BIT_URSEL   URSEL0<br /> #define UART0_BIT_U2X     U2X0<br /> #define UART0_BIT_RXCIE   RXCIE0<br /> #define UART0_BIT_RXEN    RXEN0<br /> #define UART0_BIT_TXEN    TXEN0<br /> #define UART0_BIT_UCSZ0   UCSZ00<br /> #define UART0_BIT_UCSZ1   UCSZ01<br /> #define UART1_STATUS      UCSR1A<br /> #define UART1_CONTROL     UCSR1B<br /> #define UART1_CONTROLC    UCSR1C<br /> #define UART1_DATA        UDR1<br /> #define UART1_UDRIE       UDRIE1<br /> #define UART1_UBRRL       UBRR1L<br /> #define UART1_UBRRH       UBRR1H<br /> #define UART1_BIT_URSEL   URSEL1<br /> #define UART1_BIT_U2X     U2X1<br /> #define UART1_BIT_RXCIE   RXCIE1<br /> #define UART1_BIT_RXEN    RXEN1<br /> #define UART1_BIT_TXEN    TXEN1<br /> #define UART1_BIT_UCSZ0   UCSZ10<br /> #define UART1_BIT_UCSZ1   UCSZ11<br />#elif defined(__AVR_ATmega161__)<br /> /* ATmega with UART */<br /> #error &quot;AVR ATmega161 currently not supported by this libaray !&quot;<br />#elif defined(__AVR_ATmega169__)<br /> /* ATmega with one USART */<br /> #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect<br /> #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect<br /> #define UART0_STATUS      UCSRA<br /> #define UART0_CONTROL     UCSRB<br /> #define UART0_CONTROLC    UCSRC<br /> #define UART0_DATA        UDR<br /> #define UART0_UDRIE       UDRIE<br /> #define UART0_UBRRL       UBRRL<br /> #define UART0_UBRRH       UBRRH<br /> #define UART0_BIT_U2X     U2X<br /> #define UART0_BIT_RXCIE   RXCIE<br /> #define UART0_BIT_RXEN    RXEN<br /> #define UART0_BIT_TXEN    TXEN<br /> #define UART0_BIT_UCSZ0   UCSZ0<br /> #define UART0_BIT_UCSZ1   UCSZ1<br />#elif defined(__AVR_ATmega48__) || defined(__AVR_ATmega48A__) || defined(__AVR_ATmega48P__) || defined(__AVR_ATmega48PA__) || defined(__AVR_ATmega48PB__) || \<br />      defined(__AVR_ATmega88__) || defined(__AVR_ATmega88A__) || defined(__AVR_ATmega88P__) || defined(__AVR_ATmega88PA__) || defined(__AVR_ATmega88PB__) || \<br />      defined(__AVR_ATmega168__) || defined(__AVR_ATmega168A__)|| defined(__AVR_ATmega168P__)|| defined(__AVR_ATmega168PA__) || defined(__AVR_ATmega168PB__) || \<br />      defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__) || \<br />      defined(__AVR_ATmega3250__) || defined(__AVR_ATmega3290__) ||defined(__AVR_ATmega6450__) || defined(__AVR_ATmega6490__)<br /> /* ATmega with one USART */<br /> #define UART0_RECEIVE_INTERRUPT   USART_RX_vect<br /> #define UART0_TRANSMIT_INTERRUPT  USART_UDRE_vect<br /> #define UART0_STATUS      UCSR0A<br /> #define UART0_CONTROL     UCSR0B<br /> #define UART0_CONTROLC    UCSR0C<br /> #define UART0_DATA        UDR0<br /> #define UART0_UDRIE       UDRIE0<br /> #define UART0_UBRRL       UBRR0L<br /> #define UART0_UBRRH       UBRR0H<br /> #define UART0_BIT_U2X     U2X0<br /> #define UART0_BIT_RXCIE   RXCIE0<br /> #define UART0_BIT_RXEN    RXEN0<br /> #define UART0_BIT_TXEN    TXEN0<br /> #define UART0_BIT_UCSZ0   UCSZ00<br /> #define UART0_BIT_UCSZ1   UCSZ01<br />#elif defined(__AVR_ATtiny2313__) || defined(__AVR_ATtiny2313A__) || defined(__AVR_ATtiny4313__)<br /> /* ATtiny with one USART */<br /> #define UART0_RECEIVE_INTERRUPT   USART_RX_vect<br /> #define UART0_TRANSMIT_INTERRUPT  USART_UDRE_vect<br /> #define UART0_STATUS      UCSRA<br /> #define UART0_CONTROL     UCSRB<br /> #define UART0_CONTROLC    UCSRC<br /> #define UART0_DATA        UDR<br /> #define UART0_UDRIE       UDRIE<br /> #define UART0_UBRRL       UBRRL<br /> #define UART0_UBRRH       UBRRH<br /> #define UART0_BIT_U2X     U2X<br /> #define UART0_BIT_RXCIE   RXCIE<br /> #define UART0_BIT_RXEN    RXEN<br /> #define UART0_BIT_TXEN    TXEN<br /> #define UART0_BIT_UCSZ0   UCSZ0<br /> #define UART0_BIT_UCSZ1   UCSZ1<br />#elif defined(__AVR_ATmega329__) || defined(__AVR_ATmega649__) || defined(__AVR_ATmega3290__) || defined(__AVR_ATmega6490__) ||\<br />      defined(__AVR_ATmega169A__) || defined(__AVR_ATmega169PA__) || \<br />      defined(__AVR_ATmega329A__) || defined(__AVR_ATmega329PA__) || defined(__AVR_ATmega3290A__) || defined(__AVR_ATmega3290PA__) || \<br />      defined(__AVR_ATmega649A__) || defined(__AVR_ATmega649P__) || defined(__AVR_ATmega6490A__) || defined(__AVR_ATmega6490P__) || \<br />      defined(__AVR_ATmega165__) || defined(__AVR_ATmega325__) || defined(__AVR_ATmega645__) || defined(__AVR_ATmega3250__) || defined(__AVR_ATmega6450__) || \<br />      defined(__AVR_ATmega165A__) || defined(__AVR_ATmega165PA__) || \<br />      defined(__AVR_ATmega325A__) || defined(__AVR_ATmega325PA__) || defined(__AVR_ATmega3250A__) || defined(__AVR_ATmega3250PA__) ||\<br />      defined(__AVR_ATmega645A__) || defined(__AVR_ATmega645PA__) || defined(__AVR_ATmega6450A__) || defined(__AVR_ATmega6450PA__) || \<br />      defined(__AVR_ATmega644__)<br /> /* ATmega with one USART */<br /> #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect<br /> #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect<br /> #define UART0_STATUS      UCSR0A<br /> #define UART0_CONTROL     UCSR0B<br /> #define UART0_CONTROLC    UCSR0C<br /> #define UART0_DATA        UDR0<br /> #define UART0_UDRIE       UDRIE0<br /> #define UART0_UBRRL       UBRR0L<br /> #define UART0_UBRRH       UBRR0H<br /> #define UART0_BIT_U2X     U2X0<br /> #define UART0_BIT_RXCIE   RXCIE0<br /> #define UART0_BIT_RXEN    RXEN0<br /> #define UART0_BIT_TXEN    TXEN0<br /> #define UART0_BIT_UCSZ0   UCSZ00<br /> #define UART0_BIT_UCSZ1   UCSZ01<br />#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) || defined(__AVR_ATmega128A__) ||\<br />      defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) || \<br />      defined(__AVR_ATmega164P__) || defined(__AVR_ATmega324P__) || defined(__AVR_ATmega644P__) ||  \<br />      defined(__AVR_ATmega164A__) || defined(__AVR_ATmega164PA__) || defined(__AVR_ATmega324A__) || defined(__AVR_ATmega324PA__) || \<br />      defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) ||\<br />      defined(__AVR_ATtiny1634__)<br /> /* ATmega with two USART */<br /> #define ATMEGA_USART1<br /> #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect<br /> #define UART1_RECEIVE_INTERRUPT   USART1_RX_vect<br /> #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect<br /> #define UART1_TRANSMIT_INTERRUPT  USART1_UDRE_vect<br /> #define UART0_STATUS      UCSR0A<br /> #define UART0_CONTROL     UCSR0B<br /> #define UART0_CONTROLC    UCSR0C<br /> #define UART0_DATA        UDR0<br /> #define UART0_UDRIE       UDRIE0<br /> #define UART0_UBRRL       UBRR0L<br /> #define UART0_UBRRH       UBRR0H<br /> #define UART0_BIT_U2X     U2X0<br /> #define UART0_BIT_RXCIE   RXCIE0<br /> #define UART0_BIT_RXEN    RXEN0<br /> #define UART0_BIT_TXEN    TXEN0<br /> #define UART0_BIT_UCSZ0   UCSZ00<br /> #define UART0_BIT_UCSZ1   UCSZ01<br /> #define UART1_STATUS      UCSR1A<br /> #define UART1_CONTROL     UCSR1B<br /> #define UART1_CONTROLC    UCSR1C<br /> #define UART1_DATA        UDR1<br /> #define UART1_UDRIE       UDRIE1<br /> #define UART1_UBRRL       UBRR1L<br /> #define UART1_UBRRH       UBRR1H<br /> #define UART1_BIT_U2X     U2X1<br /> #define UART1_BIT_RXCIE   RXCIE1<br /> #define UART1_BIT_RXEN    RXEN1<br /> #define UART1_BIT_TXEN    TXEN1<br /> #define UART1_BIT_UCSZ0   UCSZ10<br /> #define UART1_BIT_UCSZ1   UCSZ11<br />#elif defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) || \<br />      defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || \<br />      defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \<br />      defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1287__)<br /> #define UART0_RECEIVE_INTERRUPT   USART1_RX_vect<br /> #define UART0_TRANSMIT_INTERRUPT  USART1_UDRE_vect<br /> #define UART0_STATUS      UCSR1A<br /> #define UART0_CONTROL     UCSR1B<br /> #define UART0_CONTROLC    UCSR1C<br /> #define UART0_DATA        UDR1<br /> #define UART0_UDRIE       UDRIE1<br /> #define UART0_UBRRL       UBRR1L<br /> #define UART0_UBRRH       UBRR1H<br /> #define UART0_BIT_U2X     U2X1<br /> #define UART0_BIT_RXCIE   RXCIE1<br /> #define UART0_BIT_RXEN    RXEN1<br /> #define UART0_BIT_TXEN    TXEN1<br /> #define UART0_BIT_UCSZ0   UCSZ10<br /> #define UART0_BIT_UCSZ1   UCSZ11<br />#else<br /> #error &quot;no UART definition for MCU available&quot;<br />#endif<br /><br /><br /><br />/*<br /> *  module global variables<br /> */<br />static volatile unsigned char UART_TxBuf&#91;UART_TX_BUFFER_SIZE&#93;;<br />static volatile unsigned char UART_RxBuf&#91;UART_RX_BUFFER_SIZE&#93;;<br />static volatile unsigned char UART_TxHead;<br />static volatile unsigned char UART_TxTail;<br />static volatile unsigned char UART_RxHead;<br />static volatile unsigned char UART_RxTail;<br />static volatile unsigned char UART_LastRxError;<br /><br />#if defined( ATMEGA_USART1 )<br />static volatile unsigned char UART1_TxBuf&#91;UART_TX_BUFFER_SIZE&#93;;<br />static volatile unsigned char UART1_RxBuf&#91;UART_RX_BUFFER_SIZE&#93;;<br />static volatile unsigned char UART1_TxHead;<br />static volatile unsigned char UART1_TxTail;<br />static volatile unsigned char UART1_RxHead;<br />static volatile unsigned char UART1_RxTail;<br />static volatile unsigned char UART1_LastRxError;<br />#endif<br /><br /><br /><br />ISR (UART0_RECEIVE_INTERRUPT)<br />/*************************************************************************<br />Function: UART Receive Complete interrupt<br />Purpose:  called when the UART has received a character<br />**************************************************************************/<br />{<br />    unsigned char tmphead;<br />    unsigned char data;<br />    unsigned char usr;<br />    unsigned char lastRxError;<br /><br /><br />    /* read UART status register and UART data register */<br />    usr  = UART0_STATUS;<br />    data = UART0_DATA;<br /><br />    /* get FEn (Frame Error) DORn (Data OverRun) UPEn (USART Parity Error) bits */<br />#if defined(FE) &amp;&amp; defined(DOR) &amp;&amp; defined(UPE)<br />    lastRxError = usr &amp; (_BV(FE)|_BV(DOR)|_BV(UPE) );<br />#elif defined(FE0) &amp;&amp; defined(DOR0) &amp;&amp; defined(UPE0)<br />    lastRxError = usr &amp; (_BV(FE0)|_BV(DOR0)|_BV(UPE0) );<br />#elif defined(FE1) &amp;&amp; defined(DOR1) &amp;&amp; defined(UPE1)<br />    lastRxError = usr &amp; (_BV(FE1)|_BV(DOR1)|_BV(UPE1) );<br />#elif defined(FE) &amp;&amp; defined(DOR)<br />    lastRxError = usr &amp; (_BV(FE)|_BV(DOR) );<br />#endif<br /><br />    /* calculate buffer index */<br />    tmphead = ( UART_RxHead + 1) &amp; UART_RX_BUFFER_MASK;<br /><br />    if ( tmphead == UART_RxTail ) {<br />        /* error: receive buffer overflow */<br />        lastRxError = UART_BUFFER_OVERFLOW &gt;&gt; 8;<br />    }else{<br />        /* store new index */<br />        UART_RxHead = tmphead;<br />        /* store received data in buffer */<br />        UART_RxBuf&#91;tmphead&#93; = data;<br />    }<br />    UART_LastRxError |= lastRxError;<br />}<br /><br /><br />ISR (UART0_TRANSMIT_INTERRUPT)<br />/*************************************************************************<br />Function: UART Data Register Empty interrupt<br />Purpose:  called when the UART is ready to transmit the next byte<br />**************************************************************************/<br />{<br />    unsigned char tmptail;<br /><br /><br />    if ( UART_TxHead != UART_TxTail) {<br />        /* calculate and store new buffer index */<br />        tmptail = (UART_TxTail + 1) &amp; UART_TX_BUFFER_MASK;<br />        UART_TxTail = tmptail;<br />        /* get one byte from buffer and write it to UART */<br />        UART0_DATA = UART_TxBuf&#91;tmptail&#93;;  /* start transmission */<br />    }else{<br />        /* tx buffer empty, disable UDRE interrupt */<br />        UART0_CONTROL &amp;= ~_BV(UART0_UDRIE);<br />    }<br />}<br /><br /><br />/*************************************************************************<br />Function: uart_init()<br />Purpose:  initialize UART and set baudrate<br />Input:    baudrate using macro UART_BAUD_SELECT()<br />Returns:  none<br />**************************************************************************/<br />void uart_init(unsigned int baudrate)<br />{<br />    UART_TxHead = 0;<br />    UART_TxTail = 0;<br />    UART_RxHead = 0;<br />    UART_RxTail = 0;<br /><br />#ifdef UART_TEST<br />#ifndef UART0_BIT_U2X<br />#warning &quot;UART0_BIT_U2X not defined&quot;<br />#endif<br />#ifndef UART0_UBRRH<br />#warning &quot;UART0_UBRRH not defined&quot;<br />#endif<br />#ifndef UART0_CONTROLC<br />#warning &quot;UART0_CONTROLC not defined&quot;<br />#endif<br />#if defined(URSEL) || defined(URSEL0)<br />#ifndef UART0_BIT_URSEL<br />#warning &quot;UART0_BIT_URSEL not defined&quot;<br />#endif<br />#endif<br />#endif<br /><br />    /* Set baud rate */<br />    if ( baudrate &amp; 0x8000 )<br />    {<br />        #if UART0_BIT_U2X<br />        UART0_STATUS = (1&lt;&lt;UART0_BIT_U2X);  //Enable 2x speed<br />        #endif<br />    }<br />    #if defined(UART0_UBRRH)<br />    UART0_UBRRH = (unsigned char)((baudrate&gt;&gt;8)&amp;0x80) ;<br />    #endif<br />    UART0_UBRRL = (unsigned char) (baudrate&amp;0x00FF);<br /><br />    /* Enable USART receiver and transmitter and receive complete interrupt */<br />    UART0_CONTROL = _BV(UART0_BIT_RXCIE)|(1&lt;&lt;UART0_BIT_RXEN)|(1&lt;&lt;UART0_BIT_TXEN);<br /><br />    /* Set frame format: asynchronous, 8data, no parity, 1stop bit */<br />    #ifdef UART0_CONTROLC<br />    #ifdef UART0_BIT_URSEL<br />    UART0_CONTROLC = (1&lt;&lt;UART0_BIT_URSEL)|(1&lt;&lt;UART0_BIT_UCSZ1)|(1&lt;&lt;UART0_BIT_UCSZ0);<br />    #else<br />    UART0_CONTROLC = (1&lt;&lt;UART0_BIT_UCSZ1)|(1&lt;&lt;UART0_BIT_UCSZ0);<br />    #endif<br />    #endif<br /><br />}/* uart_init */<br /><br /><br />/*************************************************************************<br />Function: uart_getc()<br />Purpose:  return byte from ringbuffer<br />Returns:  lower byte:  received byte from ringbuffer<br />          higher byte: last receive error<br />**************************************************************************/<br />unsigned int uart_getc(void)<br />{<br />    unsigned char tmptail;<br />    unsigned char data;<br />    unsigned char lastRxError;<br /><br /><br />    if ( UART_RxHead == UART_RxTail ) {<br />        return UART_NO_DATA;   /* no data available */<br />    }<br /><br />    /* calculate buffer index */<br />    tmptail = (UART_RxTail + 1) &amp; UART_RX_BUFFER_MASK;<br /><br />    /* get data from receive buffer */<br />    data = UART_RxBuf&#91;tmptail&#93;;<br />    lastRxError = UART_LastRxError;<br /><br />    /* store buffer index */<br />    UART_RxTail = tmptail;<br /><br />    UART_LastRxError = 0;<br />    return (lastRxError &lt;&lt; 8) + data;<br /><br />}/* uart_getc */<br /><br /><br />/*************************************************************************<br />Function: uart_putc()<br />Purpose:  write byte to ringbuffer for transmitting via UART<br />Input:    byte to be transmitted<br />Returns:  none<br />**************************************************************************/<br />void uart_putc(unsigned char data)<br />{<br />    unsigned char tmphead;<br /><br /><br />    tmphead  = (UART_TxHead + 1) &amp; UART_TX_BUFFER_MASK;<br /><br />    while ( tmphead == UART_TxTail ){<br />        ;/* wait for free space in buffer */<br />    }<br /><br />    UART_TxBuf&#91;tmphead&#93; = data;<br />    UART_TxHead = tmphead;<br /><br />    /* enable UDRE interrupt */<br />    UART0_CONTROL    |= _BV(UART0_UDRIE);<br /><br />}/* uart_putc */<br /><br /><br />/*************************************************************************<br />Function: uart_puts()<br />Purpose:  transmit string to UART<br />Input:    string to be transmitted<br />Returns:  none<br />**************************************************************************/<br />void uart_puts(const char *s )<br />{<br />    while (*s)<br />      uart_putc(*s++);<br /><br />}/* uart_puts */<br /><br /><br />/*************************************************************************<br />Function: uart_puts_p()<br />Purpose:  transmit string from program memory to UART<br />Input:    program memory string to be transmitted<br />Returns:  none<br />**************************************************************************/<br />void uart_puts_p(const char *progmem_s )<br />{<br />    register char c;<br /><br />    while ( (c = pgm_read_byte(progmem_s++)) )<br />      uart_putc(c);<br /><br />}/* uart_puts_p */<br /><br /><br />/*<br /> * these functions are only for ATmegas with two USART<br /> */<br />#if defined( ATMEGA_USART1 )<br /><br />ISR(UART1_RECEIVE_INTERRUPT)<br />/*************************************************************************<br />Function: UART1 Receive Complete interrupt<br />Purpose:  called when the UART1 has received a character<br />**************************************************************************/<br />{<br />    unsigned char tmphead;<br />    unsigned char data;<br />    unsigned char usr;<br />    unsigned char lastRxError;<br /><br /><br />    /* read UART status register and UART data register */<br />    usr  = UART1_STATUS;<br />    data = UART1_DATA;<br /><br />    /* get FEn (Frame Error) DORn (Data OverRun) UPEn (USART Parity Error) bits */<br />    lastRxError = usr &amp; (_BV(FE1)|_BV(DOR1)|_BV(UPE1) );<br /><br />    /* calculate buffer index */<br />    tmphead = ( UART1_RxHead + 1) &amp; UART_RX_BUFFER_MASK;<br /><br />    if ( tmphead == UART1_RxTail ) {<br />        /* error: receive buffer overflow */<br />        lastRxError = UART_BUFFER_OVERFLOW &gt;&gt; 8;<br />    }else{<br />        /* store new index */<br />        UART1_RxHead = tmphead;<br />        /* store received data in buffer */<br />        UART1_RxBuf&#91;tmphead&#93; = data;<br />    }<br />    UART1_LastRxError |= lastRxError;<br />}<br /><br /><br />ISR(UART1_TRANSMIT_INTERRUPT)<br />/*************************************************************************<br />Function: UART1 Data Register Empty interrupt<br />Purpose:  called when the UART1 is ready to transmit the next byte<br />**************************************************************************/<br />{<br />    unsigned char tmptail;<br /><br /><br />    if ( UART1_TxHead != UART1_TxTail) {<br />        /* calculate and store new buffer index */<br />        tmptail = (UART1_TxTail + 1) &amp; UART_TX_BUFFER_MASK;<br />        UART1_TxTail = tmptail;<br />        /* get one byte from buffer and write it to UART */<br />        UART1_DATA = UART1_TxBuf&#91;tmptail&#93;;  /* start transmission */<br />    }else{<br />        /* tx buffer empty, disable UDRE interrupt */<br />        UART1_CONTROL &amp;= ~_BV(UART1_UDRIE);<br />    }<br />}<br /><br /><br />/*************************************************************************<br />Function: uart1_init()<br />Purpose:  initialize UART1 and set baudrate<br />Input:    baudrate using macro UART_BAUD_SELECT()<br />Returns:  none<br />**************************************************************************/<br />void uart1_init(unsigned int baudrate)<br />{<br />    UART1_TxHead = 0;<br />    UART1_TxTail = 0;<br />    UART1_RxHead = 0;<br />    UART1_RxTail = 0;<br /><br />#ifdef UART_TEST<br />#ifndef UART1_BIT_U2X<br />#warning &quot;UART1_BIT_U2X not defined&quot;<br />#endif<br />#ifndef UART1_UBRRH<br />#warning &quot;UART1_UBRRH not defined&quot;<br />#endif<br />#ifndef UART1_CONTROLC<br />#warning &quot;UART1_CONTROLC not defined&quot;<br />#endif<br />#if defined(URSEL) || defined(URSEL1)<br />#ifndef UART1_BIT_URSEL<br />#warning &quot;UART1_BIT_URSEL not defined&quot;<br />#endif<br />#endif<br />#endif<br /><br />    /* Set baud rate */<br />    if ( baudrate &amp; 0x8000 )<br />    {<br />        #if UART1_BIT_U2X<br />            UART1_STATUS = (1&lt;&lt;UART1_BIT_U2X);  //Enable 2x speed<br />        #endif<br />    }<br />    UART1_UBRRH = (unsigned char)((baudrate&gt;&gt;8)&amp;0x80) ;<br />    UART1_UBRRL = (unsigned char) baudrate;<br /><br />    /* Enable USART receiver and transmitter and receive complete interrupt */<br />    UART1_CONTROL = _BV(UART1_BIT_RXCIE)|(1&lt;&lt;UART1_BIT_RXEN)|(1&lt;&lt;UART1_BIT_TXEN);<br /><br />    /* Set frame format: asynchronous, 8data, no parity, 1stop bit */<br />    #ifdef UART1_BIT_URSEL<br />    UART1_CONTROLC = (1&lt;&lt;UART1_BIT_URSEL)|(1&lt;&lt;UART1_BIT_UCSZ1)|(1&lt;&lt;UART1_BIT_UCSZ0);<br />    #else<br />    UART1_CONTROLC = (1&lt;&lt;UART1_BIT_UCSZ1)|(1&lt;&lt;UART1_BIT_UCSZ0);<br />    #endif<br /><br />}/* uart_init */<br /><br /><br />/*************************************************************************<br />Function: uart1_getc()<br />Purpose:  return byte from ringbuffer<br />Returns:  lower byte:  received byte from ringbuffer<br />          higher byte: last receive error<br />**************************************************************************/<br />unsigned int uart1_getc(void)<br />{<br />    unsigned char tmptail;<br />    unsigned int  data;<br />    unsigned char lastRxError;<br /><br /><br />    if ( UART1_RxHead == UART1_RxTail ) {<br />        return UART_NO_DATA;   /* no data available */<br />    }<br /><br />    /* calculate buffer index */<br />    tmptail = (UART1_RxTail + 1) &amp; UART_RX_BUFFER_MASK;<br /><br />    /* get data from receive buffer */<br />    data = UART1_RxBuf&#91;tmptail&#93;;<br />    lastRxError = UART1_LastRxError;<br /><br />    /* store buffer index */<br />    UART1_RxTail = tmptail;<br /><br />    UART1_LastRxError = 0;<br />    return (lastRxError &lt;&lt; 8) + data;<br /><br />}/* uart1_getc */<br /><br /><br />/*************************************************************************<br />Function: uart1_putc()<br />Purpose:  write byte to ringbuffer for transmitting via UART<br />Input:    byte to be transmitted<br />Returns:  none<br />**************************************************************************/<br />void uart1_putc(unsigned char data)<br />{<br />    unsigned char tmphead;<br /><br /><br />    tmphead  = (UART1_TxHead + 1) &amp; UART_TX_BUFFER_MASK;<br /><br />    while ( tmphead == UART1_TxTail ){<br />        ;/* wait for free space in buffer */<br />    }<br /><br />    UART1_TxBuf&#91;tmphead&#93; = data;<br />    UART1_TxHead = tmphead;<br /><br />    /* enable UDRE interrupt */<br />    UART1_CONTROL    |= _BV(UART1_UDRIE);<br /><br />}/* uart1_putc */<br /><br /><br />/*************************************************************************<br />Function: uart1_puts()<br />Purpose:  transmit string to UART1<br />Input:    string to be transmitted<br />Returns:  none<br />**************************************************************************/<br />void uart1_puts(const char *s )<br />{<br />    while (*s)<br />      uart1_putc(*s++);<br /><br />}/* uart1_puts */<br /><br /><br />/*************************************************************************<br />Function: uart1_puts_p()<br />Purpose:  transmit string from program memory to UART1<br />Input:    program memory string to be transmitted<br />Returns:  none<br />**************************************************************************/<br />void uart1_puts_p(const char *progmem_s )<br />{<br />    register char c;<br /><br />    while ( (c = pgm_read_byte(progmem_s++)) )<br />      uart1_putc(c);<br /><br />}/* uart1_puts_p */<br /><br /><br />#endif[/syntax]<br /><br />uart.h<br /><br />[syntax=c]#ifndef UART_H<br />#define UART_H<br />/************************************************************************<br />Title:    Interrupt UART library with receive/transmit circular buffers<br />Author:   Peter Fleury &lt;pfleury@gmx.ch&gt;  http://tinyurl.com/peterfleury<br />File:     $Id: uart.h,v 1.13 2015/01/11 13:53:25 peter Exp $<br />Software: AVR-GCC 4.x, AVR Libc 1.4 or higher<br />Hardware: any AVR with built-in UART/USART<br />Usage:    see Doxygen manual<br /><br />LICENSE:<br />    Copyright (C) 2015 Peter Fleury, GNU General Public License Version 3<br /><br />    This program is free software; you can redistribute it and/or modify<br />    it under the terms of the GNU General Public License as published by<br />    the Free Software Foundation; either version 3 of the License, or<br />    any later version.<br /><br />    This program is distributed in the hope that it will be useful,<br />    but WITHOUT ANY WARRANTY; without even the implied warranty of<br />    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br />    GNU General Public License for more details.<br /><br />************************************************************************/<br /><br />/**<br /> *  @file<br /> *  @defgroup pfleury_uart UART Library &lt;uart.h&gt;<br /> *  @code #include &lt;uart.h&gt; @endcode<br /> *<br /> *  @brief Interrupt UART library using the built-in UART with transmit and receive circular buffers.<br /> *<br /> *  This library can be used to transmit and receive data through the built in UART.<br /> *<br /> *  An interrupt is generated when the UART has finished transmitting or<br /> *  receiving a byte. The interrupt handling routines use circular buffers<br /> *  for buffering received and transmitted data.<br /> *<br /> *  The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE constants define<br /> *  the size of the circular buffers in bytes. Note that these constants must be a power of 2.<br /> *  You may need to adapt these constants to your target and your application by adding<br /> *  CDEFS += -DUART_RX_BUFFER_SIZE=nn -DUART_TX_BUFFER_SIZE=nn to your Makefile.<br /> *<br /> *  @note Based on Atmel Application Note AVR306<br /> *  @author Peter Fleury pfleury@gmx.ch  http://tinyurl.com/peterfleury<br /> *  @copyright (C) 2015 Peter Fleury, GNU General Public License Version 3<br /> */<br /><br /><br />#include &lt;avr/pgmspace.h&gt;<br /><br />#if (__GNUC__ * 100 + __GNUC_MINOR__) &lt; 405<br />#error &quot;This library requires AVR-GCC 4.5 or later, update to newer AVR-GCC compiler !&quot;<br />#endif<br /><br /><br />/**@{*/<br /><br /><br />/*<br />** constants and macros<br />*/<br /><br /><br />/** @brief  UART Baudrate Expression<br /> *  @param  xtalCpu  system clock in Mhz, e.g. 4000000UL for 4Mhz<br /> *  @param  baudRate baudrate in bps, e.g. 1200, 2400, 9600<br /> */<br />#define UART_BAUD_SELECT(baudRate,xtalCpu)  (((xtalCpu) + 8UL * (baudRate)) / (16UL * (baudRate)) -1UL)<br /><br />/** @brief  UART Baudrate Expression for ATmega double speed mode<br /> *  @param  xtalCpu  system clock in Mhz, e.g. 4000000UL for 4Mhz<br /> *  @param  baudRate baudrate in bps, e.g. 1200, 2400, 9600<br /> */<br />#define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) ( ((((xtalCpu) + 4UL * (baudRate)) / (8UL * (baudRate)) -1UL)) | 0x8000)<br /><br />/** @brief  Size of the circular receive buffer, must be power of 2<br /> *<br /> *  You may need to adapt this constant to your target and your application by adding<br /> *  CDEFS += -DUART_RX_BUFFER_SIZE=nn to your Makefile.<br /> */<br />#ifndef UART_RX_BUFFER_SIZE<br />#define UART_RX_BUFFER_SIZE 32<br />#endif<br /><br />/** @brief  Size of the circular transmit buffer, must be power of 2<br /> *<br /> *  You may need to adapt this constant to your target and your application by adding<br /> *  CDEFS += -DUART_TX_BUFFER_SIZE=nn to your Makefile.<br /> */<br />#ifndef UART_TX_BUFFER_SIZE<br />#define UART_TX_BUFFER_SIZE 32<br />#endif<br /><br />/* test if the size of the circular buffers fits into SRAM */<br />#if ( (UART_RX_BUFFER_SIZE+UART_TX_BUFFER_SIZE) &gt;= (RAMEND-0x60 ) )<br />#error &quot;size of UART_RX_BUFFER_SIZE + UART_TX_BUFFER_SIZE larger than size of SRAM&quot;<br />#endif<br /><br />/*<br />** high byte error return code of uart_getc()<br />*/<br />#define UART_FRAME_ERROR      0x1000              /**&lt; @brief Framing Error by UART       */<br />#define UART_OVERRUN_ERROR    0x0800              /**&lt; @brief Overrun condition by UART   */<br />#define UART_PARITY_ERROR     0x0400              /**&lt; @brief Parity Error by UART        */<br />#define UART_BUFFER_OVERFLOW  0x0200              /**&lt; @brief receive ringbuffer overflow */<br />#define UART_NO_DATA          0x0100              /**&lt; @brief no receive data available   */<br /><br /><br />/*<br />** function prototypes<br />*/<br /><br />/**<br />   @brief   Initialize UART and set baudrate<br />   @param   baudrate Specify baudrate using macro UART_BAUD_SELECT()<br />   @return  none<br />*/<br />extern void uart_init(unsigned int baudrate);<br /><br /><br />/**<br /> *  @brief   Get received byte from ringbuffer<br /> *<br /> * Returns in the lower byte the received character and in the<br /> * higher byte the last receive error.<br /> * UART_NO_DATA is returned when no data is available.<br /> *<br /> *  @return  lower byte:  received byte from ringbuffer<br /> *  @return  higher byte: last receive status<br /> *           - \b 0 successfully received data from UART<br /> *           - \b UART_NO_DATA<br /> *             &lt;br&gt;no receive data available<br /> *           - \b UART_BUFFER_OVERFLOW<br /> *             &lt;br&gt;Receive ringbuffer overflow.<br /> *             We are not reading the receive buffer fast enough,<br /> *             one or more received character have been dropped<br /> *           - \b UART_OVERRUN_ERROR<br /> *             &lt;br&gt;Overrun condition by UART.<br /> *             A character already present in the UART UDR register was<br /> *             not read by the interrupt handler before the next character arrived,<br /> *             one or more received characters have been dropped.<br /> *           - \b UART_FRAME_ERROR<br /> *             &lt;br&gt;Framing Error by UART<br /> */<br />extern unsigned int uart_getc(void);<br /><br /><br />/**<br /> *  @brief   Put byte to ringbuffer for transmitting via UART<br /> *  @param   data byte to be transmitted<br /> *  @return  none<br /> */<br />extern void uart_putc(unsigned char data);<br /><br /><br />/**<br /> *  @brief   Put string to ringbuffer for transmitting via UART<br /> *<br /> *  The string is buffered by the uart library in a circular buffer<br /> *  and one character at a time is transmitted to the UART using interrupts.<br /> *  Blocks if it can not write the whole string into the circular buffer.<br /> *<br /> *  @param   s string to be transmitted<br /> *  @return  none<br /> */<br />extern void uart_puts(const char *s );<br /><br /><br />/**<br /> * @brief    Put string from program memory to ringbuffer for transmitting via UART.<br /> *<br /> * The string is buffered by the uart library in a circular buffer<br /> * and one character at a time is transmitted to the UART using interrupts.<br /> * Blocks if it can not write the whole string into the circular buffer.<br /> *<br /> * @param    s program memory string to be transmitted<br /> * @return   none<br /> * @see      uart_puts_P<br /> */<br />extern void uart_puts_p(const char *s );<br /><br />/**<br /> * @brief    Macro to automatically put a string constant into program memory<br /> */<br />#define uart_puts_P(__s)       uart_puts_p(PSTR(__s))<br /><br /><br /><br />/** @brief  Initialize USART1 (only available on selected ATmegas) @see uart_init */<br />extern void uart1_init(unsigned int baudrate);<br />/** @brief  Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc */<br />extern unsigned int uart1_getc(void);<br />/** @brief  Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc */<br />extern void uart1_putc(unsigned char data);<br />/** @brief  Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts */<br />extern void uart1_puts(const char *s );<br />/** @brief  Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p */<br />extern void uart1_puts_p(const char *s );<br />/** @brief  Macro to automatically put a string constant into program memory */<br />#define uart1_puts_P(__s)       uart1_puts_p(PSTR(__s))<br /><br />/**@}*/<br /><br /><br />#endif // UART_H[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11504">mk89</a> — 29 paź 2015, o 16:14</p><hr />
]]></content>
</entry>
</feed>