📄 countermeter.lss
字号:
310: 00 00 nop
//置清零为高
PORTA |= (1<<CLEAR);
312: 80 91 3b 00 lds r24, 0x003B
316: 80 64 ori r24, 0x40 ; 64
318: 80 93 3b 00 sts 0x003B, r24
//清计数值
TCNT1H = 0;
31c: 10 92 4d 00 sts 0x004D, r1
TCNT1L = 0;
320: 10 92 4c 00 sts 0x004C, r1
//设置输出比较寄存器为所需值
OCR1AH = compare >> 8;
324: 89 81 ldd r24, Y+1 ; 0x01
326: 9a 81 ldd r25, Y+2 ; 0x02
328: 89 2f mov r24, r25
32a: 99 27 eor r25, r25
32c: 80 93 4b 00 sts 0x004B, r24
OCR1AL = compare;
330: 89 81 ldd r24, Y+1 ; 0x01
332: 80 93 4a 00 sts 0x004A, r24
//比较匹配时OC1A/OC1B 电平取反
TCCR1A = (1<<COM1A0); //0x40;//
336: 80 e4 ldi r24, 0x40 ; 64
338: 80 93 4f 00 sts 0x004F, r24
//清比较匹配标志
TIFR |= (1<<OCF1A);
33c: 80 91 58 00 lds r24, 0x0058
340: 80 61 ori r24, 0x10 ; 16
342: 80 93 58 00 sts 0x0058, r24
if (compare == 15625)
346: 89 81 ldd r24, Y+1 ; 0x01
348: 9a 81 ldd r25, Y+2 ; 0x02
34a: 2d e3 ldi r18, 0x3D ; 61
34c: 89 30 cpi r24, 0x09 ; 9
34e: 92 07 cpc r25, r18
350: 21 f4 brne .+8 ; 0x35a
{
// start with fClk/256 (15625 Hz) and compare clear
TCCR1B = (1<<WGM12)|(1<< CS12); //0x0C;//
352: 8c e0 ldi r24, 0x0C ; 12
354: 80 93 4e 00 sts 0x004E, r24
358: 03 c0 rjmp .+6 ; 0x360
}
else
{
// start with fClk/8 (500 kHz) and compare clear
TCCR1B = (1<<WGM12)|(1<<CS11); //0x0A;//
35a: 8a e0 ldi r24, 0x0A ; 10
35c: 80 93 4e 00 sts 0x004E, r24
}
// wait for bit
while ( ! (unsigned char) ( TIFR & (1<< OCF1A)) );
360: 80 91 58 00 lds r24, 0x0058
364: 99 27 eor r25, r25
366: 92 95 swap r25
368: 82 95 swap r24
36a: 8f 70 andi r24, 0x0F ; 15
36c: 89 27 eor r24, r25
36e: 9f 70 andi r25, 0x0F ; 15
370: 89 27 eor r24, r25
372: 81 70 andi r24, 0x01 ; 1
374: 90 70 andi r25, 0x00 ; 0
376: 00 97 sbiw r24, 0x00 ; 0
378: 09 f4 brne .+2 ; 0x37c
37a: f2 cf rjmp .-28 ; 0x360
// clear flags
TIFR |= (1<<OCF1A);
37c: 80 91 58 00 lds r24, 0x0058
380: 80 61 ori r24, 0x10 ; 16
382: 80 93 58 00 sts 0x0058, r24
// counter input now enabled
// for the specified time
// wait again for bit
while ( ! (unsigned char) ( TIFR & (1<< OCF1A)) );
386: 80 91 58 00 lds r24, 0x0058
38a: 99 27 eor r25, r25
38c: 92 95 swap r25
38e: 82 95 swap r24
390: 8f 70 andi r24, 0x0F ; 15
392: 89 27 eor r24, r25
394: 9f 70 andi r25, 0x0F ; 15
396: 89 27 eor r24, r25
398: 81 70 andi r24, 0x01 ; 1
39a: 90 70 andi r25, 0x00 ; 0
39c: 00 97 sbiw r24, 0x00 ; 0
39e: 09 f4 brne .+2 ; 0x3a2
3a0: f2 cf rjmp .-28 ; 0x386
// stop timer
TCCR1B = 0;
3a2: 10 92 4e 00 sts 0x004E, r1
3a6: 22 96 adiw r28, 0x02 ; 2
3a8: 0f b6 in r0, 0x3f ; 63
3aa: f8 94 cli
3ac: de bf out 0x3e, r29 ; 62
3ae: 0f be out 0x3f, r0 ; 63
3b0: cd bf out 0x3d, r28 ; 61
3b2: df 91 pop r29
3b4: cf 91 pop r28
3b6: 08 95 ret
000003b8 <main>:
// counter input disabled
}
/****************************************************************************/
/* main *******************************************************************/
/****************************************************************************/
int main(void)
{
3b8: c3 e5 ldi r28, 0x53 ; 83
3ba: d4 e0 ldi r29, 0x04 ; 4
3bc: de bf out 0x3e, r29 ; 62
3be: cd bf out 0x3d, r28 ; 61
int i,j;
unsigned char dp,ms;
unsigned long lv;
unsigned int count;
//设置PORTA为输出高电平
DDRA = 0XFF;
3c0: 8f ef ldi r24, 0xFF ; 255
3c2: 80 93 3a 00 sts 0x003A, r24
PORTA = 0XFF;
3c6: 8f ef ldi r24, 0xFF ; 255
3c8: 80 93 3b 00 sts 0x003B, r24
//设置PORTB为输出高电平
DDRB = 0XFF;
3cc: 8f ef ldi r24, 0xFF ; 255
3ce: 80 93 37 00 sts 0x0037, r24
PORTB = 0XFF;
3d2: 8f ef ldi r24, 0xFF ; 255
3d4: 80 93 38 00 sts 0x0038, r24
//设置PORTD为输出高电平
DDRD = 0XFF;
3d8: 8f ef ldi r24, 0xFF ; 255
3da: 80 93 31 00 sts 0x0031, r24
PORTD = 0XFF;
3de: 8f ef ldi r24, 0xFF ; 255
3e0: 80 93 32 00 sts 0x0032, r24
//设置定时器T0
// 计数时钟为晶振频率64分频 周期为 = 1/(4000000/64 )-> 16 uS
TCCR0 = (1<<CS01)|(1<<CS00); //0x03;//
3e4: 83 e0 ldi r24, 0x03 ; 3
3e6: 80 93 53 00 sts 0x0053, r24
//使能定时器T0溢出中断
TIMSK |= (1<<TOIE0);
3ea: 80 91 59 00 lds r24, 0x0059
3ee: 81 60 ori r24, 0x01 ; 1
3f0: 80 93 59 00 sts 0x0059, r24
//使能全局中断
sei();
3f4: 78 94 sei
/* 输出比较寄存器初值在 fclk/8 (500 kHz, 2 uS) 下的门控值:
500 = 1 mS
5000 = 10 mS
50000 = 100 mS
在 fclk/256 (15.625 kHz, 64 uS) :下的门控值:
15625 = 1 S
*/
// 清零16位计数器T1
TCNT1H = 0;
3f6: 10 92 4d 00 sts 0x004D, r1
TCNT1L = 0;
3fa: 10 92 4c 00 sts 0x004C, r1
// 设置输出比较寄存器初值为 200
OCR1AH = 0;
3fe: 10 92 4b 00 sts 0x004B, r1
OCR1AL = 200;
402: 88 ec ldi r24, 0xC8 ; 200
404: 80 93 4a 00 sts 0x004A, r24
//比较匹配时置位 OC1A/OC1B ( 输出高电平)
TCCR1A = (1<<COM1A1)|(1<<COM1A0); //0xC0;//
408: 80 ec ldi r24, 0xC0 ; 192
40a: 80 93 4f 00 sts 0x004F, r24
//启动定时器T1
TCCR1B = (1<<CS10); //0x01;//
40e: 81 e0 ldi r24, 0x01 ; 1
410: 80 93 4e 00 sts 0x004E, r24
//等待比较匹配标志位置位
while ( ! (unsigned char) ( TIFR & (1<<OCF1A)) );
414: 80 91 58 00 lds r24, 0x0058
418: 99 27 eor r25, r25
41a: 92 95 swap r25
41c: 82 95 swap r24
41e: 8f 70 andi r24, 0x0F ; 15
420: 89 27 eor r24, r25
422: 9f 70 andi r25, 0x0F ; 15
424: 89 27 eor r24, r25
426: 81 70 andi r24, 0x01 ; 1
428: 90 70 andi r25, 0x00 ; 0
42a: 00 97 sbiw r24, 0x00 ; 0
42c: 09 f4 brne .+2 ; 0x430
42e: f2 cf rjmp .-28 ; 0x414
//清楚标志
TIFR |= (1<< OCF1A);
430: 80 91 58 00 lds r24, 0x0058
434: 80 61 ori r24, 0x10 ; 16
436: 80 93 58 00 sts 0x0058, r24
//定时器T1停止计数
TCCR1B = 0;
43a: 10 92 4e 00 sts 0x004E, r1
// compare bit no HI, start
// doing some useful work
while (1)
{
//用最小的门控尝试
capture(500); // 1 mS
43e: 84 ef ldi r24, 0xF4 ; 244
440: 91 e0 ldi r25, 0x01 ; 1
442: 0e 94 77 01 call 0x2ee
//读取计数值
count = read_counters();
446: 0e 94 13 01 call 0x226
44a: 8b 87 std Y+11, r24 ; 0x0b
44c: 9c 87 std Y+12, r25 ; 0x0c
dp = 3; // 小数点位置
44e: 83 e0 ldi r24, 0x03 ; 3
450: 8d 83 std Y+5, r24 ; 0x05
ms = 2; // 频率单位 MHz
452: 82 e0 ldi r24, 0x02 ; 2
454: 8e 83 std Y+6, r24 ; 0x06
if (count < 4096) // 小于 4.096 MHz
456: 8b 85 ldd r24, Y+11 ; 0x0b
458: 9c 85 ldd r25, Y+12 ; 0x0c
45a: 20 e1 ldi r18, 0x10 ; 16
45c: 80 30 cpi r24, 0x00 ; 0
45e: 92 07 cpc r25, r18
460: 70 f5 brcc .+92 ; 0x4be
{
//尝试下一个门控值
capture(5000); // 10 mS
462: 88 e8 ldi r24, 0x88 ; 136
464: 93 e1 ldi r25, 0x13 ; 19
466: 0e 94 77 01 call 0x2ee
//读取计数值
count = read_counters();
46a: 0e 94 13 01 call 0x226
46e: 8b 87 std Y+11, r24 ; 0x0b
470: 9c 87 std Y+12, r25 ; 0x0c
dp = 4; // 小数点位置
472: 84 e0 ldi r24, 0x04 ; 4
474: 8d 83 std Y+5, r24 ; 0x05
ms = 2; // 频率单位 MHz
476: 82 e0 ldi r24, 0x02 ; 2
478: 8e 83 std Y+6, r24 ; 0x06
if (count < 4096) // 小于 409.6 kHz
47a: 8b 85 ldd r24, Y+11 ; 0x0b
47c: 9c 85 ldd r25, Y+12 ; 0x0c
47e: 20 e1 ldi r18, 0x10 ; 16
480: 80 30 cpi r24, 0x00 ; 0
482: 92 07 cpc r25, r18
484: e0 f4 brcc .+56 ; 0x4be
{
// 尝试下一个门控值
capture(50000); // 100 mS
486: 80 e5 ldi r24, 0x50 ; 80
488: 93 ec ldi r25, 0xC3 ; 195
48a: 0e 94 77 01 call 0x2ee
//读取计数值
count = read_counters();
48e: 0e 94 13 01 call 0x226
492: 8b 87 std Y+11, r24 ; 0x0b
494: 9c 87 std Y+12, r25 ; 0x0c
dp = 2; // 小数点位置
496: 82 e0 ldi r24, 0x02 ; 2
498: 8d 83 std Y+5, r24 ; 0x05
ms = 1; // 频率单位 kHz
49a: 81 e0 ldi r24, 0x01 ; 1
49c: 8e 83 std Y+6, r24 ; 0x06
if (count < 4096) // 小于 40.96 kHz
49e: 8b 85 ldd r24, Y+11 ; 0x0b
4a0: 9c 85 ldd r25, Y+12 ; 0x0c
4a2: 20 e1 ldi r18, 0x10 ; 16
4a4: 80 30 cpi r24, 0x00 ; 0
4a6: 92 07 cpc r25, r18
4a8: 50 f4 brcc .+20 ; 0x4be
{
// 尝试下一个门控值
capture(15625); // 1 S
4aa: 89 e0 ldi r24, 0x09 ; 9
4ac: 9d e3 ldi r25, 0x3D ; 61
4ae: 0e 94 77 01 call 0x2ee
// 读取计数值
count = read_counters();
4b2: 0e 94 13 01 call 0x226
4b6: 8b 87 std Y+11, r24 ; 0x0b
4b8: 9c 87 std Y+12, r25 ; 0x0c
dp = 0; // 小数点位置
4ba: 1d 82 std Y+5, r1 ; 0x05
ms = 0; // 频率单位 Hz
4bc: 1e 82 std Y+6, r1 ; 0x06
}
}
}
//将二进制16位计数值转换位BCD码
lv = 0;
4be: 1f 82 std Y+7, r1 ; 0x07
4c0: 18 86 std Y+8, r1 ; 0x08
4c2: 19 86 std Y+9, r1 ; 0x09
4c4: 1a 86 std Y+10, r1 ; 0x0a
for (j=0;j<8;j++)
4c6: 1b 82 std Y+3, r1 ; 0x03
4c8: 1c 82 std Y+4, r1 ; 0x04
4ca: 8b 81 ldd r24, Y+3 ; 0x03
4cc: 9c 81 ldd r25, Y+4 ; 0x04
4ce: 88 30 cpi r24, 0x08 ; 8
4d0: 91 05 cpc r25, r1
4d2: 0c f0 brlt .+2 ; 0x4d6
4d4: 46 c0 rjmp .+140 ; 0x562
{
i = count % 10;
4d6: 8b 85 ldd r24, Y+11 ; 0x0b
4d8: 9c 85 ldd r25, Y+12 ; 0x0c
4da: 2a e0 ldi r18, 0x0A ; 10
4dc: 30 e0 ldi r19, 0x00 ; 0
4de: b9 01 movw r22, r18
4e0: 0e 94 c4 02 call 0x588
4e4: 89 83 std Y+1, r24 ; 0x01
4e6: 9a 83 std Y+2, r25 ; 0x02
lv >>= 4;
4e8: 8f 81 ldd r24, Y+7 ; 0x07
4ea: 98 85 ldd r25, Y+8 ; 0x08
4ec: a9 85 ldd r26, Y+9 ; 0x09
4ee: ba 85 ldd r27, Y+10 ; 0x0a
4f0: 68 94 set
4f2: 13 f8 bld r1, 3
4f4: b6 95 lsr r27
4f6: a7 95 ror r26
4f8: 97 95 ror r25
4fa: 87 95 ror r24
4fc: 16 94 lsr r1
4fe: d1 f7 brne .-12 ; 0x4f4
500: 8f 83 std Y+7, r24 ; 0x07
502: 98 87 std Y+8, r25 ; 0x08
504: a9 87 std Y+9, r26 ; 0x09
506: ba 87 std Y+10, r27 ; 0x0a
lv |= ((unsigned long)i << 28);
508: 89 81 ldd r24, Y+1 ; 0x01
50a: 9a 81 ldd r25, Y+2 ; 0x02
50c: aa 27 eor r26, r26
50e: 97 fd sbrc r25, 7
510: a0 95 com r26
512: ba 2f mov r27, r26
514: 9c 01 movw r18, r24
516: ad 01 movw r20, r26
518: 01 2e mov r0, r17
51a: 1c e1 ldi r17, 0x1C ; 28
51c: 22 0f add r18, r18
51e: 33 1f adc r19, r19
520: 44 1f adc r20, r20
522: 55 1f adc r21, r21
524: 1a 95 dec r17
526: d1 f7 brne .-12 ; 0x51c
528: 10 2d mov r17, r0
52a: 8f 81 ldd r24, Y+7 ; 0x07
52c: 98 85 ldd r25, Y+8 ; 0x08
52e: a9 85 ldd r26, Y+9 ; 0x09
530: ba 85 ldd r27, Y+10 ; 0x0a
532: 82 2b or r24, r18
534: 93 2b or r25, r19
536: a4 2b or r26, r20
538: b5 2b or r27, r21
53a: 8f 83 std Y+7, r24 ; 0x07
53c: 98 87 std Y+8, r25 ; 0x08
53e: a9 87 std Y+9, r26 ; 0x09
540: ba 87 std Y+10, r27 ; 0x0a
count /= 10;
542: 8b 85 ldd r24, Y+11 ; 0x0b
544: 9c 85 ldd r25, Y+12 ; 0x0c
546: 2a e0 ldi r18, 0x0A ; 10
548: 30 e0 ldi r19, 0x00 ; 0
54a: b9 01 movw r22, r18
54c: 0e 94 c4 02 call 0x588
550: cb 01 movw r24, r22
552: 8b 87 std Y+11, r24 ; 0x0b
554: 9c 87 std Y+12, r25 ; 0x0c
556: 8b 81 ldd r24, Y+3 ; 0x03
558: 9c 81 ldd r25, Y+4 ; 0x04
55a: 01 96 adiw r24, 0x01 ; 1
55c: 8b 83 std Y+3, r24 ; 0x03
55e: 9c 83 std Y+4, r25 ; 0x04
560: b4 cf rjmp .-152 ; 0x4ca
}
//设置显示参数
decimal_point = dp;
562: 8d 81 ldd r24, Y+5 ; 0x05
564: 80 93 73 00 sts 0x0073, r24
mode_setting = ms;
568: 8e 81 ldd r24, Y+6 ; 0x06
56a: 80 93 74 00 sts 0x0074, r24
led_value = lv;
56e: 8f 81 ldd r24, Y+7 ; 0x07
570: 98 85 ldd r25, Y+8 ; 0x08
572: a9 85 ldd r26, Y+9 ; 0x09
574: ba 85 ldd r27, Y+10 ; 0x0a
576: 80 93 6f 00 sts 0x006F, r24
57a: 90 93 70 00 sts 0x0070, r25
57e: a0 93 71 00 sts 0x0071, r26
582: b0 93 72 00 sts 0x0072, r27
586: 5b cf rjmp .-330 ; 0x43e
00000588 <__udivmodhi4>:
588: aa 1b sub r26, r26
58a: bb 1b sub r27, r27
58c: 51 e1 ldi r21, 0x11 ; 17
58e: 07 c0 rjmp .+14 ; 0x59e
00000590 <__udivmodhi4_loop>:
590: aa 1f adc r26, r26
592: bb 1f adc r27, r27
594: a6 17 cp r26, r22
596: b7 07 cpc r27, r23
598: 10 f0 brcs .+4 ; 0x59e
59a: a6 1b sub r26, r22
59c: b7 0b sbc r27, r23
0000059e <__udivmodhi4_ep>:
59e: 88 1f adc r24, r24
5a0: 99 1f adc r25, r25
5a2: 5a 95 dec r21
5a4: a9 f7 brne .-22 ; 0x590
5a6: 80 95 com r24
5a8: 90 95 com r25
5aa: bc 01 movw r22, r24
5ac: cd 01 movw r24, r26
5ae: 08 95 ret
000005b0 <__divmodhi4>:
5b0: 97 fb bst r25, 7
5b2: 09 2e mov r0, r25
5b4: 07 26 eor r0, r23
5b6: 0a d0 rcall .+20 ; 0x5cc
5b8: 77 fd sbrc r23, 7
5ba: 04 d0 rcall .+8 ; 0x5c4
5bc: e5 df rcall .-54 ; 0x588
5be: 06 d0 rcall .+12 ; 0x5cc
5c0: 00 20 and r0, r0
5c2: 1a f4 brpl .+6 ; 0x5ca
000005c4 <__divmodhi4_neg2>:
5c4: 70 95 com r23
5c6: 61 95 neg r22
5c8: 7f 4f sbci r23, 0xFF ; 255
000005ca <__divmodhi4_exit>:
5ca: 08 95 ret
000005cc <__divmodhi4_neg1>:
5cc: f6 f7 brtc .-4 ; 0x5ca
5ce: 90 95 com r25
5d0: 81 95 neg r24
5d2: 9f 4f sbci r25, 0xFF ; 255
5d4: 08 95 ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -