#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>

#include <avr/sleep.h>

#define DATA_1   PORTB |= _BV(PB4)   // DATA_1 - установить "1" на включенной линии DATA
#define DATA_0   PORTB &= ~_BV(PB4)  // DATA_0 - установить "0" на включенной линии DATA
#define CLK_1    PORTB |= _BV(PB3)   // CLK_1 - установить "1" на включенной линии CLOCK
#define CLK_0    PORTB &= ~_BV(PB3)  // CLK_0 - установить "0" на включенной линии CLOCK
#define CS_1     PORTB |= _BV(PB2)   // CS_1 - установить "1" на включенной линии LE
#define CS_0     PORTB &= ~_BV(PB2)  // CS_0 - установить "0" на включенной линии LE

#define DATA_LINE_ON   DDRB |= _BV(PB4)  // включить линию DATA - т.е. сделать выходом вывод PB4
#define DATA_LINE_OFF  DDRB &= ~_BV(PB4) // выключить линию DATA - т.е. сделать входом вывод PB4 с подтяжкой !
#define CLK_LINE_ON    DDRB |= _BV(PB3)  // включить линию CLK - т.е. сделать выходом вывод PB3
#define CLK_LINE_OFF   DDRB &= ~_BV(PB3) // выключить линию CLK - т.е. сделать входом вывод PB3 с подтяжкой !
#define CS_LINE_ON     DDRB |= _BV(PB2)  // включить линию CS - т.е. сделать выходом вывод PB2
#define CS_LINE_OFF    DDRB &= ~_BV(PB2) // выключить линию CS - т.е. сделать входом вывод PB2 с подтяжкой !


volatile unsigned char   bayt; // байт для отправки в синтезатор


//--------------------------------------------------------------
//************** Отправка 8 бит в синтезатор *******************
//--------------------------------------------------------------

void data_to_synt (void) 
{

 unsigned char ctr = 8;          // Локальная переменная счетчик

/* Цикл вывода bayt начиная с бита_7 (старший - MSB). 
Будем делать 8 раз каждый раз отправляя в синтезатор очередной бит */

while (ctr)
   {
    if (bayt & 0b10000000) DATA_1;   // Вывести на DATA 7-й бит bayt
    
	else DATA_0; 

    bayt <<= 1;    // Сдвинуть bayt на 1 позицию влево
    ctr --;        // Уменьшить счетчик оставшихся прогонов цикла на 1
  
   _delay_us(150);  //150 mks
   
    CLK_1;         //Сделать фронт на CLK 

   _delay_us(200); //задержка 200 мксек;	

    CLK_0;         //делать спад на CLK 

   _delay_us(150); //задержка 150 мксек;

   };
 
   _delay_us(200); //задержка 200 мксек;  

} 


/*//////////////////////////////////////////////////////////////////
//////////////////////  M   A   I   N  /////////////////////////////
////////////////////////////////////////////////////////////////////
*/

int main(void)
{
  
	_delay_ms(200);   //на переходные процессы

	CS_LINE_ON;       //Включаем линии (выводы МК) управляющие синтезатором  
	CLK_LINE_ON;      //делаем их выходами
	DATA_LINE_ON;     // линия DATA просто включена - сделана выходом

	CS_1;             //Установить "1" на CS (LE)
	CLK_0;            //Установить "0" на CLK
	DATA_0;           //Установить "0" на DATA
   _delay_ms(100);    //100ms
   
   	CS_0;             //разрешаем запись в синтезатор CS=0 (LE=0)  

//------Запись в синтезатор Initialization Latch 0x8D8013

	//		P = 32, current setting 2 = 2.5 mA, current setting 1 = 2.5mA,
	//		Timeout = 3 pfd cycles, CP enabled, PD polarity = negative
	//		muxout = Digital lock,
	
 	bayt = 0x8D;      //посылаем MSB первым 
	data_to_synt ();  //отправляем в синтезатор байт
	
	bayt = 0x80;      //next 
	data_to_synt ();  //отправляем в синтезатор байт
	
	bayt = 0x13;      //next 
	data_to_synt (); 

    CS_1;             //Вывести "1" на LE,конец передачи Initialization Latch
	_delay_ms(10);    //10ms
	CS_0;             //разрешаем запись в синтезатор CS=0 (LE=0)

//-----Запись в синтезатор Functional Latch 0x8D8012

 	bayt = 0x8D;      //посылаем MSB первым 
	data_to_synt ();  //отправляем в синтезатор байт
	
	bayt = 0x80;      //next 
	data_to_synt ();  //отправляем в синтезатор байт
	
	bayt = 0x12;      //next 
	data_to_synt (); 

    CS_1;             //Вывести "1" на LE,конец передачи Functional Latch
	_delay_ms(10);    //10ms
	CS_0;             //разрешаем запись в синтезатор CS=0 (LE=0)

//-----Запись в синтезатор R Counter Latch 0x100008 =>MSB 00010000 00000000 00001000 LSB	

	// 		R = 2, Anti-backlash width = 2.9ns, Precision = five cycles
	//		of phase less than 15ns before lock detect is set
	
 	bayt = 0x10;      //посылаем MSB первым 00010000
	data_to_synt ();  //отправляем в синтезатор байт
	
	bayt = 0x00;      //next 00000000
	data_to_synt ();  //отправляем в синтезатор байт
	
	bayt = 0x08;      //next 00001000
	data_to_synt (); 

    CS_1;             //Вывести "1" на LE,конец передачи R Counter Latch
	_delay_ms(10);    //10ms
	CS_0;             //разрешаем запись в синтезатор CS=0 (LE=0)

//-----Запись в синтезатор N Counter Latch 0x000F15 	

	// AB latch

 	bayt = 0x00;      //посылаем MSB первым 
	data_to_synt ();  //отправляем в синтезатор байт
	
	bayt = 0x0F;      //next 
	data_to_synt ();  //отправляем в синтезатор байт
	
	bayt = 0x15;      //next 
	data_to_synt (); 

    CS_1;             //Вывести "1" на LE,конец передачи N Counter Latch
	_delay_ms(100);    //100ms

//----- Перевод контроллера в спящий режим --------
    
	set_sleep_mode(SLEEP_MODE_PWR_DOWN); // если спать - то на полную -->  Power-down
    while(1) 
	{
	 sleep_enable();   // разрешаем сон
     sleep_cpu();      // спать!
     }
	  
}



