Микроконтроллеры | Преобразование HEX-DEC |
|
---|---|---|
Разыскиваются примеры преобразования 2х байтового шестнадцетиричного числа (00)(00)-(FF)(FF) в 3х байтовое двоично-десятичное (по полубайтам раскиданы значения) (00)(00)-(FF)(FF) ->(00)(00)(00)-(06)(55)(36) (хх) - регистр Требование - использование произвольного набора регистров - тоесть без чтения регистрового пространства, как ячеек ОЗУ. Неиспользование младших 16 регистров. Максимум скорости. Второй вариант - это преобразование однобайтового числа. (00)-(FF) -> (00)(00)-(02)(56) |
|
|
Был апноут по такому преобразованию. Идея простая - преобразуемое число (два регистра) побитно вдвигается в регистры результата (3 регистра). Если при очередном вдвигании в какой-либо тетраде образуется комбинация более 10, к этой тетраде прибавляется число 6, в результате в следующую тетраду переходит единичка. Такая проверка выполняется последовательно на всех тетрадах. В итоге к моменту окончания сдвига (в данном случае 16 раз), в выходных регистрах образуется преобразованное число. Программа довольно наверченная, поскольку приходится работать с тетрадами. Исходники на ATMEGA дать не могу - не возникало такой задачи. Есть исходники под КР1878ВЕ1. Если интересно - вышлю. |
|
|
Посмотрите здесь, если я правильно вас понял. |
|
|
Еще одна идея (этот способ придуман для частотомера, который делаю сейчас на Atmega). Шестнадцатиричное число объемом в четыре разряда - это не что иное, как шестнадцатибитное двоичное. Программируем два действия: сложение двух десятичных чисел требуемой нам разрядности и умножение одного из них на два (и то и другое - столбиком). Предположим, что a и b - два двоично-десятичных числа, которые можно легко уместить и в регистры, а с - переводимое двоичное (оно же шестнадцатиричное). в b -результат То есть, результат равен сумме всех весов единичных разрядов в исходном числе. Не претендую на авторство, но этот метод буквально лежал на поверхности. |
|
|
Мне пока нужно только в десятичное переводить. Обратно может и понадобиться, но потом в другом проекте, да и то только для упрощения сравнения. |
|
|
GM: Посмотрите здесь, если я правильно вас понял. Не подходят, там код оптимизированный на скорость вычисления, а мне нужна оптимизация на минимум используемых регистров. К тому-же для результата используется память, которая у меня тоже занята на 100%. В идеале мне хорошо-б обойтись всего 5 регистрами в пределах R16-R31. Потому как везде что-то храниться, а места для сброса в ОЗУ в этом ОЗУ уже увы нет chav1961: Был апноут по такому преобразованию. Идея простая - преобразуемое число (два регистра) побитно вдвигается в регистры результата (3 регистра). Если при очередном вдвигании в какой-либо тетраде образуется комбинация более 10, к этой тетраде прибавляется число 6, в результате в следующую тетраду переходит единичка. Выдвигать с младщего байта или со старшего, вдвигать с младшего или со старшего ? Еще раз взываю о помощи, а то работа встала. |
|
|
Wladimir_TS, я уже писал, что от потетрадной обработки отказался, и вначале преобразую данные так, чтобы в каждом байте было число не более 99, а затем уж эти байты преобразую в BCD. С тетрадами гемора намного больше (и время выполнения, кстати, тоже). Если сильно горит, на выходных напЕшу прогу под ATMEL. Я так понимаю, у Вас что-то навроде Tiny15, раз проблемы с ОЗУ? |
|
|
Ну, попробуйте этот код, вырвал из проекта, преобразует двоичные числа в диапазоне 0-999999 в символьное представление. Вместо сохранения в озу поставьте сохранение в регистрах, первый фрагмент binas1 вам не нужен, можно убрать, ну сами разберётесь.
|
|
|
Вот вариант. Если проблема с памятью программ, вторую часть программы можно переписать на метод досчета, как реализовано у GM: |
|
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2024 |