📄 dac.s
字号:
.module DAC.c
.area text
.dbfile DAC.c
.dbfunc e DA_SPIInit _DA_SPIInit fV
_DA_SPIInit::
.dbline -1
.dbline 19
; /*-------------------------------------------------------*
; *(1)TLV5608Init:TLV5608初始化
; *(2)TLV5608Z:1路DA转换子程序 *
; *(3)DAC:2片TLV5608转换 *
; *-------------------------------------------------------*/
; //[包含头文件]
; #include "Includes.h"
; //[包含外部函数]
; void Delay(void);
; /*SPIInit:SPI初始化子程序-------------------------------*
; *功 能:对SPI进行初始化,默认为允许SPI,主机工作方式,时钟 *
; * 空闲低电平,比特率2分频, *
; * 波特率为CGMOUT/2*BD(设CGMOUT=2*fBUS=2*2.4576MHz)*
; *参 数:无 *
; *返 回:无 *
; *------------------------------------------------------*/
; #include "Includes.h"
; void DA_SPIInit(void)
; {
.dbline 20
; SPCR=0b00100010; //不产生中断、主机方式、时钟空闲低电平
lda #34
sta 0x10
.dbline 21
; SPSCR=0b00000000; //2分频
clr 0x11
.dbline -2
L1:
.dbline 0 ; func end
rts
.dbend
.dbfunc e DAC _DAC fV
; i -> 0,X
; value -> 3,X
_DAC::
.dbline -1
ais #-1
tsx
.dbline 29
; }
; /*D/A转换子程序(DAC.c)-----------------------------------*
; *功能:将TLV5608(0)-(1)片,共16通道的数字量转换为模拟量 *
; *入口:value--2片5608、16路通道的数字量值 *
; *调用:TLV5608Z *
; *-------------------------------------------------------*/
; void DAC(INT16U *value)
; {
.dbline 32
; INT8U i;
; //TLV5608初始化
; TLV5608Init();
jsr _TLV5608Init
tsx
.dbline 33
; for(i=1;i<=16;i++)
lda #1
sta ,X
bra L6
L3:
.dbline 34
clr *__r0
lda ,X
sta *__r1
lsl *__r1
rol *__r0
lda *__r1
add 4,X
sta *__r1
lda *__r0
adc 3,X
sta *__r0
ldhx *__r0
aix #-2
lda 1,x
sta *__r1
lda ,x
tsx
sta *__r0
lda *__r1
psha
lda *__r0
psha
clr *__r0
lda ,X
psha
lda *__r0
psha
jsr _TLV5608Z
ais #4
tsx
L4:
.dbline 33
inc ,X
L6:
.dbline 33
lda ,X
cmp #16
bls L3
.dbline -2
L2:
ais #1
.dbline 0 ; func end
rts
.dbsym l i 0 c
.dbsym l value 3 ps
.dbend
.dbfunc e TLV5608Init _TLV5608Init fV
; fs -> 0,X
_TLV5608Init::
.dbline -1
ais #-1
tsx
.dbline 42
; TLV5608Z(i,*(value+i-1));
; }
; /*TLV5608芯片D/A转换初始化子程序(TLV5608Init.c)-----------------*
; *功 能:初始化2片TLV5608的CTRL0、CTRL1寄存器 *
; *参 数:无 *
; *返 回:无 *
; *--------------------------------------------------------------*/
; void TLV5608Init(void)
; {
.dbline 44
; INT8U fs;
; for(fs=0;fs<=1;fs++)
clr ,X
jmp L11
L8:
.dbline 45
; {
.dbline 46
; CS_D |=0b00001100; //定义PTC2~3为输出
lda 0x6
ora #12
sta 0x6
.dbline 47
; CS_P |=0b00001100; //PTC2~3输出为高电平
lda 0x2
ora #12
sta 0x2
.dbline 49
; //设置CTRL0寄存器
; CS_P &= ~(1<<(fs+2)); //相应片TLV.FS由高电平变为低电平,产生下降沿
lda ,X
add #2
mov #1,*__r2
and #7
beq X1
X0:
lsl *__r2
dbnza X0
X1:
mov *__r2,*__r0
com *__r0
lda 0x2
and *__r0
sta 0x2
.dbline 51
; //此后在每个SCLK的下降沿传送一位数据,共传输16位数据
; Delay(); //延时20个时钟周期
jsr _Delay
tsx
.dbline 52
; SPIDR=0b10000000; //发送高8位数据(CTRL0地址为1000)
lda #-128
sta 0x12
L12:
.dbline 53
L13:
.dbline 53
; while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
brclr #3,0x11,L12
.dbline 55
; //发送完毕
; SPIDR=0b00000000; //发送低8位数据
clr 0x12
L15:
.dbline 56
L16:
.dbline 56
; while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
brclr #3,0x11,L15
.dbline 58
; //发送完毕
; asm("nop");
nop
.dbline 59
; asm("nop");
nop
.dbline 60
; CS_P |= (1<<(fs+2)); //数据传输完毕,相应片TLV.FS由低电平变为高电平
lda ,X
add #2
mov #1,*__r2
and #7
beq X3
X2:
lsl *__r2
dbnza X2
X3:
lda 0x2
ora *__r2
sta 0x2
.dbline 64
;
;
; //设置CTRL1寄存器
; CS_P &= ~(1<<(fs+2)); //相应片TLV.FS由高电平变为低电平,产生下降沿
lda ,X
add #2
mov #1,*__r2
and #7
beq X5
X4:
lsl *__r2
dbnza X4
X5:
mov *__r2,*__r0
com *__r0
lda 0x2
and *__r0
sta 0x2
.dbline 66
; //此后在每个SCLK的下降沿传送一位数据
; Delay(); //延时20个时钟周期
jsr _Delay
tsx
.dbline 67
; SPIDR=0b10010000; //发送高8位数据(CTRL1地址为1001)
lda #-112
sta 0x12
L18:
.dbline 68
L19:
.dbline 68
; while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
brclr #3,0x11,L18
.dbline 70
; //发送完毕
; SPIDR=0b00001111; //发送低8位数据(正常电压,快速)
lda #15
sta 0x12
L21:
.dbline 71
L22:
.dbline 71
brclr #3,0x11,L21
.dbline 73
lda ,X
add #2
mov #1,*__r2
and #7
beq X7
X6:
lsl *__r2
dbnza X6
X7:
lda 0x2
ora *__r2
sta 0x2
.dbline 74
L9:
.dbline 44
inc ,X
L11:
.dbline 44
lda ,X
cmp #1
bhi X8
jmp L8
X8:
.dbline -2
L7:
ais #1
.dbline 0 ; func end
rts
.dbsym l fs 0 c
.dbend
.dbfunc e TLV5608Z _TLV5608Z fV
; value -> 0,X
; fs -> 2,X
; buf -> 7,X
; channel -> 5,X
_TLV5608Z::
.dbline -1
ais #-3
tsx
.dbline 86
; while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
; //发送完毕
; CS_P |= (1<<(fs+2)); //数据传输完毕,相应片TLV.FS由低电平变为高电平
; }
; }
; /*TLV5608芯片D/A转换子程序(TLV5608Z.c)--------------------------*
; *TLV5608的接线: *
; * ① SCLK(3)接MC08HC908GP32的SPSCK(18) *
; * ② DIN(2)接MC08HC908GP32的MISO(17) *
; * ③ LDAC(18)接MC08HC908GP32的PTC4 *
; * ④ 0-1片FS(4作为片选信号)接分别接的PTC2~3 *
; * MODE接高电平,选择uC模式 *
; *入口:channel-通道号(1-16),buf-存放数据 *
; *--------------------------------------------------------------*/
; void TLV5608Z(INT16U channel, INT16U buf)
; {
.dbline 89
; INT8U fs;//片选号
; INT16U value;
; channel=1;
clra
sta 5,X
lda #1
sta 6,X
.dbline 90
; if((channel>0)&&(channel<9))
lda 5,X
bne X9
lda 6,X
beq L25
X9:
lda 6,X
sta *__r1
lda 5,X
sta *__r0
ldhx *__r0
cphx #9
tsx
bhs L25
.dbline 91
; fs=0;
clr 2,X
bra L26
L25:
.dbline 93
; else
; fs=1;
lda #1
sta 2,X
L26:
.dbline 95
; //整合要发送的16位数据-(value的高4位为通道号,后12位为数据位)
; value=((channel-fs*8-1)<<12)|buf;
clr *__r0
lda 2,X
sta *__r1
lsl *__r1
rol *__r0
lsl *__r1
rol *__r0
lsl *__r1
rol *__r0
lda 6,X
sub *__r1
sta *__r1
lda 5,X
sbc *__r0
sta *__r0
lda *__r1
sub #1
sta *__r1
lda *__r0
sbc #0
sta *__r0
lda #12
X10:
lsl *__r1
rol *__r0
dbnza X10
lda *__r1
ora 8,X
sta 1,X
lda *__r0
ora 7,X
sta ,X
.dbline 97
; //发送16位数据
; CS_D |=0b00001100; //定义PTC2~3为输出
lda 0x6
ora #12
sta 0x6
.dbline 98
; CS_P |=0b00001100; //PTC2~3输出为高电平
lda 0x2
ora #12
sta 0x2
.dbline 101
;
; //TLV5608.FS=1
; CS_P &= ~(1<<(fs+2)); //相应片TLV.FS由高电平变为低电平,产生下降沿
lda 2,X
add #2
mov #1,*__r2
and #7
beq X12
X11:
lsl *__r2
dbnza X11
X12:
mov *__r2,*__r0
com *__r0
lda 0x2
and *__r0
sta 0x2
.dbline 103
; //此后在每个SCLK的下降沿传送一位数据
; Delay(); //延时20个时钟周期
jsr _Delay
tsx
.dbline 104
; SPIDR=value>>8; //发送高8位数据
lda ,X
sta 0x12
L27:
.dbline 105
L28:
.dbline 105
; while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
brclr #3,0x11,L27
.dbline 107
; //发送完毕
; SPIDR=value; //发送低8位数据
lda 1,X
sta 0x12
L30:
.dbline 108
L31:
.dbline 108
; while((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
brclr #3,0x11,L30
.dbline 110
; //发送完毕
; asm("nop");
nop
.dbline 111
; CS_P |= (1<<(fs+2)); //数据传输完毕,相应片TLV.FS由低电平变为高电平
lda 2,X
add #2
mov #1,*__r2
and #7
beq X14
X13:
lsl *__r2
dbnza X13
X14:
lda 0x2
ora *__r2
sta 0x2
.dbline -2
L24:
ais #3
.dbline 0 ; func end
rts
.dbsym l value 0 s
.dbsym l fs 2 c
.dbsym l buf 7 s
.dbsym l channel 5 s
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -