Forum: Mikrocontroller und Digitale Elektronik UART mit Baudrate von 921600


von Alex G. (almalex)


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 */

von klaus (Gast)


Lesenswert?

Wenn ich "((F_CPU+BAUD*8)/(BAUD*16)-1)" berechne komme ich auf 0.5. Im 
Integer-Kontext wäre das 0 !

von Alex G. (almalex)


Lesenswert?

das heist was muss ich ändern?

von Peter D. (peda)


Lesenswert?

klaus schrieb:
> Wenn ich "((F_CPU+BAUD*8)/(BAUD*16)-1)" berechne komme ich auf 0.5. Im
> Integer-Kontext wäre das 0 !

Das ist korrekt.

Peter

von klaus (Gast)


Lesenswert?

> das heist was muss ich ändern?

Okay, sehe gerade, 0 scheint ein erlaubter Wert für UBRR zu sein. Dann 
vergiss das erstmal was ich gesagt habe...

von Alex G. (almalex)


Lesenswert?

weis vllt irgendwer den fehler?

von Benji (Gast)


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

von Uwe .. (uwegw)


Lesenswert?

Mal messen, ob sich was am Pin tut?

Verträgt die Gegenstelle diese Baudrate? Besonders, weil du pausenlos 
sendest. Wenn da die Daten nicht fix genug abgeholt werden, läuft evtl 
irgendwann ein Buffer über.

von Alex G. (almalex)


Lesenswert?

ich hab einen TTL to USB Serial Converter und lese dann die daten mit 
HTERM aus. beim converter steht das der bis zu 3MBaud , d.h das sollt 
eigentlich kein prob sein oder?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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?

von Alex G. (almalex)


Lesenswert?

wie könnte ich sonst überprüfen ob das stimmt? weil ich brauch diese 
baudrate

von Manfred von A. (dipol)


Lesenswert?

Welche Version von HTERM hast du, mein HTERM 0.8.1 beta geht nur bis 
250000 Baud.

von Alex G. (almalex)


Lesenswert?

ich hab die 0.6.5 Version
da kann man  auswählen bis 128000. das könnte vllt das problem sein

von Uwe .. (uwegw)


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.

von gastlich (Gast)


Lesenswert?

Hallo

schau dir sonst mal YAT an, kann mit schnallen schnittstellen umgehen. 
(sofern dein Adapter und Treiber das auch können)
http://sourceforge.net/projects/y-a-terminal/

sonst mal mit einem KO die Leitungen anschauen.

gruss Claudio

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

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.