Автор Тема: HEX2BCD - как сделать?  (Прочитано 5466 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн lgedmitry

  • Читаю форум
  • *****
  • Сообщений: 4532
  • Репутация: 28
  • Сергей, Рыбинск
  • Поблагодарили: +662
HEX2BCD - как сделать?
« : 18 Сентября 2013, 08:06:24 »
0
Ребят, может кто объяснит доходчиво, как сделать в атмеге преобразование одного байта (0x00...0xFF) в формат BCD на ассемблере? ;-[ ;-[ ;-[

Оффлайн hippo64

  • Старожил
  • *****
  • Сообщений: 6964
  • Репутация: 69
  • Владимир
  • Поблагодарили: +3212
Re: HEX2BCD - как сделать?
« Ответ #1 : 18 Сентября 2013, 08:19:21 »
0
Сереж, а что стандартный набор подпрограмм лень посмотреть? Есть там такое, гляну на рабочем компе, если сам не найдешь, оно уже лет как больше десяти прошло

и добавил...
Да тупо в виде сравнения и вываливания с новым значением напиши, на асме чем проще и тупее - тем быстрее выходит

Оффлайн lgedmitry

  • Читаю форум
  • *****
  • Сообщений: 4532
  • Репутация: 28
  • Сергей, Рыбинск
  • Поблагодарили: +662
Re: HEX2BCD - как сделать?
« Ответ #2 : 18 Сентября 2013, 08:24:40 »
0
Сереж, а что стандартный набор подпрограмм лень посмотреть?
Знач буду посмотреть, Вов ???

Оффлайн Segun

  • Старожил
  • *****
  • Сообщений: 1605
  • Репутация: 9
  • Поблагодарили: +309

Оффлайн lgedmitry

  • Читаю форум
  • *****
  • Сообщений: 4532
  • Репутация: 28
  • Сергей, Рыбинск
  • Поблагодарили: +662
Re: HEX2BCD - как сделать?
« Ответ #4 : 18 Сентября 2013, 09:52:12 »
0
http://controllersystems.com/books/praktika_programmirovaniya_atmel_avr/operacii-s-chislami-v-formate-bcd.html

Александр, спасибо!
Доехало: вычитаем по 10 копеек, пока carry не установится. Считаем при этом вычеты. Как установилось - вычитаем минус 10 (где-то уже читал, что в атмегах это проще, чем 10 добавлять). В итоге имеем: в счётчике вычитаний - десятки (ну и сотни можно легко замутить, если считать через одно место). А в остатке - единицы :v:

Оффлайн blindman

  • Старожил
  • *****
  • Сообщений: 797
  • Репутация: 13
  • Андрей
  • Поблагодарили: +17
Re: HEX2BCD - как сделать?
« Ответ #5 : 18 Сентября 2013, 11:54:31 »
0
Сергей, вот оптимизированный вариант:
; -----------------------------------------------------
bin2bcd:
; -----------------------------------------------------
; Преобразование однобайтного числа в распакованный BCD
; -----------------------------------------------------
; Вход : R16 - число от 0 до 255
; Выход: R18:17:16 -  BCD представление
; Изменяет: SREG
; -----------------------------------------------------
    ldi     R17, 0xFF       ; инициализация десятков и
    ldi     R18, 0xFF       ; сотен значением -1
hundreds:
    inc     R18             ; увеличиваем сотни
    subi    R16, 100        ; вычитаем 100 из исходного
    brcc    hundreds        ; если было > 100 - повторяем
    subi    R16, 256-100    ; компенсация лишнего вычитания
tens:
    inc     R17             ; увеличиваем десятки
    subi    R16, 10         ; вычитаем 10 из исходного
    brcc    tens            ; если было > 10 - повторяем
    subi    R16, 256-10     ; компенсация лишнего вычитания
    ret


В случае 8-битного числа этот способ самый быстрый.  Для преобразования больших чисел, особенно на 8-битных процессорах может быть эффективнее  метод под названием "Double dabble". Метод дает упакованный BCD (4 бита на цифру). Суть его в следующем: создается область памяти такого размера в битах, чтобы вместить и исходное число, и результат. Рассмотрим пример для 8-битного числа. Достаточно 20 бит (8 + 3*4). В младшие биты размещается исходное число, старшие инициализируем нулями - в них будет результат. Затем в цикле выполняем следующее :

проверяем все цифры результата (группы по 4 бита). Те из них, которые больше 4, увеличиваем на 3. Затем сдвигаем всю область памяти влево на 1 разряд.

Цикл повторяем 8 раз (сколько было бит в исходном числе). Потом забираем результат из старших разрядов. Пример кода:

; -----------------------------------------------------
bin2bcd2:
; -----------------------------------------------------
; Преобразование однобайтного числа в упакованный BCD
; -----------------------------------------------------
; Вход : R24 - число от 0 до 255
; Выход: R17:16 -  BCD представление
; Изменяет: R18, R24, SREG
; -----------------------------------------------------

    ldi     R16, 0      ; инициализация результата
    ldi     R17, 0      ;
    ldi     R18, 8      ; счетчик циклов
loop:
    cpi     R16, 0x05   ; сравнение разряда 0
    brhs    L1          ; если <= 4,  продолжаем
    subi    R16, 256-3     ; иначе увеличиваем разряд 0 на 3
L1:
    cpi     R16, 0x50   ; сравнение разряда 1
    brcs    L2          ; если <= 4,
    subi    R16, 256-(3*16); иначе увеличиваем разряд 1 на 3
L2:
    cpi     R17, 0x05   ; сравнение разряда 2
    brhs    L3          ; если <= 4, продолжаем
    subi    R17, -3     ; иначе, увеличиваем разряд 2 на 3
L3:
    lsl     R24         ; сдвиг
    rol     R16
    rol     R17
    dec     R18         ; цикл
    brne    loop
    ret


Оффлайн lgedmitry

  • Читаю форум
  • *****
  • Сообщений: 4532
  • Репутация: 28
  • Сергей, Рыбинск
  • Поблагодарили: +662
Re: HEX2BCD - как сделать?
« Ответ #6 : 18 Сентября 2013, 13:28:09 »
0
blindman, Андрей, спасибище! По 1-ому варианту всё понятно :v:
По второму - понятно только как делается. А что происходит - ваще не понятно. Вечерком попробую на бумажке нулики с единичками порисовать. Интересно до ужаса, что эта даблядабля такое вытворяет ???

и добавил...
проверил рисованием нуликов и единичек в тетрадке... Работает даблядабля... Аднака :d_know:

и добавил...
и антимат форумный - тоже работает... только не совсем адекватно...  :d_know:
« Последнее редактирование: 18 Сентября 2013, 20:40:48 от lgedmitry »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
47 Ответов
18232 Просмотров
Последний ответ 31 Января 2018, 22:32:15
от Konto
1 Ответов
1915 Просмотров
Последний ответ 20 Марта 2015, 22:06:26
от MetalHeart
35 Ответов
8828 Просмотров
Последний ответ 05 Апреля 2017, 13:32:52
от dimonos
0 Ответов
1775 Просмотров
Последний ответ 31 Марта 2017, 17:38:14
от kotofey
0 Ответов
3861 Просмотров
Последний ответ 02 Февраля 2019, 22:20:31
от Viktor D