Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прошу помощи
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
PRidon
В автономном устройстве устоит 430 МК. С датчиков получает данные и обрабатывает. На выходе получаются большие числа пару 32 битных и одно 64 битное. Проблема в том, что нужно выводить на восьмисегментный дисплей эту информацию. Причем в десятичном виде. И в зависимости от входных параметров надо выводить либо старшие разряды, либо средние. И вот я не соображу как вычленить десятичные разряды из больших чисел. Пока в рамках отладки вычитаю по очереди тысячи, сотни, десятки и т.д. Но может кто из знатоков подскажет способ получше?
PS: память есть, в приоритете малое время выполнения.
kovigor
Цитата(PRidon @ Dec 10 2013, 14:02) *
Пока в рамках отладки вычитаю по очереди тысячи, сотни, десятки и т.д.

Я тоже так делал, но у меня 16-разрядные числа, и это не вызывало проблем с быстродействием. А вообще-то, есть же в Си функции типа itoa:
http://ru.wikipedia.org/wiki/Itoa_(%D0%A1%D0%B8)
PRidon
Ну с 16 разрядными числами проблем нет.
/* И у меня sprintf выполнялся за космические 50000 тактов. Может что не так делаю. Ибо есть примеры работы на Atmega128, где эта функция оч. быстро работала.*/
http://we.easyelectronics.ru/Soft/preobraz...lye-chisla.html - много расписано про преобразование в строки на МК.
Вот интересуют 64 разрядные.
_pv
на 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
Цитата(PRidon @ Dec 10 2013, 20:53) *
//we.easyelectronics.ru/Soft/preobraz...lye-chisla.html[/url] - много расписано про преобразование в строки на МК.

У MSP есть команда DADD, поэтому можно существенно ускорить работу с двоично-десятичным представлением.
Вот только компилятор сам этого не сообразит, придётся писать ассемблерную функцию.
PRidon
Цитата(SSerge @ Dec 10 2013, 18:28) *
У MSP есть команда DADD, поэтому можно существенно ускорить работу с двоично-десятичным представлением.
Вот только компилятор сам этого не сообразит, придётся писать ассемблерную функцию.

Тоже рассматривал вариант BCD чисел, но умножение 9999 на 99999 реализовывать сложновато. Да еще и температуру с АЦП получаемую в BCD представить с ходу не могу. А отдельное преобразование выльется с то же вычитание степеней. Поэтому пока остановлюсь на вычитании.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.