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
Inhaltsverzeichnis
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; }