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

Вопросы от начинающих по МК


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

26 minutes ago, LiVit said:

На гражданина это заклинание не действует

Прискорбно. Он прямо как тот "хирург", который по советам с форумов делает операцию на мозге, и уже на вскрытии черепной коробки застрял…

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

  • Ответов 8,9т
  • Создана
  • Последний ответ

Топ авторов темы

Yurkin2015, зачем ворошить старое.
По-моему, я достаточно ясно сказал, что в этой теме я разобрался и принёс извинения Всем участникам форума:

06.11.2021 в 03:37, Юрий_Нд сказал:

1. Извиняюсь, был неправ, заблуждался.
Теперь я знаю почему (1<<0) = 0b0000 0001. И теперь я в это не просто верю, как делал это раньше, а точно знаю это и могу объяснить/пояснить любому желающему.
2. Интернетом не пользовался, книжки умные по этому вопросe не читал, просто взял листочек с карандашиком и написал:
(1<<6)=(16<<2)=(4<<4)=64 
верно?
3. LiVit, как Вы думаете Керниган и Ричи могут мне сказать что-либо новое и неизвестное именно по этому вопросу?

----------

Уважаемый LiVit, а от Вас я ждал хоть какой-то реакции на мой анализ относительной погрешности в переменных типа float. 
Жаль, что так и не дождался...

 

8 часов назад, Yurkin2015 сказал:

float даёт 7

... а почему не 8 значащих цифр?

Изменено пользователем Юрий_Нд
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Юрий_Нд сказал:

Уважаемый LiVit, а от Вас я ждал хоть какой-то реакции на мой анализ относительной погрешности в переменных типа float. 
Жаль, что так и не дождался...

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

И лично меня убивает эта чУдная математика 2.20000005 + 1.10000002 = 3.30000019

И это при том, что вам не нужны эти float. Я могу понять, когда их используют в каких-нибудь сложных ЦОС (цифровая обработка сигналов), но при измерении тока, напряжения, времени....

PS. не удивляйтесь, что вам скоро вообще перестанут отвечать.

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

08.11.2021 в 19:11, Юрий_Нд сказал:

Допустим число нужно умножить на 0.384.
Вы предлагаете умножить на 384, а потом разделить на 1000?

LiVit, а это Вы поддерживаете?

08.11.2021 в 19:38, Eddy_Em сказал:

... нужно умножить на пять и разделить на 13.

Что Вы по этому поводу можете сказать?

Изменено пользователем Юрий_Нд
Ссылка на комментарий
Поделиться на другие сайты

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

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

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

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

14 часов назад, Огонёк сказал:

Си есть си, какая разница?

В AVR модификатор const не означает размещение во флеш, нужен еще PROGMEM.

32 минуты назад, Юрий_Нд сказал:
08.11.2021 в 20:11, Юрий_Нд сказал:

Вы предлагаете умножить на 384, а потом разделить на 1000?

LiVit, а это Вы поддерживаете?

Вариантов много. Самый простой - да, умножить на 384 и делить на 1000 - тогда коэффициент можно задать в человеко-читаемом виде. Если же это просто число, чье представление не несет особого смысла - коэффициент резистивного делителя, например - можно умножить на 98 и поделить на 256. Или умножить на 25166 и поделить на 65536.

Домашнее задание: разобраться почему для делителей я выбрал именно эти числа.

Кстати, на соседнем форуме сейчас обсуждается подобный подход как замена делению на 10. Потому что умножение действительно оказывается быстрее.

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

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

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

1 hour ago, Юрий_Нд said:

Что Вы по этому поводу можете сказать?

Могу сказать, что налицо полный профан. Тут, похоже, не только С надо изучать, но и элементарный матан!

Я уже писал, что там, где нет флоатов, заменяю умножение на некую нормировочную константу двумя действиями: умножением и делением. Однако, в STM32F0 даже деления нет, поэтому для них лучше эту операцию реализовать как умножение и сдвиг, пусть даже uint32_t может понадобиться расширить до uint64_t. Правда,  считать коэффициенты так лихо не получится. Вот, допустим, хочу я с точностью до 0.001 получить значения числителя и знаменателя для коэффициентов 1.23, 3.25 и 7.11. Я просто в октаве пишу:

[n d]=rat([1.23 3.25 7.11], 0.001)
	n =
	    16    13   711
	d =
    13     4   100

Вот и сразу три числителя и три знаменателя. Можно проверить:

n./d
ans =
   1.2308   3.2500   7.1100

- просто превосходно!

Однако, в случае, когда деление хочется заменить сдвигом, придется покумекать, т.к. через цепные дроби подбирать эти числа нереально! Могу разве что предложить последовательный перебор. Вот так:

