Перейти к содержанию
    

Проблема следующая. После оцифровки сигнала в АЦП, в регистре имеется 8бит данных. Задача преобразовать этот двоичный регистр в три, к которые будут отображаться на трёх семисегментных индикаторах соответственно. В индикаторах должен отображаться десятичный эквивалент сигнала (0-255). Подскажите, легко ли это реализовать на ассемблере, и где про это можно почитать? Спасибо.

Изменено пользователем Kuznec9999

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ключевое слово для поиска по форуму - BCD. Вот в теме про исходники вроде что-то было. http://electronix.ru/forum/index.php?showtopic=10934

А я как-то вот такой алгоритм (правда на Си) предлагал http://caxapa.ru/116486.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ключевое слово для поиска по форуму - BCD. Вот в теме про исходники вроде что-то было. http://electronix.ru/forum/index.php?showtopic=10934

А я как-то вот такой алгоритм (правда на Си) предлагал http://caxapa.ru/116486.html

 

Спасибо. Жаль, что все исходники в основном на Си. А мне хотелось бы разобраться в алгоритме этого преобразования. Скажите, а что такое BCD? Так называется данное преобразование?

Изменено пользователем Kuznec9999

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Жаль, что все исходники в основном на Си. А мне хотелось бы разобраться в алгоритме этого преобразования.
Вы меня, конечно, извините, но исходник на С это и есть алгоритм, записанный практически чистейшим английским языком.
Скажите, а что такое BCD? Так называется данное преобразование?
В таких случаях обычно сначало спрашивают гугля.

post-17095-1209512959_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Жаль, что все исходники в основном на Си. А мне хотелось бы разобраться в алгоритме этого преобразования.
Дык алгоритм может быть реализован на любом языке программирования. А алгоритм реализованный на ЯВУ проще понять, чем асм-овый ИМХО.

Скажите, а что такое BCD? Так называется данное преобразование?
Binary-coded decimal из Википедии.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть много методов преобр.

Самый быстрый - табличный(если не жалко памяти),

самый медленный - вычитаешь из bin 1 - прибавляешь 1 к 3-х байтному числу, анализируя достижение

каждого байта числа 10, если 10 - сбрасываешь его и прибавляешь 1 к след. байту, и т.д.

Есть оптимальные алгоритмы в букварях http://lord-n.narod.ru/walla.html

поищи, не помню где именно.

Изменено пользователем domowoj

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Жаль, что все исходники в основном на Си. А мне хотелось бы разобраться в алгоритме этого преобразования.

 

Алгоритм этого преобразования описан у Титце-Шенка на стр. 321-322 (в инете можно найти если у тебя нет). Правда, реализовать его на С проблематично - он изобилует сдвигами и проверками переноса из 3-го разряда в 4-й.

 

А я как-то вот такой алгоритм (правда на Си) предлагал http://caxapa.ru/116486.html

 

Боюсь что ваш алгоритм не самый эффективный.

 

А вообще-то все уже написано до нас: в аппнотах в avr204.asm

Изменено пользователем 777777

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть много методов преобр.

Самый быстрый - табличный(если не жалко памяти),

самый медленный - вычитаешь из bin 1 - прибавляешь 1 к 3-х байтному числу, анализируя достижение

каждого байта числа 10, если 10 - сбрасываешь его и прибавляешь 1 к след. байту, и т.д.

:cranky: :01:

итого 255 итераций для преобразования числа 255?

:01: :01: :01:

а просто поделить на 10 никак?

 

Я бы сделал так:

char number;
char digit1=0; // 1 цифра
char digit2=0; // 1 цифра
char digit3=0; // 1 цифра
...
number=...     // 

...
if(number>=200)
{
  digit1=2;
  number-=200;
}
else 

  if(number>=100)
  {
    digit1=1;
    number-=100;
  }
digit2=number/10;
digit3=number-digit2*10;

не претендую на оптимальность , но сам так делаю

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не претендую на оптимальность , но сам так делаю

Да уж... Господа, читайте классику, она вечна. :) И программа в avr24.asm основана именно на алгоритме, описанном у Титце-Шенка (см. выше).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

В данной статье рассматривается программа "bin16bcd5" (см. Приложение, Программа 1), написанная Терешкиным А. В. согласно алгоритму, изложенному в [1], и выполняющая ту же задачу.

Последняя программа по быстродействию, длине кода и количеству используемых регистров оказалась более эффективной, чем первая.

 

Че-то я не представляю как она могла оказаться быстрее, если в ней требуется выполнить до 10 вычитаний на каждую цифру, т.е. всего 50, плюс кучу проверок, а в avr204.asm коротенький цикл выполняется лишь 16 раз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё пару ссылок:

 

int >> str

itoa на asm, из темы "51 vs AVR"...

 

Тема возникает с завидной регулярностью.. :)

Изменено пользователем blackfin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Че-то я не представляю как она могла оказаться быстрее, если в ней требуется выполнить до 10 вычитаний на каждую цифру, т.е. всего 50, плюс кучу проверок, а в avr204.asm коротенький цикл выполняется лишь 16 раз.

Ну так сравнить код и всё!

В avr204.asm цикл для bin2BCD16 не такой и коротенький.

Внутри 16 проходов цикла сдвига делается ещё десятичная коррекция, команды для которой у AVR нет. Это у 51-го можно коррекцию делать во время сдвига, выходит аккуратно и быстро.

Коррекция там сама сделана как цикл по байтам результата, итого это три прохода.

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

Во внутреннем цикле два вычитания, итого уже 16*3*2 = 96 гарантированных вычитаний.

Ещё там максимум четыре косвенных обращения к регистрам как к памяти через указатель Z, которые вместе эквивалентны четырём словным вычитаниям. Ещё эквивалент максимум 16*3*4 = 192 вычитания.

Итого 288 макс.

 

И Вы говорите, что 50 _максимум_ это много?

Ну и их там не 50. Для последней цифры единички вычитать не нужно вообще, для предпоследней вычитания байтовые, а не словные, для первой будет вычитаться максимум 7 раз. Ну там ещё компенсационные сложения для восстановления числа, итого там "лень считать, но в переводе на словные вычитания точно не больше 40".

Итого: avr204.asm

;* Number of words    :25
;* Number of cycles    :751/768 (Min/Max)
;* Low registers used    :3 (tBCD0,tBCD1,tBCD2) 
;* High registers used  :4(fbinL,fbinH,cnt16a,tmp16a)    
;* Pointers used    :Z

25 слов, 9 регистров, больше 750 тактов.

 

Метод вычитания с atmel.ru

;* Количество слов кода            :25 + возврат
;* Количество циклов               :25/176 (Мин/Макс) + возврат
;* Использованные младшие регистры :нет
;* Использованные старшие регистры :4(fbinL,fbinH/tBCD0,tBCD1,tBCD2)
;* Использованные указатели        :нет

Столько же слов, в два раза меньше регистров, минимум в четыре раза быстрее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это, конечно, быстрее, чем делением на 10

А что вас так смущает деление на 10?

В пределах байта это 4 сдвига и 4 сложения

Равно как и умножение

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал avr204.asm, а именно bin2bcd8... На выходе числа не соответствуют входу (контроллер mega8)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...