VFD_Sinus_AT168.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .data 00000020 00800100 000013c0 00001474 2**0 CONTENTS, ALLOC, LOAD, DATA 1 .text 000013c0 00000000 00000000 000000b4 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE 2 .bss 0000001c 00800120 00800120 00001494 2**0 ALLOC 3 .eeprom 00000009 00810000 00810000 00001494 2**0 CONTENTS, ALLOC, LOAD, DATA 4 .comment 00000011 00000000 00000000 0000149d 2**0 CONTENTS, READONLY 5 .note.gnu.avr.deviceinfo 0000003c 00000000 00000000 000014b0 2**2 CONTENTS, READONLY 6 .debug_aranges 00000068 00000000 00000000 000014ec 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_info 00001f5b 00000000 00000000 00001554 2**0 CONTENTS, READONLY, DEBUGGING 8 .debug_abbrev 000007bf 00000000 00000000 000034af 2**0 CONTENTS, READONLY, DEBUGGING 9 .debug_line 00000c8c 00000000 00000000 00003c6e 2**0 CONTENTS, READONLY, DEBUGGING 10 .debug_frame 000003ec 00000000 00000000 000048fc 2**2 CONTENTS, READONLY, DEBUGGING 11 .debug_str 00000773 00000000 00000000 00004ce8 2**0 CONTENTS, READONLY, DEBUGGING 12 .debug_loc 0000128f 00000000 00000000 0000545b 2**0 CONTENTS, READONLY, DEBUGGING 13 .debug_ranges 00000060 00000000 00000000 000066ea 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 00000000 <__vectors>: 0: 0c 94 b8 01 jmp 0x370 ; 0x370 <__ctors_end> 4: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 8: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> c: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 10: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 14: 0c 94 cc 04 jmp 0x998 ; 0x998 <__vector_5> 18: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 1c: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 20: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 24: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 28: 0c 94 fc 04 jmp 0x9f8 ; 0x9f8 <__vector_10> 2c: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 30: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 34: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 38: 0c 94 fb 04 jmp 0x9f6 ; 0x9f6 <__vector_14> 3c: 0c 94 fb 04 jmp 0x9f6 ; 0x9f6 <__vector_14> 40: 0c 94 fa 04 jmp 0x9f4 ; 0x9f4 <__vector_16> 44: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 48: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 4c: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 50: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 54: 0c 94 23 06 jmp 0xc46 ; 0xc46 <__vector_21> 58: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 5c: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 60: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 64: 0c 94 d5 01 jmp 0x3aa ; 0x3aa <__bad_interrupt> 00000068 <__trampolines_end>: 68: 46 72 andi r20, 0x26 ; 38 6a: 65 71 andi r22, 0x15 ; 21 6c: 20 20 and r2, r0 6e: 56 2f mov r21, r22 70: 48 7a andi r20, 0xA8 ; 168 72: 20 20 and r2, r0 74: 41 6d ori r20, 0xD1 ; 209 76: 70 20 and r7, r0 ... 00000079 <__c.2352>: 79: 50 20 20 20 49 20 20 20 44 20 20 20 20 44 54 20 P I D DT ... 0000008a <__c.2284>: 8a: 52 65 61 64 20 44 6f 6e 65 20 20 20 20 20 20 20 Read Done ... 0000009b <__c.2282>: 9b: 52 65 61 64 69 6e 67 20 45 45 50 52 4f 4d 20 20 Reading EEPROM ... 000000ac <__c.2425>: ac: 46 72 65 71 20 20 56 2f 48 7a 20 20 41 6d 70 20 Freq V/Hz Amp ... 000000bd <__c.2423>: bd: 56 46 20 4d 6f 74 6f 72 20 44 72 69 76 65 0a 00 VF Motor Drive.. 000000cd <__c.2337>: cd: 53 74 6f 72 65 64 20 20 20 20 20 20 20 20 20 20 Stored ... 000000de <__c.2321>: de: 53 74 6f 72 69 6e 67 20 45 45 50 52 4f 4d 20 20 Storing EEPROM ... 000000ef <EndofFile>: ef: 45 6e 64 65 20 64 65 72 20 46 61 68 6e 65 6e 73 Ende der Fahnens ff: 74 61 6e 67 65 00 tange. 00000105 <VersionandCopyright>: 105: 31 2e 31 20 28 63 29 32 30 30 39 2d 32 30 31 37 1.1 (c)2009-2017 115: 20 6d 61 74 7a 65 74 72 6f 6e 69 63 73 00 00 00 matzetronics... 125: 00 00 00 00 .... 00000129 <cursorpos>: 129: 00 06 .. 0000012b <cursorextpos>: 12b: 00 04 08 0d .... 0000012f <sineTable>: 12f: 00 00 dd 08 00 e1 11 00 e5 19 00 e8 21 00 ec 2a ............!..* 13f: 00 ef 32 00 f1 3a 00 f4 42 00 f6 4a 00 f8 52 00 ..2..:..B..J..R. 14f: fa 5a 00 fc 62 00 fd 69 00 fe 71 00 fe 78 00 ff .Z..b..i..q..x.. 15f: 80 00 ff 87 00 ff 8e 00 fe 95 00 fe 9b 00 fd a2 ................ 16f: 00 fc a8 00 fa ae 00 f8 b4 00 f6 ba 00 f4 c0 00 ................ 17f: f1 c5 00 ef ca 00 ec cf 00 e8 d4 00 e5 d9 00 e1 ................ 18f: dd 00 dd e1 00 d9 e5 00 d4 e8 00 cf ec 00 ca ef ................ 19f: 00 c5 f1 00 c0 f4 00 ba f6 00 b4 f8 00 ae fa 00 ................ 1af: a8 fc 00 a2 fd 00 9b fe 00 95 fe 00 8e ff 00 87 ................ 1bf: ff 00 7f ff 00 78 fe 00 71 fe 00 69 fd 00 62 fc .....x..q..i..b. 1cf: 00 5a fa 00 52 f8 00 4a f6 00 42 f4 00 3a f1 00 .Z..R..J..B..:.. 1df: 32 ef 00 2a ec 00 21 e8 00 19 e5 00 11 e1 00 08 2..*..!......... 1ef: dd 00 00 e1 08 00 e5 11 00 e8 19 00 ec 21 00 ef .............!.. 1ff: 2a 00 f1 32 00 f4 3a 00 f6 42 00 f8 4a 00 fa 52 *..2..:..B..J..R 20f: 00 fc 5a 00 fd 62 00 fe 69 00 fe 71 00 ff 78 00 ..Z..b..i..q..x. 21f: ff 7f 00 ff 87 00 fe 8e 00 fe 95 00 fd 9b 00 fc ................ 22f: a2 00 fa a8 00 f8 ae 00 f6 b4 00 f4 ba 00 f1 c0 ................ 23f: 00 ef c5 00 ec ca 00 e8 cf 00 e5 d4 00 e1 d9 00 ................ 24f: dd dd 00 d9 e1 00 d4 e5 00 cf e8 00 ca ec 00 c5 ................ 25f: ef 00 c0 f1 00 ba f4 00 b4 f6 00 ae f8 00 a8 fa ................ 26f: 00 a2 fc 00 9b fd 00 95 fe 00 8e fe 00 87 ff 00 ................ 27f: 80 ff 00 78 ff 00 71 fe 00 69 fe 00 62 fd 00 5a ...x..q..i..b..Z 28f: fc 00 52 fa 00 4a f8 00 42 f6 00 3a f4 00 32 f1 ..R..J..B..:..2. 29f: 00 2a ef 00 21 ec 00 19 e8 00 11 e5 00 08 e1 00 .*..!........... 2af: 00 dd 00 00 e1 08 00 e5 11 00 e8 19 00 ec 21 00 ..............!. 2bf: ef 2a 00 f1 32 00 f4 3a 00 f6 42 00 f8 4a 00 fa .*..2..:..B..J.. 2cf: 52 00 fc 5a 00 fd 62 00 fe 69 00 fe 71 00 ff 78 R..Z..b..i..q..x 2df: 00 ff 80 00 ff 87 00 fe 8e 00 fe 95 00 fd 9b 00 ................ 2ef: fc a2 00 fa a8 00 f8 ae 00 f6 b4 00 f4 ba 00 f1 ................ 2ff: c0 00 ef c5 00 ec ca 00 e8 cf 00 e5 d4 00 e1 d9 ................ 30f: 00 dd dd 00 d9 e1 00 d4 e5 00 cf e8 00 ca ec 00 ................ 31f: c5 ef 00 c0 f1 00 ba f4 00 b4 f6 00 ae f8 00 a8 ................ 32f: fa 00 a2 fc 00 9b fd 00 95 fe 00 8e fe 00 87 ff ................ 33f: 00 80 ff 00 78 ff 00 71 fe 00 69 fe 00 62 fd 00 ....x..q..i..b.. 34f: 5a fc 00 52 fa 00 4a f8 00 42 f6 00 3a f4 00 32 Z..R..J..B..:..2 35f: f1 00 2a ef 00 21 ec 00 19 e8 00 11 e5 00 08 e1 ..*..!.......... ... 00000370 <__ctors_end>: 370: 11 24 eor r1, r1 372: 1f be out 0x3f, r1 ; 63 374: cf ef ldi r28, 0xFF ; 255 376: d8 e0 ldi r29, 0x08 ; 8 378: de bf out 0x3e, r29 ; 62 37a: cd bf out 0x3d, r28 ; 61 0000037c <__do_copy_data>: 37c: 11 e0 ldi r17, 0x01 ; 1 37e: a0 e0 ldi r26, 0x00 ; 0 380: b1 e0 ldi r27, 0x01 ; 1 382: e0 ec ldi r30, 0xC0 ; 192 384: f3 e1 ldi r31, 0x13 ; 19 386: 02 c0 rjmp .+4 ; 0x38c <__do_copy_data+0x10> 388: 05 90 lpm r0, Z+ 38a: 0d 92 st X+, r0 38c: a0 32 cpi r26, 0x20 ; 32 38e: b1 07 cpc r27, r17 390: d9 f7 brne .-10 ; 0x388 <__do_copy_data+0xc> 00000392 <__do_clear_bss>: 392: 21 e0 ldi r18, 0x01 ; 1 394: a0 e2 ldi r26, 0x20 ; 32 396: b1 e0 ldi r27, 0x01 ; 1 398: 01 c0 rjmp .+2 ; 0x39c <.do_clear_bss_start> 0000039a <.do_clear_bss_loop>: 39a: 1d 92 st X+, r1 0000039c <.do_clear_bss_start>: 39c: ac 33 cpi r26, 0x3C ; 60 39e: b2 07 cpc r27, r18 3a0: e1 f7 brne .-8 ; 0x39a <.do_clear_bss_loop> 3a2: 0e 94 2b 07 call 0xe56 ; 0xe56 <main> 3a6: 0c 94 de 09 jmp 0x13bc ; 0x13bc <_exit> 000003aa <__bad_interrupt>: 3aa: 0c 94 00 00 jmp 0 ; 0x0 <__vectors> 000003ae <PID_Init>: * \param d_factor Derivate term. * \param pid Struct with PID status. */ void PID_Init(int16_t p_factor, int16_t i_factor, int16_t d_factor, pidData_t *pid) // Set up PID controller parameters { 3ae: cf 93 push r28 3b0: df 93 push r29 3b2: dc 01 movw r26, r24 3b4: fb 01 movw r30, r22 3b6: e9 01 movw r28, r18 // Start values for PID controller pid->sumError = 0; 3b8: 1a 82 std Y+2, r1 ; 0x02 3ba: 1b 82 std Y+3, r1 ; 0x03 3bc: 1c 82 std Y+4, r1 ; 0x04 3be: 1d 82 std Y+5, r1 ; 0x05 pid->lastProcessValue = 0; 3c0: 19 82 std Y+1, r1 ; 0x01 3c2: 18 82 st Y, r1 // Tuning constants for PID loop pid->P_Factor = p_factor; 3c4: 9f 83 std Y+7, r25 ; 0x07 3c6: 8e 83 std Y+6, r24 ; 0x06 pid->I_Factor = i_factor; 3c8: 79 87 std Y+9, r23 ; 0x09 3ca: 68 87 std Y+8, r22 ; 0x08 pid->D_Factor = d_factor; 3cc: 5b 87 std Y+11, r21 ; 0x0b 3ce: 4a 87 std Y+10, r20 ; 0x0a // Limits to avoid overflow pid->maxError = MAX_INT / pid->P_Factor; 3d0: 8f ef ldi r24, 0xFF ; 255 3d2: 9f e7 ldi r25, 0x7F ; 127 3d4: bd 01 movw r22, r26 3d6: 0e 94 01 09 call 0x1202 ; 0x1202 <__divmodhi4> 3da: 7d 87 std Y+13, r23 ; 0x0d 3dc: 6c 87 std Y+12, r22 ; 0x0c pid->maxSumError = MAX_I_TERM / pid->I_Factor; 3de: 9f 01 movw r18, r30 3e0: ff 0f add r31, r31 3e2: 44 0b sbc r20, r20 3e4: 55 0b sbc r21, r21 3e6: 61 e0 ldi r22, 0x01 ; 1 3e8: 70 e0 ldi r23, 0x00 ; 0 3ea: 8f ef ldi r24, 0xFF ; 255 3ec: 9f e7 ldi r25, 0x7F ; 127 3ee: 0e 94 37 09 call 0x126e ; 0x126e <__divmodsi4> 3f2: 2e 87 std Y+14, r18 ; 0x0e 3f4: 3f 87 std Y+15, r19 ; 0x0f 3f6: 48 8b std Y+16, r20 ; 0x10 3f8: 59 8b std Y+17, r21 ; 0x11 } 3fa: df 91 pop r29 3fc: cf 91 pop r28 3fe: 08 95 ret 00000400 <PID_Controller>: * \param setPoint Desired value. * \param processValue Measured value. * \param pid_st PID status struct. */ int16_t PID_Controller(int16_t setPoint, int16_t processValue, pidData_t *pid_st) { 400: ef 92 push r14 402: ff 92 push r15 404: 0f 93 push r16 406: 1f 93 push r17 408: cf 93 push r28 40a: df 93 push r29 40c: 8b 01 movw r16, r22 40e: fa 01 movw r30, r20 int16_t error, p_term, d_term; int32_t i_term; int32_t ret; int32_t temp; error = setPoint - processValue; 410: 9c 01 movw r18, r24 412: 26 1b sub r18, r22 414: 37 0b sbc r19, r23 // Calculate Pterm and limit error overflow if (error > pid_st->maxError) 416: 84 85 ldd r24, Z+12 ; 0x0c 418: 95 85 ldd r25, Z+13 ; 0x0d 41a: 82 17 cp r24, r18 41c: 93 07 cpc r25, r19 41e: 84 f0 brlt .+32 ; 0x440 <PID_Controller+0x40> { p_term = MAX_INT; } else if (error < -pid_st->maxError) 420: 91 95 neg r25 422: 81 95 neg r24 424: 91 09 sbc r25, r1 426: 28 17 cp r18, r24 428: 39 07 cpc r19, r25 42a: 6c f0 brlt .+26 ; 0x446 <PID_Controller+0x46> { p_term = -MAX_INT; } else { p_term = pid_st->P_Factor * error; 42c: 86 81 ldd r24, Z+6 ; 0x06 42e: 97 81 ldd r25, Z+7 ; 0x07 430: 28 9f mul r18, r24 432: e0 01 movw r28, r0 434: 29 9f mul r18, r25 436: d0 0d add r29, r0 438: 38 9f mul r19, r24 43a: d0 0d add r29, r0 43c: 11 24 eor r1, r1 43e: 05 c0 rjmp .+10 ; 0x44a <PID_Controller+0x4a> error = setPoint - processValue; // Calculate Pterm and limit error overflow if (error > pid_st->maxError) { p_term = MAX_INT; 440: cf ef ldi r28, 0xFF ; 255 442: df e7 ldi r29, 0x7F ; 127 444: 02 c0 rjmp .+4 ; 0x44a <PID_Controller+0x4a> } else if (error < -pid_st->maxError) { p_term = -MAX_INT; 446: c1 e0 ldi r28, 0x01 ; 1 448: d0 e8 ldi r29, 0x80 ; 128 { p_term = pid_st->P_Factor * error; } // Calculate Iterm and limit integral runaway temp = pid_st->sumError + error; 44a: c9 01 movw r24, r18 44c: 33 0f add r19, r19 44e: aa 0b sbc r26, r26 450: bb 0b sbc r27, r27 452: 42 81 ldd r20, Z+2 ; 0x02 454: 53 81 ldd r21, Z+3 ; 0x03 456: 64 81 ldd r22, Z+4 ; 0x04 458: 75 81 ldd r23, Z+5 ; 0x05 45a: 9a 01 movw r18, r20 45c: ab 01 movw r20, r22 45e: 28 0f add r18, r24 460: 39 1f adc r19, r25 462: 4a 1f adc r20, r26 464: 5b 1f adc r21, r27 if(temp > pid_st->maxSumError) 466: 86 85 ldd r24, Z+14 ; 0x0e 468: 97 85 ldd r25, Z+15 ; 0x0f 46a: a0 89 ldd r26, Z+16 ; 0x10 46c: b1 89 ldd r27, Z+17 ; 0x11 46e: 82 17 cp r24, r18 470: 93 07 cpc r25, r19 472: a4 07 cpc r26, r20 474: b5 07 cpc r27, r21 476: 4c f4 brge .+18 ; 0x48a <PID_Controller+0x8a> { i_term = MAX_I_TERM; pid_st->sumError = pid_st->maxSumError; 478: 82 83 std Z+2, r24 ; 0x02 47a: 93 83 std Z+3, r25 ; 0x03 47c: a4 83 std Z+4, r26 ; 0x04 47e: b5 83 std Z+5, r27 ; 0x05 // Calculate Iterm and limit integral runaway temp = pid_st->sumError + error; if(temp > pid_st->maxSumError) { i_term = MAX_I_TERM; 480: 61 e0 ldi r22, 0x01 ; 1 482: 70 e0 ldi r23, 0x00 ; 0 484: 8f ef ldi r24, 0xFF ; 255 486: 9f e7 ldi r25, 0x7F ; 127 488: 1d c0 rjmp .+58 ; 0x4c4 <PID_Controller+0xc4> pid_st->sumError = pid_st->maxSumError; } else if(temp < -pid_st->maxSumError) 48a: b0 95 com r27 48c: a0 95 com r26 48e: 90 95 com r25 490: 81 95 neg r24 492: 9f 4f sbci r25, 0xFF ; 255 494: af 4f sbci r26, 0xFF ; 255 496: bf 4f sbci r27, 0xFF ; 255 498: 28 17 cp r18, r24 49a: 39 07 cpc r19, r25 49c: 4a 07 cpc r20, r26 49e: 5b 07 cpc r21, r27 4a0: 4c f4 brge .+18 ; 0x4b4 <PID_Controller+0xb4> { i_term = -MAX_I_TERM; pid_st->sumError = -pid_st->maxSumError; 4a2: 82 83 std Z+2, r24 ; 0x02 4a4: 93 83 std Z+3, r25 ; 0x03 4a6: a4 83 std Z+4, r26 ; 0x04 4a8: b5 83 std Z+5, r27 ; 0x05 i_term = MAX_I_TERM; pid_st->sumError = pid_st->maxSumError; } else if(temp < -pid_st->maxSumError) { i_term = -MAX_I_TERM; 4aa: 6f ef ldi r22, 0xFF ; 255 4ac: 7f ef ldi r23, 0xFF ; 255 4ae: 80 e0 ldi r24, 0x00 ; 0 4b0: 90 e8 ldi r25, 0x80 ; 128 4b2: 08 c0 rjmp .+16 ; 0x4c4 <PID_Controller+0xc4> pid_st->sumError = -pid_st->maxSumError; } else { pid_st->sumError = temp; 4b4: 22 83 std Z+2, r18 ; 0x02 4b6: 33 83 std Z+3, r19 ; 0x03 4b8: 44 83 std Z+4, r20 ; 0x04 4ba: 55 83 std Z+5, r21 ; 0x05 i_term = pid_st->I_Factor * pid_st->sumError; 4bc: a0 85 ldd r26, Z+8 ; 0x08 4be: b1 85 ldd r27, Z+9 ; 0x09 4c0: 0e 94 65 09 call 0x12ca ; 0x12ca <__mulshisi3> } // Calculate Dterm d_term = pid_st->D_Factor * (pid_st->lastProcessValue - processValue); 4c4: 20 81 ld r18, Z 4c6: 31 81 ldd r19, Z+1 ; 0x01 4c8: 20 1b sub r18, r16 4ca: 31 0b sbc r19, r17 4cc: a2 85 ldd r26, Z+10 ; 0x0a 4ce: b3 85 ldd r27, Z+11 ; 0x0b 4d0: 2a 9f mul r18, r26 4d2: 70 01 movw r14, r0 4d4: 2b 9f mul r18, r27 4d6: f0 0c add r15, r0 4d8: 3a 9f mul r19, r26 4da: f0 0c add r15, r0 4dc: 11 24 eor r1, r1 pid_st->lastProcessValue = processValue; 4de: 11 83 std Z+1, r17 ; 0x01 4e0: 00 83 st Z, r16 ret = (p_term + i_term + d_term) / SCALING_FACTOR; 4e2: 8e 01 movw r16, r28 4e4: dd 0f add r29, r29 4e6: 22 0b sbc r18, r18 4e8: 33 0b sbc r19, r19 4ea: ab 01 movw r20, r22 4ec: bc 01 movw r22, r24 4ee: 40 0f add r20, r16 4f0: 51 1f adc r21, r17 4f2: 62 1f adc r22, r18 4f4: 73 1f adc r23, r19 4f6: c7 01 movw r24, r14 4f8: ff 0c add r15, r15 4fa: aa 0b sbc r26, r26 4fc: bb 0b sbc r27, r27 4fe: 8a 01 movw r16, r20 500: 9b 01 movw r18, r22 502: 08 0f add r16, r24 504: 19 1f adc r17, r25 506: 2a 1f adc r18, r26 508: 3b 1f adc r19, r27 50a: c9 01 movw r24, r18 50c: b8 01 movw r22, r16 50e: 20 e0 ldi r18, 0x00 ; 0 510: 31 e0 ldi r19, 0x01 ; 1 512: 40 e0 ldi r20, 0x00 ; 0 514: 50 e0 ldi r21, 0x00 ; 0 516: 0e 94 37 09 call 0x126e ; 0x126e <__divmodsi4> 51a: 21 30 cpi r18, 0x01 ; 1 51c: 10 e8 ldi r17, 0x80 ; 128 51e: 31 07 cpc r19, r17 520: 1f ef ldi r17, 0xFF ; 255 522: 41 07 cpc r20, r17 524: 51 07 cpc r21, r17 526: 24 f4 brge .+8 ; 0x530 <PID_Controller+0x130> 528: 21 e0 ldi r18, 0x01 ; 1 52a: 30 e8 ldi r19, 0x80 ; 128 52c: 4f ef ldi r20, 0xFF ; 255 52e: 5f ef ldi r21, 0xFF ; 255 530: da 01 movw r26, r20 532: c9 01 movw r24, r18 534: 81 15 cp r24, r1 536: 20 e8 ldi r18, 0x80 ; 128 538: 92 07 cpc r25, r18 53a: a1 05 cpc r26, r1 53c: b1 05 cpc r27, r1 53e: 24 f0 brlt .+8 ; 0x548 <PID_Controller+0x148> 540: 8f ef ldi r24, 0xFF ; 255 542: 9f e7 ldi r25, 0x7F ; 127 544: a0 e0 ldi r26, 0x00 ; 0 546: b0 e0 ldi r27, 0x00 ; 0 { ret = -MAX_INT; } return((int16_t)ret); } 548: df 91 pop r29 54a: cf 91 pop r28 54c: 1f 91 pop r17 54e: 0f 91 pop r16 550: ff 90 pop r15 552: ef 90 pop r14 554: 08 95 ret 00000556 <PID_Reset_Integrator>: * * Calling this function will reset the integrator in the PID regulator. */ void PID_Reset_Integrator(pidData_t *pid_st) { pid_st->sumError = 0; 556: fc 01 movw r30, r24 558: 12 82 std Z+2, r1 ; 0x02 55a: 13 82 std Z+3, r1 ; 0x03 55c: 14 82 std Z+4, r1 ; 0x04 55e: 15 82 std Z+5, r1 ; 0x05 560: 08 95 ret 00000562 <DisablePWMOutputs>: * all PWM pins as inputs, thus overriding the PWM. The PWM configuration * itself is not altered in any way by running this function. */ static void DisablePWMOutputs(void) { DDRB &= ~PWM_PATTERN_PORTB; 562: 84 b1 in r24, 0x04 ; 4 564: 81 7f andi r24, 0xF1 ; 241 566: 84 b9 out 0x04, r24 ; 4 DDRD &= ~PWM_PATTERN_PORTD; 568: 8a b1 in r24, 0x0a ; 10 56a: 87 79 andi r24, 0x97 ; 151 56c: 8a b9 out 0x0a, r24 ; 10 56e: 08 95 ret 00000570 <printbyte>: * but hey, no money back for saved memory */ char hextable[18] = "0123456789ABCDEF"; /* very simple output to hex */ static void printbyte(const unsigned char data) { 570: cf 93 push r28 572: c8 2f mov r28, r24 lcd_putc(hextable[data >> 4]); 574: e8 2f mov r30, r24 576: e2 95 swap r30 578: ef 70 andi r30, 0x0F ; 15 57a: f0 e0 ldi r31, 0x00 ; 0 57c: e4 5f subi r30, 0xF4 ; 244 57e: fe 4f sbci r31, 0xFE ; 254 580: 80 81 ld r24, Z 582: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> lcd_putc(hextable[data & 0x0f]); 586: cf 70 andi r28, 0x0F ; 15 588: ec 2f mov r30, r28 58a: f0 e0 ldi r31, 0x00 ; 0 58c: e4 5f subi r30, 0xF4 ; 244 58e: fe 4f sbci r31, 0xFE ; 254 590: 80 81 ld r24, Z } 592: cf 91 pop r28 char hextable[18] = "0123456789ABCDEF"; /* very simple output to hex */ static void printbyte(const unsigned char data) { lcd_putc(hextable[data >> 4]); lcd_putc(hextable[data & 0x0f]); 594: 0c 94 c4 06 jmp 0xd88 ; 0xd88 <lcd_putc> 00000598 <printword>: } static void printword(const unsigned int data) { 598: cf 93 push r28 59a: c8 2f mov r28, r24 printbyte(data >> 8); 59c: 89 2f mov r24, r25 59e: 0e 94 b8 02 call 0x570 ; 0x570 <printbyte> printbyte(data); 5a2: 8c 2f mov r24, r28 } 5a4: cf 91 pop r28 lcd_putc(hextable[data & 0x0f]); } static void printword(const unsigned int data) { printbyte(data >> 8); printbyte(data); 5a6: 0c 94 b8 02 jmp 0x570 ; 0x570 <printbyte> 000005aa <printspc>: return i; } // Console//LCD utilities static void printspc(void) { lcd_putc(' '); 5aa: 80 e2 ldi r24, 0x20 ; 32 5ac: 0c 94 c4 06 jmp 0xd88 ; 0xd88 <lcd_putc> 000005b0 <printdec>: printbyte(data); } /* output a number in decimal style */ char dectable[12] = "000000000000"; char a; static void printdec(int16_t number) { 5b0: df 92 push r13 5b2: ef 92 push r14 5b4: ff 92 push r15 5b6: 0f 93 push r16 5b8: 1f 93 push r17 5ba: cf 93 push r28 5bc: df 93 push r29 } else if (__radix < 2 || __radix > 36) { *__s = 0; return __s; } else { extern char *__itoa_ncheck (int, char *, unsigned char); return __itoa_ncheck (__val, __s, __radix); 5be: 4a e0 ldi r20, 0x0A ; 10 5c0: 60 e0 ldi r22, 0x00 ; 0 5c2: 71 e0 ldi r23, 0x01 ; 1 5c4: 0e 94 78 09 call 0x12f0 ; 0x12f0 <__itoa_ncheck> uint8_t n,i; /* yeah, yeah warning "pointer to integer without a cast" * Am i tired of this or what */ a = itoa(number,dectable,10); 5c8: 80 93 3b 01 sts 0x013B, r24 ; 0x80013b <a> i = strlen(dectable); 5cc: e0 e0 ldi r30, 0x00 ; 0 5ce: f1 e0 ldi r31, 0x01 ; 1 5d0: 01 90 ld r0, Z+ 5d2: 00 20 and r0, r0 5d4: e9 f7 brne .-6 ; 0x5d0 <printdec+0x20> 5d6: 31 97 sbiw r30, 0x01 ; 1 5d8: e0 50 subi r30, 0x00 ; 0 5da: f1 40 sbci r31, 0x01 ; 1 5dc: de 2e mov r13, r30 5de: 80 e0 ldi r24, 0x00 ; 0 5e0: e8 2e mov r14, r24 5e2: 81 e0 ldi r24, 0x01 ; 1 5e4: f8 2e mov r15, r24 for (n=0;n < i;n++) { 5e6: 87 01 movw r16, r14 5e8: ff 27 eor r31, r31 if (n == i-1) lcd_putc('.'); 5ea: ef 01 movw r28, r30 5ec: 21 97 sbiw r28, 0x01 ; 1 5ee: 80 2f mov r24, r16 5f0: 8e 19 sub r24, r14 /* yeah, yeah warning "pointer to integer without a cast" * Am i tired of this or what */ a = itoa(number,dectable,10); i = strlen(dectable); for (n=0;n < i;n++) { 5f2: 8d 15 cp r24, r13 5f4: 78 f4 brcc .+30 ; 0x614 <printdec+0x64> 5f6: c8 01 movw r24, r16 5f8: 80 50 subi r24, 0x00 ; 0 5fa: 91 40 sbci r25, 0x01 ; 1 if (n == i-1) lcd_putc('.'); 5fc: 8c 17 cp r24, r28 5fe: 9d 07 cpc r25, r29 600: 19 f4 brne .+6 ; 0x608 <printdec+0x58> 602: 8e e2 ldi r24, 0x2E ; 46 604: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> lcd_putc(dectable[n]); 608: f8 01 movw r30, r16 60a: 81 91 ld r24, Z+ 60c: 8f 01 movw r16, r30 60e: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> 612: ed cf rjmp .-38 ; 0x5ee <printdec+0x3e> } } 614: df 91 pop r29 616: cf 91 pop r28 618: 1f 91 pop r17 61a: 0f 91 pop r16 61c: ff 90 pop r15 61e: ef 90 pop r14 620: df 90 pop r13 622: 08 95 ret 00000624 <InsertDeadband>: * \param compareValue desired compare value * \param compareHighPtr Pointer used to return high side compare value with dead band. * \param compareLowPtr Pointer used to return low side compare value with dead band. */ static void InsertDeadband(const uint8_t compareValue, uint8_t * compareHighPtr, uint8_t * compareLowPtr) { 624: db 01 movw r26, r22 626: fa 01 movw r30, r20 if (compareValue <= DEAD_TIME_HALF) 628: 90 91 1e 01 lds r25, 0x011E ; 0x80011e <DEAD_TIME_HALF> 62c: 98 17 cp r25, r24 62e: 10 f0 brcs .+4 ; 0x634 <InsertDeadband+0x10> { *compareHighPtr = 0x00; 630: 1c 92 st X, r1 632: 1a c0 rjmp .+52 ; 0x668 <InsertDeadband+0x44> *compareLowPtr = compareValue; } else if (compareValue >= (0xff - DEAD_TIME_HALF)) 634: 90 91 1e 01 lds r25, 0x011E ; 0x80011e <DEAD_TIME_HALF> 638: 48 2f mov r20, r24 63a: 50 e0 ldi r21, 0x00 ; 0 63c: 2f ef ldi r18, 0xFF ; 255 63e: 30 e0 ldi r19, 0x00 ; 0 640: 29 1b sub r18, r25 642: 31 09 sbc r19, r1 644: 42 17 cp r20, r18 646: 53 07 cpc r21, r19 648: 3c f0 brlt .+14 ; 0x658 <InsertDeadband+0x34> { *compareHighPtr = 0xff - (2 * DEAD_TIME_HALF); 64a: 80 91 1e 01 lds r24, 0x011E ; 0x80011e <DEAD_TIME_HALF> 64e: 88 0f add r24, r24 650: 80 95 com r24 652: 8c 93 st X, r24 *compareLowPtr = 0xff; 654: 8f ef ldi r24, 0xFF ; 255 656: 08 c0 rjmp .+16 ; 0x668 <InsertDeadband+0x44> } else { *compareHighPtr = compareValue - DEAD_TIME_HALF; 658: 90 91 1e 01 lds r25, 0x011E ; 0x80011e <DEAD_TIME_HALF> 65c: 28 2f mov r18, r24 65e: 29 1b sub r18, r25 660: 2c 93 st X, r18 *compareLowPtr = compareValue + DEAD_TIME_HALF; 662: 90 91 1e 01 lds r25, 0x011E ; 0x80011e <DEAD_TIME_HALF> 666: 89 0f add r24, r25 668: 80 83 st Z, r24 66a: 08 95 ret 0000066c <keyin>: * note that debouncing is not really necessary here as the polling routine * just happens to pass by. */ char keyin(void){ uint8_t i = 0; i = ~BUTTON_PORT; 66c: 89 b1 in r24, 0x09 ; 9 66e: 80 95 com r24 i &= BUTTON_MASK; return i; } 670: 87 70 andi r24, 0x07 ; 7 672: 08 95 ret 00000674 <wrEEPROM>: * IRQs must be disabled before writing and are re-enabled afterwards * therefore disabling the PWM is safest. Reestablishing sine driving is done * by resetting the waveform to undefined. The timer IRQ will handle the remains. */ void wrEEPROM(void) { lcd_gotoxy(0,1); 674: 61 e0 ldi r22, 0x01 ; 1 676: 80 e0 ldi r24, 0x00 ; 0 678: 0e 94 b3 06 call 0xd66 ; 0xd66 <lcd_gotoxy> lcd_puts_P( "Storing EEPROM " ); 67c: 8e ed ldi r24, 0xDE ; 222 67e: 90 e0 ldi r25, 0x00 ; 0 680: 0e 94 e4 06 call 0xdc8 ; 0xdc8 <lcd_puts_p> cli(); 684: f8 94 cli DisablePWMOutputs(); 686: 0e 94 b1 02 call 0x562 ; 0x562 <DisablePWMOutputs> // real writing is here eeprom_busy_wait(); 68a: f9 99 sbic 0x1f, 1 ; 31 68c: fe cf rjmp .-4 ; 0x68a <wrEEPROM+0x16> eeprom_write_byte(&ee_DEAD_TIME_HALF,DEAD_TIME_HALF); 68e: 60 91 1e 01 lds r22, 0x011E ; 0x80011e <DEAD_TIME_HALF> 692: 88 e0 ldi r24, 0x08 ; 8 694: 90 e0 ldi r25, 0x00 ; 0 696: 0e 94 bb 09 call 0x1376 ; 0x1376 <eeprom_write_byte> eeprom_busy_wait(); 69a: f9 99 sbic 0x1f, 1 ; 31 69c: fe cf rjmp .-4 ; 0x69a <wrEEPROM+0x26> eeprom_write_byte(&ee_Inco,Inco); 69e: 68 2d mov r22, r8 6a0: 87 e0 ldi r24, 0x07 ; 7 6a2: 90 e0 ldi r25, 0x00 ; 0 6a4: 0e 94 bb 09 call 0x1376 ; 0x1376 <eeprom_write_byte> eeprom_busy_wait(); 6a8: f9 99 sbic 0x1f, 1 ; 31 6aa: fe cf rjmp .-4 ; 0x6a8 <wrEEPROM+0x34> eeprom_write_byte(&ee_VperHz,VperHz); 6ac: 67 2d mov r22, r7 6ae: 86 e0 ldi r24, 0x06 ; 6 6b0: 90 e0 ldi r25, 0x00 ; 0 6b2: 0e 94 bb 09 call 0x1376 ; 0x1376 <eeprom_write_byte> eeprom_busy_wait(); 6b6: f9 99 sbic 0x1f, 1 ; 31 6b8: fe cf rjmp .-4 ; 0x6b6 <wrEEPROM+0x42> // write PID values eeprom_write_word(&ee_pid_P,pidParameters.P_Factor); 6ba: 60 91 2c 01 lds r22, 0x012C ; 0x80012c <pidParameters+0x6> 6be: 70 91 2d 01 lds r23, 0x012D ; 0x80012d <pidParameters+0x7> 6c2: 84 e0 ldi r24, 0x04 ; 4 6c4: 90 e0 ldi r25, 0x00 ; 0 6c6: 0e 94 c9 09 call 0x1392 ; 0x1392 <eeprom_write_word> eeprom_busy_wait(); 6ca: f9 99 sbic 0x1f, 1 ; 31 6cc: fe cf rjmp .-4 ; 0x6ca <wrEEPROM+0x56> eeprom_write_word(&ee_pid_I,pidParameters.I_Factor); 6ce: 60 91 2e 01 lds r22, 0x012E ; 0x80012e <pidParameters+0x8> 6d2: 70 91 2f 01 lds r23, 0x012F ; 0x80012f <pidParameters+0x9> 6d6: 82 e0 ldi r24, 0x02 ; 2 6d8: 90 e0 ldi r25, 0x00 ; 0 6da: 0e 94 c9 09 call 0x1392 ; 0x1392 <eeprom_write_word> eeprom_busy_wait(); 6de: f9 99 sbic 0x1f, 1 ; 31 6e0: fe cf rjmp .-4 ; 0x6de <wrEEPROM+0x6a> eeprom_write_word(&ee_pid_D,pidParameters.D_Factor); 6e2: 60 91 30 01 lds r22, 0x0130 ; 0x800130 <pidParameters+0xa> 6e6: 70 91 31 01 lds r23, 0x0131 ; 0x800131 <pidParameters+0xb> 6ea: 80 e0 ldi r24, 0x00 ; 0 6ec: 90 e0 ldi r25, 0x00 ; 0 6ee: 0e 94 c9 09 call 0x1392 ; 0x1392 <eeprom_write_word> eeprom_busy_wait(); 6f2: f9 99 sbic 0x1f, 1 ; 31 6f4: fe cf rjmp .-4 ; 0x6f2 <wrEEPROM+0x7e> // tell the interrupt to reestablish Sine Driving fastFlags.driveWaveform = WAVEFORM_UNDEFINED; 6f6: 29 2d mov r18, r9 6f8: 2c 60 ori r18, 0x0C ; 12 6fa: 92 2e mov r9, r18 sei(); 6fc: 78 94 sei #else //round up by default __ticks_dc = (uint32_t)(ceil(fabs(__tmp))); #endif __builtin_avr_delay_cycles(__ticks_dc); 6fe: 8f ef ldi r24, 0xFF ; 255 700: 99 e6 ldi r25, 0x69 ; 105 702: 28 e1 ldi r18, 0x18 ; 24 704: 81 50 subi r24, 0x01 ; 1 706: 90 40 sbci r25, 0x00 ; 0 708: 20 40 sbci r18, 0x00 ; 0 70a: e1 f7 brne .-8 ; 0x704 <wrEEPROM+0x90> 70c: 00 c0 rjmp .+0 ; 0x70e <wrEEPROM+0x9a> 70e: 00 00 nop // tell the user _delay_ms(500); lcd_gotoxy(0,1); 710: 61 e0 ldi r22, 0x01 ; 1 712: 80 e0 ldi r24, 0x00 ; 0 714: 0e 94 b3 06 call 0xd66 ; 0xd66 <lcd_gotoxy> lcd_puts_P( "Stored " ); 718: 8d ec ldi r24, 0xCD ; 205 71a: 90 e0 ldi r25, 0x00 ; 0 71c: 0e 94 e4 06 call 0xdc8 ; 0xdc8 <lcd_puts_p> 720: 8f ef ldi r24, 0xFF ; 255 722: 99 e6 ldi r25, 0x69 ; 105 724: 28 e1 ldi r18, 0x18 ; 24 726: 81 50 subi r24, 0x01 ; 1 728: 90 40 sbci r25, 0x00 ; 0 72a: 20 40 sbci r18, 0x00 ; 0 72c: e1 f7 brne .-8 ; 0x726 <wrEEPROM+0xb2> 72e: 00 c0 rjmp .+0 ; 0x730 <wrEEPROM+0xbc> 730: 00 00 nop _delay_ms(500); // wait for button release if (keyin() > 0){}; 732: 0c 94 36 03 jmp 0x66c ; 0x66c <keyin> 00000736 <execExtendedCommand>: * Adjust in a safe environment with current monitoring. * Place on the LCD is limited, thus PID and DT is displayed as Hex. * Wrap around on these values should be avoided, thus the range check */ static void execExtendedCommand(void) { 736: ef 92 push r14 738: ff 92 push r15 73a: 0f 93 push r16 73c: 1f 93 push r17 73e: cf 93 push r28 740: df 93 push r29 char n=0; uint8_t j=0; lcd_home(); 742: 0e 94 c1 06 call 0xd82 ; 0xd82 <lcd_home> // this line is only written once, actual values are always displayed in line 2 lcd_puts_P( "P I D DT " ); 746: 89 e7 ldi r24, 0x79 ; 121 748: 90 e0 ldi r25, 0x00 ; 0 74a: 0e 94 e4 06 call 0xdc8 ; 0xdc8 <lcd_puts_p> parameter = 0; 74e: 10 92 21 01 sts 0x0121, r1 ; 0x800121 <parameter> // wait for button release while (keyin()!=0){}; 752: 0e 94 36 03 call 0x66c ; 0x66c <keyin> 756: 81 11 cpse r24, r1 758: fc cf rjmp .-8 ; 0x752 <execExtendedCommand+0x1c> 75a: d0 e0 ldi r29, 0x00 ; 0 break; case 2 : if (pidParameters.D_Factor > 65534) pidParameters.D_Factor = 65534; pidParameters.D_Factor++; break; case 3 : DEAD_TIME_HALF++; if (DEAD_TIME_HALF > 200) DEAD_TIME_HALF = 200; 75c: 88 ec ldi r24, 0xC8 ; 200 75e: f8 2e mov r15, r24 case 2 : switch (parameter) { case 0 : if (pidParameters.P_Factor < 1) pidParameters.P_Factor = 1; pidParameters.P_Factor--; break; case 1 : if (pidParameters.I_Factor < 1) pidParameters.I_Factor = 1; 760: 01 e0 ldi r16, 0x01 ; 1 762: 10 e0 ldi r17, 0x00 ; 0 break; case 2 : if (pidParameters.D_Factor < 1) pidParameters.D_Factor = 1; pidParameters.D_Factor--; break; case 3 : DEAD_TIME_HALF--; if (DEAD_TIME_HALF < MIN_DEAD_TIME) DEAD_TIME_HALF = MIN_DEAD_TIME; 764: 98 e0 ldi r25, 0x08 ; 8 766: e9 2e mov r14, r25 parameter = 0; // wait for button release while (keyin()!=0){}; // pressing black and green button simultaneously exits this menu while (n != 5) { n = keyin(); 768: 0e 94 36 03 call 0x66c ; 0x66c <keyin> 76c: c8 2f mov r28, r24 switch (n) 76e: 83 30 cpi r24, 0x03 ; 3 770: 09 f4 brne .+2 ; 0x774 <execExtendedCommand+0x3e> 772: a5 c0 rjmp .+330 ; 0x8be <execExtendedCommand+0x188> 774: 28 f4 brcc .+10 ; 0x780 <execExtendedCommand+0x4a> 776: 81 30 cpi r24, 0x01 ; 1 778: 59 f0 breq .+22 ; 0x790 <execExtendedCommand+0x5a> 77a: 82 30 cpi r24, 0x02 ; 2 77c: b1 f0 breq .+44 ; 0x7aa <execExtendedCommand+0x74> 77e: 06 c0 rjmp .+12 ; 0x78c <execExtendedCommand+0x56> 780: 84 30 cpi r24, 0x04 ; 4 782: 09 f4 brne .+2 ; 0x786 <execExtendedCommand+0x50> 784: 5c c0 rjmp .+184 ; 0x83e <execExtendedCommand+0x108> 786: 85 30 cpi r24, 0x05 ; 5 788: 09 f4 brne .+2 ; 0x78c <execExtendedCommand+0x56> 78a: 9b c0 rjmp .+310 ; 0x8c2 <execExtendedCommand+0x18c> // pressing black (1) and red (2) button simultaneously writes EEPROM case 3 : wrEEPROM(); break; // pressing black and green(4) button simultaneously exits this menu case 5 : break; default: j = 0; break; 78c: d0 e0 ldi r29, 0x00 ; 0 78e: 99 c0 rjmp .+306 ; 0x8c2 <execExtendedCommand+0x18c> while (n != 5) { n = keyin(); switch (n) { // cycle through parameters case 1 : parameter++; if (parameter > EXTNUMPARAMS) parameter = 0; 790: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <parameter> 794: 8f 5f subi r24, 0xFF ; 255 796: 80 93 21 01 sts 0x0121, r24 ; 0x800121 <parameter> 79a: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <parameter> 79e: 84 30 cpi r24, 0x04 ; 4 7a0: 08 f4 brcc .+2 ; 0x7a4 <execExtendedCommand+0x6e> 7a2: 8f c0 rjmp .+286 ; 0x8c2 <execExtendedCommand+0x18c> 7a4: 10 92 21 01 sts 0x0121, r1 ; 0x800121 <parameter> 7a8: 8c c0 rjmp .+280 ; 0x8c2 <execExtendedCommand+0x18c> break; // red button decrements parameter case 2 : switch (parameter) { 7aa: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <parameter> 7ae: 81 30 cpi r24, 0x01 ; 1 7b0: b9 f0 breq .+46 ; 0x7e0 <execExtendedCommand+0xaa> 7b2: 28 f0 brcs .+10 ; 0x7be <execExtendedCommand+0x88> 7b4: 82 30 cpi r24, 0x02 ; 2 7b6: 29 f1 breq .+74 ; 0x802 <execExtendedCommand+0xcc> 7b8: 83 30 cpi r24, 0x03 ; 3 7ba: a1 f1 breq .+104 ; 0x824 <execExtendedCommand+0xee> 7bc: 82 c0 rjmp .+260 ; 0x8c2 <execExtendedCommand+0x18c> case 0 : if (pidParameters.P_Factor < 1) pidParameters.P_Factor = 1; 7be: 80 91 2c 01 lds r24, 0x012C ; 0x80012c <pidParameters+0x6> 7c2: 90 91 2d 01 lds r25, 0x012D ; 0x80012d <pidParameters+0x7> 7c6: 18 16 cp r1, r24 7c8: 19 06 cpc r1, r25 7ca: 24 f0 brlt .+8 ; 0x7d4 <execExtendedCommand+0x9e> 7cc: 10 93 2d 01 sts 0x012D, r17 ; 0x80012d <pidParameters+0x7> 7d0: 00 93 2c 01 sts 0x012C, r16 ; 0x80012c <pidParameters+0x6> pidParameters.P_Factor--; 7d4: 80 91 2c 01 lds r24, 0x012C ; 0x80012c <pidParameters+0x6> 7d8: 90 91 2d 01 lds r25, 0x012D ; 0x80012d <pidParameters+0x7> 7dc: 01 97 sbiw r24, 0x01 ; 1 7de: 42 c0 rjmp .+132 ; 0x864 <execExtendedCommand+0x12e> break; case 1 : if (pidParameters.I_Factor < 1) pidParameters.I_Factor = 1; 7e0: 80 91 2e 01 lds r24, 0x012E ; 0x80012e <pidParameters+0x8> 7e4: 90 91 2f 01 lds r25, 0x012F ; 0x80012f <pidParameters+0x9> 7e8: 18 16 cp r1, r24 7ea: 19 06 cpc r1, r25 7ec: 24 f0 brlt .+8 ; 0x7f6 <execExtendedCommand+0xc0> 7ee: 10 93 2f 01 sts 0x012F, r17 ; 0x80012f <pidParameters+0x9> 7f2: 00 93 2e 01 sts 0x012E, r16 ; 0x80012e <pidParameters+0x8> pidParameters.I_Factor--; 7f6: 80 91 2e 01 lds r24, 0x012E ; 0x80012e <pidParameters+0x8> 7fa: 90 91 2f 01 lds r25, 0x012F ; 0x80012f <pidParameters+0x9> 7fe: 01 97 sbiw r24, 0x01 ; 1 800: 3f c0 rjmp .+126 ; 0x880 <execExtendedCommand+0x14a> break; case 2 : if (pidParameters.D_Factor < 1) pidParameters.D_Factor = 1; 802: 80 91 30 01 lds r24, 0x0130 ; 0x800130 <pidParameters+0xa> 806: 90 91 31 01 lds r25, 0x0131 ; 0x800131 <pidParameters+0xb> 80a: 18 16 cp r1, r24 80c: 19 06 cpc r1, r25 80e: 24 f0 brlt .+8 ; 0x818 <execExtendedCommand+0xe2> 810: 10 93 31 01 sts 0x0131, r17 ; 0x800131 <pidParameters+0xb> 814: 00 93 30 01 sts 0x0130, r16 ; 0x800130 <pidParameters+0xa> pidParameters.D_Factor--; 818: 80 91 30 01 lds r24, 0x0130 ; 0x800130 <pidParameters+0xa> 81c: 90 91 31 01 lds r25, 0x0131 ; 0x800131 <pidParameters+0xb> 820: 01 97 sbiw r24, 0x01 ; 1 822: 3c c0 rjmp .+120 ; 0x89c <execExtendedCommand+0x166> break; case 3 : DEAD_TIME_HALF--; 824: 80 91 1e 01 lds r24, 0x011E ; 0x80011e <DEAD_TIME_HALF> 828: 81 50 subi r24, 0x01 ; 1 82a: 80 93 1e 01 sts 0x011E, r24 ; 0x80011e <DEAD_TIME_HALF> if (DEAD_TIME_HALF < MIN_DEAD_TIME) DEAD_TIME_HALF = MIN_DEAD_TIME; 82e: 80 91 1e 01 lds r24, 0x011E ; 0x80011e <DEAD_TIME_HALF> 832: 88 30 cpi r24, 0x08 ; 8 834: 08 f0 brcs .+2 ; 0x838 <execExtendedCommand+0x102> 836: 45 c0 rjmp .+138 ; 0x8c2 <execExtendedCommand+0x18c> 838: e0 92 1e 01 sts 0x011E, r14 ; 0x80011e <DEAD_TIME_HALF> 83c: 42 c0 rjmp .+132 ; 0x8c2 <execExtendedCommand+0x18c> default : break; } break; // green button increments parameter case 4 : switch (parameter) { 83e: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <parameter> 842: 81 30 cpi r24, 0x01 ; 1 844: a1 f0 breq .+40 ; 0x86e <execExtendedCommand+0x138> 846: 28 f0 brcs .+10 ; 0x852 <execExtendedCommand+0x11c> 848: 82 30 cpi r24, 0x02 ; 2 84a: f9 f0 breq .+62 ; 0x88a <execExtendedCommand+0x154> 84c: 83 30 cpi r24, 0x03 ; 3 84e: 59 f1 breq .+86 ; 0x8a6 <execExtendedCommand+0x170> 850: 38 c0 rjmp .+112 ; 0x8c2 <execExtendedCommand+0x18c> case 0 : if (pidParameters.P_Factor > 65534) pidParameters.P_Factor = 65534; 852: 80 91 2c 01 lds r24, 0x012C ; 0x80012c <pidParameters+0x6> 856: 90 91 2d 01 lds r25, 0x012D ; 0x80012d <pidParameters+0x7> pidParameters.P_Factor++; 85a: 80 91 2c 01 lds r24, 0x012C ; 0x80012c <pidParameters+0x6> 85e: 90 91 2d 01 lds r25, 0x012D ; 0x80012d <pidParameters+0x7> 862: 01 96 adiw r24, 0x01 ; 1 864: 90 93 2d 01 sts 0x012D, r25 ; 0x80012d <pidParameters+0x7> 868: 80 93 2c 01 sts 0x012C, r24 ; 0x80012c <pidParameters+0x6> break; 86c: 2a c0 rjmp .+84 ; 0x8c2 <execExtendedCommand+0x18c> case 1 : if (pidParameters.I_Factor > 65534) pidParameters.I_Factor = 65534; 86e: 80 91 2e 01 lds r24, 0x012E ; 0x80012e <pidParameters+0x8> 872: 90 91 2f 01 lds r25, 0x012F ; 0x80012f <pidParameters+0x9> pidParameters.I_Factor++; 876: 80 91 2e 01 lds r24, 0x012E ; 0x80012e <pidParameters+0x8> 87a: 90 91 2f 01 lds r25, 0x012F ; 0x80012f <pidParameters+0x9> 87e: 01 96 adiw r24, 0x01 ; 1 880: 90 93 2f 01 sts 0x012F, r25 ; 0x80012f <pidParameters+0x9> 884: 80 93 2e 01 sts 0x012E, r24 ; 0x80012e <pidParameters+0x8> break; 888: 1c c0 rjmp .+56 ; 0x8c2 <execExtendedCommand+0x18c> case 2 : if (pidParameters.D_Factor > 65534) pidParameters.D_Factor = 65534; 88a: 80 91 30 01 lds r24, 0x0130 ; 0x800130 <pidParameters+0xa> 88e: 90 91 31 01 lds r25, 0x0131 ; 0x800131 <pidParameters+0xb> pidParameters.D_Factor++; 892: 80 91 30 01 lds r24, 0x0130 ; 0x800130 <pidParameters+0xa> 896: 90 91 31 01 lds r25, 0x0131 ; 0x800131 <pidParameters+0xb> 89a: 01 96 adiw r24, 0x01 ; 1 89c: 90 93 31 01 sts 0x0131, r25 ; 0x800131 <pidParameters+0xb> 8a0: 80 93 30 01 sts 0x0130, r24 ; 0x800130 <pidParameters+0xa> break; 8a4: 0e c0 rjmp .+28 ; 0x8c2 <execExtendedCommand+0x18c> case 3 : DEAD_TIME_HALF++; 8a6: 80 91 1e 01 lds r24, 0x011E ; 0x80011e <DEAD_TIME_HALF> 8aa: 8f 5f subi r24, 0xFF ; 255 8ac: 80 93 1e 01 sts 0x011E, r24 ; 0x80011e <DEAD_TIME_HALF> if (DEAD_TIME_HALF > 200) DEAD_TIME_HALF = 200; 8b0: 80 91 1e 01 lds r24, 0x011E ; 0x80011e <DEAD_TIME_HALF> 8b4: 89 3c cpi r24, 0xC9 ; 201 8b6: 28 f0 brcs .+10 ; 0x8c2 <execExtendedCommand+0x18c> 8b8: f0 92 1e 01 sts 0x011E, r15 ; 0x80011e <DEAD_TIME_HALF> 8bc: 02 c0 rjmp .+4 ; 0x8c2 <execExtendedCommand+0x18c> break; default : break; } break; // pressing black (1) and red (2) button simultaneously writes EEPROM case 3 : wrEEPROM(); break; 8be: 0e 94 3a 03 call 0x674 ; 0x674 <wrEEPROM> // pressing black and green(4) button simultaneously exits this menu case 5 : break; default: j = 0; break; } // switch PID_Init(pidParameters.P_Factor, pidParameters.I_Factor, pidParameters.D_Factor,(pidData_t *) &pidParameters); 8c2: 40 91 30 01 lds r20, 0x0130 ; 0x800130 <pidParameters+0xa> 8c6: 50 91 31 01 lds r21, 0x0131 ; 0x800131 <pidParameters+0xb> 8ca: 60 91 2e 01 lds r22, 0x012E ; 0x80012e <pidParameters+0x8> 8ce: 70 91 2f 01 lds r23, 0x012F ; 0x80012f <pidParameters+0x9> 8d2: 80 91 2c 01 lds r24, 0x012C ; 0x80012c <pidParameters+0x6> 8d6: 90 91 2d 01 lds r25, 0x012D ; 0x80012d <pidParameters+0x7> 8da: 26 e2 ldi r18, 0x26 ; 38 8dc: 31 e0 ldi r19, 0x01 ; 1 8de: 0e 94 d7 01 call 0x3ae ; 0x3ae <PID_Init> // includes a little autorepeat accelerator if (keyin() > 0) { 8e2: 0e 94 36 03 call 0x66c ; 0x66c <keyin> 8e6: 88 23 and r24, r24 8e8: a1 f0 breq .+40 ; 0x912 <__stack+0x13> j++; 8ea: df 5f subi r29, 0xFF ; 255 if (j<10) _delay_ms(60); 8ec: da 30 cpi r29, 0x0A ; 10 8ee: 50 f4 brcc .+20 ; 0x904 <__stack+0x5> 8f0: 2f ef ldi r18, 0xFF ; 255 8f2: 8d ee ldi r24, 0xED ; 237 8f4: 92 e0 ldi r25, 0x02 ; 2 8f6: 21 50 subi r18, 0x01 ; 1 8f8: 80 40 sbci r24, 0x00 ; 0 8fa: 90 40 sbci r25, 0x00 ; 0 8fc: e1 f7 brne .-8 ; 0x8f6 <execExtendedCommand+0x1c0> 8fe: 00 c0 rjmp .+0 ; 0x900 <__stack+0x1> 900: 00 00 nop 902: 07 c0 rjmp .+14 ; 0x912 <__stack+0x13> 904: 8f e3 ldi r24, 0x3F ; 63 906: 9c e9 ldi r25, 0x9C ; 156 908: 01 97 sbiw r24, 0x01 ; 1 90a: f1 f7 brne .-4 ; 0x908 <__stack+0x9> 90c: 00 c0 rjmp .+0 ; 0x90e <__stack+0xf> 90e: 00 00 nop else { _delay_ms(10); j = 11; 910: db e0 ldi r29, 0x0B ; 11 static void showExtendedPars(void) { const uint8_t *p = cursorextpos; lcd_gotoxy(0,1); 912: 61 e0 ldi r22, 0x01 ; 1 914: 80 e0 ldi r24, 0x00 ; 0 916: 0e 94 b3 06 call 0xd66 ; 0xd66 <lcd_gotoxy> printword(pidParameters.P_Factor); 91a: 80 91 2c 01 lds r24, 0x012C ; 0x80012c <pidParameters+0x6> 91e: 90 91 2d 01 lds r25, 0x012D ; 0x80012d <pidParameters+0x7> 922: 0e 94 cc 02 call 0x598 ; 0x598 <printword> printword(pidParameters.I_Factor); 926: 80 91 2e 01 lds r24, 0x012E ; 0x80012e <pidParameters+0x8> 92a: 90 91 2f 01 lds r25, 0x012F ; 0x80012f <pidParameters+0x9> 92e: 0e 94 cc 02 call 0x598 ; 0x598 <printword> printword(pidParameters.D_Factor);printspc(); 932: 80 91 30 01 lds r24, 0x0130 ; 0x800130 <pidParameters+0xa> 936: 90 91 31 01 lds r25, 0x0131 ; 0x800131 <pidParameters+0xb> 93a: 0e 94 cc 02 call 0x598 ; 0x598 <printword> 93e: 0e 94 d5 02 call 0x5aa ; 0x5aa <printspc> printbyte(DEAD_TIME_HALF);printspc(); 942: 80 91 1e 01 lds r24, 0x011E ; 0x80011e <DEAD_TIME_HALF> 946: 0e 94 b8 02 call 0x570 ; 0x570 <printbyte> 94a: 0e 94 d5 02 call 0x5aa ; 0x5aa <printspc> lcd_gotoxy(pgm_read_byte(p+parameter),1); // set cursor below active parameter 94e: e0 91 21 01 lds r30, 0x0121 ; 0x800121 <parameter> 952: f0 e0 ldi r31, 0x00 ; 0 954: e5 5d subi r30, 0xD5 ; 213 956: fe 4f sbci r31, 0xFE ; 254 958: 84 91 lpm r24, Z 95a: 61 e0 ldi r22, 0x01 ; 1 95c: 0e 94 b3 06 call 0xd66 ; 0xd66 <lcd_gotoxy> 960: 8f e1 ldi r24, 0x1F ; 31 962: 9e e4 ldi r25, 0x4E ; 78 964: 01 97 sbiw r24, 0x01 ; 1 966: f1 f7 brne .-4 ; 0x964 <__stack+0x65> 968: 00 c0 rjmp .+0 ; 0x96a <__stack+0x6b> 96a: 00 00 nop lcd_puts_P( "P I D DT " ); parameter = 0; // wait for button release while (keyin()!=0){}; // pressing black and green button simultaneously exits this menu while (n != 5) { 96c: c5 30 cpi r28, 0x05 ; 5 96e: 09 f0 breq .+2 ; 0x972 <__stack+0x73> 970: fb ce rjmp .-522 ; 0x768 <execExtendedCommand+0x32> j = 11; } } showExtendedPars(); } // while parameter = 0; 972: 10 92 21 01 sts 0x0121, r1 ; 0x800121 <parameter> lcd_clrscr(); 976: 0e 94 be 06 call 0xd7c ; 0xd7c <lcd_clrscr> // restore original diplay lcd_puts_P( "Freq V/Hz Amp " ); 97a: 88 e6 ldi r24, 0x68 ; 104 97c: 90 e0 ldi r25, 0x00 ; 0 97e: 0e 94 e4 06 call 0xdc8 ; 0xdc8 <lcd_puts_p> // wait for button release while (keyin()!=0){}; 982: 0e 94 36 03 call 0x66c ; 0x66c <keyin> 986: 81 11 cpse r24, r1 988: fc cf rjmp .-8 ; 0x982 <__stack+0x83> } 98a: df 91 pop r29 98c: cf 91 pop r28 98e: 1f 91 pop r17 990: 0f 91 pop r16 992: ff 90 pop r15 994: ef 90 pop r14 996: 08 95 ret 00000998 <__vector_5>: * * This ISR is called every time the direction input pin changes * state. The desired direction flag is updated accordingly. */ ISR(PCINT2_vect) { 998: 1f 92 push r1 99a: 0f 92 push r0 99c: 0f b6 in r0, 0x3f ; 63 99e: 0f 92 push r0 9a0: 11 24 eor r1, r1 9a2: 2f 93 push r18 9a4: 3f 93 push r19 9a6: 4f 93 push r20 9a8: 5f 93 push r21 9aa: 6f 93 push r22 9ac: 7f 93 push r23 9ae: 8f 93 push r24 9b0: 9f 93 push r25 9b2: af 93 push r26 9b4: bf 93 push r27 9b6: ef 93 push r30 9b8: ff 93 push r31 * Running this function triggers a reading of the direction * input pin. The desiredDirection flag is set accordingly. */ static void DesiredDirectionUpdate(void) { if ( bit_is_clear(PIND,DIRECTION_COMMAND_PIN) ) 9ba: 89 b1 in r24, 0x09 ; 9 { fastFlags.desiredDirection = DIRECTION_REVERSE; 9bc: 80 95 com r24 9be: 88 1f adc r24, r24 9c0: 88 27 eor r24, r24 9c2: 88 1f adc r24, r24 9c4: 80 fb bst r24, 0 9c6: 91 f8 bld r9, 1 } void ChangeDirection(void) { DesiredDirectionUpdate(); //Disable driver signals DisablePWMOutputs(); 9c8: 0e 94 b1 02 call 0x562 ; 0x562 <DisablePWMOutputs> fastFlags.driveWaveform = WAVEFORM_UNDEFINED; 9cc: 89 2d mov r24, r9 9ce: 8c 60 ori r24, 0x0C ; 12 9d0: 98 2e mov r9, r24 */ ISR(PCINT2_vect) { //Call the routine to actually stop the motor and reverse ChangeDirection(); } 9d2: ff 91 pop r31 9d4: ef 91 pop r30 9d6: bf 91 pop r27 9d8: af 91 pop r26 9da: 9f 91 pop r25 9dc: 8f 91 pop r24 9de: 7f 91 pop r23 9e0: 6f 91 pop r22 9e2: 5f 91 pop r21 9e4: 4f 91 pop r20 9e6: 3f 91 pop r19 9e8: 2f 91 pop r18 9ea: 0f 90 pop r0 9ec: 0f be out 0x3f, r0 ; 63 9ee: 0f 90 pop r0 9f0: 1f 90 pop r1 9f2: 18 95 reti 000009f4 <__vector_16>: // EMPTY_INTERRUPT(TIMER0_OVF_vect); 9f4: 18 95 reti 000009f6 <__vector_14>: // ISR stub for unused irqs. The AVRs sometimes need to fire an interupt and // execute it before OC registers are updated EMPTY_INTERRUPT(TIMER0_COMPB_vect); 9f6: 18 95 reti 000009f8 <__vector_10>: * reaches TOP (0xff). New sinusoidal output values are calculated and the * timers are updated to reflect the new values. * The core routine of the VF Drive */ ISR(TIMER1_CAPT_vect) { 9f8: 1f 92 push r1 9fa: 0f 92 push r0 9fc: 0f b6 in r0, 0x3f ; 63 9fe: 0f 92 push r0 a00: 11 24 eor r1, r1 a02: cf 92 push r12 a04: df 92 push r13 a06: ef 92 push r14 a08: ff 92 push r15 a0a: 0f 93 push r16 a0c: 1f 93 push r17 a0e: 2f 93 push r18 a10: 3f 93 push r19 a12: 4f 93 push r20 a14: 5f 93 push r21 a16: 6f 93 push r22 a18: 7f 93 push r23 a1a: 8f 93 push r24 a1c: 9f 93 push r25 a1e: af 93 push r26 a20: bf 93 push r27 a22: ef 93 push r30 a24: ff 93 push r31 a26: cf 93 push r28 a28: df 93 push r29 a2a: 00 d0 rcall .+0 ; 0xa2c <__vector_10+0x34> a2c: cd b7 in r28, 0x3d ; 61 a2e: de b7 in r29, 0x3e ; 62 static uint8_t speedRegTicks = 0; uint8_t tempU, tempV, tempW; { if (fastFlags.driveWaveform != WAVEFORM_SINUSOIDAL) TimersSetModeSinusoidal(); a30: 89 2d mov r24, r9 a32: 86 95 lsr r24 a34: 86 95 lsr r24 a36: 83 70 andi r24, 0x03 ; 3 a38: 81 30 cpi r24, 0x01 ; 1 a3a: 11 f1 breq .+68 ; 0xa80 <__vector_10+0x88> * through. */ static void TimersSetModeSinusoidal(void) { //Set PWM pins to input (Hi-Z) while changing modes. DisablePWMOutputs(); a3c: 0e 94 b1 02 call 0x562 ; 0x562 <DisablePWMOutputs> //Sets all 3 timers in inverted pair mode. TCCR0A = (1 << COM0A1) | (0 << COM0A0) | (1 << COM0B1) | (1 << COM0B0) | (1 << WGM00); a40: 81 eb ldi r24, 0xB1 ; 177 a42: 84 bd out 0x24, r24 ; 36 TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << COM1B1) | (1 << COM1B0) | (1 << WGM11); a44: 92 eb ldi r25, 0xB2 ; 178 a46: 90 93 80 00 sts 0x0080, r25 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7e0080> TCCR2A = (1 << COM2A1) | (0 << COM2A0) | (1 << COM2B1) | (1 << COM2B0) | (1 << WGM20); a4a: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7e00b0> //Make sure all outputs are turned off before PWM outputs are enabled. OCR0A = OCR1AL = OCR2A = 0; a4e: 10 92 b3 00 sts 0x00B3, r1 ; 0x8000b3 <__TEXT_REGION_LENGTH__+0x7e00b3> a52: 10 92 88 00 sts 0x0088, r1 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7e0088> a56: 17 bc out 0x27, r1 ; 39 OCR0B = OCR1BL = OCR2B = 0xff; a58: 8f ef ldi r24, 0xFF ; 255 a5a: 80 93 b4 00 sts 0x00B4, r24 ; 0x8000b4 <__TEXT_REGION_LENGTH__+0x7e00b4> a5e: 80 93 8a 00 sts 0x008A, r24 ; 0x80008a <__TEXT_REGION_LENGTH__+0x7e008a> a62: 88 bd out 0x28, r24 ; 40 * does not occur in the transition between two output waveform generation modes. */ static void TimersWaitForNextPWMCycle(void) { //Clear Timer1 Capture event flag. TIFR1 = (1 << ICF1); a64: 80 e2 ldi r24, 0x20 ; 32 a66: 86 bb out 0x16, r24 ; 22 //Wait for new Timer1 Capture event flag. while ( !(TIFR1 & (1 << ICF1)) ) a68: b5 9b sbis 0x16, 5 ; 22 a6a: fe cf rjmp .-4 ; 0xa68 <__vector_10+0x70> OCR0B = OCR1BL = OCR2B = 0xff; //Wait for next PWM cycle to ensure that all outputs are updated. TimersWaitForNextPWMCycle(); fastFlags.driveWaveform = WAVEFORM_SINUSOIDAL; a6c: 89 2d mov r24, r9 a6e: 83 7f andi r24, 0xF3 ; 243 a70: 84 60 ori r24, 0x04 ; 4 a72: 98 2e mov r9, r24 * all PWM pins as output. The PWM configuration itself is not altered * in any way by running this function. */ static void EnablePWMOutputs(void) { DDRB |= PWM_PATTERN_PORTB; a74: 84 b1 in r24, 0x04 ; 4 a76: 8e 60 ori r24, 0x0E ; 14 a78: 84 b9 out 0x04, r24 ; 4 DDRD |= PWM_PATTERN_PORTD; a7a: 8a b1 in r24, 0x0a ; 10 a7c: 88 66 ori r24, 0x68 ; 104 a7e: 8a b9 out 0x0a, r24 ; 10 static uint8_t speedRegTicks = 0; uint8_t tempU, tempV, tempW; { if (fastFlags.driveWaveform != WAVEFORM_SINUSOIDAL) TimersSetModeSinusoidal(); const uint8_t *sineTablePtr = sineTable ; // set to start of sine table sineTableIncrement = Inco; // stepwidth = frequency selection a80: 88 2d mov r24, r8 a82: 90 e0 ldi r25, 0x00 ; 0 a84: 1c 01 movw r2, r24 * * \param increment The increment (in 8.8 format) added to the sine table index. */ static void AdjustSineTableIndex(const uint16_t increment) { sineTableIndex += increment ; a86: 20 91 38 01 lds r18, 0x0138 ; 0x800138 <sineTableIndex> a8a: 30 91 39 01 lds r19, 0x0139 ; 0x800139 <sineTableIndex+0x1> a8e: 82 0f add r24, r18 a90: 93 1f adc r25, r19 a92: 90 93 39 01 sts 0x0139, r25 ; 0x800139 <sineTableIndex+0x1> a96: 80 93 38 01 sts 0x0138, r24 ; 0x800138 <sineTableIndex> // If the table index is out of bounds, wrap the index around the table end // to continue from the beginning. Also wrap the next sector start index. if ((sineTableIndex >> 8) >= SINE_TABLE_LENGTH) a9a: 80 91 38 01 lds r24, 0x0138 ; 0x800138 <sineTableIndex> a9e: 90 91 39 01 lds r25, 0x0139 ; 0x800139 <sineTableIndex+0x1> aa2: 81 15 cp r24, r1 aa4: 90 4c sbci r25, 0xC0 ; 192 aa6: 48 f0 brcs .+18 ; 0xaba <__vector_10+0xc2> { sineTableIndex -= (SINE_TABLE_LENGTH << 8); aa8: 80 91 38 01 lds r24, 0x0138 ; 0x800138 <sineTableIndex> aac: 90 91 39 01 lds r25, 0x0139 ; 0x800139 <sineTableIndex+0x1> ab0: 90 5c subi r25, 0xC0 ; 192 ab2: 90 93 39 01 sts 0x0139, r25 ; 0x800139 <sineTableIndex+0x1> ab6: 80 93 38 01 sts 0x0138, r24 ; 0x800138 <sineTableIndex> sineTableIncrement = Inco; // stepwidth = frequency selection AdjustSineTableIndex(sineTableIncrement); // call the routine to update the pointer //Add sine table offset to pointer. Must be multiplied by 3, since one //value for each phase is stored in the table. sineTablePtr += (sineTableIndex >> 8) * 3; aba: 80 91 38 01 lds r24, 0x0138 ; 0x800138 <sineTableIndex> abe: 90 91 39 01 lds r25, 0x0139 ; 0x800139 <sineTableIndex+0x1> ac2: 89 2f mov r24, r25 ac4: 99 27 eor r25, r25 ac6: fc 01 movw r30, r24 ac8: ee 0f add r30, r30 aca: ff 1f adc r31, r31 acc: 8e 0f add r24, r30 ace: 9f 1f adc r25, r31 ad0: fc 01 movw r30, r24 ad2: e1 5d subi r30, 0xD1 ; 209 ad4: fe 4f sbci r31, 0xFE ; 254 tempU = pgm_read_byte(sineTablePtr++); ad6: 8f 01 movw r16, r30 ad8: 0f 5f subi r16, 0xFF ; 255 ada: 1f 4f sbci r17, 0xFF ; 255 adc: 24 91 lpm r18, Z ade: cf 01 movw r24, r30 ae0: 02 96 adiw r24, 0x02 ; 2 if (fastFlags.desiredDirection == DIRECTION_FORWARD) { tempW = pgm_read_byte(sineTablePtr++); ae2: f8 01 movw r30, r16 //Add sine table offset to pointer. Must be multiplied by 3, since one //value for each phase is stored in the table. sineTablePtr += (sineTableIndex >> 8) * 3; tempU = pgm_read_byte(sineTablePtr++); if (fastFlags.desiredDirection == DIRECTION_FORWARD) ae4: 91 fc sbrc r9, 1 ae6: 04 c0 rjmp .+8 ; 0xaf0 <__vector_10+0xf8> { tempW = pgm_read_byte(sineTablePtr++); ae8: 04 91 lpm r16, Z tempV = pgm_read_byte(sineTablePtr); aea: fc 01 movw r30, r24 aec: e4 90 lpm r14, Z aee: 03 c0 rjmp .+6 ; 0xaf6 <__vector_10+0xfe> } else { tempV = pgm_read_byte(sineTablePtr++); af0: e4 90 lpm r14, Z tempW = pgm_read_byte(sineTablePtr); af2: fc 01 movw r30, r24 af4: 04 91 lpm r16, Z #ifdef PURE_SINE_DRIVE tempU = 128 - ((uint16_t)(amplitude * tempU) >> 9); tempV = 128 - ((uint16_t)(amplitude * tempV) >> 9); tempW = 128 - ((uint16_t)(amplitude * tempW) >> 9); #else tempU = ((uint16_t)(amplitude * tempU) >> 8); af6: 62 9e mul r6, r18 af8: 90 01 movw r18, r0 afa: 11 24 eor r1, r1 tempV = ((uint16_t)(amplitude * tempV) >> 8); afc: 6e 9c mul r6, r14 afe: 70 01 movw r14, r0 b00: 11 24 eor r1, r1 tempW = ((uint16_t)(amplitude * tempW) >> 8); b02: 60 9e mul r6, r16 b04: 80 01 movw r16, r0 b06: 11 24 eor r1, r1 #endif { uint8_t compareHigh, compareLow; InsertDeadband(tempU, &compareHigh, &compareLow); b08: ae 01 movw r20, r28 b0a: 4f 5f subi r20, 0xFF ; 255 b0c: 5f 4f sbci r21, 0xFF ; 255 b0e: be 01 movw r22, r28 b10: 6e 5f subi r22, 0xFE ; 254 b12: 7f 4f sbci r23, 0xFF ; 255 b14: 83 2f mov r24, r19 b16: 0e 94 12 03 call 0x624 ; 0x624 <InsertDeadband> OCR0A = compareHigh; b1a: 8a 81 ldd r24, Y+2 ; 0x02 b1c: 87 bd out 0x27, r24 ; 39 OCR0B = compareLow; b1e: 89 81 ldd r24, Y+1 ; 0x01 b20: 88 bd out 0x28, r24 ; 40 InsertDeadband(tempV, &compareHigh, &compareLow); b22: ae 01 movw r20, r28 b24: 4f 5f subi r20, 0xFF ; 255 b26: 5f 4f sbci r21, 0xFF ; 255 b28: be 01 movw r22, r28 b2a: 6e 5f subi r22, 0xFE ; 254 b2c: 7f 4f sbci r23, 0xFF ; 255 b2e: 8f 2d mov r24, r15 b30: 0e 94 12 03 call 0x624 ; 0x624 <InsertDeadband> OCR1AL = compareHigh; b34: 8a 81 ldd r24, Y+2 ; 0x02 b36: 80 93 88 00 sts 0x0088, r24 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7e0088> OCR1BL = compareLow; b3a: 89 81 ldd r24, Y+1 ; 0x01 b3c: 80 93 8a 00 sts 0x008A, r24 ; 0x80008a <__TEXT_REGION_LENGTH__+0x7e008a> InsertDeadband(tempW, &compareHigh, &compareLow); b40: ae 01 movw r20, r28 b42: 4f 5f subi r20, 0xFF ; 255 b44: 5f 4f sbci r21, 0xFF ; 255 b46: be 01 movw r22, r28 b48: 6e 5f subi r22, 0xFE ; 254 b4a: 7f 4f sbci r23, 0xFF ; 255 b4c: 81 2f mov r24, r17 b4e: 0e 94 12 03 call 0x624 ; 0x624 <InsertDeadband> OCR2A = compareHigh; b52: 8a 81 ldd r24, Y+2 ; 0x02 b54: 80 93 b3 00 sts 0x00B3, r24 ; 0x8000b3 <__TEXT_REGION_LENGTH__+0x7e00b3> OCR2B = compareLow; b58: 89 81 ldd r24, Y+1 ; 0x01 b5a: 80 93 b4 00 sts 0x00B4, r24 ; 0x8000b4 <__TEXT_REGION_LENGTH__+0x7e00b4> } // regular task calls the SpeedController speedRegTicks++; b5e: 80 91 22 01 lds r24, 0x0122 ; 0x800122 <speedRegTicks.2484> b62: 8f 5f subi r24, 0xFF ; 255 b64: 80 93 22 01 sts 0x0122, r24 ; 0x800122 <speedRegTicks.2484> if (speedRegTicks >= SPEED_CONTROLLER_TIME_BASE) b68: 88 3c cpi r24, 0xC8 ; 200 b6a: 08 f4 brcc .+2 ; 0xb6e <__vector_10+0x176> b6c: 51 c0 rjmp .+162 ; 0xc10 <__vector_10+0x218> */ static void SpeedController(void) { int32_t outputValue, amplitudeValue; // calculate the frequency if (fastFlags.externalControl) { b6e: 90 fe sbrs r9, 0 b70: 16 c0 rjmp .+44 ; 0xb9e <__vector_10+0x1a6> //Calculate an increment setpoint from the analog speed input. int16_t incrementSetpoint = ((uint32_t)speedInput * SPEED_CONTROLLER_MAX_INCREMENT) / SPEED_CONTROLLER_MAX_INPUT; b72: 20 91 3a 01 lds r18, 0x013A ; 0x80013a <speedInput> //PID regulator with feed forward from speed input. outputValue = (uint32_t)speedInput; b76: c0 90 3a 01 lds r12, 0x013A ; 0x80013a <speedInput> outputValue += PID_Controller(incrementSetpoint, ((uint16_t)Inco),(pidData_t *) &pidParameters); b7a: e8 2d mov r30, r8 b7c: f0 e0 ldi r31, 0x00 ; 0 { int32_t outputValue, amplitudeValue; // calculate the frequency if (fastFlags.externalControl) { //Calculate an increment setpoint from the analog speed input. int16_t incrementSetpoint = ((uint32_t)speedInput * SPEED_CONTROLLER_MAX_INCREMENT) / SPEED_CONTROLLER_MAX_INPUT; b7e: 30 e0 ldi r19, 0x00 ; 0 b80: af ef ldi r26, 0xFF ; 255 b82: b0 e0 ldi r27, 0x00 ; 0 b84: 0e 94 56 09 call 0x12ac ; 0x12ac <__umulhisi3> b88: bb 27 eor r27, r27 b8a: a9 2f mov r26, r25 b8c: 98 2f mov r25, r24 b8e: 87 2f mov r24, r23 //PID regulator with feed forward from speed input. outputValue = (uint32_t)speedInput; outputValue += PID_Controller(incrementSetpoint, ((uint16_t)Inco),(pidData_t *) &pidParameters); b90: 46 e2 ldi r20, 0x26 ; 38 b92: 51 e0 ldi r21, 0x01 ; 1 b94: bf 01 movw r22, r30 b96: 0e 94 00 02 call 0x400 ; 0x400 <PID_Controller> Inco = (uint16_t)outputValue; b9a: 8c 0d add r24, r12 b9c: 88 2e mov r8, r24 } // clamp freq = DIVISIONEER/(SINE_TABLE_DISP/Inco); b9e: 68 2d mov r22, r8 ba0: 70 e0 ldi r23, 0x00 ; 0 ba2: 80 e0 ldi r24, 0x00 ; 0 ba4: 9b e4 ldi r25, 0x4B ; 75 ba6: 0e 94 ed 08 call 0x11da ; 0x11da <__udivmodhi4> baa: 9b 01 movw r18, r22 bac: 40 e0 ldi r20, 0x00 ; 0 bae: 50 e0 ldi r21, 0x00 ; 0 bb0: 66 ed ldi r22, 0xD6 ; 214 bb2: 7c ed ldi r23, 0xDC ; 220 bb4: 81 e0 ldi r24, 0x01 ; 1 bb6: 90 e0 ldi r25, 0x00 ; 0 bb8: 0e 94 15 09 call 0x122a ; 0x122a <__udivmodsi4> bbc: 30 93 25 01 sts 0x0125, r19 ; 0x800125 <freq+0x1> bc0: 20 93 24 01 sts 0x0124, r18 ; 0x800124 <freq> amplitudeValue = (freq/10)*VperHz; bc4: c9 01 movw r24, r18 bc6: 6a e0 ldi r22, 0x0A ; 10 bc8: 70 e0 ldi r23, 0x00 ; 0 bca: 0e 94 ed 08 call 0x11da ; 0x11da <__udivmodhi4> bce: 76 9e mul r7, r22 bd0: 90 01 movw r18, r0 bd2: 77 9e mul r7, r23 bd4: 30 0d add r19, r0 bd6: 11 24 eor r1, r1 bd8: b9 01 movw r22, r18 bda: 80 e0 ldi r24, 0x00 ; 0 bdc: 90 e0 ldi r25, 0x00 ; 0 if (amplitudeValue < 1) bde: 23 2b or r18, r19 be0: 59 f0 breq .+22 ; 0xbf8 <__vector_10+0x200> { amplitudeValue = 0; } else if (amplitudeValue > 2549) be2: 66 3f cpi r22, 0xF6 ; 246 be4: f9 e0 ldi r31, 0x09 ; 9 be6: 7f 07 cpc r23, r31 be8: 81 05 cpc r24, r1 bea: 91 05 cpc r25, r1 bec: 44 f0 brlt .+16 ; 0xbfe <__vector_10+0x206> { amplitudeValue = 2550; bee: 66 ef ldi r22, 0xF6 ; 246 bf0: 79 e0 ldi r23, 0x09 ; 9 bf2: 80 e0 ldi r24, 0x00 ; 0 bf4: 90 e0 ldi r25, 0x00 ; 0 bf6: 03 c0 rjmp .+6 ; 0xbfe <__vector_10+0x206> // clamp freq = DIVISIONEER/(SINE_TABLE_DISP/Inco); amplitudeValue = (freq/10)*VperHz; if (amplitudeValue < 1) { amplitudeValue = 0; bf8: 60 e0 ldi r22, 0x00 ; 0 bfa: 70 e0 ldi r23, 0x00 ; 0 bfc: cb 01 movw r24, r22 } else if (amplitudeValue > 2549) { amplitudeValue = 2550; } amplitude = amplitudeValue / 10; bfe: 2a e0 ldi r18, 0x0A ; 10 c00: 30 e0 ldi r19, 0x00 ; 0 c02: 40 e0 ldi r20, 0x00 ; 0 c04: 50 e0 ldi r21, 0x00 ; 0 c06: 0e 94 37 09 call 0x126e ; 0x126e <__divmodsi4> c0a: 62 2e mov r6, r18 // regular task calls the SpeedController speedRegTicks++; if (speedRegTicks >= SPEED_CONTROLLER_TIME_BASE) { SpeedController(); speedRegTicks = 0; c0c: 10 92 22 01 sts 0x0122, r1 ; 0x800122 <speedRegTicks.2484> } } c10: 0f 90 pop r0 c12: 0f 90 pop r0 c14: df 91 pop r29 c16: cf 91 pop r28 c18: ff 91 pop r31 c1a: ef 91 pop r30 c1c: bf 91 pop r27 c1e: af 91 pop r26 c20: 9f 91 pop r25 c22: 8f 91 pop r24 c24: 7f 91 pop r23 c26: 6f 91 pop r22 c28: 5f 91 pop r21 c2a: 4f 91 pop r20 c2c: 3f 91 pop r19 c2e: 2f 91 pop r18 c30: 1f 91 pop r17 c32: 0f 91 pop r16 c34: ff 90 pop r15 c36: ef 90 pop r14 c38: df 90 pop r13 c3a: cf 90 pop r12 c3c: 0f 90 pop r0 c3e: 0f be out 0x3f, r0 ; 63 c40: 0f 90 pop r0 c42: 1f 90 pop r1 c44: 18 95 reti 00000c46 <__vector_21>: * this is declared as non-blocking * * Only the 8 most significant bits of the ADC result are used. */ ISR(ADC_vect, ISR_NOBLOCK) { c46: 78 94 sei c48: 1f 92 push r1 c4a: 0f 92 push r0 c4c: 0f b6 in r0, 0x3f ; 63 c4e: 0f 92 push r0 c50: 11 24 eor r1, r1 c52: 2f 93 push r18 c54: 8f 93 push r24 c56: 9f 93 push r25 if (fastFlags.externalControl) { c58: 90 fe sbrs r9, 0 c5a: 22 c0 rjmp .+68 ; 0xca0 <__vector_21+0x5a> switch (ADMUX) c5c: 80 91 7c 00 lds r24, 0x007C ; 0x80007c <__TEXT_REGION_LENGTH__+0x7e007c> c60: 84 36 cpi r24, 0x64 ; 100 c62: 59 f0 breq .+22 ; 0xc7a <__vector_21+0x34> c64: 85 36 cpi r24, 0x65 ; 101 c66: b1 f4 brne .+44 ; 0xc94 <__vector_21+0x4e> case ADMUX_FREQUENCY: speedInput = (speedInput + ADCH) >> 1; // do some averaging ADMUX = ADMUX_AMPLITUDE; break; case ADMUX_AMPLITUDE: VperHz = (VperHz + ADCH) >> 1; c68: 80 91 79 00 lds r24, 0x0079 ; 0x800079 <__TEXT_REGION_LENGTH__+0x7e0079> c6c: 90 e0 ldi r25, 0x00 ; 0 c6e: 87 0d add r24, r7 c70: 91 1d adc r25, r1 c72: 95 95 asr r25 c74: 87 95 ror r24 c76: 78 2e mov r7, r24 c78: 0d c0 rjmp .+26 ; 0xc94 <__vector_21+0x4e> { if (fastFlags.externalControl) { switch (ADMUX) { case ADMUX_FREQUENCY: speedInput = (speedInput + ADCH) >> 1; // do some averaging c7a: 20 91 3a 01 lds r18, 0x013A ; 0x80013a <speedInput> c7e: 80 91 79 00 lds r24, 0x0079 ; 0x800079 <__TEXT_REGION_LENGTH__+0x7e0079> c82: 90 e0 ldi r25, 0x00 ; 0 c84: 82 0f add r24, r18 c86: 91 1d adc r25, r1 c88: 95 95 asr r25 c8a: 87 95 ror r24 c8c: 80 93 3a 01 sts 0x013A, r24 ; 0x80013a <speedInput> ADMUX = ADMUX_AMPLITUDE; c90: 85 e6 ldi r24, 0x65 ; 101 c92: 01 c0 rjmp .+2 ; 0xc96 <__vector_21+0x50> VperHz = (VperHz + ADCH) >> 1; ADMUX = ADMUX_FREQUENCY; break; default: //This is probably an error and should be handled. Instead we set the multiplexer and just run away ADMUX = ADMUX_FREQUENCY; c94: 84 e6 ldi r24, 0x64 ; 100 c96: 80 93 7c 00 sts 0x007C, r24 ; 0x80007c <__TEXT_REGION_LENGTH__+0x7e007c> break; } // restart the ADC ADCSRA = (1 << ADEN) | (1 << ADSC) | (0 << ADATE) | (1 << ADIF) | (1 << ADIE) | ADC_PRESCALER; c9a: 8e ed ldi r24, 0xDE ; 222 c9c: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a> } } ca0: 9f 91 pop r25 ca2: 8f 91 pop r24 ca4: 2f 91 pop r18 ca6: 0f 90 pop r0 ca8: 0f be out 0x3f, r0 ; 63 caa: 0f 90 pop r0 cac: 1f 90 pop r1 cae: 18 95 reti 00000cb0 <toggle_e>: #if LCD_IO_MODE /* toggle Enable Pin to initiate write */ static void toggle_e(void) { lcd_e_high(); cb0: 28 9a sbi 0x05, 0 ; 5 lcd_e_delay(); cb2: 00 c0 rjmp .+0 ; 0xcb4 <toggle_e+0x4> lcd_e_low(); cb4: 28 98 cbi 0x05, 0 ; 5 cb6: 08 95 ret 00000cb8 <lcd_write>: 0: write instruction Returns: none *************************************************************************/ #if LCD_IO_MODE static void lcd_write(uint8_t data,uint8_t rs) { cb8: 1f 93 push r17 cba: cf 93 push r28 cbc: df 93 push r29 cbe: 1f 92 push r1 cc0: cd b7 in r28, 0x3d ; 61 cc2: de b7 in r29, 0x3e ; 62 unsigned char dataBits ; if (rs) { /* write data (RS=1, RW=0) */ cc4: 66 23 and r22, r22 cc6: 11 f0 breq .+4 ; 0xccc <lcd_write+0x14> lcd_rs_high(); cc8: 2c 9a sbi 0x05, 4 ; 5 cca: 01 c0 rjmp .+2 ; 0xcce <lcd_write+0x16> } else { /* write instruction (RS=0, RW=0) */ lcd_rs_low(); ccc: 2c 98 cbi 0x05, 4 ; 5 } lcd_rw_low(); cce: 2d 98 cbi 0x05, 5 ; 5 if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT ) && (LCD_DATA0_PIN == 0) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) ) { /* configure data pins as output */ DDR(LCD_DATA0_PORT) |= 0x0F; cd0: 97 b1 in r25, 0x07 ; 7 cd2: 9f 60 ori r25, 0x0F ; 15 cd4: 97 b9 out 0x07, r25 ; 7 /* output high nibble first */ dataBits = LCD_DATA0_PORT & 0xF0; cd6: 98 b1 in r25, 0x08 ; 8 cd8: 19 2f mov r17, r25 cda: 10 7f andi r17, 0xF0 ; 240 LCD_DATA0_PORT = dataBits |((data>>4)&0x0F); cdc: 98 2f mov r25, r24 cde: 92 95 swap r25 ce0: 9f 70 andi r25, 0x0F ; 15 ce2: 91 2b or r25, r17 ce4: 98 b9 out 0x08, r25 ; 8 lcd_e_toggle(); ce6: 89 83 std Y+1, r24 ; 0x01 ce8: 0e 94 58 06 call 0xcb0 ; 0xcb0 <toggle_e> /* output low nibble */ LCD_DATA0_PORT = dataBits | (data&0x0F); cec: 89 81 ldd r24, Y+1 ; 0x01 cee: 8f 70 andi r24, 0x0F ; 15 cf0: 81 2b or r24, r17 cf2: 88 b9 out 0x08, r24 ; 8 lcd_e_toggle(); cf4: 0e 94 58 06 call 0xcb0 ; 0xcb0 <toggle_e> /* all data pins high (inactive) */ LCD_DATA0_PORT = dataBits | 0x0F; cf8: 1f 60 ori r17, 0x0F ; 15 cfa: 18 b9 out 0x08, r17 ; 8 LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN); LCD_DATA2_PORT |= _BV(LCD_DATA2_PIN); LCD_DATA3_PORT |= _BV(LCD_DATA3_PIN); } } cfc: 0f 90 pop r0 cfe: df 91 pop r29 d00: cf 91 pop r28 d02: 1f 91 pop r17 d04: 08 95 ret 00000d06 <lcd_read.constprop.0>: if (rs) lcd_rs_high(); /* RS=1: read data */ else lcd_rs_low(); /* RS=0: read busy flag */ d06: 2c 98 cbi 0x05, 4 ; 5 lcd_rw_high(); /* RW=1 read mode */ d08: 2d 9a sbi 0x05, 5 ; 5 if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT ) && ( LCD_DATA0_PIN == 0 )&& (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) ) { DDR(LCD_DATA0_PORT) &= 0xF0; /* configure data pins as input */ d0a: 87 b1 in r24, 0x07 ; 7 d0c: 80 7f andi r24, 0xF0 ; 240 d0e: 87 b9 out 0x07, r24 ; 7 lcd_e_high(); d10: 28 9a sbi 0x05, 0 ; 5 lcd_e_delay(); d12: 00 c0 rjmp .+0 ; 0xd14 <lcd_read.constprop.0+0xe> data = PIN(LCD_DATA0_PORT) << 4; /* read high nibble first */ d14: 96 b1 in r25, 0x06 ; 6 lcd_e_low(); d16: 28 98 cbi 0x05, 0 ; 5 lcd_e_delay(); /* Enable 500ns low */ d18: 00 c0 rjmp .+0 ; 0xd1a <lcd_read.constprop.0+0x14> lcd_e_high(); d1a: 28 9a sbi 0x05, 0 ; 5 lcd_e_delay(); d1c: 00 c0 rjmp .+0 ; 0xd1e <lcd_read.constprop.0+0x18> data |= PIN(LCD_DATA0_PORT)&0x0F; /* read low nibble */ d1e: 26 b1 in r18, 0x06 ; 6 d20: 2f 70 andi r18, 0x0F ; 15 { DDR(LCD_DATA0_PORT) &= 0xF0; /* configure data pins as input */ lcd_e_high(); lcd_e_delay(); data = PIN(LCD_DATA0_PORT) << 4; /* read high nibble first */ d22: 89 2f mov r24, r25 d24: 82 95 swap r24 d26: 80 7f andi r24, 0xF0 ; 240 lcd_e_delay(); /* Enable 500ns low */ lcd_e_high(); lcd_e_delay(); data |= PIN(LCD_DATA0_PORT)&0x0F; /* read low nibble */ lcd_e_low(); d28: 28 98 cbi 0x05, 0 ; 5 if ( PIN(LCD_DATA2_PORT) & _BV(LCD_DATA2_PIN) ) data |= 0x04; if ( PIN(LCD_DATA3_PORT) & _BV(LCD_DATA3_PIN) ) data |= 0x08; lcd_e_low(); } return data; } d2a: 82 2b or r24, r18 d2c: 08 95 ret 00000d2e <lcd_waitbusy>: { register uint8_t c; /* wait until busy flag is cleared */ while ( (c=lcd_read(0)) & (1<<LCD_BUSY)) {} d2e: 0e 94 83 06 call 0xd06 ; 0xd06 <lcd_read.constprop.0> d32: 87 fd sbrc r24, 7 d34: fc cf rjmp .-8 ; 0xd2e <lcd_waitbusy> static inline void _delayFourCycles(unsigned int __count) { if ( __count == 0 ) __asm__ __volatile__( "rjmp 1f\n 1:" ); // 2 cycles else __asm__ __volatile__ ( d36: 88 e0 ldi r24, 0x08 ; 8 d38: 90 e0 ldi r25, 0x00 ; 0 d3a: 01 97 sbiw r24, 0x01 ; 1 d3c: f1 f7 brne .-4 ; 0xd3a <lcd_waitbusy+0xc> /* the address counter is updated 4us after the busy flag is cleared */ delay(2); /* now read the address counter */ return (lcd_read(0)); // return address counter d3e: 0c 94 83 06 jmp 0xd06 ; 0xd06 <lcd_read.constprop.0> 00000d42 <lcd_command>: Send LCD controller instruction command Input: instruction to send to LCD controller, see HD44780 data sheet Returns: none *************************************************************************/ void lcd_command(uint8_t cmd) { d42: cf 93 push r28 d44: c8 2f mov r28, r24 lcd_waitbusy(); d46: 0e 94 97 06 call 0xd2e ; 0xd2e <lcd_waitbusy> lcd_write(cmd,0); d4a: 60 e0 ldi r22, 0x00 ; 0 d4c: 8c 2f mov r24, r28 } d4e: cf 91 pop r28 Returns: none *************************************************************************/ void lcd_command(uint8_t cmd) { lcd_waitbusy(); lcd_write(cmd,0); d50: 0c 94 5c 06 jmp 0xcb8 ; 0xcb8 <lcd_write> 00000d54 <lcd_data>: Send data byte to LCD controller Input: data to send to LCD controller, see HD44780 data sheet Returns: none *************************************************************************/ void lcd_data(uint8_t data) { d54: cf 93 push r28 d56: c8 2f mov r28, r24 lcd_waitbusy(); d58: 0e 94 97 06 call 0xd2e ; 0xd2e <lcd_waitbusy> lcd_write(data,1); d5c: 61 e0 ldi r22, 0x01 ; 1 d5e: 8c 2f mov r24, r28 } d60: cf 91 pop r28 Returns: none *************************************************************************/ void lcd_data(uint8_t data) { lcd_waitbusy(); lcd_write(data,1); d62: 0c 94 5c 06 jmp 0xcb8 ; 0xcb8 <lcd_write> 00000d66 <lcd_gotoxy>: { #if LCD_LINES==1 lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x); #endif #if LCD_LINES==2 if ( y==0 ) d66: 61 11 cpse r22, r1 d68: 02 c0 rjmp .+4 ; 0xd6e <lcd_gotoxy+0x8> lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x); d6a: 80 58 subi r24, 0x80 ; 128 d6c: 01 c0 rjmp .+2 ; 0xd70 <lcd_gotoxy+0xa> else lcd_command((1<<LCD_DDRAM)+LCD_START_LINE2+x); d6e: 80 54 subi r24, 0x40 ; 64 d70: 0c 94 a1 06 jmp 0xd42 ; 0xd42 <lcd_command> 00000d74 <lcd_getxy>: /************************************************************************* *************************************************************************/ int lcd_getxy(void) { return lcd_waitbusy(); d74: 0e 94 97 06 call 0xd2e ; 0xd2e <lcd_waitbusy> } d78: 90 e0 ldi r25, 0x00 ; 0 d7a: 08 95 ret 00000d7c <lcd_clrscr>: /************************************************************************* Clear display and set cursor to home position *************************************************************************/ void lcd_clrscr(void) { lcd_command(1<<LCD_CLR); d7c: 81 e0 ldi r24, 0x01 ; 1 d7e: 0c 94 a1 06 jmp 0xd42 ; 0xd42 <lcd_command> 00000d82 <lcd_home>: /************************************************************************* Set cursor to home position *************************************************************************/ void lcd_home(void) { lcd_command(1<<LCD_HOME); d82: 82 e0 ldi r24, 0x02 ; 2 d84: 0c 94 a1 06 jmp 0xd42 ; 0xd42 <lcd_command> 00000d88 <lcd_putc>: Display character at current cursor position Input: character to be displayed Returns: none *************************************************************************/ void lcd_putc(char c) { d88: cf 93 push r28 d8a: c8 2f mov r28, r24 uint8_t pos; pos = lcd_waitbusy(); // read busy-flag and address counter d8c: 0e 94 97 06 call 0xd2e ; 0xd2e <lcd_waitbusy> if (c=='\n') d90: ca 30 cpi r28, 0x0A ; 10 d92: 49 f4 brne .+18 ; 0xda6 <lcd_putc+0x1e> #if LCD_LINES==1 addressCounter = 0; #endif #if LCD_LINES==2 if ( pos < (LCD_START_LINE2) ) d94: 80 34 cpi r24, 0x40 ; 64 d96: 10 f0 brcs .+4 ; 0xd9c <lcd_putc+0x14> addressCounter = LCD_START_LINE2; else addressCounter = LCD_START_LINE1; d98: 80 e0 ldi r24, 0x00 ; 0 d9a: 01 c0 rjmp .+2 ; 0xd9e <lcd_putc+0x16> #if LCD_LINES==1 addressCounter = 0; #endif #if LCD_LINES==2 if ( pos < (LCD_START_LINE2) ) addressCounter = LCD_START_LINE2; d9c: 80 e4 ldi r24, 0x40 ; 64 addressCounter = LCD_START_LINE4; else addressCounter = LCD_START_LINE1; #endif #endif lcd_command((1<<LCD_DDRAM)+addressCounter); d9e: 80 58 subi r24, 0x80 ; 128 lcd_waitbusy(); #endif lcd_write(c, 1); } }/* lcd_putc */ da0: cf 91 pop r28 addressCounter = LCD_START_LINE4; else addressCounter = LCD_START_LINE1; #endif #endif lcd_command((1<<LCD_DDRAM)+addressCounter); da2: 0c 94 a1 06 jmp 0xd42 ; 0xd42 <lcd_command> lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0); } #endif lcd_waitbusy(); #endif lcd_write(c, 1); da6: 61 e0 ldi r22, 0x01 ; 1 da8: 8c 2f mov r24, r28 } }/* lcd_putc */ daa: cf 91 pop r28 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0); } #endif lcd_waitbusy(); #endif lcd_write(c, 1); dac: 0c 94 5c 06 jmp 0xcb8 ; 0xcb8 <lcd_write> 00000db0 <lcd_puts>: Input: string to be displayed Returns: none *************************************************************************/ void lcd_puts(const char *s) /* print string on lcd (no auto linefeed) */ { db0: cf 93 push r28 db2: df 93 push r29 db4: ec 01 movw r28, r24 register char c; while ( (c = *s++) ) { db6: 89 91 ld r24, Y+ db8: 88 23 and r24, r24 dba: 19 f0 breq .+6 ; 0xdc2 <lcd_puts+0x12> lcd_putc(c); dbc: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> dc0: fa cf rjmp .-12 ; 0xdb6 <lcd_puts+0x6> } }/* lcd_puts */ dc2: df 91 pop r29 dc4: cf 91 pop r28 dc6: 08 95 ret 00000dc8 <lcd_puts_p>: Input: string from program memory be be displayed Returns: none *************************************************************************/ void lcd_puts_p(const char *progmem_s) /* print string from program memory on lcd (no auto linefeed) */ { dc8: cf 93 push r28 dca: df 93 push r29 dcc: fc 01 movw r30, r24 register char c; while ( (c = pgm_read_byte(progmem_s++)) ) { dce: 84 91 lpm r24, Z dd0: ef 01 movw r28, r30 dd2: 21 96 adiw r28, 0x01 ; 1 dd4: 88 23 and r24, r24 dd6: 21 f0 breq .+8 ; 0xde0 <lcd_puts_p+0x18> lcd_putc(c); dd8: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> ddc: fe 01 movw r30, r28 dde: f7 cf rjmp .-18 ; 0xdce <lcd_puts_p+0x6> } }/* lcd_puts_p */ de0: df 91 pop r29 de2: cf 91 pop r28 de4: 08 95 ret 00000de6 <lcd_init>: LCD_DISP_ON_CURSOR display on, cursor on LCD_DISP_CURSOR_BLINK display on, cursor on flashing Returns: none *************************************************************************/ void lcd_init(uint8_t dispAttr) { de6: 1f 93 push r17 de8: cf 93 push r28 dea: df 93 push r29 dec: 18 2f mov r17, r24 } else if ( ( &LCD_DATA0_PORT == &LCD_DATA1_PORT) && ( &LCD_DATA1_PORT == &LCD_DATA2_PORT ) && ( &LCD_DATA2_PORT == &LCD_DATA3_PORT ) && (LCD_DATA0_PIN == 0 ) && (LCD_DATA1_PIN == 1) && (LCD_DATA2_PIN == 2) && (LCD_DATA3_PIN == 3) ) { /* configure all port bits as output (all LCD data lines on same port, but control lines on different ports) */ DDR(LCD_DATA0_PORT) |= 0x0F; dee: 97 b1 in r25, 0x07 ; 7 df0: 9f 60 ori r25, 0x0F ; 15 df2: 97 b9 out 0x07, r25 ; 7 DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN); df4: 24 9a sbi 0x04, 4 ; 4 DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN); df6: 25 9a sbi 0x04, 5 ; 4 DDR(LCD_E_PORT) |= _BV(LCD_E_PIN); df8: 20 9a sbi 0x04, 0 ; 4 static inline void _delayFourCycles(unsigned int __count) { if ( __count == 0 ) __asm__ __volatile__( "rjmp 1f\n 1:" ); // 2 cycles else __asm__ __volatile__ ( dfa: e0 e0 ldi r30, 0x00 ; 0 dfc: fa ef ldi r31, 0xFA ; 250 dfe: 31 97 sbiw r30, 0x01 ; 1 e00: f1 f7 brne .-4 ; 0xdfe <lcd_init+0x18> DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN); } delay(16000); /* wait 16ms or more after power-on */ /* initial write to lcd is 8bit */ LCD_DATA1_PORT |= _BV(LCD_DATA1_PIN); // _BV(LCD_FUNCTION)>>4; e02: 41 9a sbi 0x08, 1 ; 8 LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); // _BV(LCD_FUNCTION_8BIT)>>4; e04: 40 9a sbi 0x08, 0 ; 8 lcd_e_toggle(); e06: 0e 94 58 06 call 0xcb0 ; 0xcb0 <toggle_e> static inline void _delayFourCycles(unsigned int __count) { if ( __count == 0 ) __asm__ __volatile__( "rjmp 1f\n 1:" ); // 2 cycles else __asm__ __volatile__ ( e0a: e0 e0 ldi r30, 0x00 ; 0 e0c: fe e4 ldi r31, 0x4E ; 78 e0e: 31 97 sbiw r30, 0x01 ; 1 e10: f1 f7 brne .-4 ; 0xe0e <lcd_init+0x28> LCD_DATA0_PORT |= _BV(LCD_DATA0_PIN); // _BV(LCD_FUNCTION_8BIT)>>4; lcd_e_toggle(); delay(4992); /* delay, busy flag can't be checked here */ /* repeat last command */ lcd_e_toggle(); e12: 0e 94 58 06 call 0xcb0 ; 0xcb0 <toggle_e> static inline void _delayFourCycles(unsigned int __count) { if ( __count == 0 ) __asm__ __volatile__( "rjmp 1f\n 1:" ); // 2 cycles else __asm__ __volatile__ ( e16: c0 e0 ldi r28, 0x00 ; 0 e18: d1 e0 ldi r29, 0x01 ; 1 e1a: fe 01 movw r30, r28 e1c: 31 97 sbiw r30, 0x01 ; 1 e1e: f1 f7 brne .-4 ; 0xe1c <lcd_init+0x36> /* repeat last command */ lcd_e_toggle(); delay(64); /* delay, busy flag can't be checked here */ /* repeat last command a third time */ lcd_e_toggle(); e20: 0e 94 58 06 call 0xcb0 ; 0xcb0 <toggle_e> static inline void _delayFourCycles(unsigned int __count) { if ( __count == 0 ) __asm__ __volatile__( "rjmp 1f\n 1:" ); // 2 cycles else __asm__ __volatile__ ( e24: fe 01 movw r30, r28 e26: 31 97 sbiw r30, 0x01 ; 1 e28: f1 f7 brne .-4 ; 0xe26 <lcd_init+0x40> /* repeat last command a third time */ lcd_e_toggle(); delay(64); /* delay, busy flag can't be checked here */ /* now configure for 4bit mode */ LCD_DATA0_PORT &= ~_BV(LCD_DATA0_PIN); // LCD_FUNCTION_4BIT_1LINE>>4 e2a: 40 98 cbi 0x08, 0 ; 8 lcd_e_toggle(); e2c: 0e 94 58 06 call 0xcb0 ; 0xcb0 <toggle_e> static inline void _delayFourCycles(unsigned int __count) { if ( __count == 0 ) __asm__ __volatile__( "rjmp 1f\n 1:" ); // 2 cycles else __asm__ __volatile__ ( e30: 21 97 sbiw r28, 0x01 ; 1 e32: f1 f7 brne .-4 ; 0xe30 <lcd_init+0x4a> /* Display with KS0073 controller requires special commands for enabling 4 line mode */ lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_ON); lcd_command(KS0073_4LINES_MODE); lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_OFF); #else lcd_command(LCD_FUNCTION_DEFAULT); /* function set: display lines */ e34: 88 e2 ldi r24, 0x28 ; 40 e36: 0e 94 a1 06 call 0xd42 ; 0xd42 <lcd_command> #endif lcd_command(LCD_DISP_OFF); /* display off */ e3a: 88 e0 ldi r24, 0x08 ; 8 e3c: 0e 94 a1 06 call 0xd42 ; 0xd42 <lcd_command> lcd_clrscr(); /* display clear */ e40: 0e 94 be 06 call 0xd7c ; 0xd7c <lcd_clrscr> lcd_command(LCD_MODE_DEFAULT); /* set entry mode */ e44: 86 e0 ldi r24, 0x06 ; 6 e46: 0e 94 a1 06 call 0xd42 ; 0xd42 <lcd_command> lcd_command(dispAttr); /* display/cursor control */ e4a: 81 2f mov r24, r17 }/* lcd_init */ e4c: df 91 pop r29 e4e: cf 91 pop r28 e50: 1f 91 pop r17 lcd_command(LCD_FUNCTION_DEFAULT); /* function set: display lines */ #endif lcd_command(LCD_DISP_OFF); /* display off */ lcd_clrscr(); /* display clear */ lcd_command(LCD_MODE_DEFAULT); /* set entry mode */ lcd_command(dispAttr); /* display/cursor control */ e52: 0c 94 a1 06 jmp 0xd42 ; 0xd42 <lcd_command> 00000e56 <main>: * Lets initialize all variables here - even if its only for completeness *******************************************************************************************+ */ int main(void) { cli(); e56: f8 94 cli // variables amplitude = 0 ; e58: 61 2c mov r6, r1 speedInput = 0 ; e5a: 10 92 3a 01 sts 0x013A, r1 ; 0x80013a <speedInput> Inco = 1; e5e: 88 24 eor r8, r8 e60: 83 94 inc r8 parameter = 0; e62: 10 92 21 01 sts 0x0121, r1 ; 0x800121 <parameter> */ static void PortsInit(void) { // Port C is LCD Data Output and ADC Input // the LCD lib does this on its own, but here for completeness DDRC = 0b00001111; e66: 8f e0 ldi r24, 0x0F ; 15 e68: 87 b9 out 0x07, r24 ; 7 // PORTB, PORTD outputs // clr pullups but do nothing else here. The sine driver will take care of the output states PORTB &= ~(PWM_PATTERN_PORTB); e6a: 85 b1 in r24, 0x05 ; 5 e6c: 81 7f andi r24, 0xF1 ; 241 e6e: 85 b9 out 0x05, r24 ; 5 PORTD &= ~(PWM_PATTERN_PORTD); e70: 8b b1 in r24, 0x0b ; 11 e72: 87 79 andi r24, 0x97 ; 151 e74: 8b b9 out 0x0b, r24 ; 11 // Set the inputs on Port D for the three buttons DDRD &= ~BUTTON_MASK; e76: 8a b1 in r24, 0x0a ; 10 e78: 88 7f andi r24, 0xF8 ; 248 e7a: 8a b9 out 0x0a, r24 ; 10 // Enable pull-up on input signals. PORTD |= _BV(DIRECTION_COMMAND_PIN) | _BV(EXTERNAL_CONTROL_PIN) | BUTTON_MASK ; e7c: 8b b1 in r24, 0x0b ; 11 e7e: 87 69 ori r24, 0x97 ; 151 e80: 8b b9 out 0x0b, r24 ; 11 Inco = 1; parameter = 0; //Initialize peripherals. PortsInit(); /* initialize display, cursor off */ lcd_init(LCD_DISP_ON); e82: 8c e0 ldi r24, 0x0C ; 12 e84: 0e 94 f3 06 call 0xde6 ; 0xde6 <lcd_init> lcd_home(); e88: 0e 94 c1 06 call 0xd82 ; 0xd82 <lcd_home> #ifdef PURE_SINE_DRIVE lcd_puts_P( "VF Sinus Drive\n" ); #else lcd_puts_P( "VF Motor Drive\n" ); e8c: 8d eb ldi r24, 0xBD ; 189 e8e: 90 e0 ldi r25, 0x00 ; 0 e90: 0e 94 e4 06 call 0xdc8 ; 0xdc8 <lcd_puts_p> #endif lcd_putc('0'); // diagnostic outputs e94: 80 e3 ldi r24, 0x30 ; 48 e96: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> * all PWM signals are aligned. */ static void TimersInit(void) { //Set all timers in "Phase correct mode". Do not enable outputs yet. TCCR0A = (1 << WGM00); e9a: 81 e0 ldi r24, 0x01 ; 1 e9c: 84 bd out 0x24, r24 ; 36 TCCR1A = (1 << WGM11); e9e: 92 e0 ldi r25, 0x02 ; 2 ea0: 90 93 80 00 sts 0x0080, r25 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7e0080> TCCR2A = (1 << WGM20); ea4: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7e00b0> //Set top value of Timer/counter1. ICR1 = 0xff; ea8: 2f ef ldi r18, 0xFF ; 255 eaa: 30 e0 ldi r19, 0x00 ; 0 eac: 30 93 87 00 sts 0x0087, r19 ; 0x800087 <__TEXT_REGION_LENGTH__+0x7e0087> eb0: 20 93 86 00 sts 0x0086, r18 ; 0x800086 <__TEXT_REGION_LENGTH__+0x7e0086> //Synchronize timers. These values were determined by running the simulator TCNT0 = 0; eb4: 16 bc out 0x26, r1 ; 38 TCNT1 = 3; eb6: 23 e0 ldi r18, 0x03 ; 3 eb8: 30 e0 ldi r19, 0x00 ; 0 eba: 30 93 85 00 sts 0x0085, r19 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7e0085> ebe: 20 93 84 00 sts 0x0084, r18 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7e0084> TCNT2 = 5; ec2: 95 e0 ldi r25, 0x05 ; 5 ec4: 90 93 b2 00 sts 0x00B2, r25 ; 0x8000b2 <__TEXT_REGION_LENGTH__+0x7e00b2> // Start all 3 timers. TCCR0B = (0 << CS01) | (1 << CS00); ec8: 85 bd out 0x25, r24 ; 37 TCCR1B = (1 << WGM13) | (0 << CS11) | (1 << CS10); eca: 91 e1 ldi r25, 0x11 ; 17 ecc: 90 93 81 00 sts 0x0081, r25 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081> TCCR2B = (0 << CS21) | (1 << CS20); ed0: 80 93 b1 00 sts 0x00B1, r24 ; 0x8000b1 <__TEXT_REGION_LENGTH__+0x7e00b1> lcd_puts_P( "VF Motor Drive\n" ); #endif lcd_putc('0'); // diagnostic outputs // timers TimersInit(); lcd_putc('1'); ed4: 81 e3 ldi r24, 0x31 ; 49 ed6: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> */ static void PinChangeIntInit(void) { // Initialize pin change interrupt on direction command pin // PD7 is PCINT23 PCMSK2 = _BV(PCINT23); eda: 80 e8 ldi r24, 0x80 ; 128 edc: 80 93 6d 00 sts 0x006D, r24 ; 0x80006d <__TEXT_REGION_LENGTH__+0x7e006d> // Enable pin change interrupt on ports with pin change signals PCICR = (1 << PCIE2); ee0: 84 e0 ldi r24, 0x04 ; 4 ee2: 80 93 68 00 sts 0x0068, r24 ; 0x800068 <__TEXT_REGION_LENGTH__+0x7e0068> // timers TimersInit(); lcd_putc('1'); // jumpers PinChangeIntInit(); lcd_putc('2'); ee6: 82 e3 ldi r24, 0x32 ; 50 ee8: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> * remember this is init only and will only be run ONCE... */ static void ADCInit(void) { ADCSRA = (1 << ADEN) | (0 << ADSC) | (0 << ADATE) | (1 << ADIF) | (0 << ADIE) | (ADC_PRESCALER); eec: 86 e9 ldi r24, 0x96 ; 150 eee: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a> // disable digital inputs on analog channels DIDR0 = ( 1 << ADC_CHANNEL_FREQUENCY) | (1 << ADC_CHANNEL_AMPLITUDE ); ef2: 80 e3 ldi r24, 0x30 ; 48 ef4: 80 93 7e 00 sts 0x007E, r24 ; 0x80007e <__TEXT_REGION_LENGTH__+0x7e007e> //Select initial AD conversion channel. ADMUX = ADMUX_FREQUENCY; ef8: 84 e6 ldi r24, 0x64 ; 100 efa: 80 93 7c 00 sts 0x007C, r24 ; 0x80007c <__TEXT_REGION_LENGTH__+0x7e007c> //Set trigger source to free run ADCSRB = (0 << ADTS2) | (0 << ADTS1) | (0 << ADTS0); efe: 10 92 7b 00 sts 0x007B, r1 ; 0x80007b <__TEXT_REGION_LENGTH__+0x7e007b> //Initialize ADC and start once, no IRQ ADCSRA = (1 << ADEN) | (1 << ADSC) | (0 << ADATE) | (0 << ADIF) | (0 << ADIE) | (ADC_PRESCALER); f02: 86 ec ldi r24, 0xC6 ; 198 f04: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a> /* This really does nothing except restarting the ADC with IRQ enabled * If you want to calibrate, do it here. */ static void CalibADC(void) { DisablePWMOutputs(); f08: 0e 94 b1 02 call 0x562 ; 0x562 <DisablePWMOutputs> f0c: 2f ef ldi r18, 0xFF ; 255 f0e: 83 ec ldi r24, 0xC3 ; 195 f10: 99 e0 ldi r25, 0x09 ; 9 f12: 21 50 subi r18, 0x01 ; 1 f14: 80 40 sbci r24, 0x00 ; 0 f16: 90 40 sbci r25, 0x00 ; 0 f18: e1 f7 brne .-8 ; 0xf12 <main+0xbc> f1a: 00 c0 rjmp .+0 ; 0xf1c <main+0xc6> f1c: 00 00 nop _delay_ms(200); //Initialize ADC and restart, now with IRQ ADCSRA = (1 << ADEN) | (1 << ADSC) | (0 << ADATE) | (1 << ADIF) | (1 << ADIE) | (ADC_PRESCALER); f1e: 8e ed ldi r24, 0xDE ; 222 f20: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a> // jumpers PinChangeIntInit(); lcd_putc('2'); // analog ADCInit(); lcd_putc('3'); f24: 83 e3 ldi r24, 0x33 ; 51 f26: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> PID_Init(PID_K_P, PID_K_I, PID_K_D,(pidData_t *) &pidParameters); f2a: 26 e2 ldi r18, 0x26 ; 38 f2c: 31 e0 ldi r19, 0x01 ; 1 f2e: 40 e1 ldi r20, 0x10 ; 16 f30: 50 e0 ldi r21, 0x00 ; 0 f32: 68 e0 ldi r22, 0x08 ; 8 f34: 70 e0 ldi r23, 0x00 ; 0 f36: 80 e6 ldi r24, 0x60 ; 96 f38: 90 e0 ldi r25, 0x00 ; 0 f3a: 0e 94 d7 01 call 0x3ae ; 0x3ae <PID_Init> lcd_putc('4'); f3e: 84 e3 ldi r24, 0x34 ; 52 f40: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> //Initialize fastflags { fastFlags.externalControl = FALSE; f44: e8 94 clt f46: 90 f8 bld r9, 0 fastFlags.desiredDirection = DIRECTION_FORWARD; f48: e8 94 clt f4a: 91 f8 bld r9, 1 fastFlags.driveWaveform = WAVEFORM_UNDEFINED; f4c: e9 2d mov r30, r9 f4e: ec 60 ori r30, 0x0C ; 12 f50: 9e 2e mov r9, r30 } lcd_putc('5'); f52: 85 e3 ldi r24, 0x35 ; 53 f54: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> * Running this function triggers a reading of the direction * input pin. The desiredDirection flag is set accordingly. */ static void DesiredDirectionUpdate(void) { if ( bit_is_clear(PIND,DIRECTION_COMMAND_PIN) ) f58: 89 b1 in r24, 0x09 ; 9 { fastFlags.desiredDirection = DIRECTION_REVERSE; f5a: 80 95 com r24 f5c: 88 1f adc r24, r24 f5e: 88 27 eor r24, r24 f60: 88 1f adc r24, r24 f62: 80 fb bst r24, 0 f64: 91 f8 bld r9, 1 /* select control method by examining the EXTERNAL_CONTROL_PIN * if it is jumpered to ground, we derive V/Hz and Inco from analog signals */ static void DesiredControlUpdate(void) { if ( bit_is_clear(PIND,EXTERNAL_CONTROL_PIN) ) f66: 4c 99 sbic 0x09, 4 ; 9 f68: 03 c0 rjmp .+6 ; 0xf70 <main+0x11a> { fastFlags.externalControl = TRUE; f6a: 68 94 set f6c: 90 f8 bld r9, 0 f6e: 02 c0 rjmp .+4 ; 0xf74 <main+0x11e> } else { fastFlags.externalControl = FALSE; f70: e8 94 clt f72: 90 f8 bld r9, 0 lcd_putc('5'); // read the port pins and set fastFlags accordingly DesiredDirectionUpdate(); DesiredControlUpdate(); // Enable Timer1 capture event interrupt. TIFR1 = _BV(ICF1) | _BV(OCF1B) | _BV(OCF1A) | _BV(TOV1) ; f74: 87 e2 ldi r24, 0x27 ; 39 f76: 86 bb out 0x16, r24 ; 22 TIMSK1 = _BV(ICIE1); f78: 80 e2 ldi r24, 0x20 ; 32 f7a: 80 93 6f 00 sts 0x006F, r24 ; 0x80006f <__TEXT_REGION_LENGTH__+0x7e006f> lcd_putc('6'); f7e: 86 e3 ldi r24, 0x36 ; 54 f80: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> f84: ff ef ldi r31, 0xFF ; 255 f86: 29 e6 ldi r18, 0x69 ; 105 f88: 88 e1 ldi r24, 0x18 ; 24 f8a: f1 50 subi r31, 0x01 ; 1 f8c: 20 40 sbci r18, 0x00 ; 0 f8e: 80 40 sbci r24, 0x00 ; 0 f90: e1 f7 brne .-8 ; 0xf8a <main+0x134> f92: 00 c0 rjmp .+0 ; 0xf94 <main+0x13e> f94: 00 00 nop * A fail here would be fatal to the PA. So if somehow a wrong value is read * we set to MIN_DEAD_TIME to save the life of the PA. */ static void EEPROMInit(void) { lcd_gotoxy(0,1); f96: 61 e0 ldi r22, 0x01 ; 1 f98: 80 e0 ldi r24, 0x00 ; 0 f9a: 0e 94 b3 06 call 0xd66 ; 0xd66 <lcd_gotoxy> lcd_puts_P( "Reading EEPROM "); f9e: 8b e9 ldi r24, 0x9B ; 155 fa0: 90 e0 ldi r25, 0x00 ; 0 fa2: 0e 94 e4 06 call 0xdc8 ; 0xdc8 <lcd_puts_p> DEAD_TIME_HALF = eeprom_read_byte(&ee_DEAD_TIME_HALF); fa6: 88 e0 ldi r24, 0x08 ; 8 fa8: 90 e0 ldi r25, 0x00 ; 0 faa: 0e 94 ad 09 call 0x135a ; 0x135a <eeprom_read_byte> fae: 80 93 1e 01 sts 0x011E, r24 ; 0x80011e <DEAD_TIME_HALF> if (DEAD_TIME_HALF < MIN_DEAD_TIME) DEAD_TIME_HALF = MIN_DEAD_TIME; fb2: 80 91 1e 01 lds r24, 0x011E ; 0x80011e <DEAD_TIME_HALF> fb6: 88 30 cpi r24, 0x08 ; 8 fb8: 18 f4 brcc .+6 ; 0xfc0 <main+0x16a> fba: 88 e0 ldi r24, 0x08 ; 8 fbc: 80 93 1e 01 sts 0x011E, r24 ; 0x80011e <DEAD_TIME_HALF> // Working parameters Inco = eeprom_read_byte(&ee_Inco); fc0: 87 e0 ldi r24, 0x07 ; 7 fc2: 90 e0 ldi r25, 0x00 ; 0 fc4: 0e 94 ad 09 call 0x135a ; 0x135a <eeprom_read_byte> fc8: 88 2e mov r8, r24 VperHz = eeprom_read_byte(&ee_VperHz); fca: 86 e0 ldi r24, 0x06 ; 6 fcc: 90 e0 ldi r25, 0x00 ; 0 fce: 0e 94 ad 09 call 0x135a ; 0x135a <eeprom_read_byte> fd2: 78 2e mov r7, r24 // PID values pidParameters.P_Factor = eeprom_read_word(&ee_pid_P); fd4: 84 e0 ldi r24, 0x04 ; 4 fd6: 90 e0 ldi r25, 0x00 ; 0 fd8: 0e 94 b5 09 call 0x136a ; 0x136a <eeprom_read_word> fdc: 90 93 2d 01 sts 0x012D, r25 ; 0x80012d <pidParameters+0x7> fe0: 80 93 2c 01 sts 0x012C, r24 ; 0x80012c <pidParameters+0x6> pidParameters.I_Factor = eeprom_read_word(&ee_pid_I); fe4: 82 e0 ldi r24, 0x02 ; 2 fe6: 90 e0 ldi r25, 0x00 ; 0 fe8: 0e 94 b5 09 call 0x136a ; 0x136a <eeprom_read_word> fec: 90 93 2f 01 sts 0x012F, r25 ; 0x80012f <pidParameters+0x9> ff0: 80 93 2e 01 sts 0x012E, r24 ; 0x80012e <pidParameters+0x8> pidParameters.D_Factor = eeprom_read_word(&ee_pid_D); ff4: 80 e0 ldi r24, 0x00 ; 0 ff6: 90 e0 ldi r25, 0x00 ; 0 ff8: 0e 94 b5 09 call 0x136a ; 0x136a <eeprom_read_word> ffc: 90 93 31 01 sts 0x0131, r25 ; 0x800131 <pidParameters+0xb> 1000: 80 93 30 01 sts 0x0130, r24 ; 0x800130 <pidParameters+0xa> 1004: 9f ef ldi r25, 0xFF ; 255 1006: e9 e6 ldi r30, 0x69 ; 105 1008: f8 e1 ldi r31, 0x18 ; 24 100a: 91 50 subi r25, 0x01 ; 1 100c: e0 40 sbci r30, 0x00 ; 0 100e: f0 40 sbci r31, 0x00 ; 0 1010: e1 f7 brne .-8 ; 0x100a <main+0x1b4> 1012: 00 c0 rjmp .+0 ; 0x1014 <main+0x1be> 1014: 00 00 nop _delay_ms(500); lcd_gotoxy(0,1); 1016: 61 e0 ldi r22, 0x01 ; 1 1018: 80 e0 ldi r24, 0x00 ; 0 101a: 0e 94 b3 06 call 0xd66 ; 0xd66 <lcd_gotoxy> lcd_puts_P( "Read Done "); 101e: 8a e8 ldi r24, 0x8A ; 138 1020: 90 e0 ldi r25, 0x00 ; 0 1022: 0e 94 e4 06 call 0xdc8 ; 0xdc8 <lcd_puts_p> 1026: 2f ef ldi r18, 0xFF ; 255 1028: 89 e6 ldi r24, 0x69 ; 105 102a: 98 e1 ldi r25, 0x18 ; 24 102c: 21 50 subi r18, 0x01 ; 1 102e: 80 40 sbci r24, 0x00 ; 0 1030: 90 40 sbci r25, 0x00 ; 0 1032: e1 f7 brne .-8 ; 0x102c <main+0x1d6> 1034: 00 c0 rjmp .+0 ; 0x1036 <main+0x1e0> 1036: 00 00 nop /* wait for button release * Don't ask why this is here --- ok, you may ask: Its here if some fool powers * up the VFD and keeps the buttons pressed or the buttons somehow are stuck. * That would probly lead to undesired operation and so - - - lets wait */ if (keyin() > 0){}; 1038: 0e 94 36 03 call 0x66c ; 0x66c <keyin> TIMSK1 = _BV(ICIE1); lcd_putc('6'); _delay_ms(500); // read in stored values EEPROMInit(); lcd_putc('7'); 103c: 87 e3 ldi r24, 0x37 ; 55 103e: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> lcd_clrscr(); 1042: 0e 94 be 06 call 0xd7c ; 0xd7c <lcd_clrscr> lcd_command(LCD_DISP_ON_CURSOR); 1046: 8e e0 ldi r24, 0x0E ; 14 1048: 0e 94 a1 06 call 0xd42 ; 0xd42 <lcd_command> // this line is only written once, actual values are always displayed in line 2 lcd_puts_P( "Freq V/Hz Amp " ); 104c: 8c ea ldi r24, 0xAC ; 172 104e: 90 e0 ldi r25, 0x00 ; 0 1050: 0e 94 e4 06 call 0xdc8 ; 0xdc8 <lcd_puts_p> /* activate the engine by enabling interrupts globally and let sine driver take over. */ sei(); 1054: 78 94 sei if (keyin() > 0) { i++; if (i<10) _delay_ms(60); else { _delay_ms(10); i = 11; 1056: 0b e0 ldi r16, 0x0B ; 11 const uint8_t *p = cursorpos; lcd_gotoxy(0,1); printdec(freq);printspc();lcd_gotoxy(6,1); printdec(VperHz);printspc();printspc();lcd_gotoxy(12,1); printnum((uint16_t)(amplitude*100)/255);lcd_putc('%');printspc(); 1058: cf ef ldi r28, 0xFF ; 255 105a: d0 e0 ldi r29, 0x00 ; 0 */ static void execCommand(void) { char n; static uint8_t i; n = keyin(); 105c: 0e 94 36 03 call 0x66c ; 0x66c <keyin> // first make sure we get inputs from buttons and not from analog inputs if (!fastFlags.externalControl){ 1060: 90 fc sbrc r9, 0 1062: 3f c0 rjmp .+126 ; 0x10e2 <main+0x28c> switch (n) 1064: 82 30 cpi r24, 0x02 ; 2 1066: a9 f0 breq .+42 ; 0x1092 <main+0x23c> 1068: 18 f4 brcc .+6 ; 0x1070 <main+0x21a> 106a: 81 30 cpi r24, 0x01 ; 1 106c: 31 f0 breq .+12 ; 0x107a <main+0x224> 106e: 3e c0 rjmp .+124 ; 0x10ec <main+0x296> 1070: 83 30 cpi r24, 0x03 ; 3 1072: c9 f1 breq .+114 ; 0x10e6 <main+0x290> 1074: 84 30 cpi r24, 0x04 ; 4 1076: 01 f1 breq .+64 ; 0x10b8 <main+0x262> 1078: 39 c0 rjmp .+114 ; 0x10ec <main+0x296> { // black button - cycle through parameters case 1 : parameter++; if (parameter > NUMPARAMS) parameter = 0; 107a: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <parameter> 107e: 8f 5f subi r24, 0xFF ; 255 1080: 80 93 21 01 sts 0x0121, r24 ; 0x800121 <parameter> 1084: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <parameter> 1088: 82 30 cpi r24, 0x02 ; 2 108a: 90 f1 brcs .+100 ; 0x10f0 <main+0x29a> 108c: 10 92 21 01 sts 0x0121, r1 ; 0x800121 <parameter> 1090: 2f c0 rjmp .+94 ; 0x10f0 <main+0x29a> break; // red button - decrement parameter case 2 : switch (parameter) { 1092: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <parameter> 1096: 88 23 and r24, r24 1098: 19 f0 breq .+6 ; 0x10a0 <main+0x24a> 109a: 81 30 cpi r24, 0x01 ; 1 109c: 39 f0 breq .+14 ; 0x10ac <main+0x256> 109e: 28 c0 rjmp .+80 ; 0x10f0 <main+0x29a> case 0 : if (Inco < 1) Inco = 1; 10a0: 81 10 cpse r8, r1 10a2: 02 c0 rjmp .+4 ; 0x10a8 <main+0x252> 10a4: 88 24 eor r8, r8 10a6: 83 94 inc r8 Inco--; 10a8: 8a 94 dec r8 10aa: 22 c0 rjmp .+68 ; 0x10f0 <main+0x29a> break; case 1 : if (VperHz < 1) VperHz = 1; 10ac: 71 10 cpse r7, r1 10ae: 02 c0 rjmp .+4 ; 0x10b4 <main+0x25e> 10b0: 77 24 eor r7, r7 10b2: 73 94 inc r7 VperHz--; 10b4: 7a 94 dec r7 10b6: 1c c0 rjmp .+56 ; 0x10f0 <main+0x29a> default : break; } break; // green button - increment parameter case 4 : switch (parameter) { 10b8: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <parameter> 10bc: 88 23 and r24, r24 10be: 19 f0 breq .+6 ; 0x10c6 <main+0x270> 10c0: 81 30 cpi r24, 0x01 ; 1 10c2: 41 f0 breq .+16 ; 0x10d4 <main+0x27e> 10c4: 15 c0 rjmp .+42 ; 0x10f0 <main+0x29a> case 0 :if (Inco > 254) Inco = 254; 10c6: ef ef ldi r30, 0xFF ; 255 10c8: 8e 12 cpse r8, r30 10ca: 02 c0 rjmp .+4 ; 0x10d0 <main+0x27a> 10cc: 2e ef ldi r18, 0xFE ; 254 10ce: 82 2e mov r8, r18 Inco++; 10d0: 83 94 inc r8 10d2: 0e c0 rjmp .+28 ; 0x10f0 <main+0x29a> break; case 1 :if (VperHz > 254) VperHz = 254; 10d4: ff ef ldi r31, 0xFF ; 255 10d6: 7f 12 cpse r7, r31 10d8: 02 c0 rjmp .+4 ; 0x10de <main+0x288> 10da: 9e ef ldi r25, 0xFE ; 254 10dc: 79 2e mov r7, r25 VperHz++; 10de: 73 94 inc r7 10e0: 07 c0 rjmp .+14 ; 0x10f0 <main+0x29a> break; default: i = 0; break; } // switch } else { // external control // with external control we only can go to the extended menu switch (n) 10e2: 83 30 cpi r24, 0x03 ; 3 10e4: 19 f4 brne .+6 ; 0x10ec <main+0x296> { // pressing black (1) and red (2) button simultaneously goes to sub menu case 3 : execExtendedCommand(); 10e6: 0e 94 9b 03 call 0x736 ; 0x736 <execExtendedCommand> 10ea: 02 c0 rjmp .+4 ; 0x10f0 <main+0x29a> break; default: i = 0; break; 10ec: 10 92 23 01 sts 0x0123, r1 ; 0x800123 <i.2396> } // switch } // external control // simple autorepeater if (keyin() > 0) { 10f0: 0e 94 36 03 call 0x66c ; 0x66c <keyin> 10f4: 88 23 and r24, r24 10f6: c9 f0 breq .+50 ; 0x112a <main+0x2d4> i++; 10f8: 80 91 23 01 lds r24, 0x0123 ; 0x800123 <i.2396> 10fc: 8f 5f subi r24, 0xFF ; 255 10fe: 80 93 23 01 sts 0x0123, r24 ; 0x800123 <i.2396> if (i<10) _delay_ms(60); 1102: 8a 30 cpi r24, 0x0A ; 10 1104: 50 f4 brcc .+20 ; 0x111a <main+0x2c4> 1106: 2f ef ldi r18, 0xFF ; 255 1108: 8d ee ldi r24, 0xED ; 237 110a: 92 e0 ldi r25, 0x02 ; 2 110c: 21 50 subi r18, 0x01 ; 1 110e: 80 40 sbci r24, 0x00 ; 0 1110: 90 40 sbci r25, 0x00 ; 0 1112: e1 f7 brne .-8 ; 0x110c <main+0x2b6> 1114: 00 c0 rjmp .+0 ; 0x1116 <main+0x2c0> 1116: 00 00 nop 1118: 08 c0 rjmp .+16 ; 0x112a <main+0x2d4> 111a: ef e3 ldi r30, 0x3F ; 63 111c: fc e9 ldi r31, 0x9C ; 156 111e: 31 97 sbiw r30, 0x01 ; 1 1120: f1 f7 brne .-4 ; 0x111e <main+0x2c8> 1122: 00 c0 rjmp .+0 ; 0x1124 <main+0x2ce> 1124: 00 00 nop else { _delay_ms(10); i = 11; 1126: 00 93 23 01 sts 0x0123, r16 ; 0x800123 <i.2396> */ static void showPars(void) { const uint8_t *p = cursorpos; lcd_gotoxy(0,1); 112a: 61 e0 ldi r22, 0x01 ; 1 112c: 80 e0 ldi r24, 0x00 ; 0 112e: 0e 94 b3 06 call 0xd66 ; 0xd66 <lcd_gotoxy> printdec(freq);printspc();lcd_gotoxy(6,1); 1132: 80 91 24 01 lds r24, 0x0124 ; 0x800124 <freq> 1136: 90 91 25 01 lds r25, 0x0125 ; 0x800125 <freq+0x1> 113a: 0e 94 d8 02 call 0x5b0 ; 0x5b0 <printdec> 113e: 0e 94 d5 02 call 0x5aa ; 0x5aa <printspc> 1142: 61 e0 ldi r22, 0x01 ; 1 1144: 86 e0 ldi r24, 0x06 ; 6 1146: 0e 94 b3 06 call 0xd66 ; 0xd66 <lcd_gotoxy> printdec(VperHz);printspc();printspc();lcd_gotoxy(12,1); 114a: 87 2d mov r24, r7 114c: 90 e0 ldi r25, 0x00 ; 0 114e: 0e 94 d8 02 call 0x5b0 ; 0x5b0 <printdec> 1152: 0e 94 d5 02 call 0x5aa ; 0x5aa <printspc> 1156: 0e 94 d5 02 call 0x5aa ; 0x5aa <printspc> 115a: 61 e0 ldi r22, 0x01 ; 1 115c: 8c e0 ldi r24, 0x0C ; 12 115e: 0e 94 b3 06 call 0xd66 ; 0xd66 <lcd_gotoxy> printnum((uint16_t)(amplitude*100)/255);lcd_putc('%');printspc(); 1162: f4 e6 ldi r31, 0x64 ; 100 1164: 6f 9e mul r6, r31 1166: c0 01 movw r24, r0 1168: 11 24 eor r1, r1 116a: be 01 movw r22, r28 116c: 0e 94 ed 08 call 0x11da ; 0x11da <__udivmodhi4> 1170: cb 01 movw r24, r22 1172: 4a e0 ldi r20, 0x0A ; 10 1174: 60 e0 ldi r22, 0x00 ; 0 1176: 71 e0 ldi r23, 0x01 ; 1 1178: 0e 94 78 09 call 0x12f0 ; 0x12f0 <__itoa_ncheck> lcd_putc(dectable[n]); } } static void printnum(int16_t number) { uint8_t n,i; a = itoa(number,dectable,10); 117c: 80 93 3b 01 sts 0x013B, r24 ; 0x80013b <a> i = strlen(dectable); 1180: e0 e0 ldi r30, 0x00 ; 0 1182: f1 e0 ldi r31, 0x01 ; 1 1184: 01 90 ld r0, Z+ 1186: 00 20 and r0, r0 1188: e9 f7 brne .-6 ; 0x1184 <main+0x32e> 118a: 31 97 sbiw r30, 0x01 ; 1 118c: e0 50 subi r30, 0x00 ; 0 118e: f1 40 sbci r31, 0x01 ; 1 1190: 1e 2f mov r17, r30 1192: 80 e0 ldi r24, 0x00 ; 0 1194: e8 2e mov r14, r24 1196: 81 e0 ldi r24, 0x01 ; 1 1198: f8 2e mov r15, r24 119a: 67 01 movw r12, r14 119c: 8c 2d mov r24, r12 119e: 8e 19 sub r24, r14 for (n=0;n < i;n++) { 11a0: 81 17 cp r24, r17 11a2: 30 f4 brcc .+12 ; 0x11b0 <main+0x35a> lcd_putc(dectable[n]); 11a4: f6 01 movw r30, r12 11a6: 81 91 ld r24, Z+ 11a8: 6f 01 movw r12, r30 11aa: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> 11ae: f6 cf rjmp .-20 ; 0x119c <main+0x346> const uint8_t *p = cursorpos; lcd_gotoxy(0,1); printdec(freq);printspc();lcd_gotoxy(6,1); printdec(VperHz);printspc();printspc();lcd_gotoxy(12,1); printnum((uint16_t)(amplitude*100)/255);lcd_putc('%');printspc(); 11b0: 85 e2 ldi r24, 0x25 ; 37 11b2: 0e 94 c4 06 call 0xd88 ; 0xd88 <lcd_putc> 11b6: 0e 94 d5 02 call 0x5aa ; 0x5aa <printspc> lcd_gotoxy(pgm_read_byte(p+parameter),1); // set cursor below active parameter 11ba: e0 91 21 01 lds r30, 0x0121 ; 0x800121 <parameter> 11be: f0 e0 ldi r31, 0x00 ; 0 11c0: e7 5d subi r30, 0xD7 ; 215 11c2: fe 4f sbci r31, 0xFE ; 254 11c4: 84 91 lpm r24, Z 11c6: 61 e0 ldi r22, 0x01 ; 1 11c8: 0e 94 b3 06 call 0xd66 ; 0xd66 <lcd_gotoxy> 11cc: 8f e1 ldi r24, 0x1F ; 31 11ce: 9e e4 ldi r25, 0x4E ; 78 11d0: 01 97 sbiw r24, 0x01 ; 1 11d2: f1 f7 brne .-4 ; 0x11d0 <main+0x37a> 11d4: 00 c0 rjmp .+0 ; 0x11d6 <main+0x380> 11d6: 00 00 nop 11d8: 41 cf rjmp .-382 ; 0x105c <main+0x206> 000011da <__udivmodhi4>: 11da: aa 1b sub r26, r26 11dc: bb 1b sub r27, r27 11de: 51 e1 ldi r21, 0x11 ; 17 11e0: 07 c0 rjmp .+14 ; 0x11f0 <__udivmodhi4_ep> 000011e2 <__udivmodhi4_loop>: 11e2: aa 1f adc r26, r26 11e4: bb 1f adc r27, r27 11e6: a6 17 cp r26, r22 11e8: b7 07 cpc r27, r23 11ea: 10 f0 brcs .+4 ; 0x11f0 <__udivmodhi4_ep> 11ec: a6 1b sub r26, r22 11ee: b7 0b sbc r27, r23 000011f0 <__udivmodhi4_ep>: 11f0: 88 1f adc r24, r24 11f2: 99 1f adc r25, r25 11f4: 5a 95 dec r21 11f6: a9 f7 brne .-22 ; 0x11e2 <__udivmodhi4_loop> 11f8: 80 95 com r24 11fa: 90 95 com r25 11fc: bc 01 movw r22, r24 11fe: cd 01 movw r24, r26 1200: 08 95 ret 00001202 <__divmodhi4>: 1202: 97 fb bst r25, 7 1204: 07 2e mov r0, r23 1206: 16 f4 brtc .+4 ; 0x120c <__divmodhi4+0xa> 1208: 00 94 com r0 120a: 07 d0 rcall .+14 ; 0x121a <__divmodhi4_neg1> 120c: 77 fd sbrc r23, 7 120e: 09 d0 rcall .+18 ; 0x1222 <__divmodhi4_neg2> 1210: 0e 94 ed 08 call 0x11da ; 0x11da <__udivmodhi4> 1214: 07 fc sbrc r0, 7 1216: 05 d0 rcall .+10 ; 0x1222 <__divmodhi4_neg2> 1218: 3e f4 brtc .+14 ; 0x1228 <__divmodhi4_exit> 0000121a <__divmodhi4_neg1>: 121a: 90 95 com r25 121c: 81 95 neg r24 121e: 9f 4f sbci r25, 0xFF ; 255 1220: 08 95 ret 00001222 <__divmodhi4_neg2>: 1222: 70 95 com r23 1224: 61 95 neg r22 1226: 7f 4f sbci r23, 0xFF ; 255 00001228 <__divmodhi4_exit>: 1228: 08 95 ret 0000122a <__udivmodsi4>: 122a: a1 e2 ldi r26, 0x21 ; 33 122c: 1a 2e mov r1, r26 122e: aa 1b sub r26, r26 1230: bb 1b sub r27, r27 1232: fd 01 movw r30, r26 1234: 0d c0 rjmp .+26 ; 0x1250 <__udivmodsi4_ep> 00001236 <__udivmodsi4_loop>: 1236: aa 1f adc r26, r26 1238: bb 1f adc r27, r27 123a: ee 1f adc r30, r30 123c: ff 1f adc r31, r31 123e: a2 17 cp r26, r18 1240: b3 07 cpc r27, r19 1242: e4 07 cpc r30, r20 1244: f5 07 cpc r31, r21 1246: 20 f0 brcs .+8 ; 0x1250 <__udivmodsi4_ep> 1248: a2 1b sub r26, r18 124a: b3 0b sbc r27, r19 124c: e4 0b sbc r30, r20 124e: f5 0b sbc r31, r21 00001250 <__udivmodsi4_ep>: 1250: 66 1f adc r22, r22 1252: 77 1f adc r23, r23 1254: 88 1f adc r24, r24 1256: 99 1f adc r25, r25 1258: 1a 94 dec r1 125a: 69 f7 brne .-38 ; 0x1236 <__udivmodsi4_loop> 125c: 60 95 com r22 125e: 70 95 com r23 1260: 80 95 com r24 1262: 90 95 com r25 1264: 9b 01 movw r18, r22 1266: ac 01 movw r20, r24 1268: bd 01 movw r22, r26 126a: cf 01 movw r24, r30 126c: 08 95 ret 0000126e <__divmodsi4>: 126e: 05 2e mov r0, r21 1270: 97 fb bst r25, 7 1272: 1e f4 brtc .+6 ; 0x127a <__divmodsi4+0xc> 1274: 00 94 com r0 1276: 0e 94 4e 09 call 0x129c ; 0x129c <__negsi2> 127a: 57 fd sbrc r21, 7 127c: 07 d0 rcall .+14 ; 0x128c <__divmodsi4_neg2> 127e: 0e 94 15 09 call 0x122a ; 0x122a <__udivmodsi4> 1282: 07 fc sbrc r0, 7 1284: 03 d0 rcall .+6 ; 0x128c <__divmodsi4_neg2> 1286: 4e f4 brtc .+18 ; 0x129a <__divmodsi4_exit> 1288: 0c 94 4e 09 jmp 0x129c ; 0x129c <__negsi2> 0000128c <__divmodsi4_neg2>: 128c: 50 95 com r21 128e: 40 95 com r20 1290: 30 95 com r19 1292: 21 95 neg r18 1294: 3f 4f sbci r19, 0xFF ; 255 1296: 4f 4f sbci r20, 0xFF ; 255 1298: 5f 4f sbci r21, 0xFF ; 255 0000129a <__divmodsi4_exit>: 129a: 08 95 ret 0000129c <__negsi2>: 129c: 90 95 com r25 129e: 80 95 com r24 12a0: 70 95 com r23 12a2: 61 95 neg r22 12a4: 7f 4f sbci r23, 0xFF ; 255 12a6: 8f 4f sbci r24, 0xFF ; 255 12a8: 9f 4f sbci r25, 0xFF ; 255 12aa: 08 95 ret 000012ac <__umulhisi3>: 12ac: a2 9f mul r26, r18 12ae: b0 01 movw r22, r0 12b0: b3 9f mul r27, r19 12b2: c0 01 movw r24, r0 12b4: a3 9f mul r26, r19 12b6: 70 0d add r23, r0 12b8: 81 1d adc r24, r1 12ba: 11 24 eor r1, r1 12bc: 91 1d adc r25, r1 12be: b2 9f mul r27, r18 12c0: 70 0d add r23, r0 12c2: 81 1d adc r24, r1 12c4: 11 24 eor r1, r1 12c6: 91 1d adc r25, r1 12c8: 08 95 ret 000012ca <__mulshisi3>: 12ca: b7 ff sbrs r27, 7 12cc: 0c 94 6d 09 jmp 0x12da ; 0x12da <__muluhisi3> 000012d0 <__mulohisi3>: 12d0: 0e 94 6d 09 call 0x12da ; 0x12da <__muluhisi3> 12d4: 82 1b sub r24, r18 12d6: 93 0b sbc r25, r19 12d8: 08 95 ret 000012da <__muluhisi3>: 12da: 0e 94 56 09 call 0x12ac ; 0x12ac <__umulhisi3> 12de: a5 9f mul r26, r21 12e0: 90 0d add r25, r0 12e2: b4 9f mul r27, r20 12e4: 90 0d add r25, r0 12e6: a4 9f mul r26, r20 12e8: 80 0d add r24, r0 12ea: 91 1d adc r25, r1 12ec: 11 24 eor r1, r1 12ee: 08 95 ret 000012f0 <__itoa_ncheck>: 12f0: bb 27 eor r27, r27 12f2: 4a 30 cpi r20, 0x0A ; 10 12f4: 31 f4 brne .+12 ; 0x1302 <__itoa_ncheck+0x12> 12f6: 99 23 and r25, r25 12f8: 22 f4 brpl .+8 ; 0x1302 <__itoa_ncheck+0x12> 12fa: bd e2 ldi r27, 0x2D ; 45 12fc: 90 95 com r25 12fe: 81 95 neg r24 1300: 9f 4f sbci r25, 0xFF ; 255 1302: 0c 94 84 09 jmp 0x1308 ; 0x1308 <__utoa_common> 00001306 <__utoa_ncheck>: 1306: bb 27 eor r27, r27 00001308 <__utoa_common>: 1308: fb 01 movw r30, r22 130a: 55 27 eor r21, r21 130c: aa 27 eor r26, r26 130e: 88 0f add r24, r24 1310: 99 1f adc r25, r25 1312: aa 1f adc r26, r26 1314: a4 17 cp r26, r20 1316: 10 f0 brcs .+4 ; 0x131c <__utoa_common+0x14> 1318: a4 1b sub r26, r20 131a: 83 95 inc r24 131c: 50 51 subi r21, 0x10 ; 16 131e: b9 f7 brne .-18 ; 0x130e <__utoa_common+0x6> 1320: a0 5d subi r26, 0xD0 ; 208 1322: aa 33 cpi r26, 0x3A ; 58 1324: 08 f0 brcs .+2 ; 0x1328 <__utoa_common+0x20> 1326: a9 5d subi r26, 0xD9 ; 217 1328: a1 93 st Z+, r26 132a: 00 97 sbiw r24, 0x00 ; 0 132c: 79 f7 brne .-34 ; 0x130c <__utoa_common+0x4> 132e: b1 11 cpse r27, r1 1330: b1 93 st Z+, r27 1332: 11 92 st Z+, r1 1334: cb 01 movw r24, r22 1336: 0c 94 9d 09 jmp 0x133a ; 0x133a <strrev> 0000133a <strrev>: 133a: dc 01 movw r26, r24 133c: fc 01 movw r30, r24 133e: 67 2f mov r22, r23 1340: 71 91 ld r23, Z+ 1342: 77 23 and r23, r23 1344: e1 f7 brne .-8 ; 0x133e <strrev+0x4> 1346: 32 97 sbiw r30, 0x02 ; 2 1348: 04 c0 rjmp .+8 ; 0x1352 <strrev+0x18> 134a: 7c 91 ld r23, X 134c: 6d 93 st X+, r22 134e: 70 83 st Z, r23 1350: 62 91 ld r22, -Z 1352: ae 17 cp r26, r30 1354: bf 07 cpc r27, r31 1356: c8 f3 brcs .-14 ; 0x134a <strrev+0x10> 1358: 08 95 ret 0000135a <eeprom_read_byte>: 135a: f9 99 sbic 0x1f, 1 ; 31 135c: fe cf rjmp .-4 ; 0x135a <eeprom_read_byte> 135e: 92 bd out 0x22, r25 ; 34 1360: 81 bd out 0x21, r24 ; 33 1362: f8 9a sbi 0x1f, 0 ; 31 1364: 99 27 eor r25, r25 1366: 80 b5 in r24, 0x20 ; 32 1368: 08 95 ret 0000136a <eeprom_read_word>: 136a: a8 e1 ldi r26, 0x18 ; 24 136c: b0 e0 ldi r27, 0x00 ; 0 136e: 42 e0 ldi r20, 0x02 ; 2 1370: 50 e0 ldi r21, 0x00 ; 0 1372: 0c 94 d0 09 jmp 0x13a0 ; 0x13a0 <eeprom_read_blraw> 00001376 <eeprom_write_byte>: 1376: 26 2f mov r18, r22 00001378 <eeprom_write_r18>: 1378: f9 99 sbic 0x1f, 1 ; 31 137a: fe cf rjmp .-4 ; 0x1378 <eeprom_write_r18> 137c: 1f ba out 0x1f, r1 ; 31 137e: 92 bd out 0x22, r25 ; 34 1380: 81 bd out 0x21, r24 ; 33 1382: 20 bd out 0x20, r18 ; 32 1384: 0f b6 in r0, 0x3f ; 63 1386: f8 94 cli 1388: fa 9a sbi 0x1f, 2 ; 31 138a: f9 9a sbi 0x1f, 1 ; 31 138c: 0f be out 0x3f, r0 ; 63 138e: 01 96 adiw r24, 0x01 ; 1 1390: 08 95 ret 00001392 <eeprom_write_word>: 1392: 0e 94 bb 09 call 0x1376 ; 0x1376 <eeprom_write_byte> 1396: 27 2f mov r18, r23 1398: 0c 94 bc 09 jmp 0x1378 ; 0x1378 <eeprom_write_r18> 0000139c <eeprom_read_block>: 139c: dc 01 movw r26, r24 139e: cb 01 movw r24, r22 000013a0 <eeprom_read_blraw>: 13a0: fc 01 movw r30, r24 13a2: f9 99 sbic 0x1f, 1 ; 31 13a4: fe cf rjmp .-4 ; 0x13a2 <eeprom_read_blraw+0x2> 13a6: 06 c0 rjmp .+12 ; 0x13b4 <eeprom_read_blraw+0x14> 13a8: f2 bd out 0x22, r31 ; 34 13aa: e1 bd out 0x21, r30 ; 33 13ac: f8 9a sbi 0x1f, 0 ; 31 13ae: 31 96 adiw r30, 0x01 ; 1 13b0: 00 b4 in r0, 0x20 ; 32 13b2: 0d 92 st X+, r0 13b4: 41 50 subi r20, 0x01 ; 1 13b6: 50 40 sbci r21, 0x00 ; 0 13b8: b8 f7 brcc .-18 ; 0x13a8 <eeprom_read_blraw+0x8> 13ba: 08 95 ret 000013bc <_exit>: 13bc: f8 94 cli 000013be <__stop_program>: 13be: ff cf rjmp .-2 ; 0x13be <__stop_program>