K=1.23; for x=0:31; N=round(K*bitshift(1,x)); printf("a*%g approx a*%d>>%d (*%g)\n",K, N, x, bitshift(10000*N,-x)/10000); endfor
a*1.23 approx a*1>>0 (*1)
a*1.23 approx a*2>>1 (*1)
a*1.23 approx a*5>>2 (*1.25)
a*1.23 approx a*10>>3 (*1.25)
a*1.23 approx a*20>>4 (*1.25)
a*1.23 approx a*39>>5 (*1.2187)
a*1.23 approx a*79>>6 (*1.2343)
a*1.23 approx a*157>>7 (*1.2265)
....

Можно функцию написать, которая будет подбирать коэффициенты с наибольшей точностью. Вот так:

function [N Shift] = findNR(K, dk)
    N = 1; Shift = 1; delta = 1;
    Ngood = 1; Shiftgood = 1; deltagood = 1;
    Nmax = bitshift(1,32)-1;
    for Shift = 3:31;
        N = round(K*bitshift(1,Shift));
        if(N > Nmax) break; endif
        delta = abs(bitshift(1e6*N, -Shift)/1e6 - K);
        if(delta < dk) break; endif
        if(delta < deltagood)
            deltagood = delta; Ngood = N; Shiftgood = Shift;
        endif
    endfor
    if(delta > dk)
        printf("tolerance %g not found, use %g\n", dk, deltagood);
        Shift = Shiftgood; N = Ngood;
    endif
endfunction

И в этом случае:

[N S] = findNR(1.23, 0.001)
N = 315
S = 8

Т.е. можно было бы просто умножить на 315 и сдвинуть вправо 8 раз! А вот если я захочу 10¯⁶ получить, то уже может быть переполнение uint64_t, так что придется точность понизить:

[N S] = findNR(1.23, 1e-6)
tolerance 1e-06 not found, use 1e-05
N = 40305
S = 15
Изменено пользователем Eddy_Em
Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, Юрий_Нд сказал:

COKPOWEHEU, а Вы видели мою тему

Я много ваших тем видел. Смысла они обычно не несут.

8 часов назад, Eddy_Em сказал:

Вот, допустим, хочу я с точностью до 0.001 получить значения числителя и знаменателя для коэффициентов

Эти коэффициенты - теоретические константы или калибровки, специфичные для конкретной железяки?

8 часов назад, Eddy_Em сказал:

Однако, в случае, когда деление хочется заменить сдвигом

Зачастую можно выбрать сдвиг на 1, 2, 3 и т.д. байтов в зависимости от требуемой точности.

8 часов назад, Eddy_Em сказал:

Я просто в октаве пишу:

Вот использование стороннего софта для генерации констант мне не нравится:

//доступно для изменения юзеру
#define KOEFF1 1.23
#define KOEFF2 3.25

//внутренние константы, рассчитываемые препроцессором
#define KOEFF1_8 ((unsigned int)((KOEFF1)*256))
#define KOEFF2_16 ((unsigned long)((KOEFF2)*65536))
  
...
x = (x*KOEFF1_8)>>8;
y = (y*KOEFF2_16)>>16;

 

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

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

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

3 minutes ago, COKPOWEHEU said:

Эти коэффициенты - теоретические константы или калибровки, специфичные для конкретной железяки?

Второе — калибровки по платиновому термометру, сглаженные, аппроксимированные полиномом пятой или шестой степени и в соответствии с желаемой точностью (±0.5℃ — все равно NTC лучше никогда не даст) разложенные кусочно-линейной аппроксимацией.

4 minutes ago, COKPOWEHEU said:

Вот использование стороннего софта для генерации констант мне не нравится:

Октава - свободный софт, так что все ОК. Не на пытхоне же [censored] писать! Но кое-что я рассчитывал и на сях, и прямо в репу вкладывал в отдельную директорию сишный файлик, который компилируется даже без Makefile'а (просто gcc file.c) и позволяет в случае необходимости нужный заголовочный файл сгенерировать.

Еще, бывает, баш-скрипты вкладываю: для того, чтобы сгенерировать, допустим, заголовочный файл с макросами, позволяющими удобно шрифты описывать (в виде X___XX_X, а не менее наглядных 0b10001101). Ну или просто в комментах содержимое этих скриптов пишу: вдруг в другой раз (или кому-то еще) захочется что-то подобное сделать...

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

  • 3 недели спустя...

Здравствуйте !

История такая -

инициализация прерываний по компаратору:

 ldi temp,(0<<ADEN) out ADCSRA,temp                       ; 0<<ADEN выключение АЦП
in temp,SFIOR sbr temp,(1<<ACME) out SFIOR,temp                 ; 1<<ACME подключенгие инвертирующего входа AIN1 к входу АЦП
ldi temp,(0<<MUX3)+(0<<MUX2)+(0<<MUX1)+(0<<MUX0)out ADMUX,temp  ; AIN1 к входу АЦП (ADC0) 23 нога/(ADC1) 24 нога
ldi temp,(0<<ACD)+(1<<ACBG)+(1<<ACIE)+(0<<ACIS1)+(0<<ACIS0) out ACSR,temp

инициализация  АЦП:

ldi temp,(1<<REFS1)+(1<<REFS0)+(1<<adlar)+(1<<MUX2)+(0<<MUX1)+(0<<MUX0); Выбор ADC4(27н), выравнивание влево, ИОН=2.56
out ADMUX, temp
ldi  temp,(1<<ADEN)+(1<<ADSC)+(1<<ADPS1)+(1<<ADPS2) out  ADCSRA,temp   ; 8МГц:64=125 кГц  включение и однократный запуск
sbic ADCSRA,ADSC  rjmp PC-1  ожидание конца преобразования

in temp ,ADCH

 

Основной вопрос - правильно ли при инициализации АЦП с однократным преобразованием - сначала переключать канал ,  а потом включать сам АЦП и преобразование ?

Проблема в том, что АЦП хватает мусор более 4-10% от максимальной шкалы , но не всех процессорах , а на некоторых .

процессор - ATmega8

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

  • 2 недели спустя...
В 08.11.2021 в 13:13, Юрий_Нд сказал:

Вполне приемлемая для моих расчётов ошибка в одну сотую даёт погрешность 0.3 процента. 
Тогда какое мне дело, что ошибка, связанная с типом переменных даёт относительную погрешность 5-6 миллионых процента.
Наверное это может интересовать только тех, кто собирается решать систему уравнений из 50 неизвестных.
Хотя не уверен, насколько это важно для них. Ответ на это вопрос нужно спрашивать у "чистых математиков".

Я конечно извиняюсь что поднял столь древний пост, но... я делал решатель систем уравнений до 20 порядка, так вот при размере уравнения в 20 неизвестных ошибка "ответа" составляла в несколько единиц!!! Попробуете догадаться почему? Использование 192-битного числа с плавающей запятой в вычислениях снизило ошибку до сотых долей единиц... но это по прежнему чудовищно много.
Проблема не в самой погрешности, а в том что ОНА НАКАПЛИВАЕТСЯ по мере вычислений. Мощность вы вычисляете произведением двух величин, погрешность здесь будет тысячные доли процента. Теперь вы просуммировали 1000 раз это произведение и... погрешность увеличилась ровно в 1000 раз! Причем она увеличится больше чем в 1000 раз, 1000 раз - это только на произведениях, а есть ещё и сумма, которая тоже даёт погрешность. Любая ваша операция с плавающим числом накапливает погрешность. И то что она изначально не очень большая нивелируется количеством операций. Float хватит чтобы умножить два числа, или сложить. Ну пусть даже 1000 раз, но на миллионе он уже даст ощутимую погрешность. И для каждой величины есть число меньше которого сумма не будет меняться. Т.е. 1.0 + 1Е-30 будет по прежнему равен 1.0 это иногда тоже выплывает неожиданно для программиста. И хоть миллион раз прибавь...

Учение - изучение правил. Опыт - изучение исключений.

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

1 hour ago, Alexeyslav said:

Я конечно извиняюсь что поднял столь древний пост, но... я делал решатель систем уравнений до 20 порядка, так вот при размере уравнения в 20 неизвестных

Загадочная фраза. Я, конечно, извиняюсь, но вы в курсе, что означает термин "порядок уравнения"?

Если же речь о решении систем уравнений, то слышали ли вы о сходимости численных методов решения?

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

В контексте этой темы это не важно. Да  имне тогда было это не важно, нужно было решать лишь СЛАУ до 8 неизвестных, а 20 - это предел удобства ввода на одном экране, пробовал чисто только потому что можно было. И результат запомнился.

 

Учение - изучение правил. Опыт - изучение исключений.

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

  • 2 недели спустя...
  • 1 месяц спустя...

Здравствуйте. Собираю штуку на атмега8а. К прошивке идет такой скрин,как выставить правильно фьююзы.Такой программы нету,есть avrdude. Как правильно выставить фьюзы в ней? я попробовал выставить какие были пункты и залочил мк.

fuses.jpg

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

@Нэцкэ там простой паяльник на т12 собираю,без кварца. может какие стандартные фьюзы подойдут. скачал эту программу для прошивки(что на скрине) и так и не смог ее подружить с программатором за $1

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

Лучше дай нам  ссылку и мы поможем тебе , пока нажми в программе  кнопочку по умолчанию и программа покажет верное положение  галочек 284939087_.jpg.98c9020c0032cb32f7f2825cdf042c52.jpg

Изменено пользователем Нэцкэ

У меня есть мысль , и я её думаю ...  

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

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

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

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

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

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

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

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

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

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

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

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