ATmega 8515/USART empfängt nicht schneller als 9600 Baud

Gast #1384538
Lesenswert?

Hallo zusammen!

Vorab die Umgebung:

- ATmega8515 auf STK500 @ 8MHz, Jumper im Auslieferungszustand. Kein 
externes Quarz. µC Takt über Fuse SUT_CKSEL: Int. RC OSc. 8 MHz; 
Start-up time: 6 CK + 64ms, sowie in den den Project Options 
eingestellt.
- AvrStudio 4.17
- WinAVR20090913
- 2x USB to serial converter @ 115200 Baud
- Winamp 5.56 ;D

Ich arbeite mich gerade in die USART-Thematik ein und habe zu diesem 
Zweck  2 Testprogramme geschrieben um die Übertragungsraten zu messen.

Das 1. Programm in Visual Basic .net macht nichts anderes, als zu einer 
einstellbaren Baudrate 1000 Bytes zu senden und die dafür benötigte Zeit 
zu messen.

Das 2. Programm ist auf dem µC und nimmt die gesendeten Bytes entgegen.

Bis zu einer Baudrate von 9600 ist soweit alles schlüssig und die 
gemessenen Zeiten stimmen in etwa mit den theoretische Übertragungsraten 
überein:

BAUD  gemessen    rechnerisch(1 Start, 8 Daten, 2 Stopbits)
2400  4,58s       4,58s
4800  2,30s       2,29s
9600  1,18s       1,15s

Ab 9600 bringt eine höhere Baudrate aber keine Steigerung der 
Übertragungszeit mehr...

Es sieht also so aus, als würde irgendetwas die Baudrate auf ca. 9600 
limitieren.
Mache ich etwas bei der USART-Initialisierung falsch, oder wo könnte der 
Fehler liegen?

Hier die 2 Programme:

VB.net (Baudrate über ComboBox von 2400-115200 einstellbar)
1
Public Class Form1
2

3
    Public baud As Integer
4
    
5

6
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
7
        Label1.Text = "Time:"
8
        ComboBox1.SelectedIndex = 0
9
        
10
    End Sub
11

12
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
13
        Label1.Text = "Time:"
14

15
        Dim diffzeit As Date = DateTime.Now
16
        Dim dummybyte(1) As Byte
17

18
        SP.PortName = "COM3"
19
        SP.BaudRate = baud
20
        SP.StopBits = 2
21
        SP.DataBits = 8
22

23
        SP.Open()
24
        For x As Integer = 0 To 999
25
            SP.Write(dummybyte, 0, 1)
26
        Next
27
        Label1.Text = "Time: " & ((DateTime.Now - diffzeit).ToString)
28
        SP.Close()
29
    End Sub
30

31
    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
32
        baud = CInt(ComboBox1.Text)
33
    End Sub
34
End Class

µC:
1
#include <avr/io.h>
2

3
void USART_init(unsigned int);
4

5
int main (void)
6
{  
7
  uint8_t dummy;  
8
  unsigned int baudrate = 115200;  
9

10
  USART_init(baudrate);  
11

12
  while(1)
13
    {  
14
    while(!(UCSRA & (1<<RXC))) {}  
15
    dummy = UDR;  
16
    }
17
  return 0; //never reached
18
}
19

20
void USART_init(unsigned int baud)
21
{
22

23
UBRRH = (unsigned char)(baud>>8);      //Baud rate MSB  
24
UBRRL = (unsigned char)baud;        //Baud rate LSB
25
UCSRB = (1<<RXEN)|(1<<TXEN);        // Enable RCV and TX
26
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);  // Set frame format: 8data, 2stop bit
27
  
28
}
Gast #1384555
Lesenswert?

Also dein AVR Programm macht ja gar nichts, außer Zeichen von der ser. 
Schnittstelle zu lesen.Da solltest du einen Test einbauen, der die 
empfangenen Daten Verifiziert. Du mißt eigentlich nur die Zeit, die dein 
PC braucht,egal ob die Daten ankommen oder nicht.Bytes einzeln zu 
schicken dauert womöglich recht lange, Gibts da nicht eine Funktion für 
das Senden eines Buffers?
Gast #1384569
Lesenswert?

Ja, es ist in deinem Fall sogar völlig egal ob überhaupt was am PC 
angesteckt ist. Dein Problem ist das VB bzw. Windows, möglicherweise 
funkt da eine Flußsteuerung hinein.Hast du keine Möglichkeit das TX 
Signal deines PC mit einem Oszi zu messen?
Gast #1384575
Lesenswert?

