⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 ad9852 code 很好的代码呀!好长时间!
💻 PAS
📖 第 1 页 / 共 2 页
字号:
        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 + -