Easyelectronics.ru

Электроника для всех
Текущее время: 24 окт 2019, 00:16

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 14:09 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 31 авг 2012, 16:52
Сообщения: 72
Откуда: Москва
Проблема такая: с АЦП получаю три байта показаний,
перевожу в целое число uint32 и далее перевожу обратно в char массив и вывожу на ЖКИ в виде цифр, пока от 0 до 16777215.
Так всё вроде работает но когда резистором подхожу ближе к 0 код замирает на определённых участках. Похоже пробрема в (sprintf).
Вот как всё выглядит:
Код:
char buffer[8]={0};
uint8_t buf_spi[4]={0};
uint32_t Volt;
Volt=*(uint32_t*)buf_spi;// Перевод массива uint8 в uint32.
Потом:
Код:
sprintf(buffer, "%i", Volt);          // преобразования в дес.
Далее мне sprintf выдал цифру квер ногами и мне прешлось править,
в старшем ниббле преобразованного числа она даёт 3 к ней я и зацепился:
Код:
uint8_t n=0;
   for(uint8_t i=0;i<8;i++){uint8_t buf=buffer[i];if((buf>>=4)!=0)n++;else i=8;}   
   for(uint8_t i=0;i<(n-1);i++){uint8_t buf=buffer[n-1];buffer[n-1]=buffer[i];buffer[i]=buf;n--;}            
   buffer[0]&=0x0F;buffer[1]&=0x0F;buffer[2]&=0x0F;buffer[3]&=0x0F;
   buffer[4]&=0x0F;buffer[5]&=0x0F;buffer[6]&=0x0F;buffer[7]&=0x0F;   
Чувствую что это полная фигня но конкретного примера немогу найти хотя всё кишыт на форумах по конвертациям.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 14:26 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1027
Что такое "выдал цифру квер ногами"? sprintf выдаёт строку в соответствии с запрошенным форматом. Тебе надо что-то типа "00000001" получить? Попробуй "%08d". Волшебная 3 это часть ASCII-кода символа. 0x30 = '0', ..., 0x39 = '9'.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 14:44 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 31 авг 2012, 16:52
Сообщения: 72
Откуда: Москва
Ну если Volt =123 то на выходе 00000321. на самом индикаторе если считать buffer[0] младшим.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 14:51 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 31 авг 2012, 16:52
Сообщения: 72
Откуда: Москва
Если так:
Код:
Volt=123;
   sprintf(buffer, "%08d", Volt);
то на выходе 32100000.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 14:54 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1027
Чёт ты загоняешься :) В строке первый символ имеет 0-й индекс.

uint8_t str[8] = "01234567";
это всё равно что str[0]='0'; str[1]='1'; ..., str[7]='8';

6Ф1П писал(а):
Если так:
Код:
Volt=123;
   sprintf(buffer, "%08d", Volt);
то на выходе 32100000.
Ну, то что надо. Осталось 0-й и 7-й в голове на место поставить. В памяти они и так на месте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 15:00 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 31 авг 2012, 16:52
Сообщения: 72
Откуда: Москва
Похоже при "%08d" стало на 0 корректно работать!
Большое тебе спасибо добрый "волчёк".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 15:07 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3662
Навряд ли это есть решение проблемы. "%08d" всего лишь добавляет нули в начало и выравнивает по правому краю, но порядок не цифр меняет, что и логично. Проблема осталась, и её надо искать в другом месте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 15:13 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1027
Нет никакой проблемы, он просто первый символ строки выводит в младший разряд индикатора, вот она и переворачивается. Выведет начало строки в старший разряд индикатора и всё будет зачепись.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 15:26 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3662
Но "%08d" тут никак не влияет на это. Потому и говорю - не там ищите.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 15:36 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1027
Мы ничего не ищем, с помощью "%08d" строка правильно сформирована и готова к выводу на индикатор. Зачем ты тут какую-то проблему пытаешься выдумать непонятно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 16:20 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3662
Затем, что и без помощи "%08d" строка будет так же правильно сформирована. Проблема была в другом. Ты просто не умеешь анализировать :))) Вот в чем твоя проблема, и она у тебя стара как мир :))))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 16:33 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1027
До
Цитата:
Ну если Volt =123 то на выходе 00000321.

После
Цитата:
то на выходе 32100000.

Не видишь разницы? Сожалею.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 17:31 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3662
А ты не видишь разницы между 123 и 321? :))) О боже, да Славик настолько крут, что может не замечать этого! Слава Славе! Герою Слава! :))))
Проблема не в выравнивании, проблема в порядке вывода на дисплей. С этого и надо было начинать решать, а не лезть в выравнивание. Можно и через жопу, но правильно питаться - через рот :))) В очередной раз ржу со Славки :)))) Как можно быть настолько упоротым, и при этом не переставать быть затычкой в каждой бочке :)))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 17:38 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1027
6Ф1П, смотри какое предложение. Если ты откажешься от приведения символов к цифрам buffer[0]&=0x0F и "научишь" индикатор показывать символы '0','1',...,'9' и пробел ' ', то тогда сможешь погасить на индикаторе незначащие нули форматной строкой "%8d".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 07 сен 2019, 20:21 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 31 авг 2012, 16:52
Сообщения: 72
Откуда: Москва
У меня графическй ЖКИ МТ-12864 я уже здесь как то писал.
И я к нему обращаюсь через епром I2C со своими цифрами(картинками).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 09 сен 2019, 09:17 
Старожил

Зарегистрирован: 20 окт 2015, 18:14
Сообщения: 313
6Ф1П писал(а):
Код:
uint32_t Volt;
sprintf(buffer, "%i", Volt);          // преобразования в дес.


Тут вроде ошибка, надо так:
sprintf(buffer, "%li", Volt);
printf


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 09 сен 2019, 16:56 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5692
6Ф1П писал(а):
добрый "волчёк".


Ваащето дюдюка барбидокская


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 11 сен 2019, 11:41 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 67
Не любля всякие спринтфы, поэтому сделал сам простую отображалку чисел.
Линия на экране для отображения числа.
Код:
typedef struct {
   uint8_t size;
   uint8_t x;
   uint8_t y;
   uint8_t align;
   uint8_t format;
   char str[gui_str_len];
} gui_line;

Отрисовка линии.
Код:
void gui_line_draw(gui_line *line)
{
   uint8_t i=0,temp,flag=0;
   gui_xy(line->x,line->y);
   while(i<line->size){
      temp=line->str[i];
      if(temp==0)flag=1;
      if(flag==0)gui_char(temp); else gui_char(' ');
      i++;
   }
}

Число в текст.
Код:
const int InttoStr_sub_array[]={1000000,100000,10000,1000,100,10};

void mcu_InttoStr(char *str,int data,uint8_t format)
{
   register uint8_t i,j=0,flag=0;
   if(data<0){*str++='-';data=-data;}
   int sub_value;
   do{
      sub_value = InttoStr_sub_array[j];
      for(i=0;data>=sub_value;i++,data-=sub_value);
      if((flag)|(i!=0)){*str++=i+'0';flag=1;}
      if(format==str_format_dd2){
         if(sub_value==100){
            if(!flag)*str++='0';
            *str++='.';
         }
         if(sub_value==10)if(!flag)*str++='0';
      }
      if(format==str_format_dd3){
         if(sub_value==1000){
            if(!flag)*str++='0';
            *str++='.';
         }
         if(sub_value==100)if(!flag)*str++='0';
         if(sub_value==10)if(!flag)*str++='0';
      }
      j++;
   }
   while(sub_value>10);
   if(format==str_format_dd1){
      if(!flag)*str++='0';
      *str++='.';
   }
   *str++=(uint8_t)data+0x30;
   *str=0;
}

Форматы чисел.
Код:
#define str_format_dec   1
#define str_format_dd1   3  //Десятичный с 1 знаком после запятой
#define str_format_dd2   4  //Десятичный с 2 знаками после запятой
#define str_format_dd3   5  //Десятичный с 3 знаками после запятой

К примеру если задать формат str_format_dd3, то число 123 отобразиться как 0.123, 123456 как 123.456
Функция отрисовки затирает неиспользуемые символы строки пробелами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конвертация переменной?
СообщениеДобавлено: 11 сен 2019, 12:37 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2284
Sphynx55, с форматированием беда. Вам пробелов жалко или символов перевода строк? Ну глаза же сломать можно на этом.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: zacher


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB