Например TDA7294

Форум РадиоКот • Просмотр темы - Вопросы по С/С++ (СИ)
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 23, 2024 19:18:12

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


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 7588 ]     ... , , , 346, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт июл 31, 2020 15:06:58 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
MOHCTEP писал(а):
для анализа их изменения и оперативного изменения тех самых настроек
micro-SD и FatFS от нашего японского коллеги по имени Чен решают любые проблемы, как с количеством записей, так и с анализом, так и со строками и всем прочим. файловый ввод-вывод - наше всё. для 128-й меги вообще не вопрос.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб авг 15, 2020 20:55:11 
Опытный кот

Карма: 16
Рейтинг сообщений: 74
Зарегистрирован: Вс янв 19, 2014 00:55:09
Сообщений: 736
Рейтинг сообщения: 0
Спасибо друзья! Вроде разобрался, благодаря вашей помощи.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб авг 29, 2020 01:00:17 
Опытный кот

Карма: 16
Рейтинг сообщений: 74
Зарегистрирован: Вс янв 19, 2014 00:55:09
Сообщений: 736
Рейтинг сообщения: 0
Появились еще вопросы, уважаемые коты. Прошу помочь.
1 Доселе обходился как-то без чисел с плавающей точкой, а тут пришлось их попробовать и нарвался на проблему. Почему-то не хотят они у меня плавать, а норовят в целочисленные превратиться. Пробовал готовить по всякому... Что я не так делаю?
Код:
//float a = (float)((year / 19) - floor(year / 19)); // 0
   float a;
   //a = (float)(year / 19) - (uint8_t)(year / 19); // 0
   a = year / 19;
   num2dec(a * 1000,3);
   uart1_puts(digi_buffer);uart1_puts("\r\n"); // 106.000
   a = (float)(year / 19);
   num2dec(a * 1000,3);
   uart1_puts(digi_buffer);uart1_puts("\r\n");//106.000

2 Это, как бы, продолжение предыдущего разговора. Вот структура:
Код:
typedef struct{
   uint16_t time;   /* 2 bytes */
   uint32_t a;      /* 4 bytes */
   int16_t b[4];   /* 2 * 4 = 8 bytes */
   uint8_t c[4];   /* 1 * 4 = 4 bytes */
   /* total = 18 bytes */
}data_t;
Этими структурами постепенно заполняется ЕЕПРОМ (около 200 штучек). Теперь, мне со всех записей нужно прочесть в массив, допустим значения data_t.b[2] или все data_t.a. Вот как это правильно сделать и чтоб оперативка не сильно тратилась? В идеале бы только на массив нужных, в данное время, данных.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб авг 29, 2020 01:14:35 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 1
Код:
float a;
a = year / 19.0f;  // или a = (float)year / 19;

А ты сначала целочисленно делишь а потом результат приводишь к float...


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

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб авг 29, 2020 01:25:11 
Опытный кот

Карма: 16
Рейтинг сообщений: 74
Зарегистрирован: Вс янв 19, 2014 00:55:09
Сообщений: 736
Рейтинг сообщения: 0
Reflector, Спасибо! :beer: Так действительно работает!
А вариант
Код:
//a = (float)(year / 19)
У меня почему-то не работал правильно.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс авг 30, 2020 13:13:51 
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 532
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1978
Рейтинг сообщения: 0
Потому что опять же сначала целочисленное деление, а уже потом приведение результата к float. Из-за скобок.
Между
Код:
a = (float)(year / 19);

И
Код:
a = (float)year / 19;

Огромная разница. Во 2ом случае сначала year приводится к float, и потом делится на 19 уже как float.

Добавлено after 6 minutes 28 seconds:
Этими структурами постепенно заполняется ЕЕПРОМ (около 200 штучек). Теперь, мне со всех записей нужно прочесть в массив, допустим значения data_t.b[2] или все data_t.a. Вот как это правильно сделать и чтоб оперативка не сильно тратилась? В идеале бы только на массив нужных, в данное время, данных.

Код:
uint32_t buf;
eeprom_read_block(&buf, sizeof(data_t) * NR_BLOCK + sizeof(data_t.time), sizeof(buf)); // Прочитать с блока NR_BLOCK (порядковый номер) значение .a

Ну т.е. банально вычисляем начало блока, плюс добавляем пропуск того, что идет до нужных данных, т.е. скипаем их. И читаем нужное кол-во байт. Если все блоки надо прочитать - ну проходимся по очереди NR_BLOCK от 1 до N.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс авг 30, 2020 17:44:46 
Опытный кот

Карма: 16
Рейтинг сообщений: 74
Зарегистрирован: Вс янв 19, 2014 00:55:09
Сообщений: 736
Рейтинг сообщения: 0
NStorm, Спасибо! С плавающим "флотом" вроде понял суть. А со структурами, вот как мне точно попасть на нужную переменную? Судя по вашему примеру, структура сохраняется в порядке объявления переменных?
И для чтения, к примеру, data_t.с[2] надо вот этакую конструкцию писать?
Код:
eeprom_read_block(&buf, sizeof(data_t) * NR_BLOCK + sizeof(data_t.time) + sizeof(data_t.a) + sizeof(data_t.b) + sizeof(data_t.c[0]) * 2, sizeof(buf));// Прочитать с блока NR_BLOCK (порядковый номер) значение .c[2]


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс авг 30, 2020 18:48:55 
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 532
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1978
Рейтинг сообщения: 1
MOHCTEP, компилятор не меняет порядок в структуре. В каком порядке задали - в таком порядке оно будет в памяти. Т.е. да, "сохраняется в порядке объявления переменных". Единственный момент - как вы структуру в EEPROM писать будете. Если целиком структуру через eeprom_write_block(), то всё будет в таком порядке. Но если вручную как-то - то порядок уже от вас зависеть может.
В вашем примере - да, почти так. Только sizeof(data_t.b) надо еще на 4 умножить, т.к. там у вас массив в примере выше.
Ну и ес-но для удобства, чтобы не писать эту длинную фигню каждый раз, можно определить макрос. Вроде:
Код:
#define DATA_T_SZ sizeof(data_t)
#define DATA_T_C2_OFFSET sizeof(data_t.time) + sizeof(data_t.a) + sizeof(data_t.b) * 4 + sizeof(data_t.c[0]) * 2
...
eeprom_read_block(&buf, DATA_T_SZ * NR_BLOCK + DATA_T_C2_OFFSET, sizeof(buf));


Или написать небольшую функцию, которая будет считать нужны адрес каждый раз. Смотря как много разных элементов структуры вам так отдельно выцеплять надо. Функция будет такты отнимать на расчет адреса, макросы с фиксированными смещениями считаются на этапе компиляции, но будут занимать место во флэше.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс авг 30, 2020 19:17:42 
Опытный кот

Карма: 16
Рейтинг сообщений: 74
Зарегистрирован: Вс янв 19, 2014 00:55:09
Сообщений: 736
Рейтинг сообщения: 0
Оппа! А я полагал, что "sizeof(data_t.b)" выдаст мне размер массива, а "sizeof(data_t.c[0])" - размер элемента массива?
За макросы - опять спасибо! Дельная идея, воспользуюсь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс авг 30, 2020 21:56:36 
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 532
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1978
Рейтинг сообщения: 0
Оппа! А я полагал, что "sizeof(data_t.b)" выдаст мне размер массива, а "sizeof(data_t.c[0])" - размер элемента массива?

Брр... нет, это я уже загнался на вечер выходного дня. Конечно же умножать не нужно, т.к. sizeof(array) вернет размер целиком массива в байтах. Это я почему-то решил, что берется от одного элемента массива тоже. Вы правы в данном случае.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс авг 30, 2020 21:59:09 
Опытный кот

Карма: 16
Рейтинг сообщений: 74
Зарегистрирован: Вс янв 19, 2014 00:55:09
Сообщений: 736
Рейтинг сообщения: 0
NStorm, Ффух! Спасибо! А то у меня уже голова оквадратилась. :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс сен 20, 2020 15:10:45 
Потрогал лапой паяльник

Карма: 1
Рейтинг сообщений: 13
Зарегистрирован: Чт авг 08, 2013 01:06:54
Сообщений: 359
Рейтинг сообщения: 0
Доброго времени суток. Имеется код выбора slave через 4-to-16 bit decoder
Спойлер
Код:
switch(peripheral){
            case SPI_PERIPHERAL_0:
               REG_SPI_MR |= SPI_MR_PCS(0b0000);
               break;
            case SPI_PERIPHERAL_1:
               REG_SPI_MR |= SPI_MR_PCS(0b0001);
               break;
            case SPI_PERIPHERAL_2:
               REG_SPI_MR |= SPI_MR_PCS(0b0010);
               break;
            case SPI_PERIPHERAL_3:
               REG_SPI_MR |= SPI_MR_PCS(0b0011);
            break;
            case SPI_PERIPHERAL_4:
               REG_SPI_MR |= SPI_MR_PCS(0b0100);
            break;
            case SPI_PERIPHERAL_5:
               REG_SPI_MR |= SPI_MR_PCS(0b0101);
            break;
            case SPI_PERIPHERAL_6:
               REG_SPI_MR |= SPI_MR_PCS(0b0110);
            break;
            case SPI_PERIPHERAL_7:
               REG_SPI_MR |= SPI_MR_PCS(0b0111);
            break;
            case SPI_PERIPHERAL_8:
               REG_SPI_MR |= SPI_MR_PCS(0b1000);
            break;
            case SPI_PERIPHERAL_9:
               REG_SPI_MR |= SPI_MR_PCS(0b1001);
            break;
            case SPI_PERIPHERAL_10:
               REG_SPI_MR |= SPI_MR_PCS(0b1010);
            break;
            case SPI_PERIPHERAL_11:
               REG_SPI_MR |= SPI_MR_PCS(0b1011);
            break;
            case SPI_PERIPHERAL_12:
               REG_SPI_MR |= SPI_MR_PCS(0b1100);
            break;
            case SPI_PERIPHERAL_13:
               REG_SPI_MR |= SPI_MR_PCS(0b1101);
            break;
            case SPI_PERIPHERAL_14:
               REG_SPI_MR |= SPI_MR_PCS(0b1110);
            break;
            case SPI_PERIPHERAL_15:
               REG_SPI_MR |= SPI_MR_PCS(0b1111);
            break;
         }

