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 | }
|