/*
 fatiherdem.net
 picproje.org
 RX den gelen veriyi SPI ile gönderir
 SPI den gelen veriyi TX ile gönderir
 Atmega8 @ 1MHz
 */

#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>

char SPI(char cData);


#define F_CPU 1000000  // 1 MHz
#define DDR_SPI DDRB
#define DD_MOSI 3
#define DD_SCK 5

#define BAUDRATE 9600
//calculate UBRR value
#define UBRRVAL ((F_CPU/(BAUDRATE*16UL))-1)



void USART_Init()
{
	//Set baud rate
	UBRRL=UBRRVAL;		//low byte
	UBRRH=(UBRRVAL>>8);	//high byte
	//Set data frame format: asynchronous mode,no parity, 1 stop bit, 8 bit size
	UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|
		(0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);
	//Enable Transmitter and Receiver and Interrupt on receive complete
	UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
	//enable global interrupts
	//set_sleep_mode(SLEEP_MODE_IDLE);
	sei();
	DDRD|= (1 << PD1);
	DDRD|= ~(1 << PD0);
}

void USART_Transmit( unsigned int data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Copy ninth bit to TXB8 */
UCSRB &= ~(1<<TXB8);
if ( data & 0x0100 )
UCSRB |= (1<<TXB8);
/* Put data into buffer, sends the data */
UDR = data;
}


void SPI_MasterInit(void)
{
/* Set MOSI, SS and SCK output,  all others input */
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR);
}

char SPI(char cData){
unsigned char data;
data=0xCC;
	SPDR = cData;
	/* Wait for transmission complete */
	while(!(SPSR & (1<<SPIF)));

	//if(cData==0xFF || cData==0xFE){
		data = SPDR;
		USART_Transmit(data);

	//}
	return data;
	//_delay_ms(15);
}


ISR(USART_RXC_vect)
{

	DDRB |= (1 << PB0);
	//define temp value for storing received byte
	uint8_t Temp;
	//Store data to temp
	Temp=UDR;
	//USART_Transmit(Temp);
	SPI(Temp);



	if (Temp==0xAA){
		PORTB |= (1 << PB2); // CS HIGH
	}
	if (Temp==0xBB){
		PORTB &= ~(1 << PB2); // CS LOW
	}


	PORTC ^= (1 << PC5); //seri data geldi, C5 i toggle et


}

int main(void) {

//**********Port Init*************
  //define c5 as output
  DDRC |= (1 << PC5);
  DDRB |= (1 << PB0);
  DDRB |= (1 << PB2);

  SPI_MasterInit(); //MOSI ve SCK cikis olarak ayarlandi
  USART_Init(); 	//TX pini cikisa ayarlandi





  while(1){


	  PORTB |= (1 << PB0); // switch on
	  _delay_ms(100);
	  PORTB &= ~(1 << PB0); // switch off
	  _delay_ms(100);
  }

return 0;
}




