📄 adc22p.s
字号:
.module ADC22P.c
.area text
.dbfile ADC22P.c
.dbfunc e AD_SPIInit _AD_SPIInit fV
_AD_SPIInit::
.dbline -1
.dbline 16
; /*-----------------------------------------------------*
; *文件描述:本文件包含了AD采集的2子程序,分别为: *
; *(1)ADC22P:2片2543-22路AD采集 *
; *(2)TLC2543:TLC2543芯片A/D转换子程序 *
; *-------------《嵌入式应用技术基础教程》--------------*/
; #include "Includes.h"
; /*SPIInit:SPI初始化子程序-------------------------------*
; *功 能:对SPI进行初始化,默认为允许SPI,主机工作方式,时钟 *
; * 空闲低电平,比特率8分频, *
; * 波特率为CGMOUT/2*BD(设CGMOUT=2*fBUS=2*2.4576MHz)*
; *参 数:无 *
; *返 回:无 *
; *------------------------------------------------------*/
; #include "Includes.h"
; void AD_SPIInit(void)
; {
.dbline 17
; SPCR=0b00100010; //不产生中断、主机方式、时钟空闲低电平
lda #34
sta 0x10
.dbline 18
; SPSCR=0b00000001; //8分频
lda #1
sta 0x11
.dbline -2
L1:
.dbline 0 ; func end
rts
.dbend
.dbfunc e ADC22P _ADC22P fV
; j -> 0,X
; temp -> 1,X
; channel -> 3,X
; cs -> 4,X
; buff -> 5,X
; flag -> 7,X
; i -> 8,X
; ADValue -> 11,X
_ADC22P::
.dbline -1
ais #-9
tsx
.dbline 28
; }
; //------------------------------------------------------------------*
; /*A/D转换并求平均值(22路)子程序(AD22P.ASM)-----------------------*
; *功能:采集TLC2543(0)-(1)片,共22通道,取16次平均值放入内存ADValue *
; *入口:无 *
; *出口:ADValue--22路通道的16次平均采样值 *
; *调用:TLC2543Z *
; *-----------------------------------------------------------------*/
; void ADC22P(INT16U *ADValue)
; {
.dbline 33
; INT8U i,j,flag,buff[2];
; INT8U cs,channel;
; INT16U temp;
; //A/D数据区清0
; for(flag=0;flag<=21;flag++)
clr 7,X
bra L6
L3:
.dbline 34
clr *__r0
lda 7,X
sta *__r1
lsl *__r1
rol *__r0
lda *__r1
add 12,X
sta *__r1
lda *__r0
adc 11,X
sta *__r0
clra
ldhx *__r0
sta ,x
clra
sta 1,x
tsx
L4:
.dbline 33
inc 7,X
L6:
.dbline 33
lda 7,X
cmp #21
bls L3
.dbline 37
; ADValue[flag]=0;
; //启动第0片TLC2543的0通道转换,得到"空数据"--不要
; //对22个通道采集数据,每一路采集16次,16次的数据总和-->ADValue
; for(j=0;j<16;j++)
clr ,X
jmp L10
L7:
.dbline 38
; {
.dbline 39
; flag=0;
clr 7,X
.dbline 40
; for(i=0;i<22;i++)
clr 8,X
jmp L14
L11:
.dbline 41
.dbline 42
lda 8,X
ldx #11
clrh
div
tsx
sta 4,X
.dbline 43
lda 8,X
ldx #11
clrh
div
pshh
pula
tsx
sta 3,X
.dbline 44
aix #5
pshx
pshh
tsx
aix #2
clr *__r0
lda 3,X
psha
lda *__r0
psha
clr *__r0
lda 4,X
psha
lda *__r0
psha
jsr _TLC2543
ais #6
tsx
.dbline 45
aix #5
pshx
pshh
tsx
aix #2
clr *__r0
lda 3,X
psha
lda *__r0
psha
clr *__r0
lda 4,X
psha
lda *__r0
psha
jsr _TLC2543
ais #6
tsx
.dbline 47
lda 5,X
sta 1,X
lda 6,X
sta 2,X
.dbline 48
clr *__r0
lda 7,X
sta *__r1
lsl *__r1
rol *__r0
lda *__r1
add 12,X
sta *__r1
lda *__r0
adc 11,X
sta *__r0
ldhx *__r0
lda 1,x
sta *__r3
lda ,x
tsx
sta *__r2
lda *__r3
add 2,X
sta *__r3
lda *__r2
adc 1,X
ldhx *__r0
sta ,x
lda *__r3
sta 1,x
tsx
.dbline 49
inc 7,X
.dbline 50
L12:
.dbline 40
inc 8,X
L14:
.dbline 40
lda 8,X
cmp #22
bhs X1
jmp L11
X1:
.dbline 51
L8:
.dbline 37
inc ,X
L10:
.dbline 37
lda ,X
cmp #16
bhs X2
jmp L7
X2:
.dbline 53
; {
; cs=i/11;
; channel=i%11;
; TLC2543(cs,channel,buff);
; TLC2543(cs,channel,buff);
; //从内存buff取出数据-->ADValue[flag]中
; temp=*((unsigned int *)buff);
; ADValue[flag]=ADValue[flag]+temp;
; flag++;
; }
; }
; //求22路A/D数据的16次平均值
; for(flag=0;flag<=21;flag++)
clr 7,X
bra L18
L15:
.dbline 54
clr *__r0
lda 7,X
sta *__r1
lsl *__r1
rol *__r0
lda *__r1
add 12,X
sta *__r1
lda *__r0
adc 11,X
sta *__r0
ldhx *__r0
lda 1,x
sta *__r3
lda ,x
sta *__r2
lda #4
X0:
lsr *__r2
ror *__r3
dbnza X0
lda *__r2
ldhx *__r0
sta ,x
lda *__r3
sta 1,x
tsx
L16:
.dbline 53
inc 7,X
L18:
.dbline 53
lda 7,X
cmp #21
bls L15
.dbline -2
L2:
ais #9
.dbline 0 ; func end
rts
.dbsym l j 0 c
.dbsym l temp 1 s
.dbsym l channel 3 c
.dbsym l cs 4 c
.dbsym l buff 5 A[2:2]c
.dbsym l flag 7 c
.dbsym l i 8 c
.dbsym l ADValue 11 ps
.dbend
.dbfunc e TLC2543 _TLC2543 fV
; temp -> 0,X
; buf -> 7,X
; channel -> 5,X
; cs -> 3,X
_TLC2543::
.dbline -1
ais #-1
tsx
.dbline 66
; ADValue[flag]=ADValue[flag]/16;
; }
; /*TLC2543芯片A/D转换子程序(TLC2543.c)--------------------------*
; *TLC2543的接线: *
; * ① I/O LOCK(18)接MC08HC908GP32的SPSCK(18) *
; * ② DATA INPUT(17)接MC08HC908GP32的MOSI(17) *
; * ③ DATA OUT (16)接MC08HC908GP32的MISO(16) *
; * ④ 0-1片的片选CS(15)接分别接MC08HC908GP32的PTC0~1 *
; *入口:cs-片号,channel-通道号0,1,2 ...10 buf-存放数据的首址 *
; *出口:内存buf开始连续两个地址为取出的数(高4位、低8位) *
; *--------------------------------------------------------------*/
; void TLC2543(INT16U cs,INT16U channel,INT8U *buf)
; {
.dbline 68
; INT8U temp;
; CS_D=0xff; //定义PTC为输出
lda #-1
sta 0x6
.dbline 69
; CS_P = 0xff; //C口全为高电平
lda #-1
sta 0x2
.dbline 71
; //TLC2543片选CS=1
; CS_P &= ~(1<<cs); //相应片TLC2543的选CS=0,产生高到低的变化
mov #0,*__r0
mov #1,*__r1
lda 4,X
and #15
beq X4
X3:
lsl *__r1
rol *__r0
dbnza X3
X4:
com *__r1
com *__r0
clr *__r2
lda 0x2
and *__r1
sta *__r1
lda *__r2
and *__r0
mov *__r1,0x2
.dbline 73
;
; SPIDR = (channel<<4) | 0x0C;//入口通道、16位格式、MSB先送出、二进制
lda 6,X
sta *__r1
lda 5,X
sta *__r0
lda #4
X5:
lsl *__r1
rol *__r0
dbnza X5
lda *__r1
ora #12
sta 0x12
L20:
.dbline 74
L21:
.dbline 74
; while ((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
brclr #3,0x11,L20
L23:
.dbline 76
L24:
.dbline 76
; //发送完毕
; while ((SPISCR & (1<<ReFullBit)) == 0); //为0等待,也就是等待SPRF为1
brclr #7,0x11,L23
.dbline 78
; //发送控制字,取出上次转换结果高字节
; *buf = SPIDR; //*buf中存放的是D11~D4位
lda 8,X
sta *__r1
lda 7,X
sta *__r0
lda 0x12
ldhx *__r0
sta ,x
tsx
.dbline 79
; SPIDR = *buf; //上次转换结果低字节(后四位为0),握手信号
lda 7,X
ldx 8,X
psha
pulh
lda ,x
tsx
sta 0x12
L26:
.dbline 80
L27:
.dbline 80
; while ((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
brclr #3,0x11,L26
L29:
.dbline 82
L30:
.dbline 82
; //发送完毕
; while ((SPISCR & (1<<ReFullBit)) == 0); //为0等待,也就是等待SPRF为1
brclr #7,0x11,L29
.dbline 84
; //接收到数据
; *(buf+1) = SPIDR;// *(buf+1)中存放D3~D0位
lda 8,X
add #1
sta *__r1
lda 7,X
adc #0
sta *__r0
lda 0x12
ldhx *__r0
sta ,x
tsx
.dbline 85
; CS_P= 0xff; //TLC2543片选CS=1
lda #-1
sta 0x2
.dbline 87
; //整合后*buf存放高四位(D11~D8),*(buf+1)中存放低八位(D7~D0)
; *(buf+1) = (*(buf+1)>>4) | (*buf<<4);
lda 8,X
add #1
sta *__r1
lda 7,X
adc #0
sta *__r0
lda 7,X
ldx 8,X
psha
pulh
lda ,x
nsa
and #-16
sta *__r2
ldhx *__r0
lda ,x
sta *__r4
lda #4
X6:
lsr *__r4
dbnza X6
lda *__r4
ora *__r2
ldhx *__r0
sta ,x
tsx
.dbline 88
; *buf = *buf>>4;
lda 7,X
ldx 8,X
psha
pulh
lda ,x
tsx
sta *__r0
lda #4
X7:
lsr *__r0
dbnza X7
mov *__r0,*__r1
lda 8,X
sta *__r3
lda 7,X
sta *__r2
lda *__r1
ldhx *__r2
sta ,x
tsx
.dbline -2
L19:
ais #1
.dbline 0 ; func end
rts
.dbsym l temp 0 c
.dbsym l buf 7 pc
.dbsym l channel 5 s
.dbsym l cs 3 s
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -