Forum: Mikrocontroller und Digitale Elektronik xmega USART Baudrate


von Markus C. (ljmarkus)


Lesenswert?

Hallo,

wenn ich Baudrate 115200 benutzte, funktioniert alles.
Ich würde aber gerne auf 460800 oder 921600 gehen, aber da funktioniert 
leider nix mehr.

Als Board benutzte ich das Alvidi xmega128A1 mit 16Mhz Quarz.
PC ist der Alix2d

USART ist per TTL angebunden.


Nutze folgende Clock Init:
1
void system_clocks_init( void )
2
{
3
/* konfiguriere Taktquelle */
4
CLKSYS_XOSC_Config(OSC_FRQRANGE_12TO16_gc,false,OSC_XOSCSEL_XTAL_16KCLK_gc);
5
6
/* aktiviere Taktquelle */
7
CLKSYS_Enable( OSC_XOSCEN_bm );
8
9
/* konfiguriere PLL, Taktquelle, Faktor */
10
CLKSYS_PLL_Config( OSC_PLLSRC_XOSC_gc, 2 ); 
11
12
/* aktiviere PLL */
13
CLKSYS_Enable( OSC_PLLEN_bm );
14
15
/* konfiguriere Prescaler */
16
CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );
17
18
/* warte bis takt stabil */ 
19
do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );
20
21
/* wähle neue Taktquelle */
22
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );
23
24
/* deaktiviere internen Oszillator */
25
CLKSYS_Disable( OSC_XOSCEN_bm );
26
}

die Uart Init schaut so aus:
1
void ini_usart(void)
2
{
3
  //#define BAUDRATE 115200
4
  #define BAUDRATE 921600 
5
  
6
  PORTE.DIRSET = PIN3_bm;  // PE3 (TXE0) as output.
7
  PORTE.DIRCLR = PIN2_bm; // PE2 (RXE0) as input.
8
  
9
  USARTE0.CTRLA = USART_RXCINTLVL_MED_gc;
10
  USARTE0.CTRLB = USART_RXEN_bm | USART_TXEN_bm;
11
  USARTE0.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;
12
  
13
  USARTE0.BAUDCTRLA = ((((F_CPU / BAUDRATE) +8) /16) -1) & 255;
14
  USARTE0.BAUDCTRLB = ((((F_CPU / BAUDRATE) +8) /16) -1) >> 8;
15
  
16
  rx_counter = 0;
17
}

Hoffe Ihr habt eine Idee.

Danke,
Markus

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Markus C. schrieb:
> Ich würde aber gerne auf 460800 oder 921600 gehen, aber da funktioniert
> leider nix mehr.

Was ist die Gegenstelle zum XMEGA?

von Markus C. (ljmarkus)


Lesenswert?

Die gengenstelle ist ein ALIX2d2 Board mit Linux drauf
http://pcengines.ch/alix2d2.htm

von Uwe S. (de0508)


Lesenswert?

Hallo Markus,

Tipp: rechne dir mal den Baudraten Fehler mit einem 16MHz Quarz aus.

http://www.avrcalc.elektronik-projekt.de/xmega/baud_rate_calculator

von Markus C. (ljmarkus)


Lesenswert?

Ja ok, aber ich nutzte doch die 32Mhz PLL

von Timmo H. (masterfx)


Lesenswert?

Hack die Werte mal fest ein anstatt über deine Formel zu gehen. Meines 
Erachtens stimmt die so nicht?!

von Markus C. (ljmarkus)


Lesenswert?

wie werden denn folgende Werte eingetragen?

32Mhz
921600 Baud

BSCALE Value -7
BSEL Value 150

  USARTE0.BAUDCTRLA =
  USARTE0.BAUDCTRLB =



Danke,
Markus

von Timmo H. (masterfx)


Lesenswert?

USARTE0.BAUDCTRLA = 150;
USARTE0.BAUDCTRLB = 0x90;

von Sauger (Gast)


Lesenswert?

Nabend,

warum nicht:

1
#define BAUD_TOL     1
2
#define BAUD    115200
3
                      
4
#include <util/setbaud.h>
5
6
PORTE.DIRCLR = PIN2_bm;            // RX  -> In
7
PORTE.DIRSET = PIN3_bm;            // TX  -> Out
8
9
USARTE0.BAUDCTRLA = UBRRL_VALUE;   // BSEL LowByte
10
USARTE0.BAUDCTRLB = UBRRH_VALUE;   // BSEL HighByte
11
12
USARTE0.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc |
13
                USART_CHSIZE_8BIT_gc;
14
15
USARTE0.CTRLA  = USART_RXCINTLVL_LO_gc | USART_DREINTLVL_LO_gc;
16
USARTE0.CTRLB |= USART_RXEN_bm | USART_TXEN_bm | (USE_2X ? USART_CLK2X_bm:0);
17
PMIC.CTRL     |= PMIC_LOLVLEX_bm;

... ungetestet

frohe Ostern.

von Markus C. (ljmarkus)


Lesenswert?

USARTE0.BAUDCTRLA = 150;
USARTE0.BAUDCTRLB = 0x90;

funktioniert leider nicht.



Auf dem PC ist die Baudrate richtig eingestellt.

stty -a </dev/ttyS1
speed 921600 baud

von Timmo H. (masterfx)


Lesenswert?

Markus C. schrieb:
> USARTE0.BAUDCTRLA = 150;
> USARTE0.BAUDCTRLB = 0x90;
>
> funktioniert leider nicht.
Mach mal
 USARTE0.BAUDCTRLA = 75;
 USARTE0.BAUDCTRLB = 0xA0;

von Markus C. (ljmarkus)


Lesenswert?

leider auch nicht

von Timmo H. (masterfx)


Lesenswert?

Und die Gegenstelle kann auch sicher 921600??
Hast du noch z.B. ein USB=>UART TTL (z.B. CP2102) um das mal zu testen?

von Markus C. (ljmarkus)


Lesenswert?

Also sie läst sich ohne Error auf die 921600 Baud einstellen.

von Dietrich L. (dietrichl)


Lesenswert?

Markus, hast Du ein Oszi?
Damit würde ich beide Beteiligten mal messen, wie lang ein Bit ist. So 
lässt sich die Quelle und die Größe des Fehlers wenigsten abschätzen.

Gruß Dietrich

von Markus C. (ljmarkus)


Lesenswert?

Ich habe mal mit einem USB-TTL FTDI jetzt am anderen PC mit HTerm 921600 
eingestellt und egal ob ich vom ALIX oder xmega sende, bekomme ich immer 
2 byte empfangen.

von Sauger (Gast)


Lesenswert?

Fang doch mal von "unten" an, ab welcher Baudrate gehts nicht mehr?

von unl34shed (Gast)


Lesenswert?

Rechner gibt's schon fertig (nciht von mir), nach meinen Tests stimmen 
die Werte, die er ausgibt.
http://www.avrcalc.elektronik-projekt.de/xmega/baud_rate_calculator

von Markus C. (ljmarkus)


Lesenswert?

Frohes neues Jahr...

So nach langem hin und her klappt die Verbindung bei 921600 Baud.
1
  // Baudrate 921600 - normal speed mode bei 32MHz
2
  
3
  PORTE.DIRSET = PIN3_bm;  // PE3 (TXE0) as output.
4
  PORTE.DIRCLR = PIN2_bm; // PE2 (RXE0) as input.
5
    
6
7
  USARTE0.BAUDCTRLA = 150;
8
  USARTE0.BAUDCTRLB = 0b10010000;
9
10
11
  USARTE0.CTRLA = USART_RXCINTLVL_HI_gc;
12
  USARTE0.CTRLB = USART_RXEN_bm | USART_TXEN_bm;
13
  USARTE0.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;

lg, markus

von Markus C. (ljmarkus)


Lesenswert?

Hallo,

muss den Fred leider nochmal hochholen.

Habe folgendes Problem: USARTE0 und E1 mit unterschiedlichen Baudraten 
funktioniert nicht.

Clock ist 32MHz.

Hier mein Code für die Init:
1
void init_usart(void)
2
{
3
  // USART E0
4
  // Baudrate 921600 - normal speed mode
5
  
6
  PORTE.DIRSET = PIN3_bm;  // PE3 (TXE0) as output.
7
  PORTE.DIRCLR = PIN2_bm; // PE2 (RXE0) as input.
8
    
9
10
  USARTE0.BAUDCTRLA = 150;
11
  USARTE0.BAUDCTRLB = 0b10010000;
12
13
14
  USARTE0.CTRLA = USART_RXCINTLVL_HI_gc;
15
  USARTE0.CTRLB = USART_RXEN_bm | USART_TXEN_bm;
16
  USARTE0.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;
17
18
  
19
  // USART E1
20
  // Baudrate 9600 - normal speed mode
21
  
22
  PORTE.DIRSET = PIN7_bm;  // PE7 (TXE1) as output.
23
  PORTE.DIRCLR = PIN6_bm; // PE6 (RXE1) as input.
24
  
25
  USARTE1.BAUDCTRLA = 2094;
26
  USARTE1.BAUDCTRLB = 0b10010000;
27
  
28
  //USARTE1.CTRLA = USART_RXCINTLVL_HI_gc;
29
  USARTE1.CTRLB = USART_TXEN_bm;
30
  USARTE1.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;  
31
32
33
  rx_counter = 0;    // for USART E0
34
}

Wenn ich beide auf 921600 Baud laufen lasse geht es. Aber E0 soll auf 
921600 Baud und E1 auf 9600 Baud.

Finde den Fehler einfach nicht.

Danke,
Markus

von Timmo H. (masterfx)


Lesenswert?

Markus C. schrieb:
> USARTE1.BAUDCTRLA = 2094;
> USARTE1.BAUDCTRLB = 0b10010000;
Du schreibst ein 12 bit wert in ein 8bit Register. Du musst die unteren 
8bit in ctrla und die oberen ctrlb[3:0]

von Markus C. (ljmarkus)


Lesenswert?

Hallo,

oha. da war ich wohl Blind. Sorry

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.