⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lss

📁 AVR红外遥控
💻 LSS
📖 第 1 页 / 共 5 页
字号:

  // 警告:类型不匹配的计算将导致意外的结果!


  // 计算采样显示电压(伏)
  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 + -