1. void uart_receive(void) {
  2. if(UART_RX == AVAILABLE) { // Die Funktion soll nur ausgefuehrt werden, wenn der Rx-Modus aktiv ist
  3. cli(); // Waehrend der Parametrierung soll der Prozess durch keine Interrupts unterbrochen werden
  4. PCMSK1 &= ~(1<<PCINT8); // Deaktiviere den "Pin change interrupt" des DI Pins
  5. PRR &= 0x09; // Starte den Timer und das USI Modul
  6.  
  7. // Timer0
  8. TIMSK &= 0xe4; // Deaktiviere alle Interrupts des Timers
  9. TCCR0A = 0x01; // Schalte den CTC-Modus ein
  10. TCNT0L = 0; // Setze den Zaehler auf 0
  11. OCR0A = setpoint; // Setze den Sollwert
  12. TCCR0B = prescaler; // Aktiviere den Timer
  13.  
  14. // USI
  15. USISR = 0x48; // Loesche das "Overflow flag" des 4-bit-Zaehlers und setze seinen Zaehlerwert auf 8 (Overflow findet nach 8 Zyklen statt, also wenn alle 8 Bits empfangen wurden)
  16. 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
  17.  
  18. UART_RX = RECEIVING; // Es wird ein Byte empfangen
  19. sei(); // Schalte die Interrupts wieder ein
  20. }
  21. }