www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART Fehler Uebertragung bei float


Autor: Leandro Leandro (tetef)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich verwende Atmega8,16,32 mit 16MHz Quarz, der an 2 x 22pF haengt.
Mein Programm uebertraegt Daten in Float Format "real;imag", nun ab und 
zu bekomme ich Fehler bei der Uebertragung, dass die Zahlen nicht 
korrekt dargestellt sind. Manchmal sind die Daten in den folgenden 
Format:

1. -1.199; 2.194-2.484; 0
2.               -1.099; 0.174
usw.

Ich weiss es nicht, wo das Problem liegt?
Gruss

Autor: Tim Seidel (maxxie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define F_CPU 16000000
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
#define UART_BAUD_RATE      115200

115200 Baud bekommst du nicht genau hin. Statt dessen (durch die Integer 
Operationen in deiner Rechnung) erhällst du nach der Formel oben den 
Wert 7 für das Register. Rückwärts ergibt sich aus der 7 dann wieder 
125000 baud.

Du hast also einen recht großen Baudratenfehler und das siehst du in der 
Übertragung.

Autor: Leandro Leandro (tetef)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, danke fuer Deine Antwort,

Du meinst, ich soll meine Baudrate zu 125000 aendern oder soll ich mein 
Frequenz aendern?

Autor: Tim Seidel (maxxie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sinnvoll wäre ein Baudratenquarz zu benutzen.

Du kannst in deinem Prog die Baudrate zwischen 111112 und 125000 frei 
wählen, es werden immer 125000 dabei rauskommen. (Der Wert für das 
Register ist in allen diesen Fällen 7)

D.h. du müsstest die Gegenstelle auf den gleichen Wert bringen, aber ob 
der die Baudrate 125000 kann ist fraglich.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Leandro Leandro (tetef)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo time, hallo Falk,

ich habe die Quarz geaendert und zwar ich benutze jetzt 14,7456MHz. 
Eigentlisch muss jetzt funktionieren.

Ich uebertrage meine Daten in folgende Format:
             xxxxx;x;x
Meine Routine sieht so aus:

    while(1) // Unendlich lang wiederholen
    {
    uart_puti(i);
    uart_putc(';');
    uart_puti(5);
    uart_putc(';');
    uart_puti(5);
    uart_putc('\n');
    i+=1;
    }
die Baudrate und die Funktion zur Berechnung der UBRR sind die 
gleichen(s.o.).

Die Initialisierung der UART sieht so aus:
inline void uart_init(uint8_t tx, uint8_t rx)
{
    uint16_t baudrate;
    baudrate = UART_BAUD_RATE/2;
    UBRRH    = (uint8_t) (UART_UBRR_CALC(baudrate,F_CPU)>>8);
    UBRRL    = (uint8_t) UART_UBRR_CALC(baudrate,F_CPU);
    UCSRA |= (1<<U2X);
    UCSRB |= (1<<RXCIE);
  UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
    if(tx) UCSRB |= (1<<TXEN);
    if(rx) UCSRB |= (1<<RXEN);
}

ich bin ehrlich sprachlos.
Hat jemand vo euch eine Idee?

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.