www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART mit Baudrate von 921600


Autor: Alex Glaser (almalex)
Datum:

Bewertung
0 lesenswert
nicht 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
 /*** main.c ***/
#include <avr/io.h>
#include <util/delay.h>
#include "cam_uart.h"
#include "cam.h"

int main(void)
{

   init_uart();

    cam_init();



  
  

  
return;
}

cam_uart.c
/*** cam_uart.c ***/
#include <avr/io.h>
#include "cam_uart.h"


void init_uart()
{
 

  UBRR0=UBRR_VAL;



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

}

void uart_putc( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<<UDRE0)) )
;
/* Put data into buffer, sends the data */
UDR0 = data;
} 

cam.c
/****cam.c****/
#include <avr/io.h>
#include "cam_uart.h"
#include "cam.h"
#include <util/delay.h>

void cam_init(void){






  while(1)
   { 
   
   uart_putc(0xFF);  // in while
   uart_putc(0xFF);  // in while
    uart_putc(0xFF);  // in while
     uart_putc(0x0E);  // in while
      uart_putc(0x0D);  // in while
     uart_putc(0x00);  // in while
      uart_putc(0x00);  // in while
       uart_putc(0x00);  // in while

     
       
  }

} 



cam_uart.h
#ifndef cam_uart_h
#define cam_uart_h

#define BAUD 921600UL          // Baudrate

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


    

void init_uart(void);
void uart_putc(unsigned char c);
#endif /* cam_uart_h */ 

Autor: klaus (Gast)
Datum:

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

Autor: Alex Glaser (almalex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das heist was muss ich ändern?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Alex Glaser (almalex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weis vllt irgendwer den fehler?

Autor: Benji (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex Glaser (almalex)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Alex Glaser (almalex)
Datum:

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

Autor: Manfred von Antenne (dipol)
Datum:

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

Autor: Alex Glaser (almalex)
Datum:

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

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gastlich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.