top of page

Модули ЦАП

DAC7611

unit Dac7611;
{$O-}
{$xdata}
{$idata}
interface

var
          buf7611:integer xdata;
         
procedure Dac7611Out;
procedure Dac7611Dual;

implementation
uses ports,declare;
//===============================================
//Процедура вывода кода в ЦАП двуполярного
//сигнала при наличии в выходном дополнительном
//устройстве смещения 2048 или -2048 мВ
procedure Dac7611Dual;
begin
if buf7611>=0 then
  begin
   buf7611:=buf7611+2048;
   Dac7611Out;
  end
   else
    begin
     buf7611:=2048-abs(buf7611);
     Dac7611Out;
    end;
end;
//===============================================
//Процедура вывода кода в ЦАП
procedure Dac7611Out;
label outdata0,outdata1;

begin
if buf7611>4095 then buf7611:=4095;
ar20:=hi(buf7611);
ar21:=lo(buf7611);
asm
          SETB LINELD
          //MOV AR20,buf7611+1
          //MOV AR21,buf7611
          MOV R2,#4
OUTDATA0:
          MOV A,AR21
          CLR C
          RLC A
          MOV AR21,A
          MOV A,AR20
          RLC A
          MOV AR20,A
          DJNZ R2,OUTDATA0
          MOV R2,#12
OUTDATA1:
          CLR LINEDCLK       // CLK --> 0
          CLR C
          MOV A,AR21
          RLC A
          MOV AR21,A
          MOV A,AR20
          RLC A
          MOV AR20,A
          MOV LINESDI,C       // C --> SDI
          NOP
          NOP
          SETB LINEDCLK       // CLK --> 1
          DJNZ R2,OUTDATA1
          CLR LINELD         // LD --> 0
          NOP
          SETB LINELD         // LD --> 1
end;
end;
//===============================================
end.

DAC714

unit dac714;

{$Idata}
{$O-}
{$xdata}

interface

procedure DAC714C;            //ПОДПРОГРАММА ВЫВОДА КОДА ЦАП ИЗ R0:R1
procedure CLRDAC;             //ПОДПРОГРАММА ОБНУЛЕНИЯ ЦАПА
procedure ClrDacOffs;
procedure CORRCOD;
procedure DAC714V;            //ПОДПРОГРАММА ВЫВОДА В ЦАП С ЗАДАНИЕМ В МВ (BUF714)
procedure DAC714VI;
procedure DAC714KD;
procedure dac714i;
PROCEDURE DAC714MB(AValue:integer);
PROCEDURE DAC714MBI(AValue:integer);

var Buf714:integer;
    Offs714:integer idata;
    DacP:integer idata;
    FDacOut:boolean;
    KDCS:integer idata;

implementation

uses ports,declare;

//================================================
//БЛОК ПОДПРОГРАММ ДЛЯ РАБОТЫ С ЦАП
//================================================
PROCEDURE DAC714MB(AValue:integer);
begin
buf714:=AValue;
FDacOut:=true;
dac714v;
end;
//================================================
PROCEDURE DAC714MBI(AValue:integer);
begin
buf714:=AValue;
FDacOut:=true;
dac714vi;
end;
//================================================
          //ПОДПРОГРАММА ВЫВОДА КОДА ЦАП ИЗ R0:R1
procedure DAC714C;
label dac714c0;
begin
asm
  clr dac714a0
  setb dac714a1
  mov r0,buf714+1
  mov r1,buf714
end;
{for i:=1 to 16 do
  begin}
   asm
          mov r2,#16
dac714c0:
          MOV A,R1
          RLC A
          MOV R1,A
          MOV A,R0

          RLC A
          MOV R0,A
          MOV DAC714OUT,C
          CLR DAC714CLK
          SETB DAC714CLK
          djnz r2,dac714c0
   end;
  //end;
dac714a0:=true;
dac714a1:=false;

dac714clk:=false;
dac714clk:=true;
dac714a1:=true;
end;
//================================================
          //ПОДПРОГРАММА ОБНУЛЕНИЯ ЦАПА

procedure CLRDAC;
begin
buf714:=0;
dac714c;
end;
//================================================
//Процедура обнуление ЦАПа с учетом смещения
procedure ClrDacOffs;
begin
buf714:=0;
buf714:=buf714+offs714;
dac714c;
end;
//================================================
          //ПОДПРОГРАММА КОРРЕКТИРОВКИ КОДА ЦАП
          //В ЗАВИСИМОСТИ ОТ ЕГО НАЧАЛЬНОГО СМЕЩЕНИЯ
procedure CORRCOD;
begin
buf714:=buf714+offs714;
end;

//================================================
          //ПОДПРОГРАММА ВЫВОДА DAC714, ЕСЛИ ВЫХОДНОЕ
          //НАПРЯЖЕНИЕ ВЫРАЖЕНО В ПРЯМОМ КОДЕ,
          //А ОТРИЦАТЕЛЬНОЕ НАПРЯЖЕНИЕ ОТЛИЧАЕТСЯ
          //УСТАНОВЛЕННЫМ СТАРШИМ БИТОМ РЕГИСТРА R6
          //В РЕГИСТРАХ R6:R7 ЗНАЧЕНИЯ ВЫХОДНОГО
          //НАПРЯЖЕНИЯ В МВ.

procedure DAC714V;
begin
//corrcod;
valr:=buf714;
if buf714<0 then
  valr:=valr*3.2768
   else
    valr:=valr*3.2767;
buf714:=trunc(valr);
buf714:=buf714+offs714;
dacp:=buf714;
if fdacout then dac714C;
end;
//================================================
//Процедура вывода в ЦАП милливольт с использованием
//целых чисел
procedure DAC714VI;
begin
//corrcod;
vall:=buf714;
vall:=vall*3354;
vall:=vall shr 10;
if buf714<0 then vall:=vall or $FFC00000;
  {begin
   vall:=vall*33554;
   vall:=vall shr 10;
   vall:=vall or $FFC00000;
  end
   else
    begin
     vall:=vall*33553;
     vall:=vall shr 10;
    end;}
buf714:=vall;
buf714:=buf714+offs714;
dacp:=buf714;
if fdacout then dac714C;
end;
//================================================
          //ПОДПРОГРАММА ВЫВОДА ЦАПА С УЧЕТОМ
          //КОЭФФИЦИЕНТА ПЕРЕДАЧИ ИСТОЧНИКА ТОКА,
          //то есть в буфер цапа помещается значение
          //тока в мА, и на выходе цапа появляется
          //напряжение, соответствующее тому, которое
          //обеспечивает значение необходимого выходного
          //тока источника тока.
procedure DAC714KD;
begin
buf714:=buf714*kdcs;
dac714v;
end;
//================================================
          //ПОДПРОГРАММА ВЫВОДА DAC714, ЕСЛИ ВЫХОДНОЕ
          //НАПРЯЖЕНИЕ ВЫРАЖЕНО В ДОПОЛНИТЕЛЬНОМ КОДЕ.
          //В РЕГИСТРАХ R6:R7 ЗНАЧЕНИЯ ВЫХОДНОГО
          //НАПРЯЖЕНИЯ В МВ.
procedure dac714i;
label DAC714I0;
begin
asm
          MOV A,R6
          JNB ACC.7,DAC714I0
          MOV A,R6
          CPL A
          MOV R6,A
          MOV A,R7
          CPL A
          MOV R7,A
          CLR C
          MOV A,R7
          ADDC A,#1
          MOV R7,A
          MOV A,R6
          ADDC A,#0
          SETB ACC.7
          MOV R6,A
DAC714I0: LCALL DAC714V
end;
end;         
//================================================
//КОНЕЦ БЛОКА ПОДПРОГРАММ ДЛЯ РАБОТЫ С ЦАП
//================================================

 

end.

DAC7612

unit Dac7612;
{$Idata}
{$xdata}
{$O-}
interface
procedure Dac7612OutA(data:word);
procedure Dac7612OutB(data:word);
procedure Dac7612OutC(channelA:boolean;data:word);
procedure Dac7612OutDualA(data,ref:integer);
procedure Dac7612OutDualB(data,ref:integer);
procedure Dac7612OutDual(ChannelA:boolean;data:integer);

implementation
uses declare,ports;
var vw:word;
    vi:integer;
//   sdi7612, ld7612, cs7612, clk7612
//Передается 14 бит.
//Два первых бита включают адреса каналов.
//Старший бит (А1) должен быть равен 1,
//для установки канала А следующий бит 0,
//для установки канала В следующий бит 1.
//Информация передается старшим вперед.
//-----------------------------------------------
procedure Dac7612Out;assembler;
//процедура передачи упакованной посылки
//упаковка содержится в регистрах R6:R7
label dac7612outa0;
asm
               setb ld7612
               setb clk7612
               //clr cs7612
               mov r2,#14
dac7612outa0:  clr clk7612
               mov a,r7
               rlc a
               mov r7,a
               mov a,r6
               rlc a
               mov sdi7612,c
               mov r6,a
               setb clk7612
               djnz r2,dac7612outa0
               //setb cs7612
               clr ld7612
               nop
               setb ld7612
end;
//-----------------------------------------------
procedure Dac7612OutC(channelA:boolean;data:word);
//процедура установки каналов
begin
vw:=data shl 2;
if channela then
  ar6:=hi(vw) or %10000000
   else
    ar6:=hi(vw) or %11000000;
ar7:=lo(vw);
Dac7612Out;
end;
//-----------------------------------------------
procedure Dac7612OutA(data:word);
//процедура установки канала А
begin
vw:=data shl 2;
ar6:=hi(vw) or %10000000;
ar7:=lo(vw);
Dac7612Out;
end;
//-----------------------------------------------
procedure Dac7612OutB(data:word);
//процедура установки канала В
begin
vw:=data shl 2;
ar6:=hi(vw) or %11000000;
ar7:=lo(vw);
Dac7612Out;
end;
//-----------------------------------------------
procedure Dac7612OutDualA(data,ref:integer);
//процедура установки канала А с двуполярным выходом
begin
vi:=data+ref;
if vi<0 then vi:=0;
vw:=vi;
vw:=vw shl 2;
ar6:=hi(vw) or %10000000;
ar7:=lo(vw);
Dac7612Out;
end;
//-----------------------------------------------
procedure Dac7612OutDualB(data,ref:integer);
//процедура установки канала В с двуполярным выходом
begin
vi:=data+ref;
if vi<0 then vi:=0;
vw:=vi;
vw:=vw shl 2;
ar6:=hi(vw) or %11000000;
ar7:=lo(vw);
Dac7612Out;
end;
//-----------------------------------------------
procedure Dac7612OutDual(ChannelA:boolean;data:integer);
//процедура установки канала А с двуполярным выходом
begin
if channela then valb:=2 else valb:=50;
vi:=data;
vi:=((vi*valb)+1250) shl 2;
if vi<0 then vi:=0;
vw:=vi;
if ChannelA then
  ar6:=hi(vw) or %10000000
   else
    ar6:=hi(vw) or %11000000;
ar7:=lo(vw);
Dac7612Out;
end;
//===============================================
end.

MAX522

//Модуль работы с 8-разрядным двухканальным
//ЦАПом МАХ522.
unit max522;
{$O-}
interface
var data522:byte;
    //clk522:boolean absolute $80;
    //cs522 :boolean absolute $80;
    //di522 :boolean absolute $80;
procedure out522(ChanA,ChanB,cont:boolean);
procedure init522;

implementation
uses ports,declare;
//===============================================
//Процедура записи кода в МАХ522.
//Входные переменные процедуры задают
//активность каналов А и В.
procedure out522(ChanA,ChanB,cont:boolean);
label OUT5221,OUT5222,out5223;
begin
if not cont then
  begin
   acc:=%00100000;
   //if chana then acc:=acc or 1;
   //if chanb then acc:=acc or 2;
   acc.0:=chana;
   acc.1:=chanb;
   asm
          CLR CS522
          MOV R2,#8
          //MOV A,#00100011B
OUT5221:  CLR CLK522
          RLC A
          MOV DI522,C
          SETB CLK522
          DJNZ R2,OUT5221
   end;
  end;
asm
          MOV R2,#8
          MOV A,data522
OUT5222:  CLR CLK522
          RLC A
          MOV DI522,C
          SETB CLK522
          DJNZ R2,OUT5222
          jb cont,out5223
          CLR CLK522
          SETB CS522
out5223:
end;
end;
//===============================================
procedure init522;
label l0;
begin
asm
          CLR CS522
          MOV R2,#8
          MOV A,#00100011B
l0:       CLR CLK522
          RLC A
          MOV DI522,C
          SETB CLK522
          DJNZ R2,l0
end;        
end;
//===============================================
end.

bottom of page