Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Своими руками

Своими руками Завершенные и текущие проекты, хард & софт

Ответ
 
Опции темы Опции просмотра
Старый 11.05.2016, 19:20   #76
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/92
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от HHIMERA Посмотреть сообщение
На 9999999... не взлетело...

Ну, почему "не взлетело"!?

float_to_asci(9999999, 1, & buff[0]); // 9999999.2
float_to_asci(9999999, 2, & buff[0]); // 9999998.27

Вообще, в формате float верных 7 десятичных цифр. Остальные существуют только в воображении Pridnya.
Vlad&mir вне форума   Ответить с цитированием
Старый 11.05.2016, 19:28   #77
HHIMERA
Banned
 
Регистрация: 10.06.2008
Возраст: 55
Сообщений: 2,716
Вес репутации: 3742/0
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение

Ну, почему "не взлетело"!?
Может из-за моего режима "Иван Сусанин"... завёл прямо в заблуждение...
Цитата:
Я слегка "причесал" этот "примитив". Довёл его до signed long, погасил ведущие нули, добавил терминальный ноль и т.п.

Код:
unsigned char itoa4(signed long binval, char * buff)
http://www.microchip.su/showpost.php...6&postcount=41
itoa4... не взлетает...
HHIMERA вне форума   Ответить с цитированием
Старый 11.05.2016, 20:18   #78
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/92
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от HHIMERA Посмотреть сообщение
Может из-за моего режима "Иван Сусанин"... завёл прямо в заблуждение...

http://www.microchip.su/showpost.php...6&postcount=41
itoa4... не взлетает...
Там вычитание миллиона по моему недосмотру пропущено!
Вот так правильно:
Код:
unsigned char itoa4(signed long binval, char * buff)
{
  unsigned long step[]= {1000000000, 100000000, 10000000, 1000000, 100000, 10000, 1000, 100, 10, 1};

  unsigned long temp;
  unsigned char i, j, flag, atemp;

    flag = 0;

    if(binval < 0)
     {
          binval = -binval;
        * buff++ = '-';
          j      =  1;
     }
     else  j =  0;

    for (i = 0; i < 10; i++)
     {
        temp  = step[i];

        atemp = '0';

        while(binval >= temp)
         {
            atemp++;

            binval -= temp;
         }

        if(flag || (atemp > '0') || (i == 8))
         {
            * buff++ = atemp;
              flag   = 1;
              j++;
         }
     }

    * buff = 0; 

    return j;
}
Виноват, простите!

Последний раз редактировалось Vlad&mir; 11.05.2016 в 20:32.
Vlad&mir вне форума   Ответить с цитированием
Старый 11.05.2016, 21:36   #79
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Возраст: 38
Сообщений: 4,422
Вес репутации: 4370/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Вообще, в формате float верных 7 десятичных цифр. Остальные существуют только в воображении Pridnya.
Pridnya нигде не упоминал, что float имеет более 7 "верных десятичных знаков", наоборот он известил Vlad&mir-а о существовании "более трех".. Я задал параметры при которых ваша функция выдала кракозябры, т.е. показал, что утверждение "довел до логического конца" не верно. И вообще, если вы в чем-то не видите смысла, то это не означает, что его нет.
Поэтому упоминание Pridnya в негативном контексте неуместно.
PS: Сам я жадные алгоритмы перестал применять лет пять назад. А так в первом серийном изделии старался, из 512 килобайт памяти программа заняла примерно 60 килобайт, затем при переносе кода мои когда-то работающие жадные алгоритмы значительно проигрывали в скорости и точности.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 11.05.2016, 21:50   #80
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4345/92
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Pridnya нигде не упоминал...
Во! А кто в числе 123.456789F шестой знак после запятой искал?

Дима, ты мне напоминаешь некого Bill-а из Челябинска (что-то его давно не было). Ему, правда, 65 лет, а тебе только 37. Рано тебе ещё терять чувство юмора!
Vlad&mir вне форума   Ответить с цитированием
Старый 11.05.2016, 21:59   #81
HHIMERA
Banned
 
