📄 countermeter.lst
字号:
230:countermeter.c **** //设置PORTB为输出高电平
231:countermeter.c **** DDRB = 0XFF;
678 .LM61:
679 033e 8FEF ldi r24,lo8(-1)
680 0340 8093 3700 sts 55,r24
232:countermeter.c **** PORTB = 0XFF;
682 .LM62:
683 0344 8FEF ldi r24,lo8(-1)
684 0346 8093 3800 sts 56,r24
233:countermeter.c **** //设置PORTD为输出高电平
234:countermeter.c **** DDRD = 0XFF;
686 .LM63:
687 034a 8FEF ldi r24,lo8(-1)
688 034c 8093 3100 sts 49,r24
235:countermeter.c **** PORTD = 0XFF;
690 .LM64:
691 0350 8FEF ldi r24,lo8(-1)
692 0352 8093 3200 sts 50,r24
236:countermeter.c ****
237:countermeter.c **** //设置定时器T0
238:countermeter.c **** // 计数时钟为晶振频率64分频 周期为 = 1/(4000000/64 )-> 16 uS
239:countermeter.c **** TCCR0 = (1<<CS01)|(1<<CS00); //0x03;//
694 .LM65:
695 0356 83E0 ldi r24,lo8(3)
696 0358 8093 5300 sts 83,r24
240:countermeter.c **** //使能定时器T0溢出中断
241:countermeter.c **** TIMSK |= (1<<TOIE0);
698 .LM66:
699 035c 8091 5900 lds r24,89
700 0360 8160 ori r24,lo8(1)
701 0362 8093 5900 sts 89,r24
242:countermeter.c **** //使能全局中断
243:countermeter.c **** sei();
703 .LM67:
704 /* #APP */
705 0366 7894 sei
244:countermeter.c ****
245:countermeter.c ****
246:countermeter.c **** /* 输出比较寄存器初值在 fclk/8 (500 kHz, 2 uS) 下的门控值:
247:countermeter.c ****
248:countermeter.c **** 500 = 1 mS
249:countermeter.c **** 5000 = 10 mS
250:countermeter.c **** 50000 = 100 mS
251:countermeter.c ****
252:countermeter.c **** 在 fclk/256 (15.625 kHz, 64 uS) :下的门控值:
253:countermeter.c ****
254:countermeter.c **** 15625 = 1 S
255:countermeter.c **** */
256:countermeter.c **** // 清零16位计数器T1
257:countermeter.c **** TCNT1H = 0;
707 .LM68:
708 /* #NOAPP */
709 0368 1092 4D00 sts 77,__zero_reg__
258:countermeter.c **** TCNT1L = 0;
711 .LM69:
712 036c 1092 4C00 sts 76,__zero_reg__
259:countermeter.c **** // 设置输出比较寄存器初值为 200
260:countermeter.c **** OCR1AH = 0;
714 .LM70:
715 0370 1092 4B00 sts 75,__zero_reg__
261:countermeter.c **** OCR1AL = 200;
717 .LM71:
718 0374 88EC ldi r24,lo8(-56)
719 0376 8093 4A00 sts 74,r24
262:countermeter.c **** //比较匹配时置位 OC1A/OC1B ( 输出高电平)
263:countermeter.c **** TCCR1A = (1<<COM1A1)|(1<<COM1A0); //0xC0;//
721 .LM72:
722 037a 80EC ldi r24,lo8(-64)
723 037c 8093 4F00 sts 79,r24
264:countermeter.c **** //启动定时器T1
265:countermeter.c **** TCCR1B = (1<<CS10); //0x01;//
725 .LM73:
726 0380 81E0 ldi r24,lo8(1)
727 0382 8093 4E00 sts 78,r24
728 .L18:
266:countermeter.c ****
267:countermeter.c **** //等待比较匹配标志位置位
268:countermeter.c **** while ( ! (unsigned char) ( TIFR & (1<<OCF1A)) );
730 .LM74:
731 0386 8091 5800 lds r24,88
732 038a 9927 clr r25
733 038c 9295 swap r25
734 038e 8295 swap r24
735 0390 8F70 andi r24,0x0f
736 0392 8927 eor r24,r25
737 0394 9F70 andi r25,0x0f
738 0396 8927 eor r24,r25
739 0398 8170 andi r24,lo8(1)
740 039a 9070 andi r25,hi8(1)
741 039c 0097 sbiw r24,0
742 039e 09F4 brne .L19
743 03a0 F2CF rjmp .L18
744 .L19:
269:countermeter.c **** //清楚标志
270:countermeter.c **** TIFR |= (1<< OCF1A);
746 .LM75:
747 03a2 8091 5800 lds r24,88
748 03a6 8061 ori r24,lo8(16)
749 03a8 8093 5800 sts 88,r24
271:countermeter.c **** //定时器T1停止计数
272:countermeter.c **** TCCR1B = 0;
751 .LM76:
752 03ac 1092 4E00 sts 78,__zero_reg__
753 .L20:
273:countermeter.c **** // compare bit no HI, start
274:countermeter.c **** // doing some useful work
275:countermeter.c **** while (1)
276:countermeter.c **** {
277:countermeter.c **** //用最小的门控尝试
278:countermeter.c **** capture(500); // 1 mS
755 .LM77:
756 03b0 84EF ldi r24,lo8(500)
757 03b2 91E0 ldi r25,hi8(500)
758 03b4 0E94 0000 call capture
279:countermeter.c **** //读取计数值
280:countermeter.c **** count = read_counters();
760 .LM78:
761 03b8 0E94 0000 call read_counters
762 03bc 8B87 std Y+11,r24
763 03be 9C87 std Y+12,r25
281:countermeter.c **** dp = 3; // 小数点位置
765 .LM79:
766 03c0 83E0 ldi r24,lo8(3)
767 03c2 8D83 std Y+5,r24
282:countermeter.c **** ms = 2; // 频率单位 MHz
769 .LM80:
770 03c4 82E0 ldi r24,lo8(2)
771 03c6 8E83 std Y+6,r24
283:countermeter.c ****
284:countermeter.c **** if (count < 4096) // 小于 4.096 MHz
773 .LM81:
774 03c8 8B85 ldd r24,Y+11
775 03ca 9C85 ldd r25,Y+12
776 03cc 20E1 ldi r18,hi8(4096)
777 03ce 8030 cpi r24,lo8(4096)
778 03d0 9207 cpc r25,r18
779 03d2 70F5 brsh .L22
285:countermeter.c **** {
286:countermeter.c **** //尝试下一个门控值
287:countermeter.c **** capture(5000); // 10 mS
781 .LM82:
782 03d4 88E8 ldi r24,lo8(5000)
783 03d6 93E1 ldi r25,hi8(5000)
784 03d8 0E94 0000 call capture
288:countermeter.c **** //读取计数值
289:countermeter.c **** count = read_counters();
786 .LM83:
787 03dc 0E94 0000 call read_counters
788 03e0 8B87 std Y+11,r24
789 03e2 9C87 std Y+12,r25
290:countermeter.c **** dp = 4; // 小数点位置
791 .LM84:
792 03e4 84E0 ldi r24,lo8(4)
793 03e6 8D83 std Y+5,r24
291:countermeter.c **** ms = 2; // 频率单位 MHz
795 .LM85:
796 03e8 82E0 ldi r24,lo8(2)
797 03ea 8E83 std Y+6,r24
292:countermeter.c ****
293:countermeter.c **** if (count < 4096) // 小于 409.6 kHz
799 .LM86:
800 03ec 8B85 ldd r24,Y+11
801 03ee 9C85 ldd r25,Y+12
802 03f0 20E1 ldi r18,hi8(4096)
803 03f2 8030 cpi r24,lo8(4096)
804 03f4 9207 cpc r25,r18
805 03f6 E0F4 brsh .L22
294:countermeter.c **** {
295:countermeter.c **** // 尝试下一个门控值
296:countermeter.c **** capture(50000); // 100 mS
807 .LM87:
808 03f8 80E5 ldi r24,lo8(-15536)
809 03fa 93EC ldi r25,hi8(-15536)
810 03fc 0E94 0000 call capture
297:countermeter.c **** //读取计数值
298:countermeter.c **** count = read_counters();
812 .LM88:
813 0400 0E94 0000 call read_counters
814 0404 8B87 std Y+11,r24
815 0406 9C87 std Y+12,r25
299:countermeter.c **** dp = 2; // 小数点位置
817 .LM89:
818 0408 82E0 ldi r24,lo8(2)
819 040a 8D83 std Y+5,r24
300:countermeter.c **** ms = 1; // 频率单位 kHz
821 .LM90:
822 040c 81E0 ldi r24,lo8(1)
823 040e 8E83 std Y+6,r24
301:countermeter.c ****
302:countermeter.c **** if (count < 4096) // 小于 40.96 kHz
825 .LM91:
826 0410 8B85 ldd r24,Y+11
827 0412 9C85 ldd r25,Y+12
828 0414 20E1 ldi r18,hi8(4096)
829 0416 8030 cpi r24,lo8(4096)
830 0418 9207 cpc r25,r18
831 041a 50F4 brsh .L22
303:countermeter.c **** {
304:countermeter.c **** // 尝试下一个门控值
305:countermeter.c **** capture(15625); // 1 S
833 .LM92:
834 041c 89E0 ldi r24,lo8(15625)
835 041e 9DE3 ldi r25,hi8(15625)
836 0420 0E94 0000 call capture
306:countermeter.c **** // 读取计数值
307:countermeter.c **** count = read_counters();
838 .LM93:
839 0424 0E94 0000 call read_counters
840 0428 8B87 std Y+11,r24
841 042a 9C87 std Y+12,r25
308:countermeter.c **** dp = 0; // 小数点位置
843 .LM94:
844 042c 1D82 std Y+5,__zero_reg__
309:countermeter.c **** ms = 0; // 频率单位 Hz
846 .LM95:
847 042e 1E82 std Y+6,__zero_reg__
848 .L22:
310:countermeter.c **** }
311:countermeter.c **** }
312:countermeter.c **** }
313:countermeter.c ****
314:countermeter.c **** //将二进制16位计数值转换位BCD码
315:countermeter.c **** lv = 0;
850 .LM96:
851 0430 1F82 std Y+7,__zero_reg__
852 0432 1886 std Y+8,__zero_reg__
853 0434 1986 std Y+9,__zero_reg__
854 0436 1A86 std Y+10,__zero_reg__
316:countermeter.c **** for (j=0;j<8;j++)
856 .LM97:
857 0438 1B82 std Y+3,__zero_reg__
858 043a 1C82 std Y+4,__zero_reg__
859 .L25:
860 043c 8B81 ldd r24,Y+3
861 043e 9C81 ldd r25,Y+4
862 0440 8830 cpi r24,8
863 0442 9105 cpc r25,__zero_reg__
864 0444 0CF0 brlt .+2
865 0446 46C0 rjmp .L26
317:countermeter.c **** {
318:countermeter.c **** i = count % 10;
867 .LM98:
868 0448 8B85 ldd r24,Y+11
869 044a 9C85 ldd r25,Y+12
870 044c 2AE0 ldi r18,lo8(10)
871 044e 30E0 ldi r19,hi8(10)
872 0450 B901 movw r22,r18
873 0452 0E94 0000 call __udivmodhi4
874 0456 8983 std Y+1,r24
875 0458 9A83 std Y+2,r25
319:countermeter.c **** lv >>= 4;
877 .LM99:
878 045a 8F81 ldd r24,Y+7
879 045c 9885 ldd r25,Y+8
880 045e A985 ldd r26,Y+9
881 0460 BA85 ldd r27,Y+10
882 0462 6894 set
883 0464 13F8 bld __zero_reg__,4-1
884 0466 B695 1: lsr r27
885 0468 A795 ror r26
886 046a 9795 ror r25
887 046c 8795 ror r24
888 046e 1694 lsr __zero_reg__
889 0470 D1F7 brne 1b
890 0472 8F83 std Y+7,r24
891 0474 9887 std Y+8,r25
892 0476 A987 std Y+9,r26
893 0478 BA87 std Y+10,r27
320:countermeter.c **** lv |= ((unsigned long)i << 28);
895 .LM100:
896 047a 8981 ldd r24,Y+1
897 047c 9A81 ldd r25,Y+2
898 047e AA27 clr r26
899 0480 97FD sbrc r25,7
900 0482 A095 com r26
901 0484 BA2F mov r27,r26
902 0486 9C01 movw r18,r24
903 0488 AD01 movw r20,r26
904 048a 012E mov r0,r17
905 048c 1CE1 ldi r17,28
906 048e 220F 1: lsl r18
907 0490 331F rol r19
908 0492 441F rol r20
909 0494 551F rol r21
910 0496 1A95 dec r17
911 0498 D1F7 brne 1b
912 049a 102D mov r17,r0
913 049c 8F81 ldd r24,Y+7
914 049e 9885 ldd r25,Y+8
915 04a0 A985 ldd r26,Y+9
916 04a2 BA85 ldd r27,Y+10
917 04a4 822B or r24,r18
918 04a6 932B or r25,r19
919 04a8 A42B or r26,r20
920 04aa B52B or r27,r21
921 04ac 8F83 std Y+7,r24
922 04ae 9887 std Y+8,r25
923 04b0 A987 std Y+9,r26
924 04b2 BA87 std Y+10,r27
321:countermeter.c **** count /= 10;
926 .LM101:
927 04b4 8B85 ldd r24,Y+11
928 04b6 9C85 ldd r25,Y+12
929 04b8 2AE0 ldi r18,lo8(10)
930 04ba 30E0 ldi r19,hi8(10)
931 04bc B901 movw r22,r18
932 04be 0E94 0000 call __udivmodhi4
933 04c2 CB01 movw r24,r22
934 04c4 8B87 std Y+11,r24
935 04c6 9C87 std Y+12,r25
937 .LM102:
938 04c8 8B81 ldd r24,Y+3
939 04ca 9C81 ldd r25,Y+4
940 04cc 0196 adiw r24,1
941 04ce 8B83 std Y+3,r24
942 04d0 9C83 std Y+4,r25
943 04d2 B4CF rjmp .L25
944 .L26:
322:countermeter.c **** }
323:countermeter.c ****
324:countermeter.c **** //设置显示参数
325:countermeter.c **** decimal_point = dp;
946 .LM103:
947 04d4 8D81 ldd r24,Y+5
948 04d6 8093 0000 sts decimal_point,r24
326:countermeter.c **** mode_setting = ms;
950 .LM104:
951 04da 8E81 ldd r24,Y+6
952 04dc 8093 0000 sts mode_setting,r24
327:countermeter.c **** led_value = lv;
954 .LM105:
955 04e0 8F81 ldd r24,Y+7
956 04e2 9885 ldd r25,Y+8
957 04e4 A985 ldd r26,Y+9
958 04e6 BA85 ldd r27,Y+10
959 04e8 8093 0000 sts led_value,r24
960 04ec 9093 0000 sts (led_value)+1,r25
961 04f0 A093 0000 sts (led_value)+2,r26
962 04f4 B093 0000 sts (led_value)+3,r27
963 04f8 5BCF rjmp .L20
964 /* epilogue: frame size=12 */
965 /* epilogue: noreturn */
966 /* epilogue end (size=0) */
967 /* function main size 233 (229) */
977 .Lscope4:
983 .text
985 Letext:
986 /* File "countermeter.c": code 648 = 0x0288 ( 540), prologues 58, epilogues 50 */
DEFINED SYMBOLS
*ABS*:00000000 countermeter.c
*ABS*:0000003f __SREG__
*ABS*:0000003e __SP_H__
*ABS*:0000003d __SP_L__
*ABS*:00000000 __tmp_reg__
*ABS*:00000001 __zero_reg__
C:\DOCUME~1\machao\LOCALS~1\Temp/cceYaaaa.s:74 .data:00000000 digits
C:\DOCUME~1\machao\LOCALS~1\Temp/cceYaaaa.s:93 .bss:00000000 active_led
C:\DOCUME~1\machao\LOCALS~1\Temp/cceYaaaa.s:99 .bss:00000001 led_value
C:\DOCUME~1\machao\LOCALS~1\Temp/cceYaaaa.s:105 .bss:00000005 decimal_point
C:\DOCUME~1\machao\LOCALS~1\Temp/cceYaaaa.s:111 .bss:00000006 mode_setting
C:\DOCUME~1\machao\LOCALS~1\Temp/cceYaaaa.s:117 .text:00000000 __vector_9
C:\DOCUME~1\machao\LOCALS~1\Temp/cceYaaaa.s:287 .text:00000126 delay
C:\DOCUME~1\machao\LOCALS~1\Temp/cceYaaaa.s:368 .text:00000198 read_counters
C:\DOCUME~1\machao\LOCALS~1\Temp/cceYaaaa.s:525 .text:00000260 capture
C:\DOCUME~1\machao\LOCALS~1\Temp/cceYaaaa.s:660 .text:0000032a main
C:\DOCUME~1\machao\LOCALS~1\Temp/cceYaaaa.s:985 .text:000004fa Letext
UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss
__divmodhi4
__udivmodhi4
__stack
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -