📄 enc.lis
字号:
.module ENC.c
.area text(rom, con, rel)
0000 .dbfile E:\PMax\单片机源代码\函数库\ENC\ENC.c
0000 .dbfunc e timer1_init _timer1_init fV
.even
0000 _timer1_init::
0000 .dbline -1
0000 .dbline 30
0000 ; /*****************************************************************
0000 ; * 文件名: ENC.c
0000 ; * 版本号:
0000 ; * 创作日期: 2005.7.7
0000 ; * 作者: wangzq
0000 ; * 功能说明: 采集转速数值
0000 ;
0000 ; * 其它说明: 使用AVR单片机Atmaga48, 晶振:8Mhz
0000 ;
0000 ; *****************************************************************/
0000 ;
0000 ;
0000 ; /*****************************************************************
0000 ;
0000 ; * 修改日期:
0000 ; * 修改人:
0000 ; * 修改原因:
0000 ;
0000 ; *******************************************************************/
0000 ;
0000 ;
0000 ; //包含文件
0000 ; #include "ENC.h"
0000 ;
0000 ; //TIMER1 initialize - prescale:1
0000 ; // WGM: 0) Normal, TOP=0xFFFF
0000 ; // desired value:
0000 ; // actual value: Out of range
0000 ; void timer1_init(void)
0000 ; {
0000 .dbline 31
0000 ; TCCR1B = 0x00; //stop
0000 2224 clr R2
0002 20928100 sts 129,R2
0006 .dbline 32
0006 ; TCNT1H = 0x00 /*INVALID SETTING*/; //setup
0006 20928500 sts 133,R2
000A .dbline 33
000A ; TCNT1L = 0x00 /*INVALID SETTING*/;
000A 20928400 sts 132,R2
000E .dbline 34
000E ; OCR1AH = 0x00 /*INVALID SETTING*/;
000E 20928900 sts 137,R2
0012 .dbline 35
0012 ; OCR1AL = 0x00 /*INVALID SETTING*/;
0012 20928800 sts 136,R2
0016 .dbline 36
0016 ; OCR1BH = 0x00 /*INVALID SETTING*/;
0016 20928B00 sts 139,R2
001A .dbline 37
001A ; OCR1BL = 0x00 /*INVALID SETTING*/;
001A 20928A00 sts 138,R2
001E .dbline 38
001E ; ICR1H = 0x00 /*INVALID SETTING*/;
001E 20928700 sts 135,R2
0022 .dbline 39
0022 ; ICR1L = 0x00 /*INVALID SETTING*/;
0022 20928600 sts 134,R2
0026 .dbline 40
0026 ; TCCR1A = 0x00;
0026 20928000 sts 128,R2
002A .dbline 41
002A ; TCCR1B = 0xC1; //start Timer
002A 81EC ldi R24,193
002C 80938100 sts 129,R24
0030 .dbline -2
0030 L1:
0030 .dbline 0 ; func end
0030 0895 ret
0032 .dbend
.area vector(rom, abs)
.org 20
0014 19C0 rjmp _timer1_capt_isr
.area text(rom, con, rel)
0032 .dbfile E:\PMax\单片机源代码\函数库\ENC\ENC.c
0032 .dbfunc e timer1_capt_isr _timer1_capt_isr fV
.even
0032 _timer1_capt_isr::
0032 2A92 st -y,R2
0034 3A92 st -y,R3
0036 4A92 st -y,R4
0038 5A92 st -y,R5
003A 8A92 st -y,R8
003C 9A92 st -y,R9
003E 8A93 st -y,R24
0040 9A93 st -y,R25
0042 EA93 st -y,R30
0044 2FB6 in R2,0x3f
0046 2A92 st -y,R2
0048 00D0 rcall push_gset2
004A .dbline -1
004A .dbline 46
004A ; }
004A ;
004A ; #pragma interrupt_handler timer1_capt_isr:11
004A ; void timer1_capt_isr(void)
004A ; {
004A .dbline 47
004A ; g_CntUpdate = ICR1L;
004A 20908600 lds R2,134
004E 3324 clr R3
0050 30920100 sts _g_CntUpdate+1,R3
0054 20920000 sts _g_CntUpdate,R2
0058 .dbline 48
0058 ; g_CntUpdate |=(int)ICR1H << 8;
0058 20908700 lds R2,135
005C 3324 clr R3
005E 322C mov R3,R2
0060 2224 clr R2
0062 40900000 lds R4,_g_CntUpdate
0066 50900100 lds R5,_g_CntUpdate+1
006A 4228 or R4,R2
006C 5328 or R5,R3
006E 50920100 sts _g_CntUpdate+1,R5
0072 40920000 sts _g_CntUpdate,R4
0076 .dbline 50
0076 ;
0076 ; if ((TIFR1&0x01) != 0) //判断定时器1溢出
0076 B09B sbis 0x16,0
0078 06C0 rjmp L3
007A .dbline 51
007A ; {
007A .dbline 52
007A ; g_TotalEnc++;
007A 80910000 lds R24,_g_TotalEnc
007E 8F5F subi R24,255 ; addi 1
0080 80930000 sts _g_TotalEnc,R24
0084 .dbline 53
0084 ; TIFR1 |= 0x01; //取消定时器1溢出标志位
0084 B09A sbi 0x16,0
0086 .dbline 54
0086 ; }
0086 L3:
0086 .dbline 56
0086 ;
0086 ; if (g_CntOld < g_CntUpdate)
0086 20900000 lds R2,_g_CntUpdate
008A 30900100 lds R3,_g_CntUpdate+1
008E 40900000 lds R4,_g_CntOld
0092 50900100 lds R5,_g_CntOld+1
0096 4214 cp R4,R2
0098 5304 cpc R5,R3
009A 98F4 brsh L5
009C .dbline 57
009C ; {
009C .dbline 58
009C ; g_DeltaEnc = g_CntUpdate - g_CntOld;
009C 1201 movw R2,R4
009E 40900000 lds R4,_g_CntUpdate
00A2 50900100 lds R5,_g_CntUpdate+1
00A6 4218 sub R4,R2
00A8 5308 sbc R5,R3
00AA 1201 movw R2,R4
00AC 4424 clr R4
00AE 5524 clr R5
00B0 30920100 sts _g_DeltaEnc+1,R3
00B4 20920000 sts _g_DeltaEnc,R2
00B8 50920300 sts _g_DeltaEnc+2+1,R5
00BC 40920200 sts _g_DeltaEnc+2,R4
00C0 .dbline 60
00C0 ;
00C0 ; }
00C0 20C0 rjmp L6
00C2 L5:
00C2 .dbline 62
00C2 ; else
00C2 ; {
00C2 .dbline 63
00C2 ; g_DeltaEnc = (0x10000 - g_CntOld) + g_CntUpdate;
00C2 20900000 lds R2,_g_CntOld
00C6 30900100 lds R3,_g_CntOld+1
00CA 4424 clr R4
00CC 5524 clr R5
00CE 40E0 ldi R20,0
00D0 50E0 ldi R21,0
00D2 61E0 ldi R22,1
00D4 70E0 ldi R23,0
00D6 4219 sub R20,R2
00D8 5309 sbc R21,R3
00DA 6409 sbc R22,R4
00DC 7509 sbc R23,R5
00DE 20900000 lds R2,_g_CntUpdate
00E2 30900100 lds R3,_g_CntUpdate+1
00E6 4424 clr R4
00E8 5524 clr R5
00EA 420D add R20,R2
00EC 531D adc R21,R3
00EE 641D adc R22,R4
00F0 751D adc R23,R5
00F2 50930100 sts _g_DeltaEnc+1,R21
00F6 40930000 sts _g_DeltaEnc,R20
00FA 70930300 sts _g_DeltaEnc+2+1,R23
00FE 60930200 sts _g_DeltaEnc+2,R22
0102 .dbline 64
0102 ; }
0102 L6:
0102 .dbline 66
0102 ;
0102 ; if (g_TotalEnc > 10)
0102 8AE0 ldi R24,10
0104 20900000 lds R2,_g_TotalEnc
0108 8215 cp R24,R2
010A 00F5 brsh L12
010C .dbline 67
010C ; g_TotalEnc = 10;
010C 80930000 sts _g_TotalEnc,R24
0110 .dbline 69
0110 ;
0110 ; for (; g_TotalEnc != 0; g_TotalEnc--)
0110 1DC0 rjmp L12
0112 L9:
0112 .dbline 70
0112 .dbline 71
0112 40E0 ldi R20,0
0114 50E0 ldi R21,0
0116 61E0 ldi R22,1
0118 70E0 ldi R23,0
011A 40900200 lds R4,_g_DeltaEnc+2
011E 50900300 lds R5,_g_DeltaEnc+2+1
0122 20900000 lds R2,_g_DeltaEnc
0126 30900100 lds R3,_g_DeltaEnc+1
012A 240E add R2,R20
012C 351E adc R3,R21
012E 461E adc R4,R22
0130 571E adc R5,R23
0132 30920100 sts _g_DeltaEnc+1,R3
0136 20920000 sts _g_DeltaEnc,R2
013A 50920300 sts _g_DeltaEnc+2+1,R5
013E 40920200 sts _g_DeltaEnc+2,R4
0142 .dbline 72
0142 L10:
0142 .dbline 69
0142 80910000 lds R24,_g_TotalEnc
0146 8150 subi R24,1
0148 80930000 sts _g_TotalEnc,R24
014C L12:
014C .dbline 69
014C 20900000 lds R2,_g_TotalEnc
0150 2220 tst R2
0152 F9F6 brne L9
0154 .dbline 84
0154 ; {
0154 ; g_DeltaEnc += 0x10000;
0154 ; }
0154 ; /*
0154 ; g_DeltaEnc *= 125;
0154 ; g_DeltaEnc /=1000;
0154 ; g_DeltaEnc *= 72;
0154 ; g_DeltaEnc = 60000000 / g_DeltaEnc;
0154 ;
0154 ; //if (g_DeltaEnc > 6000)
0154 ; //g_DeltaEnc = 6000;
0154 ; //g_DeltaEnc *= 0xff;
0154 ; //g_DeltaEnc /=6000;
0154 ; */
0154 ; g_TotalEnc = 0; //速度溢出标志清零
0154 2224 clr R2
0156 20920000 sts _g_TotalEnc,R2
015A .dbline 85
015A ; g_CntOld = g_CntUpdate; //准备下次采样
015A 20900000 lds R2,_g_CntUpdate
015E 30900100 lds R3,_g_CntUpdate+1
0162 30920100 sts _g_CntOld+1,R3
0166 20920000 sts _g_CntOld,R2
016A .dbline -2
016A L2:
016A 00D0 rcall pop_gset2
016C 2990 ld R2,y+
016E 2FBE out 0x3f,R2
0170 E991 ld R30,y+
0172 9991 ld R25,y+
0174 8991 ld R24,y+
0176 9990 ld R9,y+
0178 8990 ld R8,y+
017A 5990 ld R5,y+
017C 4990 ld R4,y+
017E 3990 ld R3,y+
0180 2990 ld R2,y+
0182 .dbline 0 ; func end
0182 1895 reti
0184 .dbend
.area vector(rom, abs)
.org 26
001A C2C0 rjmp _timer1_ovf_isr
.area text(rom, con, rel)
0184 .dbfile E:\PMax\单片机源代码\函数库\ENC\ENC.c
0184 .dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
.even
0184 _timer1_ovf_isr::
0184 8A93 st -y,R24
0186 9A93 st -y,R25
0188 8FB7 in R24,0x3f
018A 8A93 st -y,R24
018C .dbline -1
018C .dbline 92
018C ; }
018C ;
018C ;
018C ;
018C ; #pragma interrupt_handler timer1_ovf_isr:14
018C ; void timer1_ovf_isr(void)
018C ; {
018C .dbline 93
018C ; g_TotalEnc ++; //速度溢出标志
018C 80910000 lds R24,_g_TotalEnc
0190 8F5F subi R24,255 ; addi 1
0192 80930000 sts _g_TotalEnc,R24
0196 .dbline -2
0196 L13:
0196 8991 ld R24,y+
0198 8FBF out 0x3f,R24
019A 9991 ld R25,y+
019C 8991 ld R24,y+
019E .dbline 0 ; func end
019E 1895 reti
01A0 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -