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

 
 
> Вывод на семисегментный индикатор, PIC16F690
Сергей Владимиро...
сообщение May 29 2013, 17:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 24-05-13
Пользователь №: 76 966



Здравствуйте! Делаю вольтметр от 0 до 5В.

Результат измерения АЦП МК представляется двумя байтами. Например 5В - это 0х03 и 0хFF.

Я "складываю" их в переменную int, умножаю на цену деления 49 и получаю С3СF, это около 50127. Отбрасывая "7", остаётся значение для вывода на индикатор.

Алгоритм преобразования я написал - простой перебор. Из переменной short int 0x03FF в результате я получаю int 0x050127. Затем сдвигом выделяю нужные разряды и вывожу на индикатор.

Однако мой алгоритм работает очень медленно. Посоветуйте как правильно организовать преобразование шестнадцатиричного значение в десятичное. Спасибо.

Сообщение отредактировал Сергей Владимирович - May 29 2013, 17:57
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
demiurg_spb
сообщение May 30 2013, 07:12
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



посмотрите исходники bin2bcd


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
maksimp
сообщение Jun 1 2013, 17:55
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(Сергей Владимирович @ May 29 2013, 21:55) *
Посоветуйте как правильно организовать преобразование шестнадцатиричного значение в десятичное.

Код
char b[5];
short i=0;
do {
  b[i]=v%10;
  v/=10;
  i++;
} while (i<5);

v - исходное неотрицательное число, b - результат, цифры - b[0] младшая, b[4] старшая.
Go to the top of the page
 
+Quote Post
igorle
сообщение Aug 22 2013, 13:32
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



У меня использование операции "остаток от деления" значительно увеличивает размер скомпилированного кода. Я бы сдеалал как-то так:

Код
#define CAPACITY 5
#define DIVIDER 10000 /* DIVIDER should be 10^(CAPACITY - 1) */

char b[CAPACITY] = {0};
int i;
int divider = DIVIDER;

for (i = 0; i < CAPACITY; i++)
{
    while (v > divider)
    {
        v -= divider;
        b[i]++;
    }
    divider /= 10;
}


Сообщение отредактировал igorle - Aug 22 2013, 13:33
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 23 2013, 07:29
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



А у меня так реализовано:
Код
void bin2bcd(uint8_t* dst, uint16_t bin)  // max 9999
{
    if (bin>9999U)  // to feet in signed int type
    {
        bin = 9999U;
    }

    uint_fast8_t i = 4;

    do
    {
        div_t x = div(bin, 10U);

        dst[--i] = x.rem;
        bin      = x.quot;

    } while (i);
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th July 2025 - 13:19
Рейтинг@Mail.ru


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