#define FREC_CLK 125//Suitable for 125MHz Crystal
/******************************************************************************/
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void AD9850_Init()
{
output_drive(REST);//Define como salida
output_drive(FQUP);//Define como salida
output_drive(CLK);//Define como salida
output_drive(BitData);//Define como salida
output_bit(REST, 0);
output_bit(FQUP, 0);
output_bit(CLK, 0);
output_bit(BitData, 0);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void AD9850_Reset_Serial()
{
output_bit(CLK, 0);
output_bit(FQUP, 0);
//Reset signal
output_bit(REST, 0);
output_bit(REST, 1);
output_bit(REST, 0);
//Clk signal
output_bit(CLK, 0);
output_bit(CLK, 1);
output_bit(CLK, 0);
//Fq-up signal
output_bit(FQUP, 0);
output_bit(FQUP, 1);
output_bit(FQUP, 0);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Enviamos frecuencia en Hz al DDS.
void AD9850_WR_Serial(int8 w0,int32 frequence)
{
int8 i,w;
int32 y;
UINT64 x,aux;
//Calculate the frequency of the HEX value
aux = ui64Mult32x32(frequence,START_X); //el dato sigue cabiendo en la var de 64 bits
x = ui64Cast32x64(FREC_CLK);
aux = ui64Div64x64(aux,x);//no pierde tanta precisión porque se sigue trabajando en un recipiente de 64 bits
x = ui64Cast32x64(1000000);
aux = ui64Div64x64(aux,x);//ya pierde precisión pero el dato se entrega a int, así que no hay de otra
y = aux;
//write w4
w=(y>>=0);
for(i=0; i<8; i++)
{
output_bit(BitData, (w>>i)&0x01);
output_bit(CLK, 1);
output_bit(CLK, 0);
}
//write w3
w=(y>>8);
for(i=0; i<8; i++)
{
output_bit(BitData, (w>>i)&0x01);
output_bit(CLK, 1);
output_bit(CLK, 0);
}
//write w2
w=(y>>16);
for(i=0; i<8; i++)
{
output_bit(BitData, (w>>i)&0x01);
output_bit(CLK, 1);
output_bit(CLK, 0);
}
//write w1
w=(y>>24);
for(i=0; i<8; i++)
{
output_bit(BitData, (w>>i)&0x01);
output_bit(CLK, 1);
output_bit(CLK, 0);
}
//write w0
w=w0;
for(i=0; i<8; i++)
{
output_bit(BitData, (w>>i)&0x01);
output_bit(CLK, 1);
output_bit(CLK, 0);
}
output_bit(FQUP, 1);
output_bit(FQUP, 0);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~