1. ISR(USI_OVF_vect) {
  2. if(UART_RX == RECEIVING) { // Ein Byte wurde empfangen
  3. TCCR0B = 0; // Deaktiviere den Timer
  4. USICR = 0; // Deaktiviere die USI
  5. USISR = 0x40; // Loesche das "Overflow interrupt flag" des 4-Bit-Zaehlers
  6.  
  7. data_rx[data_avail_rx++] = rev_byte(USIDR); // Speicher das empfangende Byte in den Puffer
  8. if(data_avail_rx > 15) data_avail_rx = 0; // Der Puffer ist voll --> Beim naechsten Mal werden die Daten ueberschrieben
  9.  
  10. PRR |= 0x06; // Schalte das Timer und USI Modul ab
  11. PCMSK1 |= (1<<PCINT8); // Aktiviere den "Pin change interrupt" des DI Pins
  12. UART_RX = AVAILABLE; // Es kann ein weiteres Byte empfangen werden
  13. }
  14. else if(UART_TX == FIRST) { // Der erste Teil eines Bytes wurde gesendet
  15. USIDR = (data_tx<<7) | 0x7f; // Speichere das letzte Datenbit im Schieberegister der USI und fuelle den Rest mit Einsen auf
  16. USISR = 0x4d; // Loesche das "Overflow flag" des 4-Bit-Zaehlers und setze den Zaehlerwert auf 13 (3 Zyklen bis Ueberlauf)
  17. UART_TX = SECOND; // Der zweite Teil wird gesendet
  18. }
  19. else if(UART_TX == SECOND) {
  20. TCCR0B = 0; // Deaktiviere den Timer
  21. USICR = 0; // Deaktiviere die USI
  22. USISR = 0x40; // Loesche das "Overflow flag" vom 4-Bit-Zaehler
  23. PRR |= 0x06; // Schalte das Timer und USI Modul ab
  24. UART_TX = NOTINIT; // Die Uebertragung ist abgeschlossen
  25. DDRB &= ~(1<<PB1); // Setze DO als Eingang
  26. if(UART_RX == BREAK) uart_listen(); // Aktiviere den Rx-Modus, falls er vorher auch aktiviert war
  27. }
  28. }