📄 main.lss
字号:
// 警告:类型不匹配的计算将导致意外的结果!
// 计算采样显示电压(伏)
tmp1 = (u32_t)sample_i;
5d2: 60 91 02 01 lds r22, 0x0102
5d6: 70 91 03 01 lds r23, 0x0103
tmp1 *= C_DIS_U;
5da: 88 27 eor r24, r24
5dc: 99 27 eor r25, r25
5de: 04 d4 rcall .+2056 ; 0xde8 <__floatsisf>
5e0: 2f e8 ldi r18, 0x8F ; 143
5e2: 3a e5 ldi r19, 0x5A ; 90
5e4: 40 ed ldi r20, 0xD0 ; 208
5e6: 55 e4 ldi r21, 0x45 ; 69
5e8: 76 d4 rcall .+2284 ; 0xed6 <__mulsf3>
5ea: e1 d3 rcall .+1986 ; 0xdae <__fixsfsi>
tmp1 /= C_SMP_U;
if (tmp1-C_DIS_U*0.1 >= 0){ //添加部分
5ec: 25 e4 ldi r18, 0x45 ; 69
5ee: 30 e2 ldi r19, 0x20 ; 32
5f0: 40 e0 ldi r20, 0x00 ; 0
5f2: 50 e0 ldi r21, 0x00 ; 0
5f4: ee d4 rcall .+2524 ; 0xfd2 <__udivmodsi4>
5f6: 57 fd sbrc r21, 7
5f8: b5 c0 rjmp .+362 ; 0x764 <proc_calculate+0x1b4>
5fa: ca 01 movw r24, r20
5fc: b9 01 movw r22, r18
5fe: f4 d3 rcall .+2024 ; 0xde8 <__floatsisf>
600: 29 ed ldi r18, 0xD9 ; 217
602: 3e ea ldi r19, 0xAE ; 174
604: 46 e2 ldi r20, 0x26 ; 38
606: 54 e4 ldi r21, 0x44 ; 68
608: 8f d3 rcall .+1822 ; 0xd28 <__subsf3>
60a: 7b 01 movw r14, r22
60c: 8c 01 movw r16, r24
60e: 20 e0 ldi r18, 0x00 ; 0
610: 30 e0 ldi r19, 0x00 ; 0
612: 40 e0 ldi r20, 0x00 ; 0
614: 50 e0 ldi r21, 0x00 ; 0
616: f5 d3 rcall .+2026 ; 0xe02 <__gesf2>
618: 87 fd sbrc r24, 7
61a: b7 c0 rjmp .+366 ; 0x78a <proc_calculate+0x1da>
tmp1 -= C_DIS_U*0.1;
61c: c8 01 movw r24, r16
61e: b7 01 movw r22, r14
620: c6 d3 rcall .+1932 ; 0xdae <__fixsfsi>
622: 5b 01 movw r10, r22
624: 6c 01 movw r12, r24
}
else {
tmp1 = 0 ;
} ////添加部分
disbuf.u = tmp1;
626: a0 92 1c 01 sts 0x011C, r10
62a: b0 92 1d 01 sts 0x011D, r11
62e: c0 92 1e 01 sts 0x011E, r12
632: d0 92 1f 01 sts 0x011F, r13
// 测试计算结果
//htobcd5(&bcd_buf[0], disbuf.u);
// 计算采样显示电流(千安)
tmp2 = (u32_t)sample_v;
636: 60 91 0c 01 lds r22, 0x010C
63a: 70 91 0d 01 lds r23, 0x010D
tmp2 *= C_DIS_I;
63e: 88 27 eor r24, r24
640: 99 27 eor r25, r25
642: d2 d3 rcall .+1956 ; 0xde8 <__floatsisf>
644: 28 eb ldi r18, 0xB8 ; 184
646: 36 ee ldi r19, 0xE6 ; 230
648: 4a e8 ldi r20, 0x8A ; 138
64a: 55 e4 ldi r21, 0x45 ; 69
64c: 44 d4 rcall .+2184 ; 0xed6 <__mulsf3>
64e: af d3 rcall .+1886 ; 0xdae <__fixsfsi>
tmp2 /= C_SMP_I;
if (tmp2-C_DIS_I*0.1 >= 0){ //添加部分
650: 26 eb ldi r18, 0xB6 ; 182
652: 30 e2 ldi r19, 0x20 ; 32
654: 40 e0 ldi r20, 0x00 ; 0
656: 50 e0 ldi r21, 0x00 ; 0
658: bc d4 rcall .+2424 ; 0xfd2 <__udivmodsi4>
65a: 57 fd sbrc r21, 7
65c: 9a c0 rjmp .+308 ; 0x792 <proc_calculate+0x1e2>
65e: ca 01 movw r24, r20
660: b9 01 movw r22, r18
662: c2 d3 rcall .+1924 ; 0xde8 <__floatsisf>
664: 23 ef ldi r18, 0xF3 ; 243
666: 3d e3 ldi r19, 0x3D ; 61
668: 4e ed ldi r20, 0xDE ; 222
66a: 53 e4 ldi r21, 0x43 ; 67
66c: 5d d3 rcall .+1722 ; 0xd28 <__subsf3>
66e: 7b 01 movw r14, r22
670: 8c 01 movw r16, r24
672: 20 e0 ldi r18, 0x00 ; 0
674: 30 e0 ldi r19, 0x00 ; 0
676: 40 e0 ldi r20, 0x00 ; 0
678: 50 e0 ldi r21, 0x00 ; 0
67a: c3 d3 rcall .+1926 ; 0xe02 <__gesf2>
67c: 87 fd sbrc r24, 7
67e: 9c c0 rjmp .+312 ; 0x7b8 <proc_calculate+0x208>
tmp2 -= C_DIS_I*0.1;
680: c8 01 movw r24, r16
682: b7 01 movw r22, r14
684: 94 d3 rcall .+1832 ; 0xdae <__fixsfsi>
686: 7b 01 movw r14, r22
688: 8c 01 movw r16, r24
68a: c6 01 movw r24, r12
68c: b5 01 movw r22, r10
68e: a8 01 movw r20, r16
690: 97 01 movw r18, r14
692: 6c d4 rcall .+2264 ; 0xf6c <__mulsi3>
694: 20 e1 ldi r18, 0x10 ; 16
696: 37 e2 ldi r19, 0x27 ; 39
698: 40 e0 ldi r20, 0x00 ; 0
69a: 50 e0 ldi r21, 0x00 ; 0
69c: 9a d4 rcall .+2356 ; 0xfd2 <__udivmodsi4>
}
else {
tmp2 = 0 ;
} ////添加部分
disbuf.i = tmp2;
69e: e0 92 20 01 sts 0x0120, r14
6a2: f0 92 21 01 sts 0x0121, r15
6a6: 00 93 22 01 sts 0x0122, r16
6aa: 10 93 23 01 sts 0x0123, r17
// 测试计算结果
//htobcd5(&bcd_buf[0], disbuf.i);
// 计算显示功率(兆瓦)
tmp3 = tmp1;
tmp3 *= tmp2;
tmp3 /= 10000;
disbuf.p = tmp3;
6ae: 20 93 24 01 sts 0x0124, r18
6b2: 30 93 25 01 sts 0x0125, r19
6b6: 40 93 26 01 sts 0x0126, r20
6ba: 50 93 27 01 sts 0x0127, r21
// 测试计算结果
//htobcd8(&bcd_buf[5], disbuf.p);
// 计算累加1小时内的功 (按秒计算)
disbuf.w += tmp3;
6be: 80 91 28 01 lds r24, 0x0128
6c2: 90 91 29 01 lds r25, 0x0129
6c6: a0 91 2a 01 lds r26, 0x012A
6ca: b0 91 2b 01 lds r27, 0x012B
6ce: 82 0f add r24, r18
6d0: 93 1f adc r25, r19
6d2: a4 1f adc r26, r20
6d4: b5 1f adc r27, r21
6d6: 80 93 28 01 sts 0x0128, r24
6da: 90 93 29 01 sts 0x0129, r25
6de: a0 93 2a 01 sts 0x012A, r26
6e2: b0 93 2b 01 sts 0x012B, r27
// 测试计算结果
// htobcd8(&bcd_buf[5], disbuf.w);
// 累计1小时的功
if (++disbuf.cnt_3600 > 3600) { // 1小时到,计算 MW*H 总和
6e6: 80 91 2c 01 lds r24, 0x012C
6ea: 90 91 2d 01 lds r25, 0x012D
6ee: 01 96 adiw r24, 0x01 ; 1
6f0: 90 93 2d 01 sts 0x012D, r25
6f4: 80 93 2c 01 sts 0x012C, r24
6f8: 81 51 subi r24, 0x11 ; 17
6fa: 9e 40 sbci r25, 0x0E ; 14
6fc: b0 f0 brcs .+44 ; 0x72a <proc_calculate+0x17a>
disbuf.cnt_3600 = 0; // 计数复位
6fe: 10 92 2d 01 sts 0x012D, r1
702: 10 92 2c 01 sts 0x012C, r1
proflag |= _BV(PRO_SAVE); // 启动保存进程
706: 90 91 01 01 lds r25, 0x0101
70a: 92 60 ori r25, 0x02 ; 2
70c: 90 93 01 01 sts 0x0101, r25
}
// 累计持续按键时间
if ((proflag & _BV(PRO_KEEP_KEY)) != 0) {
710: 94 ff sbrs r25, 4
712: 07 c0 rjmp .+14 ; 0x722 <proc_calculate+0x172>
if (--disbuf.cnt_down == 0) {
714: 80 91 2e 01 lds r24, 0x012E
718: 81 50 subi r24, 0x01 ; 1
71a: 80 93 2e 01 sts 0x012E, r24
71e: 88 23 and r24, r24
720: 39 f0 breq .+14 ; 0x730 <proc_calculate+0x180>
disbuf.cnt_down = 30;
disbuf.w = 0;
SUM_W = 0;
proflag |= _BV(PRO_SAVE);
}
}
proflag |= _BV(PRO_DISPLAY); // 启动显示进程
722: 94 60 ori r25, 0x04 ; 4
724: 90 93 01 01 sts 0x0101, r25
728: 4f c0 rjmp .+158 ; 0x7c8 <proc_calculate+0x218>
72a: 90 91 01 01 lds r25, 0x0101
72e: f0 cf rjmp .-32 ; 0x710 <proc_calculate+0x160>
730: 8e e1 ldi r24, 0x1E ; 30
732: 80 93 2e 01 sts 0x012E, r24
736: 10 92 28 01 sts 0x0128, r1
73a: 10 92 29 01 sts 0x0129, r1
73e: 10 92 2a 01 sts 0x012A, r1
742: 10 92 2b 01 sts 0x012B, r1
746: 10 92 31 01 sts 0x0131, r1
74a: 10 92 32 01 sts 0x0132, r1
74e: 10 92 33 01 sts 0x0133, r1
752: 10 92 34 01 sts 0x0134, r1
756: 92 60 ori r25, 0x02 ; 2
758: 90 93 01 01 sts 0x0101, r25
75c: 94 60 ori r25, 0x04 ; 4
75e: 90 93 01 01 sts 0x0101, r25
762: 32 c0 rjmp .+100 ; 0x7c8 <proc_calculate+0x218>
764: ca 01 movw r24, r20
766: b9 01 movw r22, r18
768: 61 70 andi r22, 0x01 ; 1
76a: 70 70 andi r23, 0x00 ; 0
76c: 80 70 andi r24, 0x00 ; 0
76e: 90 70 andi r25, 0x00 ; 0
770: 56 95 lsr r21
772: 47 95 ror r20
774: 37 95 ror r19
776: 27 95 ror r18
778: 62 2b or r22, r18
77a: 73 2b or r23, r19
77c: 84 2b or r24, r20
77e: 95 2b or r25, r21
780: 33 d3 rcall .+1638 ; 0xde8 <__floatsisf>
782: 9b 01 movw r18, r22
784: ac 01 movw r20, r24
786: d1 d2 rcall .+1442 ; 0xd2a <__addsf3>
788: 3b cf rjmp .-394 ; 0x600 <proc_calculate+0x50>
78a: aa 24 eor r10, r10
78c: bb 24 eor r11, r11
78e: 65 01 movw r12, r10
790: 4a cf rjmp .-364 ; 0x626 <proc_calculate+0x76>
792: ca 01 movw r24, r20
794: b9 01 movw r22, r18
796: 61 70 andi r22, 0x01 ; 1
798: 70 70 andi r23, 0x00 ; 0
79a: 80 70 andi r24, 0x00 ; 0
79c: 90 70 andi r25, 0x00 ; 0
79e: 56 95 lsr r21
7a0: 47 95 ror r20
7a2: 37 95 ror r19
7a4: 27 95 ror r18
7a6: 62 2b or r22, r18
7a8: 73 2b or r23, r19
7aa: 84 2b or r24, r20
7ac: 95 2b or r25, r21
7ae: 1c d3 rcall .+1592 ; 0xde8 <__floatsisf>
7b0: 9b 01 movw r18, r22
7b2: ac 01 movw r20, r24
7b4: ba d2 rcall .+1396 ; 0xd2a <__addsf3>
7b6: 56 cf rjmp .-340 ; 0x664 <proc_calculate+0xb4>
7b8: ee 24 eor r14, r14
7ba: ff 24 eor r15, r15
7bc: 87 01 movw r16, r14
7be: 20 e0 ldi r18, 0x00 ; 0
7c0: 30 e0 ldi r19, 0x00 ; 0
7c2: 40 e0 ldi r20, 0x00 ; 0
7c4: 50 e0 ldi r21, 0x00 ; 0
7c6: 6b cf rjmp .-298 ; 0x69e <proc_calculate+0xee>
7c8: 1f 91 pop r17
7ca: 0f 91 pop r16
7cc: ff 90 pop r15
7ce: ef 90 pop r14
7d0: df 90 pop r13
7d2: cf 90 pop r12
7d4: bf 90 pop r11
7d6: af 90 pop r10
7d8: 08 95 ret
000007da <proc_test_sample>:
return;
}
// ===========================================================================
void proc_save(void) {
struct EEPROM readsave;
u32_t tmp32;
u16_t tmp16;
u8_t tmp8;
if ((proflag & _BV(PRO_SAVE)) == 0) {
return;
}
cli();
tmp32 = disbuf.w + 1800; // 四舍五入;保证不至于永远丢“功”显示不出来的0.01~0.09
tmp32 /= 3600; // 由于显示电流小数点1位,电压小数点1位,功小数点1位,所以要再除10
SUM_W += tmp32; // 累加给总计
if (SUM_W > 99999999) { // “功”累计超过8位BCD码,就循环....
SUM_W -= 100000000;
}
disbuf.w = 0; // 清除1小时的记录(因为已经累加给总记录了)
disbuf.cnt_3600 = 0; // 计数复位
save.chksum = 0;
save.chksum = checksum(&save.sumw[0], 5); // 计算校验码
for (tmp16 = save.index; tmp16 < 511; tmp16 += 5) { // ATMEGA8 的 EEPROM = 512
// 3次读写失败就换块
for (tmp8 = 0; tmp8 < 3; tmp8++) {
eeprom_busy_wait();
eeprom_write_block(&save.sumw[0], (u8_t *)save.index, 5); // 写块数据
eeprom_busy_wait();
eeprom_read_block(&readsave.sumw[0], (u8_t *)save.index, 5); // 读刚写的块
if (checksum(&readsave.sumw[0], 5) == 0) { // 校验成功,写入正确
goto fin_save;
}
}
if (tmp8 == 3) { // 已经进行过3次操作并失败,换块!
save.index += 5; // 偏移 5 byte
eeprom_busy_wait();
eeprom_write_word((u16_t *)0, save.index); // 更新 index
}
}
// 所有块都写坏,报废!显示 "EEEEEEEE"
for (tmp8 = 5; tmp8 < 13; tmp8++) {
bcd_buf[tmp8] = 0x0e; // "E"
}
sei();
while (1); // 永远的停在这里!
fin_save: // 保存完成
eeprom_busy_wait();
sei();
proflag &= ~_BV(PRO_SAVE); // 清除该进程标志
return;
}
// ===========================================================================
void proc_key(void) {
u8_t tmp8;
if (read_key() == 0) { // 无键按下
proflag &= ~_BV(PRO_ONE_KEY); // 清除单次按键标志
proflag &= ~_BV(PRO_KEEP_KEY); // 清除持续按键标志
disbuf.cnt_down = 30; // 复位持续按键倒计数
return; // 退出
}
// 检查是否持续按键
if ((proflag & _BV(PRO_ONE_KEY)) != 0x00) { // 以前按过键,状态为连续按键状态
proflag |= _BV(PRO_KEEP_KEY);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -