|
|
procedure InitSynth; begin // Основной сброс синтезатора Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] or M_RESET; Make_Strobe; Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] AND (NOT M_RESET); Make_Strobe; // Остановить главную тактировку синтезатора Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] AND (NOT CLK_ENABLE); Make_Strobe; // Произвести выборку кристалла синтезатора Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] AND (NOT CS_DDS) or CS_ADC; Make_Strobe; // Сформировать импульс сброса регистра ввода Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] or IO_RESET; Make_Strobe; Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] AND (NOT IO_RESET); Make_Strobe; // Последовательно загрузить адрес и слова управления синтезатором SendByte(InitReg); SendByte(CW1); SendByte(CW2); SendByte(CW3); SendByte(CW4); // Разрешить главную тактировку синтезатора Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] OR CLK_ENABLE; Make_Strobe; // Снять выборку кристалла синтезатора Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] OR CS_DDS; Make_Strobe; end; |
|
По включении синтезатора амплитуда выходного сигнала устанавливается в 0. Если эту фичку не вычитать из даташита, можно потом много времени потерять на выяснение вопроса: "А где же выходной сигнал?..". Так что, не забывайте, что амплитуду сигнала таки надо устанавливать. |
procedure SetAmplitude(Ampl: integer);
begin
// Произвести выборку кристалла синтезатора
Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] AND (NOT CS_DDS) or CS_ADC;
Make_Strobe;
SendByte($08);
// Передать младший ниббл старшего байта амплитуды
SendByte((Ampl and $0F00) shr 8);
// Затем передать младший байт амплитуды
SendByte(Ampl and $0FF);
// Сформировать импульс обновления синтезатора
Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] or IO_UPDATE;
Make_Strobe;
Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] AND (NOT IO_UPDATE);
Make_Strobe;
// Снять выборку кристалла синтезатора
Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] OR CS_DDS;
Make_Strobe;
end;
|
|
Чтобы правильно установить частоту, надо предварительно просчитать Слово Управления Частотой. Как это делать подробно описано в даташите. Длина этого слова составляет 48 бит или 6 байт. Отдельно я приведу процедуру выдачи одного байта в синтезатор. |
procedure SetSynthFreq(Frq: int64);
var i: integer;
begin
//
FTWCalc(Frq);
// Произвести выборку кристалла синтезатора
Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] AND (NOT CS_DDS) or CS_ADC;
Make_Strobe;
SendByte(FrqReg);
for i:= 0 to 5 do
begin
SendByte(ByteSend[i]);
End;
// Сформировать импульс обновления синтезатора
Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] or IO_UPDATE;
Make_Strobe;
Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] AND (NOT IO_UPDATE);
Make_Strobe;
// Снять выборку кристалла синтезатора
Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] OR CS_DDS;
Make_Strobe;
end;
|
|
|
Procedure SendByte(ByteToSend: Byte);
var i: Integer;
Begin
// Перевод линии тактировки в 0
Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] AND (NOT SCLK);
Make_Strobe;
// Передача байта старшим битом вперед
for i:= 1 to 8 do
begin
// Выделение старшего бита
if (ByteToSend and $80) = $80 then
begin
// Передача единицы
Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] or SDATA;
Make_Strobe;
end
else
begin
// Передача нуля
Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] and (not SDATA);
Make_Strobe;
end;
// Фронт тактового ипульса
Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] OR SCLK;
Make_Strobe;
// Переход следующему биту
ByteToSend:= ByteToSend shl 1;
/// Спад тактового импульса
Form1.Port.Byte[Base]:= Form1.Port.Byte[Base] AND (NOT SCLK);
Make_Strobe;
end;
End;
|