📄 timer.lis
字号:
.module timer.c
.area text(rom, con, rel)
; t_count -> R10
; count -> R10,R11
; type -> R12
.even
0000 _start_T0::
0000 0E940000 xcall push_gset4
0004 5901 movw R10,R18
0006 C02E mov R12,R16
0008 ; #include "timer.h"
0008 ; #include "schedule.h"
0008 ; struct Timer_mul {
0008 ; unsigned char num;
0008 ; unsigned char on;
0008 ; unsigned char type; //类型,reapeat=1 单次=0
0008 ; unsigned long ticks; //执行周期
0008 ; unsigned long tickleft; //剩余时间,单位为秒
0008 ; unsigned long adjustedticks;
0008 ; }T0,T1,T2,T3;
0008 ;
0008 ; /*
0008 ; //Timer接口
0008 ; //Timer0
0008 ; void start_T0(char type, unsigned int count);
0008 ; void stop_T0(void);
0008 ; //Timer1
0008 ; void start_T1(char type, unsigned int count);
0008 ; void stop_T1(void);
0008 ; //Timer2
0008 ; void start_T2(char type, unsigned int count);
0008 ; void stop_T2(void);
0008 ; //Timer3
0008 ; void start_T3(char type, unsigned int count);
0008 ; void stop_T3(void);
0008 ; //init
0008 ; void T0_init();
0008 ; void T1_init();
0008 ; void T2_init();
0008 ; void T3_init();
0008 ; */
0008 ; //Timer接口
0008 ; //Timer0
0008 ; void start_T0(char type, unsigned int count)
0008 ; {
0008 ; //128分频,外部时钟,最大900ms计数,精度0.2
0008 ; unsigned char t_count;
0008 ;
0008 ; if (type==1)
0008 8C2D mov R24,R12
000A 8130 cpi R24,1
000C 21F4 brne L2
000E ; T0.type = 1;
000E 81E0 ldi R24,1
0010 80932F00 sts _T0+2,R24
0014 03C0 xjmp L3
0016 L2:
0016 ; else
0016 ; T0.type = 0;
0016 2224 clr R2
0018 20922F00 sts _T0+2,R2
001C L3:
001C ; T0.ticks = count;
001C 1501 movw R2,R10
001E 4424 clr R4
0020 5524 clr R5
0022 30923100 sts _T0+3+1,R3
0026 20923000 sts _T0+3,R2
002A 50923300 sts _T0+3+2+1,R5
002E 40923200 sts _T0+3+2,R4
0032 ; T0.tickleft = count;
0032 4424 clr R4
0034 5524 clr R5
0036 30923500 sts _T0+7+1,R3
003A 20923400 sts _T0+7,R2
003E 50923700 sts _T0+7+2+1,R5
0042 40923600 sts _T0+7+2,R4
0046 ; if (T0.tickleft > 900)
0046 44E8 ldi R20,132
0048 53E0 ldi R21,3
004A 60E0 ldi R22,0
004C 70E0 ldi R23,0
004E 40903600 lds R4,_T0+7+2
0052 50903700 lds R5,_T0+7+2+1
0056 20903400 lds R2,_T0+7
005A 30903500 lds R3,_T0+7+1
005E 4215 cp R20,R2
0060 5305 cpc R21,R3
0062 6405 cpc R22,R4
0064 7505 cpc R23,R5
0066 98F4 brsh L8
0068 ; {
0068 ;
0068 ; T0.tickleft -= 900;
0068 44E8 ldi R20,132
006A 53E0 ldi R21,3
006C 60E0 ldi R22,0
006E 70E0 ldi R23,0
0070 241A sub R2,R20
0072 350A sbc R3,R21
0074 460A sbc R4,R22
0076 570A sbc R5,R23
0078 30923500 sts _T0+7+1,R3
007C 20923400 sts _T0+7,R2
0080 50923700 sts _T0+7+2+1,R5
0084 40923600 sts _T0+7+2,R4
0088 ; TCNT0 = 0x0; //setup
0088 2224 clr R2
008A 22BE out 0x32,R2
008C ; }
008C 3DC0 xjmp L9
008E L8:
008E ; else
008E ; {
008E ;
008E ; t_count = T0.tickleft*256/1000 -1;
008E 40903600 lds R4,_T0+7+2
0092 50903700 lds R5,_T0+7+2+1
0096 20903400 lds R2,_T0+7
009A 30903500 lds R3,_T0+7+1
009E 40E0 ldi R20,0
00A0 51E0 ldi R21,1
00A2 60E0 ldi R22,0
00A4 70E0 ldi R23,0
00A6 5A92 st -y,R5
00A8 4A92 st -y,R4
00AA 3A92 st -y,R3
00AC 2A92 st -y,R2
00AE 8A01 movw R16,R20
00B0 9B01 movw R18,R22
00B2 0E940000 xcall empy32u
00B6 48EE ldi R20,232
00B8 53E0 ldi R21,3
00BA 60E0 ldi R22,0
00BC 70E0 ldi R23,0
00BE 7A93 st -y,R23
00C0 6A93 st -y,R22
00C2 5A93 st -y,R21
00C4 4A93 st -y,R20
00C6 0E940000 xcall div32u
00CA 1801 movw R2,R16
00CC 2901 movw R4,R18
00CE 41E0 ldi R20,1
00D0 50E0 ldi R21,0
00D2 60E0 ldi R22,0
00D4 70E0 ldi R23,0
00D6 241A sub R2,R20
00D8 350A sbc R3,R21
00DA 460A sbc R4,R22
00DC 570A sbc R5,R23
00DE A22C mov R10,R2
00E0 ; T0.tickleft =0;
00E0 40E0 ldi R20,0
00E2 50E0 ldi R21,0
00E4 60E0 ldi R22,0
00E6 70E0 ldi R23,0
00E8 50933500 sts _T0+7+1,R21
00EC 40933400 sts _T0+7,R20
00F0 70933700 sts _T0+7+2+1,R23
00F4 60933600 sts _T0+7+2,R22
00F8 ;
00F8 ; TCNT0 = 0xff - (t_count & 0xff); //setup
00F8 822D mov R24,R2
00FA 9927 clr R25
00FC 9070 andi R25,0
00FE EFEF ldi R30,255
0100 F0E0 ldi R31,0
0102 E81B sub R30,R24
0104 F90B sbc R31,R25
0106 E2BF out 0x32,R30
0108 ;
0108 ; }
0108 L9:
0108 ;
0108 ; TCCR0 = 0x05; //start timer
0108 85E0 ldi R24,5
010A 83BF out 0x33,R24
010C ; TIMSK |= 0x01;
010C 87B7 in R24,0x37
010E 8160 ori R24,1
0110 87BF out 0x37,R24
0112 L1:
0112 0E940000 xcall pop_gset4
0116 .dbline 0 ; func end
0116 0895 ret
.even
0118 _stop_T0::
0118 ;
0118 ; }
0118 ; void stop_T0(void)
0118 ; {
0118 ; TCCR0 = 0x0;
0118 2224 clr R2
011A 23BE out 0x33,R2
011C ; TIMSK &=~0x01;
011C 87B7 in R24,0x37
011E 8E7F andi R24,254
0120 87BF out 0x37,R24
0122 L14:
0122 .dbline 0 ; func end
0122 0895 ret
0124 ; t_count -> R10,R11
0124 ; count -> R10,R11
0124 ; type -> R12
.even
0124 _start_T1::
0124 0E940000 xcall push_gset4
0128 5901 movw R10,R18
012A C02E mov R12,R16
012C ; }
012C ; //Timer1
012C ; void start_T1(char type, unsigned int count)
012C ; {
012C ; unsigned int t_count;
012C ;
012C ; if (type==1)
012C 8C2D mov R24,R12
012E 8130 cpi R24,1
0130 21F4 brne L16
0132 ; T1.type = 1;
0132 81E0 ldi R24,1
0134 80932000 sts _T1+2,R24
0138 03C0 xjmp L17
013A L16:
013A ; else
013A ; T1.type = 0;
013A 2224 clr R2
013C 20922000 sts _T1+2,R2
0140 L17:
0140 ; T1.ticks = count;
0140 1501 movw R2,R10
0142 4424 clr R4
0144 5524 clr R5
0146 30922200 sts _T1+3+1,R3
014A 20922100 sts _T1+3,R2
014E 50922400 sts _T1+3+2+1,R5
0152 40922300 sts _T1+3+2,R4
0156 ; T1.tickleft = count;
0156 4424 clr R4
0158 5524 clr R5
015A 30922600 sts _T1+7+1,R3
015E 20922500 sts _T1+7,R2
0162 50922800 sts _T1+7+2+1,R5
0166 40922700 sts _T1+7+2,R4
016A ; if (T1.tickleft > 9000)
016A 48E2 ldi R20,40
016C 53E2 ldi R21,35
016E 60E0 ldi R22,0
0170 70E0 ldi R23,0
0172 40902700 lds R4,_T1+7+2
0176 50902800 lds R5,_T1+7+2+1
017A 20902500 lds R2,_T1+7
017E 30902600 lds R3,_T1+7+1
0182 4215 cp R20,R2
0184 5305 cpc R21,R3
0186 6405 cpc R22,R4
0188 7505 cpc R23,R5
018A A0F4 brsh L22
018C ; {
018C ;
018C ; T1.tickleft -= 9000;
018C 48E2 ldi R20,40
018E 53E2 ldi R21,35
0190 60E0 ldi R22,0
0192 70E0 ldi R23,0
0194 241A sub R2,R20
0196 350A sbc R3,R21
0198 460A sbc R4,R22
019A 570A sbc R5,R23
019C 30922600 sts _T1+7+1,R3
01A0 20922500 sts _T1+7,R2
01A4 50922800 sts _T1+7+2+1,R5
01A8 40922700 sts _T1+7+2,R4
01AC ; TCNT1H = 0x0; //setup
01AC 2224 clr R2
01AE 2DBC out 0x2d,R2
01B0 ; TCNT1L = 0x0;
01B0 2CBC out 0x2c,R2
01B2 ; }
01B2 45C0 xjmp L23
01B4 L22:
01B4 ; else
01B4 ; {
01B4 ;
01B4 ; t_count = T1.tickleft*72/10 -1;
01B4 40902700 lds R4,_T1+7+2
01B8 50902800 lds R5,_T1+7+2+1
01BC 20902500 lds R2,_T1+7
01C0 30902600 lds R3,_T1+7+1
01C4 48E4 ldi R20,72
01C6 50E0 ldi R21,0
01C8 60E0 ldi R22,0
01CA 70E0 ldi R23,0
01CC 5A92 st -y,R5
01CE 4A92 st -y,R4
01D0 3A92 st -y,R3
01D2 2A92 st -y,R2
01D4 8A01 movw R16,R20
01D6 9B01 movw R18,R22
01D8 0E940000 xcall empy32u
01DC 4AE0 ldi R20,10
01DE 50E0 ldi R21,0
01E0 60E0 ldi R22,0
01E2 70E0 ldi R23,0
01E4 7A93 st -y,R23
01E6 6A93 st -y,R22
01E8 5A93 st -y,R21
01EA 4A93 st -y,R20
01EC 0E940000 xcall div32u
01F0 1801 movw R2,R16
01F2 2901 movw R4,R18
01F4 41E0 ldi R20,1
01F6 50E0 ldi R21,0
01F8 60E0 ldi R22,0
01FA 70E0 ldi R23,0
01FC 241A sub R2,R20
01FE 350A sbc R3,R21
0200 460A sbc R4,R22
0202 570A sbc R5,R23
0204 5101 movw R10,R2
0206 ; T1.tickleft =0;
0206 40E0 ldi R20,0
0208 50E0 ldi R21,0
020A 60E0 ldi R22,0
020C 70E0 ldi R23,0
020E 50932600 sts _T1+7+1,R21
0212 40932500 sts _T1+7,R20
0216 70932800 sts _T1+7+2+1,R23
021A 60932700 sts _T1+7+2,R22
021E ;
021E ; TCNT1H = 0xff - ((t_count>>8) & 0xff); //setup
021E C101 movw R24,R2
0220 892F mov R24,R25
0222 9927 clr R25
0224 9070 andi R25,0
0226 EFEF ldi R30,255
0228 F0E0 ldi R31,0
022A E81B sub R30,R24
022C F90B sbc R31,R25
022E EDBD out 0x2d,R30
0230 ; TCNT1L = 0xff - (t_count & 0xff);
0230 C101 movw R24,R2
0232 9070 andi R25,0
0234 EFEF ldi R30,255
0236 F0E0 ldi R31,0
0238 E81B sub R30,R24
023A F90B sbc R31,R25
023C ECBD out 0x2c,R30
023E ; }
023E L23:
023E ;
023E ; TCCR1B = 0x05; //1024分频
023E 85E0 ldi R24,5
0240 8EBD out 0x2e,R24
0242 ; TIMSK |= 0x04;
0242 87B7 in R24,0x37
0244 8460 ori R24,4
0246 87BF out 0x37,R24
0248 L15:
0248 0E940000 xcall pop_gset4
024C .dbline 0 ; func end
024C 0895 ret
.even
024E _stop_T1::
024E ;
024E ;
024E ; // led1On();
024E ; }
024E ; void stop_T1(void)
024E ; {
024E ; TCCR1B = 0x0;
024E 2224 clr R2
0250 2EBC out 0x2e,R2
0252 ; TIMSK &=~(0x04);
0252 87B7 in R24,0x37
0254 8B7F andi R24,251
0256 87BF out 0x37,R24
0258 L28:
0258 .dbline 0 ; func end
0258 0895 ret
025A ; t_count -> R10
025A ; count -> R10,R11
025A ; type -> R12
.even
025A _start_T2::
025A 0E940000 xcall push_gset4
025E 5901 movw R10,R18
0260 C02E mov R12,R16
0262 ; }
0262 ; //Timer2
0262 ; void start_T2(char type, unsigned int count)
0262 ; {
0262 ; //1024分频,最大35ms
0262 ; unsigned char t_count;
0262 ;
0262 ; if (type==1)
0262 8C2D mov R24,R12
0264 8130 cpi R24,1
0266 21F4 brne L30
0268 ; T2.type = 1;
0268 81E0 ldi R24,1
026A 80931100 sts _T2+2,R24
026E 03C0 xjmp L31
0270 L30:
0270 ; else
0270 ; T2.type = 0;
0270 2224 clr R2
0272 20921100 sts _T2+2,R2
0276 L31:
0276 ; T2.ticks = count;
0276 1501 movw R2,R10
0278 4424 clr R4
027A 5524 clr R5
027C 30921300 sts _T2+3+1,R3
0280 20921200 sts _T2+3,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -