<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Frankne</id>
		<title>RN-Wissen.de - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Frankne"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Frankne"/>
		<updated>2026-04-11T17:36:07Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=UART_mit_avr-gcc&amp;diff=13647</id>
		<title>UART mit avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=UART_mit_avr-gcc&amp;diff=13647"/>
				<updated>2008-07-02T18:02:43Z</updated>
		
		<summary type="html">&lt;p&gt;Frankne: /* Dateikopf und Initialisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier werden zwei verschiedene Arten vorgestellt, wie die [[UART]] benutzt werden kann. Die erste Variante verzichtet auf [[Interrupt]]s und [[Interrupt#Unterschiede zum Polling|pollt]] permanent oder auf Wunsch nach eingehenden Daten. Diese Variante ist einfach, aber nicht effizient. Die zweite Variante arbeitet mit Interrupts und ermögliche eine nebenläufige Kommunikation.&lt;br /&gt;
&lt;br /&gt;
Die Routinen sind erstellt worden für den USART des [[ATmega8]]. Für andere AVR &amp;amp;ndash; neuere Modelle und solche, die mehrer UART-Module besitzen &amp;amp;ndash; haben die Register teilweise andere Namen. Dann gibt es z.B. Register &amp;lt;tt&amp;gt;UBRR0L&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;UBRR1L&amp;lt;/tt&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
= Variante 1: Ohne Interrupts =&lt;br /&gt;
&lt;br /&gt;
Hier eine der einfachsten Möglichkeiten, den Hardware-[[UART]] von [[AVR]] zu nutzen. Die Empfangs- und Sendefunktionen sind so kurz, daß sie am besten als inline-Funktionen definiert werden. Auf Zeichen bzw. Ereignisse zu warten bezeichnet man auch als &amp;quot;''polling''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== C-Datei ==&lt;br /&gt;
&lt;br /&gt;
Der USART wird initialisiert als UART mit dem Datenformat 8N1 (8&amp;amp;nbsp;Datenbits, kein Parity, 1&amp;amp;nbsp;Stopbit). &lt;br /&gt;
&lt;br /&gt;
'''uart.c'''&lt;br /&gt;
 #include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #define BAUDRATE 38400UL //Definition als unsigned long, sonst gibt es Fehler in der Berechnung&lt;br /&gt;
 &lt;br /&gt;
 void uart_init()&lt;br /&gt;
 {&lt;br /&gt;
     uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);&lt;br /&gt;
  &lt;br /&gt;
     UBRRH = (uint8_t) (ubrr&amp;gt;&amp;gt;8);&lt;br /&gt;
     UBRRL = (uint8_t) (ubrr);&lt;br /&gt;
  &lt;br /&gt;
     {{ccomment|UART Receiver und Transmitter anschalten }}&lt;br /&gt;
     {{ccomment|Data mode 8N1, asynchron }}&lt;br /&gt;
     UCSRB = (1 &amp;lt;&amp;lt; RXEN) | (1 &amp;lt;&amp;lt; TXEN);&lt;br /&gt;
     UCSRC = (1 &amp;lt;&amp;lt; URSEL) | (1 &amp;lt;&amp;lt; UCSZ1) | (1 &amp;lt;&amp;lt; UCSZ0);&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte) }}&lt;br /&gt;
     do&lt;br /&gt;
     {&lt;br /&gt;
         UDR;&lt;br /&gt;
     }&lt;br /&gt;
     while (UCSRA &amp;amp; (1 &amp;lt;&amp;lt; RXC));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Benutzer-Schnittstelle und Header ==&lt;br /&gt;
&lt;br /&gt;
Im Header &amp;lt;tt&amp;gt;uart.h&amp;lt;/tt&amp;gt; werden die Funktionen veröffentlicht und stehen in anderen Modulen zur Verfügung:&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern void uart_init()&amp;lt;/tt&amp;gt;: Initialisiert den UART und aktiviert Receiver und Transmitter.&lt;br /&gt;
;&amp;lt;tt&amp;gt;static inline int uart_putc (const uint8_t c)&amp;lt;/tt&amp;gt;: Sendet das Zeichen &amp;lt;tt&amp;gt;c&amp;lt;/tt&amp;gt; über den UART. Der return-Wert ist immer&amp;amp;nbsp;1.&lt;br /&gt;
;&amp;lt;tt&amp;gt;static inline uint8_t uart_getc_wait()&amp;lt;/tt&amp;gt;: Wartet bis zum nächsten Empfang bzw. liefert das empfangene Zeichen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;static inline int uart_getc_nowait()&amp;lt;/tt&amp;gt;: Schaut nach, ob ein Zeichen empfangen wurde und liefert dieses gegebenenfalls als &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; zurück (Wertebereich ist 0...255). Wurde nichts empfangen, wird &amp;lt;tt&amp;gt;-1&amp;lt;/tt&amp;gt; geliefert.&lt;br /&gt;
Die Defines &amp;lt;tt&amp;gt;F_CPU&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;BAUDRATE&amp;lt;/tt&amp;gt; geben die Taktrate des AVR sowie die Baudrate an. Dabei hat &amp;lt;tt&amp;gt;F_CPU&amp;lt;/tt&amp;gt; nur rein informativen Character, es ''ändert'' die CPU-Frequenz nicht! Der Define für &amp;lt;tt&amp;gt;F_CPU&amp;lt;/tt&amp;gt; kann man in die Quelle dazu schreiben, oder man gibt einen Wert per Kommandozeile/[[make|Makefile]] an mit &amp;lt;tt&amp;gt;-DF_CPU=...&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;'''uart.h'''&amp;lt;/tt&amp;gt;&lt;br /&gt;
 #ifndef _UART_H_&lt;br /&gt;
 #define _UART_H_&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 extern void uart_init();&lt;br /&gt;
 &lt;br /&gt;
 static inline int&lt;br /&gt;
 uart_putc (const uint8_t c)&lt;br /&gt;
 {&lt;br /&gt;
     {{ccomment|Warten, bis UDR bereit ist für einen neuen Wert }}&lt;br /&gt;
     while (!(UCSRA &amp;amp; (1 &amp;lt;&amp;lt; UDRE)))&lt;br /&gt;
         ;&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|UDR Schreiben startet die Übertragung }}&lt;br /&gt;
     UDR = c;&lt;br /&gt;
 &lt;br /&gt;
     return 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static inline uint8_t&lt;br /&gt;
 uart_getc_wait()&lt;br /&gt;
 {&lt;br /&gt;
     {{ccomment|Warten, bis etwas empfangen wird }}&lt;br /&gt;
     while (!(UCSRA &amp;amp; (1 &amp;lt;&amp;lt; RXC)))&lt;br /&gt;
         ;&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|Das empfangene Zeichen zurückliefern }}&lt;br /&gt;
     return UDR;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static inline int&lt;br /&gt;
 uart_getc_nowait()&lt;br /&gt;
 {&lt;br /&gt;
     {{ccomment|Liefer das empfangene Zeichen, falls etwas empfangen wurde; -1 sonst }}&lt;br /&gt;
     return (UCSRA &amp;amp; (1 &amp;lt;&amp;lt; RXC)) ? (int) UDR : -1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #endif {{comment|_UART_H_ }}&lt;br /&gt;
&lt;br /&gt;
= Variante 2: Mit Interrupts =&lt;br /&gt;
&lt;br /&gt;
Diese Interrupt-getriebene Variante benutzt FIFO-Methoden aus dem Artikel &amp;quot;[[FIFO mit avr-gcc]]&amp;quot; zur Zwischenspeicherung der zu sendenden und empfangenen Daten.&lt;br /&gt;
&lt;br /&gt;
== Benutzer-Schnittstelle und Header ==&lt;br /&gt;
&lt;br /&gt;
Im Header &amp;lt;tt&amp;gt;uart.h&amp;lt;/tt&amp;gt; werden die Funktionen veröffentlicht und stehen in anderen Modulen zur Verfügung. Das Interface ist das gleiche wie beim Polling.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern void uart_init()&amp;lt;/tt&amp;gt;: Initialisiert den UART und aktiviert Receiver und Transmitter sowie den Receive-Interrupt. Die Ein- und Ausgebe-FIFO werden initialisiert. Das globale Interrupt-Enable-Flag (I-Bit in SREG) wird nicht verändert.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern int uart_putc (const uint8_t c)&amp;lt;/tt&amp;gt;: Speichert das Zeichen &amp;lt;tt&amp;gt;c&amp;lt;/tt&amp;gt; in der Ausgabe-Warteschlange. Der return-Wert ist&amp;amp;nbsp;1, falls das Zeichen in die FIFO eingetragen wurde, und&amp;amp;nbsp;0, falls die Ausgabe-FIFO voll ist. Der UART DATA-Interupt wird aktiviert, der die Zeichen aus der Ausgabe-FIFO über den UART verschickt.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern uint8_t uart_getc_wait()&amp;lt;/tt&amp;gt;: Liefert das nächste empfangene Zeichen aus der Eingabe-FIFO bzw. wartet darauf, falls die FIFO leer ist.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern int uart_getc_nowait()&amp;lt;/tt&amp;gt;: Schaut nach, ob ein Zeichen empfangen wurde und liefert dieses gegebenenfalls als &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; zurück (Wertebereich ist 0...255). Wurde nichts empfangen, wird &amp;lt;tt&amp;gt;-1&amp;lt;/tt&amp;gt; geliefert.&lt;br /&gt;
;&amp;lt;tt&amp;gt;static inline void uart_flush()&amp;lt;/tt&amp;gt;: Wartet, bis die Übertragung fertig ist.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;uart.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef _UART_H_&lt;br /&gt;
#define _UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
extern void uart_init();&lt;br /&gt;
extern int uart_putc (const uint8_t);&lt;br /&gt;
extern uint8_t uart_getc_wait();&lt;br /&gt;
extern int     uart_getc_nowait();&lt;br /&gt;
&lt;br /&gt;
static inline void uart_flush()&lt;br /&gt;
{&lt;br /&gt;
	while (UCSRB &amp;amp; (1 &amp;lt;&amp;lt; UDRIE));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#endif /* _UART_H_ */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C-Datei ==&lt;br /&gt;
