реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Прошу помощи, Нужна идея для кода на С
PRidon
сообщение Dec 10 2013, 11:02
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 8-10-12
Пользователь №: 73 855



В автономном устройстве устоит 430 МК. С датчиков получает данные и обрабатывает. На выходе получаются большие числа пару 32 битных и одно 64 битное. Проблема в том, что нужно выводить на восьмисегментный дисплей эту информацию. Причем в десятичном виде. И в зависимости от входных параметров надо выводить либо старшие разряды, либо средние. И вот я не соображу как вычленить десятичные разряды из больших чисел. Пока в рамках отладки вычитаю по очереди тысячи, сотни, десятки и т.д. Но может кто из знатоков подскажет способ получше?
PS: память есть, в приоритете малое время выполнения.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Dec 10 2013, 13:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(PRidon @ Dec 10 2013, 14:02) *
Пока в рамках отладки вычитаю по очереди тысячи, сотни, десятки и т.д.

Я тоже так делал, но у меня 16-разрядные числа, и это не вызывало проблем с быстродействием. А вообще-то, есть же в Си функции типа itoa:
http://ru.wikipedia.org/wiki/Itoa_(%D0%A1%D0%B8)
Go to the top of the page
 
+Quote Post
PRidon
сообщение Dec 10 2013, 13:53
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 8-10-12
Пользователь №: 73 855



Ну с 16 разрядными числами проблем нет.
/* И у меня sprintf выполнялся за космические 50000 тактов. Может что не так делаю. Ибо есть примеры работы на Atmega128, где эта функция оч. быстро работала.*/
http://we.easyelectronics.ru/Soft/preobraz...lye-chisla.html - много расписано про преобразование в строки на МК.
Вот интересуют 64 разрядные.
Go to the top of the page
 
+Quote Post
_pv
сообщение Dec 10 2013, 13:55
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



на 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);
}
Go to the top of the page
 
+Quote Post
SSerge
сообщение Dec 10 2013, 14:28
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(PRidon @ Dec 10 2013, 20:53) *
//we.easyelectronics.ru/Soft/preobraz...lye-chisla.html[/url] - много расписано про преобразование в строки на МК.

У MSP есть команда DADD, поэтому можно существенно ускорить работу с двоично-десятичным представлением.
Вот только компилятор сам этого не сообразит, придётся писать ассемблерную функцию.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
PRidon
сообщение Dec 11 2013, 06:32
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 8-10-12
Пользователь №: 73 855



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

Тоже рассматривал вариант BCD чисел, но умножение 9999 на 99999 реализовывать сложновато. Да еще и температуру с АЦП получаемую в BCD представить с ходу не могу. А отдельное преобразование выльется с то же вычитание степеней. Поэтому пока остановлюсь на вычитании.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th August 2025 - 12:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01443 секунд с 7
ELECTRONIX ©2004-2016