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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.