&lt;br /&gt;
===Dateikopf und Initialisierung ===&lt;br /&gt;
 #include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;fifo.h&amp;quot; {{ccomment|erklärt im Artikel &amp;quot;[[FIFO mit avr-gcc]]&amp;quot;}}&lt;br /&gt;
 &lt;br /&gt;
 #define BAUDRATE 38400UL //Definition als unsigned long, sonst gibt es Fehler in der Berechnung&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|FIFO-Objekte und Puffer für die Ein- und Ausgabe }}&lt;br /&gt;
 &lt;br /&gt;
 #define BUFSIZE_IN  0x40&lt;br /&gt;
 uint8_t inbuf[BUFSIZE_IN];&lt;br /&gt;
 fifo_t infifo;&lt;br /&gt;
 &lt;br /&gt;
 #define BUFSIZE_OUT 0x40&lt;br /&gt;
 uint8_t outbuf[BUFSIZE_OUT];&lt;br /&gt;
 fifo_t outfifo;&lt;br /&gt;
 &lt;br /&gt;
 void uart_init()&lt;br /&gt;
 {&lt;br /&gt;
     uint8_t sreg = SREG;&lt;br /&gt;
     uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);&lt;br /&gt;
 &lt;br /&gt;
     UBRRH = (uint8_t) (ubrr&amp;gt;&amp;gt;8);&lt;br /&gt;
     UBRRL = (uint8_t) (ubrr);&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|Interrupts kurz deaktivieren }}&lt;br /&gt;
     cli();&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|UART Receiver und Transmitter anschalten, Receive-Interrupt aktivieren }}&lt;br /&gt;
     {{ccomment|Data mode 8N1, asynchron }}&lt;br /&gt;
     UCSRB = (1 &amp;lt;&amp;lt; RXEN) | (1 &amp;lt;&amp;lt; TXEN) | (1 &amp;lt;&amp;lt; RXCIE);&lt;br /&gt;
     UCSRC = (1 &amp;lt;&amp;lt; URSEL) | (1 &amp;lt;&amp;lt; UCSZ1) | (1 &amp;lt;&amp;lt; UCSZ0);&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte) }}&lt;br /&gt;
     do&lt;br /&gt;
     {&lt;br /&gt;
         {{ccomment|UDR auslesen (Wert wird nicht verwendet) }}&lt;br /&gt;
         UDR;&lt;br /&gt;
     }&lt;br /&gt;
     while (UCSRA &amp;amp; (1 &amp;lt;&amp;lt; RXC));&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|Rücksetzen von Receive und Transmit Complete-Flags }}&lt;br /&gt;
     UCSRA = (1 &amp;lt;&amp;lt; RXC) | (1 &amp;lt;&amp;lt; TXC);&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|Global Interrupt-Flag wieder herstellen }}&lt;br /&gt;
     SREG = sreg;&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|FIFOs für Ein- und Ausgabe initialisieren }}&lt;br /&gt;
     fifo_init (&amp;amp;infifo,   inbuf, BUFSIZE_IN);&lt;br /&gt;
     fifo_init (&amp;amp;outfifo, outbuf, BUFSIZE_OUT);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Interrupt-Routinen===&lt;br /&gt;
