RadioTest_ATMEL_RECEIVER.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .data 00000148 00800200 0000118e 00001222 2**0 CONTENTS, ALLOC, LOAD, DATA 1 .text 0000118e 00000000 00000000 00000094 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE 2 .bss 0000009f 00800348 00800348 0000136a 2**0 ALLOC 3 .debug_aranges 00000080 00000000 00000000 0000136a 2**0 CONTENTS, READONLY, DEBUGGING 4 .debug_pubnames 0000083d 00000000 00000000 000013ea 2**0 CONTENTS, READONLY, DEBUGGING 5 .debug_info 00001f2e 00000000 00000000 00001c27 2**0 CONTENTS, READONLY, DEBUGGING 6 .debug_abbrev 00000665 00000000 00000000 00003b55 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_line 00001522 00000000 00000000 000041ba 2**0 CONTENTS, READONLY, DEBUGGING 8 .debug_frame 00000520 00000000 00000000 000056dc 2**2 CONTENTS, READONLY, DEBUGGING 9 .debug_str 00000b78 00000000 00000000 00005bfc 2**0 CONTENTS, READONLY, DEBUGGING 10 .debug_loc 0000123f 00000000 00000000 00006774 2**0 CONTENTS, READONLY, DEBUGGING 11 .debug_ranges 00000060 00000000 00000000 000079b3 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 00000000 <__vectors>: 0: 0c 94 90 00 jmp 0x120 ; 0x120 <__ctors_end> 4: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 8: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> c: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 10: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 14: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 18: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 1c: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 20: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 24: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 28: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 2c: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 30: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 34: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 38: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 3c: 0c 94 70 01 jmp 0x2e0 ; 0x2e0 <__vector_15> 40: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 44: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 48: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 4c: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 50: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 54: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 58: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 5c: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 60: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 64: 0c 94 63 05 jmp 0xac6 ; 0xac6 <__vector_25> 68: 0c 94 93 05 jmp 0xb26 ; 0xb26 <__vector_26> 6c: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 70: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 74: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 78: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 7c: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 80: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 84: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 88: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 8c: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 90: 0c 94 33 06 jmp 0xc66 ; 0xc66 <__vector_36> 94: 0c 94 63 06 jmp 0xcc6 ; 0xcc6 <__vector_37> 98: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 9c: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> a0: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> a4: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> a8: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> ac: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> b0: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> b4: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> b8: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> bc: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> c0: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> c4: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> c8: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> cc: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> d0: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> d4: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> d8: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> dc: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> e0: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> e4: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> e8: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> ec: 0c 94 7f 01 jmp 0x2fe ; 0x2fe <__vector_59> f0: 0c 94 89 01 jmp 0x312 ; 0x312 <__vector_60> f4: 0c 94 a5 01 jmp 0x34a ; 0x34a <__vector_61> f8: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> fc: 0c 94 64 03 jmp 0x6c8 ; 0x6c8 <__vector_63> 100: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 104: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 108: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 10c: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 110: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 114: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 118: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 11c: 0c 94 af 00 jmp 0x15e ; 0x15e <__bad_interrupt> 00000120 <__ctors_end>: 120: 11 24 eor r1, r1 122: 1f be out 0x3f, r1 ; 63 124: cf ef ldi r28, 0xFF ; 255 126: d1 e4 ldi r29, 0x41 ; 65 128: de bf out 0x3e, r29 ; 62 12a: cd bf out 0x3d, r28 ; 61 0000012c <__do_copy_data>: 12c: 13 e0 ldi r17, 0x03 ; 3 12e: a0 e0 ldi r26, 0x00 ; 0 130: b2 e0 ldi r27, 0x02 ; 2 132: ee e8 ldi r30, 0x8E ; 142 134: f1 e1 ldi r31, 0x11 ; 17 136: 00 e0 ldi r16, 0x00 ; 0 138: 0b bf out 0x3b, r16 ; 59 13a: 02 c0 rjmp .+4 ; 0x140 <__do_copy_data+0x14> 13c: 07 90 elpm r0, Z+ 13e: 0d 92 st X+, r0 140: a8 34 cpi r26, 0x48 ; 72 142: b1 07 cpc r27, r17 144: d9 f7 brne .-10 ; 0x13c <__do_copy_data+0x10> 00000146 <__do_clear_bss>: 146: 13 e0 ldi r17, 0x03 ; 3 148: a8 e4 ldi r26, 0x48 ; 72 14a: b3 e0 ldi r27, 0x03 ; 3 14c: 01 c0 rjmp .+2 ; 0x150 <.do_clear_bss_start> 0000014e <.do_clear_bss_loop>: 14e: 1d 92 st X+, r1 00000150 <.do_clear_bss_start>: 150: a7 3e cpi r26, 0xE7 ; 231 152: b1 07 cpc r27, r17 154: e1 f7 brne .-8 ; 0x14e <.do_clear_bss_loop> 156: 0e 94 bb 02 call 0x576 ; 0x576
15a: 0c 94 c5 08 jmp 0x118a ; 0x118a <_exit> 0000015e <__bad_interrupt>: 15e: 0c 94 00 00 jmp 0 ; 0x0 <__vectors> 00000162 : * \brief Main function for low power and energy saving tests * \ingroup TestFunctions */ void transceiver_reset(void) { // @TODO include code here; } 162: 08 95 ret 00000164 : void transceiver_set_channel(uint8_t new_channel){ PHY_CC_CCA = new_channel; 164: 80 93 48 01 sts 0x0148, r24 } 168: 08 95 ret 0000016a : void transceiver_set_tx_power(uint8_t new_power){ PHY_TX_PWR &= ~((1 << TX_PWR3)|(1 << TX_PWR2)|(1 << TX_PWR1)|(1 << TX_PWR0)); 16a: e5 e4 ldi r30, 0x45 ; 69 16c: f1 e0 ldi r31, 0x01 ; 1 16e: 90 81 ld r25, Z 170: 90 7f andi r25, 0xF0 ; 240 172: 90 83 st Z, r25 PHY_TX_PWR |= ( new_power & ((1 << TX_PWR3)|(1 << TX_PWR2)|(1 << TX_PWR1)|(1 << TX_PWR0))); 174: 90 81 ld r25, Z 176: 8f 70 andi r24, 0x0F ; 15 178: 89 2b or r24, r25 17a: 80 83 st Z, r24 } 17c: 08 95 ret 0000017e : void transceiver_set_addr_short(uint16_t short_addr) { SHORT_ADDR_0 = (uint8_t) short_addr; 17e: 80 93 60 01 sts 0x0160, r24 SHORT_ADDR_1 = (uint8_t) (short_addr >> 8); 182: 90 93 61 01 sts 0x0161, r25 } 186: 08 95 ret 00000188 : void transceiver_set_addr_ieee(uint64_t ieee_address) { 188: 9f 92 push r9 18a: af 92 push r10 18c: bf 92 push r11 18e: cf 92 push r12 190: df 92 push r13 192: ef 92 push r14 194: ff 92 push r15 196: 0f 93 push r16 198: 1f 93 push r17 19a: cf 93 push r28 19c: df 93 push r29 19e: 92 2e mov r9, r18 1a0: a3 2e mov r10, r19 1a2: b4 2e mov r11, r20 1a4: c5 2e mov r12, r21 1a6: d6 2e mov r13, r22 1a8: e7 2e mov r14, r23 1aa: f8 2e mov r15, r24 1ac: 19 2f mov r17, r25 1ae: c0 e0 ldi r28, 0x00 ; 0 1b0: d0 e0 ldi r29, 0x00 ; 0 for (int var = 0; var < 8; ++var) { *(&IEEE_ADDR_0 + var) = (uint8_t) (ieee_address >> var); 1b2: 29 2d mov r18, r9 1b4: 3a 2d mov r19, r10 1b6: 4b 2d mov r20, r11 1b8: 5c 2d mov r21, r12 1ba: 6d 2d mov r22, r13 1bc: 7e 2d mov r23, r14 1be: 8f 2d mov r24, r15 1c0: 91 2f mov r25, r17 1c2: 0c 2f mov r16, r28 1c4: 0e 94 01 08 call 0x1002 ; 0x1002 <__lshrdi3> void transceiver_set_addr_short(uint16_t short_addr) { SHORT_ADDR_0 = (uint8_t) short_addr; SHORT_ADDR_1 = (uint8_t) (short_addr >> 8); } void transceiver_set_addr_ieee(uint64_t ieee_address) { 1c8: cc 59 subi r28, 0x9C ; 156 1ca: de 4f sbci r29, 0xFE ; 254 for (int var = 0; var < 8; ++var) { *(&IEEE_ADDR_0 + var) = (uint8_t) (ieee_address >> var); 1cc: 28 83 st Y, r18 SHORT_ADDR_0 = (uint8_t) short_addr; SHORT_ADDR_1 = (uint8_t) (short_addr >> 8); } void transceiver_set_addr_ieee(uint64_t ieee_address) { for (int var = 0; var < 8; ++var) { 1ce: c3 56 subi r28, 0x63 ; 99 1d0: d1 40 sbci r29, 0x01 ; 1 1d2: c8 30 cpi r28, 0x08 ; 8 1d4: d1 05 cpc r29, r1 1d6: 69 f7 brne .-38 ; 0x1b2 *(&IEEE_ADDR_0 + var) = (uint8_t) (ieee_address >> var); } } 1d8: df 91 pop r29 1da: cf 91 pop r28 1dc: 1f 91 pop r17 1de: 0f 91 pop r16 1e0: ff 90 pop r15 1e2: ef 90 pop r14 1e4: df 90 pop r13 1e6: cf 90 pop r12 1e8: bf 90 pop r11 1ea: af 90 pop r10 1ec: 9f 90 pop r9 1ee: 08 95 ret 000001f0 : void transceiver_set_panID(uint16_t panID) { PAN_ID_0 = (uint8_t) panID; 1f0: 80 93 62 01 sts 0x0162, r24 PAN_ID_1 = (uint8_t) (panID >> 8); 1f4: 90 93 63 01 sts 0x0163, r25 } 1f8: 08 95 ret 000001fa : int transceiver_start_pll(void) { uint8_t state = (uint8_t) (TRX_STATUS & ((1 << TRX_STATUS4) | (1 << TRX_STATUS3) | (1 << TRX_STATUS2) | (1 << TRX_STATUS1) | (1 << TRX_STATUS0))); 1fa: 80 91 41 01 lds r24, 0x0141 1fe: 8f 71 andi r24, 0x1F ; 31 // ensure that transceiver is in a valid state // and no state transition is in progress if ((state != STATE_TRANSITION_IN_PROGRESS) && ((state == RX_ON) || (state 200: 8f 31 cpi r24, 0x1F ; 31 202: 91 f0 breq .+36 ; 0x228 204: 86 30 cpi r24, 0x06 ; 6 206: 11 f0 breq .+4 ; 0x20c 208: 88 30 cpi r24, 0x08 ; 8 20a: 71 f4 brne .+28 ; 0x228 == TRX_OFF))) { TRX_STATE = PLL_ON; 20c: 89 e0 ldi r24, 0x09 ; 9 20e: 80 93 42 01 sts 0x0142, r24 milliseconds can be achieved. */ void _delay_loop_2(uint16_t __count) { __asm__ volatile ( 212: 80 e2 ldi r24, 0x20 ; 32 214: 93 e0 ldi r25, 0x03 ; 3 216: 01 97 sbiw r24, 0x01 ; 1 218: f1 f7 brne .-4 ; 0x216 _delay_us(200); // typ. value is 110 us, but depends on external cap @ AVDD if ((TRX_STATUS & ((1 << TRX_STATUS4) | (1 << TRX_STATUS3) | (1 21a: 80 91 41 01 lds r24, 0x0141 21e: 20 e0 ldi r18, 0x00 ; 0 220: 30 e0 ldi r19, 0x00 ; 0 222: 8f 71 andi r24, 0x1F ; 31 224: 89 30 cpi r24, 0x09 ; 9 226: 11 f0 breq .+4 ; 0x22c 228: 21 e0 ldi r18, 0x01 ; 1 22a: 30 e0 ldi r19, 0x00 ; 0 return 0; } else return 1; } else return 1; } 22c: c9 01 movw r24, r18 22e: 08 95 ret 00000230 : char* transceiver_PowerRegValTodBmString(uint8_t regval){ switch (regval) { 230: 87 30 cpi r24, 0x07 ; 7 232: b9 f1 breq .+110 ; 0x2a2 234: 88 30 cpi r24, 0x08 ; 8 236: 70 f4 brcc .+28 ; 0x254 238: 83 30 cpi r24, 0x03 ; 3 23a: 39 f1 breq .+78 ; 0x28a 23c: 84 30 cpi r24, 0x04 ; 4 23e: 28 f4 brcc .+10 ; 0x24a 240: 81 30 cpi r24, 0x01 ; 1 242: d1 f0 breq .+52 ; 0x278 244: 82 30 cpi r24, 0x02 ; 2 246: f0 f4 brcc .+60 ; 0x284 248: 1a c0 rjmp .+52 ; 0x27e 24a: 85 30 cpi r24, 0x05 ; 5 24c: 21 f1 breq .+72 ; 0x296 24e: 86 30 cpi r24, 0x06 ; 6 250: 28 f5 brcc .+74 ; 0x29c 252: 1e c0 rjmp .+60 ; 0x290 254: 8b 30 cpi r24, 0x0B ; 11 256: 89 f1 breq .+98 ; 0x2ba 258: 8c 30 cpi r24, 0x0C ; 12 25a: 28 f4 brcc .+10 ; 0x266 25c: 89 30 cpi r24, 0x09 ; 9 25e: 39 f1 breq .+78 ; 0x2ae 260: 8a 30 cpi r24, 0x0A ; 10 262: 40 f5 brcc .+80 ; 0x2b4 264: 21 c0 rjmp .+66 ; 0x2a8 266: 8d 30 cpi r24, 0x0D ; 13 268: 71 f1 breq .+92 ; 0x2c6 26a: 8d 30 cpi r24, 0x0D ; 13 26c: 48 f1 brcs .+82 ; 0x2c0 26e: 8e 30 cpi r24, 0x0E ; 14 270: 69 f1 breq .+90 ; 0x2cc 272: 8f 30 cpi r24, 0x0F ; 15 274: 89 f5 brne .+98 ; 0x2d8 276: 2d c0 rjmp .+90 ; 0x2d2 278: 20 e0 ldi r18, 0x00 ; 0 27a: 32 e0 ldi r19, 0x02 ; 2 27c: 2f c0 rjmp .+94 ; 0x2dc 27e: 24 e0 ldi r18, 0x04 ; 4 280: 32 e0 ldi r19, 0x02 ; 2 282: 2c c0 rjmp .+88 ; 0x2dc 284: 28 e0 ldi r18, 0x08 ; 8 286: 32 e0 ldi r19, 0x02 ; 2 288: 29 c0 rjmp .+82 ; 0x2dc case 0 : return "3.0"; case 1 : return "2.8"; case 2 : return "2.3"; 28a: 2c e0 ldi r18, 0x0C ; 12 28c: 32 e0 ldi r19, 0x02 ; 2 28e: 26 c0 rjmp .+76 ; 0x2dc case 3 : return "1.8"; 290: 20 e1 ldi r18, 0x10 ; 16 292: 32 e0 ldi r19, 0x02 ; 2 294: 23 c0 rjmp .+70 ; 0x2dc case 4 : return "1.3"; 296: 24 e1 ldi r18, 0x14 ; 20 298: 32 e0 ldi r19, 0x02 ; 2 29a: 20 c0 rjmp .+64 ; 0x2dc case 5 : return "0.7"; 29c: 28 e1 ldi r18, 0x18 ; 24 29e: 32 e0 ldi r19, 0x02 ; 2 2a0: 1d c0 rjmp .+58 ; 0x2dc case 6 : return "0.0"; 2a2: 2c e1 ldi r18, 0x1C ; 28 2a4: 32 e0 ldi r19, 0x02 ; 2 2a6: 1a c0 rjmp .+52 ; 0x2dc case 7 : return "-1"; 2a8: 2f e1 ldi r18, 0x1F ; 31 2aa: 32 e0 ldi r19, 0x02 ; 2 2ac: 17 c0 rjmp .+46 ; 0x2dc case 8 : return "-2"; 2ae: 22 e2 ldi r18, 0x22 ; 34 2b0: 32 e0 ldi r19, 0x02 ; 2 2b2: 14 c0 rjmp .+40 ; 0x2dc case 9 : return "-3"; 2b4: 25 e2 ldi r18, 0x25 ; 37 2b6: 32 e0 ldi r19, 0x02 ; 2 2b8: 11 c0 rjmp .+34 ; 0x2dc case 10 : return "-4"; 2ba: 28 e2 ldi r18, 0x28 ; 40 2bc: 32 e0 ldi r19, 0x02 ; 2 2be: 0e c0 rjmp .+28 ; 0x2dc case 11 : return "-5"; 2c0: 2b e2 ldi r18, 0x2B ; 43 2c2: 32 e0 ldi r19, 0x02 ; 2 2c4: 0b c0 rjmp .+22 ; 0x2dc case 12 : return "-7"; 2c6: 2e e2 ldi r18, 0x2E ; 46 2c8: 32 e0 ldi r19, 0x02 ; 2 2ca: 08 c0 rjmp .+16 ; 0x2dc case 13 : return "-9"; 2cc: 21 e3 ldi r18, 0x31 ; 49 2ce: 32 e0 ldi r19, 0x02 ; 2 2d0: 05 c0 rjmp .+10 ; 0x2dc case 14 : return "-12"; 2d2: 25 e3 ldi r18, 0x35 ; 53 2d4: 32 e0 ldi r19, 0x02 ; 2 2d6: 02 c0 rjmp .+4 ; 0x2dc case 15 : return "-17"; 2d8: 29 e3 ldi r18, 0x39 ; 57 2da: 32 e0 ldi r19, 0x02 ; 2 default: return "#ERROR"; } } 2dc: c9 01 movw r24, r18 2de: 08 95 ret 000002e0 <__vector_15>: * On execution it should toggle the middle LED (LED3). * The execution interval is (1024*256)/32,768 = 8 s (external crystal is clock source). */ ISR( TIMER2_OVF_vect ) { 2e0: 1f 92 push r1 2e2: 0f 92 push r0 2e4: 0f b6 in r0, 0x3f ; 63 2e6: 0f 92 push r0 2e8: 11 24 eor r1, r1 2ea: 8f 93 push r24 flag = 1; 2ec: 81 e0 ldi r24, 0x01 ; 1 2ee: 80 93 d4 03 sts 0x03D4, r24 } 2f2: 8f 91 pop r24 2f4: 0f 90 pop r0 2f6: 0f be out 0x3f, r0 ; 63 2f8: 0f 90 pop r0 2fa: 1f 90 pop r1 2fc: 18 95 reti 000002fe <__vector_59>: xmit_done_flag = 1; } #ifdef RECEIVER ISR (TRX24_RX_START_vect) { 2fe: 1f 92 push r1 300: 0f 92 push r0 302: 0f b6 in r0, 0x3f ; 63 304: 0f 92 push r0 306: 11 24 eor r1, r1 // toggle_bit(LED_PORT, LED3); } 308: 0f 90 pop r0 30a: 0f be out 0x3f, r0 ; 63 30c: 0f 90 pop r0 30e: 1f 90 pop r1 310: 18 95 reti 00000312 <__vector_60>: ISR (TRX24_RX_END_vect) { 312: 1f 92 push r1 314: 0f 92 push r0 316: 0f b6 in r0, 0x3f ; 63 318: 0f 92 push r0 31a: 0b b6 in r0, 0x3b ; 59 31c: 0f 92 push r0 31e: 11 24 eor r1, r1 320: 8f 93 push r24 322: ef 93 push r30 324: ff 93 push r31 // protect the received frame TRX_CTRL_2 |= (1 << RX_SAFE_MODE); 326: ec e4 ldi r30, 0x4C ; 76 328: f1 e0 ldi r31, 0x01 ; 1 32a: 80 81 ld r24, Z 32c: 80 68 ori r24, 0x80 ; 128 32e: 80 83 st Z, r24 recv_flag = TRUE; 330: 81 e0 ldi r24, 0x01 ; 1 332: 80 93 d3 03 sts 0x03D3, r24 } 336: ff 91 pop r31 338: ef 91 pop r30 33a: 8f 91 pop r24 33c: 0f 90 pop r0 33e: 0b be out 0x3b, r0 ; 59 340: 0f 90 pop r0 342: 0f be out 0x3f, r0 ; 63 344: 0f 90 pop r0 346: 1f 90 pop r1 348: 18 95 reti 0000034a <__vector_61>: #endif ISR(TRX24_CCA_ED_DONE_vect) { 34a: 1f 92 push r1 34c: 0f 92 push r0 34e: 0f b6 in r0, 0x3f ; 63 350: 0f 92 push r0 352: 11 24 eor r1, r1 354: 8f 93 push r24 cca_flag = 1; 356: 81 e0 ldi r24, 0x01 ; 1 358: 80 93 d5 03 sts 0x03D5, r24 if (bit_is_set(TRX_STATUS, CCA_STATUS)) { 35c: 80 91 41 01 lds r24, 0x0141 360: 86 ff sbrs r24, 6 362: 02 c0 rjmp .+4 ; 0x368 <__vector_61+0x1e> set_bit(LED_PORT, LED4); 364: 74 9a sbi 0x0e, 4 ; 14 366: 01 c0 rjmp .+2 ; 0x36a <__vector_61+0x20> } else { clear_bit(LED_PORT, LED4); 368: 74 98 cbi 0x0e, 4 ; 14 } } 36a: 8f 91 pop r24 36c: 0f 90 pop r0 36e: 0f be out 0x3f, r0 ; 63 370: 0f 90 pop r0 372: 1f 90 pop r1 374: 18 95 reti 00000376 : // average_lqi = 0; // uart_writeNewline(); } } void doReceiverEval(void) { 376: bf 92 push r11 378: cf 92 push r12 37a: df 92 push r13 37c: ef 92 push r14 37e: ff 92 push r15 380: 0f 93 push r16 382: 1f 93 push r17 384: cf 93 push r28 386: df 93 push r29 * 3.) * */ uint8_t len, seq, ack, appByte, lqi, crc, channel, power; len = TST_RX_LENGTH; 388: 00 91 7b 01 lds r16, 0x017B seq = getSequenceNumber(frame_start_rx); 38c: 80 91 38 03 lds r24, 0x0338 390: 90 91 39 03 lds r25, 0x0339 394: 0e 94 32 05 call 0xa64 ; 0xa64 398: f8 2e mov r15, r24 ack = getACKRequestFlag(frame_start_rx); 39a: 80 91 38 03 lds r24, 0x0338 39e: 90 91 39 03 lds r25, 0x0339 3a2: 0e 94 17 05 call 0xa2e ; 0xa2e 3a6: b8 2e mov r11, r24 appByte = getAppCommandByte(frame_start_rx); 3a8: 80 91 38 03 lds r24, 0x0338 3ac: 90 91 39 03 lds r25, 0x0339 3b0: 0e 94 5d 05 call 0xaba ; 0xaba 3b4: 18 2f mov r17, r24 lqi = getLQI(&TRXFBEND); 3b6: 8f ef ldi r24, 0xFF ; 255 3b8: 91 e0 ldi r25, 0x01 ; 1 3ba: 0e 94 60 05 call 0xac0 ; 0xac0 3be: d8 2e mov r13, r24 crc = (PHY_RSSI >> 7); 3c0: c0 90 46 01 lds r12, 0x0146 channel = PHY_CC_CCA; 3c4: e0 90 48 01 lds r14, 0x0148 power = (PHY_TX_PWR & ((1 << TX_PWR3)|(1 << TX_PWR2)|(1 << TX_PWR1)|(1 << TX_PWR0))); 3c8: 80 91 45 01 lds r24, 0x0145 TRX_CTRL_2 &= ~(1 << RX_SAFE_MODE); 3cc: 80 91 4c 01 lds r24, 0x014C 3d0: 8f 77 andi r24, 0x7F ; 127 3d2: 80 93 4c 01 sts 0x014C, r24 // test_vec[0][(uint8_t)num_rcvd_packets] = lqi; switch (appByte) { 3d6: 11 23 and r17, r17 3d8: 21 f0 breq .+8 ; 0x3e2 3da: 1c 3c cpi r17, 0xCC ; 204 3dc: 09 f0 breq .+2 ; 0x3e0 3de: 41 c0 rjmp .+130 ; 0x462 3e0: 19 c0 rjmp .+50 ; 0x414 case TEST_FRAME: if (len == MIN_PACKET_LENGTH){ 3e2: 04 31 cpi r16, 0x14 ; 20 3e4: 39 f4 brne .+14 ; 0x3f4 uart_writeString(" 20! "); 3e6: 80 e4 ldi r24, 0x40 ; 64 3e8: 92 e0 ldi r25, 0x02 ; 2 3ea: 0e 94 0e 06 call 0xc1c ; 0xc1c // test_vec[0][num_rcvd_packets] = lqi; lqi_20 = lqi; 3ee: d0 92 e1 03 sts 0x03E1, r13 3f2: 06 c0 rjmp .+12 ; 0x400 } else { uart_writeString(" 127! "); 3f4: 86 e4 ldi r24, 0x46 ; 70 3f6: 92 e0 ldi r25, 0x02 ; 2 3f8: 0e 94 0e 06 call 0xc1c ; 0xc1c // test_vec[1][num_rcvd_packets] = lqi; lqi_127 = lqi; 3fc: d0 92 db 03 sts 0x03DB, r13 } num_rcvd_packets++; 400: 80 91 d8 03 lds r24, 0x03D8 404: 90 91 d9 03 lds r25, 0x03D9 408: 01 96 adiw r24, 0x01 ; 1 40a: 90 93 d9 03 sts 0x03D9, r25 40e: 80 93 d8 03 sts 0x03D8, r24 412: 2b c0 rjmp .+86 ; 0x46a break; 414: c0 e0 ldi r28, 0x00 ; 0 416: d0 e0 ldi r29, 0x00 ; 0 case CHANNEL_CHANGE: channel += CHANNEL_STEP; for (int var = 0; var < NUMBER_OF_FRAMES_PER_BLOCK; var++) { // uart_writeNumberDec(test_vec[0][var]); uart_writeNumberDec(lqi_20); 418: 60 91 e1 03 lds r22, 0x03E1 41c: 70 e0 ldi r23, 0x00 ; 0 41e: 80 e0 ldi r24, 0x00 ; 0 420: 90 e0 ldi r25, 0x00 ; 0 422: 0e 94 a9 07 call 0xf52 ; 0xf52 break; case CHANNEL_CHANGE: channel += CHANNEL_STEP; for (int var = 0; var < NUMBER_OF_FRAMES_PER_BLOCK; var++) { 426: 21 96 adiw r28, 0x01 ; 1 428: ca 30 cpi r28, 0x0A ; 10 42a: d1 05 cpc r29, r1 42c: a9 f7 brne .-22 ; 0x418 // uart_writeNumberDec(test_vec[0][var]); uart_writeNumberDec(lqi_20); } uart_writeNewline(); 42e: 0e 94 1b 06 call 0xc36 ; 0xc36 432: c0 e0 ldi r28, 0x00 ; 0 434: d0 e0 ldi r29, 0x00 ; 0 for (int var = 0; var < NUMBER_OF_FRAMES_PER_BLOCK; var++) { // uart_writeNumberDec(test_vec[1][var]); uart_writeNumberDec(lqi_127); 436: 60 91 db 03 lds r22, 0x03DB 43a: 70 e0 ldi r23, 0x00 ; 0 43c: 80 e0 ldi r24, 0x00 ; 0 43e: 90 e0 ldi r25, 0x00 ; 0 440: 0e 94 a9 07 call 0xf52 ; 0xf52 for (int var = 0; var < NUMBER_OF_FRAMES_PER_BLOCK; var++) { // uart_writeNumberDec(test_vec[0][var]); uart_writeNumberDec(lqi_20); } uart_writeNewline(); for (int var = 0; var < NUMBER_OF_FRAMES_PER_BLOCK; var++) { 444: 21 96 adiw r28, 0x01 ; 1 446: ca 30 cpi r28, 0x0A ; 10 448: d1 05 cpc r29, r1 44a: a9 f7 brne .-22 ; 0x436 } num_rcvd_packets++; break; case CHANNEL_CHANGE: channel += CHANNEL_STEP; 44c: e3 94 inc r14 uart_writeNewline(); for (int var = 0; var < NUMBER_OF_FRAMES_PER_BLOCK; var++) { // uart_writeNumberDec(test_vec[1][var]); uart_writeNumberDec(lqi_127); } uart_writeNewline(); 44e: 0e 94 1b 06 call 0xc36 ; 0xc36 452: 80 ea ldi r24, 0xA0 ; 160 454: 9f e0 ldi r25, 0x0F ; 15 456: 01 97 sbiw r24, 0x01 ; 1 458: f1 f7 brne .-4 ; 0x456 _delay_ms(1); write_channel_flag = TRUE; 45a: 81 e0 ldi r24, 0x01 ; 1 45c: 80 93 dc 03 sts 0x03DC, r24 460: 04 c0 rjmp .+8 ; 0x46a break; default: uart_writeString("DEFAULT"); 462: 8d e4 ldi r24, 0x4D ; 77 464: 92 e0 ldi r25, 0x02 ; 2 466: 0e 94 0e 06 call 0xc1c ; 0xc1c break; } if (num_rcvd_packets > 99) uart_writeString(""); 46a: 80 91 d8 03 lds r24, 0x03D8 46e: 90 91 d9 03 lds r25, 0x03D9 472: 84 36 cpi r24, 0x64 ; 100 474: 91 05 cpc r25, r1 476: 18 f0 brcs .+6 ; 0x47e 478: 85 e5 ldi r24, 0x55 ; 85 47a: 92 e0 ldi r25, 0x02 ; 2 47c: 07 c0 rjmp .+14 ; 0x48c else { if ((num_rcvd_packets > 9))uart_writeString(" "); 47e: 0a 97 sbiw r24, 0x0a ; 10 480: 18 f0 brcs .+6 ; 0x488 482: 86 e5 ldi r24, 0x56 ; 86 484: 92 e0 ldi r25, 0x02 ; 2 486: 02 c0 rjmp .+4 ; 0x48c else uart_writeString(" "); 488: 88 e5 ldi r24, 0x58 ; 88 48a: 92 e0 ldi r25, 0x02 ; 2 48c: 0e 94 0e 06 call 0xc1c ; 0xc1c } // uart_writeString("Received Packet # "); uart_writeNumberDec(num_rcvd_packets); 490: 60 91 d8 03 lds r22, 0x03D8 494: 70 91 d9 03 lds r23, 0x03D9 498: 80 e0 ldi r24, 0x00 ; 0 49a: 90 e0 ldi r25, 0x00 ; 0 49c: 0e 94 a9 07 call 0xf52 ; 0xf52 if (len > 99) uart_writeString(" |"); 4a0: 04 36 cpi r16, 0x64 ; 100 4a2: 18 f0 brcs .+6 ; 0x4aa 4a4: 8b e5 ldi r24, 0x5B ; 91 4a6: 92 e0 ldi r25, 0x02 ; 2 4a8: 02 c0 rjmp .+4 ; 0x4ae else uart_writeString(" | "); 4aa: 8e e5 ldi r24, 0x5E ; 94 4ac: 92 e0 ldi r25, 0x02 ; 2 4ae: 0e 94 0e 06 call 0xc1c ; 0xc1c uart_writeNumberDec(len); 4b2: 60 2f mov r22, r16 4b4: 70 e0 ldi r23, 0x00 ; 0 4b6: 80 e0 ldi r24, 0x00 ; 0 4b8: 90 e0 ldi r25, 0x00 ; 0 4ba: 0e 94 a9 07 call 0xf52 ; 0xf52 // uart_writeString(" Octets"); uart_writeString(" | "); 4be: 8e e5 ldi r24, 0x5E ; 94 4c0: 92 e0 ldi r25, 0x02 ; 2 4c2: 0e 94 0e 06 call 0xc1c ; 0xc1c uart_writeNumberHex(ack); 4c6: 6b 2d mov r22, r11 4c8: 70 e0 ldi r23, 0x00 ; 0 4ca: 80 e0 ldi r24, 0x00 ; 0 4cc: 90 e0 ldi r25, 0x00 ; 0 4ce: 0e 94 51 07 call 0xea2 ; 0xea2 if (seq > 99) uart_writeString(" | "); 4d2: 83 e6 ldi r24, 0x63 ; 99 4d4: 8f 15 cp r24, r15 4d6: 18 f4 brcc .+6 ; 0x4de 4d8: 8e e5 ldi r24, 0x5E ; 94 4da: 92 e0 ldi r25, 0x02 ; 2 4dc: 08 c0 rjmp .+16 ; 0x4ee else { if ((seq > 9))uart_writeString(" | "); 4de: 89 e0 ldi r24, 0x09 ; 9 4e0: 8f 15 cp r24, r15 4e2: 18 f4 brcc .+6 ; 0x4ea 4e4: 82 e6 ldi r24, 0x62 ; 98 4e6: 92 e0 ldi r25, 0x02 ; 2 4e8: 02 c0 rjmp .+4 ; 0x4ee else uart_writeString(" | "); 4ea: 87 e6 ldi r24, 0x67 ; 103 4ec: 92 e0 ldi r25, 0x02 ; 2 4ee: 0e 94 0e 06 call 0xc1c ; 0xc1c } // uart_writeString(" | Seq : "); uart_writeNumberDec(seq); 4f2: 6f 2d mov r22, r15 4f4: 70 e0 ldi r23, 0x00 ; 0 4f6: 80 e0 ldi r24, 0x00 ; 0 4f8: 90 e0 ldi r25, 0x00 ; 0 4fa: 0e 94 a9 07 call 0xf52 ; 0xf52 if (appByte > 0x0F) uart_writeString(" | "); 4fe: 10 31 cpi r17, 0x10 ; 16 500: 18 f0 brcs .+6 ; 0x508 502: 8e e5 ldi r24, 0x5E ; 94 504: 92 e0 ldi r25, 0x02 ; 2 506: 02 c0 rjmp .+4 ; 0x50c else uart_writeString(" | "); 508: 82 e6 ldi r24, 0x62 ; 98 50a: 92 e0 ldi r25, 0x02 ; 2 50c: 0e 94 0e 06 call 0xc1c ; 0xc1c // uart_writeString(" | AppByte : "); uart_writeNumberHex(appByte); 510: 61 2f mov r22, r17 512: 70 e0 ldi r23, 0x00 ; 0 514: 80 e0 ldi r24, 0x00 ; 0 516: 90 e0 ldi r25, 0x00 ; 0 518: 0e 94 51 07 call 0xea2 ; 0xea2 uart_writeString(" | "); 51c: 8e e5 ldi r24, 0x5E ; 94 51e: 92 e0 ldi r25, 0x02 ; 2 520: 0e 94 0e 06 call 0xc1c ; 0xc1c // uart_writeString(transceiver_PowerRegValTodBmString(power)); // uart_writeString(" | "); uart_writeNumberDec(channel); 524: 6e 2d mov r22, r14 526: 70 e0 ldi r23, 0x00 ; 0 528: 80 e0 ldi r24, 0x00 ; 0 52a: 90 e0 ldi r25, 0x00 ; 0 52c: 0e 94 a9 07 call 0xf52 ; 0xf52 uart_writeString(" | "); 530: 8e e5 ldi r24, 0x5E ; 94 532: 92 e0 ldi r25, 0x02 ; 2 534: 0e 94 0e 06 call 0xc1c ; 0xc1c uart_writeNumberDec(lqi); 538: 6d 2d mov r22, r13 53a: 70 e0 ldi r23, 0x00 ; 0 53c: 80 e0 ldi r24, 0x00 ; 0 53e: 90 e0 ldi r25, 0x00 ; 0 540: 0e 94 a9 07 call 0xf52 ; 0xf52 uart_writeString(" | "); 544: 8e e5 ldi r24, 0x5E ; 94 546: 92 e0 ldi r25, 0x02 ; 2 548: 0e 94 0e 06 call 0xc1c ; 0xc1c uart_writeNumberDec(crc); 54c: cc 1c adc r12, r12 54e: cc 24 eor r12, r12 550: cc 1c adc r12, r12 552: 6c 2d mov r22, r12 554: 70 e0 ldi r23, 0x00 ; 0 556: 80 e0 ldi r24, 0x00 ; 0 558: 90 e0 ldi r25, 0x00 ; 0 55a: 0e 94 a9 07 call 0xf52 ; 0xf52 uart_writeNewline(); 55e: 0e 94 1b 06 call 0xc36 ; 0xc36 } 562: df 91 pop r29 564: cf 91 pop r28 566: 1f 91 pop r17 568: 0f 91 pop r16 56a: ff 90 pop r15 56c: ef 90 pop r14 56e: df 90 pop r13 570: cf 90 pop r12 572: bf 90 pop r11 574: 08 95 ret 00000576
: #else #error "No matching device role defined for setup!" #endif int main(void) { cli(); 576: f8 94 cli CLKPR = (1 << CLKPCE); // allow change of pre-scale bits 578: 80 e8 ldi r24, 0x80 ; 128 57a: 80 93 61 00 sts 0x0061, r24 CLKPR = ((1 << CLKPS3) | (1 << CLKPS2) | (1 << CLKPS1) | (1 << CLKPS0)); // disable internal pre-scaling (not FLASH/EEPROM writes not allowed) 57e: 8f e0 ldi r24, 0x0F ; 15 580: 80 93 61 00 sts 0x0061, r24 LED_DDR = ALL_LEDS; // enable LED pins as output 584: 8c e1 ldi r24, 0x1C ; 28 586: 8d b9 out 0x0d, r24 ; 13 LED_PORT &= ~ALL_LEDS; // turn on LEDs (active low) 588: 8e b1 in r24, 0x0e ; 14 58a: 83 7e andi r24, 0xE3 ; 227 58c: 8e b9 out 0x0e, r24 ; 14 for (loopvar = 0; loopvar != 3; loopvar++) { 58e: 10 92 de 03 sts 0x03DE, r1 592: 10 92 dd 03 sts 0x03DD, r1 596: 20 e9 ldi r18, 0x90 ; 144 598: 31 e0 ldi r19, 0x01 ; 1 _delay_ms(250); LED_PORT ^= ALL_LEDS; // toggle LEDs 59a: 4c e1 ldi r20, 0x1C ; 28 59c: 13 c0 rjmp .+38 ; 0x5c4 CLKPR = (1 << CLKPCE); // allow change of pre-scale bits CLKPR = ((1 << CLKPS3) | (1 << CLKPS2) | (1 << CLKPS1) | (1 << CLKPS0)); // disable internal pre-scaling (not FLASH/EEPROM writes not allowed) LED_DDR = ALL_LEDS; // enable LED pins as output LED_PORT &= ~ALL_LEDS; // turn on LEDs (active low) for (loopvar = 0; loopvar != 3; loopvar++) { 59e: 84 ec ldi r24, 0xC4 ; 196 5a0: 99 e0 ldi r25, 0x09 ; 9 5a2: f9 01 movw r30, r18 5a4: 31 97 sbiw r30, 0x01 ; 1 5a6: f1 f7 brne .-4 ; 0x5a4 __ticks = (uint16_t) (__ms * 10.0); while(__ticks) { // wait 1/10 ms _delay_loop_2(((F_CPU) / 4e3) / 10); __ticks --; 5a8: 01 97 sbiw r24, 0x01 ; 1 __ticks = 1; else if (__tmp > 65535) { // __ticks = requested delay in 1/10 ms __ticks = (uint16_t) (__ms * 10.0); while(__ticks) 5aa: d9 f7 brne .-10 ; 0x5a2 _delay_ms(250); LED_PORT ^= ALL_LEDS; // toggle LEDs 5ac: 8e b1 in r24, 0x0e ; 14 5ae: 84 27 eor r24, r20 5b0: 8e b9 out 0x0e, r24 ; 14 CLKPR = (1 << CLKPCE); // allow change of pre-scale bits CLKPR = ((1 << CLKPS3) | (1 << CLKPS2) | (1 << CLKPS1) | (1 << CLKPS0)); // disable internal pre-scaling (not FLASH/EEPROM writes not allowed) LED_DDR = ALL_LEDS; // enable LED pins as output LED_PORT &= ~ALL_LEDS; // turn on LEDs (active low) for (loopvar = 0; loopvar != 3; loopvar++) { 5b2: 80 91 dd 03 lds r24, 0x03DD 5b6: 90 91 de 03 lds r25, 0x03DE 5ba: 01 96 adiw r24, 0x01 ; 1 5bc: 90 93 de 03 sts 0x03DE, r25 5c0: 80 93 dd 03 sts 0x03DD, r24 5c4: 80 91 dd 03 lds r24, 0x03DD 5c8: 90 91 de 03 lds r25, 0x03DE 5cc: 03 97 sbiw r24, 0x03 ; 3 5ce: 39 f7 brne .-50 ; 0x59e 5d0: 84 ec ldi r24, 0xC4 ; 196 5d2: 99 e0 ldi r25, 0x09 ; 9 5d4: 20 e9 ldi r18, 0x90 ; 144 5d6: 31 e0 ldi r19, 0x01 ; 1 5d8: f9 01 movw r30, r18 5da: 31 97 sbiw r30, 0x01 ; 1 5dc: f1 f7 brne .-4 ; 0x5da { // wait 1/10 ms _delay_loop_2(((F_CPU) / 4e3) / 10); __ticks --; 5de: 01 97 sbiw r24, 0x01 ; 1 __ticks = 1; else if (__tmp > 65535) { // __ticks = requested delay in 1/10 ms __ticks = (uint16_t) (__ms * 10.0); while(__ticks) 5e0: d9 f7 brne .-10 ; 0x5d8 _delay_ms(250); LED_PORT ^= ALL_LEDS; // toggle LEDs } _delay_ms(250); LED_PORT &= ~((1 << LED2) | (1 << LED4)); 5e2: 8e b1 in r24, 0x0e ; 14 5e4: 8b 7e andi r24, 0xEB ; 235 5e6: 8e b9 out 0x0e, r24 ; 14 5e8: 88 e8 ldi r24, 0x88 ; 136 5ea: 93 e1 ldi r25, 0x13 ; 19 5ec: 20 e9 ldi r18, 0x90 ; 144 5ee: 31 e0 ldi r19, 0x01 ; 1 5f0: f9 01 movw r30, r18 5f2: 31 97 sbiw r30, 0x01 ; 1 5f4: f1 f7 brne .-4 ; 0x5f2 { // wait 1/10 ms _delay_loop_2(((F_CPU) / 4e3) / 10); __ticks --; 5f6: 01 97 sbiw r24, 0x01 ; 1 __ticks = 1; else if (__tmp > 65535) { // __ticks = requested delay in 1/10 ms __ticks = (uint16_t) (__ms * 10.0); while(__ticks) 5f8: d9 f7 brne .-10 ; 0x5f0 _delay_ms(500); LED_PORT |= ALL_LEDS; // Turn off LEDs for measurement 5fa: 8e b1 in r24, 0x0e ; 14 5fc: 8c 61 ori r24, 0x1C ; 28 5fe: 8e b9 out 0x0e, r24 ; 14 clear_bit(PRR0, PRTIM2); // enable Timer2 600: 80 91 64 00 lds r24, 0x0064 604: 8f 7b andi r24, 0xBF ; 191 606: 80 93 64 00 sts 0x0064, r24 ASSR &= ~((1 << EXCLKAMR) | (1 << EXCLK)); // set clock source to external crystal AS2=1, EXCLK=0, EXCKLAMR=0 60a: 80 91 b6 00 lds r24, 0x00B6 60e: 8f 73 andi r24, 0x3F ; 63 610: 80 93 b6 00 sts 0x00B6, r24 set_bit(ASSR, AS2); // alternate clock source 614: 80 91 b6 00 lds r24, 0x00B6 618: 80 62 ori r24, 0x20 ; 32 61a: 80 93 b6 00 sts 0x00B6, r24 TCCR2B |= ((1 << CS22) | (1 << CS21) | (1 << CS20)); // set pre-scaler to longest possible (f_clk/1024) 61e: 80 91 b1 00 lds r24, 0x00B1 622: 87 60 ori r24, 0x07 ; 7 624: 80 93 b1 00 sts 0x00B1, r24 // set_bit(TIMSK2, TOIE2); // enable overflow interrupt set_bit(DDRE, DDE6); // set PE0 to output -> time measurement 628: 6e 9a sbi 0x0d, 6 ; 13 clear_bit(PRR0, PRUSART0); // enable USART0 62a: 80 91 64 00 lds r24, 0x0064 62e: 8d 7f andi r24, 0xFD ; 253 630: 80 93 64 00 sts 0x0064, r24 /* Enable SRAM Data Retention */ DRTRAM0 = _BV(ENDRT); 634: 80 e1 ldi r24, 0x10 ; 16 636: 80 93 35 01 sts 0x0135, r24 DRTRAM1 = _BV(ENDRT); 63a: 80 93 34 01 sts 0x0134, r24 DRTRAM2 = _BV(ENDRT); 63e: 80 93 33 01 sts 0x0133, r24 DRTRAM3 = _BV(ENDRT); 642: 80 93 32 01 sts 0x0132, r24 uart_init( UART_BAUD_SELECT(BAUD,F_CPU) ); 646: 8c e0 ldi r24, 0x0C ; 12 648: 90 e0 ldi r25, 0x00 ; 0 64a: 0e 94 c1 05 call 0xb82 ; 0xb82 sei(); 64e: 78 94 sei LED_PORT = 0xFF; // turn off LEDs 650: 8f ef ldi r24, 0xFF ; 255 652: 8e b9 out 0x0e, r24 ; 14 set_bit(PORTE, 6); // set PE6 high to test with oscilloscope 654: 76 9a sbi 0x0e, 6 ; 14 * additionally we can do the following: * we turn the node into a sniffer, by disabling the address filters (promiscous mode) * we then enable an LED in case of a received frame (TRX24_RX_START * if the CRC/FCS is invalid we switch on another LED */ clear_bit(PRR1, PRTRX24); 656: 80 91 65 00 lds r24, 0x0065 65a: 8f 7b andi r24, 0xBF ; 191 65c: 80 93 65 00 sts 0x0065, r24 // RX_SYN |= ((1< 684: 80 e2 ldi r24, 0x20 ; 32 686: 93 e0 ldi r25, 0x03 ; 3 688: 01 97 sbiw r24, 0x01 ; 1 68a: f1 f7 brne .-4 ; 0x688 _delay_us(200); TRX_STATE = CMD_RX_ON; } else TRX_STATE = CMD_RX_ON; 68c: 86 e0 ldi r24, 0x06 ; 6 68e: 80 93 42 01 sts 0x0142, r24 is_xmitter = FALSE; 692: 10 92 da 03 sts 0x03DA, r1 transceiver_set_channel(curr_channel); } #endif #ifdef RECEIVER if(recv_flag == TRUE){ 696: 80 91 d3 03 lds r24, 0x03D3 69a: 81 30 cpi r24, 0x01 ; 1 69c: e1 f7 brne .-8 ; 0x696 recv_flag = FALSE; 69e: 10 92 d3 03 sts 0x03D3, r1 doReceiverEval(); 6a2: 0e 94 bb 01 call 0x376 ; 0x376 6a6: f7 cf rjmp .-18 ; 0x696 000006a8 : // } } } #elif defined RECEIVER void printChannelResult(void) { 6a8: 1f 93 push r17 6aa: 10 e0 ldi r17, 0x00 ; 0 // uart_writeNumberDec(lqi_temp); // } for (int power_c = MAX_TX_POWER; power_c < (MIN_TX_POWER + 1); (power_c += TX_POWER_STEP)) { /* print LQI for both payload sizes for every power setting */ uart_writeString(transceiver_PowerRegValTodBmString(power_c)); 6ac: 81 2f mov r24, r17 6ae: 0e 94 18 01 call 0x230 ; 0x230 6b2: 0e 94 0e 06 call 0xc1c ; 0xc1c uart_writeLine("dBm"); 6b6: 8d e6 ldi r24, 0x6D ; 109 6b8: 92 e0 ldi r25, 0x02 ; 2 6ba: 0e 94 20 06 call 0xc40 ; 0xc40 6be: 1d 5f subi r17, 0xFD ; 253 // for (int temp = 0; temp < NUMBER_OF_FRAMES_PER_BLOCK; temp++) { // uint8_t lqi_temp = channel_matrix[0][1][temp]; // uart_writeNumberDec(lqi_temp); // } for (int power_c = MAX_TX_POWER; power_c < (MIN_TX_POWER + 1); (power_c += TX_POWER_STEP)) { 6c0: 12 31 cpi r17, 0x12 ; 18 6c2: a1 f7 brne .-24 ; 0x6ac // uart_writeString("Average LQI : "); // uart_writeNumberDec(average_lqi/NUMBER_OF_FRAMES_PER_BLOCK); // average_lqi = 0; // uart_writeNewline(); } } 6c4: 1f 91 pop r17 6c6: 08 95 ret 000006c8 <__vector_63>: { flag = 1; } ISR( TRX24_TX_END_vect) { 6c8: 1f 92 push r1 6ca: 0f 92 push r0 6cc: 0f b6 in r0, 0x3f ; 63 6ce: 0f 92 push r0 6d0: 0b b6 in r0, 0x3b ; 59 6d2: 0f 92 push r0 6d4: 11 24 eor r1, r1 6d6: 1f 93 push r17 6d8: 2f 93 push r18 6da: 3f 93 push r19 6dc: 4f 93 push r20 6de: 5f 93 push r21 6e0: 6f 93 push r22 6e2: 7f 93 push r23 6e4: 8f 93 push r24 6e6: 9f 93 push r25 6e8: af 93 push r26 6ea: bf 93 push r27 6ec: ef 93 push r30 6ee: ff 93 push r31 uint8_t xmit_status; // we need to check the transmission status and set the transmission flag // we could also ensure that we are in the correct state PLL_ON/TX_ARET_ON xmit_status = ((TRX_STATE >> 5) & 0x07); 6f0: 10 91 42 01 lds r17, 0x0142 /* test wether we are in an extended operating mode */ if ((TRX_STATUS & ((1 << TRX_STATUS4) | (1 << TRX_STATUS3) | (1 6f4: 80 91 41 01 lds r24, 0x0141 6f8: 8f 71 andi r24, 0x1F ; 31 6fa: 89 30 cpi r24, 0x09 ; 9 6fc: c1 f1 breq .+112 ; 0x76e <__vector_63+0xa6> << TRX_STATUS2) | (1 << TRX_STATUS1) | (1 << TRX_STATUS0))) != PLL_ON) { uart_writeLine("TX_ARET_MODE ON!"); 6fe: 81 e7 ldi r24, 0x71 ; 113 700: 92 e0 ldi r25, 0x02 ; 2 702: 0e 94 20 06 call 0xc40 ; 0xc40 uart_writeString("TRAC_STATUS = "); 706: 82 e8 ldi r24, 0x82 ; 130 708: 92 e0 ldi r25, 0x02 ; 2 70a: 0e 94 0e 06 call 0xc1c ; 0xc1c switch (xmit_status) { 70e: 81 2f mov r24, r17 710: 82 95 swap r24 712: 86 95 lsr r24 714: 87 70 andi r24, 0x07 ; 7 716: 83 30 cpi r24, 0x03 ; 3 718: a9 f0 breq .+42 ; 0x744 <__vector_63+0x7c> 71a: 84 30 cpi r24, 0x04 ; 4 71c: 28 f4 brcc .+10 ; 0x728 <__vector_63+0x60> 71e: 88 23 and r24, r24 720: 41 f0 breq .+16 ; 0x732 <__vector_63+0x6a> 722: 81 30 cpi r24, 0x01 ; 1 724: 21 f5 brne .+72 ; 0x76e <__vector_63+0xa6> 726: 0b c0 rjmp .+22 ; 0x73e <__vector_63+0x76> 728: 85 30 cpi r24, 0x05 ; 5 72a: 71 f0 breq .+28 ; 0x748 <__vector_63+0x80> 72c: 87 30 cpi r24, 0x07 ; 7 72e: f9 f4 brne .+62 ; 0x76e <__vector_63+0xa6> 730: 18 c0 rjmp .+48 ; 0x762 <__vector_63+0x9a> case ((uint8_t) TRAC_SUCCESS): xmit_done_flag = 1; 732: 81 e0 ldi r24, 0x01 ; 1 734: 80 93 d6 03 sts 0x03D6, r24 write_channel_flag = 1; 738: 80 93 dc 03 sts 0x03DC, r24 73c: 18 c0 rjmp .+48 ; 0x76e <__vector_63+0xa6> break; case ((uint8_t) TRAC_SUCCESS_DATA_PENDING): xmit_done_flag = 1; 73e: 80 93 d6 03 sts 0x03D6, r24 742: 15 c0 rjmp .+42 ; 0x76e <__vector_63+0xa6> case ((uint8_t) TRAC_SUCCESS_WAIT_FOR_ACK): break; // do something here case ((uint8_t) TRAC_CHANNEL_ACCESS_FAILURE): LED_PORT = ((1 << LED2) | (1 << LED4)); 744: 84 e1 ldi r24, 0x14 ; 20 746: 12 c0 rjmp .+36 ; 0x76c <__vector_63+0xa4> break; // do something here case ((uint8_t) TRAC_NO_ACK): uart_writeLine( 748: 81 e9 ldi r24, 0x91 ; 145 74a: 92 e0 ldi r25, 0x02 ; 2 74c: 0e 94 20 06 call 0xc40 ; 0xc40 " ----> DID NOT RECEIVE ACK FOR CHANNEL CHANGE REQUEST <----"); uart_writeLine( 750: 8d ec ldi r24, 0xCD ; 205 752: 92 e0 ldi r25, 0x02 ; 2 754: 0e 94 20 06 call 0xc40 ; 0xc40 " ----> ABORTING TEST <----"); uart_writeString("TRAC_STATUS = "); 758: 82 e8 ldi r24, 0x82 ; 130 75a: 92 e0 ldi r25, 0x02 ; 2 75c: 0e 94 0e 06 call 0xc1c ; 0xc1c 760: 06 c0 rjmp .+12 ; 0x76e <__vector_63+0xa6> break; // we could signal this to the app layer case ((uint8_t) TRAC_INVALID): uart_writeLine("THIS SHOULD BE PRINTED"); 762: 89 e0 ldi r24, 0x09 ; 9 764: 93 e0 ldi r25, 0x03 ; 3 766: 0e 94 20 06 call 0xc40 ; 0xc40 LED_PORT = ((1 << LED2) | (1 << LED3) | (1 << LED4)); 76a: 8c e1 ldi r24, 0x1C ; 28 76c: 8e b9 out 0x0e, r24 ; 14 default: // xmit_done_flag = 1; break; } } xmit_done_flag = 1; 76e: 81 e0 ldi r24, 0x01 ; 1 770: 80 93 d6 03 sts 0x03D6, r24 } 774: ff 91 pop r31 776: ef 91 pop r30 778: bf 91 pop r27 77a: af 91 pop r26 77c: 9f 91 pop r25 77e: 8f 91 pop r24 780: 7f 91 pop r23 782: 6f 91 pop r22 784: 5f 91 pop r21 786: 4f 91 pop r20 788: 3f 91 pop r19 78a: 2f 91 pop r18 78c: 1f 91 pop r17 78e: 0f 90 pop r0 790: 0b be out 0x3b, r0 ; 59 792: 0f 90 pop r0 794: 0f be out 0x3f, r0 ; 63 796: 0f 90 pop r0 798: 1f 90 pop r1 79a: 18 95 reti 0000079c : #include "simpleProtocol.h" #include "testSetup.h" uint8_t invert_bit_order(uint8_t org){ org=((org>>1)&0x55)|((org<<1)&0xaa); 79c: 98 2f mov r25, r24 79e: 99 0f add r25, r25 7a0: 9a 7a andi r25, 0xAA ; 170 7a2: 86 95 lsr r24 7a4: 85 75 andi r24, 0x55 ; 85 7a6: 98 2b or r25, r24 org=((org>>2)&0x33)|((org<<2)&0xcc); 7a8: 89 2f mov r24, r25 7aa: 88 0f add r24, r24 7ac: 88 0f add r24, r24 7ae: 8c 7c andi r24, 0xCC ; 204 7b0: 96 95 lsr r25 7b2: 96 95 lsr r25 7b4: 93 73 andi r25, 0x33 ; 51 7b6: 89 2b or r24, r25 7b8: 98 2f mov r25, r24 7ba: 92 95 swap r25 7bc: 9f 70 andi r25, 0x0F ; 15 7be: 82 95 swap r24 7c0: 80 7f andi r24, 0xF0 ; 240 return (org>>4)|(org<<4); } 7c2: 89 2b or r24, r25 7c4: 08 95 ret 000007c6 : void writeFrameControlField (volatile uint8_t* startOfFrame, uint16_t frameControlFieldValue){ 7c6: fc 01 movw r30, r24 *(startOfFrame) = (uint8_t)(frameControlFieldValue >> 8); 7c8: 70 83 st Z, r23 *(startOfFrame+1) = (uint8_t)(frameControlFieldValue); 7ca: 61 83 std Z+1, r22 ; 0x01 } 7cc: 08 95 ret 000007ce : void writeTestFrame(volatile uint8_t* startOfFrame, uint8_t frame_number, uint8_t length){ 7ce: fc 01 movw r30, r24 setFrameLength(startOfFrame, (uint8_t)(LENGTH_MAC_HDR + length)); 7d0: 42 5f subi r20, 0xF2 ; 242 setAppCommandByte(startOfFrame, CHANNEL_CHANGE); setRandomPayload(startOfFrame, length); } void setFrameLength(volatile uint8_t* startOfFrame, uint8_t length){ *(startOfFrame-1) = length; 7d2: 42 93 st -Z, r20 7d4: 4e 50 subi r20, 0x0E ; 14 7d6: 31 96 adiw r30, 0x01 ; 1 org=((org>>2)&0x33)|((org<<2)&0xcc); return (org>>4)|(org<<4); } void writeFrameControlField (volatile uint8_t* startOfFrame, uint16_t frameControlFieldValue){ *(startOfFrame) = (uint8_t)(frameControlFieldValue >> 8); 7d8: 81 e0 ldi r24, 0x01 ; 1 7da: 80 83 st Z, r24 *(startOfFrame+1) = (uint8_t)(frameControlFieldValue); 7dc: 11 82 std Z+1, r1 ; 0x01 /* SET operations*/ void setFrameType(volatile uint8_t* startOfFrame, uint8_t frameType){ uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame); 7de: 80 81 ld r24, Z frameControlFieldL &= ~(((uint16_t)FRAMETYPE_MASK) >> 8); 7e0: 88 7f andi r24, 0xF8 ; 248 frameControlFieldL |= (frameType)&(((uint16_t)FRAMETYPE_MASK) >> 8); 7e2: 81 60 ori r24, 0x01 ; 1 *(startOfFrame) = frameControlFieldL; 7e4: 80 83 st Z, r24 void setDestinationAddressingMode(volatile uint8_t* startOfFrame, uint8_t addrMode){ uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame+1); 7e6: 81 81 ldd r24, Z+1 ; 0x01 frameControlFieldL &= ~(DEST_ADDR_MODE_MASK); frameControlFieldL |= (addrMode << 2)&(DEST_ADDR_MODE_MASK); 7e8: 83 7f andi r24, 0xF3 ; 243 7ea: 88 60 ori r24, 0x08 ; 8 *(startOfFrame+1) = (uint8_t) frameControlFieldL; 7ec: 81 83 std Z+1, r24 ; 0x01 } void setFrameVersion(volatile uint8_t* startOfFrame, uint8_t version){ uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame+1); 7ee: 81 81 ldd r24, Z+1 ; 0x01 frameControlFieldL &= ~(FRAME_VERSION_MASK); 7f0: 8f 7c andi r24, 0xCF ; 207 frameControlFieldL |= (version << 4)&(FRAME_VERSION_MASK); *(startOfFrame+1) = (uint8_t) frameControlFieldL; 7f2: 81 83 std Z+1, r24 ; 0x01 } void setSourceAddressingMode(volatile uint8_t* startOfFrame, uint8_t addrMode){ uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame+1); 7f4: 81 81 ldd r24, Z+1 ; 0x01 frameControlFieldL &= ~(SRC_ADDR_MODE_MASK); frameControlFieldL |= (addrMode << 6)&(SRC_ADDR_MODE_MASK); 7f6: 8f 73 andi r24, 0x3F ; 63 7f8: 80 68 ori r24, 0x80 ; 128 *(startOfFrame+1) = (uint8_t) frameControlFieldL; 7fa: 81 83 std Z+1, r24 ; 0x01 } void setSequenceNumber(volatile uint8_t* startOfFrame, uint8_t seqNumber){ *(startOfFrame + 2) = seqNumber; 7fc: 62 83 std Z+2, r22 ; 0x02 } void setDestinationPANID(volatile uint8_t* startOfFrame, uint16_t destPAN){ *(startOfFrame + 3) = (uint8_t) destPAN; 7fe: 9e ef ldi r25, 0xFE ; 254 800: 93 83 std Z+3, r25 ; 0x03 *(startOfFrame + 4) = (uint8_t) (destPAN >> 8); 802: 2a ec ldi r18, 0xCA ; 202 804: 24 83 std Z+4, r18 ; 0x04 } void setDestinationAddress(volatile uint8_t* startOfFrame, uint16_t destAddr){ *(startOfFrame + 5) = (uint8_t) destAddr; 806: 95 83 std Z+5, r25 ; 0x05 *(startOfFrame + 6) = (uint8_t) (destAddr >> 8); 808: 8f ea ldi r24, 0xAF ; 175 80a: 86 83 std Z+6, r24 ; 0x06 } void setSourcePANID(volatile uint8_t* startOfFrame, uint16_t srcPAN){ *(startOfFrame + 7) = (uint8_t) srcPAN; 80c: 97 83 std Z+7, r25 ; 0x07 *(startOfFrame + 8) = (uint8_t) (srcPAN >> 8); 80e: 20 87 std Z+8, r18 ; 0x08 } void setSourceAddress(volatile uint8_t* startOfFrame, uint16_t srcAddr){ *(startOfFrame + 9) = (uint8_t) srcAddr; 810: 91 87 std Z+9, r25 ; 0x09 *(startOfFrame + 10) = (uint8_t) (srcAddr >> 8); 812: 92 87 std Z+10, r25 ; 0x0a } void setAppCommandByte(volatile uint8_t* startOfFrame, uint8_t command){ *(startOfFrame + 11) = command; 814: 13 86 std Z+11, r1 ; 0x0b 816: 3c 96 adiw r30, 0x0c ; 12 818: 80 e0 ldi r24, 0x00 ; 0 81a: 90 e0 ldi r25, 0x00 ; 0 } void setRandomPayload(volatile uint8_t* startOfFrame, uint8_t length){ for (int var = 0; var < length; ++var) { 81c: 50 e0 ldi r21, 0x00 ; 0 *(startOfFrame + 12 + var) = 0xFF; 81e: 2f ef ldi r18, 0xFF ; 255 820: 02 c0 rjmp .+4 ; 0x826 822: 21 93 st Z+, r18 void setAppCommandByte(volatile uint8_t* startOfFrame, uint8_t command){ *(startOfFrame + 11) = command; } void setRandomPayload(volatile uint8_t* startOfFrame, uint8_t length){ for (int var = 0; var < length; ++var) { 824: 01 96 adiw r24, 0x01 ; 1 826: 84 17 cp r24, r20 828: 95 07 cpc r25, r21 82a: dc f3 brlt .-10 ; 0x822 setDestinationAddress(startOfFrame, TEST_ADDR_SHORT_RX); setSourcePANID(startOfFrame, TEST_PANID); setSourceAddress(startOfFrame, TEST_ADDR_SHORT_TX); setAppCommandByte(startOfFrame, TEST_FRAME); setRandomPayload(startOfFrame, length); } 82c: 08 95 ret 0000082e : setAppCommandByte(startOfFrame, CHANNEL_CHANGE); setRandomPayload(startOfFrame, length); } void setFrameLength(volatile uint8_t* startOfFrame, uint8_t length){ *(startOfFrame-1) = length; 82e: fc 01 movw r30, r24 830: 31 97 sbiw r30, 0x01 ; 1 832: 60 83 st Z, r22 } 834: 08 95 ret 00000836 : /* SET operations*/ void setFrameType(volatile uint8_t* startOfFrame, uint8_t frameType){ 836: fc 01 movw r30, r24 uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame); 838: 80 81 ld r24, Z frameControlFieldL &= ~(((uint16_t)FRAMETYPE_MASK) >> 8); 83a: 88 7f andi r24, 0xF8 ; 248 frameControlFieldL |= (frameType)&(((uint16_t)FRAMETYPE_MASK) >> 8); 83c: 67 70 andi r22, 0x07 ; 7 83e: 86 2b or r24, r22 *(startOfFrame) = frameControlFieldL; 840: 80 83 st Z, r24 } 842: 08 95 ret 00000844 : void setSecurityEnabledFlag(volatile uint8_t* startOfFrame){ 844: fc 01 movw r30, r24 uint16_t frameControlField; frameControlField = (((uint16_t) *(startOfFrame)) << 8); 846: 80 81 ld r24, Z 848: 38 2f mov r19, r24 84a: 20 e0 ldi r18, 0x00 ; 0 frameControlField |= (uint16_t) *(startOfFrame + 1); 84c: 81 81 ldd r24, Z+1 ; 0x01 84e: 90 e0 ldi r25, 0x00 ; 0 850: 82 2b or r24, r18 852: 93 2b or r25, r19 frameControlField |= SECURITY_ENABLED_MASK; 854: 98 60 ori r25, 0x08 ; 8 *(startOfFrame) = (uint8_t) (frameControlField >> 8); 856: 90 83 st Z, r25 *(startOfFrame + 1) = (uint8_t) frameControlField; 858: 81 83 std Z+1, r24 ; 0x01 } 85a: 08 95 ret 0000085c : void setFramePendingFlag(volatile uint8_t* startOfFrame){ 85c: fc 01 movw r30, r24 uint16_t frameControlField; frameControlField = (((uint16_t)*(startOfFrame)) << 8); 85e: 80 81 ld r24, Z 860: 38 2f mov r19, r24 862: 20 e0 ldi r18, 0x00 ; 0 frameControlField |= (uint16_t) *(startOfFrame+1); 864: 81 81 ldd r24, Z+1 ; 0x01 866: 90 e0 ldi r25, 0x00 ; 0 868: 82 2b or r24, r18 86a: 93 2b or r25, r19 frameControlField |= FRAME_PENDING_MASK; 86c: 90 61 ori r25, 0x10 ; 16 *(startOfFrame) = (uint8_t)(frameControlField >> 8); 86e: 90 83 st Z, r25 *(startOfFrame+1) = (uint8_t) frameControlField; 870: 81 83 std Z+1, r24 ; 0x01 } 872: 08 95 ret 00000874 : void setACKRequestFlag(volatile uint8_t* startOfFrame){ 874: fc 01 movw r30, r24 uint16_t frameControlField; frameControlField = (((uint16_t) *(startOfFrame)) << 8); 876: 80 81 ld r24, Z 878: 38 2f mov r19, r24 87a: 20 e0 ldi r18, 0x00 ; 0 frameControlField |= (uint16_t) *(startOfFrame + 1); 87c: 81 81 ldd r24, Z+1 ; 0x01 87e: 90 e0 ldi r25, 0x00 ; 0 880: 82 2b or r24, r18 882: 93 2b or r25, r19 frameControlField |= ACK_REQUEST_MASK; 884: 90 62 ori r25, 0x20 ; 32 *(startOfFrame) = (uint8_t) (frameControlField >> 8); 886: 90 83 st Z, r25 *(startOfFrame + 1) = (uint8_t) frameControlField; 888: 81 83 std Z+1, r24 ; 0x01 } 88a: 08 95 ret 0000088c : setSourceAddress(startOfFrame, TEST_ADDR_SHORT_TX); setAppCommandByte(startOfFrame, TEST_FRAME); setRandomPayload(startOfFrame, length); } void writeChannelChangeFrame(volatile uint8_t* startOfFrame, uint8_t frame_number, uint8_t length){ 88c: ef 92 push r14 88e: ff 92 push r15 890: 0f 93 push r16 892: 1f 93 push r17 894: 8c 01 movw r16, r24 896: e6 2e mov r14, r22 898: f4 2e mov r15, r20 setFrameLength(startOfFrame, (uint8_t)(LENGTH_MAC_HDR + length)); 89a: 8e e0 ldi r24, 0x0E ; 14 89c: f8 0e add r15, r24 setAppCommandByte(startOfFrame, CHANNEL_CHANGE); setRandomPayload(startOfFrame, length); } void setFrameLength(volatile uint8_t* startOfFrame, uint8_t length){ *(startOfFrame-1) = length; 89e: f8 01 movw r30, r16 8a0: f2 92 st -Z, r15 8a2: 8f 01 movw r16, r30 8a4: f2 ef ldi r31, 0xF2 ; 242 8a6: ff 0e add r15, r31 8a8: 0f 5f subi r16, 0xFF ; 255 8aa: 1f 4f sbci r17, 0xFF ; 255 org=((org>>2)&0x33)|((org<<2)&0xcc); return (org>>4)|(org<<4); } void writeFrameControlField (volatile uint8_t* startOfFrame, uint16_t frameControlFieldValue){ *(startOfFrame) = (uint8_t)(frameControlFieldValue >> 8); 8ac: 81 e0 ldi r24, 0x01 ; 1 8ae: f8 01 movw r30, r16 8b0: 80 83 st Z, r24 *(startOfFrame+1) = (uint8_t)(frameControlFieldValue); 8b2: 11 82 std Z+1, r1 ; 0x01 /* SET operations*/ void setFrameType(volatile uint8_t* startOfFrame, uint8_t frameType){ uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame); 8b4: 80 81 ld r24, Z frameControlFieldL &= ~(((uint16_t)FRAMETYPE_MASK) >> 8); 8b6: 88 7f andi r24, 0xF8 ; 248 frameControlFieldL |= (frameType)&(((uint16_t)FRAMETYPE_MASK) >> 8); 8b8: 81 60 ori r24, 0x01 ; 1 *(startOfFrame) = frameControlFieldL; 8ba: 80 83 st Z, r24 void writeChannelChangeFrame(volatile uint8_t* startOfFrame, uint8_t frame_number, uint8_t length){ setFrameLength(startOfFrame, (uint8_t)(LENGTH_MAC_HDR + length)); writeFrameControlField(startOfFrame, STANDARD_FRAME_CONTROL_FIELD); setFrameType(startOfFrame,DATA_FRAME); setACKRequestFlag(startOfFrame); 8bc: c8 01 movw r24, r16 8be: 0e 94 3a 04 call 0x874 ; 0x874 void setDestinationAddressingMode(volatile uint8_t* startOfFrame, uint8_t addrMode){ uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame+1); 8c2: f8 01 movw r30, r16 8c4: 81 81 ldd r24, Z+1 ; 0x01 frameControlFieldL &= ~(DEST_ADDR_MODE_MASK); frameControlFieldL |= (addrMode << 2)&(DEST_ADDR_MODE_MASK); 8c6: 83 7f andi r24, 0xF3 ; 243 8c8: 88 60 ori r24, 0x08 ; 8 *(startOfFrame+1) = (uint8_t) frameControlFieldL; 8ca: 81 83 std Z+1, r24 ; 0x01 } void setFrameVersion(volatile uint8_t* startOfFrame, uint8_t version){ uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame+1); 8cc: 81 81 ldd r24, Z+1 ; 0x01 frameControlFieldL &= ~(FRAME_VERSION_MASK); 8ce: 8f 7c andi r24, 0xCF ; 207 frameControlFieldL |= (version << 4)&(FRAME_VERSION_MASK); *(startOfFrame+1) = (uint8_t) frameControlFieldL; 8d0: 81 83 std Z+1, r24 ; 0x01 } void setSourceAddressingMode(volatile uint8_t* startOfFrame, uint8_t addrMode){ uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame+1); 8d2: 81 81 ldd r24, Z+1 ; 0x01 frameControlFieldL &= ~(SRC_ADDR_MODE_MASK); frameControlFieldL |= (addrMode << 6)&(SRC_ADDR_MODE_MASK); 8d4: 8f 73 andi r24, 0x3F ; 63 8d6: 80 68 ori r24, 0x80 ; 128 *(startOfFrame+1) = (uint8_t) frameControlFieldL; 8d8: 81 83 std Z+1, r24 ; 0x01 } void setSequenceNumber(volatile uint8_t* startOfFrame, uint8_t seqNumber){ *(startOfFrame + 2) = seqNumber; 8da: e2 82 std Z+2, r14 ; 0x02 } void setDestinationPANID(volatile uint8_t* startOfFrame, uint16_t destPAN){ *(startOfFrame + 3) = (uint8_t) destPAN; 8dc: 9e ef ldi r25, 0xFE ; 254 8de: 93 83 std Z+3, r25 ; 0x03 *(startOfFrame + 4) = (uint8_t) (destPAN >> 8); 8e0: 2a ec ldi r18, 0xCA ; 202 8e2: 24 83 std Z+4, r18 ; 0x04 } void setDestinationAddress(volatile uint8_t* startOfFrame, uint16_t destAddr){ *(startOfFrame + 5) = (uint8_t) destAddr; 8e4: 95 83 std Z+5, r25 ; 0x05 *(startOfFrame + 6) = (uint8_t) (destAddr >> 8); 8e6: 8f ea ldi r24, 0xAF ; 175 8e8: 86 83 std Z+6, r24 ; 0x06 } void setSourcePANID(volatile uint8_t* startOfFrame, uint16_t srcPAN){ *(startOfFrame + 7) = (uint8_t) srcPAN; 8ea: 97 83 std Z+7, r25 ; 0x07 *(startOfFrame + 8) = (uint8_t) (srcPAN >> 8); 8ec: 20 87 std Z+8, r18 ; 0x08 } void setSourceAddress(volatile uint8_t* startOfFrame, uint16_t srcAddr){ *(startOfFrame + 9) = (uint8_t) srcAddr; 8ee: 91 87 std Z+9, r25 ; 0x09 *(startOfFrame + 10) = (uint8_t) (srcAddr >> 8); 8f0: 92 87 std Z+10, r25 ; 0x0a } void setAppCommandByte(volatile uint8_t* startOfFrame, uint8_t command){ *(startOfFrame + 11) = command; 8f2: 8c ec ldi r24, 0xCC ; 204 8f4: 83 87 std Z+11, r24 ; 0x0b 8f6: 3c 96 adiw r30, 0x0c ; 12 8f8: 80 e0 ldi r24, 0x00 ; 0 8fa: 90 e0 ldi r25, 0x00 ; 0 } void setRandomPayload(volatile uint8_t* startOfFrame, uint8_t length){ for (int var = 0; var < length; ++var) { 8fc: 2f 2d mov r18, r15 8fe: 30 e0 ldi r19, 0x00 ; 0 *(startOfFrame + 12 + var) = 0xFF; 900: 4f ef ldi r20, 0xFF ; 255 902: 02 c0 rjmp .+4 ; 0x908 904: 41 93 st Z+, r20 void setAppCommandByte(volatile uint8_t* startOfFrame, uint8_t command){ *(startOfFrame + 11) = command; } void setRandomPayload(volatile uint8_t* startOfFrame, uint8_t length){ for (int var = 0; var < length; ++var) { 906: 01 96 adiw r24, 0x01 ; 1 908: 82 17 cp r24, r18 90a: 93 07 cpc r25, r19 90c: dc f3 brlt .-10 ; 0x904 setDestinationAddress(startOfFrame, TEST_ADDR_SHORT_RX); setSourcePANID(startOfFrame, TEST_PANID); setSourceAddress(startOfFrame, TEST_ADDR_SHORT_TX); setAppCommandByte(startOfFrame, CHANNEL_CHANGE); setRandomPayload(startOfFrame, length); } 90e: 1f 91 pop r17 910: 0f 91 pop r16 912: ff 90 pop r15 914: ef 90 pop r14 916: 08 95 ret 00000918 : frameControlField |= ACK_REQUEST_MASK; *(startOfFrame) = (uint8_t) (frameControlField >> 8); *(startOfFrame + 1) = (uint8_t) frameControlField; } void setIntraPANFlag(volatile uint8_t* startOfFrame){ 918: fc 01 movw r30, r24 uint16_t frameControlField; frameControlField = (((uint16_t) *(startOfFrame)) << 8); 91a: 80 81 ld r24, Z 91c: 38 2f mov r19, r24 91e: 20 e0 ldi r18, 0x00 ; 0 frameControlField |= (uint16_t) *(startOfFrame + 1); 920: 81 81 ldd r24, Z+1 ; 0x01 922: 90 e0 ldi r25, 0x00 ; 0 924: 82 2b or r24, r18 926: 93 2b or r25, r19 frameControlField |= INTRA_PAN_MASK; 928: 90 64 ori r25, 0x40 ; 64 *(startOfFrame) = (uint8_t) (frameControlField >> 8); 92a: 90 83 st Z, r25 *(startOfFrame + 1) = (uint8_t) frameControlField; 92c: 81 83 std Z+1, r24 ; 0x01 } 92e: 08 95 ret 00000930 : void setDestinationAddressingMode(volatile uint8_t* startOfFrame, uint8_t addrMode){ 930: fc 01 movw r30, r24 uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame+1); 932: 81 81 ldd r24, Z+1 ; 0x01 frameControlFieldL &= ~(DEST_ADDR_MODE_MASK); frameControlFieldL |= (addrMode << 2)&(DEST_ADDR_MODE_MASK); 934: 66 0f add r22, r22 936: 66 0f add r22, r22 938: 6c 70 andi r22, 0x0C ; 12 93a: 83 7f andi r24, 0xF3 ; 243 93c: 86 2b or r24, r22 *(startOfFrame+1) = (uint8_t) frameControlFieldL; 93e: 81 83 std Z+1, r24 ; 0x01 } 940: 08 95 ret 00000942 : void setFrameVersion(volatile uint8_t* startOfFrame, uint8_t version){ 942: fc 01 movw r30, r24 uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame+1); 944: 81 81 ldd r24, Z+1 ; 0x01 frameControlFieldL &= ~(FRAME_VERSION_MASK); frameControlFieldL |= (version << 4)&(FRAME_VERSION_MASK); 946: 62 95 swap r22 948: 60 73 andi r22, 0x30 ; 48 94a: 8f 7c andi r24, 0xCF ; 207 94c: 86 2b or r24, r22 *(startOfFrame+1) = (uint8_t) frameControlFieldL; 94e: 81 83 std Z+1, r24 ; 0x01 } 950: 08 95 ret 00000952 : void setSourceAddressingMode(volatile uint8_t* startOfFrame, uint8_t addrMode){ 952: fc 01 movw r30, r24 uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame+1); 954: 81 81 ldd r24, Z+1 ; 0x01 frameControlFieldL &= ~(SRC_ADDR_MODE_MASK); frameControlFieldL |= (addrMode << 6)&(SRC_ADDR_MODE_MASK); 956: 62 95 swap r22 958: 66 0f add r22, r22 95a: 66 0f add r22, r22 95c: 60 7c andi r22, 0xC0 ; 192 95e: 8f 73 andi r24, 0x3F ; 63 960: 86 2b or r24, r22 *(startOfFrame+1) = (uint8_t) frameControlFieldL; 962: 81 83 std Z+1, r24 ; 0x01 } 964: 08 95 ret 00000966 : void setSequenceNumber(volatile uint8_t* startOfFrame, uint8_t seqNumber){ 966: fc 01 movw r30, r24 *(startOfFrame + 2) = seqNumber; 968: 62 83 std Z+2, r22 ; 0x02 } 96a: 08 95 ret 0000096c : void setDestinationPANID(volatile uint8_t* startOfFrame, uint16_t destPAN){ 96c: fc 01 movw r30, r24 *(startOfFrame + 3) = (uint8_t) destPAN; 96e: 63 83 std Z+3, r22 ; 0x03 *(startOfFrame + 4) = (uint8_t) (destPAN >> 8); 970: 74 83 std Z+4, r23 ; 0x04 } 972: 08 95 ret 00000974 : void setDestinationAddress(volatile uint8_t* startOfFrame, uint16_t destAddr){ 974: fc 01 movw r30, r24 *(startOfFrame + 5) = (uint8_t) destAddr; 976: 65 83 std Z+5, r22 ; 0x05 *(startOfFrame + 6) = (uint8_t) (destAddr >> 8); 978: 76 83 std Z+6, r23 ; 0x06 } 97a: 08 95 ret 0000097c : void setSourcePANID(volatile uint8_t* startOfFrame, uint16_t srcPAN){ 97c: fc 01 movw r30, r24 *(startOfFrame + 7) = (uint8_t) srcPAN; 97e: 67 83 std Z+7, r22 ; 0x07 *(startOfFrame + 8) = (uint8_t) (srcPAN >> 8); 980: 70 87 std Z+8, r23 ; 0x08 } 982: 08 95 ret 00000984 : void setSourceAddress(volatile uint8_t* startOfFrame, uint16_t srcAddr){ 984: fc 01 movw r30, r24 *(startOfFrame + 9) = (uint8_t) srcAddr; 986: 61 87 std Z+9, r22 ; 0x09 *(startOfFrame + 10) = (uint8_t) (srcAddr >> 8); 988: 72 87 std Z+10, r23 ; 0x0a } 98a: 08 95 ret 0000098c : void setAppCommandByte(volatile uint8_t* startOfFrame, uint8_t command){ 98c: fc 01 movw r30, r24 *(startOfFrame + 11) = command; 98e: 63 87 std Z+11, r22 ; 0x0b } 990: 08 95 ret 00000992 : void setRandomPayload(volatile uint8_t* startOfFrame, uint8_t length){ 992: fc 01 movw r30, r24 994: 3c 96 adiw r30, 0x0c ; 12 996: 80 e0 ldi r24, 0x00 ; 0 998: 90 e0 ldi r25, 0x00 ; 0 for (int var = 0; var < length; ++var) { 99a: 70 e0 ldi r23, 0x00 ; 0 *(startOfFrame + 12 + var) = 0xFF; 99c: 2f ef ldi r18, 0xFF ; 255 99e: 02 c0 rjmp .+4 ; 0x9a4 9a0: 21 93 st Z+, r18 void setAppCommandByte(volatile uint8_t* startOfFrame, uint8_t command){ *(startOfFrame + 11) = command; } void setRandomPayload(volatile uint8_t* startOfFrame, uint8_t length){ for (int var = 0; var < length; ++var) { 9a2: 01 96 adiw r24, 0x01 ; 1 9a4: 86 17 cp r24, r22 9a6: 97 07 cpc r25, r23 9a8: dc f3 brlt .-10 ; 0x9a0 *(startOfFrame + 12 + var) = 0xFF; } } 9aa: 08 95 ret 000009ac : void clearSecurityEnabledFlag(volatile uint8_t* startOfFrame) { 9ac: fc 01 movw r30, r24 uint16_t frameControlField; frameControlField = (((uint16_t) *(startOfFrame)) << 8); 9ae: 80 81 ld r24, Z 9b0: 38 2f mov r19, r24 9b2: 20 e0 ldi r18, 0x00 ; 0 frameControlField |= (uint16_t) *(startOfFrame + 1); 9b4: 81 81 ldd r24, Z+1 ; 0x01 9b6: 90 e0 ldi r25, 0x00 ; 0 9b8: 82 2b or r24, r18 9ba: 93 2b or r25, r19 frameControlField &= ~SECURITY_ENABLED_MASK; 9bc: 97 7f andi r25, 0xF7 ; 247 *(startOfFrame) = (uint8_t) (frameControlField >> 8); 9be: 90 83 st Z, r25 *(startOfFrame + 1) = (uint8_t) frameControlField; 9c0: 81 83 std Z+1, r24 ; 0x01 } 9c2: 08 95 ret 000009c4 : void clearFramePendingFlag(volatile uint8_t* startOfFrame){ 9c4: fc 01 movw r30, r24 uint16_t frameControlField; frameControlField = (((uint16_t)*(startOfFrame)) << 8); 9c6: 80 81 ld r24, Z 9c8: 38 2f mov r19, r24 9ca: 20 e0 ldi r18, 0x00 ; 0 frameControlField |= (uint16_t) *(startOfFrame+1); 9cc: 81 81 ldd r24, Z+1 ; 0x01 9ce: 90 e0 ldi r25, 0x00 ; 0 9d0: 82 2b or r24, r18 9d2: 93 2b or r25, r19 frameControlField &= ~((uint16_t)FRAME_PENDING_MASK); 9d4: 9f 7e andi r25, 0xEF ; 239 *(startOfFrame) = (uint8_t)(frameControlField >> 8); 9d6: 90 83 st Z, r25 *(startOfFrame+1) = (uint8_t) frameControlField; 9d8: 81 83 std Z+1, r24 ; 0x01 } 9da: 08 95 ret 000009dc : void clearACKRequestFlag(volatile uint8_t* startOfFrame){ 9dc: fc 01 movw r30, r24 uint16_t frameControlField; frameControlField = (((uint16_t)*(startOfFrame)) << 8); 9de: 80 81 ld r24, Z 9e0: 38 2f mov r19, r24 9e2: 20 e0 ldi r18, 0x00 ; 0 frameControlField |= (uint16_t) *(startOfFrame+1); 9e4: 81 81 ldd r24, Z+1 ; 0x01 9e6: 90 e0 ldi r25, 0x00 ; 0 9e8: 82 2b or r24, r18 9ea: 93 2b or r25, r19 frameControlField &= ~((uint16_t)ACK_REQUEST_MASK); 9ec: 9f 7d andi r25, 0xDF ; 223 *(startOfFrame) = (uint8_t)(frameControlField >> 8); 9ee: 90 83 st Z, r25 *(startOfFrame+1) = (uint8_t) frameControlField; 9f0: 81 83 std Z+1, r24 ; 0x01 } 9f2: 08 95 ret 000009f4 : void clearIntraPANFlag(volatile uint8_t* startOfFrame){ 9f4: fc 01 movw r30, r24 uint16_t frameControlField; frameControlField = (((uint16_t)*(startOfFrame)) << 8); 9f6: 80 81 ld r24, Z 9f8: 38 2f mov r19, r24 9fa: 20 e0 ldi r18, 0x00 ; 0 frameControlField |= (uint16_t) *(startOfFrame+1); 9fc: 81 81 ldd r24, Z+1 ; 0x01 9fe: 90 e0 ldi r25, 0x00 ; 0 a00: 82 2b or r24, r18 a02: 93 2b or r25, r19 frameControlField &= ~((uint16_t)INTRA_PAN_MASK); a04: 9f 7b andi r25, 0xBF ; 191 *(startOfFrame) = (uint8_t)(frameControlField >> 8); a06: 90 83 st Z, r25 *(startOfFrame+1) = (uint8_t) frameControlField; a08: 81 83 std Z+1, r24 ; 0x01 } a0a: 08 95 ret 00000a0c : /* GET operations*/ uint8_t getFrameType(volatile uint8_t* startOfFrame){ a0c: fc 01 movw r30, r24 uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame); a0e: 80 81 ld r24, Z frameControlFieldL &= (FRAMETYPE_MASK >> 8); return (frameControlFieldL >> FRAMETYPE_POS); } a10: 87 70 andi r24, 0x07 ; 7 a12: 08 95 ret 00000a14 : uint8_t getSecurityEnabledFlag(volatile uint8_t* startOfFrame){ a14: fc 01 movw r30, r24 uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame); a16: 80 81 ld r24, Z a18: 88 70 andi r24, 0x08 ; 8 frameControlFieldL &= (SECURITY_ENABLED_MASK >> 8); return (frameControlFieldL >> SECURITY_ENABLED_POS); } a1a: 86 95 lsr r24 a1c: 86 95 lsr r24 a1e: 86 95 lsr r24 a20: 08 95 ret 00000a22 : uint8_t getFramePendingFlag(volatile uint8_t* startOfFrame){ a22: fc 01 movw r30, r24 uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame); a24: 80 81 ld r24, Z a26: 80 71 andi r24, 0x10 ; 16 frameControlFieldL &= (FRAME_PENDING_MASK >> 8); return (frameControlFieldL >> FRAME_PENDING_POS); } a28: 82 95 swap r24 a2a: 8f 70 andi r24, 0x0F ; 15 a2c: 08 95 ret 00000a2e : uint8_t getACKRequestFlag(volatile uint8_t* startOfFrame){ a2e: fc 01 movw r30, r24 uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame); a30: 80 81 ld r24, Z a32: 80 72 andi r24, 0x20 ; 32 frameControlFieldL &= (ACK_REQUEST_MASK >> 8); return (frameControlFieldL >> ACK_REQUEST_POS); } a34: 82 95 swap r24 a36: 86 95 lsr r24 a38: 87 70 andi r24, 0x07 ; 7 a3a: 08 95 ret 00000a3c : uint8_t getIntraPANFlag(volatile uint8_t* startOfFrame){ a3c: fc 01 movw r30, r24 uint8_t frameControlFieldL; frameControlFieldL = *(startOfFrame); a3e: 80 81 ld r24, Z a40: 80 74 andi r24, 0x40 ; 64 frameControlFieldL &= (INTRA_PAN_MASK >> 8); return (frameControlFieldL >> INTRA_PAN_POS); } a42: 82 95 swap r24 a44: 86 95 lsr r24 a46: 86 95 lsr r24 a48: 83 70 andi r24, 0x03 ; 3 a4a: 08 95 ret 00000a4c : uint8_t getDestinationAddressingMode(volatile uint8_t* startOfFrame){ a4c: fc 01 movw r30, r24 uint8_t frameControlFieldH; frameControlFieldH = *(startOfFrame+1); a4e: 81 81 ldd r24, Z+1 ; 0x01 frameControlFieldH &= (DEST_ADDR_MODE_MASK >> 8); return (frameControlFieldH >> DEST_ADDR_MODE_POS); } a50: 80 e0 ldi r24, 0x00 ; 0 a52: 08 95 ret 00000a54 : uint8_t getFrameVersion(volatile uint8_t* startOfFrame){ a54: fc 01 movw r30, r24 uint8_t frameControlFieldH; frameControlFieldH = *(startOfFrame + 1); a56: 81 81 ldd r24, Z+1 ; 0x01 frameControlFieldH &= (FRAME_VERSION_MASK >> 8); return (frameControlFieldH >> FRAME_VERSION_POS); } a58: 80 e0 ldi r24, 0x00 ; 0 a5a: 08 95 ret 00000a5c : uint8_t getSourceAddressingMode(volatile uint8_t* startOfFrame){ a5c: fc 01 movw r30, r24 uint8_t frameControlFieldH; frameControlFieldH = *(startOfFrame + 1); a5e: 81 81 ldd r24, Z+1 ; 0x01 frameControlFieldH &= (SRC_ADDR_MODE_MASK >> 8); return (frameControlFieldH >> SRC_ADDR_MODE_POS); } a60: 80 e0 ldi r24, 0x00 ; 0 a62: 08 95 ret 00000a64 : uint8_t getSequenceNumber(volatile uint8_t* startOfFrame){ a64: fc 01 movw r30, r24 return(*(startOfFrame + 2)); a66: 82 81 ldd r24, Z+2 ; 0x02 } a68: 08 95 ret 00000a6a : uint16_t getDestinationPANID(volatile uint8_t* startOfFrame){ a6a: fc 01 movw r30, r24 uint16_t destPan; destPan = *(startOfFrame + 3); a6c: 23 81 ldd r18, Z+3 ; 0x03 a6e: 30 e0 ldi r19, 0x00 ; 0 destPan |= ((uint16_t)*(startOfFrame + 4) << 8); a70: 44 81 ldd r20, Z+4 ; 0x04 a72: 94 2f mov r25, r20 a74: 80 e0 ldi r24, 0x00 ; 0 a76: 28 2b or r18, r24 a78: 39 2b or r19, r25 return destPan; } a7a: c9 01 movw r24, r18 a7c: 08 95 ret 00000a7e : uint16_t getDestinationAddress(volatile uint8_t* startOfFrame){ a7e: fc 01 movw r30, r24 uint16_t destAddr; destAddr = *(startOfFrame + 5); a80: 25 81 ldd r18, Z+5 ; 0x05 a82: 30 e0 ldi r19, 0x00 ; 0 destAddr |= ((uint16_t)*(startOfFrame + 6) << 8); a84: 46 81 ldd r20, Z+6 ; 0x06 a86: 94 2f mov r25, r20 a88: 80 e0 ldi r24, 0x00 ; 0 a8a: 28 2b or r18, r24 a8c: 39 2b or r19, r25 return destAddr; } a8e: c9 01 movw r24, r18 a90: 08 95 ret 00000a92 : uint16_t getSourcePANID(volatile uint8_t* startOfFrame){ a92: fc 01 movw r30, r24 uint16_t srcPan; srcPan = *(startOfFrame + 7); a94: 27 81 ldd r18, Z+7 ; 0x07 a96: 30 e0 ldi r19, 0x00 ; 0 srcPan |= ((uint16_t)*(startOfFrame + 8) << 8); a98: 40 85 ldd r20, Z+8 ; 0x08 a9a: 94 2f mov r25, r20 a9c: 80 e0 ldi r24, 0x00 ; 0 a9e: 28 2b or r18, r24 aa0: 39 2b or r19, r25 return srcPan; } aa2: c9 01 movw r24, r18 aa4: 08 95 ret 00000aa6 : uint16_t getSourceAddress(volatile uint8_t* startOfFrame){ aa6: fc 01 movw r30, r24 uint16_t srcAddr; srcAddr = *(startOfFrame + 9); aa8: 21 85 ldd r18, Z+9 ; 0x09 aaa: 30 e0 ldi r19, 0x00 ; 0 srcAddr |= ((uint16_t)*(startOfFrame + 10) << 8); aac: 42 85 ldd r20, Z+10 ; 0x0a aae: 94 2f mov r25, r20 ab0: 80 e0 ldi r24, 0x00 ; 0 ab2: 28 2b or r18, r24 ab4: 39 2b or r19, r25 return srcAddr; } ab6: c9 01 movw r24, r18 ab8: 08 95 ret 00000aba : uint8_t getAppCommandByte(volatile uint8_t* startOfFrame){ aba: fc 01 movw r30, r24 return(*(startOfFrame + 11)); abc: 83 85 ldd r24, Z+11 ; 0x0b } abe: 08 95 ret 00000ac0 : uint8_t getLQI(volatile uint8_t* lastbyte){ ac0: fc 01 movw r30, r24 return(*lastbyte); ac2: 80 81 ld r24, Z } ac4: 08 95 ret 00000ac6 <__vector_25>: ISR(USART0_RX_vect) /************************************************************************* Function: UART Receive Complete interrupt Purpose: called when the UART has received a character **************************************************************************/ { ac6: 1f 92 push r1 ac8: 0f 92 push r0 aca: 0f b6 in r0, 0x3f ; 63 acc: 0f 92 push r0 ace: 0b b6 in r0, 0x3b ; 59 ad0: 0f 92 push r0 ad2: 11 24 eor r1, r1 ad4: 2f 93 push r18 ad6: 8f 93 push r24 ad8: 9f 93 push r25 ada: ef 93 push r30 adc: ff 93 push r31 unsigned char usr; unsigned char lastRxError; /* read UART status register and UART data register */ usr = UART0_STATUS; ade: 90 91 c0 00 lds r25, 0x00C0 data = UART0_DATA; ae2: 20 91 c6 00 lds r18, 0x00C6 #elif defined ( ATMEGA_UART ) lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); #endif /* calculate buffer index */ tmphead = ( UART_RxHead + 1) & UART_RX_BUFFER_MASK; ae6: e0 91 8b 03 lds r30, 0x038B aea: ef 5f subi r30, 0xFF ; 255 aec: ef 71 andi r30, 0x1F ; 31 if ( tmphead == UART_RxTail ) { aee: 80 91 8c 03 lds r24, 0x038C af2: e8 17 cp r30, r24 af4: 11 f4 brne .+4 ; 0xafa <__vector_25+0x34> af6: 82 e0 ldi r24, 0x02 ; 2 af8: 08 c0 rjmp .+16 ; 0xb0a <__vector_25+0x44> #if defined( AT90_UART ) lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); #elif defined( ATMEGA_USART ) lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); #elif defined( ATMEGA_USART0 ) lastRxError = (usr & (_BV(FE0)|_BV(DOR0)) ); afa: 89 2f mov r24, r25 afc: 88 71 andi r24, 0x18 ; 24 if ( tmphead == UART_RxTail ) { /* error: receive buffer overflow */ lastRxError = UART_BUFFER_OVERFLOW >> 8; }else{ /* store new index */ UART_RxHead = tmphead; afe: e0 93 8b 03 sts 0x038B, r30 /* store received data in buffer */ UART_RxBuf[tmphead] = data; b02: f0 e0 ldi r31, 0x00 ; 0 b04: e7 59 subi r30, 0x97 ; 151 b06: fc 4f sbci r31, 0xFC ; 252 b08: 20 83 st Z, r18 } UART_LastRxError = lastRxError; b0a: 80 93 8d 03 sts 0x038D, r24 } b0e: ff 91 pop r31 b10: ef 91 pop r30 b12: 9f 91 pop r25 b14: 8f 91 pop r24 b16: 2f 91 pop r18 b18: 0f 90 pop r0 b1a: 0b be out 0x3b, r0 ; 59 b1c: 0f 90 pop r0 b1e: 0f be out 0x3f, r0 ; 63 b20: 0f 90 pop r0 b22: 1f 90 pop r1 b24: 18 95 reti 00000b26 <__vector_26>: ISR(UART0_TRANSMIT_INTERRUPT) /************************************************************************* Function: UART Data Register Empty interrupt Purpose: called when the UART is ready to transmit the next byte **************************************************************************/ { b26: 1f 92 push r1 b28: 0f 92 push r0 b2a: 0f b6 in r0, 0x3f ; 63 b2c: 0f 92 push r0 b2e: 0b b6 in r0, 0x3b ; 59 b30: 0f 92 push r0 b32: 11 24 eor r1, r1 b34: 8f 93 push r24 b36: 9f 93 push r25 b38: ef 93 push r30 b3a: ff 93 push r31 unsigned char tmptail; if ( UART_TxHead != UART_TxTail) { b3c: 90 91 89 03 lds r25, 0x0389 b40: 80 91 8a 03 lds r24, 0x038A b44: 98 17 cp r25, r24 b46: 69 f0 breq .+26 ; 0xb62 <__vector_26+0x3c> /* calculate and store new buffer index */ tmptail = (UART_TxTail + 1) & UART_TX_BUFFER_MASK; b48: e0 91 8a 03 lds r30, 0x038A b4c: ef 5f subi r30, 0xFF ; 255 b4e: ef 71 andi r30, 0x1F ; 31 UART_TxTail = tmptail; b50: e0 93 8a 03 sts 0x038A, r30 /* get one byte from buffer and write it to UART */ UART0_DATA = UART_TxBuf[tmptail]; /* start transmission */ b54: f0 e0 ldi r31, 0x00 ; 0 b56: e7 5b subi r30, 0xB7 ; 183 b58: fc 4f sbci r31, 0xFC ; 252 b5a: 80 81 ld r24, Z b5c: 80 93 c6 00 sts 0x00C6, r24 b60: 05 c0 rjmp .+10 ; 0xb6c <__vector_26+0x46> }else{ /* tx buffer empty, disable UDRE interrupt */ UART0_CONTROL &= ~_BV(UART0_UDRIE); b62: 80 91 c1 00 lds r24, 0x00C1 b66: 8f 7d andi r24, 0xDF ; 223 b68: 80 93 c1 00 sts 0x00C1, r24 } } b6c: ff 91 pop r31 b6e: ef 91 pop r30 b70: 9f 91 pop r25 b72: 8f 91 pop r24 b74: 0f 90 pop r0 b76: 0b be out 0x3b, r0 ; 59 b78: 0f 90 pop r0 b7a: 0f be out 0x3f, r0 ; 63 b7c: 0f 90 pop r0 b7e: 1f 90 pop r1 b80: 18 95 reti 00000b82 : Purpose: initialize UART and set baudrate Input: baudrate using macro UART_BAUD_SELECT() Returns: none **************************************************************************/ extern void uart_init(unsigned int baudrate) { b82: 9c 01 movw r18, r24 UART_TxHead = 0; b84: 10 92 89 03 sts 0x0389, r1 UART_TxTail = 0; b88: 10 92 8a 03 sts 0x038A, r1 UART_RxHead = 0; b8c: 10 92 8b 03 sts 0x038B, r1 UART_RxTail = 0; b90: 10 92 8c 03 sts 0x038C, r1 UCSRC = (3< { UART0_STATUS = (1<>8); ba0: 30 93 c5 00 sts 0x00C5, r19 UBRR0L = (unsigned char) baudrate; ba4: 20 93 c4 00 sts 0x00C4, r18 /* Enable USART receiver and transmitter and receive complete interrupt */ UART0_CONTROL = _BV(RXCIE0)|(1<: { unsigned char tmptail; unsigned char data; if ( UART_RxHead == UART_RxTail ) { bb6: 90 91 8b 03 lds r25, 0x038B bba: 80 91 8c 03 lds r24, 0x038C bbe: 98 17 cp r25, r24 bc0: 19 f4 brne .+6 ; 0xbc8 bc2: 20 e0 ldi r18, 0x00 ; 0 bc4: 31 e0 ldi r19, 0x01 ; 1 bc6: 12 c0 rjmp .+36 ; 0xbec return UART_NO_DATA; /* no data available */ } /* calculate /store buffer index */ tmptail = (UART_RxTail + 1) & UART_RX_BUFFER_MASK; bc8: e0 91 8c 03 lds r30, 0x038C bcc: ef 5f subi r30, 0xFF ; 255 bce: ef 71 andi r30, 0x1F ; 31 UART_RxTail = tmptail; bd0: e0 93 8c 03 sts 0x038C, r30 /* get data from receive buffer */ data = UART_RxBuf[tmptail]; bd4: f0 e0 ldi r31, 0x00 ; 0 bd6: e7 59 subi r30, 0x97 ; 151 bd8: fc 4f sbci r31, 0xFC ; 252 bda: 30 81 ld r19, Z return (UART_LastRxError << 8) + data; bdc: 20 91 8d 03 lds r18, 0x038D be0: 92 2f mov r25, r18 be2: 80 e0 ldi r24, 0x00 ; 0 be4: ac 01 movw r20, r24 be6: 43 0f add r20, r19 be8: 51 1d adc r21, r1 bea: 9a 01 movw r18, r20 }/* uart_getc */ bec: c9 01 movw r24, r18 bee: 08 95 ret 00000bf0 : Function: uart_writeByte() Purpose: write byte to ringbuffer for transmitting via UART Input: byte to be transmitted Returns: none **************************************************************************/ void uart_writeByte(char data) { bf0: 28 2f mov r18, r24 unsigned char tmphead; tmphead = (UART_TxHead + 1) & UART_TX_BUFFER_MASK; bf2: 90 91 89 03 lds r25, 0x0389 bf6: 9f 5f subi r25, 0xFF ; 255 bf8: 9f 71 andi r25, 0x1F ; 31 while (tmphead == UART_TxTail) { bfa: 80 91 8a 03 lds r24, 0x038A bfe: 98 17 cp r25, r24 c00: e1 f3 breq .-8 ; 0xbfa ;/* wait for free space in buffer */ } UART_TxBuf[tmphead] = data; c02: e9 2f mov r30, r25 c04: f0 e0 ldi r31, 0x00 ; 0 c06: e7 5b subi r30, 0xB7 ; 183 c08: fc 4f sbci r31, 0xFC ; 252 c0a: 20 83 st Z, r18 UART_TxHead = tmphead; c0c: 90 93 89 03 sts 0x0389, r25 /* enable UDRE interrupt */ UART0_CONTROL |= _BV(UART0_UDRIE); c10: 80 91 c1 00 lds r24, 0x00C1 c14: 80 62 ori r24, 0x20 ; 32 c16: 80 93 c1 00 sts 0x00C1, r24 }/* uart_writeByte */ c1a: 08 95 ret 00000c1c : Purpose: transmit string to UART Input: string to be transmitted Returns: none **************************************************************************/ void uart_writeString(const char *s ) { c1c: cf 93 push r28 c1e: df 93 push r29 c20: ec 01 movw r28, r24 c22: 03 c0 rjmp .+6 ; 0xc2a while (*s) uart_writeByte(*s++); c24: 21 96 adiw r28, 0x01 ; 1 c26: 0e 94 f8 05 call 0xbf0 ; 0xbf0 Input: string to be transmitted Returns: none **************************************************************************/ void uart_writeString(const char *s ) { while (*s) c2a: 88 81 ld r24, Y c2c: 88 23 and r24, r24 c2e: d1 f7 brne .-12 ; 0xc24 // { // break; // } // uart_writeByte(s[i]); // } }/* uart_writeString */ c30: df 91 pop r29 c32: cf 91 pop r28 c34: 08 95 ret 00000c36 : Purpose: transmit string to UART Input: string to be transmitted Returns: none **************************************************************************/ void uart_writeNewline(void){ uart_writeString("\n\r\0"); c36: 8c e3 ldi r24, 0x3C ; 60 c38: 93 e0 ldi r25, 0x03 ; 3 c3a: 0e 94 0e 06 call 0xc1c ; 0xc1c } c3e: 08 95 ret 00000c40 : Purpose: transmit string to UART Input: string to be transmitted Returns: none **************************************************************************/ void uart_writeLine(const char *line){ uart_writeString(line); c40: 0e 94 0e 06 call 0xc1c ; 0xc1c uart_writeNewline(); c44: 0e 94 1b 06 call 0xc36 ; 0xc36 } c48: 08 95 ret 00000c4a : Purpose: transmit string from program memory to UART Input: program memory string to be transmitted Returns: none **************************************************************************/ void uart_writeProgString(const char *progmem_s ) { c4a: cf 93 push r28 c4c: df 93 push r29 c4e: ec 01 movw r28, r24 c50: 02 c0 rjmp .+4 ; 0xc56 register char c; while ( (c = pgm_read_byte(progmem_s++)) ) uart_writeByte(c); c52: 0e 94 f8 05 call 0xbf0 ; 0xbf0 c56: fe 01 movw r30, r28 **************************************************************************/ void uart_writeProgString(const char *progmem_s ) { register char c; while ( (c = pgm_read_byte(progmem_s++)) ) c58: 21 96 adiw r28, 0x01 ; 1 c5a: 84 91 lpm r24, Z+ c5c: 88 23 and r24, r24 c5e: c9 f7 brne .-14 ; 0xc52 uart_writeByte(c); }/* uart_writeProgString */ c60: df 91 pop r29 c62: cf 91 pop r28 c64: 08 95 ret 00000c66 <__vector_36>: ISR(UART1_RECEIVE_INTERRUPT) /************************************************************************* Function: UART1 Receive Complete interrupt Purpose: called when the UART1 has received a character **************************************************************************/ { c66: 1f 92 push r1 c68: 0f 92 push r0 c6a: 0f b6 in r0, 0x3f ; 63 c6c: 0f 92 push r0 c6e: 0b b6 in r0, 0x3b ; 59 c70: 0f 92 push r0 c72: 11 24 eor r1, r1 c74: 2f 93 push r18 c76: 8f 93 push r24 c78: 9f 93 push r25 c7a: ef 93 push r30 c7c: ff 93 push r31 unsigned char usr; unsigned char lastRxError; /* read UART status register and UART data register */ usr = UART1_STATUS; c7e: 90 91 c8 00 lds r25, 0x00C8 data = UART1_DATA; c82: 20 91 ce 00 lds r18, 0x00CE /* */ lastRxError = (usr & (_BV(FE1)|_BV(DOR1)) ); /* calculate buffer index */ tmphead = ( UART1_RxHead + 1) & UART_RX_BUFFER_MASK; c86: e0 91 d0 03 lds r30, 0x03D0 c8a: ef 5f subi r30, 0xFF ; 255 c8c: ef 71 andi r30, 0x1F ; 31 if ( tmphead == UART1_RxTail ) { c8e: 80 91 d1 03 lds r24, 0x03D1 c92: e8 17 cp r30, r24 c94: 11 f4 brne .+4 ; 0xc9a <__vector_36+0x34> c96: 82 e0 ldi r24, 0x02 ; 2 c98: 08 c0 rjmp .+16 ; 0xcaa <__vector_36+0x44> /* read UART status register and UART data register */ usr = UART1_STATUS; data = UART1_DATA; /* */ lastRxError = (usr & (_BV(FE1)|_BV(DOR1)) ); c9a: 89 2f mov r24, r25 c9c: 88 71 andi r24, 0x18 ; 24 if ( tmphead == UART1_RxTail ) { /* error: receive buffer overflow */ lastRxError = UART_BUFFER_OVERFLOW >> 8; }else{ /* store new index */ UART1_RxHead = tmphead; c9e: e0 93 d0 03 sts 0x03D0, r30 /* store received data in buffer */ UART1_RxBuf[tmphead] = data; ca2: f0 e0 ldi r31, 0x00 ; 0 ca4: e2 55 subi r30, 0x52 ; 82 ca6: fc 4f sbci r31, 0xFC ; 252 ca8: 20 83 st Z, r18 } UART1_LastRxError = lastRxError; caa: 80 93 d2 03 sts 0x03D2, r24 } cae: ff 91 pop r31 cb0: ef 91 pop r30 cb2: 9f 91 pop r25 cb4: 8f 91 pop r24 cb6: 2f 91 pop r18 cb8: 0f 90 pop r0 cba: 0b be out 0x3b, r0 ; 59 cbc: 0f 90 pop r0 cbe: 0f be out 0x3f, r0 ; 63 cc0: 0f 90 pop r0 cc2: 1f 90 pop r1 cc4: 18 95 reti 00000cc6 <__vector_37>: ISR(UART1_TRANSMIT_INTERRUPT) /************************************************************************* Function: UART1 Data Register Empty interrupt Purpose: called when the UART1 is ready to transmit the next byte **************************************************************************/ { cc6: 1f 92 push r1 cc8: 0f 92 push r0 cca: 0f b6 in r0, 0x3f ; 63 ccc: 0f 92 push r0 cce: 0b b6 in r0, 0x3b ; 59 cd0: 0f 92 push r0 cd2: 11 24 eor r1, r1 cd4: 8f 93 push r24 cd6: 9f 93 push r25 cd8: ef 93 push r30 cda: ff 93 push r31 unsigned char tmptail; if ( UART1_TxHead != UART1_TxTail) { cdc: 90 91 ce 03 lds r25, 0x03CE ce0: 80 91 cf 03 lds r24, 0x03CF ce4: 98 17 cp r25, r24 ce6: 69 f0 breq .+26 ; 0xd02 <__vector_37+0x3c> /* calculate and store new buffer index */ tmptail = (UART1_TxTail + 1) & UART_TX_BUFFER_MASK; ce8: e0 91 cf 03 lds r30, 0x03CF cec: ef 5f subi r30, 0xFF ; 255 cee: ef 71 andi r30, 0x1F ; 31 UART1_TxTail = tmptail; cf0: e0 93 cf 03 sts 0x03CF, r30 /* get one byte from buffer and write it to UART */ UART1_DATA = UART1_TxBuf[tmptail]; /* start transmission */ cf4: f0 e0 ldi r31, 0x00 ; 0 cf6: e2 57 subi r30, 0x72 ; 114 cf8: fc 4f sbci r31, 0xFC ; 252 cfa: 80 81 ld r24, Z cfc: 80 93 ce 00 sts 0x00CE, r24 d00: 05 c0 rjmp .+10 ; 0xd0c <__vector_37+0x46> }else{ /* tx buffer empty, disable UDRE interrupt */ UART1_CONTROL &= ~_BV(UART1_UDRIE); d02: 80 91 c9 00 lds r24, 0x00C9 d06: 8f 7d andi r24, 0xDF ; 223 d08: 80 93 c9 00 sts 0x00C9, r24 } } d0c: ff 91 pop r31 d0e: ef 91 pop r30 d10: 9f 91 pop r25 d12: 8f 91 pop r24 d14: 0f 90 pop r0 d16: 0b be out 0x3b, r0 ; 59 d18: 0f 90 pop r0 d1a: 0f be out 0x3f, r0 ; 63 d1c: 0f 90 pop r0 d1e: 1f 90 pop r1 d20: 18 95 reti 00000d22 : Purpose: initialize UART1 and set baudrate Input: baudrate using macro UART_BAUD_SELECT() Returns: none **************************************************************************/ void uart1_init(unsigned int baudrate) { d22: 9c 01 movw r18, r24 UART1_TxHead = 0; d24: 10 92 ce 03 sts 0x03CE, r1 UART1_TxTail = 0; d28: 10 92 cf 03 sts 0x03CF, r1 UART1_RxHead = 0; d2c: 10 92 d0 03 sts 0x03D0, r1 UART1_RxTail = 0; d30: 10 92 d1 03 sts 0x03D1, r1 /* Set baud rate */ if ( baudrate & 0x8000 ) d34: 97 ff sbrs r25, 7 d36: 04 c0 rjmp .+8 ; 0xd40 { UART1_STATUS = (1<>8); d40: 30 93 cd 00 sts 0x00CD, r19 UBRR1L = (unsigned char) baudrate; d44: 20 93 cc 00 sts 0x00CC, r18 /* Enable USART receiver and transmitter and receive complete interrupt */ UART1_CONTROL = _BV(RXCIE1)|(1<: { unsigned char tmptail; unsigned char data; if ( UART1_RxHead == UART1_RxTail ) { d56: 90 91 d0 03 lds r25, 0x03D0 d5a: 80 91 d1 03 lds r24, 0x03D1 d5e: 98 17 cp r25, r24 d60: 19 f4 brne .+6 ; 0xd68 d62: 20 e0 ldi r18, 0x00 ; 0 d64: 31 e0 ldi r19, 0x01 ; 1 d66: 12 c0 rjmp .+36 ; 0xd8c return UART_NO_DATA; /* no data available */ } /* calculate /store buffer index */ tmptail = (UART1_RxTail + 1) & UART_RX_BUFFER_MASK; d68: e0 91 d1 03 lds r30, 0x03D1 d6c: ef 5f subi r30, 0xFF ; 255 d6e: ef 71 andi r30, 0x1F ; 31 UART1_RxTail = tmptail; d70: e0 93 d1 03 sts 0x03D1, r30 /* get data from receive buffer */ data = UART1_RxBuf[tmptail]; d74: f0 e0 ldi r31, 0x00 ; 0 d76: e2 55 subi r30, 0x52 ; 82 d78: fc 4f sbci r31, 0xFC ; 252 d7a: 30 81 ld r19, Z return (UART1_LastRxError << 8) + data; d7c: 20 91 d2 03 lds r18, 0x03D2 d80: 92 2f mov r25, r18 d82: 80 e0 ldi r24, 0x00 ; 0 d84: ac 01 movw r20, r24 d86: 43 0f add r20, r19 d88: 51 1d adc r21, r1 d8a: 9a 01 movw r18, r20 }/* uart1_getc */ d8c: c9 01 movw r24, r18 d8e: 08 95 ret 00000d90 : Purpose: write byte to ringbuffer for transmitting via UART Input: byte to be transmitted Returns: none **************************************************************************/ void uart1_putc(unsigned char data) { d90: 28 2f mov r18, r24 unsigned char tmphead; tmphead = (UART1_TxHead + 1) & UART_TX_BUFFER_MASK; d92: 90 91 ce 03 lds r25, 0x03CE d96: 9f 5f subi r25, 0xFF ; 255 d98: 9f 71 andi r25, 0x1F ; 31 while ( tmphead == UART1_TxTail ){ d9a: 80 91 cf 03 lds r24, 0x03CF d9e: 98 17 cp r25, r24 da0: e1 f3 breq .-8 ; 0xd9a ;/* wait for free space in buffer */ } UART1_TxBuf[tmphead] = data; da2: e9 2f mov r30, r25 da4: f0 e0 ldi r31, 0x00 ; 0 da6: e2 57 subi r30, 0x72 ; 114 da8: fc 4f sbci r31, 0xFC ; 252 daa: 20 83 st Z, r18 UART1_TxHead = tmphead; dac: 90 93 ce 03 sts 0x03CE, r25 /* enable UDRE interrupt */ UART1_CONTROL |= _BV(UART1_UDRIE); db0: 80 91 c9 00 lds r24, 0x00C9 db4: 80 62 ori r24, 0x20 ; 32 db6: 80 93 c9 00 sts 0x00C9, r24 }/* uart1_putc */ dba: 08 95 ret 00000dbc : Purpose: transmit string to UART1 Input: string to be transmitted Returns: none **************************************************************************/ void uart1_puts(const char *s ) { dbc: cf 93 push r28 dbe: df 93 push r29 dc0: ec 01 movw r28, r24 dc2: 03 c0 rjmp .+6 ; 0xdca while (*s) uart1_putc(*s++); dc4: 21 96 adiw r28, 0x01 ; 1 dc6: 0e 94 c8 06 call 0xd90 ; 0xd90 Input: string to be transmitted Returns: none **************************************************************************/ void uart1_puts(const char *s ) { while (*s) dca: 88 81 ld r24, Y dcc: 88 23 and r24, r24 dce: d1 f7 brne .-12 ; 0xdc4 uart1_putc(*s++); }/* uart1_puts */ dd0: df 91 pop r29 dd2: cf 91 pop r28 dd4: 08 95 ret 00000dd6 : Purpose: transmit string from program memory to UART1 Input: program memory string to be transmitted Returns: none **************************************************************************/ void uart1_puts_p(const char *progmem_s ) { dd6: cf 93 push r28 dd8: df 93 push r29 dda: ec 01 movw r28, r24 ddc: 02 c0 rjmp .+4 ; 0xde2 register char c; while ( (c = pgm_read_byte(progmem_s++)) ) uart1_putc(c); dde: 0e 94 c8 06 call 0xd90 ; 0xd90 de2: fe 01 movw r30, r28 **************************************************************************/ void uart1_puts_p(const char *progmem_s ) { register char c; while ( (c = pgm_read_byte(progmem_s++)) ) de4: 21 96 adiw r28, 0x01 ; 1 de6: 84 91 lpm r24, Z+ de8: 88 23 and r24, r24 dea: c9 f7 brne .-14 ; 0xdde uart1_putc(c); }/* uart1_puts_p */ dec: df 91 pop r29 dee: cf 91 pop r28 df0: 08 95 ret 00000df2 : Function: uart_writeNumberBin() Purpose: transmit string to UART Input: string to be transmitted Returns: none **************************************************************************/ void uart_writeNumberBin(const int32_t value){ df2: 0f 93 push r16 df4: 1f 93 push r17 df6: df 93 push r29 df8: cf 93 push r28 dfa: cd b7 in r28, 0x3d ; 61 dfc: de b7 in r29, 0x3e ; 62 dfe: a0 97 sbiw r28, 0x20 ; 32 e00: 0f b6 in r0, 0x3f ; 63 e02: f8 94 cli e04: de bf out 0x3e, r29 ; 62 e06: 0f be out 0x3f, r0 ; 63 e08: cd bf out 0x3d, r28 ; 61 e0a: dc 01 movw r26, r24 e0c: cb 01 movw r24, r22 char numBuffer[32]; itoa(value, numBuffer, 2); e0e: 8e 01 movw r16, r28 e10: 0f 5f subi r16, 0xFF ; 255 e12: 1f 4f sbci r17, 0xFF ; 255 e14: b8 01 movw r22, r16 e16: 42 e0 ldi r20, 0x02 ; 2 e18: 50 e0 ldi r21, 0x00 ; 0 e1a: 0e 94 80 08 call 0x1100 ; 0x1100 uart_writeString(numBuffer); e1e: c8 01 movw r24, r16 e20: 0e 94 0e 06 call 0xc1c ; 0xc1c } e24: a0 96 adiw r28, 0x20 ; 32 e26: 0f b6 in r0, 0x3f ; 63 e28: f8 94 cli e2a: de bf out 0x3e, r29 ; 62 e2c: 0f be out 0x3f, r0 ; 63 e2e: cd bf out 0x3d, r28 ; 61 e30: cf 91 pop r28 e32: df 91 pop r29 e34: 1f 91 pop r17 e36: 0f 91 pop r16 e38: 08 95 ret 00000e3a : uart_writeString("}"); } } } void uart_writeArrayU8Bin(uint8_t* array, uint8_t length) { e3a: ef 92 push r14 e3c: ff 92 push r15 e3e: 0f 93 push r16 e40: 1f 93 push r17 e42: cf 93 push r28 e44: df 93 push r29 e46: 18 2f mov r17, r24 e48: 09 2f mov r16, r25 e4a: e6 2e mov r14, r22 uart_writeString("{"); e4c: 80 e4 ldi r24, 0x40 ; 64 e4e: 93 e0 ldi r25, 0x03 ; 3 e50: 0e 94 0e 06 call 0xc1c ; 0xc1c e54: 21 2f mov r18, r17 e56: 30 2f mov r19, r16 e58: c9 01 movw r24, r18 e5a: ec 01 movw r28, r24 e5c: ff 24 eor r15, r15 uint8_t i; for (i = 0; i < length; i++) { uart_writeNumberBin(array[i]); if (i != length - 1) { e5e: 0e 2d mov r16, r14 e60: 10 e0 ldi r17, 0x00 ; 0 e62: 01 50 subi r16, 0x01 ; 1 e64: 10 40 sbci r17, 0x00 ; 0 e66: 14 c0 rjmp .+40 ; 0xe90 void uart_writeArrayU8Bin(uint8_t* array, uint8_t length) { uart_writeString("{"); uint8_t i; for (i = 0; i < length; i++) { uart_writeNumberBin(array[i]); e68: 68 81 ld r22, Y e6a: 70 e0 ldi r23, 0x00 ; 0 e6c: 80 e0 ldi r24, 0x00 ; 0 e6e: 90 e0 ldi r25, 0x00 ; 0 e70: 0e 94 f9 06 call 0xdf2 ; 0xdf2 if (i != length - 1) { e74: 8f 2d mov r24, r15 e76: 90 e0 ldi r25, 0x00 ; 0 e78: 80 17 cp r24, r16 e7a: 91 07 cpc r25, r17 e7c: 19 f0 breq .+6 ; 0xe84 uart_writeString("; "); e7e: 82 e4 ldi r24, 0x42 ; 66 e80: 93 e0 ldi r25, 0x03 ; 3 e82: 02 c0 rjmp .+4 ; 0xe88 } else { uart_writeString("}"); e84: 85 e4 ldi r24, 0x45 ; 69 e86: 93 e0 ldi r25, 0x03 ; 3 e88: 0e 94 0e 06 call 0xc1c ; 0xc1c } void uart_writeArrayU8Bin(uint8_t* array, uint8_t length) { uart_writeString("{"); uint8_t i; for (i = 0; i < length; i++) { e8c: f3 94 inc r15 e8e: 21 96 adiw r28, 0x01 ; 1 e90: fe 14 cp r15, r14 e92: 50 f3 brcs .-44 ; 0xe68 uart_writeString("; "); } else { uart_writeString("}"); } } } e94: df 91 pop r29 e96: cf 91 pop r28 e98: 1f 91 pop r17 e9a: 0f 91 pop r16 e9c: ff 90 pop r15 e9e: ef 90 pop r14 ea0: 08 95 ret 00000ea2 : Function: uart_writeNumberHex() Purpose: transmit string to UART Input: string to be transmitted Returns: none **************************************************************************/ void uart_writeNumberHex(const int32_t value) { ea2: 0f 93 push r16 ea4: 1f 93 push r17 ea6: df 93 push r29 ea8: cf 93 push r28 eaa: cd b7 in r28, 0x3d ; 61 eac: de b7 in r29, 0x3e ; 62 eae: 28 97 sbiw r28, 0x08 ; 8 eb0: 0f b6 in r0, 0x3f ; 63 eb2: f8 94 cli eb4: de bf out 0x3e, r29 ; 62 eb6: 0f be out 0x3f, r0 ; 63 eb8: cd bf out 0x3d, r28 ; 61 eba: dc 01 movw r26, r24 ebc: cb 01 movw r24, r22 char numBuffer[8]; itoa(value, numBuffer, 16); ebe: 8e 01 movw r16, r28 ec0: 0f 5f subi r16, 0xFF ; 255 ec2: 1f 4f sbci r17, 0xFF ; 255 ec4: b8 01 movw r22, r16 ec6: 40 e1 ldi r20, 0x10 ; 16 ec8: 50 e0 ldi r21, 0x00 ; 0 eca: 0e 94 80 08 call 0x1100 ; 0x1100 uart_writeString(numBuffer); ece: c8 01 movw r24, r16 ed0: 0e 94 0e 06 call 0xc1c ; 0xc1c } ed4: 28 96 adiw r28, 0x08 ; 8 ed6: 0f b6 in r0, 0x3f ; 63 ed8: f8 94 cli eda: de bf out 0x3e, r29 ; 62 edc: 0f be out 0x3f, r0 ; 63 ede: cd bf out 0x3d, r28 ; 61 ee0: cf 91 pop r28 ee2: df 91 pop r29 ee4: 1f 91 pop r17 ee6: 0f 91 pop r16 ee8: 08 95 ret 00000eea : uart_writeString("}"); } } } void uart_writeArrayU8Hex(uint8_t* array, uint8_t length) { eea: ef 92 push r14 eec: ff 92 push r15 eee: 0f 93 push r16 ef0: 1f 93 push r17 ef2: cf 93 push r28 ef4: df 93 push r29 ef6: 18 2f mov r17, r24 ef8: 09 2f mov r16, r25 efa: e6 2e mov r14, r22 uart_writeString("{"); efc: 80 e4 ldi r24, 0x40 ; 64 efe: 93 e0 ldi r25, 0x03 ; 3 f00: 0e 94 0e 06 call 0xc1c ; 0xc1c f04: 21 2f mov r18, r17 f06: 30 2f mov r19, r16 f08: c9 01 movw r24, r18 f0a: ec 01 movw r28, r24 f0c: ff 24 eor r15, r15 uint8_t i; for (i = 0; i < length; i++) { uart_writeNumberHex(array[i]); if (i != length - 1) { f0e: 0e 2d mov r16, r14 f10: 10 e0 ldi r17, 0x00 ; 0 f12: 01 50 subi r16, 0x01 ; 1 f14: 10 40 sbci r17, 0x00 ; 0 f16: 14 c0 rjmp .+40 ; 0xf40 void uart_writeArrayU8Hex(uint8_t* array, uint8_t length) { uart_writeString("{"); uint8_t i; for (i = 0; i < length; i++) { uart_writeNumberHex(array[i]); f18: 68 81 ld r22, Y f1a: 70 e0 ldi r23, 0x00 ; 0 f1c: 80 e0 ldi r24, 0x00 ; 0 f1e: 90 e0 ldi r25, 0x00 ; 0 f20: 0e 94 51 07 call 0xea2 ; 0xea2 if (i != length - 1) { f24: 8f 2d mov r24, r15 f26: 90 e0 ldi r25, 0x00 ; 0 f28: 80 17 cp r24, r16 f2a: 91 07 cpc r25, r17 f2c: 19 f0 breq .+6 ; 0xf34 uart_writeString("; "); f2e: 82 e4 ldi r24, 0x42 ; 66 f30: 93 e0 ldi r25, 0x03 ; 3 f32: 02 c0 rjmp .+4 ; 0xf38 } else { uart_writeString("}"); f34: 85 e4 ldi r24, 0x45 ; 69 f36: 93 e0 ldi r25, 0x03 ; 3 f38: 0e 94 0e 06 call 0xc1c ; 0xc1c } void uart_writeArrayU8Hex(uint8_t* array, uint8_t length) { uart_writeString("{"); uint8_t i; for (i = 0; i < length; i++) { f3c: f3 94 inc r15 f3e: 21 96 adiw r28, 0x01 ; 1 f40: fe 14 cp r15, r14 f42: 50 f3 brcs .-44 ; 0xf18 uart_writeString("; "); } else { uart_writeString("}"); } } } f44: df 91 pop r29 f46: cf 91 pop r28 f48: 1f 91 pop r17 f4a: 0f 91 pop r16 f4c: ff 90 pop r15 f4e: ef 90 pop r14 f50: 08 95 ret 00000f52 : Function: uart_writeNumberDec() Purpose: transmit string to UART Input: string to be transmitted Returns: none **************************************************************************/ void uart_writeNumberDec(const int32_t value){ f52: 0f 93 push r16 f54: 1f 93 push r17 f56: df 93 push r29 f58: cf 93 push r28 f5a: cd b7 in r28, 0x3d ; 61 f5c: de b7 in r29, 0x3e ; 62 f5e: 2a 97 sbiw r28, 0x0a ; 10 f60: 0f b6 in r0, 0x3f ; 63 f62: f8 94 cli f64: de bf out 0x3e, r29 ; 62 f66: 0f be out 0x3f, r0 ; 63 f68: cd bf out 0x3d, r28 ; 61 f6a: dc 01 movw r26, r24 f6c: cb 01 movw r24, r22 char numBuffer[10]; itoa(value, numBuffer, 10); f6e: 8e 01 movw r16, r28 f70: 0f 5f subi r16, 0xFF ; 255 f72: 1f 4f sbci r17, 0xFF ; 255 f74: b8 01 movw r22, r16 f76: 4a e0 ldi r20, 0x0A ; 10 f78: 50 e0 ldi r21, 0x00 ; 0 f7a: 0e 94 80 08 call 0x1100 ; 0x1100 uart_writeString(numBuffer); f7e: c8 01 movw r24, r16 f80: 0e 94 0e 06 call 0xc1c ; 0xc1c } f84: 2a 96 adiw r28, 0x0a ; 10 f86: 0f b6 in r0, 0x3f ; 63 f88: f8 94 cli f8a: de bf out 0x3e, r29 ; 62 f8c: 0f be out 0x3f, r0 ; 63 f8e: cd bf out 0x3d, r28 ; 61 f90: cf 91 pop r28 f92: df 91 pop r29 f94: 1f 91 pop r17 f96: 0f 91 pop r16 f98: 08 95 ret 00000f9a : /* * these functions are only for ATmegas with two USART */ void uart_writeArrayU8Dec(uint8_t* array, uint8_t length) { f9a: ef 92 push r14 f9c: ff 92 push r15 f9e: 0f 93 push r16 fa0: 1f 93 push r17 fa2: cf 93 push r28 fa4: df 93 push r29 fa6: 18 2f mov r17, r24 fa8: 09 2f mov r16, r25 faa: e6 2e mov r14, r22 uart_writeString("{"); fac: 80 e4 ldi r24, 0x40 ; 64 fae: 93 e0 ldi r25, 0x03 ; 3 fb0: 0e 94 0e 06 call 0xc1c ; 0xc1c fb4: 21 2f mov r18, r17 fb6: 30 2f mov r19, r16 fb8: c9 01 movw r24, r18 fba: ec 01 movw r28, r24 fbc: ff 24 eor r15, r15 uint8_t i; for (i = 0; i < length; i++) { uart_writeNumberDec(array[i]); if (i != length - 1) { fbe: 0e 2d mov r16, r14 fc0: 10 e0 ldi r17, 0x00 ; 0 fc2: 01 50 subi r16, 0x01 ; 1 fc4: 10 40 sbci r17, 0x00 ; 0 fc6: 14 c0 rjmp .+40 ; 0xff0 void uart_writeArrayU8Dec(uint8_t* array, uint8_t length) { uart_writeString("{"); uint8_t i; for (i = 0; i < length; i++) { uart_writeNumberDec(array[i]); fc8: 68 81 ld r22, Y fca: 70 e0 ldi r23, 0x00 ; 0 fcc: 80 e0 ldi r24, 0x00 ; 0 fce: 90 e0 ldi r25, 0x00 ; 0 fd0: 0e 94 a9 07 call 0xf52 ; 0xf52 if (i != length - 1) { fd4: 8f 2d mov r24, r15 fd6: 90 e0 ldi r25, 0x00 ; 0 fd8: 80 17 cp r24, r16 fda: 91 07 cpc r25, r17 fdc: 19 f0 breq .+6 ; 0xfe4 uart_writeString("; "); fde: 82 e4 ldi r24, 0x42 ; 66 fe0: 93 e0 ldi r25, 0x03 ; 3 fe2: 02 c0 rjmp .+4 ; 0xfe8 } else { uart_writeString("}"); fe4: 85 e4 ldi r24, 0x45 ; 69 fe6: 93 e0 ldi r25, 0x03 ; 3 fe8: 0e 94 0e 06 call 0xc1c ; 0xc1c */ void uart_writeArrayU8Dec(uint8_t* array, uint8_t length) { uart_writeString("{"); uint8_t i; for (i = 0; i < length; i++) { fec: f3 94 inc r15 fee: 21 96 adiw r28, 0x01 ; 1 ff0: fe 14 cp r15, r14 ff2: 50 f3 brcs .-44 ; 0xfc8 uart_writeString("; "); } else { uart_writeString("}"); } } } ff4: df 91 pop r29 ff6: cf 91 pop r28 ff8: 1f 91 pop r17 ffa: 0f 91 pop r16 ffc: ff 90 pop r15 ffe: ef 90 pop r14 1000: 08 95 ret 00001002 <__lshrdi3>: 1002: ef 92 push r14 1004: ff 92 push r15 1006: 0f 93 push r16 1008: df 93 push r29 100a: cf 93 push r28 100c: cd b7 in r28, 0x3d ; 61 100e: de b7 in r29, 0x3e ; 62 1010: 60 97 sbiw r28, 0x10 ; 16 1012: 0f b6 in r0, 0x3f ; 63 1014: f8 94 cli 1016: de bf out 0x3e, r29 ; 62 1018: 0f be out 0x3f, r0 ; 63 101a: cd bf out 0x3d, r28 ; 61 101c: a8 2f mov r26, r24 101e: 00 23 and r16, r16 1020: 09 f4 brne .+2 ; 0x1024 <__lshrdi3+0x22> 1022: 61 c0 rjmp .+194 ; 0x10e6 <__lshrdi3+0xe4> 1024: 7e 01 movw r14, r28 1026: 08 94 sec 1028: e1 1c adc r14, r1 102a: f1 1c adc r15, r1 102c: 88 e0 ldi r24, 0x08 ; 8 102e: f7 01 movw r30, r14 1030: 11 92 st Z+, r1 1032: 8a 95 dec r24 1034: e9 f7 brne .-6 ; 0x1030 <__lshrdi3+0x2e> 1036: 29 83 std Y+1, r18 ; 0x01 1038: 3a 83 std Y+2, r19 ; 0x02 103a: 4b 83 std Y+3, r20 ; 0x03 103c: 5c 83 std Y+4, r21 ; 0x04 103e: 6d 83 std Y+5, r22 ; 0x05 1040: 7e 83 std Y+6, r23 ; 0x06 1042: af 83 std Y+7, r26 ; 0x07 1044: 98 87 std Y+8, r25 ; 0x08 1046: 80 e2 ldi r24, 0x20 ; 32 1048: 80 1b sub r24, r16 104a: e8 2f mov r30, r24 104c: ff 27 eor r31, r31 104e: e7 fd sbrc r30, 7 1050: f0 95 com r31 1052: 4d 81 ldd r20, Y+5 ; 0x05 1054: 5e 81 ldd r21, Y+6 ; 0x06 1056: 6f 81 ldd r22, Y+7 ; 0x07 1058: 78 85 ldd r23, Y+8 ; 0x08 105a: 18 16 cp r1, r24 105c: 84 f0 brlt .+32 ; 0x107e <__lshrdi3+0x7c> 105e: 1d 86 std Y+13, r1 ; 0x0d 1060: 1e 86 std Y+14, r1 ; 0x0e 1062: 1f 86 std Y+15, r1 ; 0x0f 1064: 18 8a std Y+16, r1 ; 0x10 1066: 88 27 eor r24, r24 1068: 99 27 eor r25, r25 106a: 8e 1b sub r24, r30 106c: 9f 0b sbc r25, r31 106e: 04 c0 rjmp .+8 ; 0x1078 <__lshrdi3+0x76> 1070: 76 95 lsr r23 1072: 67 95 ror r22 1074: 57 95 ror r21 1076: 47 95 ror r20 1078: 8a 95 dec r24 107a: d2 f7 brpl .-12 ; 0x1070 <__lshrdi3+0x6e> 107c: 28 c0 rjmp .+80 ; 0x10ce <__lshrdi3+0xcc> 107e: 20 2f mov r18, r16 1080: 33 27 eor r19, r19 1082: 27 fd sbrc r18, 7 1084: 30 95 com r19 1086: db 01 movw r26, r22 1088: ca 01 movw r24, r20 108a: 02 2e mov r0, r18 108c: 04 c0 rjmp .+8 ; 0x1096 <__lshrdi3+0x94> 108e: b6 95 lsr r27 1090: a7 95 ror r26 1092: 97 95 ror r25 1094: 87 95 ror r24 1096: 0a 94 dec r0 1098: d2 f7 brpl .-12 ; 0x108e <__lshrdi3+0x8c> 109a: 8d 87 std Y+13, r24 ; 0x0d 109c: 9e 87 std Y+14, r25 ; 0x0e 109e: af 87 std Y+15, r26 ; 0x0f 10a0: b8 8b std Y+16, r27 ; 0x10 10a2: 04 c0 rjmp .+8 ; 0x10ac <__lshrdi3+0xaa> 10a4: 44 0f add r20, r20 10a6: 55 1f adc r21, r21 10a8: 66 1f adc r22, r22 10aa: 77 1f adc r23, r23 10ac: ea 95 dec r30 10ae: d2 f7 brpl .-12 ; 0x10a4 <__lshrdi3+0xa2> 10b0: 89 81 ldd r24, Y+1 ; 0x01 10b2: 9a 81 ldd r25, Y+2 ; 0x02 10b4: ab 81 ldd r26, Y+3 ; 0x03 10b6: bc 81 ldd r27, Y+4 ; 0x04 10b8: 04 c0 rjmp .+8 ; 0x10c2 <__lshrdi3+0xc0> 10ba: b6 95 lsr r27 10bc: a7 95 ror r26 10be: 97 95 ror r25 10c0: 87 95 ror r24 10c2: 2a 95 dec r18 10c4: d2 f7 brpl .-12 ; 0x10ba <__lshrdi3+0xb8> 10c6: 48 2b or r20, r24 10c8: 59 2b or r21, r25 10ca: 6a 2b or r22, r26 10cc: 7b 2b or r23, r27 10ce: 49 87 std Y+9, r20 ; 0x09 10d0: 5a 87 std Y+10, r21 ; 0x0a 10d2: 6b 87 std Y+11, r22 ; 0x0b 10d4: 7c 87 std Y+12, r23 ; 0x0c 10d6: 29 85 ldd r18, Y+9 ; 0x09 10d8: 3a 85 ldd r19, Y+10 ; 0x0a 10da: 4b 85 ldd r20, Y+11 ; 0x0b 10dc: 5c 85 ldd r21, Y+12 ; 0x0c 10de: 6d 85 ldd r22, Y+13 ; 0x0d 10e0: 7e 85 ldd r23, Y+14 ; 0x0e 10e2: af 85 ldd r26, Y+15 ; 0x0f 10e4: 98 89 ldd r25, Y+16 ; 0x10 10e6: 8a 2f mov r24, r26 10e8: 60 96 adiw r28, 0x10 ; 16 10ea: 0f b6 in r0, 0x3f ; 63 10ec: f8 94 cli 10ee: de bf out 0x3e, r29 ; 62 10f0: 0f be out 0x3f, r0 ; 63 10f2: cd bf out 0x3d, r28 ; 61 10f4: cf 91 pop r28 10f6: df 91 pop r29 10f8: 0f 91 pop r16 10fa: ff 90 pop r15 10fc: ef 90 pop r14 10fe: 08 95 ret 00001100 : 1100: fb 01 movw r30, r22 1102: 9f 01 movw r18, r30 1104: e8 94 clt 1106: 42 30 cpi r20, 0x02 ; 2 1108: c4 f0 brlt .+48 ; 0x113a 110a: 45 32 cpi r20, 0x25 ; 37 110c: b4 f4 brge .+44 ; 0x113a 110e: 4a 30 cpi r20, 0x0A ; 10 1110: 29 f4 brne .+10 ; 0x111c 1112: 97 fb bst r25, 7 1114: 1e f4 brtc .+6 ; 0x111c 1116: 90 95 com r25 1118: 81 95 neg r24 111a: 9f 4f sbci r25, 0xFF ; 255 111c: 64 2f mov r22, r20 111e: 77 27 eor r23, r23 1120: 0e 94 b1 08 call 0x1162 ; 0x1162 <__udivmodhi4> 1124: 80 5d subi r24, 0xD0 ; 208 1126: 8a 33 cpi r24, 0x3A ; 58 1128: 0c f0 brlt .+2 ; 0x112c 112a: 89 5d subi r24, 0xD9 ; 217 112c: 81 93 st Z+, r24 112e: cb 01 movw r24, r22 1130: 00 97 sbiw r24, 0x00 ; 0 1132: a1 f7 brne .-24 ; 0x111c 1134: 16 f4 brtc .+4 ; 0x113a 1136: 5d e2 ldi r21, 0x2D ; 45 1138: 51 93 st Z+, r21 113a: 10 82 st Z, r1 113c: c9 01 movw r24, r18 113e: 0c 94 a1 08 jmp 0x1142 ; 0x1142 00001142 : 1142: dc 01 movw r26, r24 1144: fc 01 movw r30, r24 1146: 67 2f mov r22, r23 1148: 71 91 ld r23, Z+ 114a: 77 23 and r23, r23 114c: e1 f7 brne .-8 ; 0x1146 114e: 32 97 sbiw r30, 0x02 ; 2 1150: 04 c0 rjmp .+8 ; 0x115a 1152: 7c 91 ld r23, X 1154: 6d 93 st X+, r22 1156: 70 83 st Z, r23 1158: 62 91 ld r22, -Z 115a: ae 17 cp r26, r30 115c: bf 07 cpc r27, r31 115e: c8 f3 brcs .-14 ; 0x1152 1160: 08 95 ret 00001162 <__udivmodhi4>: 1162: aa 1b sub r26, r26 1164: bb 1b sub r27, r27 1166: 51 e1 ldi r21, 0x11 ; 17 1168: 07 c0 rjmp .+14 ; 0x1178 <__udivmodhi4_ep> 0000116a <__udivmodhi4_loop>: 116a: aa 1f adc r26, r26 116c: bb 1f adc r27, r27 116e: a6 17 cp r26, r22 1170: b7 07 cpc r27, r23 1172: 10 f0 brcs .+4 ; 0x1178 <__udivmodhi4_ep> 1174: a6 1b sub r26, r22 1176: b7 0b sbc r27, r23 00001178 <__udivmodhi4_ep>: 1178: 88 1f adc r24, r24 117a: 99 1f adc r25, r25 117c: 5a 95 dec r21 117e: a9 f7 brne .-22 ; 0x116a <__udivmodhi4_loop> 1180: 80 95 com r24 1182: 90 95 com r25 1184: bc 01 movw r22, r24 1186: cd 01 movw r24, r26 1188: 08 95 ret 0000118a <_exit>: 118a: f8 94 cli 0000118c <__stop_program>: 118c: ff cf rjmp .-2 ; 0x118c <__stop_program>