{###########################################################################}

procedure SendSR;  //Sende MP3switchState an den 4094 oder Ausgangsport

begin
  if Wave=c_audio then
    b_ExtOnMP3Power:= high;
  else
    b_ExtOnMP3Power:= low;
  endif;
  MP3switchTemp := MP3State OR SwitchState;
  asm;
    LDS _ACCA, SoftDDS.MP3switchTemp;
    sbi  SoftDDS.DDSOutPort, SoftDDS.b_STROBE
    cbi  SoftDDS.DDSOutPort, SoftDDS.b_SCLK
    ldi  _ACCB, 8

    SoftDDS.srloop:
    LSL  _ACCA
    brcs SoftDDS.datahigh1
    cbi  SoftDDS.DDSOutPort, SoftDDS.b_SDATA
    rjmp SoftDDS.dataset1
    SoftDDS.datahigh1:
    sbi  SoftDDS.DDSOutPort, SoftDDS.b_SDATA
    SoftDDS.dataset1:
    nop
    sbi  SoftDDS.DDSOutPort, SoftDDS.b_SCLK
    nop
    cbi  SoftDDS.DDSOutPort, SoftDDS.b_SCLK
    dec _ACCB
    BRNE  SoftDDS.srloop

    cbi  SoftDDS.DDSOutPort, SoftDDS.b_STROBE
    sbi  SoftDDS.DDSOutPort, SoftDDS.b_SCLK
  endasm;
end;

{AD9833 DDS functions }
{$IFNDEF miniDDS}
procedure SendDDS;  //Sende ein Wort an den DDS-Chip

begin
  asm;
    lds  _ACCDLO, SoftDDS.dss_cmd
    lds  _ACCDHI, SoftDDS.dss_cmd+1
    cbi  SoftDDS.DDSOutPort, SoftDDS.b_FSYNC

    ldi  _ACCB, 8

    SoftDDS.ddsloop1:    ; höherwertiges Byte rausschieben
    lsl  _ACCDHI
    brcs SoftDDS.ddsdatahigh
    cbi  SoftDDS.DDSOutPort, SoftDDS.b_SDATA
    rjmp SoftDDS.ddsdataset
    SoftDDS.ddsdatahigh:
    sbi  SoftDDS.DDSOutPort, SoftDDS.b_SDATA
    SoftDDS.ddsdataset:
    cbi  SoftDDS.DDSOutPort, SoftDDS.b_SCLK
    nop
    sbi  SoftDDS.DDSOutPort, SoftDDS.b_SCLK
    dec _ACCB
    brne  SoftDDS.ddsloop1

    ldi  _ACCB, 8

    SoftDDS.dssloop2:    ; niederwertiges Byte rausschieben
    lsl  _ACCDLO
    brcs SoftDDS.ddsdatahigh2
    cbi  SoftDDS.DDSOutPort, SoftDDS.b_SDATA
    rjmp SoftDDS.ddsdataset2
    SoftDDS.ddsdatahigh2:
    sbi  SoftDDS.DDSOutPort, SoftDDS.b_SDATA
    SoftDDS.ddsdataset2:
    cbi  SoftDDS.DDSOutPort, SoftDDS.b_SCLK
    nop
    sbi  SoftDDS.DDSOutPort, SoftDDS.b_SCLK
    dec _ACCB
    brne  SoftDDS.dssloop2

    sbi  SoftDDS.DDSOutPort, SoftDDS.b_FSYNC
  endasm;
end;
{$ENDIF}


procedure SendLevel(step, channel : byte);
begin
{$IFNDEF miniDDS}
//Sende Adresse 0 und ein Byte an den Poti-Chip LM1972
  _ACCDLO:=channel;
  _ACCDHI:=step;
  asm;
    sbi SoftDDS.DDSOutPort, SoftDDS.b_FSYNC;
    cbi SoftDDS.DDSOutPort, SoftDDS.b_SDATA;
    cbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK;
    cbi SoftDDS.DDSOutPort, SoftDDS.b_LOADPOT;
    ldi  _ACCB, 7
    SoftDDS.levelloop1:    ; 6 Nullen rausschieben
    sbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK;
    nop
    cbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK
    dec _ACCB
    brne  SoftDDS.levelloop1
    dec _ACCDLO
    brne  SoftDDS.channelset; wenn 0 gewesen, überspringen
    sbi SoftDDS.DDSOutPort, SoftDDS.b_SDATA;  1 rausschieben
    nop
    SoftDDS.channelset:
    sbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK;
    nop
    cbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK;

    ldi  _ACCB, 8
    SoftDDS.levelloop2:    ; Byte Step rausschieben
    lsl  _ACCDHI; step shiften
    brcs SoftDDS.leveldatahigh2
    cbi  SoftDDS.DDSOutPort, SoftDDS.b_SDATA
    rjmp SoftDDS.leveldataset2
    SoftDDS.leveldatahigh2:
    sbi  SoftDDS.DDSOutPort, SoftDDS.b_SDATA
    SoftDDS.leveldataset2:
    nop;
    sbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK;
    nop;
    nop;
    cbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK;
    dec _ACCB
    brne  SoftDDS.levelloop2
    sbi SoftDDS.DDSOutPort, SoftDDS.b_LOADPOT;
    sbi SoftDDS.DDSOutPort, SoftDDS.b_SDATA;
    sbi SoftDDS.DDSOutPort, SoftDDS.b_SCLK;
  endasm;
{$ENDIF}
end;

procedure SetLevelDDS;
//Pegelsteller und Relais setzen, Frequenz einstellen
var myAdj, myAdjIndex: byte;
  freq, fac, acc : LongInt;
  freqHi, freqLo : word;
begin
//Pegel einstellen
{$IFDEF miniDDS}
  SwitchState:= 7 - LeveldB;
//MP3Power wird in SendSR eingefügt, SoftDDS-Routine berücksichtigt Wave,
//deshalb nur:
  SendSR;
{$ELSE}

//Relais und MP3-Power setzen
  SwitchState:=0;
  GainOffset:=0;
  case Wave of
    c_sinw :
        wave_cmd:= c_ddssinecmd;
      |
    c_triw :
        wave_cmd:= c_ddstrianglecmd;
      |
    c_squw :
        wave_cmd:= c_ddssquarecmd;
        b_SquareSw:= high;
      |
  endcase;

// -(256-80), 80=Anzahl eigener Stufen bis Vollaussteuerung +10 dB)
  k:= -LeveldB-176;


  if LeveldB < 20 then
//Relais für Abschwächer
    b_AttnSw:= high;
    k:= k - 20; //-20dB
  endif;
  SendSR; //Relais setzen

{beim LM1972 bis -48 dB 0,5-dB-Sprünge}
  if k < 48 then
    k := k shl 1;      // *2
  else
    k:= k + 48;
  endif;
  SendLevel(k, 0); // Coarse-dB-Einstellung

//Fine-Adjust-Wert an LM1972 zweiten Kanal senden
  k:=AdjValue;
  SendLevel(k, 1);

{$ENDIF}

//DSS-Frequenz einstellen
  freq:= 0;
  for i := 0 to 6 do                //Einzelne Stellen aufaddieren
    fac:= LongInt(gettable(EditArray, (i)));
    acc:= gettable(fhz, i);
    freq:= freq + (acc*fac);
  endfor;
  acc:= LongInt(gettable(fdhz, FrequDez)); //Dezihertz
  freq:= freq + acc;
{$IFDEF miniDDS}
  freqHi:= hiword(freq);
  freqLo:= Loword(freq);
  DDSL:= Lo(freqLo);
  DDSM:= Hi(freqLo);
  DDSH:= Lo(freqHi);
{$ELSE}
  dss_cmd:= loword(freq) AND %0011111111111111;
  dss_cmd:= dss_cmd OR %0100000000000000;
  SendDDS;
  freq:= freq shl 2;
  dss_cmd:= hiword(freq) AND %0011111111111111;
  dss_cmd:= dss_cmd OR %0100000000000000;
  SendDDS;
  dss_cmd:= wave_cmd;
  SendDDS;
{$ENDIF}
end;