который покрывает все возможные варианты. Но он явно избыточный, если я например использую в конкретном проекте только 9 slave-ов. Возможно ли с помощью дефайна и макроса/ов, создать конструкцию, которая сгенерирует за меня только 9 case-ов, не создавая ненужные. Не прошу готового варианта, подскажите хотя бы, что гуглить ?
Up: Вроде Х-макросы то что нужно.


Последний раз редактировалось Пока_без_кота Вс сен 20, 2020 16:25:40, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс сен 20, 2020 16:24:43 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 41
Рейтинг сообщений: 306
Зарегистрирован: Пт сен 07, 2018 20:20:02
Сообщений: 2296
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Пока_без_кота, а что мешает изначально сделать значение peripheral равным значению требуемой маски?
Тогда весь развесистый case сведется к одной строке
REG_SPI_MR |= SPI_MR_PCS(peripheral);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс сен 20, 2020 16:33:18 
Потрогал лапой паяльник

Карма: 1
Рейтинг сообщений: 13
Зарегистрирован: Чт авг 08, 2013 01:06:54
Сообщений: 359
Рейтинг сообщения: 0
а что мешает ...

Мне помешала зашоренность сознания. Спасибо за умную мысль.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн окт 05, 2020 10:03:01 
Друг Кота
Аватар пользователя

Карма: 67
Рейтинг сообщений: 1012
Зарегистрирован: Чт сен 18, 2008 12:27:21
Сообщений: 18807
Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Как на 51-м ядре максимально быстро и компактно (не табличным способом) отзеркалить байт?
Пока приходит в голову только 8 строк подряд
Код:
if (in&0x01) out |= 0x80;
...
if (in&0x80) out |= 0x01;

_________________
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Измерить нннада?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн окт 05, 2020 10:33:27 
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 532
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1978
Рейтинг сообщения: 0
Gudd-Head,
Код:
unsigned char reverse(unsigned char b) {
   b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
   b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
   b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
   return b;
}


Взял отсюда: https://stackoverflow.com/questions/260 ... -in-a-byte


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн окт 05, 2020 10:57:58 
Электрический кот

Карма: -4
Рейтинг сообщений: 70
Зарегистрирован: Вт ноя 19, 2019 06:10:18
Сообщений: 1055
Рейтинг сообщения: 0
Gudd-Head,
Код:
unsigned char reverse(unsigned char b) {
   b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
   b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
   b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
   return b;
}


Взял отсюда: https://stackoverflow.com/questions/260 ... -in-a-byte

Решение универсальное.

Если же конкретно под 51-ый, то у него есть куча команд обработки битов. Всё эти биты доступны на Си. В Кейле были макросы для команд ротации и сдвига через перенос. Получается очень просто: сдвиг А через перенос, загрузка С в нужный бит В. И так 8 раз. В конце загрузка В в А.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс окт 11, 2020 09:22:52 
Друг Кота
Аватар пользователя

Карма: 67
Рейтинг сообщений: 1012
Зарегистрирован: Чт сен 18, 2008 12:27:21
Сообщений: 18807
Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Gudd-Head,
Код:
   b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
   b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
   b = (b & 0xAA) >> 1 | (b & 0x55) << 1;

Видел я это, в "алгоритмических трюках для программистов". Но есть у меня подозрение, что это только на Сях красиво выглядит. А по факту на 51-м ядре развернётся в огромную простыню. Хотя если компилятор догадается SWAPнуть... Надо проверить.
Всё эти биты доступны на Си. В Кейле были макросы для команд ротации и сдвига через перенос.

А вот здесь можно подробней? Среда Keil uVision 4.

_________________
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Измерить нннада?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн окт 12, 2020 14:17:40 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Сб дек 27, 2008 15:46:26
Сообщений: 163
Откуда: Украина, Бердянск
Рейтинг сообщения: 0
Добрый день. Нужно в функции использовать элементы массива. Но не всегда все. И не всегда с начала массива.
Вот, например:

f(int arr[]) {...}

int a[10];
int n;

Варианты вызова функции в программе:

f(a); или f(&a[0]); // если массив обрабатывается с нулевого элемента
f(a+3); или f(&a[3]); // если начинаем с третьего элемента
f(a+n); или f(&a[n]); // если начальный элемент заранее неизвестен

Все ли я правильно написал?

_________________
учиться никогда не поздно...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн окт 12, 2020 15:29:54 
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 532
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1978
Рейтинг сообщения: 0
waddds, да, только учтите, что так легко выйти за границы массива внутри функции. Поэтому по хорошему еще размерность массива в функцию передавать (до конца сколько осталось). Ну и учитывать, что в функцию передается не копия массива, а указатель на текущий массив. И изменив значения в функции, поменяется и исходный массив.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 7588 ]     ... , , , 346, , , ...  

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


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32


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

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


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y