Habe das µC Programm mal etwas erweitert. Es prüft nun, ob tatsächlich 
1000 Bytes ankommen und bestätigt das durch ein kurzes Blinken der LEDs.

Und die Bytes kommen tatsächlich alle an.
1
#include <avr/io.h>
2
#include <util/delay.h>
3

4
void USART_init(unsigned int);
5

6
int main (void)
7
{  
8
  DDRB = 0xff;
9
  PORTB = 0xff;
10
  
11
  uint8_t dummy;  
12
  unsigned int baudrate = 57600;  
13
  int count = 0;  
14

15
  USART_init(baudrate);  
16

17
  while(1)
18
    {  
19
    while(!(UCSRA & (1<<RXC))) {}  
20
    
21
    count++;
22
    if (count == 1000)
23
      {
24
        PORTB = 0x00;
25
        _delay_ms(500);
26
        PORTB = 0xff;
27
        count = 0;      
28
      }
29
    dummy = UDR;  
30
    }
31
  return 0; //never reached
32
}
33

34
void USART_init(unsigned int baud)
35
{
36

37
UBRRH = (unsigned char)(baud>>8);      //Baud rate MSB  
38
UBRRL = (unsigned char)baud;        //Baud rate LSB
39
UCSRB = (1<<RXEN)|(1<<TXEN);        // Enable RCV and TX
40
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);  // Set frame format: 8data, 2stop bit
41
  
42
}
Gast #1384643
Lesenswert?

@spess53
> Was erwartest du damit eigentlich? Der interne RC-Oszillator ist für
> solche Baudraten nicht geeignet.
das spiel hier überhaupt keine rolle, weil er nur die Sende-Zeit stoppt. 
Er kann auch den µC vom PC Trennen und kommt auf die gleichen werte. 
Hier spiel als NUR der PC mit dem vb.net programm eine rolle.
Gast #1384703
Lesenswert?

Habe mal alles abgehängt und das VB Programm so laufen lassen.
Keine Änderung.
Mit einem Hyper-Terminal Programm ist die (vermeindliche) Übertragung 
noch langsamer.

Der Hund liegt wohl tatsächlich in Windows oder den USB auf 
Seriell-Adaptern begraben. Werde dieser Spur mal weiter nachgehen.

Damit gehört die Sache aber dann wohl nicht mehr in dieses Forum. *g
Werde nochmal posten, wenn ich eine Lösung habe...

Danke für die Tips!
Gast #1384723
Lesenswert?

Hi

>Der Hund liegt wohl tatsächlich in Windows oder den USB auf
>Seriell-Adaptern begraben. Werde dieser Spur mal weiter nachgehen.

Schon mal die COM-Port-Einstellungen überprüft?

>Ab 9600 bringt eine höhere Baudrate aber keine Steigerung der
>Übertragungszeit mehr...

>Es sieht also so aus, als würde irgendetwas die Baudrate auf ca. 9600
>limitieren.

Das sind zwei Paar Schuhe.

MfG Spess
Gast #1384730
Lesenswert?

Die (virtuellen) Com-Ports sind so eingestellt:

Bits/s: 115200
Datenbits: 8
Parität: keine
Stoppbits: 2
Flusssteuerung: keine

Unter "erweitert":

FIFO-Puffer verwenden: aktiviert
Empfangspuffer: 14
Übertragungspuffer: 16

Habe jetzt auch nur noch 1 USB-Seriell Adapter angeschlossen und den 
USB-Port getauscht. Alle anderen USB-Geräte (ausser Tastatur) sind 
abgehängt.
Gast #1385071
Lesenswert?

Nach ein wenig herumprobieren funktioniert das Ganze nun.
Die gemessenen Zeiten passen nun auch gut zu den theoretischen Werten.
Habe zwar leider keine Erklärung dafür, aber sei's drum...

- Die Baudrate im µC ist immer auf 115200 eingesellt, unabhängig von der 
tatsächlichen Geschwindigkeit, mit der gesendet wird.
- Im VB Programm benutze ich nun einen Befehl, der die 1000 Bytes "en 
block" als array sendet, anstatt 1000 einzelne Zeichen in einer for/next 
Schleife.
1
SP.Write(dummybyte, 0, 1000)

Ich vermute, dass das Senden einzelner Bytes in der Schleife wohl ein 
gewisses Delay mit sich bringt, was die Geschwindigkeit nach Oben 
begrenzt hat.

Danke für Eure Antworten!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren