I have code producing strange results. The application uses an 8-bit counter and overflow counts to measure distance with an ultrasonic transponder. The overflow and count look Ok. Fitting an equation to experimental data, I get dist = 0.013657 * cnts + -3.996578. Converting the multiplication, I have distance = (overflow*256 + count)*895/2^16 - 4 Where 895 is 0.013657 * 65536
I cannot find what I am doing wrong. Must be something simple. I want to multiply a 16-bit value by a 16-bit value and keep the high order 16 bits, using only the low 8 bits of the result. extern volatile uint8_t range_local_ovfl; extern volatile uint8_t range_local; extern volatile uint8_t range_count; if (range_new == TRUE) { { uint32_t distance = range_local_ovfl<<8; distance += (uint32_t)range_count; distance = =895*distance; distance = distance >> 16; range_local = (uint8_t)(distance - 4); } ... } 895*distance generates a call to __mulsi3, multiplying r25:22 by r21:18 and returning the result in r25:22. However, I cannot find where r21:18 are set in the code. Looking at the output of avr-gcc -S, I cannot find any of r18:21. avr-gcc -S -mmcu=atmega32 -Wall -Wmissing-prototypes -Os -fno-strict-aliasing -I../include -I../../../avrx2.6 -I. -I../../../../asus-avr-1.0/include -c ../common/range.c -o - | grep r18 produces nothing. Same for all of r19..r21 >From avr-objdump, 1bce: 0e 94 e3 12 call 0x25c6 ; 0x25c6<AvrXStartTimer> 1bd2: 80 91 c7 02 lds r24, 0x02C7 1bd6: 81 30 cpi r24, 0x01 ; 1 1bd8: f9 f4 brne .+62 ; 0x1c18 <range+0x60> 1bda: 80 91 96 02 lds r24, 0x0296 1bde: 18 2f mov r17, r24 1be0: 00 e0 ldi r16, 0x00 ; 0 1be2: b8 01 movw r22, r16 1be4: 88 27 eor r24, r24 1be6: 77 fd sbrc r23, 7 1be8: 80 95 com r24 1bea: 98 2f mov r25, r24 1bec: e0 91 87 02 lds r30, 0x0287 1bf0: 6e 0f add r22, r30 1bf2: 71 1d adc r23, r1 1bf4: 81 1d adc r24, r1 1bf6: 91 1d adc r25, r1 1bf8: 0e 94 ec 16 call 0x2dd8 ; 0x2dd8 <__mulsi3> 1bfc: bc 01 movw r22, r24 1bfe: 88 27 eor r24, r24 1c00: 99 27 eor r25, r25 1c02: 64 50 subi r22, 0x04 ; 4 1c04: 60 93 b6 02 sts 0x02B6, r22 1c08: 80 91 87 02 lds r24, 0x0287 1c0c: 80 93 7a 02 sts 0x027A, r24 1c10: 80 91 c6 02 lds r24, 0x02C6 1c14: 80 93 b9 02 sts 0x02B9, r24 1c18: c0 9a sbi 0x18, 0 ; 24 _______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org http://lists.nongnu.org/mailman/listinfo/avr-gcc-list