Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16

Непрочитано 28.11.2012, 23:56  
analitik33
Прописка
 
Регистрация: 11.11.2007
Сообщений: 143
Сказал спасибо: 15
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
analitik33 на пути к лучшему
По умолчанию Преобразование двоичного числа в двоично-десятичное: от К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.
Это число мне показалось удобным для теста, т. к. при нем десятичная коррекция происходит только один раз в последнем, восьмом проходе цикла.
Ошибку самостоятельно найти отчаялся! Если кто-нибудь свежим взглядом подскажет решение буду признателен!
Реклама:
analitik33 вне форума  
Непрочитано 29.11.2012, 00:31  
jump
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 8,011
Сказал спасибо: 0
Сказали Спасибо 4,955 раз(а) в 2,379 сообщении(ях)
jump на пути к лучшему
По умолчанию Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16

аппноты для авр с сайта атмел не смотрели? там вроде в 200-204 числах есть вся математика - сравните
jump вне форума  
Непрочитано 29.11.2012, 01:37  
kittec
Гражданин KAZUS.RUN
 
Регистрация: 14.11.2008
Сообщений: 701
Сказал спасибо: 298
Сказали Спасибо 283 раз(а) в 193 сообщении(ях)
kittec на пути к лучшему
По умолчанию Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16

Сообщение от jump Посмотреть сообщение
аппноты для авр с сайта атмел не смотрели? там вроде в 200-204 числах есть вся математика - сравните
Так не интересно, а поговорить.
kittec вне форума  
Сказали "Спасибо" kittec
true71 (01.12.2012)
Непрочитано 29.11.2012, 09:10  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16

Сообщение от analitik33 Посмотреть сообщение
Если кто-нибудь свежим взглядом подскажет решение буду признателен!
Решения подсказывают не свежим взглядом. Далеко не...
Взглядом перелопачивают кучу мусора, который выкладывают отдельные дяди (забыв о форматировании кодов) с надеждой что обязательно кто-то придет эту кучу перелопачивать. Уважаемый. Скажите себе "Это задача тривиальная, решалась и многими и не раз, и наверняка в инете есть решения" - зачем же сразу на форум, за готовеньким? Ведь даже мозг особо подключать не надо, лишь глаза и пальцы. Остальное доделает Гугл...
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Непрочитано 29.11.2012, 17:09  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию 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
=GM= вне форума  
Непрочитано 29.11.2012, 20:53  
analitik33
Прописка
 
Регистрация: 11.11.2007
Сообщений: 143
Сказал спасибо: 15
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
analitik33 на пути к лучшему
По умолчанию Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16

=GM=, спасибо за подсказку, но в Вашем алгоритме напрягают вот эти команды:
add r18,0x01
add r17,0x10

Как бы с ними разобраться?
analitik33 вне форума  
Непрочитано 29.11.2012, 22:54  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию Да не с чем там разбираться

В 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.
=GM= вне форума  
Непрочитано 30.11.2012, 00:07  
analitik33
Прописка
 
Регистрация: 11.11.2007
Сообщений: 143
Сказал спасибо: 15
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
analitik33 на пути к лучшему
По умолчанию Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16

В системе команд МК АВР нет таких команд. АВР-Студия выдает ошибки.
analitik33 вне форума  
Непрочитано 30.11.2012, 00:18  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16

Сообщение от analitik33 Посмотреть сообщение
напрягают вот эти команды
действительно
Нажмите на изображение для увеличения
Название: Image1.jpg
Просмотров: 145
Размер:	29.6 Кб
ID:	40923
Вот стандартная функция
в imp1, imp2 входное число (16 бит), в tmp3 - tmp1 (в старшем и младшем ниблах по числу) в формате _, десятки тысяч, тысячи, сотни, десятки, единицы. Название: KidRock_07.gif
Просмотров: 1766

Размер: 939 байт
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.
omercury вне форума  
Непрочитано 30.11.2012, 08:52  
makakus
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.10.2007
Сообщений: 2,758
Сказал спасибо: 1,100
Сказали Спасибо 1,033 раз(а) в 568 сообщении(ях)
makakus на пути к лучшему
По умолчанию Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16

Сообщение от analitik33 Посмотреть сообщение
напрягают вот эти команды:
add r18,0x01
add r17,0x10
Как бы с ними разобраться?
subi r18,-1

вот здесь очень правильно написано
makakus вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование числа в строку STM32 Cocox sanstan Embedd С 16 05.11.2016 17:58
Преобразование числа vvkka Микроконтроллеры, АЦП, память и т.д 12 27.12.2011 01:44
преобразование 16bit числа на Си (нужна помощь) Uz_Sleep_Walker Микроконтроллеры, АЦП, память и т.д 4 19.02.2010 15:49
преобразование из двоичного в двоич-десятичное CERGEI1982 Микроконтроллеры, АЦП, память и т.д 0 25.01.2007 15:50
преобразование числа для занесения его в регистр на PIC16F84 CERGEI1982 Микроконтроллеры, АЦП, память и т.д 9 11.01.2007 17:47


Часовой пояс GMT +4, время: 21:12.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.