Skip to content
Snippets Groups Projects
Select Git revision
  • 4eca04a3197b655d50ed9e141dd169afddfb0869
  • master default protected
2 results

VFD_Sinus_AT328.lss

Blame
  • VFD_Sinus_AT168.lss 124.33 KiB
    
    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>