Регистрация: 10.06.2008
Возраст: 55
Сообщений: 2,716
Вес репутации: 3742/0
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Сам я жадные алгоритмы перестал применять лет пять назад. А так в первом серийном изделии старался, из 512 килобайт памяти программа заняла примерно 60 килобайт, затем при переносе кода мои когда-то работающие жадные алгоритмы значительно проигрывали в скорости и точности.
И что удивляет??? Экономил память... продул в скорости... Так бывает...
Вот поэтому и важны разные варианты... чтобы всё сложилось...
HHIMERA вне форума   Ответить с цитированием
Старый 11.05.2016, 22:44   #82
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Возраст: 38
Сообщений: 4,422
Вес репутации: 4370/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Во! А кто в числе 123.456789F шестой знак после запятой искал?

Дима, ты мне напоминаешь некого Bill-а из Челябинска (что-то его давно не было). Ему, правда, 65 лет, а тебе только 37. Рано тебе ещё терять чувство юмора!
Нашел
Код:
float fValue = 123.456789F;
float_to_asci(fValue, 1, Buffer);
cout<<Buffer<<endl; // 123.4
float_to_asci(fValue, 2, Buffer);
cout<<Buffer<<endl; // 123.45
float_to_asci(fValue, 3, Buffer);
cout<<Buffer<<endl; // 123.456
float_to_asci(fValue, 4, Buffer);
cout<<Buffer<<endl; // 0.0000
float_to_asci(fValue, 5, Buffer);
cout<<Buffer<<endl; // 0.00000
float_to_asci(fValue, 6, Buffer);
cout<<Buffer<<endl; // 0.000000

float fValue = 12345.6789F;
sprintf(Buffer, "%.1f",fValue);
...
sprintf(Buffer, "%.6f",fValue); // Обратите внимание sprintf() более менее, хоть не ноль. :)
cout<<Buffer<<endl; // 12345.678711
Я не собирался искать шестой знак, я просто написал простейший тест на количество знаков, чтобы ваша функция вылетела. Я предполагал, что она вылетит и ваше "довел до логического конца" потеряет смысл. Кроме того, я предполагал, что вас это заденет и вы как опытный исполнитель дабы не потерять лицо продолжите "доводить до логического конца" дальше, при этом я как бы руковожу вашими действиями (как троечники руководят отличниками) и по окончании даже могу воспользоваться результатом вашего труда. Но смысл не в этом. Здесь нужно показать, что сам такой подход к решению задач "в окрестностях точки A" он порождает новые решения старой задачи с новыми условиями, т.е. с тем же sprintf() по функциональности не сравнится. А вдруг еще какой Кардан Фрилансерович позаимствует код плохо протестированной функции и очередной Протон-М упадет в океан. Мы (картофелеводы) осознавая ответственность за Россию (не меньше...во масштаб) желаем не допустить такового, искалеченных судеб ламеров (заимствующих код не думая, т.е. это не к вам) и членов их семей, потому желаем освятить тему, с выходом за рамки "окрестности точки A".

Цитата:
Сообщение от HHIMERA Посмотреть сообщение
И что удивляет??? Экономил память... продул в скорости... Так бывает...
Вот поэтому и важны разные варианты... чтобы всё сложилось...
Немного не так. При выборе микроконтроллера был взят МК с объемом памяти 512 килобайт (на перспективу), а после освоения МК оказалось, что его модуль FPU очень медленный (мне нужно было в реалтайме считать ДПФ, корень квадратный, арктангенс для восьми векторов и много еще чего), потому пришлось отказаться от float и использовать жадные алгоритмы, которые на той архитектуре работали быстро, а те же жадные алгоритмы на другой архитектуре в разы проигрывали стандартным библиотечным функциям (по скорости). Получился "бред переносимости". А память дешевеет с каждым годом, скорость микроконтроллеров растет, архитектуры совершенствуются, поэтому не вижу особого смысла в применении жадных алгоритмов. Спустя годы та же фишка память заполнена на 12%, функция sprintf() "летает"...может, для 8-ми и 16-ти биток имеет смысл...ну и для развития мозга. Да и для 8-ми биток в этом случае лучше подойдет не float, а fixed point.
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 11.05.2016 в 22:55.
Pridnya вне форума   Ответить с цитированием
Старый 12.05.2016, 01:17   #83
HHIMERA
Banned
 
Регистрация: 10.06.2008
Возраст: 55
Сообщений: 2,716
Вес репутации: 3742/0
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Я не собирался искать шестой знак
Цитата:
я просто написал простейший тест на количество знаков, чтобы ваша функция вылетела.
Цитата:
Я предполагал, что она вылетит
Цитата:
я предполагал, что вас это заденет
Цитата:
я как бы руковожу вашими действиями
Цитата:
Мы (картофелеводы) осознавая ответственность за Россию
А вы там точно... картофель выращиваете???
Цитата:
Получился "бред переносимости".
Бывает... Меня тоже частенько пугает... когда тупо перетягивают восьмибитные решения на тридцатидвухбитки... а потом говорят "не работает"... Например "микросекундные задержки"... или тупой ногодрыг... или не учитывают особенности архитектуры... или не юзают периферию... Что поделать... мир не идеален...

Последний раз редактировалось HHIMERA; 12.05.2016 в 01:23.
HHIMERA вне форума   Ответить с цитированием
Старый 12.05.2016, 11:16   #84
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Возраст: 38
Сообщений: 4,422
Вес репутации: 4370/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от HHIMERA Посмотреть сообщение
Бывает... Меня тоже частенько пугает... когда тупо перетягивают восьмибитные решения на тридцатидвухбитки... а потом говорят "не работает"... Например "микросекундные задержки"... или тупой ногодрыг... или не учитывают особенности архитектуры... или не юзают периферию... Что поделать... мир не идеален...
Но здесь у Vlad&mir-а можно сказать удачно получилось с функцией float_to_ascii(). И его функция на STM32F4 с модулем FPU работает до 6 раз быстрее, чем стандартный sprintf(), т.е. 3 мкс против 18-ти мкс (168 МГц). Т.е. в отдельных случаях можно её использовать. Хорошо поработал. Молодец.
Миниатюры
speed.PNG  
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 12.05.2016, 12:05   #85
HHIMERA
Banned
 
Регистрация: 10.06.2008
Возраст: 55
Сообщений: 2,716
Вес репутации: 3742/0
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Но функция на STM32F4 с модулем FPU работает до 6 раз быстрее, чем стандартный sprintf(), т.е. 3 мкс против 18-ти мкс (168 МГц).
На F0... хоть и без FPU... те же 500 циклов... что и не удивительно...
HHIMERA вне форума   Ответить с цитированием
Старый 12.05.2016, 12:17   #86
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Возраст: 38
Сообщений: 4,422
Вес репутации: 4370/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от HHIMERA Посмотреть сообщение
На F0... хоть и без FPU... те же 500 циклов... что и не удивительно...
Значит FPU не используется, негде. А так ради интереса поискал в интернете готовые решения аналогичных функциий, нашел char * ftoa(double f, char * buf, int precision), она у него для double, но если заменить double на float, и внутри функции 1.0 на 1.0F и т.д., то считает вообще за 2 мкс, это в два раза быстрее, чем решение предложенное Vlad&mir-ом (прочитает, за 1 мкс сделает).
Код:
/**
 *  stm32tpl --  STM32 C++ Template Peripheral Library
 *
 *  Copyright (c) 2009-2014 Anton B. Gusev aka AHTOXA
 *
 ...
 *  file         : ftoa.c
 *  description  : convert double to string
 *
 */

#define MAX_PRECISION    (10)
static const float rounders[MAX_PRECISION + 1] =
{
    0.5,                // 0
    0.05,                // 1
    0.005,                // 2
    0.0005,                // 3
    0.00005,            // 4
    0.000005,            // 5
    0.0000005,            // 6
    0.00000005,            // 7
    0.000000005,        // 8
    0.0000000005,        // 9
    0.00000000005        // 10
};

char * ftoa(float f, char * buf, int precision)
{
    char * ptr = buf;
    char * p = ptr;
    char * p1;
    char c;
    long intPart;

    // check precision bounds
    if (precision > MAX_PRECISION)
        precision = MAX_PRECISION;

    // sign stuff
    if (f < 0.0F)
    {
        f = -f;
        *ptr++ = '-';
    }

    if (precision < 0)  // negative precision == automatic precision guess
    {
        if (f < 1.0F) precision = 6;
        else if (f < 10.0F) precision = 5;
        else if (f < 100.0F) precision = 4;
        else if (f < 1000.0F) precision = 3;
        else if (f < 10000.0F) precision = 2;
        else if (f < 100000.0F) precision = 1;
        else precision = 0;
    }

    // round value according the precision
    if (precision)
        f += rounders[precision];

    // integer part...
    intPart = f;
    f -= intPart;

    if (!intPart)
        *ptr++ = '0';
    else
    {
        // save start pointer
        p = ptr;

        // convert (reverse order)
        while (intPart)
        {
            *p++ = '0' + intPart % 10;
            intPart /= 10;
        }

        // save end pos
        p1 = p;

        // reverse result
        while (p > ptr)
        {
            c = *--p;
            *p = *ptr;
            *ptr++ = c;
        }

        // restore end pos
        ptr = p1;
    }

    // decimal part
    if (precision)
    {
        // place decimal point
        *ptr++ = '.';

        // convert
        while (precision--)
        {
            f *= 10.0F;
            c = f;
            *ptr++ = '0' + c;
            f -= c;
        }
    }

    // terminating zero
    *ptr = 0;

    return buf;
}
Смотрел на
Код:
float fValue = 1234.567F;
ftoa(fValue, Buffer, 3);
PS: А как вы циклы считаете?
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 12.05.2016 в 12:23.
Pridnya вне форума   Ответить с цитированием
Старый 12.05.2016, 12:44   #87
HHIMERA
Banned
 
Регистрация: 10.06.2008
Возраст: 55
Сообщений: 2,716
Вес репутации: 3742/0
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Значит FPU не используется, негде.
Я те про 41-й пост... а ты мне про картоху...
Цитата:
А так ради интереса поискал в интернете готовые решения аналогичных функциий,
Чо... дух эмбеддерства укусил???
Цитата:
(прочитает, за 1 мкс сделает).
А без фанатизма...
Цитата:
А как вы циклы считаете?
пинодрыгом... в железе...
HHIMERA вне форума   Ответить с цитированием
Старый 12.05.2016, 14:08   #88
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Возраст: 38
Сообщений: 4,422
Вес репутации: 4370/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от HHIMERA Посмотреть сообщение
пинодрыгом... в железе...
Я три метода использовал:
1) по ногодрыгу и осциллографом;
2) с помощью таймера;
3) через DWT (считает циклы).
Кстати, так не проще? Совпадает с ногодрыгом и таймером, результат выводим в Printf(Debug)Viewer.
Код:
// RCC_Clocks.SYSCLK_Frequency = 168000000 Гц.
int cycles=0;
      
SCB_DEMCR |= 0x01000000;
DWT_CYCCNT  = 0;
DWT_CONTROL|= 1;
DelayUs(1000);      // Код.
cycles=DWT_CYCCNT;
printf("cycles = %d\n",cycles);        // 120164
printf("seconds = %f\n",(float)cycles/(float)RCC_Clocks.SYSCLK_Frequency);    // 0.000715 секунд.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 12.05.2016, 14:34   #89
HHIMERA
Banned
 
Регистрация: 10.06.2008
Возраст: 55
Сообщений: 2,716
Вес репутации: 3742/0
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Pridnya Посмотреть сообщение
через DWT (считает циклы).
Кстати, так не проще? Совпадает с ногодрыгом и таймером
Во-первых... что за магические цифры...
Почему не так???
Код:
    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    DWT->CYCCNT       = 0;
    DWT->CTRL        |= DWT_CTRL_CYCCNTENA_Msk;
Во-вторых... в случае с Ф0... откуда там DWT???
На остальных линейках... DWT конечно предпочтительнее...
HHIMERA вне форума   Ответить с цитированием
Старый 12.05.2016, 15:01   #90
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Возраст: 38
Сообщений: 4,422
Вес репутации: 4370/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от HHIMERA Посмотреть сообщение
Во-первых... что за магические цифры...
Почему не так???
Код:
    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    DWT->CYCCNT       = 0;
    DWT->CTRL        |= DWT_CTRL_CYCCNTENA_Msk;
Во-вторых... в случае с Ф0... откуда там DWT???
На остальных линейках... DWT конечно предпочтительнее...
Не знал, что у Ф0 нет DWT.

Так, конечно, читабельнее, но, вроде, в core_cm4.h все есть, а код не собирается.
Код:
#define CoreDebug_DEMCR_TRCENA_Pos         24                                             /*!< CoreDebug DEMCR: TRCENA Position */
#define CoreDebug_DEMCR_TRCENA_Msk         (1UL << CoreDebug_DEMCR_TRCENA_Pos)            /*!< CoreDebug DEMCR: TRCENA Mask */

