Forum: Mikrocontroller und Digitale Elektronik AVR: einige Fragen zu UART


von Jan P. (Gast)


Lesenswert?

Hallo zusammen!

Ich beschäftige mich gerade mit der Kommunikation AVR-PC und habe dazu 
ein paar Fragen.
Zum grundsätzlichen Aufbau: Ich nutze ein Arduino-Mega-2560-Board mit 
ATmega2560 (16 MHz), der einen ATmega8U2 als USB-COM-Konverter nutzt und 
entsprechend über USB an meinem PC (Windows 7 x64) hängt.
Dort läuft ein Java-Programm mit jssc 
(https://code.google.com/p/java-simple-serial-connector/) als Empfänger.

Auf dem Arduino läuft dieser Code:
1
#define F_CPU 16000000UL
2
3
#include <avr/io.h>
4
5
void comInit(long baudRate)
6
{
7
  UBRR0H = (unsigned char)((F_CPU / 16 / baudRate - 1) >> 8);
8
  UBRR0L = (unsigned char)(F_CPU / 16 / baudRate - 1);
9
  UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);
10
  UCSR0B = _BV(RXEN0) | _BV(TXEN0);
11
}
12
13
void sendeByte(char zeichen)
14
{
15
  loop_until_bit_is_set(UCSR0A, UDRE0);
16
  UDR0 = zeichen;
17
}
18
19
int main(void)
20
{
21
  comInit(500000);
22
  while(true)
23
  {
24
    for(int i = 0; i < 8; ++i)
25
    {
26
      sendeByte(i);
27
    }
28
  }
29
}

Er sendet also fortlaufend die Ziffern 0-7; auf dem PC prüfe ich dann, 
ob was verloren ging.
Ich beziehe mich auf S. 231 im Datenblatt 
(http://www.atmel.com/Images/doc2549.pdf). Hier nun meine Fragen:

1.) Bei meinen Test verwende ich immer Datenraten wie 250 K, 500 K, ..., 
die gut zu den 16 MHz passen (0% Error). Wenn man sich auf dem PC mit 
COM-Ports beschäftigt, findet man allerdings oft nur krumme Raten wie 
115,2 K usw. Ich würde jetzt vermuten, dass das nur für reale 
RS-232-Schnittstellen von Bedeutung ist und ich bei der emulierten über 
USB keine Rücksicht auf den PC nehmen muss. Stimmt das?

2.) Bei 250 K benötigt ein Byte etwa 40 µs und auch bei einem 
einstündigen Test ist keins verloren gegangen - so weit, so gut. Bei 500 
K sind es entsprechend nur 20 µs und es gibt einen Verlust von rund 3 
ppm - damit könnte ich gut leben. Trotzdem interessiert mich natürlich: 
Wodurch treten diese Verluste auf? Läuft da irgendein Puffer über, den 
man vielleicht noch optimieren könnte, oder sind das halt Verluste "in 
der Leitung", die man einfach hinnehmen muss?

3.) Laut Datenblatt gehen auch 1 M - und da wird es interessant: Die 
Übertragung funktioniert nach wie vor (Fehlerrate jetzt um die 5 ppm), 
wird aber geringfügig langsamer: ca. 23 µs / Byte. Was bremst die 
Verbindung hier aus?
Bei der Gelegenheit: Mir ist klar, dass Java in punkto Performanz und 
Timing nicht die erste Wahl ist. Kennt jemand ein kleines Programm, dass 
einen COM-Port (auch via USB und bei beliebiger Baudrate) abhorcht und 
das Empfangene in einer Textdatei loggt? Ich habe sicher schon zehn 
verschiedene ausprobiert, aber davon hat nichts so recht geklappt. Ich 
habe auch mal versucht, mit Codeschnipseln aus dem Web was in C++ zu 
schreiben, aber dafür sind meine Kenntnisse in C++ wohl doch zu 
gering...

Vielen Dank schon mal für eure Hilfe!
Jan

von Stefan E. (sternst)


Lesenswert?

Keiner deiner 3 Fragenkomplexe lässt sich so wirklich beantworten, denn 
alle drei hängen direkt hiervon ab:
> der einen ATmega8U2 als USB-COM-Konverter nutzt

1) Irgendwo her muss der ATmega8U2 ja wissen, mit welcher Baudrate er 
auf der seriellen Seite arbeiten soll. Bekommt er das vom Treiber auf 
PC-Seite mitgeteilt? Oder versucht er die Baudrate selbst automatisch zu 
ermitteln?

2+3) Was sagt denn die Doku des Boards, was der ATmega8U2 maximal können 
soll?

von THaala (Gast)


Lesenswert?

Du sendest nicht die Zeichen "0" bis "7".
Du sendest 0 - 7! Das ist etwas anderes.

Wenn Du die auzugebende Zahl mit 0x30 addierst, dann sendest Du "0" - 
"7"

Sie ASCII-Tabelle!

Gruß T.

von Jan P. (Gast)


Lesenswert?

Stefan:
Tja, wenn ich das mal wüsste. Die Arduino-Boards sind leider längst 
nicht so gut dokumentiert wie die Atmel-Chips. Die Webseite zum Board 
(http://arduino.cc/en/Main/arduinoBoardMega2560) schweigt sich über 
diesen Punkt (USB-Serial) weitestgehend aus. Im Forum liest man 
vereinzelt von Leuten, die 1-2 M geschafft haben wollen. Das Datenblatt 
des Chips (http://www.atmel.com/Images/doc7799.pdf) sieht bei 16 MHz 
genau wie beim Mega bis zu 1 M (2 M mit U2Xn) vor, aber das sagt 
natürlich noch nichts über die USB-Seite aus. Laut Internet waren die 
früher verwendenten FTDI-Chips für bis zu 1 M ausgelegt, ich würde ja 
hoffen, dass man diese nicht durch etwas schlechteres ersetzt hat...

THaala:
Jep, ich schrieb von den "Ziffern 0-7", Ziffern sind laut Wikipedia 
Schriftzeichen für Zahlen und nicht die Zahlen selbst und somit ist dein 
Einwand berechtigt. Ich kann jedoch versichern, dass ich den Unterschied 
zwischen 0 und '0' kenne.

von THaala (Gast)


Lesenswert?

Sorry,

die skills der jeweiligen TO sind nicht immer sofort zu erkennen.

Gruß 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.