Forum: Compiler & IDEs Receive-Funktion für die UART


von Markus (Gast)


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!

von Michael D. (michael_2001) (Gast)


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.

von Michael D. (michael_2001) (Gast)


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?

von Michael D. (michael_2001) (Gast)


Lesenswert?

"8N1" bedeutet noch dazu, dass kein Paritäts-Bit verwendet wird, also 8 
Datenbits, ein Start- und ein Stopbit, keine Parität.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.