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

📄 main.lss

📁 DC Power 基于Mega8数控电源
💻 LSS
📖 第 1 页 / 共 5 页
字号:
     376:	85 e4       	ldi	r24, 0x45	; 69
     378:	90 e0       	ldi	r25, 0x00	; 0
     37a:	19 d2       	rcall	.+1074   	; 0x7ae <lcd_puts_p>
			lcd_gotoxy(0,1);
     37c:	80 e0       	ldi	r24, 0x00	; 0
     37e:	61 e0       	ldi	r22, 0x01	; 1
     380:	f8 d1       	rcall	.+1008   	; 0x772 <lcd_gotoxy>
			lcd_puts_P("tuxgraphics.org");
     382:	85 e3       	ldi	r24, 0x35	; 53
     384:	90 e0       	ldi	r25, 0x00	; 0
     386:	02 c0       	rjmp	.+4      	; 0x38c <check_buttons+0x106>
		}else{
			lcd_puts_P("already stored");
     388:	86 e2       	ldi	r24, 0x26	; 38
     38a:	90 e0       	ldi	r25, 0x00	; 0
     38c:	10 d2       	rcall	.+1056   	; 0x7ae <lcd_puts_p>
     38e:	88 ec       	ldi	r24, 0xC8	; 200
     390:	90 e0       	ldi	r25, 0x00	; 0
     392:	20 ec       	ldi	r18, 0xC0	; 192
     394:	33 e0       	ldi	r19, 0x03	; 3
     396:	f9 01       	movw	r30, r18
     398:	31 97       	sbiw	r30, 0x01	; 1
     39a:	f1 f7       	brne	.-4      	; 0x398 <check_buttons+0x112>
        // we use a calibrated macro. This is more
        // accurate and not so much compiler dependent
        // as self made code.
        while(ms){
                _delay_ms(0.96);
                ms--;
     39c:	01 97       	sbiw	r24, 0x01	; 1
/* delay for a minimum of <ms> */
{
        // we use a calibrated macro. This is more
        // accurate and not so much compiler dependent
        // as self made code.
        while(ms){
     39e:	d9 f7       	brne	.-10     	; 0x396 <check_buttons+0x110>
     3a0:	82 e0       	ldi	r24, 0x02	; 2
     3a2:	01 c0       	rjmp	.+2      	; 0x3a6 <check_buttons+0x120>
     3a4:	81 e0       	ldi	r24, 0x01	; 1
	if (check_store_button()){
		store_permanent();
		return(2);
	};
	return(0);
}
     3a6:	df 91       	pop	r29
     3a8:	cf 91       	pop	r28
     3aa:	1f 91       	pop	r17
     3ac:	0f 91       	pop	r16
     3ae:	08 95       	ret

000003b0 <main>:



int main(void)
{
     3b0:	af 92       	push	r10
     3b2:	bf 92       	push	r11
     3b4:	cf 92       	push	r12
     3b6:	df 92       	push	r13
     3b8:	ef 92       	push	r14
     3ba:	ff 92       	push	r15
     3bc:	0f 93       	push	r16
     3be:	1f 93       	push	r17
     3c0:	df 93       	push	r29
     3c2:	cf 93       	push	r28
     3c4:	cd b7       	in	r28, 0x3d	; 61
     3c6:	de b7       	in	r29, 0x3e	; 62
     3c8:	65 97       	sbiw	r28, 0x15	; 21
     3ca:	0f b6       	in	r0, 0x3f	; 63
     3cc:	f8 94       	cli
     3ce:	de bf       	out	0x3e, r29	; 62
     3d0:	0f be       	out	0x3f, r0	; 63
     3d2:	cd bf       	out	0x3d, r28	; 61
	char out_buf[20+1];
	measured_val[0]=0;
     3d4:	10 92 78 01 	sts	0x0178, r1
     3d8:	10 92 77 01 	sts	0x0177, r1
	measured_val[1]=0;
     3dc:	10 92 7a 01 	sts	0x017A, r1
     3e0:	10 92 79 01 	sts	0x0179, r1
	init_dac();
     3e4:	5b d2       	rcall	.+1206   	; 0x89c <init_dac>
	lcd_init(LCD_DISP_ON);
     3e6:	8c e0       	ldi	r24, 0x0C	; 12
     3e8:	ef d1       	rcall	.+990    	; 0x7c8 <lcd_init>
	init_kbd();
     3ea:	60 d2       	rcall	.+1216   	; 0x8ac <init_kbd>
	set_val[0]=15;set_val[1]=50; // 150mA and 5V
     3ec:	8f e0       	ldi	r24, 0x0F	; 15
     3ee:	90 e0       	ldi	r25, 0x00	; 0
     3f0:	90 93 74 01 	sts	0x0174, r25
     3f4:	80 93 73 01 	sts	0x0173, r24
     3f8:	82 e3       	ldi	r24, 0x32	; 50
     3fa:	90 e0       	ldi	r25, 0x00	; 0
     3fc:	90 93 76 01 	sts	0x0176, r25
     400:	80 93 75 01 	sts	0x0175, r24
/** \ingroup avr_eeprom
    Read one byte from EEPROM address \a __p.
 */
__ATTR_PURE__ static __inline__ uint8_t eeprom_read_byte (const uint8_t *__p)
{
    do {} while (!eeprom_is_ready ());
     404:	e1 99       	sbic	0x1c, 1	; 28
     406:	fe cf       	rjmp	.-4      	; 0x404 <main+0x54>
#if E2END <= 0xFF
    EEARL = (size_t)__p;
#else
    EEAR = (size_t)__p;
     408:	1f ba       	out	0x1f, r1	; 31
     40a:	1e ba       	out	0x1e, r1	; 30
    /* Use inline assembly below as some AVRs have problems with accessing
    EECR with STS instructions. For example, see errata for ATmega64. 
    The code below also assumes that EECR and EEDR are in the I/O space.
    */
    uint8_t __result;
    __asm__ __volatile__
     40c:	e0 9a       	sbi	0x1c, 0	; 28
     40e:	8d b3       	in	r24, 0x1d	; 29
	if (eeprom_read_byte((uint8_t *)0x0) == 19){
     410:	83 31       	cpi	r24, 0x13	; 19
     412:	91 f4       	brne	.+36     	; 0x438 <main+0x88>
    Read one 16-bit word (little endian) from EEPROM address \a __p.
 */
__ATTR_PURE__ static __inline__ uint16_t eeprom_read_word (const uint16_t *__p)
{
#if (! (defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__)) )
    return __eerd_word (__p, eeprom_read_byte);
     414:	84 e0       	ldi	r24, 0x04	; 4
     416:	90 e0       	ldi	r25, 0x00	; 0
     418:	6e e4       	ldi	r22, 0x4E	; 78
     41a:	70 e0       	ldi	r23, 0x00	; 0
     41c:	1f d9       	rcall	.-3522   	; 0xfffff65c <__eeprom_end+0xff7ef65c>
		// ok magic number matches accept values
		set_val[1]=eeprom_read_word((uint16_t *)0x04);
     41e:	90 93 76 01 	sts	0x0176, r25
     422:	80 93 75 01 	sts	0x0175, r24
     426:	82 e0       	ldi	r24, 0x02	; 2
     428:	90 e0       	ldi	r25, 0x00	; 0
     42a:	6e e4       	ldi	r22, 0x4E	; 78
     42c:	70 e0       	ldi	r23, 0x00	; 0
     42e:	16 d9       	rcall	.-3540   	; 0xfffff65c <__eeprom_end+0xff7ef65c>
		set_val[0]=eeprom_read_word((uint16_t *)0x02);
     430:	90 93 74 01 	sts	0x0174, r25
     434:	80 93 73 01 	sts	0x0173, r24
	}
	// I2C also called TWI, slave address=3
	//i2c_init(3,1,0);
	sei();
     438:	78 94       	sei
	//i2c_send_data("on");
	init_analog();
     43a:	93 d2       	rcall	.+1318   	; 0x962 <init_analog>
		set_val_adcUnits[1]=disp_u_to_adc(set_val[1])+disp_i_to_u_adc_offset(measured_val[0]);
		set_target_adc_val(1,set_val_adcUnits[1]);

		// voltage
		lcd_clrscr();
		int_to_ascii(measured_val[1],out_buf,1,1);
     43c:	6e 01       	movw	r12, r28
     43e:	08 94       	sec
     440:	c1 1c       	adc	r12, r1
     442:	d1 1c       	adc	r13, r1
     444:	e0 ec       	ldi	r30, 0xC0	; 192
     446:	ae 2e       	mov	r10, r30
     448:	e3 e0       	ldi	r30, 0x03	; 3
     44a:	be 2e       	mov	r11, r30
	//i2c_send_data("on");
	init_analog();
	while (1) {

		// current
		measured_val[0]=adc_i_to_disp(getanalogresult(0));
     44c:	80 e0       	ldi	r24, 0x00	; 0
     44e:	c0 d2       	rcall	.+1408   	; 0x9d0 <getanalogresult>
     450:	aa 27       	eor	r26, r26
     452:	97 fd       	sbrc	r25, 7
     454:	a0 95       	com	r26
     456:	ba 2f       	mov	r27, r26
     458:	bc 01       	movw	r22, r24
     45a:	cd 01       	movw	r24, r26
     45c:	b8 d6       	rcall	.+3440   	; 0x11ce <__floatsisf>
     45e:	2a e0       	ldi	r18, 0x0A	; 10
     460:	37 ed       	ldi	r19, 0xD7	; 215
     462:	43 e2       	ldi	r20, 0x23	; 35
     464:	50 e4       	ldi	r21, 0x40	; 64
     466:	17 d5       	rcall	.+2606   	; 0xe96 <__mulsf3>
     468:	24 e1       	ldi	r18, 0x14	; 20
     46a:	3e ea       	ldi	r19, 0xAE	; 174
     46c:	43 ea       	ldi	r20, 0xA3	; 163
     46e:	50 e4       	ldi	r21, 0x40	; 64
     470:	07 d6       	rcall	.+3086   	; 0x1080 <__divsf3>
     472:	2a e9       	ldi	r18, 0x9A	; 154
     474:	39 e9       	ldi	r19, 0x99	; 153
     476:	49 e1       	ldi	r20, 0x19	; 25
     478:	5f e3       	ldi	r21, 0x3F	; 63
     47a:	e6 d4       	rcall	.+2508   	; 0xe48 <__addsf3>
     47c:	02 d7       	rcall	.+3588   	; 0x1282 <__fixsfsi>
     47e:	70 93 78 01 	sts	0x0178, r23
     482:	60 93 77 01 	sts	0x0177, r22
	return((int)(((adcunits /102.3)* ADC_REF * U_DIVIDER)+0.6));
}
// convert adc values to current values, disp=10 needed to be printed
// by the printing function as 0.10 A
static int disp_i_to_adc(int disp){
	return((int) (((disp * 10.23)* I_RESISTOR) / ADC_REF));
     486:	60 91 73 01 	lds	r22, 0x0173
     48a:	70 91 74 01 	lds	r23, 0x0174
     48e:	88 27       	eor	r24, r24
     490:	77 fd       	sbrc	r23, 7
     492:	80 95       	com	r24
     494:	98 2f       	mov	r25, r24
     496:	9b d6       	rcall	.+3382   	; 0x11ce <__floatsisf>
     498:	24 e1       	ldi	r18, 0x14	; 20
     49a:	3e ea       	ldi	r19, 0xAE	; 174
     49c:	43 e2       	ldi	r20, 0x23	; 35
     49e:	51 e4       	ldi	r21, 0x41	; 65
     4a0:	fa d4       	rcall	.+2548   	; 0xe96 <__mulsf3>
     4a2:	20 e0       	ldi	r18, 0x00	; 0
     4a4:	30 e0       	ldi	r19, 0x00	; 0
     4a6:	40 e0       	ldi	r20, 0x00	; 0
     4a8:	5f e3       	ldi	r21, 0x3F	; 63
     4aa:	f5 d4       	rcall	.+2538   	; 0xe96 <__mulsf3>
     4ac:	2a e0       	ldi	r18, 0x0A	; 10
     4ae:	37 ed       	ldi	r19, 0xD7	; 215
     4b0:	43 e2       	ldi	r20, 0x23	; 35
     4b2:	50 e4       	ldi	r21, 0x40	; 64
     4b4:	e5 d5       	rcall	.+3018   	; 0x1080 <__divsf3>
     4b6:	e5 d6       	rcall	.+3530   	; 0x1282 <__fixsfsi>
     4b8:	9b 01       	movw	r18, r22
     4ba:	ac 01       	movw	r20, r24
	init_analog();
	while (1) {

		// current
		measured_val[0]=adc_i_to_disp(getanalogresult(0));
		set_val_adcUnits[0]=disp_i_to_adc(set_val[0]);
     4bc:	70 93 7c 01 	sts	0x017C, r23
     4c0:	60 93 7b 01 	sts	0x017B, r22
		set_target_adc_val(0,set_val_adcUnits[0]);
     4c4:	80 e0       	ldi	r24, 0x00	; 0
     4c6:	b9 01       	movw	r22, r18
     4c8:	7a d2       	rcall	.+1268   	; 0x9be <set_target_adc_val>
		// voltage
		measured_val[1]=adc_u_to_disp(getanalogresult(1),measured_val[0]);
     4ca:	81 e0       	ldi	r24, 0x01	; 1
     4cc:	81 d2       	rcall	.+1282   	; 0x9d0 <getanalogresult>
     4ce:	8c 01       	movw	r16, r24
	outbuf[i]='\0';
}

// convert voltage values to adc values, disp=10 is 1.0V
static int disp_u_to_adc(int disp){
	return((int)(disp * 102.3) / (ADC_REF * U_DIVIDER));
     4d0:	80 91 77 01 	lds	r24, 0x0177
     4d4:	90 91 78 01 	lds	r25, 0x0178
     4d8:	64 e1       	ldi	r22, 0x14	; 20
     4da:	70 e0       	ldi	r23, 0x00	; 0
     4dc:	ea d8       	rcall	.-3628   	; 0xfffff6b2 <__eeprom_end+0xff7ef6b2>
     4de:	88 27       	eor	r24, r24
     4e0:	77 fd       	sbrc	r23, 7
     4e2:	80 95       	com	r24
     4e4:	98 2f       	mov	r25, r24
     4e6:	73 d6       	rcall	.+3302   	; 0x11ce <__floatsisf>
     4e8:	2a e9       	ldi	r18, 0x9A	; 154
     4ea:	39 e9       	ldi	r19, 0x99	; 153
     4ec:	4c ec       	ldi	r20, 0xCC	; 204
     4ee:	52 e4       	ldi	r21, 0x42	; 66
     4f0:	d2 d4       	rcall	.+2468   	; 0xe96 <__mulsf3>
     4f2:	c7 d6       	rcall	.+3470   	; 0x1282 <__fixsfsi>
     4f4:	88 27       	eor	r24, r24
     4f6:	77 fd       	sbrc	r23, 7
     4f8:	80 95       	com	r24
     4fa:	98 2f       	mov	r25, r24
     4fc:	68 d6       	rcall	.+3280   	; 0x11ce <__floatsisf>
     4fe:	26 e6       	ldi	r18, 0x66	; 102
     500:	36 e6       	ldi	r19, 0x66	; 102
     502:	46 ee       	ldi	r20, 0xE6	; 230
     504:	51 e4       	ldi	r21, 0x41	; 65
     506:	bc d5       	rcall	.+2936   	; 0x1080 <__divsf3>
     508:	bc d6       	rcall	.+3448   	; 0x1282 <__fixsfsi>
     50a:	7b 01       	movw	r14, r22
// disp_i_val is needed to calculate the offset for the voltage drop over
// the current measurement shunt
static int adc_u_to_disp(int adcunits,int disp_i_val){
	int adcdrop;
	adcdrop=disp_i_to_u_adc_offset(disp_i_val);
	if (adcunits < adcdrop){
     50c:	06 17       	cp	r16, r22
     50e:	17 07       	cpc	r17, r23
     510:	1c f4       	brge	.+6      	; 0x518 <__stack+0xb9>
     512:	60 e0       	ldi	r22, 0x00	; 0
     514:	70 e0       	ldi	r23, 0x00	; 0
     516:	1d c0       	rjmp	.+58     	; 0x552 <__stack+0xf3>
		return(0);
	}
	adcunits=adcunits-adcdrop;
	return((int)(((adcunits /102.3)* ADC_REF * U_DIVIDER)+0.6));
     518:	06 1b       	sub	r16, r22
     51a:	17 0b       	sbc	r17, r23
     51c:	b8 01       	movw	r22, r16
     51e:	88 27       	eor	r24, r24
     520:	77 fd       	sbrc	r23, 7
     522:	80 95       	com	r24
     524:	98 2f       	mov	r25, r24
     526:	53 d6       	rcall	.+3238   	; 0x11ce <__floatsisf>
     528:	2a e9       	ldi	r18, 0x9A	; 154
     52a:	39 e9       	ldi	r19, 0x99	; 153
     52c:	4c ec       	ldi	r20, 0xCC	; 204
     52e:	52 e4       	ldi	r21, 0x42	; 66
     530:	a7 d5       	rcall	.+2894   	; 0x1080 <__divsf3>
     532:	2a e0       	ldi	r18, 0x0A	; 10
     534:	37 ed       	ldi	r19, 0xD7	; 215
     536:	43 e2       	ldi	r20, 0x23	; 35
     538:	50 e4       	ldi	r21, 0x40	; 64
     53a:	ad d4       	rcall	.+2394   	; 0xe96 <__mulsf3>
     53c:	20 e0       	ldi	r18, 0x00	; 0
     53e:	30 e0       	ldi	r19, 0x00	; 0
     540:	44 e3       	ldi	r20, 0x34	; 52
     542:	51 e4       	ldi	r21, 0x41	; 65
     544:	a8 d4       	rcall	.+2384   	; 0xe96 <__mulsf3>
     546:	2a e9       	ldi	r18, 0x9A	; 154
     548:	39 e9       	ldi	r19, 0x99	; 153
     54a:	49 e1       	ldi	r20, 0x19	; 25
     54c:	5f e3       	ldi	r21, 0x3F	; 63
     54e:	7c d4       	rcall	.+2296   	; 0xe48 <__addsf3>
     550:	98 d6       	rcall	.+3376   	; 0x1282 <__fixsfsi>
		// current
		measured_val[0]=adc_i_to_disp(getanalogresult(0));
		set_val_adcUnits[0]=disp_i_to_adc(set_val[0]);
		set_target_adc_val(0,set_val_adcUnits[0]);
		// voltage
		measured_val[1]=adc_u_to_disp(getanalogresult(1),measured_val[0]);
     552:	70 93 7a 01 	sts	0x017A, r23
     556:	60 93 79 01 	sts	0x0179, r22
		set_val_adcUnits[1]=disp_u_to_adc(set_val[1])+disp_i_to_u_adc_offset(measured_val[0]);
     55a:	60 91 75 01 	lds	r22, 0x0175
     55e:	70 91 76 01 	lds	r23, 0x0176
     562:	88 27       	eor	r24, r24
     564:	77 fd       	sbrc	r23, 7
     566:	80 95       	com	r24
     568:	98 2f       	mov	r25, r24
     56a:	31 d6       	rcall	.+3170   	; 0x11ce <__floatsisf>
     56c:	2a e9       	ldi	r18, 0x9A	; 154
     56e:	39 e9       	ldi	r19, 0x99	; 153
     570:	4c ec       	ldi	r20, 0xCC	; 204
     572:	52 e4       	ldi	r21, 0x42	; 66
     574:	90 d4       	rcall	.+2336   	; 0xe96 <__mulsf3>
     576:	85 d6       	rcall	.+3338   	; 0x1282 <__fixsfsi>
     578:	88 27       	eor	r24, r24
     57a:	77 fd       	sbrc	r23, 7
     57c:	80 95       	com	r24
     57e:	98 2f       	mov	r25, r24
     580:	26 d6       	rcall	.+3148   	; 0x11ce <__floatsisf>
     582:	26 e6       	ldi	r18, 0x66	; 102
     584:	36 e6       	ldi	r19, 0x66	; 102
     586:	46 ee       	ldi	r20, 0xE6	; 230
     588:	51 e4       	ldi	r21, 0x41	; 65
     58a:	7a d5       	rcall	.+2804   	; 0x1080 <__divsf3>
     58c:	7a d6       	rcall	.+3316   	; 0x1282 <__fixsfsi>
     58e:	9b 01       	movw	r18, r22

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -