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

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

Отправлено ВН 24 декабря 2002 г. 16:22
В ответ на: Возвращаясь к теме урезанных sprintf отправлено BLACKEAGLE 24 декабря 2002 г. 01:37

Я без таблиц делал. Скорость сравнима с Вашей, но помедленнее немного. Текст тоже длинный и нудный. Суть преобразования unsigned int в bcd в расписывнии деления на 10.
U - исходный unsigned int. UH его старший байт, UL - младший.
U=UH*256+UL.
Частное:[U/10]=[(UH*256+UL)/10]=UH*25+[(UH*6+UL)/10]=
=UH*25+[UH/10]*6+[UL/10]+[(6*(UH%10)+(UL%10))/10]
Остаток: (U%10)=((6*(UH%10)+(UL%10))%10). [] - целая часть, % - как обычно.
И последовательное деление на 10.
1-е деление самое длинное. Остальные короче.
Исходное число в R2 (младший байт) и R3. Используются еще R4, R5. R0 указывет на младший байт предварительно обнуленных bcd.
1-е деление.
MOV A,R3
MOV B,#25
MUL AB
MOV R4,B
XCH A,R3
MOV B,#10
DIV AB
MOV R5,B
MOV B,#6
MUL AB
ADD A,R3
XCH A,R4
ADDC A,#0
XCH A,R2
MOV B,#10
DIV AB
ADD A,R4
XCH A,R2
ADDC A,#0
XCH A,R5
MOV R4,B
MOV B,#6
MUL AB
ADD A,R4
MOV B,#10
DIV AB
MOV @R0,B
ADD A,R2
MOV R2,A
CLR A
ADD A,R3
MOV R3,A
2-е деление. Над результатом первого.
MOV B,#6
MUL AB
XCH A,R2
MOV B,#10
DIV AB
XCH A,R2
ADD A,B
MOV B,#10
DIV AB
XCH A,B
SWAP A
OR A,@R0
MOV @R0,A
INC R0
MOV A,R2
ADD A,B
XCH A,R3
MOV B,#25
MUL AB
ADD A,R3
MOV R2,A
CLR A
ADDC A,B
3-е деление.
SWAP A
XCH A,R2
MOV R3,A
AND A,#15
XCH A,R3
SWAP A
AND A,#15
OR A,R2
MOV B,#10
DIV AB
SWAP A
MOV R2,A
MOV A,B
SWAP A
OR A,R3
MOV B,#10
DIV AB
MOV @R0,B
ADD A,R2
4-е деление.
MOV B,#10
DIV AB
XCH A,B
SWAP A
OR A,@R0
MOV @R0,A
INC R0
MOV @R0,B
140 циклов, если нигде не описался.
Немного, наверное, можно ускорить.

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

Ответы



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

E-mail: info@telesys.ru