📄 adc11p.s
字号:
.module ADC11P.c
.area text
.dbfile ADC11P.c
.dbfunc e ADC11P _ADC11P fV
; j -> 0,X
; temp -> 1,X
; ADVal -> 3,X
; flag -> 25,X
; tmp -> 26,X
; channel -> 32,X
; buff -> 33,X
; i -> 35,X
; ADValue -> 39,X
; cs -> 38,X
_ADC11P::
.dbline -1
ais #-36
tsx
.dbline 18
; //-------------------------------------------------------------------------*
; //文件描述:本文件包含了AD采集的2子程序,分别为: *
; //(1)ADC11P:1片2543-11路AD采集 *
; //(2)TLC2543:TLC2543芯片A/D转换子程序 *
; //-------------------------------------------------------------------------*
; #include "ADC11P.h"
;
; //A/D转换并求平均值(11路)子程序(AD22P.ASM)---------------------------------*
; //功 能:采集TLC2543,共11通道,取16次平均值放入内存ADValue *
; //参 数:cs:片选,cs=0~7对应PTC0~7 *
; // ADValue:存放11路AD转换结果的数组首地址 *
; //返 回:内存ADValue开始连续的11个地址内即为转换的结果 *
; //调 用:TLC2543 *
; //修 改:*ADValue是传址,一般在子程序中不直接修改参数,应另声明一个局部 *
; // 变量地址,代其执行,最后将结果赋到参数地址带回 (ZY 2007.05.11) *
; //-------------------------------------------------------------------------*
; void ADC11P(INT8U cs,INT16U *ADValue)
; {
.dbline 24
; INT8U i,j,channel,flag,buff[2];
; INT16U temp,tmp[3];
; INT16U ADVal[11];
;
; //1 将A/D数据存放区清0
; for(flag=0;flag<=10;flag++)
clr 25,X
bra L5
L2:
.dbline 25
aix #3
sthx *__r0
tsx
clr *__r2
lda 25,X
sta *__r3
lsl *__r3
rol *__r2
lda *__r3
add *__r1
sta *__r1
lda *__r2
adc *__r0
sta *__r0
clra
ldhx *__r0
sta ,x
clra
sta 1,x
tsx
L3:
.dbline 24
inc 25,X
L5:
.dbline 24
lda 25,X
cmp #10
bls L2
.dbline 29
; ADVal[flag]=0;
;
;
; //3 对11个通道采集数据,每一路采集16次,16次的数据总和-->ADValue
; for(j=1;j<=16;j++)
lda #1
sta ,X
jmp L9
L6:
.dbline 30
; {
.dbline 31
; flag=0;
clr 25,X
.dbline 33
; //3.1第0片TLC2543的0~10通道转换
; for(channel=0;channel<=10;channel++)
clr 32,X
jmp L13
L10:
.dbline 34
; {
.dbline 36
; //3.1.1将通道j的AD转换结果存入内存buff
; for(i=0;i<3;i++) //中值滤波
clr 35,X
bra L17
L14:
.dbline 37
.dbline 38
aix #33
pshx
pshh
tsx
aix #2
clr *__r0
lda 32,X
psha
lda *__r0
psha
clr *__r0
lda 38,X
psha
lda *__r0
psha
jsr _TLC2543
ais #6
tsx
.dbline 39
aix #33
pshx
pshh
tsx
aix #2
clr *__r0
lda 32,X
psha
lda *__r0
psha
clr *__r0
lda 38,X
psha
lda *__r0
psha
jsr _TLC2543
ais #6
tsx
.dbline 41
aix #26
sthx *__r0
tsx
clr *__r2
lda 35,X
sta *__r3
lsl *__r3
rol *__r2
lda *__r3
add *__r1
sta *__r1
lda *__r2
adc *__r0
sta *__r0
lda 33,X
ldhx *__r0
sta ,x
lda 35,SP
sta 1,x
tsx
.dbline 42
L15:
.dbline 36
inc 35,X
L17:
.dbline 36
lda 35,X
cmp #3
blo L14
.dbline 43
aix #26
pshx
pshh
jsr _MidVal
ais #2
tsx
lda *__r0
sta 1,X
lda *__r1
sta 2,X
.dbline 44
aix #3
sthx *__r0
tsx
clr *__r2
lda 25,X
sta *__r3
lsl *__r3
rol *__r2
lda *__r3
add *__r1
sta *__r1
lda *__r2
adc *__r0
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 45
inc 25,X
.dbline 46
L11:
.dbline 33
inc 32,X
L13:
.dbline 33
lda 32,X
cmp #10
bhi X1
jmp L10
X1:
.dbline 47
L7:
.dbline 29
inc ,X
L9:
.dbline 29
lda ,X
cmp #16
bhi X2
jmp L6
X2:
.dbline 50
; {
; TLC2543(cs,channel,buff); //得到"空数据"--不要
; TLC2543(cs,channel,buff);
; //3.1.2从内存buff取出数据-->ADValue[flag]中
; tmp[i]=*((unsigned int *)buff);
; }
; temp=MidVal(tmp);
; ADVal[flag]=ADVal[flag]+temp;
; flag++;
; }
; }
;
; //4 求22路A/D数据的16次平均值
; for(flag=0;flag<=10;flag++)
clr 25,X
bra L21
L18:
.dbline 51
aix #3
sthx *__r0
tsx
clr *__r2
lda 25,X
sta *__r3
lsl *__r3
rol *__r2
lda *__r3
add *__r1
sta *__r1
lda *__r2
adc *__r0
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
L19:
.dbline 50
inc 25,X
L21:
.dbline 50
lda 25,X
cmp #10
bls L18
.dbline 52
; ADVal[flag]=ADVal[flag]/16;
; for(i=0;i<11;i++)
clr 35,X
bra L25
L22:
.dbline 53
clr *__r0
lda 35,X
sta *__r1
lsl *__r1
rol *__r0
aix #3
sthx *__r2
lda *__r1
add *__r3
sta *__r3
lda *__r0
adc *__r2
sta *__r2
ldhx *__r2
lda 1,x
sta *__r3
lda ,x
tsx
sta *__r2
lda *__r1
add 40,X
sta *__r1
lda *__r0
adc 39,X
sta *__r0
lda *__r2
ldhx *__r0
sta ,x
lda *__r3
sta 1,x
tsx
L23:
.dbline 52
inc 35,X
L25:
.dbline 52
lda 35,X
cmp #11
blo L22
.dbline -2
L1:
ais #36
.dbline 0 ; func end
rts
.dbsym l j 0 c
.dbsym l temp 1 i
.dbsym l ADVal 3 A[22:11]i
.dbsym l flag 25 c
.dbsym l tmp 26 A[6:3]i
.dbsym l channel 32 c
.dbsym l buff 33 A[2:2]c
.dbsym l i 35 c
.dbsym l ADValue 39 pi
.dbsym l cs 38 c
.dbend
.dbfunc e MidVal _MidVal fi
; tmp -> 0,X
; i -> 2,X
; j -> 3,X
; x -> 6,X
_MidVal::
.dbline -1
ais #-4
tsx
.dbline 58
; ADValue[i] =ADVal[i];
; }
;
; //
; INT16U MidVal(INT16U *x)
; {
.dbline 62
; INT8U i,j;
; INT16U tmp;
; //冒泡法
; for(i = 0; i < 3; i ++)
clr 2,X
jmp L30
L27:
.dbline 63
; for(j = i; j < 3; j ++)
lda 2,X
sta 3,X
jmp L34
L31:
.dbline 64
; if( x[i] > x[j] )
clr *__r0
lda 3,X
sta *__r1
lsl *__r1
rol *__r0
lda *__r1
add 7,X
sta *__r1
lda *__r0
adc 6,X
sta *__r0
ldhx *__r0
lda 1,x
sta *__r1
lda ,x
tsx
sta *__r0
clr *__r2
lda 2,X
sta *__r3
lsl *__r3
rol *__r2
lda *__r3
add 7,X
sta *__r3
lda *__r2
adc 6,X
sta *__r2
ldhx *__r2
lda 1,x
sta *__r3
lda ,x
sta *__r2
ldhx *__r2
cphx *__r0
tsx
bhi X3
jmp L35
X3:
.dbline 65
; {
.dbline 66
; tmp=x[i];
clr *__r0
lda 2,X
sta *__r1
lsl *__r1
rol *__r0
lda *__r1
add 7,X
sta *__r1
lda *__r0
adc 6,X
sta *__r0
ldhx *__r0
lda 1,x
sta 2,SP
lda ,x
tsx
sta ,X
.dbline 67
; x[i]=x[j];
clr *__r0
lda 3,X
sta *__r1
lsl *__r1
rol *__r0
lda *__r1
add 7,X
sta *__r1
lda *__r0
adc 6,X
sta *__r0
ldhx *__r0
lda 1,x
sta *__r1
lda ,x
tsx
sta *__r0
clr *__r2
lda 2,X
sta *__r3
lsl *__r3
rol *__r2
lda *__r3
add 7,X
sta *__r3
lda *__r2
adc 6,X
sta *__r2
lda *__r0
ldhx *__r2
sta ,x
lda *__r1
sta 1,x
tsx
.dbline 68
; x[j]=tmp;
clr *__r0
lda 3,X
sta *__r1
lsl *__r1
rol *__r0
lda *__r1
add 7,X
sta *__r1
lda *__r0
adc 6,X
sta *__r0
lda ,X
ldhx *__r0
sta ,x
lda 2,SP
sta 1,x
tsx
.dbline 69
; }
L35:
L32:
.dbline 63
inc 3,X
L34:
.dbline 63
lda 3,X
cmp #3
bhs X4
jmp L31
X4:
L28:
.dbline 62
inc 2,X
L30:
.dbline 62
lda 2,X
cmp #3
bhs X5
jmp L27
X5:
.dbline 71
;
; return x[1];
lda 7,X
add #2
sta *__r1
lda 6,X
adc #0
sta *__r0
ldhx *__r0
lda 1,x
sta *__r1
lda ,x
tsx
sta *__r0
.dbline -2
L26:
ais #4
.dbline 0 ; func end
rts
.dbsym l tmp 0 i
.dbsym l i 2 c
.dbsym l j 3 c
.dbsym l x 6 pi
.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 89
; }
;
;
;
; //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-片号,cs=0~7对应PTC0~7 *
; // channel-通道号0,1,2 ...10 buf-存放数据的首址 *
; //返 回:内存buf开始连续两个地址为取出的数(高4位、低8位) *
; //说 明:(070418)将CS_D=0xff; CS_P=0xff *
; // 改为CS_D|=1<<cs; CS_P|= 1<<cs;以避免影响PTC其他口 *
; //-------------------------------------------------------------------------*
; void TLC2543(INT16U cs,INT16U channel,INT8U *buf)
; {
.dbline 93
; INT8U temp;
;
; //1 初始化片选信号为1
; CS_D |=1<<cs; //定义PTC的第cs引脚为输出
mov #0,*__r0
mov #1,*__r1
lda 4,X
and #15
beq X7
X6:
lsl *__r1
rol *__r0
dbnza X6
X7:
clr *__r2
lda 0x6
ora *__r1
sta *__r1
lda *__r2
ora *__r0
mov *__r1,0x6
.dbline 94
; CS_P |=1<<cs; //C口的第cs引脚为高电平
mov #0,*__r0
mov #1,*__r1
lda 4,X
and #15
beq X9
X8:
lsl *__r1
rol *__r0
dbnza X8
X9:
clr *__r2
lda 0x2
ora *__r1
sta *__r1
lda *__r2
ora *__r0
mov *__r1,0x2
.dbline 97
;
; //2 相应片TLC2543的选CS=0,产生高到低的变化
; CS_P &= ~(1<<cs);
mov #0,*__r0
mov #1,*__r1
lda 4,X
and #15
beq X11
X10:
lsl *__r1
rol *__r0
dbnza X10
X11:
com *__r1
com *__r0
clr *__r2
lda 0x2
and *__r1
sta *__r1
lda *__r2
and *__r0
mov *__r1,0x2
.dbline 100
;
; //3 写控制字到相应片TLC2543
; SPDR = (channel<<4) | 0x0C;//入口通道、16位格式、MSB先送出、二进制
lda 6,X
sta *__r1
lda 5,X
sta *__r0
lda #4
X12:
lsl *__r1
rol *__r0
dbnza X12
lda *__r1
ora #12
sta 0x12
L38:
.dbline 103
L39:
.dbline 103
;
; //4 等待发送器空
; while ((SPSCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
brclr #3,0x11,L38
L41:
.dbline 106
L42:
.dbline 106
;
; //5 等待接收器满
; while ((SPSCR & (1<<ReFullBit)) == 0); //为0等待,也就是等待SPRF为1
brclr #7,0x11,L41
.dbline 109
;
; //6 取出上次转换结果高字节
; *buf = SPDR; //*buf中存放的是D11~D4位
lda 8,X
sta *__r1
lda 7,X
sta *__r0
lda 0x12
ldhx *__r0
sta ,x
tsx
.dbline 110
; SPDR = *buf; //上次转换结果低字节(后四位为0),握手信号
lda 7,X
ldx 8,X
psha
pulh
lda ,x
tsx
sta 0x12
L44:
.dbline 113
L45:
.dbline 113
;
; //7 等待发送结束
; while ((SPSCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
brclr #3,0x11,L44
L47:
.dbline 116
L48:
.dbline 116
;
; //8 等待新数据到达
; while ((SPSCR & (1<<ReFullBit)) == 0); //为0等待,也就是等待SPRF为1
brclr #7,0x11,L47
.dbline 119
;
; //9 取出上次转换结果的低4位
; *(buf+1) = SPDR;// *(buf+1)中存放D3~D0位(后四位为0)
lda 8,X
add #1
sta *__r1
lda 7,X
adc #0
sta *__r0
lda 0x12
ldhx *__r0
sta ,x
tsx
.dbline 122
;
; //10 TLC2543片选CS=1
; CS_P |=1<<cs;
mov #0,*__r0
mov #1,*__r1
lda 4,X
and #15
beq X14
X13:
lsl *__r1
rol *__r0
dbnza X13
X14:
clr *__r2
lda 0x2
ora *__r1
sta *__r1
lda *__r2
ora *__r0
mov *__r1,0x2
.dbline 125
;
; //11 整合后*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
X15:
lsr *__r4
dbnza X15
lda *__r4
ora *__r2
ldhx *__r0
sta ,x
tsx
.dbline 126
; *buf = *buf>>4;
lda 7,X
ldx 8,X
psha
pulh
lda ,x
tsx
sta *__r0
lda #4
X16:
lsr *__r0
dbnza X16
mov *__r0,*__r1
lda 8,X
sta *__r3
lda 7,X
sta *__r2
lda *__r1
ldhx *__r2
sta ,x
tsx
.dbline -2
L37:
ais #1
.dbline 0 ; func end
rts
.dbsym l temp 0 c
.dbsym l buf 7 pc
.dbsym l channel 5 i
.dbsym l cs 3 i
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -