📄 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 ; #include<iom128v.h>
0008 ; #include <macros.h>
0008 ;
0008 ; Timer_struct T0,T1,T2,T3;
0008 ;
0008 ; void mcu_sleep();
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 ; //1024分频,外部时钟,最大7s计数,秒级精度100%
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 > 7000)
0046 48E5 ldi R20,88
0048 5BE1 ldi R21,27
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 -= 7000;
0068 48E5 ldi R20,88
006A 5BE1 ldi R21,27
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 ; }
008C 3DC0 xjmp L9
008E L8:
008E ; else
008E ; {
008E ;
008E ; t_count = T0.tickleft*72/10 -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 48E4 ldi R20,72
00A0 50E0 ldi R21,0
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 4AE0 ldi R20,10
00B8 50E0 ldi R21,0
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 = 0x07; //start timer
0108 87E0 ldi R24,7
010A 83BF out 0x33,R24
010C ; TIMSK |= 0x01;
010C 87B7 in R24,0x37
010E 8160 ori R24,1
0110 87BF out 0x37,R24
0112 ; T0.on=1;
0112 81E0 ldi R24,1
0114 80932E00 sts _T0+1,R24
0118 ; adjustPower();
0118 0E940000 xcall _adjustPower
011C L1:
011C 0E940000 xcall pop_gset4
0120 .dbline 0 ; func end
0120 0895 ret
.even
0122 _stop_T0::
0122 ; // post(mcu_sleep);
0122 ; }
0122 ; void stop_T0(void)
0122 ; {
0122 ; TCCR0 = 0x0;
0122 2224 clr R2
0124 23BE out 0x33,R2
0126 ; TIMSK &=~0x01;
0126 87B7 in R24,0x37
0128 8E7F andi R24,254
012A 87BF out 0x37,R24
012C ; T0.on=0;
012C 20922E00 sts _T0+1,R2
0130 L15:
0130 .dbline 0 ; func end
0130 0895 ret
0132 ; t_count -> R10,R11
0132 ; count -> R10,R11
0132 ; type -> R12
.even
0132 _start_T1::
0132 0E940000 xcall push_gset4
0136 5901 movw R10,R18
0138 C02E mov R12,R16
013A ; }
013A ; //Timer1
013A ; void start_T1(char type, unsigned int count)
013A ; {
013A ; unsigned int t_count;
013A ;
013A ; if (type==1)
013A 8C2D mov R24,R12
013C 8130 cpi R24,1
013E 21F4 brne L18
0140 ; T1.type = 1;
0140 81E0 ldi R24,1
0142 80932000 sts _T1+2,R24
0146 03C0 xjmp L19
0148 L18:
0148 ; else
0148 ; T1.type = 0;
0148 2224 clr R2
014A 20922000 sts _T1+2,R2
014E L19:
014E ; T1.ticks = count;
014E 1501 movw R2,R10
0150 4424 clr R4
0152 5524 clr R5
0154 30922200 sts _T1+3+1,R3
0158 20922100 sts _T1+3,R2
015C 50922400 sts _T1+3+2+1,R5
0160 40922300 sts _T1+3+2,R4
0164 ; T1.tickleft = count;
0164 4424 clr R4
0166 5524 clr R5
0168 30922600 sts _T1+7+1,R3
016C 20922500 sts _T1+7,R2
0170 50922800 sts _T1+7+2+1,R5
0174 40922700 sts _T1+7+2,R4
0178 ; if (T1.tickleft > 9000)
0178 48E2 ldi R20,40
017A 53E2 ldi R21,35
017C 60E0 ldi R22,0
017E 70E0 ldi R23,0
0180 40902700 lds R4,_T1+7+2
0184 50902800 lds R5,_T1+7+2+1
0188 20902500 lds R2,_T1+7
018C 30902600 lds R3,_T1+7+1
0190 4215 cp R20,R2
0192 5305 cpc R21,R3
0194 6405 cpc R22,R4
0196 7505 cpc R23,R5
0198 A0F4 brsh L24
019A ; {
019A ;
019A ; T1.tickleft -= 9000;
019A 48E2 ldi R20,40
019C 53E2 ldi R21,35
019E 60E0 ldi R22,0
01A0 70E0 ldi R23,0
01A2 241A sub R2,R20
01A4 350A sbc R3,R21
01A6 460A sbc R4,R22
01A8 570A sbc R5,R23
01AA 30922600 sts _T1+7+1,R3
01AE 20922500 sts _T1+7,R2
01B2 50922800 sts _T1+7+2+1,R5
01B6 40922700 sts _T1+7+2,R4
01BA ; TCNT1H = 0x0; //setup
01BA 2224 clr R2
01BC 2DBC out 0x2d,R2
01BE ; TCNT1L = 0x0;
01BE 2CBC out 0x2c,R2
01C0 ; }
01C0 45C0 xjmp L25
01C2 L24:
01C2 ; else
01C2 ; {
01C2 ;
01C2 ; t_count = T1.tickleft*72/10 -1;
01C2 40902700 lds R4,_T1+7+2
01C6 50902800 lds R5,_T1+7+2+1
01CA 20902500 lds R2,_T1+7
01CE 30902600 lds R3,_T1+7+1
01D2 48E4 ldi R20,72
01D4 50E0 ldi R21,0
01D6 60E0 ldi R22,0
01D8 70E0 ldi R23,0
01DA 5A92 st -y,R5
01DC 4A92 st -y,R4
01DE 3A92 st -y,R3
01E0 2A92 st -y,R2
01E2 8A01 movw R16,R20
01E4 9B01 movw R18,R22
01E6 0E940000 xcall empy32u
01EA 4AE0 ldi R20,10
01EC 50E0 ldi R21,0
01EE 60E0 ldi R22,0
01F0 70E0 ldi R23,0
01F2 7A93 st -y,R23
01F4 6A93 st -y,R22
01F6 5A93 st -y,R21
01F8 4A93 st -y,R20
01FA 0E940000 xcall div32u
01FE 1801 movw R2,R16
0200 2901 movw R4,R18
0202 41E0 ldi R20,1
0204 50E0 ldi R21,0
0206 60E0 ldi R22,0
0208 70E0 ldi R23,0
020A 241A sub R2,R20
020C 350A sbc R3,R21
020E 460A sbc R4,R22
0210 570A sbc R5,R23
0212 5101 movw R10,R2
0214 ; T1.tickleft =0;
0214 40E0 ldi R20,0
0216 50E0 ldi R21,0
0218 60E0 ldi R22,0
021A 70E0 ldi R23,0
021C 50932600 sts _T1+7+1,R21
0220 40932500 sts _T1+7,R20
0224 70932800 sts _T1+7+2+1,R23
0228 60932700 sts _T1+7+2,R22
022C ;
022C ; TCNT1H = 0xff - ((t_count>>8) & 0xff); //setup
022C C101 movw R24,R2
022E 892F mov R24,R25
0230 9927 clr R25
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 EDBD out 0x2d,R30
023E ; TCNT1L = 0xff - (t_count & 0xff);
023E C101 movw R24,R2
0240 9070 andi R25,0
0242 EFEF ldi R30,255
0244 F0E0 ldi R31,0
0246 E81B sub R30,R24
0248 F90B sbc R31,R25
024A ECBD out 0x2c,R30
024C ; }
024C L25:
024C ;
024C ; TCCR1B = 0x05; //1024分频
024C 85E0 ldi R24,5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -