📄 enc.s
字号:
.module ENC.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\niutao\MYDOCU~1\永磁电机\平缝机\新建文件夹\函数库\ENC\ENC.c
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 30
; /*****************************************************************
; * 文件名: ENC.c
; * 版本号:
; * 创作日期: 2005.7.7
; * 作者: wangzq
; * 功能说明: 采集转速数值
;
; * 其它说明: 使用AVR单片机Atmaga48, 晶振:8Mhz
;
; *****************************************************************/
;
;
; /*****************************************************************
;
; * 修改日期:
; * 修改人:
; * 修改原因:
;
; *******************************************************************/
;
;
; //包含文件
; #include "ENC.h"
;
; //TIMER1 initialize - prescale:1
; // WGM: 0) Normal, TOP=0xFFFF
; // desired value:
; // actual value: Out of range
; void timer1_init(void)
; {
.dbline 31
; TCCR1B = 0x00; //stop
clr R2
ldi R30,129
ldi R31,0
std z+0,R2
.dbline 32
; TCNT1H = 0x00 /*INVALID SETTING*/; //setup
ldi R30,133
std z+0,R2
.dbline 33
; TCNT1L = 0x00 /*INVALID SETTING*/;
ldi R30,132
std z+0,R2
.dbline 34
; OCR1AH = 0x00 /*INVALID SETTING*/;
ldi R30,137
std z+0,R2
.dbline 35
; OCR1AL = 0x00 /*INVALID SETTING*/;
ldi R30,136
std z+0,R2
.dbline 36
; OCR1BH = 0x00 /*INVALID SETTING*/;
ldi R30,139
std z+0,R2
.dbline 37
; OCR1BL = 0x00 /*INVALID SETTING*/;
ldi R30,138
std z+0,R2
.dbline 38
; ICR1H = 0x00 /*INVALID SETTING*/;
ldi R30,135
std z+0,R2
.dbline 39
; ICR1L = 0x00 /*INVALID SETTING*/;
ldi R30,134
std z+0,R2
.dbline 40
; TCCR1A = 0x00;
ldi R30,128
std z+0,R2
.dbline 41
; TCCR1B = 0xC1; //start Timer
ldi R24,193
ldi R30,129
std z+0,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 20
rjmp _timer1_capt_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\niutao\MYDOCU~1\永磁电机\平缝机\新建文件夹\函数库\ENC\ENC.c
.dbfunc e timer1_capt_isr _timer1_capt_isr fV
.even
_timer1_capt_isr::
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R8
st -y,R9
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
rcall push_gset2
.dbline -1
.dbline 46
; }
;
; #pragma interrupt_handler timer1_capt_isr:11
; void timer1_capt_isr(void)
; {
.dbline 47
; g_CntUpdate = ICR1L;
ldi R30,134
ldi R31,0
ldd R2,z+0
clr R3
sts _g_CntUpdate+1,R3
sts _g_CntUpdate,R2
.dbline 48
; g_CntUpdate |=(int)ICR1H << 8;
ldi R30,135
ldd R2,z+0
clr R3
mov R3,R2
clr R2
lds R4,_g_CntUpdate
lds R5,_g_CntUpdate+1
or R4,R2
or R5,R3
sts _g_CntUpdate+1,R5
sts _g_CntUpdate,R4
.dbline 50
;
; if ((TIFR1&0x01) != 0) //判断定时器1溢出
sbis 0x16,0
rjmp L3
.dbline 51
; {
.dbline 52
; g_TotalEnc++;
lds R24,_g_TotalEnc
subi R24,255 ; addi 1
sts _g_TotalEnc,R24
.dbline 53
; TIFR1 |= 0x01; //取消定时器1溢出标志位
sbi 0x16,0
.dbline 54
; }
L3:
.dbline 56
;
; if (g_CntOld < g_CntUpdate)
lds R2,_g_CntUpdate
lds R3,_g_CntUpdate+1
lds R4,_g_CntOld
lds R5,_g_CntOld+1
cp R4,R2
cpc R5,R3
brsh L5
.dbline 57
; {
.dbline 58
; g_DeltaEnc = g_CntUpdate - g_CntOld;
movw R2,R4
lds R4,_g_CntUpdate
lds R5,_g_CntUpdate+1
sub R4,R2
sbc R5,R3
movw R2,R4
clr R4
clr R5
sts _g_DeltaEnc+1,R3
sts _g_DeltaEnc,R2
sts _g_DeltaEnc+2+1,R5
sts _g_DeltaEnc+2,R4
.dbline 60
;
; }
rjmp L6
L5:
.dbline 62
; else
; {
.dbline 63
; g_DeltaEnc = (0x10000 - g_CntOld) + g_CntUpdate;
lds R2,_g_CntOld
lds R3,_g_CntOld+1
clr R4
clr R5
ldi R20,0
ldi R21,0
ldi R22,1
ldi R23,0
sub R20,R2
sbc R21,R3
sbc R22,R4
sbc R23,R5
lds R2,_g_CntUpdate
lds R3,_g_CntUpdate+1
clr R4
clr R5
add R20,R2
adc R21,R3
adc R22,R4
adc R23,R5
sts _g_DeltaEnc+1,R21
sts _g_DeltaEnc,R20
sts _g_DeltaEnc+2+1,R23
sts _g_DeltaEnc+2,R22
.dbline 64
; }
L6:
.dbline 66
;
; if (g_TotalEnc > 10)
ldi R24,10
lds R2,_g_TotalEnc
cp R24,R2
brsh L12
.dbline 67
; g_TotalEnc = 10;
sts _g_TotalEnc,R24
.dbline 69
;
; for (; g_TotalEnc != 0; g_TotalEnc--)
rjmp L12
L9:
.dbline 70
.dbline 71
ldi R20,0
ldi R21,0
ldi R22,1
ldi R23,0
lds R4,_g_DeltaEnc+2
lds R5,_g_DeltaEnc+2+1
lds R2,_g_DeltaEnc
lds R3,_g_DeltaEnc+1
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
sts _g_DeltaEnc+1,R3
sts _g_DeltaEnc,R2
sts _g_DeltaEnc+2+1,R5
sts _g_DeltaEnc+2,R4
.dbline 72
L10:
.dbline 69
lds R24,_g_TotalEnc
subi R24,1
sts _g_TotalEnc,R24
L12:
.dbline 69
lds R2,_g_TotalEnc
tst R2
brne L9
.dbline 84
; {
; g_DeltaEnc += 0x10000;
; }
; /*
; g_DeltaEnc *= 125;
; g_DeltaEnc /=1000;
; g_DeltaEnc *= 72;
; g_DeltaEnc = 3 000 000 / g_DeltaEnc;
;
; //if (g_DeltaEnc > 6000)
; //g_DeltaEnc = 6000;
; //g_DeltaEnc *= 0xff;
; //g_DeltaEnc /=6000;
; */
; g_TotalEnc = 0; //速度溢出标志清零
clr R2
sts _g_TotalEnc,R2
.dbline 85
; g_CntOld = g_CntUpdate; //准备下次采样
lds R2,_g_CntUpdate
lds R3,_g_CntUpdate+1
sts _g_CntOld+1,R3
sts _g_CntOld,R2
.dbline -2
L2:
rcall pop_gset2
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R9,y+
ld R8,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.area vector(rom, abs)
.org 26
rjmp _timer1_ovf_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\niutao\MYDOCU~1\永磁电机\平缝机\新建文件夹\函数库\ENC\ENC.c
.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
.even
_timer1_ovf_isr::
st -y,R24
st -y,R25
in R24,0x3f
st -y,R24
.dbline -1
.dbline 92
; }
;
;
;
; #pragma interrupt_handler timer1_ovf_isr:14
; void timer1_ovf_isr(void)
; {
.dbline 93
; g_TotalEnc ++; //速度溢出标志
lds R24,_g_TotalEnc
subi R24,255 ; addi 1
sts _g_TotalEnc,R24
.dbline -2
L13:
ld R24,y+
out 0x3f,R24
ld R25,y+
ld R24,y+
.dbline 0 ; func end
reti
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -