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???