📄 adc.s
字号:
.module ADC.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\niutao\MYDOCU~1\永磁电机\平缝机\新建文件夹\函数库\ADC\ADC.c
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 30
; /*****************************************************************
; * 文件名: ADC.c
; * 版本号:
; * 创作日期: 2005.7.7
; * 作者: fengzm
; * 功能说明: 可采集7个AD通道的值,使用了RC滤波;
; * 其它说明: 使用AVR单片机Atmaga48, 晶振:8Mhz
; 调用ADC文件的时候只需要输入通道号即可,如ADC(7);
; *****************************************************************/
;
;
; /*****************************************************************
;
; * 修改日期: 2005.7.8
; * 修改人: wangzq
; * 修改原因: 优化代码
; 定时器0溢出触发A/D转换
; 修改g_AdcNum改变通道号,默认值0;
; g_ValueAdc返回A/D转换后的滤波值;
; g_AdcEnd 0xff表示当前返回值有效;
; *******************************************************************/
;
;
; //包含文件
; #include "ADC.h"
;
; // ADC initialize
; // Conversion time: 13uS,CLOCK/8;
; void adc_init(void)
; {
.dbline 31
; ADCSRA = 0x00; //disable adc
clr R2
ldi R30,122
ldi R31,0
std z+0,R2
.dbline 32
; ADMUX = 0x00; //select adc input 0
ldi R30,124
std z+0,R2
.dbline 33
; ACSR = 0x80; //not need the compare function
ldi R24,128
out 0x30,R24
.dbline 34
; ADCSRB = 0x04; //定时器0溢出触发转换
ldi R24,4
ldi R30,123
std z+0,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 42
rjmp _adc_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\niutao\MYDOCU~1\永磁电机\平缝机\新建文件夹\函数库\ADC\ADC.c
.dbfunc e adc_isr _adc_isr fV
; j -> y+0
.even
_adc_isr::
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R6
st -y,R7
st -y,R8
st -y,R9
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
rcall push_gset2
sbiw R28,4
.dbline -1
.dbline 39
; }
;
; #pragma interrupt_handler adc_isr:22
; void adc_isr(void)
; {
.dbline 42
; dword j;
;
; j =ADCL; //Read 8 low bits first (impo
ldi R30,120
ldi R31,0
ldd R2,z+0
clr R3
clr R4
clr R5
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
.dbline 43
; j |=(int)ADCH << 8; //read 2 high bits and shift into topbyte
ldi R30,121
ldd R2,z+0
clr R3
mov R3,R2
clr R2
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
ldd R6,y+0
ldd R7,y+1
ldd R8,y+2
ldd R9,y+3
or R6,R2
or R7,R3
or R8,R4
or R9,R5
std y+0,R6
std y+1,R7
std y+2,R8
std y+3,R9
.dbline 45
;
; j *= ADCK; //RC filtering
ldd R2,y+0
ldd R3,y+1
ldd R4,y+2
ldd R5,y+3
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
rcall empy32u
std y+0,R16
std y+1,R17
std y+2,R18
std y+3,R19
.dbline 46
; j += (10-ADCK) * g_ValueAdc;
lds R18,_g_ValueAdc
lds R19,_g_ValueAdc+1
ldi R16,8
ldi R17,0
rcall empy16s
movw R2,R16
clr R4
clr R5
ldd R6,y+0
ldd R7,y+1
ldd R8,y+2
ldd R9,y+3
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
std y+0,R6
std y+1,R7
std y+2,R8
std y+3,R9
.dbline 47
; j /=10;
ldi R20,10
ldi R21,0
ldi R22,0
ldi R23,0
ldd R16,y+0
ldd R17,y+1
ldd R18,y+2
ldd R19,y+3
st -y,R23
st -y,R22
st -y,R21
st -y,R20
rcall div32u
std y+0,R16
std y+1,R17
std y+2,R18
std y+3,R19
.dbline 48
; g_ValueAdc = j;
ldd R2,y+0
ldd R3,y+1
sts _g_ValueAdc+1,R3
sts _g_ValueAdc,R2
.dbline 50
;
; g_AdcEnd = 0xff; //set the flag of end
ldi R24,255
sts _g_AdcEnd,R24
.dbline 51
; ADMUX = g_AdcNum; //通道选择
lds R2,_g_AdcNum
ldi R30,124
ldi R31,0
std z+0,R2
.dbline -2
L2:
adiw R28,4
rcall pop_gset2
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R9,y+
ld R8,y+
ld R7,y+
ld R6,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbsym l j 0 l
.dbend
.dbfunc e AdcPedal _AdcPedal fi
; get -> y+0
; i -> R12
; adcp -> R10,R11
.even
_AdcPedal::
rcall push_gset4
movw R10,R16
sbiw R28,4
.dbline -1
.dbline 62
; }
;
; //************************************************
; //踏板信号转换为对应的控制值
; //前踩:200-6000 对应10-300
; //待机:位7:1 位6:0
; //后一:高位 11
; //后二:高位 01
; //************************************************
; word AdcPedal(word adcp)
; {
.dbline 66
; byte i;
; dword get;
;
; i = 0;
clr R12
.dbline 68
;
; if (adcp <= PEDAL_STOP)
ldi R24,470
ldi R25,1
cp R24,R10
cpc R25,R11
brlo L4
.dbline 69
; {
.dbline 70
; i = 0x3;
ldi R24,3
mov R12,R24
.dbline 71
; adcp = 0;
clr R10
clr R11
.dbline 72
; }
L4:
.dbline 74
;
; if ((adcp>PEDAL_STOP) && (adcp<PEDAL_STARTL))
ldi R24,470
ldi R25,1
cp R24,R10
cpc R25,R11
brsh L6
movw R24,R10
cpi R24,20
ldi R30,2
cpc R25,R30
brsh L6
.dbline 75
; {
.dbline 76
; i = 0x2;
ldi R24,2
mov R12,R24
.dbline 77
; adcp = 0;
clr R10
clr R11
.dbline 78
; }
L6:
.dbline 80
;
; if (adcp >= PEDAL_STARTL)
movw R24,R10
cpi R24,20
ldi R30,2
cpc R25,R30
brsh X0
rjmp L8
X0:
.dbline 81
; {
.dbline 82
; if (adcp > PEDAL_STARTH)
ldi R24,941
ldi R25,3
cp R24,R10
cpc R25,R11
brsh L10
.dbline 83
; {
.dbline 84
; adcp = PEDAL_STARTH;
movw R10,R24
.dbline 85
; }
L10:
.dbline 86
; get = adcp - PEDAL_STARTL;
movw R24,R10
subi R24,20
sbci R25,2
movw R2,R24
clr R4
clr R5
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
.dbline 87
; get *= 5800; //(6000-200)/20;
ldd R2,y+0
ldd R3,y+1
ldd R4,y+2
ldd R5,y+3
ldi R20,168
ldi R21,22
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
rcall empy32u
std y+0,R16
std y+1,R17
std y+2,R18
std y+3,R19
.dbline 88
; get /= (PEDAL_STARTH - PEDAL_STARTL);
ldi R20,153
ldi R21,1
ldi R22,0
ldi R23,0
ldd R16,y+0
ldd R17,y+1
ldd R18,y+2
ldd R19,y+3
st -y,R23
st -y,R22
st -y,R21
st -y,R20
rcall div32u
std y+0,R16
std y+1,R17
std y+2,R18
std y+3,R19
.dbline 89
; get += 200; //200/20;
ldi R20,200
ldi R21,0
ldi R22,0
ldi R23,0
ldd R2,y+0
ldd R3,y+1
ldd R4,y+2
ldd R5,y+3
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
.dbline 90
; adcp = get;
ldd R10,y+0
ldd R11,y+1
.dbline 91
; }
L8:
.dbline 93
;
; if (i == 3) //后一状态
mov R24,R12
cpi R24,3
brne L12
.dbline 94
; {
.dbline 95
; adcp |= 0xC000;
movw R24,R10
ori R25,192
movw R10,R24
.dbline 96
; }
L12:
.dbline 97
; if (i == 2) //待机状态
mov R24,R12
cpi R24,2
brne L14
.dbline 98
; {
.dbline 99
; adcp |= 0x8000;
movw R24,R10
ori R25,128
movw R10,R24
.dbline 100
; }
L14:
.dbline 102
;
; return adcp; //返回脚踏板转速值
movw R16,R10
.dbline -2
L3:
adiw R28,4
rcall pop_gset4
.dbline 0 ; func end
ret
.dbsym l get 0 l
.dbsym r i 12 c
.dbsym r adcp 10 i
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -