Jump to content

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


Recommended Posts

26 minutes ago, LiVit said:

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

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

Edited by Eddy_Em
Link to comment
Share on other sites

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 значащих цифр?

Edited by Юрий_Нд
Link to comment
Share on other sites

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

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

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

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

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

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

Edited by LiVit
Link to comment
Share on other sites

Приглашаем на вебинар «Источники питания MEAN WELL для промавтоматики и серверного оборудования в новых условиях» (02.06.2022)

Приглашаем всех желающих на вебинар, посвященный линейке продукции MEAN WELL для промышленной автоматизации и оборудования, систем охраны, серверного, телекоммуникационного оборудования и базовых станций 4G/5G. 

На вебинаре мы также рассмотрим продукцию компании MEAN WELL, которая может заменить часть источников питания от производителей, в данный момент ушедших с российского рынка, разберем, на что нужно обращать внимание при подборе той или иной замены, и какими особенностями обладает продукция MW для различных приложений. Подробнее>>

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

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

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

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

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

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

Edited by Юрий_Нд
Link to comment
Share on other sites

LDD-H-DA – понижающие DC/DC LED драйверы с управлением по DALI от MEAN WELL

Представляем семейство понижающих LED драйверов постоянного тока LDD-H с диммингом по протоколу DALI. Эта серия преобразователей LDD-H-DA выпускается на стандартные значения выходного тока: 350, 700, 1050, 1400 мА, обладает широким диапазоном входного напряжения 6…50 В и работает при температуре от -40 до 85°С.

Подробнее>>

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

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

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

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

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

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

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

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

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

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

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

Link to comment
Share on other sites

Материалы вебинара: Возможности компании Mornsun в меняющихся условиях рынка. Источники питания для широкого спектра приложений

На вебинаре были представлены линейка компонентов для электропитания и интерфейсные модули. Мы рассмотрели популярные группы изолированных и неизолированных (PoL) DC/DC-преобразователей последних поколений, новые компактные модульные источники питания, устанавливаемые на печатную плату (открытые и корпусированные), источники питания, монтируемые как на шасси (в кожухе и открытые), так и на DIN-рейку.

Подробнее>>

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
Edited by Eddy_Em
Link to comment
Share on other sites

Выбираем специализированные источники питания MEAN WELL для промышленных устройств

К источникам питания для промышленных систем и оборудования предъявляются особые требования. Необходима долговременная работа без остановки на профилактику, снижение шумовой нагрузки на персонал и эксплуатационных расходов на обслуживание, обеспечение бесперебойной работы и надежного старта оборудования. Для решения подобных задач в номенклатуре MEAN WELL имеются ИП серии UHP с кондуктивным охлаждением и HRP/N, способные выдерживать перегрузку в 2,5 раза. 

Подробнее>>

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 раз.

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

Link to comment
Share on other sites

3 minutes ago, COKPOWEHEU said:

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

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

4 minutes ago, COKPOWEHEU said:

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

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

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

Link to comment
Share on other sites

  • 3 weeks later...

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

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

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

 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

Edited by dodik
Link to comment
Share on other sites

  • 2 weeks later...
В 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 это иногда тоже выплывает неожиданно для программиста. И хоть миллион раз прибавь...

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

Link to comment
Share on other sites

1 hour ago, Alexeyslav said:

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

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

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

Link to comment
Share on other sites

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

 

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

Link to comment
Share on other sites

  • 2 weeks later...
  • 1 month later...

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

fuses.jpg

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Edited by Нэцкэ
Link to comment
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...