UART mit Baudrate von 921600

OP #1560374
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
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
> 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?
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.
Moderator (Firma: Titel) Persönliche Seite
Bringt dich in deinem Bestreben zwar nicht weiter, trotzdem meine Frage:
> weil ich brauch diese baudrate
Warum, wozu?

>> das programm funktioniert mit 38400 baud jedoch wenn ich diesen wert
>> dann auf 921600 ändere nicht mehr.
Was funktioniert nicht mehr?
Wie lange ist dein Kabel?
Kommt überhaupt irgendwas an?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.