Перейти к содержанию

Видеокурс по AVR-микроконтроллерам для начинающих


Рекомендуемые сообщения

Тоже что ли поэкспериментировать и написать вывод нормального числа с фиксированной точкой? Не, лень: и тестировать скорость нечем, и не оценят.

Viktor26, "Положение точки" имелось в виду положение точки относительно правого края числа, в координатах дисплея. А вовсе не положение точки в самом числе.

Alex, на изиэлектронике проводили сравнение по методам перевода числа в строку. Оказалось, что utoa занимает меньше всего места (зато самое медленное), а деление на 10 сдвигами - самое быстрое, так что про itoa вы зря.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

так что про itoa вы зря
Дак я и говорю, даже с её неповоротливостью, и то получилось быстрее.

Дак это всё на скорую руку было написано. Если конкретно углубиться в тему и посидеть часик-второй-третий-...., то можно очень хорошо с'оптимизировать всё это дело.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

в практическом занятии 6 урока рассказывалось о возможности сложения умножения деления вычитания

в функции вывода дробных значений Lcd_printf(x, y, FONT_1X, chiclo, 2);

f_data=3,1415

а уменя выходят непонятные числа

Lcd_printf(0, 0, FONT_1X, f_data*2, 4);

а уменя выходят непонятное число -0.2706

подскажите в чем ошибка

если деление и вычитание считают правильно

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

А я писал - пройдитесь отладчиком, сразу станет ясно на каком этапе ошибка. Это же элементарная процедура поиска ошибок!

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

вот увидите, через пару дней будет пост примерно такого содержания "прошелся отладчиком и нашел ошибку, ниужели никто не мог подсказать начинающему?"

читать то не хотят, писать только хотят))))

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Viktor26, Вы же сами говорили, что эта библиотека - самое то для начинающего, а сейчас уже начинающего просите пройтись отладчиком и найти в ней косяки :)

Вы сами попробуйте пример, который показал человек, убедитесь что проблема не у него, а в библиотеке, пройдитесь отладчиком, исправьте ошибки библиотеки и выложите сюда исправления. Вот это будет справедливей, нежели тыкать человека в его код, не убедившись в его исправности :)

Я сегодня гонял эту функцию и прекрасно понимаю в чём проблема у человека...

Ссылка на комментарий
Поделиться на другие сайты

Как будто предложение пройти отладчиком - недостаточная подсказка. Впрочем, немногие, кому на это надо намекать, воспользуются советом с умом.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

- подсказака, но не в полном объёме для начинающих. В полном - я сказал где проблема.

Вообще, отладка должна быть у людей, пишущих программы, на уровне инстинкта автоматизма. Программы невозможно писать без отладки. Тут и подсказака не нужна никакая.

Ссылка на комментарий
Поделиться на другие сайты

так я прошел эти видеоуроки, в этом месте у меня косяков не было. все корректно выводилось. а с минусом цифры выводились из-за переполнения переменной в которое АЦП складывали. решалось это уменьшением количества раз складывания или правильным объявлением типа переменной.

и вообще где дядька KOBZAR???

Изменено пользователем Viktor26

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

"не было косяков" - это не значит что их нет :)

Я говорю - повторите пример человека и увидите, что "косяк" выявится.

Я, например, сегодня не поленился и посмотрел внутренности этой чудо-библиотеки. Мне, по крайней мере, многое об авторе они рассказали.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо, Alex, без вас вряд ли бы заинтересовался этой темой. Даже странно, как оно работало: завершающего нуля в массиве нет, разве что надежда на очищенную память?

Ну и при попытке вывода числа получалось "--..)*(" после чего ошибка тоже стала очевидной. Как думаете, намекнуть ему, а заодно kobzar'у, про разрядность чисел?

Кстати, это не Виктор настаивал на отладчике, а я. И, кстати, если бы он прошел отладчиком, проблемный участок стал бы виден. Если, конечно, смотреть значения всех переменных.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Как думаете, намекнуть ему, а заодно kobzar'у, про разрядность чисел?
Думаю, тут и намекать не нужно, достаточно посмотреть на выложенный мной код, там всё понятно станет :) В нём, кстати, проблем таких не будет (с разрядностью при формировании строки).

ЗЫ: Может перепишем им библиотеку ? :crazy:

Ссылка на комментарий
Поделиться на другие сайты

Точно? short те же 2 байта, что и int, по крайней мере, в AVR. Кстати, у меня выдает ту же фигню, что и в прошлом случае. Вот если заменить на long начинает выдавать нормальное значение.

А на счет идеи переписать библиотеку - я за! Только тестировать на на чем, разве что на обычном i686-gcc.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

или правильным объявлением типа переменной.

Вот если заменить на long начинает выдавать нормальное значение.

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Вот если заменить на long начинает выдавать нормальное значение.
Выше несколькими постами поднимитесь, после того, как с шортом выкладывал, под спойлером :) Там Ltoa :)

C шортом я выложил - просто копирнул один в один, добавил табличное чтение и заменил инт на шорт, т.к. они эквивалентны на 8-ми битниках. Нормальный вариант, с лонгом, я потом уже сделал, когда увидел эти проблемы.

Вот, чтобы долго не искать :

/************************************************************************************/
const float exp_data[]={
1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000
};
//-------------------------------------------------------
char *gftoa(float f, unsigned char dec) {
static char buf[9+3];
char *p=&buf[strlen(ltoa((long)(f*exp_data[dec]), &buf[1], 10))+2];
for(*p--=0; (dec--)&&(p!=buf); ) *(p--)=*(p-1);
*p='.';
if(p==&buf[1]){ *--p='0'; return &buf[0]; }
return &buf[1];
}
/************************************************************************************/

Только тестировать на на чем, разве что на обычном i686-gcc.
Да пофиг на чём, там примитивы :)

или правильным объявлением типа переменной.

Вот если заменить на long начинает выдавать нормальное значение.

Виктор, Вы немного не допонимаете о чём идёт речь. Проблема с разрядностью в библиотеке, а не у юзеров.

Я же Вам говорю - попробуйте пример, который выложил вопрошающий, и всё поймёте.

Ссылка на комментарий
Поделиться на другие сайты

Ну это уж как-то слишком лобовое решение... Хотя, может, и правда, сдвиги в конечной строке будут быстрее, чем проверки на каждой итерации. Хотя, всего 11 разрядов даже для 32-битного числа не так уж много.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Ну, естественно, это решение было лобовым, на скорую руку. Чтобы нормально сделать, нужно сидеть, гонять, отлаживать, думать, .... Возможно, есть и более оптимальные варианты.

Мало того, это лобное решение выиграло оригинальный вариант по всем параметрам + ещё и с разрядностью нет проблем, которые, оказывается, тут у многих возникают.

Ссылка на комментарий
Поделиться на другие сайты

Вот решение для 32-битных чисел с фиксированной точкой. Чувствую, что можно оптимизировать, но не соображу как.

char *sfix_toa(int32_t x, int8_t dec){
 char *buf = buffer+13;
 signed char sign=0;
 if(x<0){x = -x; sign = 1;}
 *--buf = 0;
 do{
    *--buf = '0' + x%10;
    x /= 10;
    if(--dec == 0)*--buf='.';
 }while(x);
 if(dec == 0){
    *--buf='0';
 }else if(dec>0){
    while(--dec>=0)*--buf='0';
    *--buf='.';
    *--buf='0';
 }
 if(sign)*--buf='-';
 return buf;
}

Сейчас еще пошаманю на счет быстрого преобразования.

char * ffix_toa(int32_t value, int8_t dec){
 signed char sign = 0;
 char res;
 char *buf = buffer + 13;
 int32_t temp, qq;
 if(value<0){sign = 1; value = -value;}
 *--buf = 0;
 do{
   temp = value;
   value>>=1;
   value += value>>1;
   value += value>>4;
   value += value>>8;
   value += value>>16;
   qq = value &~ 7ul;
   value >>=3;
   res = (uint8_t)(temp - ((value<<1) + (qq)));
   if(res > 9){
  res -= 10;
  value++;
   }
   *--buf = res+'0';
   if(--dec == 0)*--buf='.';
 }while (value != 0);
 if(dec == 0){
    *--buf='0';
 }else if(dec > 0){
    while(--dec >= 0)*--buf='0';
    *--buf='.';
    *--buf='0';
 }
 if(sign)*--buf='-';
 return buf;
}

Вот оно. Насколько они быстрые и сколько занимают места - хз, по сути это копипаст с изиэлектроники, допиленный под фиксированную точку. Вот на счет "допила" не уверен.

UPD: обнаружил у себя во втором варианте ошибку - пофиксил.

Изменено пользователем COKPOWEHEU

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Так я и написал, что это для чисел с фиксированной точкой. :huh:. Впрочем, это же Си, приведение типов никуда не делось.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...