Feb. 16th, 2012

zepete: (Default)
Обычно, 8 разрядные микроконтроллеры не умеют делить, но зато очень умеют умножать за один такт.
Для преобразования bin2bcd надо число разделить на 10.

В интеренетах предлагают ужасные способы деления при помощи последовательного вычитания или циклических сдвигов, хотя это можно осуществить при помощи умножения на обратную величину 10.

Общий алгоритм такой.

1. К числу прибавить 1 для коррекции последующих операций.
2. Умножить обратную величину 10 сдвинутую на число разрядов преобразуемого числа влево. Обратная величина 10 равна 0.000(1100)b.
3. Сдвинуть на число используемых разрядов обратной величины вправо.

В результате получается простая процедура для практически важного случая вывода результатов измерения встроенным 10-12 разрядным АЦП на экран.
Пример для atmega.

;;********************************************************************************************************
;* ОПРЕДЕЛЕНИЕ: преобразование 9 разрядного Xh:Xl в упакованное BCD, результат возвращается в r20:r19.
;* ОСОБЕННОСТИ: число 511 не корректно преобразуется, ибо теряется один разряд при получении десятков
;* АЛГОРИТМ: для преобразования используется умножение на обратную величину 10
;********************************************************************************************************
Bin2BCDx9:
; получение числа десятков
ldi r16,0b110011 ; загрузка обратной величины 10, с точностью до 9 знака после запятой
ldi r22,0b10011001 ; обратная величина 10, с точностью до 12 знака после запятой
ldi r17,10 ; число 10

mov r18,xl ; копирование числа для получения числа единиц в будущем
mov r20,xh
adiw xh:xl,1 ; увеличение числа на 1
mul xl,r22 ; умножение на обратную величину
mov r19,r1
mul xh,r22
add r19,r0
adc r20,ZERO
add r19,xl
adc r20,ZERO
lsr r20 ; деление на 2^12
ror r19
lsr r20
ror r19
lsr r20
ror r19
lsr r20
ror r19
; получение числа единиц, для этого из числа вычитаем десятки умноженные на 10
mul r19,r17 ; r1:r0=r18*10
sub r18,r0
; получение числа сотен
mov r20,r19
inc r20 ; коррекция
mul r20,r16 ; умножение
lsr r1 ; деление на 2^9
; получение второй цифры
mov r20,r1
mul r20,r17
sub r19,r0
; преобразование в упакованный формат
lsl r19
lsl R19
lsl r19
lsl r19
or r19,r18
ret

Profile

zepete: (Default)
zepete

January 2026

S M T W T F S
    1 23
4 56 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 14th, 2026 10:12 am
Powered by Dreamwidth Studios