Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650.
Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
[звучит гонг!]Эй, народ, хватит засорять тему про stm8, когда обсуждается чисто С.
Вот научите молодого и зелёного. В своём проекте, я наконец избавился от одного кода ("из книжки") который не желал работать даже при минимальнейшей оптимизации. Поэтому я надавил тапок в пол (поставил максимальную оптимизацию) и... теперь уже с моим кодом проблема. Так вот, изучая тот фрагмент где происходит косяк, подумал, что одно копирование я мог бы сделать с помощью DMA. И вот вопрос, а как правильно оформить функцию? Вот тут пару страниц назад приводил заголовок моей функции, которая и конфигурирует этот трансфер. А не должны ли эти указатели теперь быть ссылками на волатильные массивы, чтобы дальнейший код не подумал что там вечно нули?
Вот конкретный код который не работает при "whole program optimization". При "Interprocedure optimization" - вроде работает. (не работает так: при нажатии кнопки DOWN - не выходит из цикла и цвета на launchpad_Output выдаёт неверные, например вместо желтого - синий. Вернее либо черный, либо синий - надо еще проверить функцию check_color. Но почему кнопка не срабатывает? во всех остальных аналогичных местах работает )
ColorSensorTestHSI(color_array, 1); while (kbdread()!= KEY_DOWN){ field_test_color = check_color(); copy_data_dma((uint8_t *)color_sensors,(uint8_t *)color_array, sizeof(color_array)); switch (field_test_color){ case red: LaunchPad_Output(RED); break; case green: LaunchPad_Output(GREEN); break; case blue: LaunchPad_Output(BLUE); break; case yellow: LaunchPad_Output(RED | GREEN); break; case cyan: LaunchPad_Output(BLUE | GREEN); break; case magenta: LaunchPad_Output(BLUE | RED); break; case white: LaunchPad_Output(BLUE | RED | GREEN); break; case black: LaunchPad_Output(0x00); break; } // for (i=0; i<4; i++) { // color_array[i] = color_sensors[i]; // } while(dma_copy_busy) WaitForInterrupt(); ColorSensorTestHSI(color_array, 0); } LaunchPad_Output(0); }
Копирование через ПДП я применил взамен закоментированного фрагмента. И я опасаюсь, ай нет - ложная тревога. я там в функцию передаю указатель и данные там будут так и так.
p.s. приложил дизасм - с кнопкой криминала не вижу.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
В Копирование через ПДП я применил взамен закоментированного фрагмента.
Смотреть лень, но я попытаюсь если Вы объясните в чем "Профит" от заряжания DMA для копирования 8-ми байтов? Кэш включен? Если включен, он инвалидируется в функции копирования?
Ой. не пытайтесь - не нужно. вы мне ничем не обязаны.
Похоже, что ошибка где-то в i2c коде, так как и клавиатура, и цветовой сенсор работают через эту шину. и я вижу, что при считывании зелёный канал даёт отличающиеся от других каналов данные (стабильно неменяющиеся). Так что приведенный код работает без проблем. Проблема глубже.
Добавлено after 29 minutes: solved: Угу. оказалась бяка - спутал волатильный указатель с указателем на волатильную переменную. Написал второе, а надо было первое.
Код:
unsigned char * volatile data_ptr;
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
поделитесь опытом как можно случайное число получить (желательно с примером в CodeVisionAVR) я делаю так speed=rand()%4+1; // случайное число от 1 до 4 speed=speed*100; delay_ms(speed); но видна закономерность в эффектах...
а как надо? желательно попроще и поподробнее!
в интернете пишут Использование наводок от АЦП. типа на ножку припаять маленькую антенну... но никто толком не пишет как это программе описать CodeVisionAVR.
я поседнее время делаю так: сразу после старта, еще до того, как выполнится код, очищающий всю статическую память переменных, делаю CRC-подсчет по всей доступной памяти, и это число использую в качестве параметра функции srand. поскольку после подачи питания память устанавливается в непредсказуемое значение, этот метод даёт неплохое начальное распределение случайных чисел - можете сами убедиться по моему плейеру эффектов: при каждом включении питания стартует случайный файл.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется... скушно, бабоньки!
как можно случайное число получить (желательно с примером в CodeVisionAVR)
Я так понял, N*rand()/RAND_MAX не подходит? Почему? Но если уж так хочется поиграться, то есть разные алгоритмы. Например, автомат Вольфрама с правилом 30 даёт отличную случайную последовательность бит.
я поседнее время делаю так: сразу после старта, еще до того, как выполнится код, очищающий всю статическую память переменных, делаю CRC-подсчет по всей доступной памяти, и это число использую в качестве параметра функции srand. поскольку после подачи питания память устанавливается в непредсказуемое значение, этот метод даёт неплохое начальное распределение случайных чисел - можете сами убедиться по моему плейеру эффектов: при каждом включении питания стартует случайный файл.
полностью согласен, но уровень не мой желательно попроще и поподробнее! желательно с примером в CodeVisionAVR
а вот с этим никак, ибо использую только avr-gcc (WinAVR).
в общем и целом как-то так:
Код:
unsigned char *ptr = (void*)0; int sum = 0;
for(int i=0; i < MAXRAM; ptr++) sum = calc_crc_1wire(sum, *ptr);
srand(sum);
MAXRAM - это максимальный адрес доступного RAM в выбраном МК, а clc_crc_1wire - это функция вычисления CRC по алгоритму 1-wire, можно и по любому иному алгоритму, но этот самый известный и в CVAVR тоже по идее должен быть в библиотеке...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется... скушно, бабоньки!
Serzh2000, как уже уже сказали - чтобы rand() не работал при каждом включении одинаково, нужно прежде srand() вызывать. При каждом включении - с новым аргументом seed. ARV для этого seed ОЗУ вычитывает. Я в одном из своих проектов при выключении записывал результат rand () в eeprom, и использовал его как seed при следующем включении. Да и другие варианты получения нового значения seed при включении питания вполне можно придумать.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения