www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART Band-Problem


Autor: Hua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt programmiere ich mit Atmega128 und benutze HTerm als Anzeiger im
Computer.
Aber ich kann nicht mit Band 38400 über USART daten transportieren. Auf
dem Hterm zeigen immer 0x00.
Mit niedriger Band gibt es kein Problem.

Jemand weißt es warum?
Vielen Dank

Hua

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Baudratenquarz verwendet?

Autor: Hua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In meiner ganzen Platine habe ich nur eine Quarz (16MHz) benutzt.

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für 38,4kBaud ist ein passender Baudratenquarz aber nötig. Schau mal in
die Tabelle zu Baudratenermittlung des ATMega128 und sieh Dir die
Fehlerraten bei entsprechenden Quazen an. Sie sollte unter 1,5%
bleiben, um eine sichere Verbindung zu haben.

Autor: Hua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt nur 0,2%

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist okay - muß eigentlich gehen. Hast Du die Stop-und Parity-Bits im
AVR richtig eingestellt?

Autor: Hua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ich habe sie richtig eingestellt.

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann versteh´ ich´s nicht. Poste mal Deinen Code, sonst wird das hier
nix!

Autor: Hua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt geht's!
Wenn ich UBRRH=0 und UBRRL=51 direkt gebe, sonder nicht wie früher
durch 1600000/(16*baud)-1 rechnen lassen. Dann geht's!
Aber es ist nicht universal, wenn ich ein neu Bandrate benutzen möchte,
brauche ich die Tabell wieder ablesen.

Autor: Hua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt ist es so!
void USART_Init0( )
{

  /* Set baud rate */

  UBRR0H=0;
  UBRR0L=51;

  /*Double Speed*/
  UCSR0A = (1<<U2X0);

  /* Enable Receiver and Transmitter */
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);

  /* Set frame format: 8data, 1stop bit */
  UCSR0C = (0<<USBS0)|(3<<UCSZ00);

}

früher ist es so!
void USART_Init0( unsigned int baud )
{

  /* Set baud rate */
  unsigned int ubrr = 1000000/baud-1;

  UBRR0H = (unsigned char)(ubrr>>8);
  UBRR0L = (unsigned char)ubrr;

  /*Double Speed*/
  UCSR0A = (1<<U2X0);

  /* Enable Receiver and Transmitter */
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);

  /* Set frame format: 8data, 1stop bit */
  UCSR0C = (0<<USBS0)|(3<<UCSZ00);

}

Aber warum kann es nicht selbst rechnen?

Autor: Hua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
früher ist so. Vorner habe ich falsch gekopiert.
void USART_Init0( unsigned int baud )
{

  /* Set baud rate */
  unsigned int ubrr = 1000000/baud-1;

  UBRR0H = (unsigned char)(ubrr>>8);
  UBRR0L = (unsigned char)ubrr;

  /* Enable Receiver and Transmitter */
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);

  /* Set frame format: 8data, 1stop bit */
  UCSR0C = (0<<USBS0)|(3<<UCSZ00);

}

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>1000000/baud-1;

Sollten es nicht eigentlich 16MHz sein?

Autor: Hua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch
wenn U2x = 0; Asynchronous Normal Mode
UBRR = fosc/(16*BAUD) -1;
16M/16 ist 1M
Und ich habe auch von 9600 zum 28800Hz probiert, alle funktionieren
gut. Ab 38800 geht es nicht mehr.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 1000000/baud-1

Probier mal
  1000000L / baud - 1
Man beachte das L hinter 1000000.

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wär' vlt. nicht verkehrt, du würdest den Compiler die Formel ausrechnen
lassen und dann so zuweisen. Ist erstens schneller und zweitens
übersichtlicher als deine Variante mit Bitschieberei usw. Und hast du
es mal ohne U2X mit einer passenden Baud-Rate versucht?

Autor: Holger Krull (krulli) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hua wrote:
> Jetzt geht's!
> Wenn ich UBRRH=0 und UBRRL=51 direkt gebe, sonder nicht wie früher
> durch 1600000/(16*baud)-1 rechnen lassen. Dann geht's!
> Aber es ist nicht universal, wenn ich ein neu Bandrate benutzen möchte,
> brauche ich die Tabell wieder ablesen.

in Deinen 1600000 (=1,6MHz) fehlt eine 0. Richtig wäre 16000000

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.