Aus RN-Wissen.de
Wechseln zu: Navigation, Suche
Laderegler Test Tueftler Seite

 
Zeile 117: Zeile 117:
 
</pre>
 
</pre>
 
-->
 
-->
 +
 +
=Weitere Routinen=
 +
== Einen String senden ==
 +
 +
Übergeben wird die Start-Adresse des Strings. Die Zeichenkette wird solange durchlaufen und die Zeichen ausgegeben, bis eine <tt>'\0'</tt> (Stringende-Marke) gelesen wird.
 +
<pre>
 +
#include "uart.h"
 +
 +
void uart_puts (const char *s)
 +
{
 +
    while (*s)
 +
    {
 +
        uart_putc (*s++);
 +
    }
 +
}
 +
 +
// Ein Zeilenumbruch, abhängig davon, was die Gegenstelle haben will
 +
// Winwows: "\r\n"
 +
// Linux  : "\n"
 +
// MacOs  : "\r"
 +
 +
char text[] = "Hallo Welt.\r\"
 +
int main()
 +
{
 +
    uart_init();
 +
 +
    uart_puts (text);
 +
    uart_puts ("Hallo Welt!\r\n");
 +
 +
    return 0;
 +
}
 +
</pre>
  
 
= Siehe auch =
 
= Siehe auch =

Version vom 7. Februar 2006, 16:59 Uhr

Ohne Receive-Interrupt

Hier eine der einfachsten Möglichkeiten, den Harware-UART von AVR zu nutzen. Die Empfangs- und Sendefunktionen sind so kurz, daß sie am besten als inline-Funktionen definiert werden.

C-Datei

Der USART wird Initialisiert als UART mit dem Datenformat 8N1 (8 Datenbits, kein Parity, 1 Stopbit).

#include <avr/io.h>
#include "uart.h"

#define BAUDRATE 38400

void uart_init()
{
    uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);
     
    UBRRH = (unsigned char) (ubrr>>8);
    UBRRL = (unsigned char) (ubrr);
   
    // UART Receiver und Transmitter anschalten
    // Data mode 8N1, asynchron
    UCSRB = (1 << RXEN) | (1 << TXEN);
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);

    // Flush Receive-Buffer
    do
    {
        unsigned char dummy;
        (void) (dummy = UDR);
    }
    while (UCSRA & (1 << RXC));
}

Benutzer-Schnittstelle und Header

Im Header uart.h werden die Funktionen veröffentlicht und stehen in anderen Modulen zur Verfügung:

extern void uart_init()
Initialisiert den UART und aktiviert Receiver und Transmitter.
static inline void uart_putc (const char c)
Sendet das Zeichen c über den UART.
static inline int uart_getc_wait()
Wartet bis zum nächsten Empfang bzw. liefert das empfangene Zeichen im Wertebereich 0...255.
static inline int uart_getc_nowait()
Schaut nach, ob ein Zeichen empfangen wurde und liefert dieses gegebenenfalls als int zurück (Wertebereich ist 0...255). Wurde nichts empfangen, wird -1 geliefert.

Die Defines F_CPU und BAUDRATE geben die Taktrate des AVR sowie die Baudrate an. Dabei hat F_CPU nur rein informativen Character, es ändert die CPU-Frequenz nicht! Der Define für F_CPU kann man in die Quelle dazu schreiben, oder man gibt einen Wert per Kommandozeile/Makefile an mit -DF_CPU=...

#ifndef _UART_H_
#define _UART_H_

#include <avr/io.h>

extern void uart_init();

static inline void 
uart_putc (const char c)
{
    while (!(UCSRA & (1 << UDRE)))
        ;
      
    UDR = c;
}

static inline int
uart_getc_wait()
{
    while (!(UCSRA & (1 << RXC)))
        ;
   
    return (int) UDR;
}

static inline int 
uart_getc_nowait()
{
    return (UCSRA & (1 << RXC)) ? (int) UDR : -1;
}

#endif /* _UART_H_ */

Mit Receive-Interrupt

Weitere Routinen

Einen String senden

Übergeben wird die Start-Adresse des Strings. Die Zeichenkette wird solange durchlaufen und die Zeichen ausgegeben, bis eine '\0' (Stringende-Marke) gelesen wird.

#include "uart.h"

void uart_puts (const char *s)
{
    while (*s)
    {
        uart_putc (*s++);
    }
}

// Ein Zeilenumbruch, abhängig davon, was die Gegenstelle haben will
// Winwows: "\r\n"
// Linux  : "\n"
// MacOs  : "\r"

char text[] = "Hallo Welt.\r\"
int main()
{
    uart_init();

    uart_puts (text);
    uart_puts ("Hallo Welt!\r\n");

    return 0;
}

Siehe auch


LiFePO4 Speicher Test