typedef struct
{
  __IO uint32_t DHCSR;                   /*!< Offset: 0x000 (R/W)  Debug Halting Control and Status Register    */
  __O  uint32_t DCRSR;                   /*!< Offset: 0x004 ( /W)  Debug Core Register Selector Register        */
  __IO uint32_t DCRDR;                   /*!< Offset: 0x008 (R/W)  Debug Core Register Data Register            */
  __IO uint32_t DEMCR;                   /*!< Offset: 0x00C (R/W)  Debug Exception and Monitor Control Register */
} CoreDebug_Type;

#define CoreDebug_BASE      (0xE000EDF0UL)                            /*!< Core Debug Base Address            */
...
#define CoreDebug           ((CoreDebug_Type *)     CoreDebug_BASE)   /*!< Core Debug configuration struct    */
PS: Вот так получается
Код:
#define    SCB_DEMCR     *(volatile unsigned long *)0xE000EDFC

  // CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
  SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
  DWT->CYCCNT       = 0;
  DWT->CTRL        |= DWT_CTRL_CYCCNTENA_Msk;
Миниатюры
error.PNG  
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 12.05.2016 в 15:12.
Pridnya вне форума   Ответить с цитированием
Старый 12.05.2016, 15:31   #91
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Возраст: 38
Сообщений: 4,422
Вес репутации: 4370/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Делюсь программой преобразования float в массив для вывода, например, на LCD

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Так, конечно, читабельнее, но, вроде, в core_cm4.h все есть, а код не собирается.
Виноват! Собирается. У меня в main.h был кусок с DEMCR, если его закомментировать, то собирается.
Код:
#include<stdio.h>

#define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))
#define ITM_Port16(n)   (*((volatile unsigned short*)(0xE0000000+4*n)))
#define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))

#define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))
#define TRCENA          0x01000000

struct __FILE { int handle; /* Add whatever is needed */ };
FILE __stdout;
FILE __stdin;

int fputc(int ch, FILE *f) {
  if (DEMCR & TRCENA) {
    while (ITM_Port32(0) == 0);
    ITM_Port8(0) = ch;
  }
  return(ch);
}
PS: А кусок этот нужен был для вывода в Printf(Debug)Viewer, а теперь он стал таким
Код:
#include<stdio.h>

struct __FILE { int handle; /* Add whatever is needed */ };
FILE __stdout;
FILE __stdin;

int fputc(int ch, FILE *f) 
{
    ITM_SendChar(ch);
    
  return(ch);
}
И это стало совместимо с этим
Код:
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT       = 0;
DWT->CTRL        |= DWT_CTRL_CYCCNTENA_Msk;
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 12.05.2016 в 15:46.
Pridnya вне форума   Ответить с цитированием
Старый 12.05.2016, 21:41   #92
HHIMERA
Banned
 
Регистрация: 10.06.2008
Возраст: 55
Сообщений: 2,716
Вес репутации: 3742/0
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от Pridnya Посмотреть сообщение
поискал в интернете готовые решения аналогичных функциий, нашел char * ftoa(double f, char * buf, int precision), она у него для double, но если заменить double на float, и внутри функции 1.0 на 1.0F и т.д., то считает вообще за 2 мкс
Понятно... Ф4... 168МГц... ФПУ... аппаратное деление...
Исходные данные... float fValue = 1234.567F;

ftoa() за 2мкс... или 336 тактов...
float_to_ascii() за 3мкС... или 504 такта...


Посмотрим что будет на Ф0...

ftoa() ... 1276 тактов...
float_to_ascii() ... 732 такта!!!

А чо... для float_to_ascii()... силён ещё обрезок... убийца восьмибиток...
HHIMERA вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Присоветуйте тип и способ управления MOSFETом "верхнего" плеча dr_Sash Источники питания и силовая электроника 37 08.09.2012 18:50
подключение магнитолы Sergey1 Общетехнические вопросы 10 27.12.2007 22:39
Помогите, пожалуйста, найти ошибку в коде Катя Микроконтроллеры других производителей 26 08.12.2007 14:58
проблемка с PIC16F628A bereg_ok Продукция MICROCHIP 72 07.09.2007 11:00
LCD BC2004C посоветуйте что нибудь для начала на ассемблере Leonid_O Общетехнические вопросы 3 29.05.2007 10:15


Часовой пояс GMT +3, время: 23:35.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot