AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
28.11.2012, 23:56
|
|
Прописка
Регистрация: 11.11.2007
Сообщений: 143
Сказал спасибо: 15
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16
Решил в познавательных целях перенести алгоритм преобразования двоичного числа в три десятичные цифры из книги Гуртовцева и Гудыменко "Программы для микропроцессоров" 1989 на AVR Мегу16.
Алгоритм основан на 8-ми сдвигах влево через перенос с удвоением суммы и последующей двоично-десятной коррекцией.
Вот предлагаемая в книге на стр.151-152 программа для микропроцессора К580:
;П810
;Подпрограмма преобразования двоичного целого числа в двоично-десятичное число формата 3*4
;Входной параметр (С) - двоичное число. Выходной параметр (H,L) - эквивалентное двоично-десятичное число (3 цифры)
************************************************** ************************************
LXI H, 0 ; Обнуление текущей суммы
MVI B, 8 ; Загрузка счетчика циклов
; Сдвиг двоичного числа влево
ЦИКЛ: MOV A, C
RLC
MOV C, A
; Двоично-десятичнон удвоение суммы с учетом переноса
MOV A, L
ADC L
DAA
MOV L, A
MOV A, H
ADC H
DAA
MOV H, A
; Проверка конца цикла
DCR B
JNZ ЦИКЛ ; Зацикливание
RET
END
А вот что у меня получилось в AVR-Студии:
; Преобразование однобайтного двоичного числа в трехзначное десятичное
; по алгоритму Гуртовцева стр.151
; Двоично-десятичная коррекция выполнена подпрограммой DAA
; Входной параметр - R18. Результат H-R0 L-R1
.include "m16def.inc" ; Присоединение файла описаний
;-------------------------- Инициализация стека
ldi r16, high(RAMEND) ; Выбор старшего байта вершины стека
out SPH, r16 ; Запись его в регистр стека
ldi r16, low(RAMEND) ; Выбор младшего байта вершины стека
out SPL, r16 ; Запись его в регистр стека
clr r0 ; Очистка
clr r1 ; Очистка
ldi r18, 0x8C ; Запись исходного байта
ldi r16, 0x08 ; Запись счетчика циклов
P8101:
rol r18 ; Циклический сдвиг исходного байта влево через перенос
; Двоично-деятичное удвоение суммы с учетом переноса
; Младший байт
mov r17, r1
adc r17, r1 ; Удвоение суммы
rcall DAA ; Вызов подпрограммы двоично-десятичной коррекции
mov r1, r17 ; Возврат промежуточного результата
; Старший байт
mov r17, r0
adc r17, r0 ; Удвоение суммы
rcall DAA ; Вызов подпрограммы двоично-десятичной коррекции
mov r0, r17 ; Возврат промежуточного результата
nop
dec r16 ; Декремент счетчика циклов
brne P8101
nop
DAA: ; Подпрограмма двоично-десятичной коррекции
mov r20, r17 ; Копирование исходного байта в r20
mov r21, r17 ; Копирование исходного байта в r21
swap r21 ; Обмен тетрадами
ldi r22, 0x06
andi r20, 0x0F ; Выдедение младшей тетрады
andi r21, 0x0F ; Выдедение старшей тетрады
; Анализ и обработка младшей тетрады
cpi r20, 0x0A ;
brlo daa01 ; Переход по метке если не превышает 9
add r20, r22 ; Прибавление 6
inc r21 ; Инкремент старшей тетрады
daa01:
; Анализ и обработка старшей тетрады
cpi r21, 0x0A ;
brlo daa02 ; Переход по метке если не превышает 9
add r21, r22 ; Прибавление 6
bset 6 ; Установка пользовательского флага в регистре флагов
daa02:
bclr 0 ; Сброс бита переноса в регистре флагов (стр.189 Евстифеев)
; Обработка признака переноса
brtc daa03
bset 0 ; Установка бита переноса в регистре флагов (стр.200 Евстифеев)
bclr 6 ; Сброс пользовательского флага в регистре флагов
daa03:
; Упаковка результата
andi r20, 0x0F ; Очистка тетрады
andi r21, 0x0F ; Очистка тетрады
swap r21 ; Старшая тетрада результата на своем месте
or r20, r21 ; Логич. ИЛИ (восстановление байта)
mov r17, r20
ret ; Конец подпрограммы
Двоично-десятичная коррекция выполнена в виде подпрограммы DAA.
Программа не зациклена умышленно, так как дальше тестов в AVR-Студии дело не пошло.
К сожалению, программа корректно не заработала. Ручную проверку алгоритма я проводил на числе 140(10), т.е. 0x8C, помещаемого в R18.
Это число мне показалось удобным для теста, т. к. при нем десятичная коррекция происходит только один раз в последнем, восьмом проходе цикла.
Ошибку самостоятельно найти отчаялся! Если кто-нибудь свежим взглядом подскажет решение буду признателен!
|
|
|
|
29.11.2012, 00:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 8,001
Сказал спасибо: 0
Сказали Спасибо 4,946 раз(а) в 2,373 сообщении(ях)
|
Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16
аппноты для авр с сайта атмел не смотрели? там вроде в 200-204 числах есть вся математика - сравните
|
|
|
|
29.11.2012, 01:37
|
|
Гражданин KAZUS.RU
Регистрация: 14.11.2008
Сообщений: 701
Сказал спасибо: 298
Сказали Спасибо 283 раз(а) в 193 сообщении(ях)
|
Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16
Сообщение от jump
|
аппноты для авр с сайта атмел не смотрели? там вроде в 200-204 числах есть вся математика - сравните
|
Так не интересно, а поговорить.
|
|
|
|
29.11.2012, 09:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16
Сообщение от analitik33
|
Если кто-нибудь свежим взглядом подскажет решение буду признателен!
|
Решения подсказывают не свежим взглядом. Далеко не...
Взглядом перелопачивают кучу мусора, который выкладывают отдельные дяди (забыв о форматировании кодов) с надеждой что обязательно кто-то придет эту кучу перелопачивать. Уважаемый. Скажите себе "Это задача тривиальная, решалась и многими и не раз, и наверняка в инете есть решения" - зачем же сразу на форум, за готовеньким? Ведь даже мозг особо подключать не надо, лишь глаза и пальцы. Остальное доделает Гугл...
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
29.11.2012, 17:09
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16
Сообщение от analitik33
|
Ошибку самостоятельно найти отчаялся
|
Чёт у вас сильно накручено. Вот вариант попроще.
clr r17 ;r16 – source number
clr r18
m1: cpi r16,100
brmi m2
subi r16,100
add r18,0x01
rjmp m1
m2: cpi r16,10
brmi m3
subi r16,10
add r17,0x10
rjmp m2
m3: add r17,r16 ;r18-r17 – BCD number
|
|
|
|
29.11.2012, 20:53
|
|
Прописка
Регистрация: 11.11.2007
Сообщений: 143
Сказал спасибо: 15
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16
=GM=, спасибо за подсказку, но в Вашем алгоритме напрягают вот эти команды:
add r18,0x01
add r17,0x10
Как бы с ними разобраться?
|
|
|
|
29.11.2012, 22:54
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Да не с чем там разбираться
В r18,r17 будет находиться требуемое число в формате 0, ч2, ч1, ч0.
Вот команда add r18,0x01 ведёт подсчёт ч2, команда add r17,0x10 ведёт подсчёт ч1, а команда add r17,r16 определяет ч0.
Добавлено 30.11.12. Прошу прощения за невольное введение в заблуждение. В своё оправдание могу сказать, что не проверял фрагмент в железе или симуляторе, просто набросал идею. Как правильно сказано ниже, команды add r18,0x01 в аврках не существует, конечно же надо вычитать отрицательное число, т.е. использовать команду subi r18,-0x01. [Добавил здесь, чтобы было в одном месте.]
Последний раз редактировалось =GM=; 30.11.2012 в 11:28.
|
|
|
|
30.11.2012, 00:07
|
|
Прописка
Регистрация: 11.11.2007
Сообщений: 143
Сказал спасибо: 15
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16
В системе команд МК АВР нет таких команд. АВР-Студия выдает ошибки.
|
|
|
|
30.11.2012, 00:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,489
Сказал спасибо: 30
Сказали Спасибо 3,071 раз(а) в 2,012 сообщении(ях)
|
Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16
Сообщение от analitik33
|
напрягают вот эти команды
|
действительно
![Нажмите на изображение для увеличения
Название: Image1.jpg
Просмотров: 145
Размер: 29.6 Кб
ID: 40923](https://kazus.ru/forums/attachment.php?attachmentid=40923&thumb=1&d=1354220317)
Вот стандартная функция
в imp1, imp2 входное число (16 бит), в tmp3 - tmp1 (в старшем и младшем ниблах по числу) в формате _, десятки тысяч, тысячи, сотни, десятки, единицы. ![Название: KidRock_07.gif
Просмотров: 1766
Размер: 939 байт](https://kazus.ru/forums/attachment.php?attachmentid=40924&d=1354220948)
cntDec - счётчик интераций.
В строке загрузки cntDec подсказка по поводу разрядности входного числа.
PHP код:
|
;************************************************* ;Преобразование 2х байт ;************************************************* BinToDecRegTwoByte: clr tmp1 clr tmp2 clr tmp3 ldi cntDec,8*2 ;8-16-24-32 Rot21: rol imp1 ;Младший rol imp2 ;Старший rol tmp1 ; Разряды 0 и 1 rol tmp2 ; Разряды 2 и 3 rol tmp3 ; Разряд 4 dec cntDec brne Rot22 ret ;************************************************* Rot22: mov temp1,tmp1 rcall DecodeOneByte ;Разряды 0 и 1 mov tmp1,temp1 mov temp1,tmp2 rcall DecodeOneByte ;Разряды 2 и 3 mov tmp2,temp1 mov temp1,tmp3 rcall DecodeOneByte ;Разряд 5 mov tmp3,temp1 rjmp Rot21 ;************************************************* **** ; Преобразование одного байта (в регистрах) ;************************************************* **** DecodeOneByte: ldi temp,$03 add temp,temp1 sbrc temp,3 mov temp1,temp ldi temp,$30 add temp,temp1 sbrc temp,7 mov temp1,temp ret ;************************************************* ****
|
Выдрано из кода для тиньки15, а там РАМы нет. Всё в регистрах.
Последний раз редактировалось omercury; 30.11.2012 в 00:37.
|
|
|
|
30.11.2012, 08:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16
Сообщение от analitik33
|
напрягают вот эти команды:
add r18,0x01
add r17,0x10
Как бы с ними разобраться?
|
subi r18,-1
вот здесь очень правильно написано
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:30.
|
|