📄 main.lss
字号:
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 + -