Например TDA7294

Форум РадиоКот • Просмотр темы - Нескольно простых вопросов о программировании AVR на Си.
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пн авг 11, 2025 13:40:16

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


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



Начать новую тему Ответить на тему  [ Сообщений: 1478 ]     ... , , , 69, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Сб мар 18, 2023 09:59:20 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Небольшой оффтоп по поводу логарифмов. Предположим, вы начнете считать логарифмы вручную... Так вот, на 16 мегагерцах контроллер делает примерно 8 миллионов математических операций... Если вы будете тратить на какое-то вычисление 1 секунду (например, при умножении в столбик на одну циферку 1 секунда), то 8 миллионов операций вы сделаете примерно за 270 рабочих дней... А контроллер на это потратит одну секунду...

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

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вс мар 19, 2023 12:30:09 
Встал на лапы

Зарегистрирован: Сб июл 30, 2011 21:00:24
Сообщений: 115
Рейтинг сообщения: 0
Just_Fluffy, Eats.
Вы, похоже, пишите про обычный ассемблер. Это старое программирование из прошлого века. Я на нём, практически, ничего не писал, только в самом начале, когда изучал МК.
В, условно говоря, современном ассемблере, есть функция логарифма, вызов которой – одна строчка программы.
Необходимо ещё разобраться с используемыми регистрами, это всё-таки ассемблер. Надо почитать описание функции, регистры, которые требуется сохранить, забросить в стек, а после извлечь из стека. Это будет ещё пару строк программы.
Займёт по времени, скажем, десяток минут – вот и всё время для логарифма.
Это не «изыск», а обычная работа на современной программе, вполне подойдёт для зарабатывания «денешшшшек».
Ради интереса посмотрел объём, заняло 526 байт.
Этот логарифм знаковый. Если аргумент меньше условной единицы (это число 1024), то выдаёт отрицательные значения, как и полагается. Правда, в сторону минуса работает недалеко, на один шаг аппроксимации.
Знаковый логарифм несколько больше по объёму, но удобен для разработки измерителей концентраций веществ. Обычно сигнал при распространении затухает по экспоненте в соответствии с концентрацией вещества, требуется логарифм. Если появляются отрицательные значения, надо провести калибровку прибора.

float никогда не использовал, плохо представляю, когда может понадобиться. Если только при использовании старой программы, но я на такой не работаю.

Как я понял, вы работаете в прерывании. В прерывании пишу только самый необходимый минимум, всё остальное – в основном цикле. Для меня работа в прерывании – источник всяческих проблем, зачем они нужны. Правда, ситуации бывают разные.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вс мар 19, 2023 12:46:04 
Мучитель микросхем
Аватар пользователя

Карма: 10
Рейтинг сообщений: 155
Зарегистрирован: Ср июн 29, 2022 16:25:45
Сообщений: 486
Рейтинг сообщения: 3
AQ29, вообще то мы пишем про Си. И тема называется - СИ в вопросах и ответах.
И вы не поверите, но в Си логарифм тоже вызывается одной строкой:
f = logf(f);
По поводу прерываний - "Вы просто не умеете их готовить ©"
Прерывание - такая же функция/процедура/подпрограмма, как и другие. Только вызываете ее не вы, а какое то внешнее, асинхронное по отношению к основной программе, событие.
И нужно отдавать себе отчет, что вы делаете в прерывании.
Да, в общем случае длинные прерывания могут быть злом.
Но в определенных решениях контроллер может проводить в прерываниях почти все свое время, иногда отвлекаясь на выполнение основной программы.
И тут нет ничего страшного и крамольного.
Просто нужно четко и ясно понимать, что именно делается в прерывании и сколько оно времени занимает.
Например, прерывание у вас может молотить 16000 раз в секунду, вводить из буфера данные на 7сегментный дисплей, попутно управляя его яркостью, опрашивать состояние кнопок, смотреть на флаг готовности данных в SPI и UART. Если флаги есть - перекладывать данные в какие то массивы.
И это может занимать на АВР до 50-70-90% процессорного времени. А остальное время может быть отдано на какую то обработку данных, реализацию пользовательского интерфейса и других медленных процессов.

Цитата:
float никогда не использовал, плохо представляю, когда может понадобиться. Если только при использовании старой программы, но я на такой не работаю.
Ну это не значит, что их не используют другие. И от возраста программы это не зависит.

_________________
Белая и Пушистая


Вернуться наверх
 
В сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вс мар 19, 2023 17:40:02 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2917
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18758
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 3
Медали: 1
Лучший человек Форума 2017 (1)
AQ29 писал(а):
современном ассемблере, есть функция логарифма, вызов которой – одна строчка программы.
покажи мне в ассемблере для AVR такую функцию логарифма. видимо, я настолько малограмотный, что такую функцию в ассемблере для AVR не знаю.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вс мар 19, 2023 20:13:40 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: -14
Рейтинг сообщений: 103
Зарегистрирован: Вт янв 26, 2021 22:33:21
Сообщений: 2315
Рейтинг сообщения: 0
Ld a,log B

_________________
Не спрашивай по ком звонит колокол, он звонит по тебе !


Вернуться наверх
 
В сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вс мар 19, 2023 21:52:11 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2917
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18758
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
Alex_641, во-первых, регистра а в этих МК нет.
во-вторых, открой список команд AVR и найди там команду вычисления логарифма.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вс мар 19, 2023 21:56:27 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 878
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 6051
Откуда: Minsk
Рейтинг сообщения: 0
AQ29 спутал программу "ассемблер" с интегрированной средой разработки, частью которой ассемблер является. И все функции в этой среде появляются при подключении линкером объектной библиотеки, которая тоже является ещё одной частью среды разработки. Я не говорю о какой-то конкретной среде - во время моей "производственной деятельности" у меня был "чистый" ассемблер, а плавучку и функции для устраивающего меня компромисса меж точностью, быстродействием и расходом памяти писал сам.
А вооще забавно: провозглашать ненужность float - и тут же - про логарифмы?! Даёшь только целочисленные логарифмы!
lg (2) = 0, lg(9) = 1.
Мы с котом Мурзиком долго смеялись
СпойлерНапоминает из бессмертного "Недоросля" :
Цитата:
Всё то вздор, чего не знает Митрофанушка.

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн мар 20, 2023 11:28:17 
Потрогал лапой паяльник
Аватар пользователя

Карма: 4
Рейтинг сообщений: 79
Зарегистрирован: Сб фев 18, 2023 21:51:01
Сообщений: 306
Откуда: Санкт-Петербург
Рейтинг сообщения: 4
Это не «изыск», а обычная работа на современной программе, вполне подойдёт для зарабатывания «денешшшшек».
Вы попробуйте донести эту мысль до Andrey_B, который пишет (в другой теме, в своей):
такие проекты это скорее демосцена, выдавливание всей до капли производительности МК.
И далее делает вывод:
Цитата:
Достойно, интересно, но в массовом сегменте применить практически невозможно.
А для меня не проблема как выбор оптимального языка программирования, так и получение экстремального (по тому или иному критерию) результата.

Цитата:
Как я понял, вы работаете в прерывании. В прерывании пишу только самый необходимый минимум, всё остальное – в основном цикле. Для меня работа в прерывании – источник всяческих проблем, зачем они нужны. Правда, ситуации бывают разные.
Это задачи бывают разные, а не ситуации. Все задачи для МК можно условно разбить на две большие группы: вычислительные и задачи управления процессами. В действительности, конечно, для управления процессами тоже надо производить какие-то вычисления, но они там не первостепенны. А и в вычислительных задачах надо как-то ввести исходные данные и как-то куда-то вывести результат, то есть общаться с периферией, но это общение в таких задачах не первостепенно. Тем не менее несмотря на некоторую расплывчатость границы между этими двумя типами задач, различие между ними хорошо видно.
Так вот в вычислительных задачах прерывания совершенно не нужны. Задачи же управления напротив, в 100% случаев гораздо эффективнее решаются на прерываниях, лишь бы была их аппаратная поддержка в конкретном контроллере. Мне чаще приходится решать задачи по управлению процессами, поэтому у меня основной цикл нередко выглядит так:
Код:
  sei();
  while(1) {sleep_cpu();}
}
Завершающая скобка там осталась от int main(void){. А источник всяческих проблем находится не в прерывании, а в голове, то есть в непонимании работы контроллера и языка программирования для него.

_________________
Всего доброго.
Евгений.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Ср мар 22, 2023 14:24:09 
Встал на лапы

Зарегистрирован: Сб июл 30, 2011 21:00:24
Сообщений: 115
Рейтинг сообщения: 2
Just_Fluffy
При наличии больших программ в прерываниях надо тщательно анализировать всю программу, что будет, если прерывания возникнет в каждом месте.
Это трудоёмко и легко допустить ошибку.
Может случиться совсем неприятная ситуация, когда сбой при прерывании возникает только в одной точке программы. Если ещё прерывание происходит нечасто, тогда сбой может проявляться очень редко, например, раз в неделю. Искать такой дефект трудно.
Для себя считаю наличие больших программ в прерывании плохим программированием.
Использую простой алгоритм: в прерывании – необходимый минимум действий и выставляется флаг, обработка прерывания в основном цикле в окне прерываний.

Насчёт float и возраста программы. Вам понадобился логарифм, и вы были вынуждены использовать float. У меня современная программа, там есть встроенный логарифм на целочисленной арифметике, мне float не нужен.
AQ29 спутал программу "ассемблер" с интегрированной средой разработки, частью которой ассемблер является.
А вооще забавно: провозглашать ненужность float - и тут же - про логарифмы?! Даёшь только целочисленные логарифмы!
lg (2) = 0, lg(9) = 1.
Мы с котом Мурзиком долго смеялись

Я не спутал ассемблер и интегрированную среду разработки.
В посте предварительно для краткости написал слова «условно говоря, современный ассемблер».
Интегрированная среда разработки, в которой есть все ассемблерные команды и т.д. – это долго писать.

Лозунг «Даёшь только целочисленные логарифмы!» для меня уже устарел, я такой использую.
Кот Мурзик может продолжать смеяться, для вас поясню.
Выше в посте писал, что единице соответствует число 1024, т.е. будет не lg(2), а lg(2048). Впереди ещё есть множитель, значение не помню, надо смотреть в описании логарифма.
Вообще, целочисленная арифметика – довольно интересное и увлекательное занятие.


Вернуться наверх
 
В сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Ср мар 22, 2023 22:19:26 
Сверлит текстолит когтями

Карма: 12
Рейтинг сообщений: 124
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1232
Рейтинг сообщения: 0
Just_Fluffy, красиво глаголите. И, главное, правильно. Даже не похоже на даму.)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Ср мар 22, 2023 23:37:53 
Мучитель микросхем
Аватар пользователя

Карма: 10
Рейтинг сообщений: 155
Зарегистрирован: Ср июн 29, 2022 16:25:45
Сообщений: 486
Рейтинг сообщения: 1
AQ29, с вами спорить - себе дороже.
Если у вас прерывания зависают на таком простом камне как АВР - значит вы их готовить не умеете.
И короткие прерывания у вас будут зависать точно так же.
Прерывание может вызываться в любом месте программы. И программа не должна даже догадаться, что вдруг прилетело прерывание.
Для этого достаточно сохранить SREG и используемые регистры. а потом не забыть их восстановить.
--
Касательно логарифма - покажите всем команду вычисления логарифма в современном ассемблере.
Фрагмент кода или скрин подойдет.
А то мы тут такие тупые блондинки, нихрена не понимаем, пользуемся устаревшими флоатами и аналоговыми логарифмами....

OKF, как говорил кот Матроскин - я еще и на машинке строчить умею.... )))
Вы не поверите, я еще и в паяльник с хлорным железом умею...

_________________
Белая и Пушистая


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Чт мар 23, 2023 06:32:41 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Не аналоговыми логарифмами, а тёплыми ламповыми

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

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Чт мар 23, 2023 07:23:27 
Друг Кота

Карма: 67
Рейтинг сообщений: 1961
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
AQ29 писал(а):
Если ещё прерывание происходит нечасто, тогда сбой может проявляться очень редко, например, раз в неделю. Искать такой дефект трудно
Неверный метод тестирования.
AQ29 писал(а):
для себя считаю наличие больших программ в прерывании плохим программированием.
Запретите прерывания в начале обработчика, разрешите в конце - и можете писать сколь угодно большой обработчик. И это будет хорошо. Плохо - непонимание механизма работы прерываний и неумение им управлять.


Вернуться наверх
 
В сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Чт мар 23, 2023 09:51:00 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2917
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18758
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 3
Медали: 1
Лучший человек Форума 2017 (1)
Martian, в AVR, когда зашел в обработчик прерывания, прерывания УЖЕ запрещены, и дополнительно запрещать их не недо.
а когда выходишь из обработчика, прерывания разрешаются автоматически, и принудительно их разрешать не надо.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Чт мар 23, 2023 11:03:29 
Друг Кота

Карма: 64
Рейтинг сообщений: 1013
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4337
Откуда: Ижевск
Рейтинг сообщения: 1
Замечу. Когда из обработчика выход по RETI, да прерывания разрешаются. Бывает, иногда, полезно выходить по RET, в этом случае можно использовать команды BRIE и BRID.


