📄 main.pas
字号:
buf[bytenumber] := buf[bytenumber] +
trunc(intpower(2,(bitnumber-1) - 8 * bytenumber));
end
else
Edit_ftwbits.Text := '0' + Edit_ftwbits.Text;
//add a decimal point separator every four bits for readability
if ((bitnumber <> 48) and ((bitnumber mod 4) = 0))then
Edit_ftwbits.Text := '.' + Edit_ftwbits.Text;
Edit_ftwbits.Update;
end;
//Calculate the six bytes containing frequency tuning word
for bytenumber := 0 to 5 do
begin
Ftw_bytes.lines.Add(inttostr(bytenumber)+' : '+
inttostr(buf[bytenumber]));
end;
//Send data to DDS, repeat if necessary
//to be able to monitor data stream with an oscilloscope
for sendrepeat :=1 to strtoint(Edit_repeat.Text) do
begin
Label_status.Caption := 'send sequence: '+inttostr(sendrepeat);
Label_status.Update;
sendCSB; //Chip select enabled
sendIOReset; //Send IO reset
//------------
sendbyte(7); //register #7 (dds setup)
if(controldac)then
sendbyte(16) //control dac, dac and digital switched on,
//comparator powered down
//change '16' into '0' to switch comparator on
else
sendbyte(20); //same, but control dac also powered down
sendbyte(pllbyte);
sendbyte(0); //external io update
sendbyte(96); //bypass inv sync, osk en is active to enable
//output level to be set, osk int is off,
//msb first, sdo inactive
//------------
sendbyte(2); //register #2 (ftw 1)
sendbyte(buf[5]); //frequency word from calculated buf array
sendbyte(buf[4]);
sendbyte(buf[3]);
sendbyte(buf[2]);
sendbyte(buf[1]);
sendbyte(buf[0]);
//------------
sendbyte(8); //register #8 (output level)
sendbyte(levelhigh); //from output level field
sendbyte(levellow); //
//------------
sendbyte(11); //register #B (control dac output level)
sendbyte(controldachigh); //from control dac output level field
sendbyte(controldaclow); //note: in two's complement!
sendIOUD; //IO Update pulse
sendCSBNOT; //Chip select disabled
Label_status.Caption := 'Data sent to DDS';
end;
end
else
begin
Label_status.Caption := 'Input parameter fault';
Label_status.Update;
inputfault := False;
end;
end;
procedure TForm_main.FormCreate(Sender: TObject);
begin
Form_main.Show;
Sleep(100);
//reset portbits to all zero's
portbits := 0;
portaddress := strtoint(Edit_portaddress.Text);
Button_masterresetClick(Self);
Edit_clockeff.Text := Edit_clock.Text;
controldac := False;
end;
procedure TForm_main.Button_masterresetClick(Sender: TObject);
begin
Beep;
Label_status.Caption := 'Resetting DDS...';
Label_status.Font.Color := ClRed;
Label_status.Update;
portbits := portbits or MASTERRESET; //Masterreset high
Out32(portaddress, portbits);
Sleep(500); //milliseconds
portbits := portbits and not(MASTERRESET); //Masterreset low
Out32(portaddress, portbits);
Label_status.Caption := 'DDS is reset';
Label_status.Font.Color := ClBlack;
Label_status.Update;
end;
procedure TForm_main.sendCSB;
begin
portbits := portbits and not(CSB); //Chipselect low
Out32(portaddress, portbits);
//Sleep(1000);//!!!KANWEG
end;
procedure TForm_main.sendCSBNOT;
begin
portbits := portbits or CSB; //Chipselect high
Out32(portaddress, portbits);
end;
procedure TForm_main.sendSCLK;
begin
portbits := portbits or SCLK; //Clock high
Out32(portaddress, portbits);
//Sleep(1);//!!!weg
portbits := portbits and not(SCLK); //Clock low
Out32(portaddress, portbits);
end;
procedure TForm_main.sendIORESET;
begin
portbits := portbits or IORESET; //IOreset high
Out32(portaddress, portbits);
//Sleep(1000);//!!!weg
portbits := portbits and not(IORESET); //IOReset low
Out32(portaddress, portbits);
end;
procedure TForm_main.sendIOUD;
begin
portbits := portbits or IOUD; //IOUpdate high
Out32(portaddress, portbits);
portbits := portbits and not(IOUD); //IOUpdate low
Out32(portaddress, portbits);
end;
procedure TForm_main.sendByte(senddata : byte);
var
bitnumber : integer;
bitstring : string;
begin
bitstring := inttostr(Bytessent) + ' : ';
for bitnumber := 7 downto 0 do
begin
if ((senddata and trunc(intpower(2,bitnumber))) =
trunc(intpower(2,bitnumber))) then
begin
portbits := portbits or SDO; //Data line high
Out32(portaddress, portbits);
bitstring := bitstring + '1';
//Sleep(1);
end
else
begin
portbits := portbits and not(SDO); //Data line low
Out32(portaddress, portbits);
bitstring := bitstring + '0';
//Sleep(1);
end;
sendSCLK; //Toggle clock line
end;
Bits_sent.lines.Add(bitstring + ' dec: ' + inttostr(senddata));
Bytessent := Bytessent + 1;
end;
procedure TForm_main.CheckBox_pllenabledClick(Sender: TObject);
begin
if Checkbox_pllenabled.Checked then
begin
ComboBox_pllmultiplier.Enabled := True;
ComboBox_pllmultiplier.Itemindex := 0;
ComboBox_pllmultiplierChange(Self)
end
else
begin
ComboBox_pllmultiplier.Enabled := False;
Edit_clockeff.Text := Edit_clock.Text;
end;
end;
procedure TForm_main.ComboBox_pllmultiplierChange(Sender: TObject);
begin
if Strtofloat(Edit_clock.Text) *
(Combobox_pllmultiplier.ItemIndex+4) > 300.0 then
begin
showmessage('(DDS Base clock) x (Pll multiplier) must be =< 300 MHz');
ComboBox_pllmultiplier.SelectAll;
ComboBox_pllmultiplier.SetFocus;
end
else
begin
Edit_clockeff.Text := floattostr( Strtofloat(Edit_clock.Text) *
(Combobox_pllmultiplier.ItemIndex+4));
end;
end;
procedure TForm_main.Button1Click(Sender: TObject);
var i:integer;
begin
for i:=0 to 100000 do
sendIOUD;
end;
procedure TForm_main.CheckBox_fsClick(Sender: TObject);
begin
//if FS is checked, set level to max and disable control,
//else enable control
if CheckBox_fs.Checked = True then
begin
Edit_level.Text := inttostr(4095);
Edit_level.Enabled := False;
end
else
Edit_level.Enabled := True;
end;
procedure TForm_main.CheckBox_maxClick(Sender: TObject);
begin
//if 'max' is checked, set control dac level to max (in 2's complement
//and disable control and 'min'
//else enable control
if CheckBox_max.Checked = True then
begin
Edit_controldac.Text := inttostr(2047);
Edit_controldac.Enabled := False;
CheckBox_min.Enabled := False;
Checkbox_min.Checked := False;
end
else
begin
Edit_controldac.Enabled := True;
CheckBox_max.Enabled := True;
Checkbox_min.Enabled := True;
end;
end;
procedure TForm_main.CheckBox_minClick(Sender: TObject);
begin
//if 'min' is checked, set control dac level to min (in 2's complement
//and disable control and 'max'
//else enable control
if CheckBox_min.Checked = True then
begin
Edit_controldac.Text := inttostr(2048);
Edit_controldac.Enabled := False;
CheckBox_max.Enabled := False;
Checkbox_max.Checked := False;
end
else
begin
Edit_controldac.Enabled := True;
CheckBox_min.Enabled := True;
Checkbox_max.Enabled := True;
end;
end;
procedure TForm_main.CheckBox_controldacClick(Sender: TObject);
begin
if Checkbox_controldac.Checked = True then
begin
Checkbox_max.Enabled := True;
Checkbox_min.Enabled := True;
Edit_controldac.Enabled := True;
controldac := True;
end
else
begin
Checkbox_max.Enabled := False;
Checkbox_min.Enabled := False;
Edit_controldac.Enabled := False;
controldac := False;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -