Forum: Mikrocontroller und Digitale Elektronik UART Fehler Uebertragung bei float


von Leandro L. (tetef)


Angehängte Dateien:

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

von Tim S. (maxxie)


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.

von Leandro L. (tetef)


Lesenswert?

Hi, danke fuer Deine Antwort,

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

von Tim S. (maxxie)


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.

von Falk B. (falk)


Lesenswert?


von Leandro L. (tetef)


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?

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.