Ich habe ein kleines Problem mit dem UART (USI) beim Attiny2313.
Grundsätzlich funktioniert die Datenübertragung absolut einwandfrei. Ich
werde die serielle Schnittstelle, um Daten an einen Raspberry Pi (3,3V
Logik, kein Pegelwandler oÄ erforderlich) zu übertragen. Auf dem Pi
läuft die Automatisierungssoftware openHAB, die die Daten dann
auswertet. Dabei kommt es leider häufig vor, dass die Verzögerung
zwischen dem 8. und 9. Byte der Übertragung größer ist als zwischen den
übrigen Bytes. openHab interpretiert dies als neue Übertragung. Der
betreffende Code sieht so aus:
Berechnungen
1 | #define F_CPU 11059200
|
2 |
|
3 | //UART
|
4 | #define BAUD 9600UL // Baudrate
|
5 |
|
6 |
|
7 | // Berechnungen
|
8 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
9 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
10 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
11 |
|
12 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
13 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
14 | #endif
|
Initialisierung
1 | UCSRB |= (1<<RXEN);
|
2 | UCSRB |= (1<<TXEN);
|
3 | UBRRH = UBRR_VAL >> 8;
|
4 | UBRRL = UBRR_VAL;
|
Funktion
1 | static uint8_t uart_putc(unsigned char c)
|
2 | {
|
3 | while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
|
4 | {
|
5 | }
|
6 |
|
7 | UDR = c; /* sende Zeichen */
|
8 | return 0;
|
9 | }
|
Übertragung
1 | cli();
|
2 | for (int x = 0; x < buffersize; x++) {
|
3 | uart_putc(buffer[x]);
|
4 | buffer[x] = 0;
|
5 | }
|
6 | sei();
|
Hat jemand eine Idee, wordurch diese unterschiedlichen Latenzen zustande
kommen???