Вернуться наверх
 
В сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Чт мар 23, 2023 13:30:54 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2917
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18758
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
а еще иногда бывает, что при входе в обработчик полезно сразу же разрешить прерывания, чтобы очень важное событие обработало собственное прерывание с минимальным опозданием.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Чт мар 23, 2023 21:21:15 
Мучитель микросхем
Аватар пользователя

Карма: 10
Рейтинг сообщений: 155
Зарегистрирован: Ср июн 29, 2022 16:25:45
Сообщений: 486
Рейтинг сообщения: 0
Starichok51, Да. Но это редкие случаи и в таком варианте действительно правильней делать прерывания максимально короткими.
Если мне не изменяет память, Ридико Л.И. какой то свой генератор делал - у него почти весь код генератора был в огромном таком прерывании. А ошметки процессорного времени отводились на управление этим генератором...

_________________
Белая и Пушистая


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Чт мар 23, 2023 22:44:48 
Друг Кота

Карма: 67
Рейтинг сообщений: 1961
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 3
Ну, не такие уж и редкие. Но и в таких случаях необязательно делать обработчики максимально короткими . Если я уверен, что нет риска переполнения, зачем? И именно за этим надо следить. А то можно наплодить кучу вложенных процедур из основного цикла, что точно также всё обрушит и без прерываний. Или одним малюсеньким прерыванием, после чего обвинить его во всех грехах )
В общем, нельзя из какого-то метода делать догму и потом лениво следовать ей, это ограничивает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Чт мар 23, 2023 23:05:56 
Мучитель микросхем
Аватар пользователя

Карма: 10
Рейтинг сообщений: 155
Зарегистрирован: Ср июн 29, 2022 16:25:45
Сообщений: 486
Рейтинг сообщения: 0
AQ29, Я так понимаю, на вопрос про команду логарифма в современном ассемблере ответа не будет....
Предупреждение :
RCALL и ICALL - это команды прямого и косвенного перехода, но не директивы вычисления логарифма.

_________________
Белая и Пушистая


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Вс мар 26, 2023 20:56:58 
Встал на лапы

Зарегистрирован: Сб июл 30, 2011 21:00:24
Сообщений: 115
Рейтинг сообщения: 0
Just_Fluffy
Как уже писал, большая программа в прерывании – источник проблем:
- можно затереть какую-нибудь переменную,
- может возникнуть проблема из-за использования какого-нибудь аппаратного устройства (таймер, SPI и т.д.), которое используется в основном цикле,
- может возникнуть проблема из-за времени, поскольку программа слишком долго находится в прерывании,
- при работе в прерывании МК не реагирует на другие прерывания, если запретить, можно пропустить важное прерывание,
- сложности с дальнейшим развитием программы и т.д.
Конечно, можно все проблемы решить, но зачем.
При обработке прерываний в основном цикле всё гораздо проще.
Достаточно времени, свободны ресурсы МК, хороший контроль работы и т.д.
Вероятность совершения ошибки гораздо меньше, поэтому предпочитаю такую работу, так что дело не в том, что «не умею готовить».
Это вообще-то довольно большая тема.

Предупреждение насчёт RCALL и ICALL очень ценное, учту.
К счастью, логарифм вызывается другой командой:
A = Log_10_2 V n
10 – десятичный логарифм, 2 – аргумент 2 байта.
Здесь V – двухбайтная переменная, А - двухбайтная знаковая переменная.
n – множитель, чтобы сразу привести результат к нужному значению.
Например, если надо получить результат на 20 % меньше, надо написать 0,8.
Сама программа – около 17 строк.
Вообще-то логарифм на целочисленной арифметике давно выкладывался в интернете.
Не знаю, как делаются ссылки, напишу текстом.
Это сайт easyelectronics.ru, на форуме раздел Valhalla, на 3 странице подраздел Алгоритм билдер (описания, без программ), последний пост от Alexander_1 от 26 марта 2016 года.
Как совпало, сегодня прошло ровно 7 лет, для программирования это большой срок. Так что Jack_A сильно запоздал с лозунгом про целочисленные логарифмы, народ уже давно пользуется, 265 скачиваний.
Там логарифм написан на АБ.
Сама программа относительно несложная, а вот расчёт точек разбиения и коэффициентов довольно непростой.
Аппроксимация даже разная: вдали от нулевого значения функции - пересечение, а вблизи – касательная, она лучше прилегает к логарифму.


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

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


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

Сейчас этот форум просматривают: OKF, Starichok51 и гости: 126


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

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


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