//CPU_TYPE = MEGA8
//F_CPU = 10 MHz

#include <mega8.h>

#define ACD             7

#define BUS_PORT        PORTC
#define BUS_DDR         DDRC
#define DATA            5
#define FQ_UD           4
#define W_CLK           3
#define RESET           2

#define BTN_PORT        PORTB
#define BTN_DDR         DDRB
#define BTN_PIN         PINB
#define BTN_OFF         4
#define BTN_ON          3

void AD9850_init (void)
{
BUS_PORT &= ~(1<<RESET);
BUS_PORT |= 1<<RESET;
BUS_PORT &= ~(1<<RESET);
BUS_PORT &= ~(1<<DATA);
BUS_PORT |= 1<<W_CLK;
BUS_PORT &= ~(1<<W_CLK);
BUS_PORT |= 1<<FQ_UD;
BUS_PORT &= ~(1<<FQ_UD);
BUS_PORT |= 1<<W_CLK;
BUS_PORT &= ~(1<<W_CLK);
BUS_PORT |= 1<<W_CLK;
BUS_PORT &= ~(1<<W_CLK);
BUS_PORT |= 1<<W_CLK;
BUS_PORT &= ~(1<<W_CLK);
BUS_PORT |= 1<<FQ_UD;
BUS_PORT &= ~(1<<FQ_UD);
}

void AD9850_Powerdown (void)
{
unsigned char i;
unsigned char cmd = 0x04;

BUS_PORT |= 1<<FQ_UD;
for (i=0; i<8; i++)
    {
    if (cmd & 1)
        BUS_PORT |= 1<<DATA;
    else
        BUS_PORT &= ~(1<<DATA);
    BUS_PORT |= 1<<W_CLK;
    if (i == 0)
        BUS_PORT &= ~(1<<FQ_UD);
    cmd >>= 1;
    BUS_PORT &= ~(1<<W_CLK);
    }
BUS_PORT |= 1<<FQ_UD;
BUS_PORT &= ~(1<<FQ_UD);
}

void AD9850_Set (double freq)
{
unsigned char i;
unsigned long dataword;

dataword = 4294967296*freq/125000000;
for (i=0; i<40; i++)
    {
    if (dataword & 1)
        BUS_PORT |= 1<<DATA;
    else
        BUS_PORT &= ~(1<<DATA);
    BUS_PORT |= 1<<W_CLK;
    dataword >>= 1;
    BUS_PORT &= ~(1<<W_CLK);
    }
BUS_PORT |= 1<<FQ_UD;
BUS_PORT &= ~(1<<FQ_UD);
}

void cpu_init(void)
{
BUS_DDR |= (1<<DATA)|(1<<FQ_UD)|(1<<W_CLK)|(1<<RESET);
BUS_PORT &= ~((1<<DATA)|(1<<FQ_UD)|(1<<W_CLK)|(1<<RESET));
BTN_DDR &= ~((1<<BTN_ON)|(1<<BTN_OFF));
BTN_PORT |= (1<<BTN_ON)|(1<<BTN_OFF);
ACSR |= 1<<ACD;
}

void main(void)
{
bit flg1,flg2;

flg1 = 1;
flg2 = 1;
cpu_init();
while (1)
    {
    if (!(BTN_PIN&(1<<BTN_ON))&flg1)
        {
        AD9850_init();
        AD9850_Set(54115000); //54.115 MHz
        flg1 = 0;
        flg2 = 1;
        }
    if (!(BTN_PIN&(1<<BTN_OFF))&flg2)
        {
        AD9850_Powerdown();
        flg2 = 0;
        flg1 = 1;
        }
    };
}
