// Listing 10.2. Szkic kodu dla urządzenia slave
byte dataToEcho; // deklaracja zmiennych globalnych wykorzystywanych przez przerwanie
boolean blink = LOW;
void setup() {
  Serial.begin(115200);
  DDRB |= 0b00010001;    // wyjście MISO LED(8)
  PORTB |= 0b00000100;   // stan wysoki na linii wyboru urządzenia slave
  SPCR |= 0b11000000;    // ustawienie bitów SPIE i SPE
  SPSR |= 0b00000000;    // domyślne ustawienia SPI
  sei(); // globalne włączenie przerwań
} // koniec setup

void loop() {
  digitalWrite(8, (blink = !blink));   // miganie diody oznaczające pracę
  delay(1000);  
} // koniec loop

ISR(SPI_STC_vect) {
  cli(); // wyłączenie przerwań na czas wykonywania krytycznego kodu
  while (!(PINB & 0b00000100)) { // wejście do pętli, jeżeli linia slave select ma stan niski
    SPDR = dataToEcho; // wpisanie do rejestru SPI danych do przesunięcia
    while (!(SPSR & (1 << SPIF))); // oczekiwanie na zakończenie transmisji
    dataToEcho = SPDR; // odczyt danych przychodzących; bajt będzie wysłany przy następnym przerwaniu
  }
  sei(); // włączenie przerwań z powrotem po zakończeniu
} // koniec procedury ISR
