Turbo51
Модули ЦАП
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.