UART Fehler Uebertragung bei float

OP #1526120
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
Angehängte Dateien:
#1526159
Lesenswert?

1
#define F_CPU 16000000
2
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
3
#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.
#1526174
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.
OP #1582130
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren