Kuznec9999 0 29 апреля, 2008 Опубликовано 29 апреля, 2008 (изменено) · Жалоба Проблема следующая. После оцифровки сигнала в АЦП, в регистре имеется 8бит данных. Задача преобразовать этот двоичный регистр в три, к которые будут отображаться на трёх семисегментных индикаторах соответственно. В индикаторах должен отображаться десятичный эквивалент сигнала (0-255). Подскажите, легко ли это реализовать на ассемблере, и где про это можно почитать? Спасибо. Изменено 29 апреля, 2008 пользователем Kuznec9999 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 29 апреля, 2008 Опубликовано 29 апреля, 2008 · Жалоба Ключевое слово для поиска по форуму - BCD. Вот в теме про исходники вроде что-то было. http://electronix.ru/forum/index.php?showtopic=10934 А я как-то вот такой алгоритм (правда на Си) предлагал http://caxapa.ru/116486.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuznec9999 0 29 апреля, 2008 Опубликовано 29 апреля, 2008 (изменено) · Жалоба Ключевое слово для поиска по форуму - BCD. Вот в теме про исходники вроде что-то было. http://electronix.ru/forum/index.php?showtopic=10934 А я как-то вот такой алгоритм (правда на Си) предлагал http://caxapa.ru/116486.html Спасибо. Жаль, что все исходники в основном на Си. А мне хотелось бы разобраться в алгоритме этого преобразования. Скажите, а что такое BCD? Так называется данное преобразование? Изменено 29 апреля, 2008 пользователем Kuznec9999 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 29 апреля, 2008 Опубликовано 29 апреля, 2008 · Жалоба Жаль, что все исходники в основном на Си. А мне хотелось бы разобраться в алгоритме этого преобразования.Вы меня, конечно, извините, но исходник на С это и есть алгоритм, записанный практически чистейшим английским языком.Скажите, а что такое BCD? Так называется данное преобразование?В таких случаях обычно сначало спрашивают гугля. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 29 апреля, 2008 Опубликовано 29 апреля, 2008 · Жалоба Спасибо. Жаль, что все исходники в основном на Си. А мне хотелось бы разобраться в алгоритме этого преобразования.Дык алгоритм может быть реализован на любом языке программирования. А алгоритм реализованный на ЯВУ проще понять, чем асм-овый ИМХО. Скажите, а что такое BCD? Так называется данное преобразование? Binary-coded decimal из Википедии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
domowoj 0 30 апреля, 2008 Опубликовано 30 апреля, 2008 (изменено) · Жалоба Есть много методов преобр. Самый быстрый - табличный(если не жалко памяти), самый медленный - вычитаешь из bin 1 - прибавляешь 1 к 3-х байтному числу, анализируя достижение каждого байта числа 10, если 10 - сбрасываешь его и прибавляешь 1 к след. байту, и т.д. Есть оптимальные алгоритмы в букварях http://lord-n.narod.ru/walla.html поищи, не помню где именно. Изменено 30 апреля, 2008 пользователем domowoj Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 30 апреля, 2008 Опубликовано 30 апреля, 2008 (изменено) · Жалоба Спасибо. Жаль, что все исходники в основном на Си. А мне хотелось бы разобраться в алгоритме этого преобразования. Алгоритм этого преобразования описан у Титце-Шенка на стр. 321-322 (в инете можно найти если у тебя нет). Правда, реализовать его на С проблематично - он изобилует сдвигами и проверками переноса из 3-го разряда в 4-й. А я как-то вот такой алгоритм (правда на Си) предлагал http://caxapa.ru/116486.html Боюсь что ваш алгоритм не самый эффективный. А вообще-то все уже написано до нас: в аппнотах в avr204.asm Изменено 30 апреля, 2008 пользователем 777777 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 30 апреля, 2008 Опубликовано 30 апреля, 2008 · Жалоба Есть много методов преобр. Самый быстрый - табличный(если не жалко памяти), самый медленный - вычитаешь из 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; не претендую на оптимальность , но сам так делаю Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 30 апреля, 2008 Опубликовано 30 апреля, 2008 · Жалоба не претендую на оптимальность , но сам так делаю Да уж... Господа, читайте классику, она вечна. :) И программа в avr24.asm основана именно на алгоритме, описанном у Титце-Шенка (см. выше). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TarasH 0 30 апреля, 2008 Опубликовано 30 апреля, 2008 · Жалоба Смотри сюда http://www.atmel.ru/Articles/Atmel13.htm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 30 апреля, 2008 Опубликовано 30 апреля, 2008 · Жалоба Смотри сюда http://www.atmel.ru/Articles/Atmel13.htm В данной статье рассматривается программа "bin16bcd5" (см. Приложение, Программа 1), написанная Терешкиным А. В. согласно алгоритму, изложенному в [1], и выполняющая ту же задачу. Последняя программа по быстродействию, длине кода и количеству используемых регистров оказалась более эффективной, чем первая. Че-то я не представляю как она могла оказаться быстрее, если в ней требуется выполнить до 10 вычитаний на каждую цифру, т.е. всего 50, плюс кучу проверок, а в avr204.asm коротенький цикл выполняется лишь 16 раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 16 30 апреля, 2008 Опубликовано 30 апреля, 2008 (изменено) · Жалоба Ещё пару ссылок: int >> str itoa на asm, из темы "51 vs AVR"... Тема возникает с завидной регулярностью.. :) Изменено 30 апреля, 2008 пользователем blackfin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 30 апреля, 2008 Опубликовано 30 апреля, 2008 · Жалоба Че-то я не представляю как она могла оказаться быстрее, если в ней требуется выполнить до 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) ;* Использованные указатели :нет Столько же слов, в два раза меньше регистров, минимум в четыре раза быстрее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 30 апреля, 2008 Опубликовано 30 апреля, 2008 · Жалоба Это, конечно, быстрее, чем делением на 10 А что вас так смущает деление на 10? В пределах байта это 4 сдвига и 4 сложения Равно как и умножение Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuznec9999 0 30 апреля, 2008 Опубликовано 30 апреля, 2008 · Жалоба Попробовал avr204.asm, а именно bin2bcd8... На выходе числа не соответствуют входу (контроллер mega8) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться