PRidon 0 10 декабря, 2013 Опубликовано 10 декабря, 2013 · Жалоба В автономном устройстве устоит 430 МК. С датчиков получает данные и обрабатывает. На выходе получаются большие числа пару 32 битных и одно 64 битное. Проблема в том, что нужно выводить на восьмисегментный дисплей эту информацию. Причем в десятичном виде. И в зависимости от входных параметров надо выводить либо старшие разряды, либо средние. И вот я не соображу как вычленить десятичные разряды из больших чисел. Пока в рамках отладки вычитаю по очереди тысячи, сотни, десятки и т.д. Но может кто из знатоков подскажет способ получше? PS: память есть, в приоритете малое время выполнения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 6 10 декабря, 2013 Опубликовано 10 декабря, 2013 · Жалоба Пока в рамках отладки вычитаю по очереди тысячи, сотни, десятки и т.д. Я тоже так делал, но у меня 16-разрядные числа, и это не вызывало проблем с быстродействием. А вообще-то, есть же в Си функции типа itoa: http://ru.wikipedia.org/wiki/Itoa_(%D0%A1%D0%B8) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PRidon 0 10 декабря, 2013 Опубликовано 10 декабря, 2013 · Жалоба Ну с 16 разрядными числами проблем нет. /* И у меня sprintf выполнялся за космические 50000 тактов. Может что не так делаю. Ибо есть примеры работы на Atmega128, где эта функция оч. быстро работала.*/ http://we.easyelectronics.ru/Soft/preobraz...lye-chisla.html - много расписано про преобразование в строки на МК. Вот интересуют 64 разрядные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 78 10 декабря, 2013 Опубликовано 10 декабря, 2013 · Жалоба на msp430 поочередное вычитание степеней 10 будет быстрее чем деление на 10. void putd32 (u32 data){ const u32 pow10Table[] = {1000000000ul, 100000000ul, 10000000ul, 1000000ul, 100000ul, 10000ul, 1000ul, 100ul, 10ul, 1ul}; if(data == 0) { putc('0'); return; } u8 i = 0; u8 add0 = 0; do { u32 pow10 = pow10Table[i++]; u8 digit = 0; while(data >= pow10) { digit++; data -= pow10; } if (digit) {add0 = 1; putc(digit + '0');} else if (add0) putc('0'); } while(i < 10); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 10 декабря, 2013 Опубликовано 10 декабря, 2013 · Жалоба //we.easyelectronics.ru/Soft/preobraz...lye-chisla.html[/url] - много расписано про преобразование в строки на МК. У MSP есть команда DADD, поэтому можно существенно ускорить работу с двоично-десятичным представлением. Вот только компилятор сам этого не сообразит, придётся писать ассемблерную функцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PRidon 0 11 декабря, 2013 Опубликовано 11 декабря, 2013 · Жалоба У MSP есть команда DADD, поэтому можно существенно ускорить работу с двоично-десятичным представлением. Вот только компилятор сам этого не сообразит, придётся писать ассемблерную функцию. Тоже рассматривал вариант BCD чисел, но умножение 9999 на 99999 реализовывать сложновато. Да еще и температуру с АЦП получаемую в BCD представить с ходу не могу. А отдельное преобразование выльется с то же вычитание степеней. Поэтому пока остановлюсь на вычитании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться