[an error occurred while processing this directive]
Один из пользователей нашёл...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Точка опоры 24 октября 2002 г. 10:57
В ответ на: ftp://www.atmel.com/pub/atmel/avr200.exe отправлено FFT 24 октября 2002 г. 09:50

... в этом аппноте ошибку ( на то и аппноты, что-бы инженерная мысль не дремала ):
"Я по поводу аппноты 200. Признаюсь, мне пришлось около двух часов возиться, затем вспоминать полузабытую с институтских времен двоичную
арифметику, чтобы найти ошибку в умножении (столь долгое время потому, что я ВЕРИЛ авторитету уважаемой ATMEL и первоначально не допускал мысли о том, что у них ошибки).
В процедуре умножения 16х16 метка возврата стоит не там (ихняя метка
оставлена в скобках), недаром коммент к этим строкам опущен:


mpy16u: clr m16u3 ;clear 2 highest bytes of result
clr m16u2
ldi mcnt16u,16 ;init loop counter
m16u_1: lsr mp16uH
ror mp16uL

(m16u_1:) brcc noad8 ;if bit 0 of multiplier set
add m16u2,mc16uL ;add multiplicand Low to byte 2 of res
adc m16u3,mc16uH ;add multiplicand high to byte 3 of res
noad8: ror m16u3 ;shift right result byte 3
ror m16u2 ;rotate right result byte 2
ror m16u1 ;rotate result byte 1 and multiplier High
ror m16u0 ;rotate result byte 0 and multiplier Low
dec mcnt16u ;decrement loop counter
brne m16u_1 ;if not done, loop more
ret


Вот этот фокус с объединением регистров, для чего все и было,
наверное, сделано, тогда, очевидно, не проходит:

.def mp16uL =r18 ;multiplier low byte
.def mp16uH =r19 ;multiplier high byte
.def m16u0 =r18 ;result byte 0 (LSB)
.def m16u1 =r19 ;result byte 1

В умножении 8х8 ошибка повторяется и там, и там...
Юрий Ревич."

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru