Receive-Funktion für die UART

Gast #1889494
Lesenswert?
• ▲
▼
1.Ich nutze die „asynchrone“ USART. Was heißt das genau? Es geht doch 
trotzdem mit einer bestimmten Baudrate, d.h. das Zeichen empfangen 
passiert doch mit dieser Baudrate synchron, oder was verstehe ich hier 
falsch??

2.Ich möchte die Funktion getchar „von Hand“ schreiben, indem ich die 
while-Schleife entferne und polle
..
static int i = 0;
char USART0_receive[40];
if (USCR0A & RXC0)
{
   USART0_receive[i];
   i++;
   if(i==39)
    i=0;
}

wie oft muss ich diese Funktion aufrufen, wenn die UART mit 115200kbaud 
betrieben wird? Ich meine, ab wann gehen Zeichen verloren??
Ich nutze einen Atmega128.

vielen Dank!
Gast #1889526
Lesenswert?
• ▲
▼
Markus schrieb:
> 1.Ich nutze die „asynchrone“ USART. Was heißt das genau?

Das Sender- und Empfängertakt nicht miteinander gekoppelt sind. D.h. sie 
haben keine, wie auch immer geartete, feste Beziehung zueinander.

> d.h. das Zeichen empfangen
> passiert doch mit dieser Baudrate synchron, oder was verstehe ich hier
> falsch??

Das heisst es nach dem oben gesagten genau nicht. Denn wenn die Takte 
des Senders und Empfängers nicht gekoppelt sind, dann ist es mehr oder 
weniger Zufall, auf welchen Zustand des Empfängertaktes das Startbit 
fällt.

Vielmehr muss sich der Empfänger beim asynchronen Fall auf die Flanken 
des Startbits synchronisieren.

Für eine detaillierte Erklärung siehe dazu auch, die entsprechenden 
Passagen in einem passenden Datenblatt.

Z.B.: das des ATmega164P, ATmega324P und ATmega644P
und da die Kaptitel
17.4.4 Synchronous Clock Operation und
17.9 Asynchronous Data Reception
Die Kapitelbezeichnungen beziehen sich auf die Version 7674A–AVR–04/07 
des Datenblattes.
Gast #1889540
Lesenswert?
• ▲
▼
Markus schrieb:
> wie oft muss ich diese Funktion aufrufen, wenn die UART mit 115200kbaud
> betrieben wird? Ich meine, ab wann gehen Zeichen verloren??

Das kann man genau ausrechnen.
Nimmt man an, das Du das übliche Schema von 8N1, also 8 Datenbits, ein 
Start- und ein Stopbit verwendest, dann sind das 10Bits.

Als Geschwindikeit meinst Du sehr wahrscheinlich nicht 115200kbaud 
sondern 115200 Baud (also nicht noch Kilo, den Faktor 1000 davor).

Bei RS232 entspricht ein Symbol einem Bit. Das sind dann also 115200 
Bits pro Sekunde. Ein Bit dauert demnach 8,69 Mikrosekunden. Zehn Bits 
brauchen dann 86,9 Mikrosekunden. So oft, kann bei Höchstgeschwindigkeit 
ein Byte ankommen. In diesem Abstand also musst Du das Statusregister 
pollen um kein Byte zu verlieren. Das entspricht 11,5kHz.

Warum willst Du pollen und nicht den Interrupt nehmen?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.