{###########################################################################}

procedure ClkPulsePos;
//Datenleitung nach Carry setzen und Clk-Impuls erzeugen
begin
  asm;
    brcs DCG.1257datahigh1p
    cbi  DCG.ControlBitPort, DCG.b_SDATA
    rjmp DCG.1257dataset1p
DCG.1257datahigh1p:
    sbi  DCG.ControlBitPort, DCG.b_SDATA
DCG.1257dataset1p:
    nop
    sbi  DCG.ControlBitPort, DCG.b_SCLK
    nop
    nop
    nop
    nop
    cbi  DCG.ControlBitPort, DCG.b_SCLK
  endasm;
end;

procedure ClkPulseLoad1257;
//Datenleitung nach Carry setzen und Clk-Impuls mit /Load-Strobe erzeugen
begin
  asm;
    brcs DCG.1257datahigh2
    cbi  DCG.ControlBitPort, DCG.b_SDATA
    rjmp DCG.1257dataset2
DCG.1257datahigh2:
    sbi  DCG.ControlBitPort, DCG.b_SDATA
DCG.1257dataset2:
    nop
    sbi  DCG.ControlBitPort, DCG.b_SCLK
    cbi  DCG.ControlBitPort, DCG.b_STRDAC
    nop
    nop
    nop
    nop
    cbi  DCG.ControlBitPort, DCG.b_SCLK
    sbi  DCG.ControlBitPort, DCG.b_STRDAC
  endasm;
end;

procedure ShiftOut1257;
//Sendet LevelByteHi und LevelByteLo an LTC1257
begin
   LevelByteLo:=Lo(DACItemp);
   LevelByteHi:=Hi(DACItemp);
   asm;
    cbi  DCG.ControlBitPort, DCG.b_SDATA
    cbi  DCG.ControlBitPort, DCG.b_SCLK
    sbi  DCG.ControlBitPort, DCG.b_STRDAC

    LDS  _ACCA, DCG.LevelByteHi ; MSB linksbündig
    LSL  _ACCA
    LSL  _ACCA
    LSL  _ACCA
    LSL  _ACCA ; Bit 3 sitzt jetzt oben
    ldi  _ACCB, 4 ; 4 Bits ohne Load

DCG.1257loop1:
    LSL  _ACCA
    rcall DCG.ClkPulsePos
    dec _ACCB
    BRNE  DCG.1257loop1

    LDS _ACCA, DCG.LevelByteLo         ; LSB Level zuletzt
    ldi  _ACCB, 8 ; 8 Bits ohne Load

DCG.1257loop2:
    LSL  _ACCA
    rcall DCG.ClkPulsePos
    dec _ACCB
    BRNE  DCG.1257loop2
   endasm;
   
   LevelByteLo:=Lo(DACUtemp);
   LevelByteHi:=Hi(DACUtemp);
   
   asm;
    cbi  DCG.ControlBitPort, DCG.b_SDATA
    cbi  DCG.ControlBitPort, DCG.b_SCLK
    sbi  DCG.ControlBitPort, DCG.b_STRDAC

    LDS  _ACCA, DCG.LevelByteHi ; MSB linksbündig
    LSL  _ACCA
    LSL  _ACCA
    LSL  _ACCA
    LSL  _ACCA ; Bit 3 sitzt jetzt oben
    ldi  _ACCB, 4

DCG.1257loop3:
    LSL  _ACCA
    rcall DCG.ClkPulsePos
    dec _ACCB
    BRNE  DCG.1257loop3

    LDS _ACCA, DCG.LevelByteLo         ; LSB Level zuletzt
    ldi  _ACCB, 7 ; 7 Bits ohne Load

DCG.1257loop4:
    LSL  _ACCA
    rcall DCG.ClkPulsePos
    dec _ACCB
    BRNE  DCG.1257loop4

    LSL  _ACCA ; LSB mit Load
    rcall DCG.ClkPulseLoad1257

    cbi  DCG.ControlBitPort, DCG.b_SDATA
    cbi  DCG.ControlBitPort, DCG.b_SCLK
    sbi  DCG.ControlBitPort, DCG.b_STRDAC
  endasm;
end;

{###########################################################################}

//DCG-Funktionen

procedure SetLevelDAC;
//Pegelsteller und Relais setzen, AktuelleFrequenz einstellen
var
  acc : LongInt;
  mAInt: Integer;
  myfac:float;
begin
//Offset einstellen
  IRange:=DC2mA;
  if DCmA > 2.0 then
    IRange:=DC20mA;
    if DCmA > 20.0 then
      IRange:=DC200mA;
      if DCmA > 200.0 then
        IRange:=DC2A;
      endif;
    endif;
  endif;
  case IRange of
    DC2mA:
      myfac:=2000; // FS = 2mA
      ADCmAfac:=0.002; // FS = 2mA
      b_MPXA0:= high;  //Shunt-Umschalter 220R
      b_MPXA1:= high;
      |
    DC20mA:
      myfac:=200; // FS = 20mA
      ADCmAfac:=0.02; // FS = 20mA
      b_MPXA0:= low;  //Shunt-Umschalter 22R
      b_MPXA1:= high;
      |
    DC200mA:
      myfac:=20; // FS = 200mA
      ADCmAfac:=0.2; // FS = 200mA
      b_MPXA0:= high;  //Shunt-Umschalter 2R2
      b_MPXA1:= low;
      |
    DC2A:
      myfac:=2; // FS = 2A
      ADCmAfac:=2; // FS = 2A
      b_MPXA0:= low;  //Shunt-Umschalter R0.22
      b_MPXA1:= low;
      |
  endcase;
  DACItemp:=integer(DCmA*myfac+0.5)+DACIoffset;
  DACItemp:=DACItemp+DACIoffset;
  if DACItemp>4095 then
    DACItemp:=4095;
  endif;
  URangeHigh:= (DCVolt > 2.0);
  if URangeHigh then
    ADCVoltfac:=0.02;
    DACUtemp:=integer(DCVolt*200.0+0.5)+DACUoffset; // plus LTC1257-Offset, FS =10V
  else
    ADCVoltfac:=0.002;
    DACUtemp:=integer(DCVolt*2000.0+0.5)+DACUoffset; // plus LTC1257-Offset, FS =10V
    b_URange:=low;
  endif;
  if DACUtemp>4095 then
    DACUtemp:=4095;
  endif;
  ShiftOut1257;
  if URangeHigh then
    b_URange:=high;
  endif;
end;

