1. while(UART_RX == RECEIVING || UART_TX == FIRST || UART_TX == SECOND); // Warte, bis das Empfangen, bzw. Senden eines Bytes abgeschlossen ist
  2. cli(); // Waehrend der Parametrierung soll der Prozess durch keine Interrupts unterbrochen werden
  3. PRR &= 0x09; // Starte das Timer und USI Modul
  4. if(UART_RX == AVAILABLE) UART_RX = BREAK; // Wenn der Rx-Modus aktiviert ist, dann wird er pausiert
  5. PCMSK1 &= ~(1<<PCINT8); // Deaktiviere den "Pin change interrupt" des DI Pins
  6. DDRB &= ~(1<<PB0); // Der DI Pin ist ein Eingang
  7. DDRB |= (1<<PB1); // Der DO Pin ist ein Ausgang
  8. PORTB |= 0x03; // Setze den DI und den DO Pin auf ein H-Pegel
  9.  
  10. data_tx = rev_byte(byte); // Drehe die Reihenfolge der Bits des zu sendenden Bytes, da das LSB zuerst gesendet wird. Das Byte wird in einer lokalen Variable gepuffert, da das letzte Bit erst bei einem zweiten Durchgang gesendet werden kann
  11.  
  12. // USI
  13. USISR = 0x48; // Loesche das "Overflow flag" des 4-bit-Zaehlers und setze seinen Zaehlwert auf 8 (Overflow findet nach 8 Zyklen statt, also wenn alle 8 Bits gesendet wurden)
  14. USICR = 0x54; // Aktiviere den "Overflow interrupt" des 4-Bit-Zaehlers, schalte den "3-wire-mode" ein und waehle den "Compare match interrupt" des Timers als Taktgeber
  15. USIDR = 0 | (data_tx>>1); // Setze das Startbit und die ersten sieben Bits des zu sendenden Bytes in das Schieberegister der USI
  16.  
  17. // Timer0
  18. TIMSK &= 0xe4; // Deaktiviere alle Interrupts des Timers
  19. TCCR0A = 0x01; // Schalte den CTC-Modus ein
  20. TCNT0L = 0; // Setze den Zaehler auf 0
  21. OCR0A = setpoint; // Setze den Sollwert
  22. TCCR0B = prescaler; // Aktiviere den Timer
  23.  
  24. UART_TX = FIRST; // Der erste Teil wird ├╝bertragen
  25. sei(); // Schalte die Interrupts wieder ein
  26. }