&lt;br /&gt;
 {{ccomment|Empfangene Zeichen werden in die Eingabgs-FIFO gespeichert und warten dort }}&lt;br /&gt;
 SIGNAL (SIG_UART_RECV)&lt;br /&gt;
 {&lt;br /&gt;
     _inline_fifo_put (&amp;amp;infifo, UDR);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Ein Zeichen aus der Ausgabe-FIFO lesen und ausgeben }}&lt;br /&gt;
 {{ccomment|Ist das Zeichen fertig ausgegeben, wird ein neuer SIG_UART_DATA-IRQ getriggert }}&lt;br /&gt;
 {{ccomment|Ist die FIFO leer, deaktiviert die ISR ihren eigenen IRQ. }}&lt;br /&gt;
 SIGNAL (SIG_UART_DATA)&lt;br /&gt;
 {&lt;br /&gt;
     if (outfifo.count &amp;gt; 0)&lt;br /&gt;
        UDR = _inline_fifo_get (&amp;amp;outfifo);&lt;br /&gt;
     else&lt;br /&gt;
         UCSRB &amp;amp;= ~(1 &amp;lt;&amp;lt; UDRIE);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Ein- und Ausgabe ===&lt;br /&gt;
Die Ein- und Ausgebefunktionen machen nichts weiter, als die empfangenen/zusendenden Zeichen aus der FIFO zu lesen/in die FIFO zu schreiben.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int uart_putc (const uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
    int ret = fifo_put (&amp;amp;outfifo, c);&lt;br /&gt;
	&lt;br /&gt;
    UCSRB |= (1 &amp;lt;&amp;lt; UDRIE);&lt;br /&gt;
	 &lt;br /&gt;
    return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc_nowait ()&lt;br /&gt;
{&lt;br /&gt;
    return fifo_get_nowait (&amp;amp;infifo);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t uart_getc_wait ()&lt;br /&gt;
{&lt;br /&gt;
    return fifo_get_wait (&amp;amp;infifo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Weitere Routinen=&lt;br /&gt;
== Einen String senden ==&lt;br /&gt;
&lt;br /&gt;
Übergeben wird die Start-Adresse des Strings. Die Zeichenkette wird solange durchlaufen und die Zeichen ausgegeben, bis eine &amp;lt;tt&amp;gt;'\0'&amp;lt;/tt&amp;gt; (Stringende-Marke) gelesen wird.&lt;br /&gt;
 #include &amp;lt;avr/interrupt.h&amp;gt;  {{ccomment|Wird nur gebraucht bei der Interrupt-Version }}&lt;br /&gt;
 #include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Einen 0-terminierten String übertragen. }}&lt;br /&gt;
 void uart_puts (const char *s)&lt;br /&gt;
 {&lt;br /&gt;
     do&lt;br /&gt;
     {&lt;br /&gt;
         uart_putc (*s);&lt;br /&gt;
     }&lt;br /&gt;
     while (*s++);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Ein Zeilenumbruch, abhängig davon, was die Gegenstelle haben will }}&lt;br /&gt;
 {{ccomment|Windows: &amp;quot;rn&amp;quot; }}&lt;br /&gt;
 {{ccomment|Linux  : &amp;quot;n&amp;quot; }}&lt;br /&gt;
 {{ccomment|MacOS  : &amp;quot;r&amp;quot; }}&lt;br /&gt;
 #define CR &amp;quot;\r\n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 char text[] = &amp;quot;Hallo Welt.&amp;quot; CR;&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
     uart_init();&lt;br /&gt;
     sei();   {{ccomment|Wird nur gebraucht bei der Interrupt-Version }}&lt;br /&gt;
 &lt;br /&gt;
     uart_puts (text);&lt;br /&gt;
     uart_puts (&amp;quot;Hallo Welt!&amp;quot; CR);&lt;br /&gt;
 &lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Einen konstanten String senden ==&lt;br /&gt;
&lt;br /&gt;
Unveränderliche Strings brauchen kein Platz im SRAM zu verschwenden, man lässt sie im Flash (wo sie sonst ebenfalls stehen für die SRAM-Initialisierung).&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;avr/interrupt.h&amp;gt;   {{ccomment|Wird nur gebraucht bei der Interrupt-Version }}&lt;br /&gt;
 #include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Einen 0-terminierten String senden, der im Flash steht. }}&lt;br /&gt;
 void uart_puts_P (PGM_P s)&lt;br /&gt;
 {&lt;br /&gt;
     while (1)&lt;br /&gt;
     {&lt;br /&gt;
         unsigned char c = pgm_read_byte (s);&lt;br /&gt;
         s++;&lt;br /&gt;
         if ('\0' == c)&lt;br /&gt;
             break;&lt;br /&gt;
         uart_putc (c);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Ein Zeilenumbruch, abhängig davon, was die Gegenstelle haben will }}&lt;br /&gt;
 {{ccomment|Windows: &amp;quot;rn&amp;quot; }}&lt;br /&gt;
 {{ccomment|Linux  : &amp;quot;n&amp;quot; }}&lt;br /&gt;
 {{ccomment|MacOS  : &amp;quot;r&amp;quot; }}&lt;br /&gt;
 #define CR &amp;quot;\r\n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 const prog_char text_p[] = &amp;quot;Hallo Welt.&amp;quot; CR;&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
     uart_init();&lt;br /&gt;
     sei();   {{ccomment|Wird nur gebraucht bei der Interrupt-Version }}&lt;br /&gt;
 &lt;br /&gt;
     uart_puts_P (text_p);&lt;br /&gt;
     uart_puts_P (PSTR(&amp;quot;Hallo Welt!&amp;quot; CR));&lt;br /&gt;
 &lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Siehe auch =&lt;br /&gt;
&lt;br /&gt;
*[[UART]]&lt;br /&gt;
*[[RS232]]&lt;br /&gt;
*[[Software-UART mit avr-gcc]]&lt;br /&gt;
*[[FIFO mit avr-gcc]]&lt;br /&gt;
&lt;br /&gt;
==WebLinks==&lt;br /&gt;
* [http://www.gjlay.de/helferlein/avr-uart-rechner.html AVR-Baudraten-Rechner (JavaScript)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Kommunikation]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;/div&gt;</summary>
		<author><name>Frankne</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=UART_mit_avr-gcc&amp;diff=13646</id>
		<title>UART mit avr-gcc</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=UART_mit_avr-gcc&amp;diff=13646"/>
				<updated>2008-07-02T18:02:21Z</updated>
		
		<summary type="html">&lt;p&gt;Frankne: /* C-Datei */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier werden zwei verschiedene Arten vorgestellt, wie die [[UART]] benutzt werden kann. Die erste Variante verzichtet auf [[Interrupt]]s und [[Interrupt#Unterschiede zum Polling|pollt]] permanent oder auf Wunsch nach eingehenden Daten. Diese Variante ist einfach, aber nicht effizient. Die zweite Variante arbeitet mit Interrupts und ermögliche eine nebenläufige Kommunikation.&lt;br /&gt;
&lt;br /&gt;
Die Routinen sind erstellt worden für den USART des [[ATmega8]]. Für andere AVR &amp;amp;ndash; neuere Modelle und solche, die mehrer UART-Module besitzen &amp;amp;ndash; haben die Register teilweise andere Namen. Dann gibt es z.B. Register &amp;lt;tt&amp;gt;UBRR0L&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;UBRR1L&amp;lt;/tt&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
= Variante 1: Ohne Interrupts =&lt;br /&gt;
&lt;br /&gt;
Hier eine der einfachsten Möglichkeiten, den Hardware-[[UART]] von [[AVR]] zu nutzen. Die Empfangs- und Sendefunktionen sind so kurz, daß sie am besten als inline-Funktionen definiert werden. Auf Zeichen bzw. Ereignisse zu warten bezeichnet man auch als &amp;quot;''polling''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== C-Datei ==&lt;br /&gt;
&lt;br /&gt;
Der USART wird initialisiert als UART mit dem Datenformat 8N1 (8&amp;amp;nbsp;Datenbits, kein Parity, 1&amp;amp;nbsp;Stopbit). &lt;br /&gt;
&lt;br /&gt;
'''uart.c'''&lt;br /&gt;
 #include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 #define BAUDRATE 38400UL //Definition als unsigned long, sonst gibt es Fehler in der Berechnung&lt;br /&gt;
 &lt;br /&gt;
 void uart_init()&lt;br /&gt;
 {&lt;br /&gt;
     uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);&lt;br /&gt;
  &lt;br /&gt;
     UBRRH = (uint8_t) (ubrr&amp;gt;&amp;gt;8);&lt;br /&gt;
     UBRRL = (uint8_t) (ubrr);&lt;br /&gt;
  &lt;br /&gt;
     {{ccomment|UART Receiver und Transmitter anschalten }}&lt;br /&gt;
     {{ccomment|Data mode 8N1, asynchron }}&lt;br /&gt;
     UCSRB = (1 &amp;lt;&amp;lt; RXEN) | (1 &amp;lt;&amp;lt; TXEN);&lt;br /&gt;
     UCSRC = (1 &amp;lt;&amp;lt; URSEL) | (1 &amp;lt;&amp;lt; UCSZ1) | (1 &amp;lt;&amp;lt; UCSZ0);&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte) }}&lt;br /&gt;
     do&lt;br /&gt;
     {&lt;br /&gt;
         UDR;&lt;br /&gt;
     }&lt;br /&gt;
     while (UCSRA &amp;amp; (1 &amp;lt;&amp;lt; RXC));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Benutzer-Schnittstelle und Header ==&lt;br /&gt;
&lt;br /&gt;
Im Header &amp;lt;tt&amp;gt;uart.h&amp;lt;/tt&amp;gt; werden die Funktionen veröffentlicht und stehen in anderen Modulen zur Verfügung:&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern void uart_init()&amp;lt;/tt&amp;gt;: Initialisiert den UART und aktiviert Receiver und Transmitter.&lt;br /&gt;
;&amp;lt;tt&amp;gt;static inline int uart_putc (const uint8_t c)&amp;lt;/tt&amp;gt;: Sendet das Zeichen &amp;lt;tt&amp;gt;c&amp;lt;/tt&amp;gt; über den UART. Der return-Wert ist immer&amp;amp;nbsp;1.&lt;br /&gt;
;&amp;lt;tt&amp;gt;static inline uint8_t uart_getc_wait()&amp;lt;/tt&amp;gt;: Wartet bis zum nächsten Empfang bzw. liefert das empfangene Zeichen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;static inline int uart_getc_nowait()&amp;lt;/tt&amp;gt;: Schaut nach, ob ein Zeichen empfangen wurde und liefert dieses gegebenenfalls als &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; zurück (Wertebereich ist 0...255). Wurde nichts empfangen, wird &amp;lt;tt&amp;gt;-1&amp;lt;/tt&amp;gt; geliefert.&lt;br /&gt;
Die Defines &amp;lt;tt&amp;gt;F_CPU&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;BAUDRATE&amp;lt;/tt&amp;gt; geben die Taktrate des AVR sowie die Baudrate an. Dabei hat &amp;lt;tt&amp;gt;F_CPU&amp;lt;/tt&amp;gt; nur rein informativen Character, es ''ändert'' die CPU-Frequenz nicht! Der Define für &amp;lt;tt&amp;gt;F_CPU&amp;lt;/tt&amp;gt; kann man in die Quelle dazu schreiben, oder man gibt einen Wert per Kommandozeile/[[make|Makefile]] an mit &amp;lt;tt&amp;gt;-DF_CPU=...&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;'''uart.h'''&amp;lt;/tt&amp;gt;&lt;br /&gt;
 #ifndef _UART_H_&lt;br /&gt;
 #define _UART_H_&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 extern void uart_init();&lt;br /&gt;
 &lt;br /&gt;
 static inline int&lt;br /&gt;
 uart_putc (const uint8_t c)&lt;br /&gt;
 {&lt;br /&gt;
     {{ccomment|Warten, bis UDR bereit ist für einen neuen Wert }}&lt;br /&gt;
     while (!(UCSRA &amp;amp; (1 &amp;lt;&amp;lt; UDRE)))&lt;br /&gt;
         ;&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|UDR Schreiben startet die Übertragung }}&lt;br /&gt;
     UDR = c;&lt;br /&gt;
 &lt;br /&gt;
     return 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static inline uint8_t&lt;br /&gt;
 uart_getc_wait()&lt;br /&gt;
 {&lt;br /&gt;
     {{ccomment|Warten, bis etwas empfangen wird }}&lt;br /&gt;
     while (!(UCSRA &amp;amp; (1 &amp;lt;&amp;lt; RXC)))&lt;br /&gt;
         ;&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|Das empfangene Zeichen zurückliefern }}&lt;br /&gt;
     return UDR;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static inline int&lt;br /&gt;
 uart_getc_nowait()&lt;br /&gt;
 {&lt;br /&gt;
     {{ccomment|Liefer das empfangene Zeichen, falls etwas empfangen wurde; -1 sonst }}&lt;br /&gt;
     return (UCSRA &amp;amp; (1 &amp;lt;&amp;lt; RXC)) ? (int) UDR : -1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 #endif {{comment|_UART_H_ }}&lt;br /&gt;
&lt;br /&gt;
= Variante 2: Mit Interrupts =&lt;br /&gt;
&lt;br /&gt;
Diese Interrupt-getriebene Variante benutzt FIFO-Methoden aus dem Artikel &amp;quot;[[FIFO mit avr-gcc]]&amp;quot; zur Zwischenspeicherung der zu sendenden und empfangenen Daten.&lt;br /&gt;
&lt;br /&gt;
== Benutzer-Schnittstelle und Header ==&lt;br /&gt;
&lt;br /&gt;
Im Header &amp;lt;tt&amp;gt;uart.h&amp;lt;/tt&amp;gt; werden die Funktionen veröffentlicht und stehen in anderen Modulen zur Verfügung. Das Interface ist das gleiche wie beim Polling.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern void uart_init()&amp;lt;/tt&amp;gt;: Initialisiert den UART und aktiviert Receiver und Transmitter sowie den Receive-Interrupt. Die Ein- und Ausgebe-FIFO werden initialisiert. Das globale Interrupt-Enable-Flag (I-Bit in SREG) wird nicht verändert.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern int uart_putc (const uint8_t c)&amp;lt;/tt&amp;gt;: Speichert das Zeichen &amp;lt;tt&amp;gt;c&amp;lt;/tt&amp;gt; in der Ausgabe-Warteschlange. Der return-Wert ist&amp;amp;nbsp;1, falls das Zeichen in die FIFO eingetragen wurde, und&amp;amp;nbsp;0, falls die Ausgabe-FIFO voll ist. Der UART DATA-Interupt wird aktiviert, der die Zeichen aus der Ausgabe-FIFO über den UART verschickt.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern uint8_t uart_getc_wait()&amp;lt;/tt&amp;gt;: Liefert das nächste empfangene Zeichen aus der Eingabe-FIFO bzw. wartet darauf, falls die FIFO leer ist.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern int uart_getc_nowait()&amp;lt;/tt&amp;gt;: Schaut nach, ob ein Zeichen empfangen wurde und liefert dieses gegebenenfalls als &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; zurück (Wertebereich ist 0...255). Wurde nichts empfangen, wird &amp;lt;tt&amp;gt;-1&amp;lt;/tt&amp;gt; geliefert.&lt;br /&gt;
;&amp;lt;tt&amp;gt;static inline void uart_flush()&amp;lt;/tt&amp;gt;: Wartet, bis die Übertragung fertig ist.&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;tt&amp;gt;uart.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef _UART_H_&lt;br /&gt;
#define _UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
extern void uart_init();&lt;br /&gt;
extern int uart_putc (const uint8_t);&lt;br /&gt;
extern uint8_t uart_getc_wait();&lt;br /&gt;
extern int     uart_getc_nowait();&lt;br /&gt;
&lt;br /&gt;
static inline void uart_flush()&lt;br /&gt;
{&lt;br /&gt;
	while (UCSRB &amp;amp; (1 &amp;lt;&amp;lt; UDRIE));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#endif /* _UART_H_ */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C-Datei ==&lt;br /&gt;
&lt;br /&gt;
===Dateikopf und Initialisierung ===&lt;br /&gt;
 #include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;fifo.h&amp;quot; {{ccomment|erklärt im Artikel &amp;quot;[[FIFO mit avr-gcc]]&amp;quot;}}&lt;br /&gt;
 &lt;br /&gt;
 #define BAUDRATE 38400&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|FIFO-Objekte und Puffer für die Ein- und Ausgabe }}&lt;br /&gt;
 &lt;br /&gt;
 #define BUFSIZE_IN  0x40&lt;br /&gt;
 uint8_t inbuf[BUFSIZE_IN];&lt;br /&gt;
 fifo_t infifo;&lt;br /&gt;
 &lt;br /&gt;
 #define BUFSIZE_OUT 0x40&lt;br /&gt;
 uint8_t outbuf[BUFSIZE_OUT];&lt;br /&gt;
 fifo_t outfifo;&lt;br /&gt;
 &lt;br /&gt;
 void uart_init()&lt;br /&gt;
 {&lt;br /&gt;
     uint8_t sreg = SREG;&lt;br /&gt;
     uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);&lt;br /&gt;
 &lt;br /&gt;
     UBRRH = (uint8_t) (ubrr&amp;gt;&amp;gt;8);&lt;br /&gt;
     UBRRL = (uint8_t) (ubrr);&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|Interrupts kurz deaktivieren }}&lt;br /&gt;
     cli();&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|UART Receiver und Transmitter anschalten, Receive-Interrupt aktivieren }}&lt;br /&gt;
     {{ccomment|Data mode 8N1, asynchron }}&lt;br /&gt;
     UCSRB = (1 &amp;lt;&amp;lt; RXEN) | (1 &amp;lt;&amp;lt; TXEN) | (1 &amp;lt;&amp;lt; RXCIE);&lt;br /&gt;
     UCSRC = (1 &amp;lt;&amp;lt; URSEL) | (1 &amp;lt;&amp;lt; UCSZ1) | (1 &amp;lt;&amp;lt; UCSZ0);&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte) }}&lt;br /&gt;
     do&lt;br /&gt;
     {&lt;br /&gt;
         {{ccomment|UDR auslesen (Wert wird nicht verwendet) }}&lt;br /&gt;
         UDR;&lt;br /&gt;
     }&lt;br /&gt;
     while (UCSRA &amp;amp; (1 &amp;lt;&amp;lt; RXC));&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|Rücksetzen von Receive und Transmit Complete-Flags }}&lt;br /&gt;
     UCSRA = (1 &amp;lt;&amp;lt; RXC) | (1 &amp;lt;&amp;lt; TXC);&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|Global Interrupt-Flag wieder herstellen }}&lt;br /&gt;
     SREG = sreg;&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|FIFOs für Ein- und Ausgabe initialisieren }}&lt;br /&gt;
     fifo_init (&amp;amp;infifo,   inbuf, BUFSIZE_IN);&lt;br /&gt;
     fifo_init (&amp;amp;outfifo, outbuf, BUFSIZE_OUT);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Interrupt-Routinen===&lt;br /&gt;
