#include<avr/io.h>
#include <stdint.h>
#include <util/delay.h>  
#include <stdio.h>
#include <stdlib.h>
#include <avr/interrupt.h>

#define DD_MOSI 5
#define DD_MISO 6
#define DD_SCK 7
#define DDR_SPI DDRB

unsigned volatile char s;
unsigned volatile char data;
unsigned volatile char servoNumber =0;
unsigned volatile char degree =1700;
unsigned volatile char readyFlag =0;


unsigned volatile int servo[18]={1000,1500,1000,2000,1000,2000,1000,2000,
1000,2000,1000,2000,1000,2000,1000,2000,1000,2000};   

void SPI_SlaveInit(void)
{

DDR_SPI = (1<<DD_MISO);

SPCR = (1<<SPE)|(1<<SPIE);
}

char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)))
;
/* Return Data Register */
return SPDR;
}


ISR (SPI_STC_vect)                 
{
  
    data =  SPI_SlaveReceive;
	
	if(data >= 224)
	{
	data = data & 00011111;
	data = servoNumber;
	readyFlag = readyFlag+1;
	}
    
	else
	{
	degree = (data*5,555556)+1000;
	readyFlag = readyFlag+2;
	}
	
	if(readyFlag == 3)
	{
	servo[servoNumber] = degree;
	readyFlag = 0;
	}
 
   
	
	
	
}

ISR(TIMER1_COMPA_vect) 
{
   if(s<=7)
   {
   PORTD &= ~(1<<s);  
   }
   if(s>7 && s<=13 )
   {
   PORTC &= ~(1<<(s-8));
   }
   
   if(s == 14)
   {PORTB &=~_BV(PB0);}
   
   if(s == 15)
   {PORTB &=~_BV(PB1);}
   
   if(s == 16)
   {PORTB &=~_BV(PB6);}
   
   if(s == 17)
   {PORTB &=~_BV(PB7);}
   
   
   
   s++;                   
   if (s > 17) s = 0;
   OCR1A = servo[s];      
}
 
ISR(TIMER1_OVF_vect) 
{
    if(s<=7)
   {
   PORTD |= (1<<s);      
   }
   
   if(s>7 && s<=13 )
   {
   PORTC |= (1<<(s-8));
   }
   
   if(s == 14)
   {PORTB |=_BV(PB0);}
   
   if(s == 15)
   {PORTB |=_BV(PB1);}
   
   if(s == 16)
   {PORTB |=_BV(PB6);}
   
   if(s == 17)
   {PORTB |=_BV(PB7);}
   
}


void main ()
{

sei(); 
SPI_SlaveInit();

DDRB |=_BV(PB0);
DDRB |=_BV(PB1);
DDRB |=_BV(PB6);
DDRB |=_BV(PB7);

DDRD = 0xFF;
DDRC = 0xFF;


    TCCR1A |= (1<<WGM11);
    TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS11) ;
    TIMSK |= (1<<OCIE1A) | (1<<TOIE1);  
    ICR1 = 2500;     


while(1)
{
  
 

}

}