This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| de:avr:usart [2010/07/27 18:43] – angelegt Wember | de:avr:usart [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== USART ====== | ||
| + | USART ist ein Universal Synchrones Serielles Interface, UART ist die vereinfachte Version - Universelles Asynchrones Interface. Der Unterschied zwischen beiden liegt darin, dass das USART auch eine Taktsignalleitung nutzt um Daten zu synchronisieren, | ||
| + | |||
| + | Jede Einstellungsoption hat ein eigenes Register, welches recht einfach anhand des Datenblatts konfiguriert werden kann. Die Baud-Rate ist allerdings etwas schwieriger einzustellen. Das Taktsignal für die Datenübertragung wird vom Taktgeber des Controllers generiert und der Nutzer kann eine Zahl von 1 bis 4096 eingeben, durch welche die Taktrate dividiert wird. Das Ergebnis wird darüber hinaus, je nach Modus, durch 2, 8 oder 16 dividiert. Das Problem ist, dass nicht alle Taktfrequenzen so dividiert werden können, dass das Ergebnis eine Standard-Baud-Rate ergibt. Bei einigen Frequenzen kann die Baud-Rate bis zu 10% vom Standardwert abweichen. Die Datenblätter des AVR beinhalten Tabellen mit Angaben zu den typischen Taktfrequenzen, | ||
| + | |||
| + | Da die Datenübertragung unabhängig vom Prozessor und viel langsamer geschieht, ist es nötig zu bestätigen, | ||
| + | |||
| + | Der Empfang eines Wortes ist wird durch ein spezielles Status-Bit gekennzeichnet. Zusätzlich gibt es Status-Bits, | ||
| + | |||
| + | Der Sende- und Empfangspuffer sind physikalisch getrennte Register, aber sie nutzen die gleiche Speicheradresse und den gleichen Namen. Während des Schreibens in ein gemeinsam benutztes Register, werden die Daten im Sendepuffer gespeichert, | ||
| + | |||
| + | |||
| + | < | ||
| + | |||
| + | <box 100% round # | ||
| + | |||
| + | Aufgabe: Konfigurieren Sie die USART0 Schnittstelle eines 8 MHz ATmega128 so, dass sie ein 8-Bit-Wort asynchron überträgt, | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | // Setzt die Baud-Rate auf 9600 bps. Formel: | ||
| + | // | ||
| + | // UBRR = 8000000 / 16 / 9600 - 1 = ~51 | ||
| + | UBRR0H = 0; | ||
| + | UBRR0L = 51; | ||
| + | |||
| + | // Erlaube Senden | ||
| + | UCSR0B = (1 << TXEN0); | ||
| + | |||
| + | // Konfiguriere den asynchronen Modus, setze die Wortgröße auf 8 Bit, | ||
| + | // 1 Stoppbit, kein Paritätsbit. | ||
| + | UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); | ||
| + | |||
| + | // Warte solange, bis der Datenpuffer leer ist (das vorherige Wort wurde gesendet) | ||
| + | // In diesem Beispiel ist es jedoch nicht nötig zu warten, da nur das erste Symbol | ||
| + | // gesendet wird. Es sollte jedoch beachtet werden, wenn mehr als ein Symbol gesendet wird. | ||
| + | while (!(UCSR0A & (1 << UDRE))) continue; | ||
| + | |||
| + | // Schreibe das Symbol in den Sendepuffer. | ||
| + | UDR0 = ' | ||
| + | |||
| + | // Endlosschleife | ||
| + | while (1) continue; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | </ | ||