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