Программы для преобразования чисел на МК AVR

March 7, 2011 by admin Комментировать »

Здесь описаны приемы, используемые для преобразования двоичных и десятичных целых и дробных чисел, широко применяемые при вводе и выводе данных.

Преобразования основаны на использовании методов умножения;деления на 2, выполняемых путем сдвига и коррекции. Сдвиг двоичных чисел выполняется без коррекции, для десятичных чисел необходима коррекция в зависимости от направления сдвига.

Если при сдвиге вправо (деление на 2) слева из старшего десятичного разряда поступает О, коррекция не проводится. При поступлении 1, она приобретает вес 8 вместо 5, что должно быть при делении 1 старшего разряда на 2 (при сдвиге вправо). В связи с этим необходима коррекция вычитанием 3. Пример преобразования 2-разрядного 2-10 числа:

Умножив исходное число на 2 (или сдвинув код числа влево на 1 разряд) можно выделить старший разряд добавив его значение (О или 1) в десятичную ячейку и удвоив ее содержимое. Действия повторяют для всех разрядов двоичного числа. Для умножения на 2 десятичного числа используется процедура тиЫ2, применяемая последовательно для каждого байта числа, начиная с младшего.

Преобразование десятичной дроби в двоичную выполняется традиционным способом: путем умножения на 2 исходной дроби и дробных частей получаемых произведений. Целые части произведений, принимающие значения О или 1, образуют ряд значений разрядов двоичной дроби, начиная со старшего, поэтому в алгоритме преобразования можно применить процедуру muld2 умножения на 2 десятичного числа с коррекцией. Образуемое значение переноса при обработке старшего байта дроби подают в младший разряд ячейки двоичной дроби, одновременно сдвигая все остальные разряды влево.

Преобразование двоичной дроби в десятичную можно выполнить, используя представление дроби в виде полинома Горнера:

Сдвигая вправо двоичную дробь и подавая выталкиваемые младшие разряды в ячейку десятичной дроби слева, где также выполняется деление на 2, можно получить десятичный эквивалент. Деление и коррекция каждого байта десятичной дроби, начиная со старшего, осуществляется с помощью процедуры divd2.

Далее приведена тестовая программа, демонстрирующая преобразование целых чисел. Исходные для преобразования данные и результаты размещают в памяти так, что младшие разряды чисел находятся по адресу bram {dram), старшие – по адресу

;Тестовая программа для преобразования упакованного целого ;десятичного числа длиной к байт в двоичное длиной п байт, ;двоичного целого – в десятичное упакованное.

.include "8515def.inc" ;файл определений для AT90S8515

.equ dram = $060          ;адрес десятичного числа

.equ bram = $06А           ;адрес двоичного числа

.equ к = 2           ;длина операндов для теста .equ п = 1

.def асс = г1б              ;регистр-аккумулятор

.def bit_count = rl7           ;счетчик битов

.def byte_count = rl8     ;счетчик байтов .org $000

Idi асс,low(RAMEND)           ;установка

out SPL,асс               ; указателя стека

Idi асс,high(RAMEND)        ; на последнюю

out SPH,асс                  ; ячейку ОЗУ

;Преобразование десятичного числа в двоичное ;Исходные данные для теста ($60)=37,($61)=02 idb: Idi bit_count,8*n

loop: Idi XL,low(dram+k)          ;установка

Idi XH,high(dram+k)      ; начального адреса

clc             ;С=0 Idi byte_count,k dloop: Id acc,-x

rcall divd2        ;сдвиг вправо десятичного числа

St х,асс            ;и коррекция dec byte_count brne dloop

Idi XL,low(bram+n)            ;установка

Idi XH,high(bram+n) ; начального адреса Idi byte_count,n bloop: Id acc,-x

ror acc                      ;сдвиг вправо

st x,acc  ; двоичного числа dec byte_count brne bloop dec bit_count

brne loop  ;повторить для всех разрядов ;Результат ($6А)=ED

;Обратный перевод в упакованное десятичное ibd: Idi bit_count, 8*n

Idi XL,low(dram+k)            ;установка

Idi ХН,high(dram+k) ; начального адреса Idi byte_count,k clr acc

s_loop: St -x,acc         ; и очистка ячеек

dec byte_count         ; десятичного числа

brne s_loop loopl: Idi XL,low(bram) ;установка

Idi XH,high(bram)      ; начального адреса

clc                    ;С=0

Idi byte_count,n bloopl: Id acc,x

rol acc                ;сдвиг влево

St x+,acc              ; двоичного числа

dec byte_count brne bloopl

Idi XL,low(dram)       ;установка

Idi XH,high(dram)      ; начального адреса

Idi byte_count,k dloopl: Id acc,x

rcall muld2            ;коррекция десятичного числа

St x+,acc              ; и сдвиг влево

dec byte_count

brne dloopl

dec bit_count

brne loopl             ;повторить для всех разрядов

fin: rjmp fin

.include "muld2.asm"      ;вызываемые подпрограммы

.include "divd2.asm"

 

 

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты