UART mit Baudrate von 921600

OP #1560374
Lesenswert?

hi
ich will eine uart schnittstelle mit 921600 baud erzeugen mittels 
atmega644.
das programm funktioniert mit 38400 baud jedoch wenn ich diesen wert 
dann auf 921600 ändere nicht mehr.

hier der code:
main.c
1
 /*** main.c ***/
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include "cam_uart.h"
5
#include "cam.h"
6

7
int main(void)
8
{
9

10
   init_uart();
11

12
    cam_init();
13

14

15

16
  
17
  
18

19
  
20
return;
21
}

cam_uart.c
1
/*** cam_uart.c ***/
2
#include <avr/io.h>
3
#include "cam_uart.h"
4

5

6
void init_uart()
7
{
8
 
9

10
  UBRR0=UBRR_VAL;
11

12

13

14
/* Enable receiver and transmitter */
15
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
16
/* Set frame format: 8data, 1stop bit */
17
UCSR0C = (0<<USBS0)|(3<<UCSZ00);
18

19
}
20

21
void uart_putc( unsigned char data )
22
{
23
/* Wait for empty transmit buffer */
24
while ( !( UCSR0A & (1<<UDRE0)) )
25
;
26
/* Put data into buffer, sends the data */
27
UDR0 = data;
28
}

cam.c
1
/****cam.c****/
2
#include <avr/io.h>
3
#include "cam_uart.h"
4
#include "cam.h"
5
#include <util/delay.h>
6

7
void cam_init(void){
8

9

10

11

12

13

14
  while(1)
15
   { 
16
   
17
   uart_putc(0xFF);  // in while
18
   uart_putc(0xFF);  // in while
19
    uart_putc(0xFF);  // in while
20
     uart_putc(0x0E);  // in while
21
      uart_putc(0x0D);  // in while
22
     uart_putc(0x00);  // in while
23
      uart_putc(0x00);  // in while
24
       uart_putc(0x00);  // in while
25

26
     
27
       
28
  }
29

30
}



cam_uart.h
1
#ifndef cam_uart_h
2
#define cam_uart_h
3

4
#define BAUD 921600UL          // Baudrate
5

6
#ifndef F_CPU
7
//#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 14745600UL"
8
#define F_CPU 14745600UL    // Systemtakt in Hz
9
// Definition als unsigned long beachten
10
// Ohne UL ergibt Fehler in der Berechnung
11
#endif
12
 
13
// Berechnungen
14
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
15
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
16
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)      
17
// Fehler in Promille, 1000 = kein Fehler
18
 
19

20

21
    
22

23
void init_uart(void);
24
void uart_putc(unsigned char c);
25
#endif /* cam_uart_h */
Gast #1560663
Lesenswert?

Hi,

also ich seh zwar keinen Fehler,
aber wie stellst du denn fest, dass er nicht funktioniert?
Woran testest du ihn?

Hatte gestern ein ähnliches Problem und es stellte sich raus, dass der 
gekaufte RS485/USB-Wandler ab 80kbaud nicht mehr funktionierte.

Viel Glück
Moderator (Firma: Titel) Persönliche Seite #1560707
Lesenswert?

> as programm funktioniert mit 38400 baud jedoch wenn ich diesen wert
> dann auf 921600 ändere nicht mehr.
Kannst du da nicht einfach mal kleine Schritte probieren...  :-/

> beim converter steht das der bis zu 3MBaud , d.h das sollt
> eigentlich kein prob sein oder?
Kannst du deine Baudrate 921600 in HTERM überhaupt einstellen?
Unterstützt der Treiber diese Baudrate?
#1560754
Lesenswert?

Ich habe mal in hterm 0.81 von Hand im Baudratenfeld 921600 eingegeben. 
Mit einem FT232RL scheint das laut Oszi sogar zu gehen. Allerdings wird 
auch trotz Autosend mit 0 Wartezeit nur in relativ großen Zeitabständen 
gesendet (höchstens ein Zehntel der Gesamtzeit, eher weniger. .


Probier mal in jedem Durchlauf deiner while() ein delay von einigen ms.

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