Migrate from https://cmakerhk.wordpress.com/2018/10/13/avr-c-programming/
_BV is only defined in the avr-libc headers. Extracted from avr/sfr_defs.h in avr-libc::::BV=Bit Value
       #define _BV(bit) (1 << (bit))
       TCCR2 = _BV(COM20)|_BV(CTC2)|_BV(CS20);
        DDRD = _BV(PD7);
==
       TCCR2 = (1<
//bit masking
// BM => Bit Mask
#define _BM(bit7, bit6, bit5, bit4, bit3, bit2, bit1, bit0)     \
(                                                               \
    ((bit7 == 7) << (bit7 & 7)) |                               \
    ((bit6 == 6) << (bit6 & 6)) |                               \
    ((bit5 == 5) << (bit5 & 5)) |                               \
    ((bit4 == 4) << (bit4 & 4)) |                               \
    ((bit3 == 3) << (bit3 & 3)) |                               \
    ((bit2 == 2) << (bit2 & 2)) |                               \
    ((bit1 == 1) << (bit1 & 1)) |                               \
    ((bit0 == 0) << (bit0 & 0))                                 \
)
UCSR0A = _BM (RXC0, TXC0, ~UDRE0, ~FE0, ~DOR0, ~UPE0, ~U2X0, ~MPCM0);
#define pinIsSlave 2
#define pinNSS 10
//pin2 is High –> Slave
//pin2 is Low  –> Master
#define DDR_SPI DDRB
#define DD_MOSI DDB3
#define DD_MISO DDB4
#define DD_SCK  DDB5
#define DD_NSS  DDB2
//==========
//pin   Master    Slave
//MOSI  User      INPUT
//MISO  INPUT     User
//SCK   User      INPUT
//NSS   User      INPUT
//__enable_interrupt();
void SPI_MasterInit(void);
char SPI_MasterTransmit(char cData);
void SPI_SlaveInit(void);
char SPI_SlaveReceive(void);
void setup() {
  pinMode(pinIsSlave, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println(“Master/Slave SPI - USART Firmware V1.0”);
  Serial.println(“pin2 is High –> Slave || pin2 is Low  –> Master”);
  //Program Start
  if(digitalRead(pinIsSlave)){
   //========================= SLAVE ===================
   Serial.println(“\n\n====Slave Mode is Selected====”);
   pinMode(pinNSS, INPUT);
   SPI_SlaveInit();
   while(1){
    if(digitalRead(pinNSS) == LOW)
      Serial.print(SPI_SlaveReceive());
   }
  }else{
   //========================= MASTER ==================
   Serial.println(“\n\n====Master Mode is Selected====”);
   pinMode(pinNSS, OUTPUT);
   SPI_MasterInit();
   while(1){
       digitalWrite(pinNSS, HIGH);
       char a = SPI_MasterTransmit(‘h’);
       digitalWrite(pinNSS, LOW);
       Serial.print(a);
       delay(2000);
    }
  }
}
void SPI_MasterInit(void){
  // Set MOSI and SCK output, all others untouch
  DDR_SPI |= (1 << DD_MOSI)|(1 << DD_SCK);
  //Enable SPI, Master,
  SPCR |= (1 << SPE)|(1 << MSTR);
  //SPI0 Clock Rate Select to f_osc/16
  SPCR |= (1 << SPR0);
}
char SPI_MasterTransmit(char cData){
  //Start Transmission
  SPDR = cData;
  //wait until Commication complete
  while(!(SPSR & (1 << SPIF)));
  return SPDR;
//
//    SPDR = cData;
//    asm volatile(“nop”);
//    while (!(SPSR & _BV(SPIF))) ; // wait
//    return SPDR;
}
void SPI_SlaveInit(void){
  //Set MISO output, all other untouch
  DDR_SPI |= (1 << DD_MISO);
  //Enable SPI
  SPCR = (1 << SPE);
}
char SPI_SlaveReceive(void){
  //wait until Commication complete
  Serial.print(“I am fucking here”);
  while(!(SPSR & (1 << SPIF)));
  Serial.println(“Something is here”);
  //Start Transmission
  return SPDR;
}
void loop() {
  // put your main code here, to run repeatedly:
}