RoboMI.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .data 0000032a 00800100 0000184a 000018be 2**0 CONTENTS, ALLOC, LOAD, DATA 1 .text 0000184a 00000000 00000000 00000074 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE 2 .bss 0000003b 0080042a 00001b74 00001be8 2**0 ALLOC 3 .stab 00002f4c 00000000 00000000 00001be8 2**2 CONTENTS, READONLY, DEBUGGING 4 .stabstr 0000132e 00000000 00000000 00004b34 2**0 CONTENTS, READONLY, DEBUGGING 5 .debug_aranges 00000020 00000000 00000000 00005e62 2**0 CONTENTS, READONLY, DEBUGGING 6 .debug_pubnames 00000299 00000000 00000000 00005e82 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_info 000003ff 00000000 00000000 0000611b 2**0 CONTENTS, READONLY, DEBUGGING 8 .debug_abbrev 0000013e 00000000 00000000 0000651a 2**0 CONTENTS, READONLY, DEBUGGING 9 .debug_line 00000f52 00000000 00000000 00006658 2**0 CONTENTS, READONLY, DEBUGGING 10 .debug_frame 000000a0 00000000 00000000 000075ac 2**2 CONTENTS, READONLY, DEBUGGING 11 .debug_str 000002dc 00000000 00000000 0000764c 2**0 CONTENTS, READONLY, DEBUGGING 12 .debug_loc 000000ab 00000000 00000000 00007928 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 00000000 <__vectors>: 0: 0c 94 c9 00 jmp 0x192 ; 0x192 <__ctors_end> 4: 0c 94 ac 0b jmp 0x1758 ; 0x1758 <__vector_1> 8: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> c: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 10: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 14: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 18: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 1c: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 20: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 24: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 28: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 2c: 0c 94 23 01 jmp 0x246 ; 0x246 <__vector_11> 30: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 34: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 38: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 3c: 0c 94 ff 00 jmp 0x1fe ; 0x1fe <__vector_15> 40: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 44: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 48: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 4c: 0c 94 71 09 jmp 0x12e2 ; 0x12e2 <__vector_19> 50: 0c 94 89 0a jmp 0x1512 ; 0x1512 <__vector_20> 54: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 58: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 5c: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 60: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 64: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 68: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 6c: 0c 94 e6 00 jmp 0x1cc ; 0x1cc <__bad_interrupt> 70: c1 02 muls r28, r17 72: c7 02 muls r28, r23 74: ee 02 muls r30, r30 76: fc 02 muls r31, r28 78: 08 03 fmul r16, r16 7a: 10 03 mulsu r17, r16 7c: 21 03 mulsu r18, r17 7e: 29 03 fmul r18, r17 80: 3a 03 fmul r19, r18 82: 53 03 mulsu r21, r19 84: 6f 03 fmul r22, r23 86: 85 03 fmuls r16, r21 88: bd 03 fmulsu r19, r21 8a: 2a 04 cpc r2, r10 8c: 60 04 cpc r6, r0 8e: 6c 04 cpc r6, r12 90: 7c 04 cpc r7, r12 92: 86 04 cpc r8, r6 94: 98 04 cpc r9, r8 96: 73 05 cpc r23, r3 98: 80 05 cpc r24, r0 9a: b4 05 cpc r27, r4 0000009c : 9c: 20 20 20 20 20 43 4d 74 65 63 20 20 20 20 20 20 CMtec ac: 72 6f 62 6f 43 72 61 77 6c 65 72 20 76 31 2e 31 roboCrawler v1.1 bc: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 cc: 00 20 20 20 20 20 6d 6f 64 65 20 31 3a 20 20 20 . mode 1: dc: 20 20 46 6f 6c 6c 6f 77 20 77 61 6c 6c 20 61 74 Follow wall at ec: 20 20 61 20 64 69 73 74 61 6e 63 65 28 31 6d 29 a distance(1m) fc: 20 00 20 20 20 20 20 6d 6f 64 65 20 32 3a 20 20 . mode 2: 10c: 20 20 20 44 72 69 76 65 20 61 6e 64 20 76 6f 69 Drive and voi 11c: 64 20 20 20 20 61 6e 79 20 77 61 6c 6c 73 20 20 d any walls 12c: 20 20 00 20 20 20 20 20 6d 6f 64 65 20 33 3a 20 . mode 3: 13c: 20 20 20 4d 65 61 73 75 72 65 20 64 69 73 74 61 Measure dista 14c: 6e 63 65 20 20 20 20 66 6f 72 77 61 72 64 20 20 nce forward 15c: 20 20 20 00 20 20 20 20 6d 6f 64 65 20 52 46 3a . mode RF: 16c: 20 20 20 20 20 52 46 20 61 63 74 69 76 65 64 20 RF actived 17c: 61 6e 64 20 77 61 69 74 69 6e 67 20 66 6f 72 20 and waiting for 18c: 63 6f 6d 2e 00 00 com... 00000192 <__ctors_end>: 192: 11 24 eor r1, r1 194: 1f be out 0x3f, r1 ; 63 196: cf ef ldi r28, 0xFF ; 255 198: d4 e0 ldi r29, 0x04 ; 4 19a: de bf out 0x3e, r29 ; 62 19c: cd bf out 0x3d, r28 ; 61 0000019e <__do_copy_data>: 19e: 14 e0 ldi r17, 0x04 ; 4 1a0: a0 e0 ldi r26, 0x00 ; 0 1a2: b1 e0 ldi r27, 0x01 ; 1 1a4: ea e4 ldi r30, 0x4A ; 74 1a6: f8 e1 ldi r31, 0x18 ; 24 1a8: 02 c0 rjmp .+4 ; 0x1ae <.do_copy_data_start> 000001aa <.do_copy_data_loop>: 1aa: 05 90 lpm r0, Z+ 1ac: 0d 92 st X+, r0 000001ae <.do_copy_data_start>: 1ae: aa 32 cpi r26, 0x2A ; 42 1b0: b1 07 cpc r27, r17 1b2: d9 f7 brne .-10 ; 0x1aa <.do_copy_data_loop> 000001b4 <__do_clear_bss>: 1b4: 14 e0 ldi r17, 0x04 ; 4 1b6: aa e2 ldi r26, 0x2A ; 42 1b8: b4 e0 ldi r27, 0x04 ; 4 1ba: 01 c0 rjmp .+2 ; 0x1be <.do_clear_bss_start> 000001bc <.do_clear_bss_loop>: 1bc: 1d 92 st X+, r1 000001be <.do_clear_bss_start>: 1be: a5 36 cpi r26, 0x65 ; 101 1c0: b1 07 cpc r27, r17 1c2: e1 f7 brne .-8 ; 0x1bc <.do_clear_bss_loop> 1c4: 0e 94 18 07 call 0xe30 ; 0xe30
1c8: 0c 94 24 0c jmp 0x1848 ; 0x1848 <_exit> 000001cc <__bad_interrupt>: 1cc: 0c 94 00 00 jmp 0 ; 0x0 <__heap_end> 000001d0 : Description: Initialise I/O Input: - Output: - ------------------------------------------------------------------------------------------------*/ void initIO (void){ 1d0: 82 e0 ldi r24, 0x02 ; 2 1d2: 8e bd out 0x2e, r24 ; 46 TCCR1B = (1<>8); 1d4: 8f eb ldi r24, 0xBF ; 191 1d6: 8d bd out 0x2d, r24 ; 45 TCNT1L = (uint8_t)(PROG_TIMER); 1d8: 8f ef ldi r24, 0xFF ; 255 1da: 8c bd out 0x2c, r24 ; 44 TCNT2 = SERVO_TIMER; 1dc: 8e ee ldi r24, 0xEE ; 238 1de: 83 bd out 0x23, r24 ; 35 TIMSK |= (1<: Description: Timer1 overflow interrupt. Used as program timer Input: - Output: - ------------------------------------------------------------------------------------------------*/ ISR (TIMER1_OVF_vect) { 1fe: 1f 92 push r1 200: 0f 92 push r0 202: 0f b6 in r0, 0x3f ; 63 204: 0f 92 push r0 206: 11 24 eor r1, r1 208: 8f 93 push r24 // Program for update PPM pulses to all servos if (++progCounterPPM >= 2) 20a: 80 91 2c 04 lds r24, 0x042C 20e: 8f 5f subi r24, 0xFF ; 255 210: 80 93 2c 04 sts 0x042C, r24 214: 82 30 cpi r24, 0x02 ; 2 216: 50 f0 brcs .+20 ; 0x22c <__vector_15+0x2e> { // Start for servo PPM pulses servoCounter = 0; 218: 10 92 2a 04 sts 0x042A, r1 SERVO_PORT |= (1<>8); 232: 8f eb ldi r24, 0xBF ; 191 234: 8d bd out 0x2d, r24 ; 45 TCNT1L = (uint8_t)(PROG_TIMER); 236: 8f ef ldi r24, 0xFF ; 255 238: 8c bd out 0x2c, r24 ; 44 23a: 8f 91 pop r24 23c: 0f 90 pop r0 23e: 0f be out 0x3f, r0 ; 63 240: 0f 90 pop r0 242: 1f 90 pop r1 244: 18 95 reti 00000246 <__vector_11>: Description: Timer1 overflow interrupt. Used as servo (PPM) timer Input: - Output: - ------------------------------------------------------------------------------------------------*/ ISR (TIMER2_OVF_vect) { 246: 1f 92 push r1 248: 0f 92 push r0 24a: 0f b6 in r0, 0x3f ; 63 24c: 0f 92 push r0 24e: 11 24 eor r1, r1 250: 2f 93 push r18 252: 8f 93 push r24 254: 9f 93 push r25 uint8_t done = 1; // Check each servo output if pulselength is reached if(servoCounter >= servoPing) 256: 90 91 2a 04 lds r25, 0x042A 25a: 80 91 03 04 lds r24, 0x0403 25e: 98 17 cp r25, r24 260: 18 f0 brcs .+6 ; 0x268 <__vector_11+0x22> SERVO_PORT &= ~(1< else { done = 0; asm volatile("NOP"); // Correction for constant interrupt length 268: 00 00 nop 26a: 20 e0 ldi r18, 0x00 ; 0 } if(servoCounter >= servoMotorLeft) 26c: 80 91 04 04 lds r24, 0x0404 270: 98 17 cp r25, r24 272: 10 f0 brcs .+4 ; 0x278 <__vector_11+0x32> SERVO_PORT &= ~(1< else { done = 0; asm volatile("NOP"); // Correction for constant interrupt length 278: 00 00 nop 27a: 20 e0 ldi r18, 0x00 ; 0 } if(servoCounter >= servoMotorRight) 27c: 80 91 05 04 lds r24, 0x0405 280: 98 17 cp r25, r24 282: 20 f0 brcs .+8 ; 0x28c <__vector_11+0x46> SERVO_PORT &= ~(1< 28a: 06 c0 rjmp .+12 ; 0x298 <__vector_11+0x52> if(servoCounter >= servoMotorRight) SERVO_PORT &= ~(1< } if(done) TCCR2 &= ~(1< else { servoCounter++; 298: 9f 5f subi r25, 0xFF ; 255 29a: 90 93 2a 04 sts 0x042A, r25 asm volatile("NOP"); // Correction for constant interrupt length 29e: 00 00 nop asm volatile("NOP"); 2a0: 00 00 nop } TCNT2 = SERVO_TIMER; 2a2: 8e ee ldi r24, 0xEE ; 238 2a4: 83 bd out 0x23, r24 ; 35 2a6: 9f 91 pop r25 2a8: 8f 91 pop r24 2aa: 2f 91 pop r18 2ac: 0f 90 pop r0 2ae: 0f be out 0x3f, r0 ; 63 2b0: 0f 90 pop r0 2b2: 1f 90 pop r1 2b4: 18 95 reti 000002b6 : Description: Input: - Output: - ------------------------------------------------------------------------------------------------*/ void activateRobot(uint8_t mode) { 2b6: 1f 93 push r17 2b8: 18 2f mov r17, r24 lcdSetLayout(0); 2ba: 80 e0 ldi r24, 0x00 ; 0 2bc: 0e 94 a8 07 call 0xf50 ; 0xf50 lcdWriteStringP(menuTable[mode]); 2c0: 81 e3 ldi r24, 0x31 ; 49 2c2: 18 9f mul r17, r24 2c4: c0 01 movw r24, r0 2c6: 11 24 eor r1, r1 2c8: 84 56 subi r24, 0x64 ; 100 2ca: 9f 4f sbci r25, 0xFF ; 255 2cc: 0e 94 2d 08 call 0x105a ; 0x105a progTimer = 200; 2d0: 88 ec ldi r24, 0xC8 ; 200 2d2: 80 93 2e 04 sts 0x042E, r24 roboActive = mode; 2d6: 10 93 3b 04 sts 0x043B, r17 2da: 1f 91 pop r17 2dc: 08 95 ret 000002de : Description: Input: - Output: - ------------------------------------------------------------------------------------------------*/ void deactivateRobot(void) { 2de: 10 92 3b 04 sts 0x043B, r1 roboActive = 0; servoMotorLeft = SERVO_POS_MOTOR_STOP; 2e2: 87 e7 ldi r24, 0x77 ; 119 2e4: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_STOP; 2e8: 80 93 05 04 sts 0x0405, r24 servoPing = SERVO_POS_CENTER; 2ec: 8c e8 ldi r24, 0x8C ; 140 2ee: 80 93 03 04 sts 0x0403, r24 rfIdDisable(); 2f2: 0e 94 bb 09 call 0x1376 ; 0x1376 2f6: 08 95 ret 000002f8 : Description: Input: - Output: - ------------------------------------------------------------------------------------------------*/ void showDistanceOnLCD(uint16_t distance, uint8_t mode, uint8_t position) { 2f8: 1f 93 push r17 2fa: cf 93 push r28 2fc: df 93 push r29 2fe: ec 01 movw r28, r24 300: 16 2f mov r17, r22 if(position == 1) 302: 41 30 cpi r20, 0x01 ; 1 304: 11 f4 brne .+4 ; 0x30a lcdSetPos(0x00); 306: 80 e0 ldi r24, 0x00 ; 0 308: 07 c0 rjmp .+14 ; 0x318 else if(position == 2) 30a: 42 30 cpi r20, 0x02 ; 2 30c: 11 f4 brne .+4 ; 0x312 lcdSetPos(0x10); 30e: 80 e1 ldi r24, 0x10 ; 16 310: 03 c0 rjmp .+6 ; 0x318 else if(position == 3) 312: 43 30 cpi r20, 0x03 ; 3 314: 19 f4 brne .+6 ; 0x31c lcdSetPos(0x20); 316: 80 e2 ldi r24, 0x20 ; 32 318: 0e 94 d3 07 call 0xfa6 ; 0xfa6 if(mode == 0) // Both arrow pointing in 31c: 11 23 and r17, r17 31e: b9 f5 brne .+110 ; 0x38e { if(distance > 32000) 320: 8d e7 ldi r24, 0x7D ; 125 322: c1 30 cpi r28, 0x01 ; 1 324: d8 07 cpc r29, r24 326: c8 f5 brcc .+114 ; 0x39a { lcdWriteString(" "); } else if(distance > 16000) 328: 8e e3 ldi r24, 0x3E ; 62 32a: c1 38 cpi r28, 0x81 ; 129 32c: d8 07 cpc r29, r24 32e: 18 f0 brcs .+6 ; 0x336 { lcdWriteString("> <"); 330: 81 e1 ldi r24, 0x11 ; 17 332: 91 e0 ldi r25, 0x01 ; 1 334: ca c0 rjmp .+404 ; 0x4ca } else if(distance > 8000) 336: 8f e1 ldi r24, 0x1F ; 31 338: c1 34 cpi r28, 0x41 ; 65 33a: d8 07 cpc r29, r24 33c: 18 f0 brcs .+6 ; 0x344 { lcdWriteString(">> <<"); 33e: 82 e2 ldi r24, 0x22 ; 34 340: 91 e0 ldi r25, 0x01 ; 1 342: c3 c0 rjmp .+390 ; 0x4ca } else if(distance > 4000) 344: 8f e0 ldi r24, 0x0F ; 15 346: c1 3a cpi r28, 0xA1 ; 161 348: d8 07 cpc r29, r24 34a: 18 f0 brcs .+6 ; 0x352 { lcdWriteString(">>> <<<"); 34c: 83 e3 ldi r24, 0x33 ; 51 34e: 91 e0 ldi r25, 0x01 ; 1 350: bc c0 rjmp .+376 ; 0x4ca } else if(distance > 2000) 352: 87 e0 ldi r24, 0x07 ; 7 354: c1 3d cpi r28, 0xD1 ; 209 356: d8 07 cpc r29, r24 358: 18 f0 brcs .+6 ; 0x360 { lcdWriteString(">>>> <<<<"); 35a: 84 e4 ldi r24, 0x44 ; 68 35c: 91 e0 ldi r25, 0x01 ; 1 35e: b5 c0 rjmp .+362 ; 0x4ca } else if(distance > 1000) 360: 83 e0 ldi r24, 0x03 ; 3 362: c9 3e cpi r28, 0xE9 ; 233 364: d8 07 cpc r29, r24 366: 18 f0 brcs .+6 ; 0x36e { lcdWriteString(">>>>> <<<<<"); 368: 85 e5 ldi r24, 0x55 ; 85 36a: 91 e0 ldi r25, 0x01 ; 1 36c: ae c0 rjmp .+348 ; 0x4ca } else if(distance > 500) 36e: 81 e0 ldi r24, 0x01 ; 1 370: c5 3f cpi r28, 0xF5 ; 245 372: d8 07 cpc r29, r24 374: 18 f0 brcs .+6 ; 0x37c { lcdWriteString(">>>>>> <<<<<<"); 376: 86 e6 ldi r24, 0x66 ; 102 378: 91 e0 ldi r25, 0x01 ; 1 37a: a7 c0 rjmp .+334 ; 0x4ca } else if(distance > 100) 37c: c5 36 cpi r28, 0x65 ; 101 37e: d1 05 cpc r29, r1 380: 18 f0 brcs .+6 ; 0x388 { lcdWriteString(">>>>>>> <<<<<<<"); 382: 87 e7 ldi r24, 0x77 ; 119 384: 91 e0 ldi r25, 0x01 ; 1 386: a1 c0 rjmp .+322 ; 0x4ca } else { lcdWriteString(">>>>>>>[]<<<<<<<"); 388: 88 e8 ldi r24, 0x88 ; 136 38a: 91 e0 ldi r25, 0x01 ; 1 38c: 9e c0 rjmp .+316 ; 0x4ca } } else if(mode == 1) // Both arrow pointing Out 38e: 11 30 cpi r17, 0x01 ; 1 390: d1 f5 brne .+116 ; 0x406 { if(distance > 32000) 392: 8d e7 ldi r24, 0x7D ; 125 394: c1 30 cpi r28, 0x01 ; 1 396: d8 07 cpc r29, r24 398: 18 f0 brcs .+6 ; 0x3a0 { lcdWriteString(" "); 39a: 80 e0 ldi r24, 0x00 ; 0 39c: 91 e0 ldi r25, 0x01 ; 1 39e: 95 c0 rjmp .+298 ; 0x4ca } else if(distance > 16000) 3a0: 8e e3 ldi r24, 0x3E ; 62 3a2: c1 38 cpi r28, 0x81 ; 129 3a4: d8 07 cpc r29, r24 3a6: 18 f0 brcs .+6 ; 0x3ae { lcdWriteString(" < > "); 3a8: 89 e9 ldi r24, 0x99 ; 153 3aa: 91 e0 ldi r25, 0x01 ; 1 3ac: 8e c0 rjmp .+284 ; 0x4ca } else if(distance > 8000) 3ae: 8f e1 ldi r24, 0x1F ; 31 3b0: c1 34 cpi r28, 0x41 ; 65 3b2: d8 07 cpc r29, r24 3b4: 18 f0 brcs .+6 ; 0x3bc { lcdWriteString(" << >> "); 3b6: 8a ea ldi r24, 0xAA ; 170 3b8: 91 e0 ldi r25, 0x01 ; 1 3ba: 87 c0 rjmp .+270 ; 0x4ca } else if(distance > 4000) 3bc: 8f e0 ldi r24, 0x0F ; 15 3be: c1 3a cpi r28, 0xA1 ; 161 3c0: d8 07 cpc r29, r24 3c2: 18 f0 brcs .+6 ; 0x3ca { lcdWriteString(" <<< >>> "); 3c4: 8b eb ldi r24, 0xBB ; 187 3c6: 91 e0 ldi r25, 0x01 ; 1 3c8: 80 c0 rjmp .+256 ; 0x4ca } else if(distance > 2000) 3ca: 87 e0 ldi r24, 0x07 ; 7 3cc: c1 3d cpi r28, 0xD1 ; 209 3ce: d8 07 cpc r29, r24 3d0: 18 f0 brcs .+6 ; 0x3d8 { lcdWriteString(" <<<< >>>> "); 3d2: 8c ec ldi r24, 0xCC ; 204 3d4: 91 e0 ldi r25, 0x01 ; 1 3d6: 79 c0 rjmp .+242 ; 0x4ca } else if(distance > 1000) 3d8: 83 e0 ldi r24, 0x03 ; 3 3da: c9 3e cpi r28, 0xE9 ; 233 3dc: d8 07 cpc r29, r24 3de: 18 f0 brcs .+6 ; 0x3e6 { lcdWriteString(" <<<<< >>>>> "); 3e0: 8d ed ldi r24, 0xDD ; 221 3e2: 91 e0 ldi r25, 0x01 ; 1 3e4: 72 c0 rjmp .+228 ; 0x4ca } else if(distance > 500) 3e6: 81 e0 ldi r24, 0x01 ; 1 3e8: c5 3f cpi r28, 0xF5 ; 245 3ea: d8 07 cpc r29, r24 3ec: 18 f0 brcs .+6 ; 0x3f4 { lcdWriteString(" <<<<<< >>>>>> "); 3ee: 8e ee ldi r24, 0xEE ; 238 3f0: 91 e0 ldi r25, 0x01 ; 1 3f2: 6b c0 rjmp .+214 ; 0x4ca } else if(distance > 100) 3f4: c5 36 cpi r28, 0x65 ; 101 3f6: d1 05 cpc r29, r1 3f8: 18 f0 brcs .+6 ; 0x400 { lcdWriteString("<<<<<<< >>>>>>>"); 3fa: 8f ef ldi r24, 0xFF ; 255 3fc: 91 e0 ldi r25, 0x01 ; 1 3fe: 65 c0 rjmp .+202 ; 0x4ca } else { lcdWriteString("<<<<<<<[]>>>>>>>"); 400: 80 e1 ldi r24, 0x10 ; 16 402: 92 e0 ldi r25, 0x02 ; 2 404: 62 c0 rjmp .+196 ; 0x4ca } } else if(mode == 2) // Left arrow pointing out. 406: 12 30 cpi r17, 0x02 ; 2 408: 71 f5 brne .+92 ; 0x466 { if(distance > 6400) 40a: 89 e1 ldi r24, 0x19 ; 25 40c: c1 30 cpi r28, 0x01 ; 1 40e: d8 07 cpc r29, r24 410: 18 f0 brcs .+6 ; 0x418 { lcdWriteString("<<<<<<< "); 412: 81 e2 ldi r24, 0x21 ; 33 414: 92 e0 ldi r25, 0x02 ; 2 416: 59 c0 rjmp .+178 ; 0x4ca } else if(distance > 3200) 418: 8c e0 ldi r24, 0x0C ; 12 41a: c1 38 cpi r28, 0x81 ; 129 41c: d8 07 cpc r29, r24 41e: 18 f0 brcs .+6 ; 0x426 { lcdWriteString(" <<<<<< "); 420: 82 e3 ldi r24, 0x32 ; 50 422: 92 e0 ldi r25, 0x02 ; 2 424: 52 c0 rjmp .+164 ; 0x4ca } else if(distance > 1600) 426: 86 e0 ldi r24, 0x06 ; 6 428: c1 34 cpi r28, 0x41 ; 65 42a: d8 07 cpc r29, r24 42c: 18 f0 brcs .+6 ; 0x434 { lcdWriteString(" <<<<< "); 42e: 83 e4 ldi r24, 0x43 ; 67 430: 92 e0 ldi r25, 0x02 ; 2 432: 4b c0 rjmp .+150 ; 0x4ca } else if(distance > 800) 434: 83 e0 ldi r24, 0x03 ; 3 436: c1 32 cpi r28, 0x21 ; 33 438: d8 07 cpc r29, r24 43a: 18 f0 brcs .+6 ; 0x442 { lcdWriteString(" <<<< "); 43c: 84 e5 ldi r24, 0x54 ; 84 43e: 92 e0 ldi r25, 0x02 ; 2 440: 44 c0 rjmp .+136 ; 0x4ca } else if(distance > 400) 442: 81 e0 ldi r24, 0x01 ; 1 444: c1 39 cpi r28, 0x91 ; 145 446: d8 07 cpc r29, r24 448: 18 f0 brcs .+6 ; 0x450 { lcdWriteString(" <<< "); 44a: 85 e6 ldi r24, 0x65 ; 101 44c: 92 e0 ldi r25, 0x02 ; 2 44e: 3d c0 rjmp .+122 ; 0x4ca } else if(distance > 200) 450: c9 3c cpi r28, 0xC9 ; 201 452: d1 05 cpc r29, r1 454: 18 f0 brcs .+6 ; 0x45c { lcdWriteString(" << "); 456: 86 e7 ldi r24, 0x76 ; 118 458: 92 e0 ldi r25, 0x02 ; 2 45a: 37 c0 rjmp .+110 ; 0x4ca } else if(distance > 30) 45c: 6f 97 sbiw r28, 0x1f ; 31 45e: 98 f1 brcs .+102 ; 0x4c6 { lcdWriteString(" < "); 460: 87 e8 ldi r24, 0x87 ; 135 462: 92 e0 ldi r25, 0x02 ; 2 464: 32 c0 rjmp .+100 ; 0x4ca else { lcdWriteString(" [] "); } } else if(mode == 3) // Right arrow pointing out. 466: 13 30 cpi r17, 0x03 ; 3 468: 91 f5 brne .+100 ; 0x4ce { if(distance > 6400) 46a: 89 e1 ldi r24, 0x19 ; 25 46c: c1 30 cpi r28, 0x01 ; 1 46e: d8 07 cpc r29, r24 470: 18 f0 brcs .+6 ; 0x478 { lcdWriteString(" >>>>>>>"); 472: 89 ea ldi r24, 0xA9 ; 169 474: 92 e0 ldi r25, 0x02 ; 2 476: 29 c0 rjmp .+82 ; 0x4ca } else if(distance > 3200) 478: 8c e0 ldi r24, 0x0C ; 12 47a: c1 38 cpi r28, 0x81 ; 129 47c: d8 07 cpc r29, r24 47e: 18 f0 brcs .+6 ; 0x486 { lcdWriteString(" >>>>>> "); 480: 8a eb ldi r24, 0xBA ; 186 482: 92 e0 ldi r25, 0x02 ; 2 484: 22 c0 rjmp .+68 ; 0x4ca } else if(distance > 1600) 486: 86 e0 ldi r24, 0x06 ; 6 488: c1 34 cpi r28, 0x41 ; 65 48a: d8 07 cpc r29, r24 48c: 18 f0 brcs .+6 ; 0x494 { lcdWriteString(" >>>>> "); 48e: 8b ec ldi r24, 0xCB ; 203 490: 92 e0 ldi r25, 0x02 ; 2 492: 1b c0 rjmp .+54 ; 0x4ca } else if(distance > 800) 494: 83 e0 ldi r24, 0x03 ; 3 496: c1 32 cpi r28, 0x21 ; 33 498: d8 07 cpc r29, r24 49a: 18 f0 brcs .+6 ; 0x4a2 { lcdWriteString(" >>>> "); 49c: 8c ed ldi r24, 0xDC ; 220 49e: 92 e0 ldi r25, 0x02 ; 2 4a0: 14 c0 rjmp .+40 ; 0x4ca } else if(distance > 400) 4a2: 81 e0 ldi r24, 0x01 ; 1 4a4: c1 39 cpi r28, 0x91 ; 145 4a6: d8 07 cpc r29, r24 4a8: 18 f0 brcs .+6 ; 0x4b0 { lcdWriteString(" >>> "); 4aa: 8d ee ldi r24, 0xED ; 237 4ac: 92 e0 ldi r25, 0x02 ; 2 4ae: 0d c0 rjmp .+26 ; 0x4ca } else if(distance > 200) 4b0: c9 3c cpi r28, 0xC9 ; 201 4b2: d1 05 cpc r29, r1 4b4: 18 f0 brcs .+6 ; 0x4bc { lcdWriteString(" >> "); 4b6: 8e ef ldi r24, 0xFE ; 254 4b8: 92 e0 ldi r25, 0x02 ; 2 4ba: 07 c0 rjmp .+14 ; 0x4ca } else if(distance > 30) 4bc: 6f 97 sbiw r28, 0x1f ; 31 4be: 18 f0 brcs .+6 ; 0x4c6 { lcdWriteString(" > "); 4c0: 8f e0 ldi r24, 0x0F ; 15 4c2: 93 e0 ldi r25, 0x03 ; 3 4c4: 02 c0 rjmp .+4 ; 0x4ca } else { lcdWriteString(" [] "); 4c6: 88 e9 ldi r24, 0x98 ; 152 4c8: 92 e0 ldi r25, 0x02 ; 2 4ca: 0e 94 3b 08 call 0x1076 ; 0x1076 4ce: df 91 pop r29 4d0: cf 91 pop r28 4d2: 1f 91 pop r17 4d4: 08 95 ret 000004d6 : Description: Check for incoming data packets. Input: - Output: - ------------------------------------------------------------------------------------------------*/ void checkCommunication(void){ 4d6: 0f 93 push r16 4d8: 1f 93 push r17 if (rfIdGetTagPresent()) 4da: 0e 94 6d 09 call 0x12da ; 0x12da 4de: 88 23 and r24, r24 4e0: 61 f0 breq .+24 ; 0x4fa { uint8_t *tempPointer = rfIdGetTag(); 4e2: 0e 94 64 09 call 0x12c8 ; 0x12c8 4e6: 8c 01 movw r16, r24 lcdSetPos(0x13); 4e8: 83 e1 ldi r24, 0x13 ; 19 4ea: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString(tempPointer); 4ee: c8 01 movw r24, r16 4f0: 0e 94 3b 08 call 0x1076 ; 0x1076 roboMSPSetData(tempPointer); 4f4: c8 01 movw r24, r16 4f6: 0e 94 13 0a call 0x1426 ; 0x1426 } switch (roboMSPGetActiveStatus()) 4fa: 0e 94 c3 09 call 0x1386 ; 0x1386 4fe: 83 30 cpi r24, 0x03 ; 3 500: 61 f0 breq .+24 ; 0x51a <__stack+0x1b> 502: 84 30 cpi r24, 0x04 ; 4 504: 18 f4 brcc .+6 ; 0x50c <__stack+0xd> 506: 82 30 cpi r24, 0x02 ; 2 508: 99 f4 brne .+38 ; 0x530 <__stack+0x31> 50a: 05 c0 rjmp .+10 ; 0x516 <__stack+0x17> 50c: 84 30 cpi r24, 0x04 ; 4 50e: 59 f0 breq .+22 ; 0x526 <__stack+0x27> 510: 85 30 cpi r24, 0x05 ; 5 512: 71 f4 brne .+28 ; 0x530 <__stack+0x31> 514: 0b c0 rjmp .+22 ; 0x52c <__stack+0x2d> { case ACTIVATE_P1: activateRobot(1); 516: 81 e0 ldi r24, 0x01 ; 1 518: 01 c0 rjmp .+2 ; 0x51c <__stack+0x1d> rfIdEnable(); break; case ACTIVATE_P2: activateRobot(2); 51a: 82 e0 ldi r24, 0x02 ; 2 51c: 0e 94 5b 01 call 0x2b6 ; 0x2b6 rfIdEnable(); 520: 0e 94 bf 09 call 0x137e ; 0x137e 524: 05 c0 rjmp .+10 ; 0x530 <__stack+0x31> break; case DEACTIVATE: deactivateRobot(); 526: 0e 94 6f 01 call 0x2de ; 0x2de 52a: 02 c0 rjmp .+4 ; 0x530 <__stack+0x31> break; case ACK: rfIdClearBuffer(); 52c: 0e 94 69 09 call 0x12d2 ; 0x12d2 530: 1f 91 pop r17 532: 0f 91 pop r16 534: 08 95 ret 00000536 : Description: Input: - Output: - ------------------------------------------------------------------------------------------------*/ void updateProgram(void) { 536: 1f 93 push r17 // Check radio communication if(rfEnable) 538: 80 91 3c 04 lds r24, 0x043C 53c: 88 23 and r24, r24 53e: 11 f0 breq .+4 ; 0x544 checkCommunication(); 540: 0e 94 6b 02 call 0x4d6 ; 0x4d6 // Program for robot AI if (roboActive == 1) 544: 80 91 3b 04 lds r24, 0x043B 548: 81 30 cpi r24, 0x01 ; 1 54a: 09 f0 breq .+2 ; 0x54e 54c: 1e c3 rjmp .+1596 ; 0xb8a { // Program(2) for random RFID serach if (++progCounter >= progTimer) 54e: 80 91 2d 04 lds r24, 0x042D 552: 8f 5f subi r24, 0xFF ; 255 554: 80 93 2d 04 sts 0x042D, r24 558: 90 91 2e 04 lds r25, 0x042E 55c: 89 17 cp r24, r25 55e: 08 f4 brcc .+2 ; 0x562 560: 14 c3 rjmp .+1576 ; 0xb8a { switch (progPosition) 562: 80 91 2f 04 lds r24, 0x042F 566: e8 2f mov r30, r24 568: f0 e0 ldi r31, 0x00 ; 0 56a: e6 31 cpi r30, 0x16 ; 22 56c: f1 05 cpc r31, r1 56e: 08 f0 brcs .+2 ; 0x572 570: 0a c3 rjmp .+1556 ; 0xb86 572: e8 5c subi r30, 0xC8 ; 200 574: ff 4f sbci r31, 0xFF ; 255 576: ee 0f add r30, r30 578: ff 1f adc r31, r31 57a: 05 90 lpm r0, Z+ 57c: f4 91 lpm r31, Z 57e: e0 2d mov r30, r0 580: 09 94 ijmp { case 0: // Kör frammåt lcdClearDisplay(); 582: 0e 94 df 07 call 0xfbe ; 0xfbe lcdSetLayout(1); 586: 81 e0 ldi r24, 0x01 ; 1 588: 0e 94 a8 07 call 0xf50 ; 0xf50 58c: a5 c1 rjmp .+842 ; 0x8d8 break; case 1: // Kör frammåt till dess att avståndet mot väggen är 1meter servoMotorLeft = SERVO_POS_MOTOR_FW_SOFT; 58e: 8f e7 ldi r24, 0x7F ; 127 590: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_FW_SOFT; 594: 80 93 05 04 sts 0x0405, r24 pingSendPing(); 598: 0e 94 8c 0b call 0x1718 ; 0x1718 progTimer = 4; 59c: 84 e0 ldi r24, 0x04 ; 4 59e: 80 93 2e 04 sts 0x042E, r24 if(pingGetReady()) 5a2: 0e 94 a7 0b call 0x174e ; 0x174e 5a6: 88 23 and r24, r24 5a8: 09 f4 brne .+2 ; 0x5ac 5aa: ed c2 rjmp .+1498 ; 0xb86 { tempDistance = pingGetDistance(); 5ac: 0e 94 a0 0b call 0x1740 ; 0x1740 5b0: 90 93 32 04 sts 0x0432, r25 5b4: 80 93 31 04 sts 0x0431, r24 if(tempDistance < DISTANCE_ONE_METER) 5b8: 27 e1 ldi r18, 0x17 ; 23 5ba: 80 37 cpi r24, 0x70 ; 112 5bc: 92 07 cpc r25, r18 5be: 38 f4 brcc .+14 ; 0x5ce { showDistanceOnLCD(0,0,2); 5c0: 42 e0 ldi r20, 0x02 ; 2 5c2: 60 e0 ldi r22, 0x00 ; 0 5c4: 80 e0 ldi r24, 0x00 ; 0 5c6: 90 e0 ldi r25, 0x00 ; 0 5c8: 0e 94 7c 01 call 0x2f8 ; 0x2f8 5cc: af c1 rjmp .+862 ; 0x92c progTimer = 1; progPosition++; } else { showDistanceOnLCD(tempDistance-DISTANCE_ONE_METER,0,2); 5ce: 42 e0 ldi r20, 0x02 ; 2 5d0: 60 e0 ldi r22, 0x00 ; 0 5d2: 80 57 subi r24, 0x70 ; 112 5d4: 97 41 sbci r25, 0x17 ; 23 5d6: 0e 94 7c 01 call 0x2f8 ; 0x2f8 5da: d5 c2 rjmp .+1450 ; 0xb86 break; case 2: // Bromsa (backa något) lcdSetPos(0x00); 5dc: 80 e0 ldi r24, 0x00 ; 0 5de: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString("Drive: STOP "); 5e2: 81 e3 ldi r24, 0x31 ; 49 5e4: 93 e0 ldi r25, 0x03 ; 3 5e6: 0e 94 3b 08 call 0x1076 ; 0x1076 // Stop and breake servoMotorLeft = SERVO_POS_MOTOR_STOP; servoMotorRight = SERVO_POS_MOTOR_STOP; servoMotorLeft = SERVO_POS_MOTOR_RE; 5ea: 8c e6 ldi r24, 0x6C ; 108 5ec: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_RE; 5f0: 80 93 05 04 sts 0x0405, r24 progTimer = 40; 5f4: 88 e2 ldi r24, 0x28 ; 40 5f6: 7d c1 rjmp .+762 ; 0x8f2 break; case 3: // Stanna servoMotorLeft = SERVO_POS_MOTOR_STOP; 5f8: 87 e7 ldi r24, 0x77 ; 119 5fa: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_STOP; 5fe: 80 93 05 04 sts 0x0405, r24 progTimer = 1; 602: 81 e0 ldi r24, 0x01 ; 1 604: 80 93 2e 04 sts 0x042E, r24 regulatorMeasureCounter = 0; 608: 10 92 42 04 sts 0x0442, r1 progPosition++; 60c: 84 e0 ldi r24, 0x04 ; 4 60e: b9 c2 rjmp .+1394 ; 0xb82 break; case 4: // Vrid servo 45grader vänster (från centrum) servoPing = SERVO_POS_LEFT_45; 610: 8e ea ldi r24, 0xAE ; 174 612: 80 93 03 04 sts 0x0403, r24 progTimer = 20; 616: 84 e1 ldi r24, 0x14 ; 20 618: 80 93 2e 04 sts 0x042E, r24 progPosition++; 61c: 85 e0 ldi r24, 0x05 ; 5 61e: b1 c2 rjmp .+1378 ; 0xb82 break; case 5: // Mät och spara avstånd pingSendPing(); 620: 0e 94 8c 0b call 0x1718 ; 0x1718 progTimer = 4; 624: 84 e0 ldi r24, 0x04 ; 4 626: 80 93 2e 04 sts 0x042E, r24 if(pingGetReady()) 62a: 0e 94 a7 0b call 0x174e ; 0x174e 62e: 88 23 and r24, r24 630: 09 f4 brne .+2 ; 0x634 632: a9 c2 rjmp .+1362 ; 0xb86 { tempLeftDistance = pingGetDistance(); 634: 0e 94 a0 0b call 0x1740 ; 0x1740 638: 90 93 38 04 sts 0x0438, r25 63c: 80 93 37 04 sts 0x0437, r24 640: 75 c1 rjmp .+746 ; 0x92c break; case 6: // Vrid servo 45grader höger (från centrum) servoPing = SERVO_POS_RIGHT_45; 642: 87 e6 ldi r24, 0x67 ; 103 644: 80 93 03 04 sts 0x0403, r24 progTimer = 40; 648: 88 e2 ldi r24, 0x28 ; 40 64a: 80 93 2e 04 sts 0x042E, r24 progPosition++; 64e: 87 e0 ldi r24, 0x07 ; 7 650: 98 c2 rjmp .+1328 ; 0xb82 break; case 7: // Mät och spara avstånd pingSendPing(); 652: 0e 94 8c 0b call 0x1718 ; 0x1718 progTimer = 4; 656: 84 e0 ldi r24, 0x04 ; 4 658: 80 93 2e 04 sts 0x042E, r24 if(pingGetReady()) 65c: 0e 94 a7 0b call 0x174e ; 0x174e 660: 88 23 and r24, r24 662: 09 f4 brne .+2 ; 0x666 664: 90 c2 rjmp .+1312 ; 0xb86 { tempRightDistance = pingGetDistance(); 666: 0e 94 a0 0b call 0x1740 ; 0x1740 66a: 90 93 3a 04 sts 0x043A, r25 66e: 80 93 39 04 sts 0x0439, r24 672: 5c c1 rjmp .+696 ; 0x92c break; case 8: servoPing = SERVO_POS_CENTER; 674: 8c e8 ldi r24, 0x8C ; 140 676: 80 93 03 04 sts 0x0403, r24 if(tempLeftDistance > tempRightDistance) 67a: 20 91 37 04 lds r18, 0x0437 67e: 30 91 38 04 lds r19, 0x0438 682: 80 91 39 04 lds r24, 0x0439 686: 90 91 3a 04 lds r25, 0x043A 68a: 82 17 cp r24, r18 68c: 93 07 cpc r25, r19 68e: 18 f4 brcc .+6 ; 0x696 { regulatorMode = 0; // Mäter åt höger 690: 10 92 3f 04 sts 0x043F, r1 694: 03 c0 rjmp .+6 ; 0x69c } else { regulatorMode = 1; // Mäter åt vänster 696: 81 e0 ldi r24, 0x01 ; 1 698: 80 93 3f 04 sts 0x043F, r24 } progTimer = 50; 69c: 82 e3 ldi r24, 0x32 ; 50 69e: 80 93 2e 04 sts 0x042E, r24 progPosition++; 6a2: 89 e0 ldi r24, 0x09 ; 9 6a4: 6e c2 rjmp .+1244 ; 0xb82 break; case 9: // Mät och spara avstånd pingSendPing(); 6a6: 0e 94 8c 0b call 0x1718 ; 0x1718 progTimer = 4; 6aa: 84 e0 ldi r24, 0x04 ; 4 6ac: 80 93 2e 04 sts 0x042E, r24 if(pingGetReady()) 6b0: 0e 94 a7 0b call 0x174e ; 0x174e 6b4: 88 23 and r24, r24 6b6: 09 f4 brne .+2 ; 0x6ba 6b8: 66 c2 rjmp .+1228 ; 0xb86 { lcdSetPos(0x00); 6ba: 80 e0 ldi r24, 0x00 ; 0 6bc: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString("Align to wall "); 6c0: 82 e4 ldi r24, 0x42 ; 66 6c2: 93 e0 ldi r25, 0x03 ; 3 6c4: 0e 94 3b 08 call 0x1076 ; 0x1076 tempLastDistanceToWall = pingGetDistance(); 6c8: 0e 94 a0 0b call 0x1740 ; 0x1740 6cc: 90 93 36 04 sts 0x0436, r25 6d0: 80 93 35 04 sts 0x0435, r24 tempDistanceToWall = tempLastDistanceToWall; 6d4: 90 93 34 04 sts 0x0434, r25 6d8: 80 93 33 04 sts 0x0433, r24 6dc: 27 c1 rjmp .+590 ; 0x92c break; case 10: // Reglera in sig vinkerät mot väggen // Vrider sig ett steg if (regulatorMode == 0) // Tittar höger 6de: 80 91 3f 04 lds r24, 0x043F 6e2: 88 23 and r24, r24 6e4: 29 f4 brne .+10 ; 0x6f0 { // sväng höger servoMotorLeft = SERVO_POS_MOTOR_FW_FAST; 6e6: 86 e8 ldi r24, 0x86 ; 134 6e8: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_RE_FAST; 6ec: 88 e6 ldi r24, 0x68 ; 104 6ee: 06 c0 rjmp .+12 ; 0x6fc progTimer = 7; } else if (regulatorMode == 1) // Tittar vänster 6f0: 81 30 cpi r24, 0x01 ; 1 6f2: 49 f4 brne .+18 ; 0x706 { // sväng vänster servoMotorLeft = SERVO_POS_MOTOR_RE_FAST; 6f4: 88 e6 ldi r24, 0x68 ; 104 6f6: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_FW_FAST; 6fa: 86 e8 ldi r24, 0x86 ; 134 6fc: 80 93 05 04 sts 0x0405, r24 progTimer = 7; 700: 87 e0 ldi r24, 0x07 ; 7 702: 80 93 2e 04 sts 0x042E, r24 } progPosition++; 706: 8b e0 ldi r24, 0x0B ; 11 708: 3c c2 rjmp .+1144 ; 0xb82 break; case 11: // Reglera in sig vinkerät mot väggen // Kontrollerar avstånd pingSendPing(); 70a: 0e 94 8c 0b call 0x1718 ; 0x1718 progTimer = 4; 70e: 84 e0 ldi r24, 0x04 ; 4 710: 80 93 2e 04 sts 0x042E, r24 servoMotorLeft = SERVO_POS_MOTOR_STOP; 714: 87 e7 ldi r24, 0x77 ; 119 716: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_STOP; 71a: 80 93 05 04 sts 0x0405, r24 if(pingGetReady()) 71e: 0e 94 a7 0b call 0x174e ; 0x174e 722: 88 23 and r24, r24 724: 09 f4 brne .+2 ; 0x728 726: 2f c2 rjmp .+1118 ; 0xb86 { tempDistance = pingGetDistance(); 728: 0e 94 a0 0b call 0x1740 ; 0x1740 72c: 90 93 32 04 sts 0x0432, r25 730: 80 93 31 04 sts 0x0431, r24 if(tempDistance > tempLastDistanceToWall) 734: 20 91 35 04 lds r18, 0x0435 738: 30 91 36 04 lds r19, 0x0436 73c: 28 17 cp r18, r24 73e: 39 07 cpc r19, r25 740: 70 f4 brcc .+28 ; 0x75e { lcdSetPos(0x00); 742: 80 e0 ldi r24, 0x00 ; 0 744: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString(" ^-- (1m) --^ "); 748: 83 e5 ldi r24, 0x53 ; 83 74a: 93 e0 ldi r25, 0x03 ; 3 74c: 0e 94 3b 08 call 0x1076 ; 0x1076 progTimer = 1; 750: 81 e0 ldi r24, 0x01 ; 1 752: 80 93 2e 04 sts 0x042E, r24 progPosition++; 756: 80 91 2f 04 lds r24, 0x042F 75a: 8f 5f subi r24, 0xFF ; 255 75c: 03 c0 rjmp .+6 ; 0x764 } else progPosition--; 75e: 80 91 2f 04 lds r24, 0x042F 762: 81 50 subi r24, 0x01 ; 1 764: 80 93 2f 04 sts 0x042F, r24 tempLastDistanceToWall = tempDistance; 768: 80 91 31 04 lds r24, 0x0431 76c: 90 91 32 04 lds r25, 0x0432 770: 90 93 36 04 sts 0x0436, r25 774: 80 93 35 04 sts 0x0435, r24 778: 06 c2 rjmp .+1036 ; 0xb86 break; case 12: // Reglera in position 1meter från väggen pingSendPing(); 77a: 0e 94 8c 0b call 0x1718 ; 0x1718 progTimer = 4; 77e: 84 e0 ldi r24, 0x04 ; 4 780: 80 93 2e 04 sts 0x042E, r24 if(pingGetReady()) 784: 0e 94 a7 0b call 0x174e ; 0x174e 788: 88 23 and r24, r24 78a: 09 f4 brne .+2 ; 0x78e 78c: fc c1 rjmp .+1016 ; 0xb86 { tempDistance = pingGetDistance(); 78e: 0e 94 a0 0b call 0x1740 ; 0x1740 792: 9c 01 movw r18, r24 794: 90 93 32 04 sts 0x0432, r25 798: 80 93 31 04 sts 0x0431, r24 if(tempDistance > DISTANCE_ONE_METER) 79c: 47 e1 ldi r20, 0x17 ; 23 79e: 81 37 cpi r24, 0x71 ; 113 7a0: 94 07 cpc r25, r20 7a2: 28 f0 brcs .+10 ; 0x7ae showDistanceOnLCD((tempDistance-DISTANCE_ONE_METER),0,2); 7a4: 42 e0 ldi r20, 0x02 ; 2 7a6: 60 e0 ldi r22, 0x00 ; 0 7a8: 80 57 subi r24, 0x70 ; 112 7aa: 97 41 sbci r25, 0x17 ; 23 7ac: 06 c0 rjmp .+12 ; 0x7ba else showDistanceOnLCD((DISTANCE_ONE_METER-tempDistance),1,2); 7ae: 42 e0 ldi r20, 0x02 ; 2 7b0: 61 e0 ldi r22, 0x01 ; 1 7b2: 80 e7 ldi r24, 0x70 ; 112 7b4: 97 e1 ldi r25, 0x17 ; 23 7b6: 82 1b sub r24, r18 7b8: 93 0b sbc r25, r19 7ba: 0e 94 7c 01 call 0x2f8 ; 0x2f8 if(tempDistance < (DISTANCE_ONE_METER - 200)) 7be: 80 91 31 04 lds r24, 0x0431 7c2: 90 91 32 04 lds r25, 0x0432 7c6: 26 e1 ldi r18, 0x16 ; 22 7c8: 88 3a cpi r24, 0xA8 ; 168 7ca: 92 07 cpc r25, r18 7cc: 58 f4 brcc .+22 ; 0x7e4 { // Kör frammåt (öka hastigheten långsamt) if(servoMotorLeft > SERVO_POS_MOTOR_RE_SOFT) 7ce: 80 91 04 04 lds r24, 0x0404 7d2: 83 37 cpi r24, 0x73 ; 115 7d4: b0 f0 brcs .+44 ; 0x802 { servoMotorLeft--; 7d6: 81 50 subi r24, 0x01 ; 1 7d8: 80 93 04 04 sts 0x0404, r24 servoMotorRight--; 7dc: 80 91 05 04 lds r24, 0x0405 7e0: 81 50 subi r24, 0x01 ; 1 7e2: 0d c0 rjmp .+26 ; 0x7fe } regulatorMeasureCounter = 0; } else if(tempDistance > (DISTANCE_ONE_METER + 200)) 7e4: 89 53 subi r24, 0x39 ; 57 7e6: 98 41 sbci r25, 0x18 ; 24 7e8: 78 f0 brcs .+30 ; 0x808 { // Kör bakåt (öka hastigheten långsamt) if(servoMotorLeft < SERVO_POS_MOTOR_FW_SOFT) 7ea: 80 91 04 04 lds r24, 0x0404 7ee: 8f 37 cpi r24, 0x7F ; 127 7f0: 40 f4 brcc .+16 ; 0x802 { servoMotorLeft++; 7f2: 8f 5f subi r24, 0xFF ; 255 7f4: 80 93 04 04 sts 0x0404, r24 servoMotorRight++; 7f8: 80 91 05 04 lds r24, 0x0405 7fc: 8f 5f subi r24, 0xFF ; 255 7fe: 80 93 05 04 sts 0x0405, r24 } regulatorMeasureCounter = 0; 802: 10 92 42 04 sts 0x0442, r1 806: bf c1 rjmp .+894 ; 0xb86 } else { servoMotorLeft = SERVO_POS_MOTOR_STOP; 808: 17 e7 ldi r17, 0x77 ; 119 80a: 10 93 04 04 sts 0x0404, r17 servoMotorRight = SERVO_POS_MOTOR_STOP; 80e: 10 93 05 04 sts 0x0405, r17 if(++regulatorMeasureCounter == 5) 812: 80 91 42 04 lds r24, 0x0442 816: 8f 5f subi r24, 0xFF ; 255 818: 80 93 42 04 sts 0x0442, r24 81c: 85 30 cpi r24, 0x05 ; 5 81e: 09 f0 breq .+2 ; 0x822 820: b2 c1 rjmp .+868 ; 0xb86 { lcdSetPos(0x00); 822: 80 e0 ldi r24, 0x00 ; 0 824: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString("Posistion locked"); 828: 84 e6 ldi r24, 0x64 ; 100 82a: 93 e0 ldi r25, 0x03 ; 3 82c: 0e 94 3b 08 call 0x1076 ; 0x1076 servoMotorLeft = SERVO_POS_MOTOR_STOP; 830: 10 93 04 04 sts 0x0404, r17 servoMotorRight = SERVO_POS_MOTOR_STOP; 834: 10 93 05 04 sts 0x0405, r17 tempDistanceToWall = tempDistance; 838: 80 91 31 04 lds r24, 0x0431 83c: 90 91 32 04 lds r25, 0x0432 840: 90 93 34 04 sts 0x0434, r25 844: 80 93 33 04 sts 0x0433, r24 progTimer = 50; 848: 82 e3 ldi r24, 0x32 ; 50 84a: 80 93 2e 04 sts 0x042E, r24 regulatorMeasureCounter = 0; 84e: 10 92 42 04 sts 0x0442, r1 852: 86 c1 rjmp .+780 ; 0xb60 break; case 13: // Vrider 90grader servoPing = SERVO_POS_CENTER; 854: 8c e8 ldi r24, 0x8C ; 140 856: 80 93 03 04 sts 0x0403, r24 if(tempLeftDistance > tempRightDistance) 85a: 20 91 37 04 lds r18, 0x0437 85e: 30 91 38 04 lds r19, 0x0438 862: 80 91 39 04 lds r24, 0x0439 866: 90 91 3a 04 lds r25, 0x043A 86a: 82 17 cp r24, r18 86c: 93 07 cpc r25, r19 86e: 98 f4 brcc .+38 ; 0x896 { lcdSetPos(0x00); 870: 80 e0 ldi r24, 0x00 ; 0 872: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString("Drive: Turn < "); 876: 85 e7 ldi r24, 0x75 ; 117 878: 93 e0 ldi r25, 0x03 ; 3 87a: 0e 94 3b 08 call 0x1076 ; 0x1076 servoMotorLeft = SERVO_POS_MOTOR_RE_FAST; 87e: 88 e6 ldi r24, 0x68 ; 104 880: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_FW_FAST; 884: 86 e8 ldi r24, 0x86 ; 134 886: 80 93 05 04 sts 0x0405, r24 servoPing = SERVO_POS_RIGHT_90; 88a: 83 e4 ldi r24, 0x43 ; 67 88c: 80 93 03 04 sts 0x0403, r24 regulatorMode = 0; // Mäter åt höger 890: 10 92 3f 04 sts 0x043F, r1 894: 13 c0 rjmp .+38 ; 0x8bc progTimer = 50; } else { lcdSetPos(0x00); 896: 80 e0 ldi r24, 0x00 ; 0 898: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString("Drive: Turn > "); 89c: 84 e8 ldi r24, 0x84 ; 132 89e: 93 e0 ldi r25, 0x03 ; 3 8a0: 0e 94 3b 08 call 0x1076 ; 0x1076 servoMotorLeft = SERVO_POS_MOTOR_FW_FAST; 8a4: 86 e8 ldi r24, 0x86 ; 134 8a6: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_RE_FAST; 8aa: 88 e6 ldi r24, 0x68 ; 104 8ac: 80 93 05 04 sts 0x0405, r24 servoPing = SERVO_POS_LEFT_90; 8b0: 80 ed ldi r24, 0xD0 ; 208 8b2: 80 93 03 04 sts 0x0403, r24 regulatorMode = 1; // Mäter åt vänster 8b6: 81 e0 ldi r24, 0x01 ; 1 8b8: 80 93 3f 04 sts 0x043F, r24 progTimer = 50; 8bc: 82 e3 ldi r24, 0x32 ; 50 8be: 19 c0 rjmp .+50 ; 0x8f2 break; case 14: // Stanna servoMotorLeft = SERVO_POS_MOTOR_STOP; 8c0: 87 e7 ldi r24, 0x77 ; 119 8c2: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_STOP; 8c6: 80 93 05 04 sts 0x0405, r24 progTimer = 10; 8ca: 8a e0 ldi r24, 0x0A ; 10 8cc: 80 93 2e 04 sts 0x042E, r24 regulatorTimer = 2; 8d0: 82 e0 ldi r24, 0x02 ; 2 8d2: 80 93 40 04 sts 0x0440, r24 8d6: 18 c0 rjmp .+48 ; 0x908 break; case 15: // Kör frammåt lcdSetPos(0x00); 8d8: 80 e0 ldi r24, 0x00 ; 0 8da: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString("Drive: FORWARD "); 8de: 80 e2 ldi r24, 0x20 ; 32 8e0: 93 e0 ldi r25, 0x03 ; 3 8e2: 0e 94 3b 08 call 0x1076 ; 0x1076 servoMotorLeft = SERVO_POS_MOTOR_FW_FAST; 8e6: 86 e8 ldi r24, 0x86 ; 134 8e8: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_FW_FAST; 8ec: 80 93 05 04 sts 0x0405, r24 progTimer = 20; 8f0: 84 e1 ldi r24, 0x14 ; 20 8f2: 80 93 2e 04 sts 0x042E, r24 8f6: 34 c1 rjmp .+616 ; 0xb60 break; case 16: // Kör frammåt servoMotorLeft = SERVO_POS_MOTOR_FW_SOFT; 8f8: 8f e7 ldi r24, 0x7F ; 127 8fa: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_FW_SOFT; 8fe: 80 93 05 04 sts 0x0405, r24 progTimer = 10; 902: 8a e0 ldi r24, 0x0A ; 10 904: 80 93 2e 04 sts 0x042E, r24 progPosition++; 908: 81 e1 ldi r24, 0x11 ; 17 90a: 3b c1 rjmp .+630 ; 0xb82 break; case 17: // Mäter avstånd pingSendPing(); 90c: 0e 94 8c 0b call 0x1718 ; 0x1718 progTimer = 3; 910: 83 e0 ldi r24, 0x03 ; 3 912: 80 93 2e 04 sts 0x042E, r24 if(pingGetReady()) 916: 0e 94 a7 0b call 0x174e ; 0x174e 91a: 88 23 and r24, r24 91c: 09 f4 brne .+2 ; 0x920 91e: 33 c1 rjmp .+614 ; 0xb86 { tempDistance = pingGetDistance(); 920: 0e 94 a0 0b call 0x1740 ; 0x1740 924: 90 93 32 04 sts 0x0432, r25 928: 80 93 31 04 sts 0x0431, r24 progTimer = 1; 92c: 81 e0 ldi r24, 0x01 ; 1 92e: e1 cf rjmp .-62 ; 0x8f2 break; case 18: // Reglerar 1meter från väggen if(++regulatorCounter >= regulatorTimer) 930: 80 91 41 04 lds r24, 0x0441 934: 8f 5f subi r24, 0xFF ; 255 936: 80 93 41 04 sts 0x0441, r24 93a: 90 91 40 04 lds r25, 0x0440 93e: 89 17 cp r24, r25 940: 48 f0 brcs .+18 ; 0x954 { progPosition++; 942: 83 e1 ldi r24, 0x13 ; 19 944: 80 93 2f 04 sts 0x042F, r24 progTimer = 1; 948: 81 e0 ldi r24, 0x01 ; 1 94a: 80 93 2e 04 sts 0x042E, r24 regulatorCounter = 0; 94e: 10 92 41 04 sts 0x0441, r1 952: 19 c1 rjmp .+562 ; 0xb86 } else { uint8_t calculateProgTimer = 0; if (regulatorMode == 0) // Tittar höger 954: 80 91 3f 04 lds r24, 0x043F 958: 88 23 and r24, r24 95a: 09 f0 breq .+2 ; 0x95e 95c: 47 c0 rjmp .+142 ; 0x9ec { lcdSetPos(0x00); 95e: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString(" ]--- (1m) --->|"); 962: 83 e9 ldi r24, 0x93 ; 147 964: 93 e0 ldi r25, 0x03 ; 3 966: 0e 94 3b 08 call 0x1076 ; 0x1076 if(tempDistance > DISTANCE_ONE_METER) 96a: 20 91 31 04 lds r18, 0x0431 96e: 30 91 32 04 lds r19, 0x0432 972: 87 e1 ldi r24, 0x17 ; 23 974: 21 37 cpi r18, 0x71 ; 113 976: 38 07 cpc r19, r24 978: 30 f0 brcs .+12 ; 0x986 showDistanceOnLCD((tempDistance-DISTANCE_ONE_METER),3,2); 97a: 42 e0 ldi r20, 0x02 ; 2 97c: 63 e0 ldi r22, 0x03 ; 3 97e: c9 01 movw r24, r18 980: 80 57 subi r24, 0x70 ; 112 982: 97 41 sbci r25, 0x17 ; 23 984: 06 c0 rjmp .+12 ; 0x992 else showDistanceOnLCD((DISTANCE_ONE_METER-tempDistance),2,2); 986: 42 e0 ldi r20, 0x02 ; 2 988: 62 e0 ldi r22, 0x02 ; 2 98a: 80 e7 ldi r24, 0x70 ; 112 98c: 97 e1 ldi r25, 0x17 ; 23 98e: 82 1b sub r24, r18 990: 93 0b sbc r25, r19 992: 0e 94 7c 01 call 0x2f8 ; 0x2f8 if((tempDistance < tempLastDistanceToWall) && (tempDistance < (DISTANCE_ONE_METER -1000))) 996: 60 91 31 04 lds r22, 0x0431 99a: 70 91 32 04 lds r23, 0x0432 99e: 80 91 35 04 lds r24, 0x0435 9a2: 90 91 36 04 lds r25, 0x0436 9a6: 68 17 cp r22, r24 9a8: 79 07 cpc r23, r25 9aa: 70 f4 brcc .+28 ; 0x9c8 9ac: 23 e1 ldi r18, 0x13 ; 19 9ae: 68 38 cpi r22, 0x88 ; 136 9b0: 72 07 cpc r23, r18 9b2: 28 f4 brcc .+10 ; 0x9be { // sväng vänster servoMotorLeft = SERVO_POS_MOTOR_RE_FAST; 9b4: 88 e6 ldi r24, 0x68 ; 104 9b6: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_FW_FAST; 9ba: 86 e8 ldi r24, 0x86 ; 134 9bc: 4a c0 rjmp .+148 ; 0xa52 progTimer = calculateProgTimer; else progTimer = 15; } else if((tempDistance < tempLastDistanceToWall) && (tempDistance < (DISTANCE_ONE_METER -10))) 9be: 66 56 subi r22, 0x66 ; 102 9c0: 77 41 sbci r23, 0x17 ; 23 9c2: 08 f0 brcs .+2 ; 0x9c6 9c4: 7c c0 rjmp .+248 ; 0xabe 9c6: 73 c0 rjmp .+230 ; 0xaae servoMotorRight = SERVO_POS_MOTOR_FW_FAST; progTimer = 5; } else if((tempDistance > tempLastDistanceToWall) && (tempDistance > (DISTANCE_ONE_METER+1000))) 9c8: 86 17 cp r24, r22 9ca: 97 07 cpc r25, r23 9cc: 08 f0 brcs .+2 ; 0x9d0 9ce: 77 c0 rjmp .+238 ; 0xabe 9d0: 8b e1 ldi r24, 0x1B ; 27 9d2: 69 35 cpi r22, 0x59 ; 89 9d4: 78 07 cpc r23, r24 9d6: 28 f0 brcs .+10 ; 0x9e2 { // sväng höger servoMotorLeft = SERVO_POS_MOTOR_FW_FAST; 9d8: 86 e8 ldi r24, 0x86 ; 134 9da: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_RE_FAST; 9de: 88 e6 ldi r24, 0x68 ; 104 9e0: 4e c0 rjmp .+156 ; 0xa7e progTimer = calculateProgTimer; else progTimer = 15; } else if((tempDistance > tempLastDistanceToWall) && (tempDistance > (DISTANCE_ONE_METER+10))) 9e2: 6b 57 subi r22, 0x7B ; 123 9e4: 77 41 sbci r23, 0x17 ; 23 9e6: 08 f4 brcc .+2 ; 0x9ea 9e8: 6a c0 rjmp .+212 ; 0xabe 9ea: 39 c0 rjmp .+114 ; 0xa5e servoMotorRight = SERVO_POS_MOTOR_FW_SOFT; progTimer = 4; } } else if (regulatorMode == 1) // Tittar vänster 9ec: 81 30 cpi r24, 0x01 ; 1 9ee: 09 f0 breq .+2 ; 0x9f2 9f0: 6e c0 rjmp .+220 ; 0xace { lcdSetPos(0x00); 9f2: 80 e0 ldi r24, 0x00 ; 0 9f4: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString("|<--- (1m) ---[ "); 9f8: 84 ea ldi r24, 0xA4 ; 164 9fa: 93 e0 ldi r25, 0x03 ; 3 9fc: 0e 94 3b 08 call 0x1076 ; 0x1076 if(tempDistance > DISTANCE_ONE_METER) a00: 20 91 31 04 lds r18, 0x0431 a04: 30 91 32 04 lds r19, 0x0432 a08: 47 e1 ldi r20, 0x17 ; 23 a0a: 21 37 cpi r18, 0x71 ; 113 a0c: 34 07 cpc r19, r20 a0e: 30 f0 brcs .+12 ; 0xa1c showDistanceOnLCD((tempDistance-DISTANCE_ONE_METER),2,2); a10: 42 e0 ldi r20, 0x02 ; 2 a12: 62 e0 ldi r22, 0x02 ; 2 a14: c9 01 movw r24, r18 a16: 80 57 subi r24, 0x70 ; 112 a18: 97 41 sbci r25, 0x17 ; 23 a1a: 06 c0 rjmp .+12 ; 0xa28 else showDistanceOnLCD((DISTANCE_ONE_METER-tempDistance),3,2); a1c: 42 e0 ldi r20, 0x02 ; 2 a1e: 63 e0 ldi r22, 0x03 ; 3 a20: 80 e7 ldi r24, 0x70 ; 112 a22: 97 e1 ldi r25, 0x17 ; 23 a24: 82 1b sub r24, r18 a26: 93 0b sbc r25, r19 a28: 0e 94 7c 01 call 0x2f8 ; 0x2f8 if((tempDistance < tempLastDistanceToWall) && (tempDistance < (DISTANCE_ONE_METER-1000))) a2c: 60 91 31 04 lds r22, 0x0431 a30: 70 91 32 04 lds r23, 0x0432 a34: 80 91 35 04 lds r24, 0x0435 a38: 90 91 36 04 lds r25, 0x0436 a3c: 68 17 cp r22, r24 a3e: 79 07 cpc r23, r25 a40: 98 f4 brcc .+38 ; 0xa68 a42: 83 e1 ldi r24, 0x13 ; 19 a44: 68 38 cpi r22, 0x88 ; 136 a46: 78 07 cpc r23, r24 a48: 38 f4 brcc .+14 ; 0xa58 { // sväng höger servoMotorLeft = SERVO_POS_MOTOR_FW_FAST; a4a: 86 e8 ldi r24, 0x86 ; 134 a4c: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_RE_FAST; a50: 88 e6 ldi r24, 0x68 ; 104 a52: 80 93 05 04 sts 0x0405, r24 a56: 26 c0 rjmp .+76 ; 0xaa4 progTimer = calculateProgTimer; else progTimer = 15; } else if((tempDistance < tempLastDistanceToWall) && (tempDistance < (DISTANCE_ONE_METER-10))) a58: 66 56 subi r22, 0x66 ; 102 a5a: 77 41 sbci r23, 0x17 ; 23 a5c: 80 f5 brcc .+96 ; 0xabe { // sväng höger servoMotorLeft = SERVO_POS_MOTOR_FW_FAST; a5e: 86 e8 ldi r24, 0x86 ; 134 a60: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_RE_FAST; a64: 88 e6 ldi r24, 0x68 ; 104 a66: 27 c0 rjmp .+78 ; 0xab6 progTimer = 5; } else if((tempDistance > tempLastDistanceToWall) && (tempDistance > (DISTANCE_ONE_METER +1000))) a68: 86 17 cp r24, r22 a6a: 97 07 cpc r25, r23 a6c: 40 f5 brcc .+80 ; 0xabe a6e: 4b e1 ldi r20, 0x1B ; 27 a70: 69 35 cpi r22, 0x59 ; 89 a72: 74 07 cpc r23, r20 a74: c8 f0 brcs .+50 ; 0xaa8 { // sväng vänster servoMotorLeft = SERVO_POS_MOTOR_RE_FAST; a76: 88 e6 ldi r24, 0x68 ; 104 a78: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_FW_FAST; a7c: 86 e8 ldi r24, 0x86 ; 134 a7e: 80 93 05 04 sts 0x0405, r24 calculateProgTimer = ((tempDistance - DISTANCE_ONE_METER)/40); a82: 80 e0 ldi r24, 0x00 ; 0 a84: 90 e0 ldi r25, 0x00 ; 0 a86: 60 57 subi r22, 0x70 ; 112 a88: 77 41 sbci r23, 0x17 ; 23 a8a: 80 40 sbci r24, 0x00 ; 0 a8c: 90 40 sbci r25, 0x00 ; 0 a8e: 28 e2 ldi r18, 0x28 ; 40 a90: 30 e0 ldi r19, 0x00 ; 0 a92: 40 e0 ldi r20, 0x00 ; 0 a94: 50 e0 ldi r21, 0x00 ; 0 a96: 0e 94 e7 0b call 0x17ce ; 0x17ce <__udivmodsi4> if(calculateProgTimer < 15) a9a: 2f 30 cpi r18, 0x0F ; 15 a9c: 18 f4 brcc .+6 ; 0xaa4 progTimer = calculateProgTimer; a9e: 20 93 2e 04 sts 0x042E, r18 aa2: 15 c0 rjmp .+42 ; 0xace else progTimer = 15; aa4: 8f e0 ldi r24, 0x0F ; 15 aa6: 11 c0 rjmp .+34 ; 0xaca } else if((tempDistance > tempLastDistanceToWall) && (tempDistance > (DISTANCE_ONE_METER +10))) aa8: 6b 57 subi r22, 0x7B ; 123 aaa: 77 41 sbci r23, 0x17 ; 23 aac: 40 f0 brcs .+16 ; 0xabe { // sväng vänster servoMotorLeft = SERVO_POS_MOTOR_RE_FAST; aae: 88 e6 ldi r24, 0x68 ; 104 ab0: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_FW_FAST; ab4: 86 e8 ldi r24, 0x86 ; 134 ab6: 80 93 05 04 sts 0x0405, r24 progTimer = 5; aba: 85 e0 ldi r24, 0x05 ; 5 abc: 06 c0 rjmp .+12 ; 0xaca } else { servoMotorLeft = SERVO_POS_MOTOR_FW_SOFT; abe: 8f e7 ldi r24, 0x7F ; 127 ac0: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_FW_SOFT; ac4: 80 93 05 04 sts 0x0405, r24 progTimer = 4; ac8: 84 e0 ldi r24, 0x04 ; 4 aca: 80 93 2e 04 sts 0x042E, r24 } } tempLastDistanceToWall = tempDistance; ace: 80 91 31 04 lds r24, 0x0431 ad2: 90 91 32 04 lds r25, 0x0432 ad6: 90 93 36 04 sts 0x0436, r25 ada: 80 93 35 04 sts 0x0435, r24 progPosition--; ade: 80 91 2f 04 lds r24, 0x042F progPosition--; ae2: 82 50 subi r24, 0x02 ; 2 ae4: 4e c0 rjmp .+156 ; 0xb82 break; case 19: servoPing = SERVO_POS_CENTER; ae6: 8c e8 ldi r24, 0x8C ; 140 ae8: 80 93 03 04 sts 0x0403, r24 servoMotorLeft = SERVO_POS_MOTOR_STOP; aec: 87 e7 ldi r24, 0x77 ; 119 aee: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_STOP; af2: 80 93 05 04 sts 0x0405, r24 progTimer = 35; af6: 83 e2 ldi r24, 0x23 ; 35 af8: 80 93 2e 04 sts 0x042E, r24 progPosition++; afc: 84 e1 ldi r24, 0x14 ; 20 afe: 41 c0 rjmp .+130 ; 0xb82 break; case 20: progTimer = 3; b00: 83 e0 ldi r24, 0x03 ; 3 b02: 80 93 2e 04 sts 0x042E, r24 pingSendPing(); b06: 0e 94 8c 0b call 0x1718 ; 0x1718 if(pingGetReady()) b0a: 0e 94 a7 0b call 0x174e ; 0x174e b0e: 88 23 and r24, r24 b10: d1 f1 breq .+116 ; 0xb86 { tempDistance = pingGetDistance(); b12: 0e 94 a0 0b call 0x1740 ; 0x1740 b16: 90 93 32 04 sts 0x0432, r25 b1a: 80 93 31 04 sts 0x0431, r24 if(tempDistance < DISTANCE_ONE_METER) b1e: 27 e1 ldi r18, 0x17 ; 23 b20: 80 37 cpi r24, 0x70 ; 112 b22: 92 07 cpc r25, r18 b24: 40 f4 brcc .+16 ; 0xb36 { showDistanceOnLCD(0,0,1); b26: 41 e0 ldi r20, 0x01 ; 1 b28: 60 e0 ldi r22, 0x00 ; 0 b2a: 80 e0 ldi r24, 0x00 ; 0 b2c: 90 e0 ldi r25, 0x00 ; 0 b2e: 0e 94 7c 01 call 0x2f8 ; 0x2f8 progPosition = 2; b32: 82 e0 ldi r24, 0x02 ; 2 b34: 26 c0 rjmp .+76 ; 0xb82 b36: 9c 01 movw r18, r24 b38: 20 57 subi r18, 0x70 ; 112 b3a: 37 41 sbci r19, 0x17 ; 23 } else if (tempDistance < (DISTANCE_ONE_METER*2)) b3c: 80 5e subi r24, 0xE0 ; 224 b3e: 9e 42 sbci r25, 0x2E ; 46 b40: 38 f4 brcc .+14 ; 0xb50 { showDistanceOnLCD(tempDistance-DISTANCE_ONE_METER,0,1); b42: 41 e0 ldi r20, 0x01 ; 1 b44: 60 e0 ldi r22, 0x00 ; 0 b46: c9 01 movw r24, r18 b48: 0e 94 7c 01 call 0x2f8 ; 0x2f8 regulatorTimer = 2; b4c: 82 e0 ldi r24, 0x02 ; 2 b4e: 06 c0 rjmp .+12 ; 0xb5c progPosition++; } else { showDistanceOnLCD(tempDistance-DISTANCE_ONE_METER,0,1); b50: 41 e0 ldi r20, 0x01 ; 1 b52: 60 e0 ldi r22, 0x00 ; 0 b54: c9 01 movw r24, r18 b56: 0e 94 7c 01 call 0x2f8 ; 0x2f8 regulatorTimer = 10; b5a: 8a e0 ldi r24, 0x0A ; 10 b5c: 80 93 40 04 sts 0x0440, r24 progPosition++; b60: 80 91 2f 04 lds r24, 0x042F b64: 8f 5f subi r24, 0xFF ; 255 b66: 0d c0 rjmp .+26 ; 0xb82 break; case 21: if (regulatorMode == 0) // Tittar höger b68: 80 91 3f 04 lds r24, 0x043F b6c: 88 23 and r24, r24 b6e: 11 f4 brne .+4 ; 0xb74 { servoPing = SERVO_POS_RIGHT_90; b70: 83 e4 ldi r24, 0x43 ; 67 b72: 01 c0 rjmp .+2 ; 0xb76 } else { servoPing = SERVO_POS_LEFT_90; b74: 80 ed ldi r24, 0xD0 ; 208 b76: 80 93 03 04 sts 0x0403, r24 } progTimer = 5; b7a: 85 e0 ldi r24, 0x05 ; 5 b7c: 80 93 2e 04 sts 0x042E, r24 progPosition = 15; b80: 8f e0 ldi r24, 0x0F ; 15 b82: 80 93 2f 04 sts 0x042F, r24 break; } progCounter = 0; b86: 10 92 2d 04 sts 0x042D, r1 } } // Program for robot AI if (roboActive == 2) b8a: 20 91 3b 04 lds r18, 0x043B b8e: 22 30 cpi r18, 0x02 ; 2 b90: 09 f0 breq .+2 ; 0xb94 b92: 01 c1 rjmp .+514 ; 0xd96 { // Program(2) for random RFID serach if (++progCounter >= progTimer) b94: 80 91 2d 04 lds r24, 0x042D b98: 8f 5f subi r24, 0xFF ; 255 b9a: 80 93 2d 04 sts 0x042D, r24 b9e: 90 91 2e 04 lds r25, 0x042E ba2: 89 17 cp r24, r25 ba4: 08 f4 brcc .+2 ; 0xba8 ba6: f7 c0 rjmp .+494 ; 0xd96 { switch (progPosition) ba8: 80 91 2f 04 lds r24, 0x042F bac: 84 30 cpi r24, 0x04 ; 4 bae: 09 f4 brne .+2 ; 0xbb2 bb0: 68 c0 rjmp .+208 ; 0xc82 bb2: 85 30 cpi r24, 0x05 ; 5 bb4: 50 f4 brcc .+20 ; 0xbca bb6: 81 30 cpi r24, 0x01 ; 1 bb8: 11 f1 breq .+68 ; 0xbfe bba: 81 30 cpi r24, 0x01 ; 1 bbc: c8 f0 brcs .+50 ; 0xbf0 bbe: 82 30 cpi r24, 0x02 ; 2 bc0: 59 f1 breq .+86 ; 0xc18 bc2: 83 30 cpi r24, 0x03 ; 3 bc4: 09 f0 breq .+2 ; 0xbc8 bc6: e5 c0 rjmp .+458 ; 0xd92 bc8: 4e c0 rjmp .+156 ; 0xc66 bca: 87 30 cpi r24, 0x07 ; 7 bcc: 09 f4 brne .+2 ; 0xbd0 bce: 7c c0 rjmp .+248 ; 0xcc8 bd0: 88 30 cpi r24, 0x08 ; 8 bd2: 38 f4 brcc .+14 ; 0xbe2 bd4: 85 30 cpi r24, 0x05 ; 5 bd6: 09 f4 brne .+2 ; 0xbda bd8: 5d c0 rjmp .+186 ; 0xc94 bda: 86 30 cpi r24, 0x06 ; 6 bdc: 09 f0 breq .+2 ; 0xbe0 bde: d9 c0 rjmp .+434 ; 0xd92 be0: 61 c0 rjmp .+194 ; 0xca4 be2: 88 30 cpi r24, 0x08 ; 8 be4: 09 f4 brne .+2 ; 0xbe8 be6: 78 c0 rjmp .+240 ; 0xcd8 be8: 89 30 cpi r24, 0x09 ; 9 bea: 09 f0 breq .+2 ; 0xbee bec: d2 c0 rjmp .+420 ; 0xd92 bee: c6 c0 rjmp .+396 ; 0xd7c { case 0: lcdClearDisplay(); bf0: 0e 94 df 07 call 0xfbe ; 0xfbe lcdSetLayout(1); bf4: 81 e0 ldi r24, 0x01 ; 1 bf6: 0e 94 a8 07 call 0xf50 ; 0xf50 progTimer = 1; bfa: 81 e0 ldi r24, 0x01 ; 1 bfc: b9 c0 rjmp .+370 ; 0xd70 break; case 1: lcdSetPos(0x00); bfe: 80 e0 ldi r24, 0x00 ; 0 c00: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString("Drive: FORWARD "); c04: 80 e2 ldi r24, 0x20 ; 32 c06: 93 e0 ldi r25, 0x03 ; 3 c08: 0e 94 3b 08 call 0x1076 ; 0x1076 servoMotorLeft = SERVO_POS_MOTOR_FW_FAST; c0c: 86 e8 ldi r24, 0x86 ; 134 c0e: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_FW_FAST; c12: 80 93 05 04 sts 0x0405, r24 c16: 56 c0 rjmp .+172 ; 0xcc4 break; case 2: servoMotorLeft = SERVO_POS_MOTOR_FW_SOFT; c18: 8f e7 ldi r24, 0x7F ; 127 c1a: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_FW_SOFT; c1e: 80 93 05 04 sts 0x0405, r24 pingSendPing(); c22: 0e 94 8c 0b call 0x1718 ; 0x1718 progTimer = 3; c26: 83 e0 ldi r24, 0x03 ; 3 c28: 80 93 2e 04 sts 0x042E, r24 if(pingGetReady()) c2c: 0e 94 a7 0b call 0x174e ; 0x174e c30: 88 23 and r24, r24 c32: 09 f4 brne .+2 ; 0xc36 c34: ae c0 rjmp .+348 ; 0xd92 { tempDistance = pingGetDistance(); c36: 0e 94 a0 0b call 0x1740 ; 0x1740 c3a: 90 93 32 04 sts 0x0432, r25 c3e: 80 93 31 04 sts 0x0431, r24 if(tempDistance < DISTANCE_TO_STOP) c42: 25 e1 ldi r18, 0x15 ; 21 c44: 8c 37 cpi r24, 0x7C ; 124 c46: 92 07 cpc r25, r18 c48: 38 f4 brcc .+14 ; 0xc58 { showDistanceOnLCD(0,0,2); c4a: 42 e0 ldi r20, 0x02 ; 2 c4c: 60 e0 ldi r22, 0x00 ; 0 c4e: 80 e0 ldi r24, 0x00 ; 0 c50: 90 e0 ldi r25, 0x00 ; 0 c52: 0e 94 7c 01 call 0x2f8 ; 0x2f8 c56: 8e c0 rjmp .+284 ; 0xd74 progPosition++; } else { showDistanceOnLCD(tempDistance-DISTANCE_TO_STOP,0,2); c58: 42 e0 ldi r20, 0x02 ; 2 c5a: 60 e0 ldi r22, 0x00 ; 0 c5c: 8c 57 subi r24, 0x7C ; 124 c5e: 95 41 sbci r25, 0x15 ; 21 c60: 0e 94 7c 01 call 0x2f8 ; 0x2f8 c64: 96 c0 rjmp .+300 ; 0xd92 break; case 3: lcdSetPos(0x00); c66: 80 e0 ldi r24, 0x00 ; 0 c68: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString("Drive: STOP "); c6c: 81 e3 ldi r24, 0x31 ; 49 c6e: 93 e0 ldi r25, 0x03 ; 3 c70: 0e 94 3b 08 call 0x1076 ; 0x1076 // Stop and breake servoMotorLeft = SERVO_POS_MOTOR_STOP; servoMotorRight = SERVO_POS_MOTOR_STOP; servoMotorLeft = SERVO_POS_MOTOR_RE; c74: 8c e6 ldi r24, 0x6C ; 108 c76: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_RE; c7a: 80 93 05 04 sts 0x0405, r24 progTimer = 50; c7e: 82 e3 ldi r24, 0x32 ; 50 c80: 77 c0 rjmp .+238 ; 0xd70 break; case 4: servoMotorLeft = SERVO_POS_MOTOR_STOP; c82: 87 e7 ldi r24, 0x77 ; 119 c84: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_STOP; c88: 80 93 05 04 sts 0x0405, r24 progTimer = 2; c8c: 20 93 2e 04 sts 0x042E, r18 progPosition++; c90: 85 e0 ldi r24, 0x05 ; 5 c92: 7d c0 rjmp .+250 ; 0xd8e break; case 5: servoPing = SERVO_POS_LEFT_45; c94: 8e ea ldi r24, 0xAE ; 174 c96: 80 93 03 04 sts 0x0403, r24 progTimer = 20; c9a: 84 e1 ldi r24, 0x14 ; 20 c9c: 80 93 2e 04 sts 0x042E, r24 progPosition++; ca0: 86 e0 ldi r24, 0x06 ; 6 ca2: 75 c0 rjmp .+234 ; 0xd8e break; case 6: pingSendPing(); ca4: 0e 94 8c 0b call 0x1718 ; 0x1718 progTimer = 4; ca8: 84 e0 ldi r24, 0x04 ; 4 caa: 80 93 2e 04 sts 0x042E, r24 if(pingGetReady()) cae: 0e 94 a7 0b call 0x174e ; 0x174e cb2: 88 23 and r24, r24 cb4: 09 f4 brne .+2 ; 0xcb8 cb6: 6d c0 rjmp .+218 ; 0xd92 { tempLeftDistance = pingGetDistance(); cb8: 0e 94 a0 0b call 0x1740 ; 0x1740 cbc: 90 93 38 04 sts 0x0438, r25 cc0: 80 93 37 04 sts 0x0437, r24 progTimer = 20; cc4: 84 e1 ldi r24, 0x14 ; 20 cc6: 54 c0 rjmp .+168 ; 0xd70 break; case 7: servoPing = SERVO_POS_RIGHT_45; cc8: 87 e6 ldi r24, 0x67 ; 103 cca: 80 93 03 04 sts 0x0403, r24 progTimer = 40; cce: 88 e2 ldi r24, 0x28 ; 40 cd0: 80 93 2e 04 sts 0x042E, r24 progPosition++; cd4: 88 e0 ldi r24, 0x08 ; 8 cd6: 5b c0 rjmp .+182 ; 0xd8e break; case 8: pingSendPing(); cd8: 0e 94 8c 0b call 0x1718 ; 0x1718 progTimer = 4; cdc: 84 e0 ldi r24, 0x04 ; 4 cde: 80 93 2e 04 sts 0x042E, r24 if(pingGetReady()) ce2: 0e 94 a7 0b call 0x174e ; 0x174e ce6: 88 23 and r24, r24 ce8: 09 f4 brne .+2 ; 0xcec cea: 53 c0 rjmp .+166 ; 0xd92 { tempRightDistance = pingGetDistance(); cec: 0e 94 a0 0b call 0x1740 ; 0x1740 cf0: 9c 01 movw r18, r24 cf2: 90 93 3a 04 sts 0x043A, r25 cf6: 80 93 39 04 sts 0x0439, r24 servoPing = SERVO_POS_CENTER; cfa: 8c e8 ldi r24, 0x8C ; 140 cfc: 80 93 03 04 sts 0x0403, r24 if((tempLeftDistance < DISTANCE_TO_STOP ) d00: 80 91 37 04 lds r24, 0x0437 d04: 90 91 38 04 lds r25, 0x0438 d08: 45 e1 ldi r20, 0x15 ; 21 d0a: 8c 37 cpi r24, 0x7C ; 124 d0c: 94 07 cpc r25, r20 d0e: 98 f4 brcc .+38 ; 0xd36 d10: 45 e1 ldi r20, 0x15 ; 21 d12: 2c 37 cpi r18, 0x7C ; 124 d14: 34 07 cpc r19, r20 d16: 78 f4 brcc .+30 ; 0xd36 && (tempRightDistance < DISTANCE_TO_STOP)) { lcdSetPos(0x00); d18: 80 e0 ldi r24, 0x00 ; 0 d1a: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString("Drive: Turn <<< "); d1e: 85 eb ldi r24, 0xB5 ; 181 d20: 93 e0 ldi r25, 0x03 ; 3 d22: 0e 94 3b 08 call 0x1076 ; 0x1076 servoMotorLeft = SERVO_POS_MOTOR_RE_FAST; d26: 88 e6 ldi r24, 0x68 ; 104 d28: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_FW_FAST; d2c: 86 e8 ldi r24, 0x86 ; 134 d2e: 80 93 05 04 sts 0x0405, r24 progTimer = 70; d32: 86 e4 ldi r24, 0x46 ; 70 d34: 1d c0 rjmp .+58 ; 0xd70 } else if(tempLeftDistance > tempRightDistance) d36: 28 17 cp r18, r24 d38: 39 07 cpc r19, r25 d3a: 60 f4 brcc .+24 ; 0xd54 { lcdSetPos(0x00); d3c: 80 e0 ldi r24, 0x00 ; 0 d3e: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString("Drive: Turn < "); d42: 86 ec ldi r24, 0xC6 ; 198 d44: 93 e0 ldi r25, 0x03 ; 3 d46: 0e 94 3b 08 call 0x1076 ; 0x1076 servoMotorLeft = SERVO_POS_MOTOR_RE_FAST; d4a: 88 e6 ldi r24, 0x68 ; 104 d4c: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_FW_FAST; d50: 86 e8 ldi r24, 0x86 ; 134 d52: 0b c0 rjmp .+22 ; 0xd6a progTimer = 40; } else { lcdSetPos(0x00); d54: 80 e0 ldi r24, 0x00 ; 0 d56: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString("Drive: Turn > "); d5a: 87 ed ldi r24, 0xD7 ; 215 d5c: 93 e0 ldi r25, 0x03 ; 3 d5e: 0e 94 3b 08 call 0x1076 ; 0x1076 servoMotorLeft = SERVO_POS_MOTOR_FW_FAST; d62: 86 e8 ldi r24, 0x86 ; 134 d64: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_RE_FAST; d68: 88 e6 ldi r24, 0x68 ; 104 d6a: 80 93 05 04 sts 0x0405, r24 progTimer = 40; d6e: 88 e2 ldi r24, 0x28 ; 40 d70: 80 93 2e 04 sts 0x042E, r24 } progPosition++; d74: 80 91 2f 04 lds r24, 0x042F d78: 8f 5f subi r24, 0xFF ; 255 d7a: 09 c0 rjmp .+18 ; 0xd8e break; case 9: servoMotorLeft = SERVO_POS_MOTOR_STOP; d7c: 87 e7 ldi r24, 0x77 ; 119 d7e: 80 93 04 04 sts 0x0404, r24 servoMotorRight = SERVO_POS_MOTOR_STOP; d82: 80 93 05 04 sts 0x0405, r24 progTimer = 10; d86: 8a e0 ldi r24, 0x0A ; 10 d88: 80 93 2e 04 sts 0x042E, r24 progPosition = 1; d8c: 81 e0 ldi r24, 0x01 ; 1 d8e: 80 93 2f 04 sts 0x042F, r24 break; } progCounter = 0; d92: 10 92 2d 04 sts 0x042D, r1 } } if (roboActive == 3) d96: 80 91 3b 04 lds r24, 0x043B d9a: 83 30 cpi r24, 0x03 ; 3 d9c: 09 f0 breq .+2 ; 0xda0 d9e: 46 c0 rjmp .+140 ; 0xe2c { // Program(2) for random RFID serach if (++progCounter >= progTimer) da0: 80 91 2d 04 lds r24, 0x042D da4: 8f 5f subi r24, 0xFF ; 255 da6: 80 93 2d 04 sts 0x042D, r24 daa: 90 91 2e 04 lds r25, 0x042E dae: 89 17 cp r24, r25 db0: e8 f1 brcs .+122 ; 0xe2c { switch (progPosition) db2: 80 91 2f 04 lds r24, 0x042F db6: 88 23 and r24, r24 db8: 19 f0 breq .+6 ; 0xdc0 dba: 81 30 cpi r24, 0x01 ; 1 dbc: a9 f5 brne .+106 ; 0xe28 dbe: 1c c0 rjmp .+56 ; 0xdf8 { case 0: lcdClearDisplay(); dc0: 0e 94 df 07 call 0xfbe ; 0xfbe lcdSetLayout(1); dc4: 81 e0 ldi r24, 0x01 ; 1 dc6: 0e 94 a8 07 call 0xf50 ; 0xf50 lcdSetPos(0x00); dca: 80 e0 ldi r24, 0x00 ; 0 dcc: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString("Servo: forward "); dd0: 88 ee ldi r24, 0xE8 ; 232 dd2: 93 e0 ldi r25, 0x03 ; 3 dd4: 0e 94 3b 08 call 0x1076 ; 0x1076 lcdSetPos(0x10); dd8: 80 e1 ldi r24, 0x10 ; 16 dda: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteString("Distance: "); dde: 88 ef ldi r24, 0xF8 ; 248 de0: 93 e0 ldi r25, 0x03 ; 3 de2: 0e 94 3b 08 call 0x1076 ; 0x1076 progTimer = 1; de6: 81 e0 ldi r24, 0x01 ; 1 de8: 80 93 2e 04 sts 0x042E, r24 progPosition++; dec: 80 91 2f 04 lds r24, 0x042F df0: 8f 5f subi r24, 0xFF ; 255 df2: 80 93 2f 04 sts 0x042F, r24 df6: 18 c0 rjmp .+48 ; 0xe28 break; case 1: pingSendPing(); df8: 0e 94 8c 0b call 0x1718 ; 0x1718 progTimer = 10; dfc: 8a e0 ldi r24, 0x0A ; 10 dfe: 80 93 2e 04 sts 0x042E, r24 if(pingGetReady()) e02: 0e 94 a7 0b call 0x174e ; 0x174e e06: 88 23 and r24, r24 e08: 79 f0 breq .+30 ; 0xe28 { tempDistance = pingGetDistance(); e0a: 0e 94 a0 0b call 0x1740 ; 0x1740 e0e: 90 93 32 04 sts 0x0432, r25 e12: 80 93 31 04 sts 0x0431, r24 lcdSetPos(0x1A); e16: 8a e1 ldi r24, 0x1A ; 26 e18: 0e 94 d3 07 call 0xfa6 ; 0xfa6 lcdWriteHexAsDecimal(tempDistance); e1c: 80 91 31 04 lds r24, 0x0431 e20: 90 91 32 04 lds r25, 0x0432 e24: 0e 94 80 08 call 0x1100 ; 0x1100 } break; } progCounter = 0; e28: 10 92 2d 04 sts 0x042D, r1 e2c: 1f 91 pop r17 e2e: 08 95 ret 00000e30
: } /*================================================================================================ Main ================================================================================================*/ int main (void){ e30: cf 93 push r28 e32: df 93 push r29 cli(); // Disable global interrupt e34: f8 94 cli initIO(); e36: 0e 94 e8 00 call 0x1d0 ; 0x1d0 lcdInit(); e3a: 0e 94 40 09 call 0x1280 ; 0x1280 rfIdInit(); e3e: 0e 94 b0 09 call 0x1360 ; 0x1360 roboMSPInit(); e42: 0e 94 30 0a call 0x1460 ; 0x1460 pingInit(); e46: 0e 94 ab 0b call 0x1756 ; 0x1756 lcdSetIntensity(50); e4a: 82 e3 ldi r24, 0x32 ; 50 e4c: 0e 94 99 07 call 0xf32 ; 0xf32 lcdSetLayout(2); e50: 82 e0 ldi r24, 0x02 ; 2 e52: 0e 94 a8 07 call 0xf50 ; 0xf50 lcdWriteStringP(menuTable[0]); e56: 8c e9 ldi r24, 0x9C ; 156 e58: 90 e0 ldi r25, 0x00 ; 0 e5a: 0e 94 2d 08 call 0x105a ; 0x105a rfIdDisable(); e5e: 0e 94 bb 09 call 0x1376 ; 0x1376 roboMSPDisable(); e62: 0e 94 42 0a call 0x1484 ; 0x1484 sei(); // Enable global interrupt e66: 78 94 sei e68: c0 e6 ldi r28, 0x60 ; 96 e6a: d1 e0 ldi r29, 0x01 ; 1 while(1){ if(progDoUpdate) e6c: 80 91 30 04 lds r24, 0x0430 e70: 88 23 and r24, r24 e72: 21 f0 breq .+8 ; 0xe7c { progDoUpdate = 0; e74: 10 92 30 04 sts 0x0430, r1 updateProgram(); e78: 0e 94 9b 02 call 0x536 ; 0x536 } // Active-mode 1 (left switch lower position) if (!bit_is_set(PINA,PA4)) e7c: cc 99 sbic 0x19, 4 ; 25 e7e: 08 c0 rjmp .+16 ; 0xe90 { if(switchOneCheck) e80: 80 91 3d 04 lds r24, 0x043D e84: 88 23 and r24, r24 e86: 59 f1 breq .+86 ; 0xede { activateRobot(3); e88: 83 e0 ldi r24, 0x03 ; 3 e8a: 0e 94 5b 01 call 0x2b6 ; 0x2b6 e8e: 25 c0 rjmp .+74 ; 0xeda switchOneCheck = 0; } } // Active-mode 2 (left switch middle position) else if ((bit_is_set(PINA,PA5)) && (bit_is_set(PINA,PA4))) e90: cd 9b sbis 0x19, 5 ; 25 e92: 10 c0 rjmp .+32 ; 0xeb4 e94: cc 9b sbis 0x19, 4 ; 25 e96: 0e c0 rjmp .+28 ; 0xeb4 { if(!switchOneCheck) e98: 80 91 3d 04 lds r24, 0x043D e9c: 88 23 and r24, r24 e9e: f9 f4 brne .+62 ; 0xede { deactivateRobot(); ea0: 0e 94 6f 01 call 0x2de ; 0x2de rfEnable = 0; ea4: 10 92 3c 04 sts 0x043C, r1 switchOneCheck = 1; ea8: 81 e0 ldi r24, 0x01 ; 1 eaa: 80 93 3d 04 sts 0x043D, r24 main(); eae: 0e 94 18 07 call 0xe30 ; 0xe30
eb2: 15 c0 rjmp .+42 ; 0xede } } // Active-mode 3 (left switch upper position) else if (!bit_is_set(PINA,PA5)) eb4: cd 99 sbic 0x19, 5 ; 25 eb6: 13 c0 rjmp .+38 ; 0xede { if(switchOneCheck) eb8: 80 91 3d 04 lds r24, 0x043D ebc: 88 23 and r24, r24 ebe: 79 f0 breq .+30 ; 0xede { lcdSetLayout(0); ec0: 80 e0 ldi r24, 0x00 ; 0 ec2: 0e 94 a8 07 call 0xf50 ; 0xf50 lcdWriteStringP(menuTable[4]); ec6: ce 01 movw r24, r28 ec8: 0e 94 2d 08 call 0x105a ; 0x105a rfEnable = 1; ecc: 81 e0 ldi r24, 0x01 ; 1 ece: 80 93 3c 04 sts 0x043C, r24 rfIdEnable(); ed2: 0e 94 bf 09 call 0x137e ; 0x137e roboMSPEnable(); ed6: 0e 94 45 0a call 0x148a ; 0x148a switchOneCheck = 0; eda: 10 92 3d 04 sts 0x043D, r1 } } // Active-mode 1 (left switch lower position) if (!bit_is_set(PINA,PA6)) ede: ce 99 sbic 0x19, 6 ; 25 ee0: 06 c0 rjmp .+12 ; 0xeee { if(switchTwoCheck) ee2: 80 91 3e 04 lds r24, 0x043E ee6: 88 23 and r24, r24 ee8: 09 f2 breq .-126 ; 0xe6c { activateRobot(1); eea: 81 e0 ldi r24, 0x01 ; 1 eec: 1b c0 rjmp .+54 ; 0xf24 switchTwoCheck = 0; } } // Active-mode 2 (left switch middle position) else if ((bit_is_set(PINA,PA7)) && (bit_is_set(PINA,PA6))) eee: cf 9b sbis 0x19, 7 ; 25 ef0: 11 c0 rjmp .+34 ; 0xf14 ef2: ce 9b sbis 0x19, 6 ; 25 ef4: 0f c0 rjmp .+30 ; 0xf14 { if(!switchTwoCheck) ef6: 80 91 3e 04 lds r24, 0x043E efa: 88 23 and r24, r24 efc: 09 f0 breq .+2 ; 0xf00 efe: b6 cf rjmp .-148 ; 0xe6c { deactivateRobot(); f00: 0e 94 6f 01 call 0x2de ; 0x2de rfEnable = 0; f04: 10 92 3c 04 sts 0x043C, r1 switchTwoCheck = 1; f08: 81 e0 ldi r24, 0x01 ; 1 f0a: 80 93 3e 04 sts 0x043E, r24 main(); f0e: 0e 94 18 07 call 0xe30 ; 0xe30
f12: ac cf rjmp .-168 ; 0xe6c } } // Active-mode 3 (left switch upper position) else if (!bit_is_set(PINA,PA7)) f14: cf 99 sbic 0x19, 7 ; 25 f16: aa cf rjmp .-172 ; 0xe6c { if(switchTwoCheck) f18: 80 91 3e 04 lds r24, 0x043E f1c: 88 23 and r24, r24 f1e: 09 f4 brne .+2 ; 0xf22 f20: a5 cf rjmp .-182 ; 0xe6c { activateRobot(2); f22: 82 e0 ldi r24, 0x02 ; 2 f24: 0e 94 5b 01 call 0x2b6 ; 0x2b6 switchTwoCheck = 0; f28: 10 92 3e 04 sts 0x043E, r1 f2c: 9f cf rjmp .-194 ; 0xe6c 00000f2e : data=0x83; break; } return(data); } f2e: 99 27 eor r25, r25 f30: 08 95 ret 00000f32 : Return: - ------------------------------------------------------------------------------------------------*/ void lcdSetIntensity (uint8_t intensity) { OCR0 = intensity; f32: 81 bf out 0x31, r24 ; 49 f34: 08 95 ret 00000f36 : Input: cData Return: - ------------------------------------------------------------------------------------------------*/ void lcdWriteIns (uint8_t data) { f36: 1f 93 push r17 f38: 18 2f mov r17, r24 spiSetLowSpeed(); f3a: 0e 94 f9 0a call 0x15f2 ; 0x15f2 spiSelectDeviceIO(LCD_CS); f3e: 80 e0 ldi r24, 0x00 ; 0 f40: 0e 94 fc 0a call 0x15f8 ; 0x15f8 LCD_PORT &= ~(1< f4c: 1f 91 pop r17 f4e: 08 95 ret 00000f50 : Return: - ------------------------------------------------------------------------------------------------*/ void lcdSetLayout (uint8_t layoutType) { switch(layoutType) f50: 81 30 cpi r24, 0x01 ; 1 f52: 51 f0 breq .+20 ; 0xf68 f54: 81 30 cpi r24, 0x01 ; 1 f56: 18 f0 brcs .+6 ; 0xf5e f58: 82 30 cpi r24, 0x02 ; 2 f5a: f9 f4 brne .+62 ; 0xf9a f5c: 12 c0 rjmp .+36 ; 0xf82 { case 0: // 3 lines lcdWriteIns(0x39); f5e: 89 e3 ldi r24, 0x39 ; 57 f60: 0e 94 9b 07 call 0xf36 ; 0xf36 lcdWriteIns(0x1D); // bias = 1/4 , 3 line mode f64: 8d e1 ldi r24, 0x1D ; 29 f66: 0a c0 rjmp .+20 ; 0xf7c break; case 1: // 2 lines, Double font on lower position lcdWriteIns(0x39); f68: 89 e3 ldi r24, 0x39 ; 57 f6a: 0e 94 9b 07 call 0xf36 ; 0xf36 lcdWriteIns(0x1C); // bias = 1/4 , 2 line mode f6e: 8c e1 ldi r24, 0x1C ; 28 f70: 0e 94 9b 07 call 0xf36 ; 0xf36 lcdWriteIns(0x3E); f74: 8e e3 ldi r24, 0x3E ; 62 f76: 0e 94 9b 07 call 0xf36 ; 0xf36 lcdWriteIns(0x10); f7a: 80 e1 ldi r24, 0x10 ; 16 f7c: 0e 94 9b 07 call 0xf36 ; 0xf36 f80: 08 95 ret break; case 2: // 2 lines, Double font on upper position lcdWriteIns(0x39); f82: 89 e3 ldi r24, 0x39 ; 57 f84: 0e 94 9b 07 call 0xf36 ; 0xf36 lcdWriteIns(0x1C); // bias = 1/4 , 2 line mode f88: 8c e1 ldi r24, 0x1C ; 28 f8a: 0e 94 9b 07 call 0xf36 ; 0xf36 lcdWriteIns(0x3E); f8e: 8e e3 ldi r24, 0x3E ; 62 f90: 0e 94 9b 07 call 0xf36 ; 0xf36 lcdWriteIns(0x18); f94: 88 e1 ldi r24, 0x18 ; 24 f96: 0e 94 9b 07 call 0xf36 ; 0xf36 f9a: 08 95 ret 00000f9c : Return: - ------------------------------------------------------------------------------------------------*/ void lcdSetContrast (uint8_t contrastValue) { lcdWriteIns(0x70|(0x0F & contrastValue)); f9c: 8f 70 andi r24, 0x0F ; 15 f9e: 80 67 ori r24, 0x70 ; 112 fa0: 0e 94 9b 07 call 0xf36 ; 0xf36 fa4: 08 95 ret 00000fa6 : Return: - ------------------------------------------------------------------------------------------------*/ void lcdSetPos (uint8_t address) { lcdWriteIns(0x80|address); fa6: 80 68 ori r24, 0x80 ; 128 fa8: 0e 94 9b 07 call 0xf36 ; 0xf36 fac: 08 95 ret 00000fae : Return: - ------------------------------------------------------------------------------------------------*/ void lcdReturnHome (void) { lcdWriteIns(0x02); fae: 82 e0 ldi r24, 0x02 ; 2 fb0: 0e 94 9b 07 call 0xf36 ; 0xf36 fb4: 80 e4 ldi r24, 0x40 ; 64 fb6: 9f e1 ldi r25, 0x1F ; 31 fb8: 01 97 sbiw r24, 0x01 ; 1 fba: f1 f7 brne .-4 ; 0xfb8 fbc: 08 95 ret 00000fbe : Return: - ------------------------------------------------------------------------------------------------*/ void lcdClearDisplay (void) { lcdWriteIns(0x01); fbe: 81 e0 ldi r24, 0x01 ; 1 fc0: 0e 94 9b 07 call 0xf36 ; 0xf36 fc4: 80 e4 ldi r24, 0x40 ; 64 fc6: 9f e1 ldi r25, 0x1F ; 31 fc8: 01 97 sbiw r24, 0x01 ; 1 fca: f1 f7 brne .-4 ; 0xfc8 fcc: 08 95 ret 00000fce : Return: - ------------------------------------------------------------------------------------------------*/ void lcdSetBlink (uint8_t value) { switch (value) fce: 88 23 and r24, r24 fd0: 31 f0 breq .+12 ; 0xfde fd2: 81 30 cpi r24, 0x01 ; 1 fd4: 49 f4 brne .+18 ; 0xfe8 { case ON: lcdTempReg |= 0x01; fd6: 80 91 43 04 lds r24, 0x0443 fda: 81 60 ori r24, 0x01 ; 1 fdc: 03 c0 rjmp .+6 ; 0xfe4 break; case OFF: lcdTempReg &= ~(0x01); fde: 80 91 43 04 lds r24, 0x0443 fe2: 8e 7f andi r24, 0xFE ; 254 fe4: 80 93 43 04 sts 0x0443, r24 break; } lcdWriteIns(0x08|lcdTempReg); fe8: 80 91 43 04 lds r24, 0x0443 fec: 88 60 ori r24, 0x08 ; 8 fee: 0e 94 9b 07 call 0xf36 ; 0xf36 ff2: 08 95 ret 00000ff4 : Return: - ------------------------------------------------------------------------------------------------*/ void lcdSetCursor (uint8_t value) { switch (value) ff4: 88 23 and r24, r24 ff6: 31 f0 breq .+12 ; 0x1004 ff8: 81 30 cpi r24, 0x01 ; 1 ffa: 49 f4 brne .+18 ; 0x100e { case ON: lcdTempReg |= 0x02; ffc: 80 91 43 04 lds r24, 0x0443 1000: 82 60 ori r24, 0x02 ; 2 1002: 03 c0 rjmp .+6 ; 0x100a break; case OFF: lcdTempReg &= ~(0x02); 1004: 80 91 43 04 lds r24, 0x0443 1008: 8d 7f andi r24, 0xFD ; 253 100a: 80 93 43 04 sts 0x0443, r24 break; } lcdWriteIns(0x08|lcdTempReg); 100e: 80 91 43 04 lds r24, 0x0443 1012: 88 60 ori r24, 0x08 ; 8 1014: 0e 94 9b 07 call 0xf36 ; 0xf36 1018: 08 95 ret 0000101a : Return: - ------------------------------------------------------------------------------------------------*/ void lcdSetDisplay (uint8_t value) { switch (value) 101a: 88 23 and r24, r24 101c: 31 f0 breq .+12 ; 0x102a 101e: 81 30 cpi r24, 0x01 ; 1 1020: 49 f4 brne .+18 ; 0x1034 { case ON: lcdTempReg |= 0x04; 1022: 80 91 43 04 lds r24, 0x0443 1026: 84 60 ori r24, 0x04 ; 4 1028: 03 c0 rjmp .+6 ; 0x1030 break; case OFF: lcdTempReg &= ~(0x04); 102a: 80 91 43 04 lds r24, 0x0443 102e: 8b 7f andi r24, 0xFB ; 251 1030: 80 93 43 04 sts 0x0443, r24 break; } lcdWriteIns(0x08|lcdTempReg); 1034: 80 91 43 04 lds r24, 0x0443 1038: 88 60 ori r24, 0x08 ; 8 103a: 0e 94 9b 07 call 0xf36 ; 0xf36 103e: 08 95 ret 00001040 : Input: cData Return: - ------------------------------------------------------------------------------------------------*/ void lcdWriteChar (uint8_t data) { 1040: 1f 93 push r17 1042: 18 2f mov r17, r24 spiSetLowSpeed(); 1044: 0e 94 f9 0a call 0x15f2 ; 0x15f2 spiSelectDeviceIO(LCD_CS); 1048: 80 e0 ldi r24, 0x00 ; 0 104a: 0e 94 fc 0a call 0x15f8 ; 0x15f8 LCD_PORT |= (1< 1056: 1f 91 pop r17 1058: 08 95 ret 0000105a : Input: *stringPointer (int[]) Return: - ------------------------------------------------------------------------------------------------*/ void lcdWriteStringP (const uint8_t *progmemStringPointer) { 105a: cf 93 push r28 105c: df 93 push r29 105e: ec 01 movw r28, r24 1060: 02 c0 rjmp .+4 ; 0x1066 register uint8_t c; while((c = pgm_read_byte(progmemStringPointer++))) { lcdWriteChar(c); 1062: 0e 94 20 08 call 0x1040 ; 0x1040 1066: fe 01 movw r30, r28 void lcdWriteStringP (const uint8_t *progmemStringPointer) { register uint8_t c; while((c = pgm_read_byte(progmemStringPointer++))) 1068: 21 96 adiw r28, 0x01 ; 1 106a: 84 91 lpm r24, Z 106c: 88 23 and r24, r24 106e: c9 f7 brne .-14 ; 0x1062 1070: df 91 pop r29 1072: cf 91 pop r28 1074: 08 95 ret 00001076 : Input: *stringPointer (int[]) Return: - ------------------------------------------------------------------------------------------------*/ void lcdWriteString (const uint8_t *stringPointer) { 1076: cf 93 push r28 1078: df 93 push r29 107a: ec 01 movw r28, r24 107c: 02 c0 rjmp .+4 ; 0x1082 register uint8_t c; while((c = *stringPointer++)) { lcdWriteChar(c); 107e: 0e 94 20 08 call 0x1040 ; 0x1040 void lcdWriteString (const uint8_t *stringPointer) { register uint8_t c; while((c = *stringPointer++)) 1082: 89 91 ld r24, Y+ 1084: 88 23 and r24, r24 1086: d9 f7 brne .-10 ; 0x107e 1088: df 91 pop r29 108a: cf 91 pop r28 108c: 08 95 ret 0000108e : Description: Writes hex to LCD Input: hexValue Output: - ----------------------------------------------------------------------------------------------------------*/ void lcdWriteHex(uint16_t hexValue) { 108e: cf 93 push r28 1090: df 93 push r29 1092: cd b7 in r28, 0x3d ; 61 1094: de b7 in r29, 0x3e ; 62 1096: 27 97 sbiw r28, 0x07 ; 7 1098: 0f b6 in r0, 0x3f ; 63 109a: f8 94 cli 109c: de bf out 0x3e, r29 ; 62 109e: 0f be out 0x3f, r0 ; 63 10a0: cd bf out 0x3d, r28 ; 61 10a2: bc 01 movw r22, r24 uint8_t tempString[7]; uint8_t n=0; uint8_t i; tempString[n] = '0'; 10a4: 80 e3 ldi r24, 0x30 ; 48 10a6: 89 83 std Y+1, r24 ; 0x01 n++; tempString[n] = 'x'; 10a8: 88 e7 ldi r24, 0x78 ; 120 10aa: 8a 83 std Y+2, r24 ; 0x02 10ac: fe 01 movw r30, r28 10ae: 33 96 adiw r30, 0x03 ; 3 10b0: 4c e0 ldi r20, 0x0C ; 12 10b2: 50 e0 ldi r21, 0x00 ; 0 10b4: 33 e0 ldi r19, 0x03 ; 3 n++; for(i=0;i<4;i++) { if(((hexValue>>(12-(i*4)))&0x000F)>0x0009) 10b6: cb 01 movw r24, r22 10b8: 04 2e mov r0, r20 10ba: 02 c0 rjmp .+4 ; 0x10c0 10bc: 96 95 lsr r25 10be: 87 95 ror r24 10c0: 0a 94 dec r0 10c2: e2 f7 brpl .-8 ; 0x10bc 10c4: 28 2f mov r18, r24 10c6: 2f 70 andi r18, 0x0F ; 15 10c8: 8f 70 andi r24, 0x0F ; 15 10ca: 90 70 andi r25, 0x00 ; 0 10cc: 0a 97 sbiw r24, 0x0a ; 10 10ce: 10 f0 brcs .+4 ; 0x10d4 { tempString[n] = (((hexValue>>(12-(i*4)))&0x000F)+0x37); 10d0: 29 5c subi r18, 0xC9 ; 201 10d2: 01 c0 rjmp .+2 ; 0x10d6 n++; } else { tempString[n] = (((hexValue>>(12-(i*4)))&0x000F)|0x30); 10d4: 20 63 ori r18, 0x30 ; 48 10d6: 20 83 st Z, r18 10d8: 44 50 subi r20, 0x04 ; 4 10da: 50 40 sbci r21, 0x00 ; 0 10dc: 3f 5f subi r19, 0xFF ; 255 10de: 31 96 adiw r30, 0x01 ; 1 tempString[n] = '0'; n++; tempString[n] = 'x'; n++; for(i=0;i<4;i++) 10e0: 37 30 cpi r19, 0x07 ; 7 10e2: 49 f7 brne .-46 ; 0x10b6 tempString[n] = (((hexValue>>(12-(i*4)))&0x000F)|0x30); n++; } } tempString[n] = '\0'; 10e4: 1f 82 std Y+7, r1 ; 0x07 lcdWriteString(tempString); 10e6: ce 01 movw r24, r28 10e8: 01 96 adiw r24, 0x01 ; 1 10ea: 0e 94 3b 08 call 0x1076 ; 0x1076 10ee: 27 96 adiw r28, 0x07 ; 7 10f0: 0f b6 in r0, 0x3f ; 63 10f2: f8 94 cli 10f4: de bf out 0x3e, r29 ; 62 10f6: 0f be out 0x3f, r0 ; 63 10f8: cd bf out 0x3d, r28 ; 61 10fa: df 91 pop r29 10fc: cf 91 pop r28 10fe: 08 95 ret 00001100 : Description: Writes hex value as decimal to LCD Input: sensorValue Output: - ----------------------------------------------------------------------------------------------------------*/ void lcdWriteHexAsDecimal(uint16_t hexValue) { 1100: 8f 92 push r8 1102: 9f 92 push r9 1104: af 92 push r10 1106: bf 92 push r11 1108: cf 92 push r12 110a: df 92 push r13 110c: ef 92 push r14 110e: ff 92 push r15 1110: 0f 93 push r16 1112: 1f 93 push r17 1114: cf 93 push r28 1116: df 93 push r29 1118: cd b7 in r28, 0x3d ; 61 111a: de b7 in r29, 0x3e ; 62 111c: 25 97 sbiw r28, 0x05 ; 5 111e: 0f b6 in r0, 0x3f ; 63 1120: f8 94 cli 1122: de bf out 0x3e, r29 ; 62 1124: 0f be out 0x3f, r0 ; 63 1126: cd bf out 0x3d, r28 ; 61 1128: 8c 01 movw r16, r24 uint8_t tempString[5]={" "}; 112a: de 01 movw r26, r28 112c: 11 96 adiw r26, 0x01 ; 1 112e: e8 e0 ldi r30, 0x08 ; 8 1130: f4 e0 ldi r31, 0x04 ; 4 1132: 85 e0 ldi r24, 0x05 ; 5 1134: 01 90 ld r0, Z+ 1136: 0d 92 st X+, r0 1138: 81 50 subi r24, 0x01 ; 1 113a: e1 f7 brne .-8 ; 0x1134 uint8_t secondDigit = 0; uint8_t thirdDigit = 0; uint8_t fourthDigit = 0; uint8_t fifthDigit = 0; firstDigit = (hexValue/10000); 113c: c8 01 movw r24, r16 113e: 60 e1 ldi r22, 0x10 ; 16 1140: 77 e2 ldi r23, 0x27 ; 39 1142: 0e 94 d3 0b call 0x17a6 ; 0x17a6 <__udivmodhi4> 1146: fb 01 movw r30, r22 1148: e6 2e mov r14, r22 secondDigit = ((hexValue-(firstDigit*10000))/1000); 114a: 26 2f mov r18, r22 114c: 33 27 eor r19, r19 114e: 80 e1 ldi r24, 0x10 ; 16 1150: 97 e2 ldi r25, 0x27 ; 39 1152: 28 9f mul r18, r24 1154: 60 01 movw r12, r0 1156: 29 9f mul r18, r25 1158: d0 0c add r13, r0 115a: 38 9f mul r19, r24 115c: d0 0c add r13, r0 115e: 11 24 eor r1, r1 1160: c8 01 movw r24, r16 1162: 8c 19 sub r24, r12 1164: 9d 09 sbc r25, r13 1166: 68 ee ldi r22, 0xE8 ; 232 1168: 73 e0 ldi r23, 0x03 ; 3 116a: 0e 94 d3 0b call 0x17a6 ; 0x17a6 <__udivmodhi4> 116e: f6 2e mov r15, r22 thirdDigit = ((hexValue-(firstDigit*10000+(secondDigit*1000)))/100); 1170: 26 2f mov r18, r22 1172: 33 27 eor r19, r19 1174: 88 ee ldi r24, 0xE8 ; 232 1176: 93 e0 ldi r25, 0x03 ; 3 1178: 28 9f mul r18, r24 117a: 40 01 movw r8, r0 117c: 29 9f mul r18, r25 117e: 90 0c add r9, r0 1180: 38 9f mul r19, r24 1182: 90 0c add r9, r0 1184: 11 24 eor r1, r1 1186: 94 01 movw r18, r8 1188: 2c 0d add r18, r12 118a: 3d 1d adc r19, r13 118c: c8 01 movw r24, r16 118e: 82 1b sub r24, r18 1190: 93 0b sbc r25, r19 1192: 64 e6 ldi r22, 0x64 ; 100 1194: 70 e0 ldi r23, 0x00 ; 0 1196: 0e 94 d3 0b call 0x17a6 ; 0x17a6 <__udivmodhi4> 119a: 46 2f mov r20, r22 fourthDigit = ((hexValue-(firstDigit*10000+(secondDigit*1000)+(thirdDigit*100)))/10); 119c: 84 e6 ldi r24, 0x64 ; 100 119e: 68 9f mul r22, r24 11a0: 50 01 movw r10, r0 11a2: 11 24 eor r1, r1 11a4: 2a 0d add r18, r10 11a6: 3b 1d adc r19, r11 11a8: c8 01 movw r24, r16 11aa: 82 1b sub r24, r18 11ac: 93 0b sbc r25, r19 11ae: 6a e0 ldi r22, 0x0A ; 10 11b0: 70 e0 ldi r23, 0x00 ; 0 11b2: 0e 94 d3 0b call 0x17a6 ; 0x17a6 <__udivmodhi4> fifthDigit = (hexValue-(firstDigit*10000+(secondDigit*1000)+(thirdDigit*100)+(fourthDigit*10))); uint8_t n = 0; if(firstDigit) 11b6: ee 23 and r30, r30 11b8: 11 f4 brne .+4 ; 0x11be 11ba: 30 e0 ldi r19, 0x00 ; 0 11bc: 04 c0 rjmp .+8 ; 0x11c6 { tempString[n] = (0x30|firstDigit); 11be: 8e 2f mov r24, r30 11c0: 80 63 ori r24, 0x30 ; 48 11c2: 89 83 std Y+1, r24 ; 0x01 11c4: 31 e0 ldi r19, 0x01 ; 1 n++; } if(secondDigit||firstDigit) 11c6: ff 20 and r15, r15 11c8: 11 f4 brne .+4 ; 0x11ce 11ca: ee 20 and r14, r14 11cc: 39 f0 breq .+14 ; 0x11dc { tempString[n] = (0x30|secondDigit); 11ce: fe 01 movw r30, r28 11d0: e3 0f add r30, r19 11d2: f1 1d adc r31, r1 11d4: 8f 2d mov r24, r15 11d6: 80 63 ori r24, 0x30 ; 48 11d8: 81 83 std Z+1, r24 ; 0x01 n++; 11da: 3f 5f subi r19, 0xFF ; 255 } if(thirdDigit||secondDigit||firstDigit) 11dc: 44 23 and r20, r20 11de: 21 f4 brne .+8 ; 0x11e8 11e0: ff 20 and r15, r15 11e2: 11 f4 brne .+4 ; 0x11e8 11e4: ee 20 and r14, r14 11e6: 39 f0 breq .+14 ; 0x11f6 { tempString[n] = (0x30|thirdDigit); 11e8: fe 01 movw r30, r28 11ea: e3 0f add r30, r19 11ec: f1 1d adc r31, r1 11ee: 84 2f mov r24, r20 11f0: 80 63 ori r24, 0x30 ; 48 11f2: 81 83 std Z+1, r24 ; 0x01 n++; 11f4: 3f 5f subi r19, 0xFF ; 255 } if(fourthDigit||thirdDigit||secondDigit||firstDigit) 11f6: 66 23 and r22, r22 11f8: 31 f4 brne .+12 ; 0x1206 11fa: 44 23 and r20, r20 11fc: 21 f4 brne .+8 ; 0x1206 11fe: ff 20 and r15, r15 1200: 11 f4 brne .+4 ; 0x1206 1202: ee 20 and r14, r14 1204: 39 f0 breq .+14 ; 0x1214 { tempString[n] = (0x30|fourthDigit); 1206: fe 01 movw r30, r28 1208: e3 0f add r30, r19 120a: f1 1d adc r31, r1 120c: 86 2f mov r24, r22 120e: 80 63 ori r24, 0x30 ; 48 1210: 81 83 std Z+1, r24 ; 0x01 n++; 1212: 3f 5f subi r19, 0xFF ; 255 } tempString[n] = (0x30|fifthDigit); 1214: ae 01 movw r20, r28 1216: 4f 5f subi r20, 0xFF ; 255 1218: 5f 4f sbci r21, 0xFF ; 255 121a: fa 01 movw r30, r20 121c: e3 0f add r30, r19 121e: f1 1d adc r31, r1 1220: 20 2f mov r18, r16 1222: 2c 19 sub r18, r12 1224: 28 19 sub r18, r8 1226: 2a 19 sub r18, r10 1228: 8a e0 ldi r24, 0x0A ; 10 122a: 68 9f mul r22, r24 122c: c0 01 movw r24, r0 122e: 11 24 eor r1, r1 1230: 28 1b sub r18, r24 1232: 20 63 ori r18, 0x30 ; 48 1234: 20 83 st Z, r18 n++; 1236: 23 2f mov r18, r19 1238: 04 c0 rjmp .+8 ; 0x1242 while(n<5) { tempString[n] = ' '; 123a: ae 0f add r26, r30 123c: bf 1f adc r27, r31 123e: 80 e2 ldi r24, 0x20 ; 32 1240: 8c 93 st X, r24 n++; 1242: 2f 5f subi r18, 0xFF ; 255 1244: da 01 movw r26, r20 1246: e2 2f mov r30, r18 1248: ff 27 eor r31, r31 n++; } tempString[n] = (0x30|fifthDigit); n++; while(n<5) 124a: 25 30 cpi r18, 0x05 ; 5 124c: b0 f3 brcs .-20 ; 0x123a { tempString[n] = ' '; n++; } tempString[n] = '\0'; 124e: e4 0f add r30, r20 1250: f5 1f adc r31, r21 1252: 10 82 st Z, r1 lcdWriteString(tempString); 1254: ca 01 movw r24, r20 1256: 0e 94 3b 08 call 0x1076 ; 0x1076 125a: 25 96 adiw r28, 0x05 ; 5 125c: 0f b6 in r0, 0x3f ; 63 125e: f8 94 cli 1260: de bf out 0x3e, r29 ; 62 1262: 0f be out 0x3f, r0 ; 63 1264: cd bf out 0x3d, r28 ; 61 1266: df 91 pop r29 1268: cf 91 pop r28 126a: 1f 91 pop r17 126c: 0f 91 pop r16 126e: ff 90 pop r15 1270: ef 90 pop r14 1272: df 90 pop r13 1274: cf 90 pop r12 1276: bf 90 pop r11 1278: af 90 pop r10 127a: 9f 90 pop r9 127c: 8f 90 pop r8 127e: 08 95 ret 00001280 : Output: - ------------------------------------------------------------------------------------------------*/ void lcdInit (void) { spiInit(); 1280: 0e 94 06 0b call 0x160c ; 0x160c //LCD I/O LCD_DDR |= (1< lcdWriteIns(0x50); // booster off, contrast C5, set C4 1296: 80 e5 ldi r24, 0x50 ; 80 1298: 0e 94 9b 07 call 0xf36 ; 0xf36 lcdWriteIns(0x6C); // set voltage follower and gain 129c: 8c e6 ldi r24, 0x6C ; 108 129e: 0e 94 9b 07 call 0xf36 ; 0xf36 lcdWriteIns(0x06); // cursor auto-increment right 12a2: 86 e0 ldi r24, 0x06 ; 6 12a4: 0e 94 9b 07 call 0xf36 ; 0xf36 lcdSetDisplay(ON); 12a8: 81 e0 ldi r24, 0x01 ; 1 12aa: 0e 94 0d 08 call 0x101a ; 0x101a lcdSetCursor(OFF); 12ae: 80 e0 ldi r24, 0x00 ; 0 12b0: 0e 94 fa 07 call 0xff4 ; 0xff4 lcdSetBlink(OFF); 12b4: 80 e0 ldi r24, 0x00 ; 0 12b6: 0e 94 e7 07 call 0xfce ; 0xfce lcdSetContrast(6); 12ba: 86 e0 ldi r24, 0x06 ; 6 12bc: 0e 94 ce 07 call 0xf9c ; 0xf9c lcdClearDisplay(); 12c0: 0e 94 df 07 call 0xfbe ; 0xfbe Return: - ------------------------------------------------------------------------------------------------*/ void lcdSetIntensity (uint8_t intensity) { OCR0 = intensity; 12c4: 11 be out 0x31, r1 ; 49 12c6: 08 95 ret 000012c8 : Input: - Return: pointer to rfIdTagBuffer ------------------------------------------------------------------------------------------------*/ uint8_t* rfIdGetTag( void ) { rfIdGotTag = 0; 12c8: 10 92 45 04 sts 0x0445, r1 //PORT_RFID |= (1<: Input: - Return: - ------------------------------------------------------------------------------------------------*/ void rfIdClearBuffer( void ) { rfIdByteCount = 0; 12d2: 10 92 44 04 sts 0x0444, r1 PORT_RFID &= ~(1<: Input: - Return: 1 if true, else 0 ------------------------------------------------------------------------------------------------*/ uint8_t rfIdGetTagPresent( void ) { 12da: 80 91 45 04 lds r24, 0x0445 return rfIdGotTag; } 12de: 99 27 eor r25, r25 12e0: 08 95 ret 000012e2 <__vector_19>: Description: UART(0) Receive Complete Interrupt Input: - Output: - ------------------------------------------------------------------------------------------------*/ SIGNAL (SIG_USART0_RECV){ 12e2: 1f 92 push r1 12e4: 0f 92 push r0 12e6: 0f b6 in r0, 0x3f ; 63 12e8: 0f 92 push r0 12ea: 11 24 eor r1, r1 12ec: 2f 93 push r18 12ee: 3f 93 push r19 12f0: 4f 93 push r20 12f2: 5f 93 push r21 12f4: 6f 93 push r22 12f6: 7f 93 push r23 12f8: 8f 93 push r24 12fa: 9f 93 push r25 12fc: af 93 push r26 12fe: bf 93 push r27 1300: ef 93 push r30 1302: ff 93 push r31 uint8_t data = usart0Receive(); 1304: 0e 94 30 0b call 0x1660 ; 0x1660 if (rfIdByteCount == 0) 1308: 90 91 44 04 lds r25, 0x0444 130c: 99 23 and r25, r25 130e: 31 f4 brne .+12 ; 0x131c <__vector_19+0x3a> { if (data == START_BYTE) 1310: 8a 30 cpi r24, 0x0A ; 10 1312: a9 f4 brne .+42 ; 0x133e <__vector_19+0x5c> { rfIdByteCount++; 1314: 81 e0 ldi r24, 0x01 ; 1 1316: 80 93 44 04 sts 0x0444, r24 131a: 11 c0 rjmp .+34 ; 0x133e <__vector_19+0x5c> } } else if (rfIdByteCount < 11) 131c: 9b 30 cpi r25, 0x0B ; 11 131e: 48 f4 brcc .+18 ; 0x1332 <__vector_19+0x50> { rfIdTagBuffer[rfIdByteCount - 1] = data; 1320: e9 2f mov r30, r25 1322: ff 27 eor r31, r31 1324: eb 5b subi r30, 0xBB ; 187 1326: fb 4f sbci r31, 0xFB ; 251 1328: 80 83 st Z, r24 rfIdByteCount++; 132a: 9f 5f subi r25, 0xFF ; 255 132c: 90 93 44 04 sts 0x0444, r25 1330: 06 c0 rjmp .+12 ; 0x133e <__vector_19+0x5c> } else if (rfIdByteCount == 11) 1332: 9b 30 cpi r25, 0x0B ; 11 1334: 21 f4 brne .+8 ; 0x133e <__vector_19+0x5c> { PORT_RFID |= (1<: Input: - Return: - ------------------------------------------------------------------------------------------------*/ void rfIdInit(void) { usart0Init(); 1360: 0e 94 3d 0b call 0x167a ; 0x167a usart0SetBaud(USART0_BAUD_RATE); 1364: 80 e6 ldi r24, 0x60 ; 96 1366: 99 e0 ldi r25, 0x09 ; 9 1368: 0e 94 10 0b call 0x1620 ; 0x1620 rfIdByteCount = 0; 136c: 10 92 44 04 sts 0x0444, r1 DDR_RFID |= (1<: Input: - Return: - ------------------------------------------------------------------------------------------------*/ void rfIdDisable(void) { usart0RxIntDisable(); 1376: 0e 94 3b 0b call 0x1676 ; 0x1676 PORT_RFID |= (1<: Input: - Return: - ------------------------------------------------------------------------------------------------*/ void rfIdEnable(void) { PORT_RFID &= ~(1< 1384: 08 95 ret 00001386 : uint8_t firstDigit = 0; uint8_t secondDigit = 0; uint8_t thirdDigit = 0; uint8_t fourthDigit = 0; uint8_t fifthDigit = 0; 1386: 80 91 0e 04 lds r24, 0x040E firstDigit = (hexValue/10000); 138a: 10 92 0e 04 sts 0x040E, r1 secondDigit = ((hexValue-(firstDigit*10000))/1000); thirdDigit = ((hexValue-(firstDigit*10000+(secondDigit*1000)))/100); 138e: 99 27 eor r25, r25 1390: 08 95 ret 00001392 : if(firstDigit) { tempString[n] = (0x30|firstDigit); n++; } 1392: bc 01 movw r22, r24 1394: 40 e0 ldi r20, 0x00 ; 0 1396: 50 e0 ldi r21, 0x00 ; 0 1398: 20 e0 ldi r18, 0x00 ; 0 139a: 30 e0 ldi r19, 0x00 ; 0 if(secondDigit||firstDigit) { tempString[n] = (0x30|secondDigit); n++; } if(thirdDigit||secondDigit||firstDigit) 139c: fb 01 movw r30, r22 139e: e2 0f add r30, r18 13a0: f3 1f adc r31, r19 13a2: 80 81 ld r24, Z 13a4: 48 0f add r20, r24 13a6: 51 1d adc r21, r1 13a8: 2f 5f subi r18, 0xFF ; 255 13aa: 3f 4f sbci r19, 0xFF ; 255 n++; } if(secondDigit||firstDigit) { tempString[n] = (0x30|secondDigit); n++; 13ac: 2c 30 cpi r18, 0x0C ; 12 13ae: 31 05 cpc r19, r1 13b0: a9 f7 brne .-22 ; 0x139c { tempString[n] = (0x30|thirdDigit); n++; } if(fourthDigit||thirdDigit||secondDigit||firstDigit) { 13b2: 84 2f mov r24, r20 13b4: 99 27 eor r25, r25 13b6: 08 95 ret 000013b8 : Input: data - char to correct Return: corrected char ------------------------------------------------------------------------------------------------*/ uint8_t lcdEngToSwe (uint8_t data) { 13b8: 1f 93 push r17 13ba: 10 91 62 04 lds r17, 0x0462 13be: 86 e5 ldi r24, 0x56 ; 86 13c0: 94 e0 ldi r25, 0x04 ; 4 13c2: 0e 94 c9 09 call 0x1392 ; 0x1392 13c6: 18 17 cp r17, r24 13c8: 51 f5 brne .+84 ; 0x141e switch(data) { 13ca: 80 91 57 04 lds r24, 0x0457 13ce: 99 27 eor r25, r25 13d0: 8f 70 andi r24, 0x0F ; 15 13d2: 90 70 andi r25, 0x00 ; 0 13d4: 89 2b or r24, r25 13d6: 19 f5 brne .+70 ; 0x141e case 'Ö': data=0x99; 13d8: 80 91 58 04 lds r24, 0x0458 13dc: 82 34 cpi r24, 0x42 ; 66 13de: b1 f0 breq .+44 ; 0x140c 13e0: 83 34 cpi r24, 0x43 ; 67 13e2: 28 f4 brcc .+10 ; 0x13ee 13e4: 80 32 cpi r24, 0x20 ; 32 13e6: 61 f0 breq .+24 ; 0x1400 13e8: 81 34 cpi r24, 0x41 ; 65 13ea: c9 f4 brne .+50 ; 0x141e 13ec: 0c c0 rjmp .+24 ; 0x1406 13ee: 84 34 cpi r24, 0x44 ; 68 13f0: 99 f0 breq .+38 ; 0x1418 13f2: 84 34 cpi r24, 0x44 ; 68 13f4: 70 f0 brcs .+28 ; 0x1412 13f6: 8a 3f cpi r24, 0xFA ; 250 13f8: 91 f4 brne .+36 ; 0x141e 13fa: 85 e0 ldi r24, 0x05 ; 5 13fc: 90 e0 ldi r25, 0x00 ; 0 13fe: 11 c0 rjmp .+34 ; 0x1422 1400: 81 e0 ldi r24, 0x01 ; 1 1402: 90 e0 ldi r25, 0x00 ; 0 1404: 0e c0 rjmp .+28 ; 0x1422 break; case 'ö': data=0x94; 1406: 82 e0 ldi r24, 0x02 ; 2 1408: 90 e0 ldi r25, 0x00 ; 0 140a: 0b c0 rjmp .+22 ; 0x1422 break; case 'Ä': 140c: 83 e0 ldi r24, 0x03 ; 3 140e: 90 e0 ldi r25, 0x00 ; 0 1410: 08 c0 rjmp .+16 ; 0x1422 data=0x8E; break; 1412: 84 e0 ldi r24, 0x04 ; 4 1414: 90 e0 ldi r25, 0x00 ; 0 1416: 05 c0 rjmp .+10 ; 0x1422 case 'ä': data=0x84; 1418: 86 e0 ldi r24, 0x06 ; 6 141a: 90 e0 ldi r25, 0x00 ; 0 141c: 02 c0 rjmp .+4 ; 0x1422 break; case 'Å': 141e: 80 e0 ldi r24, 0x00 ; 0 1420: 90 e0 ldi r25, 0x00 ; 0 1422: 1f 91 pop r17 1424: 08 95 ret 00001426 : Input: cIntensity Return: - ------------------------------------------------------------------------------------------------*/ void lcdSetIntensity (uint8_t intensity) { 1426: dc 01 movw r26, r24 1428: e1 e1 ldi r30, 0x11 ; 17 142a: f4 e0 ldi r31, 0x04 ; 4 OCR0 = intensity; } /*------------------------------------------------------------------------------------------------ lcdWriteChar 142c: 8d 91 ld r24, X+ 142e: 81 93 st Z+, r24 void lcdSetIntensity (uint8_t intensity) { OCR0 = intensity; } 1430: 84 e0 ldi r24, 0x04 ; 4 1432: eb 31 cpi r30, 0x1B ; 27 1434: f8 07 cpc r31, r24 1436: d1 f7 brne .-12 ; 0x142c /*------------------------------------------------------------------------------------------------ lcdWriteChar Description: Writes character data to LCD. 1438: cf 01 movw r24, r30 143a: 0c 97 sbiw r24, 0x0c ; 12 143c: 0e 94 c9 09 call 0x1392 ; 0x1392 1440: 80 93 1b 04 sts 0x041B, r24 Input: cData Return: - 1444: 81 e0 ldi r24, 0x01 ; 1 1446: 80 93 54 04 sts 0x0454, r24 144a: 08 95 ret 0000144c : spiSelectDeviceIO(LCD_CS); LCD_PORT |= (1<: Input: cData Return: - ------------------------------------------------------------------------------------------------*/ void lcdWriteIns (uint8_t data) { 1454: 10 92 52 04 sts 0x0452, r1 spiSetLowSpeed(); 1458: 81 e0 ldi r24, 0x01 ; 1 145a: 80 93 55 04 sts 0x0455, r24 145e: 08 95 ret 00001460 : Input: *stringPointer (int[]) Return: - ------------------------------------------------------------------------------------------------*/ void lcdWriteStringP (const uint8_t *progmemStringPointer) { 1460: 0e 94 7d 0b call 0x16fa ; 0x16fa 1464: 80 e8 ldi r24, 0x80 ; 128 1466: 95 e2 ldi r25, 0x25 ; 37 1468: 0e 94 4c 0b call 0x1698 ; 0x1698 register uint8_t c; 146c: 8c 9a sbi 0x11, 4 ; 17 while((c = pgm_read_byte(progmemStringPointer++))) 146e: 10 92 52 04 sts 0x0452, r1 { 1472: 81 e0 ldi r24, 0x01 ; 1 1474: 80 93 55 04 sts 0x0455, r24 lcdWriteChar(c); 1478: 10 92 54 04 sts 0x0454, r1 } 147c: 84 e0 ldi r24, 0x04 ; 4 147e: 80 93 0e 04 sts 0x040E, r24 1482: 08 95 ret 00001484 : register uint8_t c; while((c = *stringPointer++)) { lcdWriteChar(c); 1484: 0e 94 79 0b call 0x16f2 ; 0x16f2 1488: 08 95 ret 0000148a : } /*------------------------------------------------------------------------------------------------ lcdWriteString Description: Writes a string of characters to LCD. 148a: 0e 94 75 0b call 0x16ea ; 0x16ea 148e: 08 95 ret 00001490 : n++; while(n<5) { tempString[n] = ' '; n++; 1490: cf 93 push r28 1492: df 93 push r29 } tempString[n] = '\0'; 1494: 94 9a sbi 0x12, 4 ; 18 1496: 80 e4 ldi r24, 0x40 ; 64 1498: 9c e9 ldi r25, 0x9C ; 156 149a: fc 01 movw r30, r24 149c: 31 97 sbiw r30, 0x01 ; 1 149e: f1 f7 brne .-4 ; 0x149c 14a0: fc 01 movw r30, r24 14a2: 31 97 sbiw r30, 0x01 ; 1 14a4: f1 f7 brne .-4 ; 0x14a2 14a6: fc 01 movw r30, r24 14a8: 31 97 sbiw r30, 0x01 ; 1 14aa: f1 f7 brne .-4 ; 0x14a8 14ac: 01 97 sbiw r24, 0x01 ; 1 14ae: f1 f7 brne .-4 ; 0x14ac lcdWriteHex Description: Writes hex to LCD Input: hexValue Output: - ----------------------------------------------------------------------------------------------------------*/ 14b0: 80 e0 ldi r24, 0x00 ; 0 14b2: 0e 94 71 0b call 0x16e2 ; 0x16e2 void lcdWriteHex(uint16_t hexValue) 14b6: 80 e0 ldi r24, 0x00 ; 0 14b8: 0e 94 71 0b call 0x16e2 ; 0x16e2 { 14bc: 80 e0 ldi r24, 0x00 ; 0 14be: 0e 94 71 0b call 0x16e2 ; 0x16e2 uint8_t tempString[7]; uint8_t n=0; 14c2: 80 91 54 04 lds r24, 0x0454 14c6: 88 23 and r24, r24 14c8: 51 f0 breq .+20 ; 0x14de 14ca: cf e0 ldi r28, 0x0F ; 15 14cc: d4 e0 ldi r29, 0x04 ; 4 uint8_t i; tempString[n] = '0'; n++; tempString[n] = 'x'; 14ce: 89 91 ld r24, Y+ 14d0: 0e 94 71 0b call 0x16e2 ; 0x16e2 uint8_t tempString[7]; uint8_t n=0; uint8_t i; tempString[n] = '0'; 14d4: 84 e0 ldi r24, 0x04 ; 4 14d6: cc 31 cpi r28, 0x1C ; 28 14d8: d8 07 cpc r29, r24 14da: 51 f0 breq .+20 ; 0x14f0 14dc: f8 cf rjmp .-16 ; 0x14ce 14de: cc e1 ldi r28, 0x1C ; 28 14e0: d4 e0 ldi r29, 0x04 ; 4 for(i=0;i<4;i++) { if(((hexValue>>(12-(i*4)))&0x000F)>0x0009) { tempString[n] = (((hexValue>>(12-(i*4)))&0x000F)+0x37); 14e2: 89 91 ld r24, Y+ 14e4: 0e 94 71 0b call 0x16e2 ; 0x16e2 n++; for(i=0;i<4;i++) { if(((hexValue>>(12-(i*4)))&0x000F)>0x0009) 14e8: 84 e0 ldi r24, 0x04 ; 4 14ea: c9 32 cpi r28, 0x29 ; 41 14ec: d8 07 cpc r29, r24 14ee: c9 f7 brne .-14 ; 0x14e2 tempString[n] = (((hexValue>>(12-(i*4)))&0x000F)+0x37); n++; } else { tempString[n] = (((hexValue>>(12-(i*4)))&0x000F)|0x30); 14f0: 80 e0 ldi r24, 0x00 ; 0 14f2: 0e 94 71 0b call 0x16e2 ; 0x16e2 n++; 14f6: 80 e0 ldi r24, 0x00 ; 0 14f8: 0e 94 71 0b call 0x16e2 ; 0x16e2 } 14fc: 80 e0 ldi r24, 0x00 ; 0 14fe: 0e 94 71 0b call 0x16e2 ; 0x16e2 } 1502: 94 98 cbi 0x12, 4 ; 18 1504: 80 e8 ldi r24, 0x80 ; 128 1506: 9e e3 ldi r25, 0x3E ; 62 1508: 01 97 sbiw r24, 0x01 ; 1 150a: f1 f7 brne .-4 ; 0x1508 150c: df 91 pop r29 150e: cf 91 pop r28 1510: 08 95 ret 00001512 <__vector_20>: ------------------------------------------------------------------------------------------------*/ void lcdSetDisplay (uint8_t value) { switch (value) { 1512: 1f 92 push r1 1514: 0f 92 push r0 1516: 0f b6 in r0, 0x3f ; 63 1518: 0f 92 push r0 151a: 11 24 eor r1, r1 151c: 2f 93 push r18 151e: 3f 93 push r19 1520: 4f 93 push r20 1522: 5f 93 push r21 1524: 6f 93 push r22 1526: 7f 93 push r23 1528: 8f 93 push r24 152a: 9f 93 push r25 152c: af 93 push r26 152e: bf 93 push r27 1530: ef 93 push r30 1532: ff 93 push r31 case ON: 1534: 0e 94 6c 0b call 0x16d8 ; 0x16d8 lcdTempReg |= 0x04; break; 1538: 90 91 52 04 lds r25, 0x0452 153c: 99 23 and r25, r25 153e: 41 f4 brne .+16 ; 0x1550 <__vector_20+0x3e> case OFF: lcdTempReg &= ~(0x04); 1540: 8a 30 cpi r24, 0x0A ; 10 1542: 81 f4 brne .+32 ; 0x1564 <__vector_20+0x52> break; } 1544: 80 93 56 04 sts 0x0456, r24 1548: 81 e0 ldi r24, 0x01 ; 1 154a: 80 93 52 04 sts 0x0452, r24 154e: 0a c0 rjmp .+20 ; 0x1564 <__vector_20+0x52> lcdWriteIns(0x08|lcdTempReg); } 1550: 9d 30 cpi r25, 0x0D ; 13 1552: 40 f4 brcc .+16 ; 0x1564 <__vector_20+0x52> /*------------------------------------------------------------------------------------------------ lcdSetCursor 1554: e9 2f mov r30, r25 1556: ff 27 eor r31, r31 1558: ea 5a subi r30, 0xAA ; 170 155a: fb 4f sbci r31, 0xFB ; 251 155c: 80 83 st Z, r24 155e: 9f 5f subi r25, 0xFF ; 255 1560: 90 93 52 04 sts 0x0452, r25 Description: Switch cursor on/off on LCD. Value: ON or OFF 1564: 80 91 52 04 lds r24, 0x0452 1568: 8d 30 cpi r24, 0x0D ; 13 156a: 41 f5 brne .+80 ; 0x15bc <__vector_20+0xaa> Input: value Return: - 156c: 0e 94 42 0a call 0x1484 ; 0x1484 ------------------------------------------------------------------------------------------------*/ 1570: 78 94 sei void lcdSetCursor (uint8_t value) { 1572: 0e 94 dc 09 call 0x13b8 ; 0x13b8 1576: 80 93 53 04 sts 0x0453, r24 switch (value) 157a: 83 30 cpi r24, 0x03 ; 3 157c: a1 f0 breq .+40 ; 0x15a6 <__vector_20+0x94> 157e: 84 30 cpi r24, 0x04 ; 4 1580: 28 f4 brcc .+10 ; 0x158c <__vector_20+0x7a> 1582: 81 30 cpi r24, 0x01 ; 1 1584: 51 f0 breq .+20 ; 0x159a <__vector_20+0x88> 1586: 82 30 cpi r24, 0x02 ; 2 1588: a9 f4 brne .+42 ; 0x15b4 <__vector_20+0xa2> 158a: 0d c0 rjmp .+26 ; 0x15a6 <__vector_20+0x94> 158c: 85 30 cpi r24, 0x05 ; 5 158e: 71 f0 breq .+28 ; 0x15ac <__vector_20+0x9a> 1590: 85 30 cpi r24, 0x05 ; 5 1592: 40 f0 brcs .+16 ; 0x15a4 <__vector_20+0x92> 1594: 86 30 cpi r24, 0x06 ; 6 1596: 71 f4 brne .+28 ; 0x15b4 <__vector_20+0xa2> 1598: 06 c0 rjmp .+12 ; 0x15a6 <__vector_20+0x94> { case ON: lcdTempReg |= 0x02; 159a: 80 93 0e 04 sts 0x040E, r24 break; 159e: 0e 94 48 0a call 0x1490 ; 0x1490 15a2: 08 c0 rjmp .+16 ; 0x15b4 <__vector_20+0xa2> } /*------------------------------------------------------------------------------------------------ lcdSetBlink Description: Switch blink on/off on LCD. Value: ON or OFF 15a4: 84 e0 ldi r24, 0x04 ; 4 Input: value Return: - ------------------------------------------------------------------------------------------------*/ 15a6: 80 93 0e 04 sts 0x040E, r24 15aa: 04 c0 rjmp .+8 ; 0x15b4 <__vector_20+0xa2> void lcdSetBlink (uint8_t value) { switch (value) 15ac: 80 93 0e 04 sts 0x040E, r24 { 15b0: 10 92 54 04 sts 0x0454, r1 case ON: lcdTempReg |= 0x01; break; case OFF: 15b4: 10 92 52 04 sts 0x0452, r1 lcdTempReg &= ~(0x01); 15b8: 0e 94 45 0a call 0x148a ; 0x148a 15bc: ff 91 pop r31 15be: ef 91 pop r30 15c0: bf 91 pop r27 15c2: af 91 pop r26 15c4: 9f 91 pop r25 15c6: 8f 91 pop r24 15c8: 7f 91 pop r23 15ca: 6f 91 pop r22 15cc: 5f 91 pop r21 15ce: 4f 91 pop r20 15d0: 3f 91 pop r19 15d2: 2f 91 pop r18 15d4: 0f 90 pop r0 15d6: 0f be out 0x3f, r0 ; 63 15d8: 0f 90 pop r0 15da: 1f 90 pop r1 15dc: 18 95 reti 000015de : Input: sensorValue Output: - ----------------------------------------------------------------------------------------------------------*/ void lcdWriteHexAsDecimal(uint16_t hexValue) { uint8_t tempString[5]={" "}; 15de: 8f b9 out 0x0f, r24 ; 15 uint8_t firstDigit = 0; 15e0: 77 9b sbis 0x0e, 7 ; 14 15e2: fe cf rjmp .-4 ; 0x15e0 15e4: 08 95 ret 000015e6 : secondDigit = ((hexValue-(firstDigit*10000))/1000); thirdDigit = ((hexValue-(firstDigit*10000+(secondDigit*1000)))/100); fourthDigit = ((hexValue-(firstDigit*10000+(secondDigit*1000)+(thirdDigit*100)))/10); fifthDigit = (hexValue-(firstDigit*10000+(secondDigit*1000)+(thirdDigit*100)+(fourthDigit*10))); uint8_t n = 0; 15e6: 8f b1 in r24, 0x0f ; 15 15e8: 99 27 eor r25, r25 15ea: 08 95 ret 000015ec : if(secondDigit||firstDigit) { tempString[n] = (0x30|secondDigit); n++; } if(thirdDigit||secondDigit||firstDigit) 15ec: 68 98 cbi 0x0d, 0 ; 13 { 15ee: 69 98 cbi 0x0d, 1 ; 13 15f0: 08 95 ret 000015f2 : n++; } tempString[n] = (0x30|fifthDigit); n++; while(n<5) 15f2: 68 98 cbi 0x0d, 0 ; 13 { 15f4: 69 9a sbi 0x0d, 1 ; 13 15f6: 08 95 ret 000015f8 : } /*---------------------------------------------------------------------------------------------------------- lcdWriteHex Description: Writes hex to LCD Input: hexValue 15f8: 21 e0 ldi r18, 0x01 ; 1 15fa: 30 e0 ldi r19, 0x00 ; 0 15fc: 02 c0 rjmp .+4 ; 0x1602 15fe: 22 0f add r18, r18 1600: 33 1f adc r19, r19 1602: 8a 95 dec r24 1604: e2 f7 brpl .-8 ; 0x15fe 1606: 20 95 com r18 1608: 2b bb out 0x1b, r18 ; 27 160a: 08 95 ret 0000160c : uint8_t i; tempString[n] = '0'; n++; tempString[n] = 'x'; n++; 160c: 87 b3 in r24, 0x17 ; 23 160e: 80 6b ori r24, 0xB0 ; 176 1610: 87 bb out 0x17, r24 ; 23 1612: c6 9a sbi 0x18, 6 ; 24 for(i=0;i<4;i++) { 1614: d0 9a sbi 0x1a, 0 ; 26 1616: d8 9a sbi 0x1b, 0 ; 27 if(((hexValue>>(12-(i*4)))&0x000F)>0x0009) { 1618: 8d b1 in r24, 0x0d ; 13 161a: 81 65 ori r24, 0x51 ; 81 161c: 8d b9 out 0x0d, r24 ; 13 161e: 08 95 ret 00001620 : ================================================================================================*/ /*---------------------------------------------------------------------------------------------------------- lcdWriteHexAsDecimal Description: Writes hex value as decimal to LCD Input: sensorValue 1620: 9c 01 movw r18, r24 1622: 94 e0 ldi r25, 0x04 ; 4 1624: 22 0f add r18, r18 1626: 33 1f adc r19, r19 1628: 9a 95 dec r25 162a: e1 f7 brne .-8 ; 0x1624 162c: 44 27 eor r20, r20 162e: 55 27 eor r21, r21 1630: 60 e0 ldi r22, 0x00 ; 0 1632: 74 e2 ldi r23, 0x24 ; 36 1634: 84 ef ldi r24, 0xF4 ; 244 1636: 90 e0 ldi r25, 0x00 ; 0 1638: 0e 94 09 0c call 0x1812 ; 0x1812 <__divmodsi4> 163c: 21 50 subi r18, 0x01 ; 1 163e: 30 40 sbci r19, 0x00 ; 0 1640: 40 40 sbci r20, 0x00 ; 0 1642: 50 40 sbci r21, 0x00 ; 0 1644: bb 27 eor r27, r27 1646: 57 fd sbrc r21, 7 1648: ba 95 dec r27 164a: a5 2f mov r26, r21 164c: 94 2f mov r25, r20 164e: 83 2f mov r24, r19 1650: 2f 5f subi r18, 0xFF ; 255 1652: 3f 4f sbci r19, 0xFF ; 255 1654: 4f 4f sbci r20, 0xFF ; 255 1656: 5f 4f sbci r21, 0xFF ; 255 1658: 80 bd out 0x20, r24 ; 32 Output: - 165a: 21 50 subi r18, 0x01 ; 1 165c: 29 b9 out 0x09, r18 ; 9 165e: 08 95 ret 00001660 : uint8_t fourthDigit = 0; uint8_t fifthDigit = 0; firstDigit = (hexValue/10000); secondDigit = ((hexValue-(firstDigit*10000))/1000); thirdDigit = ((hexValue-(firstDigit*10000+(secondDigit*1000)))/100); 1660: 5f 9b sbis 0x0b, 7 ; 11 1662: fe cf rjmp .-4 ; 0x1660 fourthDigit = ((hexValue-(firstDigit*10000+(secondDigit*1000)+(thirdDigit*100)))/10); fifthDigit = (hexValue-(firstDigit*10000+(secondDigit*1000)+(thirdDigit*100)+(fourthDigit*10))); 1664: 8c b1 in r24, 0x0c ; 12 1666: 99 27 eor r25, r25 1668: 08 95 ret 0000166a : } if(secondDigit||firstDigit) { tempString[n] = (0x30|secondDigit); n++; } 166a: 5d 9b sbis 0x0b, 5 ; 11 166c: fe cf rjmp .-4 ; 0x166a if(thirdDigit||secondDigit||firstDigit) { 166e: 8c b9 out 0x0c, r24 ; 12 1670: 08 95 ret 00001672 : Input: hexValue Output: - ----------------------------------------------------------------------------------------------------------*/ void lcdWriteHex(uint16_t hexValue) { uint8_t tempString[7]; 1672: 57 9a sbi 0x0a, 7 ; 10 1674: 08 95 ret 00001676 : n++; for(i=0;i<4;i++) { if(((hexValue>>(12-(i*4)))&0x000F)>0x0009) 1676: 57 98 cbi 0x0a, 7 ; 10 1678: 08 95 ret 0000167a : } } tempString[n] = '\0'; lcdWriteString(tempString); 167a: 89 9a sbi 0x11, 1 ; 17 } 167c: 8a b1 in r24, 0x0a ; 10 167e: 88 69 ori r24, 0x98 ; 152 1680: 8a b9 out 0x0a, r24 ; 10 1682: 08 95 ret 00001684 : tempString[n] = (0x30|fourthDigit); n++; } tempString[n] = (0x30|fifthDigit); n++; 1684: fc 01 movw r30, r24 1686: 04 c0 rjmp .+8 ; 0x1690 } if(secondDigit||firstDigit) { tempString[n] = (0x30|secondDigit); n++; } 1688: 5d 9b sbis 0x0b, 5 ; 11 168a: fe cf rjmp .-4 ; 0x1688 if(thirdDigit||secondDigit||firstDigit) { 168c: 8c b9 out 0x0c, r24 ; 12 while(n<5) { tempString[n] = ' '; n++; } 168e: 31 96 adiw r30, 0x01 ; 1 } tempString[n] = (0x30|fifthDigit); n++; while(n<5) { 1690: 80 81 ld r24, Z 1692: 88 23 and r24, r24 1694: c9 f7 brne .-14 ; 0x1688 1696: 08 95 ret 00001698 : static uint8_t lcdTempReg; /*================================================================================================ Functions ================================================================================================*/ /*---------------------------------------------------------------------------------------------------------- lcdWriteHexAsDecimal 1698: 9c 01 movw r18, r24 169a: 94 e0 ldi r25, 0x04 ; 4 169c: 22 0f add r18, r18 169e: 33 1f adc r19, r19 16a0: 9a 95 dec r25 16a2: e1 f7 brne .-8 ; 0x169c 16a4: 44 27 eor r20, r20 16a6: 55 27 eor r21, r21 16a8: 60 e0 ldi r22, 0x00 ; 0 16aa: 74 e2 ldi r23, 0x24 ; 36 16ac: 84 ef ldi r24, 0xF4 ; 244 16ae: 90 e0 ldi r25, 0x00 ; 0 16b0: 0e 94 09 0c call 0x1812 ; 0x1812 <__divmodsi4> 16b4: 21 50 subi r18, 0x01 ; 1 16b6: 30 40 sbci r19, 0x00 ; 0 16b8: 40 40 sbci r20, 0x00 ; 0 16ba: 50 40 sbci r21, 0x00 ; 0 16bc: bb 27 eor r27, r27 16be: 57 fd sbrc r21, 7 16c0: ba 95 dec r27 16c2: a5 2f mov r26, r21 16c4: 94 2f mov r25, r20 16c6: 83 2f mov r24, r19 16c8: 2f 5f subi r18, 0xFF ; 255 16ca: 3f 4f sbci r19, 0xFF ; 255 16cc: 4f 4f sbci r20, 0xFF ; 255 16ce: 5f 4f sbci r21, 0xFF ; 255 16d0: 8c bf out 0x3c, r24 ; 60 16d2: 21 50 subi r18, 0x01 ; 1 16d4: 20 b9 out 0x00, r18 ; 0 16d6: 08 95 ret 000016d8 : uint8_t firstDigit = 0; uint8_t secondDigit = 0; uint8_t thirdDigit = 0; uint8_t fourthDigit = 0; uint8_t fifthDigit = 0; 16d8: 17 9b sbis 0x02, 7 ; 2 16da: fe cf rjmp .-4 ; 0x16d8 firstDigit = (hexValue/10000); secondDigit = ((hexValue-(firstDigit*10000))/1000); 16dc: 83 b1 in r24, 0x03 ; 3 thirdDigit = ((hexValue-(firstDigit*10000+(secondDigit*1000)))/100); 16de: 99 27 eor r25, r25 16e0: 08 95 ret 000016e2 : { tempString[n] = (0x30|firstDigit); n++; } if(secondDigit||firstDigit) { 16e2: 15 9b sbis 0x02, 5 ; 2 16e4: fe cf rjmp .-4 ; 0x16e2 tempString[n] = (0x30|secondDigit); n++; 16e6: 83 b9 out 0x03, r24 ; 3 16e8: 08 95 ret 000016ea : Description: Writes hex to LCD Input: hexValue Output: - ----------------------------------------------------------------------------------------------------------*/ void lcdWriteHex(uint16_t hexValue) 16ea: 81 b1 in r24, 0x01 ; 1 16ec: 80 69 ori r24, 0x90 ; 144 16ee: 81 b9 out 0x01, r24 ; 1 16f0: 08 95 ret 000016f2 : n++; tempString[n] = 'x'; n++; for(i=0;i<4;i++) { 16f2: 81 b1 in r24, 0x01 ; 1 16f4: 8f 76 andi r24, 0x6F ; 111 16f6: 81 b9 out 0x01, r24 ; 1 16f8: 08 95 ret 000016fa : tempString[n] = (((hexValue>>(12-(i*4)))&0x000F)|0x30); n++; } } tempString[n] = '\0'; 16fa: bb 9a sbi 0x17, 3 ; 23 16fc: 81 b1 in r24, 0x01 ; 1 16fe: 88 69 ori r24, 0x98 ; 152 1700: 81 b9 out 0x01, r24 ; 1 1702: 08 95 ret 00001704 : } if(fourthDigit||thirdDigit||secondDigit||firstDigit) { tempString[n] = (0x30|fourthDigit); n++; } 1704: fc 01 movw r30, r24 1706: 04 c0 rjmp .+8 ; 0x1710 { tempString[n] = (0x30|firstDigit); n++; } if(secondDigit||firstDigit) { 1708: 15 9b sbis 0x02, 5 ; 2 170a: fe cf rjmp .-4 ; 0x1708 tempString[n] = (0x30|secondDigit); n++; 170c: 83 b9 out 0x03, r24 ; 3 } tempString[n] = (0x30|fifthDigit); n++; while(n<5) { 170e: 31 96 adiw r30, 0x01 ; 1 { tempString[n] = (0x30|fourthDigit); n++; } tempString[n] = (0x30|fifthDigit); n++; 1710: 80 81 ld r24, Z 1712: 88 23 and r24, r24 1714: c9 f7 brne .-14 ; 0x1708 1716: 08 95 ret 00001718 : Description: Gets pointer current TAG id Input: - Return: pointer to rfIdTagBuffer ------------------------------------------------------------------------------------------------*/ 1718: f8 94 cli uint8_t* rfIdGetTag( void ) { 171a: 80 91 64 04 lds r24, 0x0464 171e: 88 23 and r24, r24 1720: 69 f4 brne .+26 ; 0x173c rfIdGotTag = 0; //PORT_RFID |= (1< /*------------------------------------------------------------------------------------------------ rfIDClearBuffer Description: Clearing current TAG-buffer 172c: 92 98 cbi 0x12, 2 ; 18 172e: 8a 98 cbi 0x11, 2 ; 17 Input: - Return: - 1730: 85 b7 in r24, 0x35 ; 53 1732: 83 60 ori r24, 0x03 ; 3 1734: 85 bf out 0x35, r24 ; 53 ------------------------------------------------------------------------------------------------*/ 1736: 8b b7 in r24, 0x3b ; 59 1738: 80 64 ori r24, 0x40 ; 64 173a: 8b bf out 0x3b, r24 ; 59 void rfIdClearBuffer( void ) { rfIdByteCount = 0; 173c: 78 94 sei 173e: 08 95 ret 00001740 : Description: Returns if a TAG has been transfered to the TAG-buffer Input: - Return: 1 if true, else 0 ------------------------------------------------------------------------------------------------*/ uint8_t rfIdGetTagPresent( void ) 1740: 10 92 64 04 sts 0x0464, r1 { 1744: 80 91 88 00 lds r24, 0x0088 1748: 90 91 89 00 lds r25, 0x0089 174c: 08 95 ret 0000174e : Description: Enable incoming data Input: - Return: - ------------------------------------------------------------------------------------------------*/ 174e: 80 91 64 04 lds r24, 0x0464 void rfIdEnable(void) { 1752: 99 27 eor r25, r25 1754: 08 95 ret 00001756 : /*------------------------------------------------------------------------------------------------ rfIdDisable Description: Disable incoming data Input: - 1756: 08 95 ret 00001758 <__vector_1>: rfIdInit Description: Initialize components Input: - Return: - 1758: 1f 92 push r1 175a: 0f 92 push r0 175c: 0f b6 in r0, 0x3f ; 63 175e: 0f 92 push r0 1760: 11 24 eor r1, r1 1762: 8f 93 push r24 ------------------------------------------------------------------------------------------------*/ 1764: 05 b6 in r0, 0x35 ; 53 1766: 00 fe sbrs r0, 0 1768: 0d c0 rjmp .+26 ; 0x1784 <__vector_1+0x2c> void rfIdInit(void) { 176a: 10 92 89 00 sts 0x0089, r1 usart0Init(); 176e: 10 92 88 00 sts 0x0088, r1 usart0SetBaud(USART0_BAUD_RATE); rfIdByteCount = 0; 1772: 85 b7 in r24, 0x35 ; 53 1774: 8e 7f andi r24, 0xFE ; 254 1776: 85 bf out 0x35, r24 ; 53 1778: 80 91 8a 00 lds r24, 0x008A 177c: 82 60 ori r24, 0x02 ; 2 177e: 80 93 8a 00 sts 0x008A, r24 1782: 0b c0 rjmp .+22 ; 0x179a <__vector_1+0x42> DDR_RFID |= (1<: 17a6: aa 1b sub r26, r26 17a8: bb 1b sub r27, r27 17aa: 51 e1 ldi r21, 0x11 ; 17 17ac: 07 c0 rjmp .+14 ; 0x17bc <__udivmodhi4_ep> 000017ae <__udivmodhi4_loop>: 17ae: aa 1f adc r26, r26 17b0: bb 1f adc r27, r27 17b2: a6 17 cp r26, r22 17b4: b7 07 cpc r27, r23 17b6: 10 f0 brcs .+4 ; 0x17bc <__udivmodhi4_ep> 17b8: a6 1b sub r26, r22 17ba: b7 0b sbc r27, r23 000017bc <__udivmodhi4_ep>: 17bc: 88 1f adc r24, r24 17be: 99 1f adc r25, r25 17c0: 5a 95 dec r21 17c2: a9 f7 brne .-22 ; 0x17ae <__udivmodhi4_loop> 17c4: 80 95 com r24 17c6: 90 95 com r25 17c8: bc 01 movw r22, r24 17ca: cd 01 movw r24, r26 17cc: 08 95 ret 000017ce <__udivmodsi4>: 17ce: a1 e2 ldi r26, 0x21 ; 33 17d0: 1a 2e mov r1, r26 17d2: aa 1b sub r26, r26 17d4: bb 1b sub r27, r27 17d6: fd 01 movw r30, r26 17d8: 0d c0 rjmp .+26 ; 0x17f4 <__udivmodsi4_ep> 000017da <__udivmodsi4_loop>: 17da: aa 1f adc r26, r26 17dc: bb 1f adc r27, r27 17de: ee 1f adc r30, r30 17e0: ff 1f adc r31, r31 17e2: a2 17 cp r26, r18 17e4: b3 07 cpc r27, r19 17e6: e4 07 cpc r30, r20 17e8: f5 07 cpc r31, r21 17ea: 20 f0 brcs .+8 ; 0x17f4 <__udivmodsi4_ep> 17ec: a2 1b sub r26, r18 17ee: b3 0b sbc r27, r19 17f0: e4 0b sbc r30, r20 17f2: f5 0b sbc r31, r21 000017f4 <__udivmodsi4_ep>: 17f4: 66 1f adc r22, r22 17f6: 77 1f adc r23, r23 17f8: 88 1f adc r24, r24 17fa: 99 1f adc r25, r25 17fc: 1a 94 dec r1 17fe: 69 f7 brne .-38 ; 0x17da <__udivmodsi4_loop> 1800: 60 95 com r22 1802: 70 95 com r23 1804: 80 95 com r24 1806: 90 95 com r25 1808: 9b 01 movw r18, r22 180a: ac 01 movw r20, r24 180c: bd 01 movw r22, r26 180e: cf 01 movw r24, r30 1810: 08 95 ret 00001812 <__divmodsi4>: 1812: 97 fb bst r25, 7 1814: 09 2e mov r0, r25 1816: 05 26 eor r0, r21 1818: 0e d0 rcall .+28 ; 0x1836 <__divmodsi4_neg1> 181a: 57 fd sbrc r21, 7 181c: 04 d0 rcall .+8 ; 0x1826 <__divmodsi4_neg2> 181e: d7 df rcall .-82 ; 0x17ce <__udivmodsi4> 1820: 0a d0 rcall .+20 ; 0x1836 <__divmodsi4_neg1> 1822: 00 1c adc r0, r0 1824: 38 f4 brcc .+14 ; 0x1834 <__divmodsi4_exit> 00001826 <__divmodsi4_neg2>: 1826: 50 95 com r21 1828: 40 95 com r20 182a: 30 95 com r19 182c: 21 95 neg r18 182e: 3f 4f sbci r19, 0xFF ; 255 1830: 4f 4f sbci r20, 0xFF ; 255 1832: 5f 4f sbci r21, 0xFF ; 255 00001834 <__divmodsi4_exit>: 1834: 08 95 ret 00001836 <__divmodsi4_neg1>: 1836: f6 f7 brtc .-4 ; 0x1834 <__divmodsi4_exit> 1838: 90 95 com r25 183a: 80 95 com r24 183c: 70 95 com r23 183e: 61 95 neg r22 1840: 7f 4f sbci r23, 0xFF ; 255 1842: 8f 4f sbci r24, 0xFF ; 255 1844: 9f 4f sbci r25, 0xFF ; 255 1846: 08 95 ret 00001848 <_exit>: 1848: ff cf rjmp .-2 ; 0x1848 <_exit>