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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 7,981
Сказал спасибо: 0
Сказали Спасибо 4,939 раз(а) в 2,369 сообщении(ях)
jump на пути к лучшему
По умолчанию Re: Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16

аппноты для авр с сайта атмел не смотрели? там вроде в 200-204 числах есть вся математика - сравните
jump вне форума  
Непрочитано 29.11.2012, 01:37  
kittec
Гражданин KAZUS.RU
 
Регистрация: 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.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 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.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
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.RU
 
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,106
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
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, время: 19:52.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot