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
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.
Hi, danke fuer Deine Antwort, Du meinst, ich soll meine Baudrate zu 125000 aendern oder soll ich mein Frequenz aendern?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.