&lt;br /&gt;
 {{ccomment|Empfangene Zeichen werden in die Eingabgs-FIFO gespeichert und warten dort }}&lt;br /&gt;
 SIGNAL (SIG_UART_RECV)&lt;br /&gt;
 {&lt;br /&gt;
     _inline_fifo_put (&amp;amp;infifo, UDR);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Ein Zeichen aus der Ausgabe-FIFO lesen und ausgeben }}&lt;br /&gt;
 {{ccomment|Ist das Zeichen fertig ausgegeben, wird ein neuer SIG_UART_DATA-IRQ getriggert }}&lt;br /&gt;
 {{ccomment|Ist die FIFO leer, deaktiviert die ISR ihren eigenen IRQ. }}&lt;br /&gt;
 SIGNAL (SIG_UART_DATA)&lt;br /&gt;
 {&lt;br /&gt;
     if (outfifo.count &amp;gt; 0)&lt;br /&gt;
        UDR = _inline_fifo_get (&amp;amp;outfifo);&lt;br /&gt;
     else&lt;br /&gt;
         UCSRB &amp;amp;= ~(1 &amp;lt;&amp;lt; UDRIE);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Ein- und Ausgabe ===&lt;br /&gt;
Die Ein- und Ausgebefunktionen machen nichts weiter, als die empfangenen/zusendenden Zeichen aus der FIFO zu lesen/in die FIFO zu schreiben.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int uart_putc (const uint8_t c)&lt;br /&gt;
{&lt;br /&gt;
    int ret = fifo_put (&amp;amp;outfifo, c);&lt;br /&gt;
	&lt;br /&gt;
    UCSRB |= (1 &amp;lt;&amp;lt; UDRIE);&lt;br /&gt;
	 &lt;br /&gt;
    return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int uart_getc_nowait ()&lt;br /&gt;
{&lt;br /&gt;
    return fifo_get_nowait (&amp;amp;infifo);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t uart_getc_wait ()&lt;br /&gt;
{&lt;br /&gt;
    return fifo_get_wait (&amp;amp;infifo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Weitere Routinen=&lt;br /&gt;
== Einen String senden ==&lt;br /&gt;
&lt;br /&gt;
Übergeben wird die Start-Adresse des Strings. Die Zeichenkette wird solange durchlaufen und die Zeichen ausgegeben, bis eine &amp;lt;tt&amp;gt;'\0'&amp;lt;/tt&amp;gt; (Stringende-Marke) gelesen wird.&lt;br /&gt;
 #include &amp;lt;avr/interrupt.h&amp;gt;  {{ccomment|Wird nur gebraucht bei der Interrupt-Version }}&lt;br /&gt;
 #include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Einen 0-terminierten String übertragen. }}&lt;br /&gt;
 void uart_puts (const char *s)&lt;br /&gt;
 {&lt;br /&gt;
     do&lt;br /&gt;
     {&lt;br /&gt;
         uart_putc (*s);&lt;br /&gt;
     }&lt;br /&gt;
     while (*s++);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Ein Zeilenumbruch, abhängig davon, was die Gegenstelle haben will }}&lt;br /&gt;
 {{ccomment|Windows: &amp;quot;rn&amp;quot; }}&lt;br /&gt;
 {{ccomment|Linux  : &amp;quot;n&amp;quot; }}&lt;br /&gt;
 {{ccomment|MacOS  : &amp;quot;r&amp;quot; }}&lt;br /&gt;
 #define CR &amp;quot;\r\n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 char text[] = &amp;quot;Hallo Welt.&amp;quot; CR;&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
     uart_init();&lt;br /&gt;
     sei();   {{ccomment|Wird nur gebraucht bei der Interrupt-Version }}&lt;br /&gt;
 &lt;br /&gt;
     uart_puts (text);&lt;br /&gt;
     uart_puts (&amp;quot;Hallo Welt!&amp;quot; CR);&lt;br /&gt;
 &lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Einen konstanten String senden ==&lt;br /&gt;
&lt;br /&gt;
Unveränderliche Strings brauchen kein Platz im SRAM zu verschwenden, man lässt sie im Flash (wo sie sonst ebenfalls stehen für die SRAM-Initialisierung).&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;avr/interrupt.h&amp;gt;   {{ccomment|Wird nur gebraucht bei der Interrupt-Version }}&lt;br /&gt;
 #include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Einen 0-terminierten String senden, der im Flash steht. }}&lt;br /&gt;
 void uart_puts_P (PGM_P s)&lt;br /&gt;
 {&lt;br /&gt;
     while (1)&lt;br /&gt;
     {&lt;br /&gt;
         unsigned char c = pgm_read_byte (s);&lt;br /&gt;
         s++;&lt;br /&gt;
         if ('\0' == c)&lt;br /&gt;
             break;&lt;br /&gt;
         uart_putc (c);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Ein Zeilenumbruch, abhängig davon, was die Gegenstelle haben will }}&lt;br /&gt;
 {{ccomment|Windows: &amp;quot;rn&amp;quot; }}&lt;br /&gt;
 {{ccomment|Linux  : &amp;quot;n&amp;quot; }}&lt;br /&gt;
 {{ccomment|MacOS  : &amp;quot;r&amp;quot; }}&lt;br /&gt;
 #define CR &amp;quot;\r\n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 const prog_char text_p[] = &amp;quot;Hallo Welt.&amp;quot; CR;&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
     uart_init();&lt;br /&gt;
     sei();   {{ccomment|Wird nur gebraucht bei der Interrupt-Version }}&lt;br /&gt;
 &lt;br /&gt;
     uart_puts_P (text_p);&lt;br /&gt;
     uart_puts_P (PSTR(&amp;quot;Hallo Welt!&amp;quot; CR));&lt;br /&gt;
 &lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Siehe auch =&lt;br /&gt;
&lt;br /&gt;
*[[UART]]&lt;br /&gt;
*[[RS232]]&lt;br /&gt;
*[[Software-UART mit avr-gcc]]&lt;br /&gt;
*[[FIFO mit avr-gcc]]&lt;br /&gt;
&lt;br /&gt;
==WebLinks==&lt;br /&gt;
* [http://www.gjlay.de/helferlein/avr-uart-rechner.html AVR-Baudraten-Rechner (JavaScript)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Kommunikation]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Quellcode C]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;/div&gt;</summary>
		<author><name>Frankne</name></author>	</entry>

	</feed>