Gtlab Forum
Тематический => Негитарная электроника => Тема начата: Peratron от Июля 31, 2011, 10:29:55 pm
-
Отвечаю в этой новой теме на пост http://forum.gtlab.net/cgi-bin/yabb2/YaBB.pl?num=1249507367/1719#1719
Для батарейных применений больше подходит эта серия однокристалок
http://focus.ti.com/paramsearch/docs/parametricsearch.tsp?sectionId=95&tabId=1200&familyId=342&family=mcu
У меня девайс на них с 2-мя NTC термисторами и ЖК дисплеем (просто стекло без электроники) работает от литиевой батарейки уже 10 лет.
Ну, на мой вкус, особо беспокоиться за потребление не приходится - примочки едят 3...5 мА, как минимум, и никто не парится, отдавая пару миллиампер на светодиод.
Потому потребление стандартной атмеги, работающей на скромной частоте 1 мГц без кварца совершенно никого не напряжёт - 50 мка, это даже не смешно. Это просто незаметно.
Зато освоение этой техники на несколько порядков проще - в первую очередь через ардуино, в котором стандартизировано всё, что имеет смысл стандартизировать.
Предлагаю в этой ветке обсуждать применение микропроцессоров для управления примочками (расширенно понимая под этим любую гитарную электронику). Также тут имеет смысл обсуждать общую философию МП в прилажении к примочкостроению, специфику разных семейств и прочие общие вопросы.
Причём, под микропроцессорами предлагаю понимать в рамках этого треда только универсальные и распространённые - то есть, на сегодняшний день фактически атмелы/ардуино и пики.
Остальную экзотику, а так же дсп следует сразу же выносить в отдельные темы - что б не создавать кашу.
Что касается практики - я вот потихоньку приступил к созданию некоего девайсика, способного рулить потенциометрами любого аналогового устройства: на нужный пот вместо штатной ручки одевается гаджет с электродвигателем, который ручку крутит в нужный момент и в нужной степени.
Естественно, без МП в этой задаче не обойтись - потому заказал у китайских братьев ардуино + движки с редукторами и сейчас сращиваю одно с другим :o
По основной задумке, это должна быть коробочка, которая устанавливается в педалборд и крутит в минимальной конфигурации четыре ручки на любых примочках в этом педалборде.
В более пафосном варианте - это рэк, который крутит соседними с ним приборами в студийном/сценическом сетапе.
Есно, крутит по программе - как пресет по кнопке, так и плавное управление по любому закону.
Поскольку сейчас прохожу начальный этап вгрызания в тему - предлагаю присоединяться ко мне. Начальные кроки - с чего начать, как подключиться, как запрограммировать - готов пояснить. Дальше оно забудется - и будет уже сложней возвращаться к азам, потому сейчас наиболее удобный момент двинуться всем вместе.
Я это адресую в первую очередь камрадам Ал-др и Дядьке Вишне - очень много задач, над которыми вы бьётесь, решаются предельно эффективно именно при помощи того, от чего вы старательно отворачиваетесь.
Это всё очень просто - гораздо проще, чем вы пока себе представляете.
Да, для начала придётся затратить небольшую копейку - купить/заказать ардуино. Это несколько сот рублей.
Но зато потом будет море удовольствия - на одном макете, без всякого паяльника можно сделать с десяток важных для примочкостроения устройств.
ПРИСОЕДИНЯЙТЕСЬ!
Задавайте любые вопросы - что сейчас знаю, то отвечу.
-
В общем, если уже делать на МП с ЖКИ, тогда сразу сделать контроль всего: напряжений батарейки, накала, анода, вторых сеток, а еще индикатор уроня выходного сигнала. Чтоб эти параметры с периодичностью на индикаторе переключались
Без проблем - кроме одной: подсветка!
Если взять пассивный ЖК - то работать можно будет только при внешнем свете, а если брать с активной подсветкой, то это будет потреблять.
Если же прибор с мощным питанием - то вообще без проблем.
С технической стороны работа тут крайне небольшая - я заказал в начальный комплект вот такой индикатор с кнопарями:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.alibaba.com%2Fimg%2Fpb%2F874%2F686%2F367%2F367686874_335.jpg%3Cbr+%2F%3E&hash=b20ec6ae99926c9363410427e21f73f9e38758c3)
http://www.aliexpress.com/product-fm/436626496-LCD-Keypad-Shield-for-Arduino-Duemilanove-LCD1602-Free-Shipping-wholesalers.html
Он уже приехал и дожидается своей очереди быть пристёгнутым к делу.
Заказал ещё графический дисплей - он пока ещё едет.
Для цепляния дисплеев в ардуино существуют готовые библиотеки - потому работа по подключению очень тупая.
Из того, где придётся думать - это то, как ты его будешь задействовать. Но всё, что ты запросил - делается, по моему нынешнему разумению, не более, чем за один вечер.
То есть, ты можешь очень и очень выпендриться с дизайном - можно же не ЖК дисплюй использовать, а красивый светодиодник. И на нём вывести любую информацию - в ардуине 6-канальный 10-разрядный АЦП. То есть, тебе нужно только делителями нормировать измеряемое напряжение - и использовать стандартную библиотеку индикации, подогнав её под свои запросы.
При этом, можно включать анодку с нужной задержкой, по любому закону. В общем, всё, что придумаешь...
Если не пожалеть бабок и реализовать темброблок и гейн через цифровые потенцы - то можно вообще получить пресетное управление.
Следующим моим НИОКром будет компрессор с аналоговым звуковым трактом и микроконтроллерным управлением динамикой...
UPD: а до того, полагаю, придётся сотворить лиинейный индикатор уровня - с адаптивным временем интеграции и памятью. На двухцветных диодах...
-
Peratron, вот ты все про потребление да потребление...А кого оно интересует в педалборде? Помоему больше 90% педалбордов люди тыкают таки в розетку.
П.С. Если чесно не видел ниодного живого человека у которого в педалборде примочки с кронами внутри :-/
-
Поскольку сейчас прохожу начальный этап вгрызания в тему - предлагаю присоединяться ко мне. Начальные кроки - с чего начать, как подключиться, как запрограммировать - готов пояснить. Дальше оно забудется - и будет уже сложней возвращаться к азам, потому сейчас наиболее удобный момент двинуться всем вместе.
Эту почетную миссию прийдется пока вам тащить. Могу сказать за себя, что я в этой области пока интересовался только поверхностно из любопытства.
И еще. Хотя и на картинке все хорошо видно, тут жирным текстом должно быть точное название того что нужно приобрести (купить) - т. е. бумажка для базара. Или это только заказ и пересылка ?
Что касается практики - я вот потихоньку приступил к созданию некоего девайсика, способного рулить потенциометрами любого аналогового устройства: на нужный пот вместо штатной ручки одевается гаджет с электродвигателем, который ручку крутит в нужный момент и в нужной степени.
Естественно, без МП в этой задаче не обойтись - потому заказал у китайских братьев ардуино + движки с редукторами и сейчас сращиваю одно с другим
К этому тоже есть интерес. Создавал я тему, где была идея крутить потенциометрами по случайному закону (или по программе, это кому уже как ....). Я в этом направлении сделал две коробочки, думаю позже, покажу их в соответствующим топике. Так там параметры пока управляются привычным способом (генератор синуса) или таким экзотическим - как мигающие светодиоды(в качестве случайного генератора). Но в то же время и потенциометры вынесены на панель, так что, идея движков с редукторами тоже остается актуальной.
Мы тогда обсуждали и механический вариант - движки с редукторами. Но тут опять стоит задача приобретения такового, поэтому желательно фотки изделий, как его правильно называть. Когда имеешь дело с торгашами, им пока конкретно не вдолбишь, то он\она тебя не поймет.
А эта штуковина может сформировать несколько случайных форм. Только что б это были не случайные импульсы, а имитации гладких кривых ? Ну а потом этим управлять движками
По ответу #1, отвечу чуть позже, что б не сваливать все в кучу
-
Peratron, вот ты все про потребление да потребление...А кого оно интересует в педалборде? Помоему больше 90% педалбордов люди тыкают таки в розетку.
П.С. Если чесно не видел ниодного живого человека у которого в педалборде примочки с кронами внутри :-/
Для педалборда - пресетная крутилка. Есно, что это с внешним питанием.
А минимизация потребления рассматривается для другого применения МП - управления светодиодным индикатором в батарейной примочке.
Множество других применений - тоже под батарейный вариант...
-
Потому потребление стандартной атмеги, работающей на скромной частоте 1 мГц без кварца совершенно никого не напряжёт - 50 мка, это даже не смешно. Это просто незаметно.
Это потребление только в режиме Power-down из которого проц вытягивается только внешними прерываниями, так как все модули захалтены. Довольно бесполезный режим (только включение/выключение примочки)
Потребление в Idle Mode, где застопорен только проц, но работает вся периферия ~1мА
В Active Mode при 1 мГц ~2.5мА
Для примера MSP430 Active mode (1 мГц) - 370мкА мах
Low-power mode 0 (с периферией на 1 мГц) - 100мкА мах
Low-power mode 4 (с остановленной периферией) - 0.5 мкА
PS Я не агитирую конкретно за MSP, просто как и в случае с собственно с аналоговой частью примочек нужно не подгонять схемотехнику под комплектацию, а выбирать нужный проц под соответствующую задачу.
PPS Если программировать на С, то становится абсолютно все равно на чем проектировать, так как различие будет только в управлении периферией (адреса, назначение битов). А компиляторы С есть для всех однокристалок.
-
Могу сказать за себя, что я в этой области пока интересовался только поверхностно из любопытства.
Вот и предлагаю расширить свои представления о потенциальных возможностях хотя б из любопытства.
Расширить и углубить ;)
И еще. Хотя и на картинке все хорошо видно, тут жирным текстом должно быть точное название того что нужно приобрести (купить) - т. е. бумажка для базара. Или это только заказ и пересылка ?
А вот тут не понял.
Это ссылка для заказа - там и цена с доставкой указана...
Что касается конкретной документации - так это ж магазин. Точней - китайская лавка чудес. Тут что увидел - то и купил.
UPD: А... сообразил...
Это ссылка на доставку (просто другой у меня нет под рукой) - а для заказа нужно найти этот же гаджет в основном разделе алибабы. То есть, воспользоваться поисковиком, строка которого сверху. Просто взять из названия лота ключевые слова - и скопипастить их в поисковик.
Можно, к примеру, набрать arduino - и получить все лоты, имеющие к этой теме отношение.
Но тут опять стоит задача приобретения такового, поэтому желательно фотки изделий, как его правильно называть. Когда имеешь дело с торгашами, им пока конкретно не вдолбишь, то он\она тебя не поймет.
Это да. Но пока вопрос с движками ещё находится в области изначальных экспериментов и потому для рекомендации не созрел. В частности, приехали движки с редуктором 200:1 - а это не совсем правильно: крутит слишком медленно и со слишком большой силой.
Правильней были б движки с редуктором 50...100:1 - и бегал бы побыстрей, и за упоры можно было б не опасаться.
Так, что когда найду конечное решение - тогда и обнародую его.
Для примера же пока вот это:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.alibaba.com%2Fimg%2Fpb%2F246%2F842%2F372%2F372842246_597.jpg&hash=0a6aa13d1ddeaf3185563c7c6a834851f09840d5)
http://www.aliexpress.com/product-fm/445059879-Used-12MM-DC-Decelerating-motors-Gear-motor-micro-motor-small-motor-All-metal-gear-wholesalers.html
Features
DC Geared Motor 12MM
Operating voltage: 3V
Speed: 35RPM (revolutions per minute)
Diameter: 12mm
Shaft diameter: 3mm
Shaft length: 4mm
Deceleration ratio: 280:1
Total motor length: 29mm
Цена с доставкой: $15.21 (4шт).
А эта штуковина может сформировать несколько случайных форм. Только что б это были не случайные импульсы, а имитации гладких кривых ? Ну а потом этим управлять движками
В атмеге (взятом за основу для ардуино) имеется несколько выходов с ШИМ - т.е. можно формировать квазианалоговое напряжение для управления любыми параметрами (например - скоростью вращения двигателя).
Нарисовать любую функциональную кривую - задача чисто математическая. Надо только сообразить, как это будет выглядеть программно...
-
В Active Mode при 1 мГц ~2.5мА
Реально - несколько меньше (новые процессоры).
Если есть смысл бороться за экономию и нет требований к быстродействию - то оно и на 100 кгц прекрасно работает. А на таких частотах динамическое потребление уже вообще никакое.
Ну, работа через периодическую активизацию спящего режима тоже может быть эффективным вариантом.
Тут есть над чем подумать.
Ещё раз подчеркну - на этапе освоения технологии важней всего решить функциональную задачу, а ардуино с клоном атмеги-8 для этого наиболее подходяще.
Решив задачу (опробовав алгоритмы) и овладев принципами, можно подыскивать и боле подходящий к случаю клон МП.
Если программировать на С, то становится абсолютно все равно на чем проектировать, так как различие будет только в управлении периферией (адреса, назначение битов). А компиляторы С есть для всех однокристалок.
Вот именно.
Но проект ардуино для начинающих ценен тем, что резко снижает объём начальной информации, которой нужно овладеть при старте. Действия новобранца: купить конкретный клон (предпочтительней НАНО) - скачать софт - вставить USB-кабель в микропроцессор - взять обучающий пример (он имеется в программирующем софте) - скомпилировать его прямо в кристалл - и убедиться, что светодиод заморгал. То есть, всё работает!
Дальше - поиграться параметрами моргания: это делают все в первом же сеансе ;)
После этого - убедиться, насколько это всё просто. И дальше - заняться изучением программирования: составить свой алгоритм под свою задачу - натягать готовых библиотек, коих немеряно, отладить свою программу...
Вот, собственно, и всё...
А дальше - мозги идут вразнос: приходит понимание своего почти-всемогущества :D
Могу то, могу это - всё могу! :o
ХИНТ: собственно, я совершенно намеренно выступаю сейчас в роли Змея-Искусителя - чем больше камрадов поверит в то, что это им по силам, тем лучше будет для всего нашего дела.
-
Ну, работа через периодическую активизацию спящего режима тоже может быть эффективным вариантом.
Тут есть над чем подумать.
Именно так у меня и сделано в девайсе, который работает на MSP 10 лет, так как мерять температуру чаще чем раз в минуту не имеет смысла.
Но проект ардуино для начинающих ценен тем, что резко снижает объём начальной информации, которой нужно овладеть при старте. Действия новобранца: купить конкретный клон (предпочтительней НАНО) - скачать софт - вставить USB-кабель в микропроцессор - взять обучающий пример (он имеется в программирующем софте) - скомпилировать его прямо в кристалл - и убедиться, что светодиод заморгал. То есть, всё работает!
Главное не останавливаться на нем, я имею ввиду светодиод ;)
-
Главное не останавливаться на нем, я имею ввиду светодиод
Хо!
Главное - это удержать себя от погружения в осуществление сперхпродвинутых проектов.
Ну, к примеру, мне приходится сейчас себя постоянно окрикивать, что б не кинуться в осуществление одного давнего проекта - гитарный супер-октавер: с переносом на 2...3 октавы вверх, октавным (органным) синтезом, консервацией тона, миди-интерфейсом. Ну, и кучей сопутствующих фичей второго порядка значимости.
В своё время я слепил его в железе - потому алгоритм проверен и работает, и нет сомнений, что его удастся легко утрамбовать в единственный кристалл МП. Но помимо этой темы, есть куча других больших и маленьких приложений для МП.
Потому приходится сосредотачиваться на методичном продвижении, а не анархическим прыжкам к тому, что приспичило здесь-и-сейчас...
-
приходит понимание своего почти-всемогущества
ну сразу можно поправить ,не больше чем позволят китайцы
или менеджеры ............... большинство устройств которые ктото сам
хочет сделать из МК уже сделаны . Чтобы сделать устройство
лучше чем продают в магазине это надо из штанов выпрыгнуть..........
была как то задумка сделать диктафон 44 кГц 16 бит (реально то чего на рынке оч. мало и дорого),
дык внутренние АЦП МК авр это просто по менеджерам сделано , а внешнии либо нет либо дорогие итд
-
Ну, к примеру, мне приходится сейчас себя постоянно окрикивать, что б не кинуться в осуществление одного давнего проекта - гитарный супер-октавер: с переносом на 2...3 октавы вверх, октавным (органным) синтезом, консервацией тона, миди-интерфейсом. Ну, и кучей сопутствующих фичей второго порядка значимости.
Для этого лучше уже посмотреть в сторону ARMов, у них и есть и нормальный кодековский интерфейс и память можно повесить достаточную для воспроизведения большого фрагмента (эффект лупера) без извратов со страничной адресацией.
-
Возвращаясь к #1. контроль разных напряжений в преампе или любой другой примочке конкретного назначения.
Есть, конечно, и другие способы, например поставить "стрелку" от магнитофона и многоступенчатый переключатель и контролировать все что угодно. Тут вопрос не столько целесообразности, а сколько что б понять и освоить сабж. Все равно на чем то надо будет пробовать.
Если питание не батарейное и даже не критично потребление тока, то возможно ли применение светодиодных матриц ? Вот такие дома нашел:
http://www.box.net/shared/qx22x3pn6j3omy781lgx
А как насчет вакуумных индикаторов, или и там и здесь без дополнительных дешифраторов не обойтись ?
-
какие дешифраторы ??
делается динамическая индикация то есть софтовая............
смысл в том чтобы мигать диодом-элементом только на небольшое время ,
а потом переключиться на следующий , при этом количество проводов
идущих от МК к индикатору меньше чем каждый диод подключать через дешифратор......
или вопрос был не в этом :)..............
-
какие дешифраторы ??
делается динамическая индикация то есть софтовая............
Вот на те индикаторы, которые на фотке
А на вакуумный как, там без дешифратора не обойтись
-
Если питание не батарейное и даже не критично потребление тока, то возможно ли применение светодиодных матриц ? Вот такие дома нашел:
Лучше уж тогда использовать сборки под мультиплексное управление, правда при мультиплексном управлении на общие аноды(катоды) придется подавать через ключики, так как выходы однокристалки не потянут суммарный ток.
Миди футсвич с возможностью подключения 2х педалей экспрессии
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fmilas.spb.ru%2F%7Ekmg%2Ffiles%2Fprojects%2Fmidifs%2FV2%2Fboard.jpg&hash=3dcb5c8639b3e5efac7048a53dbef2614a6e27d3)
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fmilas.spb.ru%2F%7Ekmg%2Ffiles%2Fprojects%2Fmidifs%2FV2%2FMIDIctrl.jpg&hash=0bf8bb4183ed6075d390890aab533e7877e0af07)
http://milas.spb.ru/~kmg/files/projects/midifs/V2/MidiFsSch.pdf
-
Лучше уж тогда использовать сборки под мультиплексное управление, правда при мультиплексном управлении на общие аноды(катоды) придется подавать через ключики, так как выходы однокристалки не потянут суммарный ток.
А что это за типы:
3ЛС324А1 и 3ЛС338Д
их можно задействовать через дополнительные ключи ?
-
вот нашёл по вакуумным в гугле , вобще я и раньше видел
но скорее всего с ними лучше не связываться..........
http://forum.cxem.net/index.php?showtopic=35651
http://www.larsen-b.com/Article/240.html
http://www.larsen-b.com/Article/241.html
-
А что это за типы:
3ЛС324А1 и 3ЛС338Д
их можно задействовать через дополнительные ключи ?
Отдельные индикаторы, чтобы их использовать в мультиплексном режиме нужно будет соединить между собой выводы одноименных сегментов всех индикаторов - все "a" между собой, все "b" между собой... Лишние провода на плате.
В сборках под мультиплексное управление это соединение уже сделано внутри.
-
вот нашёл по вакуумным в гугле , вобще я и раньше видел
но скорее всего с ними лучше не связываться..........
http://forum.cxem.net/index.php?showtopic=35651
http://www.larsen-b.com/Article/240.html
http://www.larsen-b.com/Article/241.html
Меня больше интересует вот такой вакуумный индикатор, точнее его возможное применение с МП, по 2-й и 3-й ссылке у меня уже таких нет, пораздавал.
http://www.box.net/shared/41vxdern492ppe5a526c
Отдельные индикаторы, чтобы их использовать в мультиплексном режиме нужно будет соединить между собой выводы одноименных сегментов всех индикаторов - все "a" между собой, все "b" между собой... Лишние провода на плате.
В сборках под мультиплексное управление это соединение уже сделано внутри.
В том индикаторе, который у меня на фотке, похоже что на плате это уже сделано
-
Если питание не батарейное и даже не критично потребление тока, то возможно ли применение светодиодных матриц
Абсолютно беспроблемно - это стандартная фича для МП-устройств.
Единственно - надо проверить токи на предмет необходимости драйверов: голые выходы МП рассчитаны на 20 мА.
Старые совковые матрицы могут требовать больше - особенно, в динамическом режиме.
А как насчет вакуумных индикаторов, или и там и здесь без дополнительных дешифраторов не обойтись ?
Дешифраторы не нужны - МП тут вне конкуренции. Вопрос только о согласовании уровней напряжения - не более того, что позволит МП (а там по питанию - не боле 9 В, емнип).
Так, что драйвера необходимы - и их обычно делали из КТ315, которые удобно ставятся в ряд на печатке, или же из специальных драйверных микросхем. ЕМНИП, что-то вроде 161КН1.
Естественно, индикатор делается по схеме мультиплексирования - и потому драйвера нужны в небольших количествах: на 8 семисегментников нужно 8+8=16 линий.
Вот на те индикаторы, которые на фотке
Соединяешь одноимённые сегменты - и получаешь мультиплексную матрицу.
А на вакуумный как, там без дешифратора не обойтись
Ты наверно пока путаешь - дешифрацию и согласование уровней по току/напряжению.
Дешифрация не нужна в любом случае, а вот уровни согласовывать придётся обязательно - если они отличаются от типовых ТТЛ-нагрузок.
-
Миди футсвич с возможностью подключения 2х педалей экспрессии
Ну, да - в подобных приложениях микроконтроллер вне конкуренции.
Особенно это интересно в варианте педалборда - когда обеспечивается произвольная коммутация примочек и МП задаёт маршрутизацию сигнала с сохранением всех пресетов.
-
А что это за типы:
3ЛС324А1 и 3ЛС338Д
их можно задействовать через дополнительные ключи ?
Гугль тебе в помощь :)
Это классические совковые индикаторы - и они безусловно пригодны для использования, но эстетически они могут не вписаться в современные кондиции: слишком неравномерно светятся сегменты - и уж во всяком случае, что пробить их тупость, лучше давать им побольше току, что потребует обязательных драйверов между МП и индикатором.
Потому перспективней использовать нормальные современные индикаторы - но если жаба душит выбросить совок, то можно и с ним играться...
-
Меня больше интересует вот такой вакуумный индикатор, точнее его возможное применение с МП
Без проблем - но придётся ставить драйвера, как уже сказано выше.
На драйвера очень хорошо пойдут КТ361 - если есть в закромах, то как раз под это дело они то, что доктор прописал. Главное в них - то, что их не жалко для этого ;D
ХИНТ: поскольку в атмегу/ардуино встроен многоканальный АЦП, то нет нужды делать отдельно детектор, да ещё морочиться с его линеаризацией - МП обеспечит высоколинейное детектирование и любую характеристику индикации, причём, как в отношении шкалы, так и временнЫх параметров, включая память столбика, пиковый детектор на одиночном сегменте и т.п. классические удобства современных компьютерных аудиоизмерений.
Всё это делается исключительно софтом - так, что никаких дополнительных узлов в схеме не понадобится: достаточно подключить индикацию и на вход подать звуковой сигнал (через развязывающий конденсатор и сопротивление начального смещения в середину шкалы).
Более того - нет проблем сотворить индикатор спектра: достаточно воспользоваться матричным дисплеем. То есть, ты можешь эту тему сделать с развитием - сначала подключить простой стереоиндикатор, а потом добавить и спектроанализатор.
-
Потому перспективней использовать нормальные современные индикаторы - но если жаба душит выбросить совок, то можно и с ним играться...
...ну да, поиграться и поучиться
На драйвера очень хорошо пойдут КТ361 - если есть в закромах, то как раз под это дело они то, что доктор прописал. Главное в них - то, что их не жалко для этого
такого добра хватает :)
Поищу, где-то еще был такой индикатор, полностью с обвесом, и кажется на КТ361
-
Меня больше интересует вот такой вакуумный индикатор, точнее его возможное применение с МП, по 2-й и 3-й ссылке у меня уже таких нет, пораздавал.
http://www.box.net/shared/41vxdern492ppe5a526c
Радио 1985 N2
http://depositfiles.com/ru/files/4044439
Требуют накала и управляющие напряжения порядка 30В.
PS старение люминофора гораздо больше чем деградация светодиодов. Да и присутствует потеря эмиссии катодом.
В том индикаторе, который у меня на фотке, похоже что на плате это уже сделано
Я имел ввиду если будешь паять на свою плату.
Всё это делается исключительно софтом - так, что никаких дополнительных узлов в схеме не понадобится: достаточно подключить индикацию и на вход подать звуковой сигнал (через развязывающий конденсатор и сопротивление начального смещения в середину шкалы).
Сомневаюсь что это разумный вариант, зачем оцифровывать весь звук, нужна только огибающая.
А линеаризовать ее уже можно софтом.
-
Радио 1985 N2
http://depositfiles.com/ru/files/4044439
Требуют накала и управляющие напряжения порядка 30В.
PS старение люминофора гораздо больше чем деградация светодиодов. Да и присутствует потеря эмиссии катодом.
Благодарю. Где-то была в радио еще схема для него, но это я уже сам найду, было время, делал по ней когда-то
-
Сомневаюсь что это разумный вариант, зачем оцифровывать весь звук, нужна только огибающая.
А линеаризовать ее уже можно софтом.
Ну, если за счёт софта экономится довольно приличный по объёму аналоговый узел - то смысл совершенно прямой: достаточно конденсатора и пары сопротивлений на канал. Не нужен опер или специализированная микруха, не нужно питание для него.
Написать "выпрямитель" в софте - это пара строк. А при запасе вычислительной мощности можно попытаться ещё и частотную коррекцию в софте изобразить - нынешней производительности контроллера достаточно для этого. Для некоторых видов акустических измерений такая коррекция, да ещё гибко управляемая, может быть очень полезной.
Для меня выбор однозначный - делать максимально софтизированный вариант и отступать от него только при объективной нехватке вычислительных мощностей.
-
Если задача стоит только индикатора уровня в однозадачном режиме, то да (причем на ассемблере).
Так как такая задача в реалтайме съест практически все ресурсы AVRки по скорости (чтобы отловить пики возможных клипов сигнала для пикового индикатора + усреднение для инерционного).
И вообще для UV LED индикаторов есть специальные микрухи, на которые подается сигнал, а к ногам вешаются светодиоды.
-
...мля Зум 505-й изобретается заново )))))))))))))))))
-
...мля Зум 505-й изобретается заново )))))))))))))))))
Это к ператрону, я считаю что место цифры только в управлении, да в формировании пространственных эффектов
-
Так как такая задача в реалтайме съест практически все ресурсы AVRки по скорости (чтобы отловить пики возможных клипов сигнала для пикового индикатора + усреднение для инерционного).
Когда то прикидывал для мега-8 - не больше 10%. При тактовой 8 мГц, есно.
Это, конечно, было на асме. Сколько там набежит от С - пока не проверял...
Для сравнения: когда то написал для РК-86 (с его 1.5 мГц и убогой системой команд) реалтаймовский редактор барабанных партитур. Звук - ПЗУ-сэмплер с тремя каналами синтеза.
И всё это бегало, как положено.
Так, что про то, как делать реал-тайм на микропроцессоре - я в курсе...
И вообще для UV LED индикаторов есть специальные микрухи, на которые подается сигнал, а к ногам вешаются светодиоды.
Ну, да. А ещё можно покупать готовые гитарные устройства - вместо того, что б паять их самостоятельно, да ещё изобретать собственные схемы...
-
...мля Зум 505-й изобретается заново )))))))))))))))))
Это к ператрону, я считаю что место цифры только в управлении, да в формировании пространственных эффектов
Интересно - а разве Ператрон тут что-то другое пропангандирует?!
-
"Stop digital madness!" ;D ;D ;D ;D
-
Ну, да. А ещё можно покупать готовые гитарные устройства - вместо того, что б паять их самостоятельно, да ещё изобретать собственные схемы...
Не нужно утрировать, UV метр самодостаточная вспомогательная вещь и проще делается на специализированной микрухе, коих великое множество.
Интересно - а разве Ператрон тут что-то другое пропангандирует?!
гитарный супер-октавер: с переносом на 2...3 октавы вверх, октавным (органным) синтезом
Причем для пространственных цифровых эффектов я предполагал совсем не меги а ДСП, которые именно под это заточены.
Вот управление моторизованными потами в ламповых устройствах, где не поставить цифровые поты из за их низковольтности, это очень интересная тема.
PS что то Rst7 затих с темой спикерсимуляции на ДСП
http://forum.gtlab.net/cgi-bin/yabb2/YaBB.pl?num=1298297744/70#78
-
@ KMG
А чем тебе октавер не показался?
Октаверы не относятся к технологиям цифрового звука и давно присутствуют в ассортименте фирменных чисто аналоговых примочек: преобразователь синуса в прямоугольник + делитель частоты на счётном триггере.
В моей версии, которую я, к слову, уже описывал тут на ГТ-лабе, использован продвинутый алгоритм, в котором замеряется период основного тона банальным счётным частотомером.
Всё это успешно у меня работало на 155 серии - микроконтроллер позволяет заменить 155 серию и получить всё в одном кристалле.
Это ни разу не "цифрофой звук" - и ДСП тут никаким боком, поскольку алгоритм не предполагает ни одной математической операции умножения или даже сложения. Только тупой счёт стробирующих импульсов в воротах, заданных входным сигналом - задача для инкрементного регистра, входящего не в одном экземпляре в аппаратный набор любого микроконтроллера.
Причем для пространственных цифровых эффектов я предполагал совсем не меги а ДСП, которые именно под это заточены.
Здоровье на - это самоочевидно и с самого начала я обозначил, что ДСП следует обсасывать в другой теме.
Собственно, для пространственных эффектов ДСП не нужен - нужна линия задержки с продвинутым управлением, и если её удастся организовать на микроконтроллере, то такой версии место в этом топике. А ДСП - не надо...
UV метр самодостаточная вспомогательная вещь и проще делается на специализированной микрухе, коих великое множество.
Самое смешное, что ни одна специализированная микросхема мне не подошла - как не подходит и другим конструкторам студийных измерителей уровня. И если есть возможность всё заменить единственным кристаллом - то так тому и быть.
-
@ Peratron, держи оборону, не сдавайся.
Я у тебя следующий клиент на очереди, поскольку у меня в планах многофункциональные (мультирежимные) устройства, которым очень не помешало бы интуитивное управление.
-
Вспоминается некто Нильс Бор, критикуемый за нерешительность и попытку оставить в квантовой теории классические атавизмы. Вы ещё парой соленоидов через реле придумайте управлять, чтобы ими потом тумблер на девайсе щелкать...
Тогда уж надо (по хорошему) полностью отказываться от таких HID-ов (мы ж все умные, знаем что это значит) как тумблеры и ползунки-крутилки и переходить к полностью циферьЮ как в любом бытовом приборе уже вчерашнего дня...
-
Собственно, для пространственных эффектов ДСП не нужен - нужна линия задержки с продвинутым управлением, и если её удастся организовать на микроконтроллере, то такой версии место в этом топике.
Под пространственными эффектами я подразумеваю не тривиальный дилей, а реверберационные эффекты с суммированием множественных некратных, частотно корректированных отражений.
-
@ Ivana, можно все то же самое, но только по-русски?
-
Эх, Дядька_Вишня, мы ж с тобой в тему низкоуровневых программистов влезли, надо соответствовать степени выпендрежа терминами, иначе заклюют ;D Ты вот в своих примочках на переднюю панельку выводишь всякие тумблерочки, ручечки переменников и ползуночки? ;) А в современных терминах это называется "интерфейс", причем ориентированный на "хомосапа" (С). То есть, решает 2 задачи - позволяет хомосапу с использованием своих конечностей осмысленно и удобно изменять параметры девайса (привыкай к терминам и жаргону :)) и сразу видеть текущие установки - в одном лице :) То есть, получается такой двусторонний Хуман Интерфейс :) А если управлять через цифру, по программе или опять же хуманом только на том конце цифры, то надо или делать конвертер с человеческого "покрутил-щелкнул" в виде моторчиков и соленоидов, либо вообще не использовать этот промежуточный переводчик управления на человеческий язык, а управлять сразу в виде параметров в соответствующих микросхемах - что и предлагается, и что собственно сделано например в твоем (как я полагаю) телеке - у него уже дааавно нет ни ручек ни крутилок, только кнопки без фиксации и расширенный функционал на пульте :)
ЗЫ так что, к примеру, делай уже во всех своих примочках сбоку мультиразъем, который отключает все крутилки и щелкалки на панели и выводит их входы на свои пины при подключении к нему внешнего цифрового управлятора :)
-
ИМХО: для ламповых преампов на практике требуется не более 3-х пресетов, которые и реализуют в виде 3-х каналов: клин, кранч и хайгейн. Так что востребованность моторизованых потов под вопросом. Была бы необходимость - давно бы уже реализовали.
-
Праааальна! А для тех примочек, для которых на практике тоже нужна пара пресетов, народ уже даааавно юзает - правильно, именно пару примочек с разными настройками, переключаясь с одной на другую! ;D А футсвичи со светодиодами индикации и выполняют роль удобного заранее программируемого интерфейса ;D
-
поскольку у меня в планах многофункциональные (мультирежимные) устройства, которым очень не помешало бы интуитивное управление.
Тогда не теряй времени - и приобрети всего одно устройство, которое ты будешь осваивать потихоньку-полегоньку.
Микропроцессорная техника - это мир с новыми понятиями, и для адаптации в его реалиях нужно время-время-время.
Затраты времени на очень постепенное и плавное освоение очень невелики - поскольку информация принимается малыми порциями и хорошо усваивается.
А вот если ты однажды решишь - мол, всё, вот теперь я осваиваю новую для себя тему, и делаю это интенсивно, то ты получишь довольно серьёзное психическое напряжение и продвигаться будешь с "головной болью". И хорошо, если хватит упорства преодолевать дискомфорт, порождаемый когнитивным диссонансом, а не бросить это всё из-за "сложности" одномоментного понимания...
Потому я и предлагаю - пусть у тебя будет железяка, которой ты в любой момент сможешь задавать любые вопросы (мол, можно ли так... или вот так...).
Учиться плаванью в сухом бассейне, рассчитывая, что когда в него нальют воду, ты поплывёшь по чемпионски - недальновидно и наивно.
Потому правильное действие: купить Ардуино Нано - это несколько сот рублей.
Скачать софт - это бесплатно (официально - бесплатно).
Дальше тебе понадобится 10 минут на инсталляцию софта и 10 минут на первые эксперименты с железякой.
И когда она заморгает так, как ты ей пропишешь - ты готов по настоящему думать, и тут же, не отходя от кассы экспериментировать с любыми твоими задумками.
Сразу же мотивирую - почему именно Нано: версия Нано является полнофункциональной в смысле возможностей процессора, имеет встроенный USB-мост и питается от USB.
От полной ардуины она отличается отсутствием гнезда (именно гнезда, а не контактов) для внешнего питания - внешнее питание на нано можно подать через котакты разъёма.
Зато нано компактней - у неё размеры, аналогичные размерам корпуса ДИП-30 (такого, в котором выпускалась, к примеру, ультрафиолетовая стираемая память), и потому Нано садится в стандартную кроватку.
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Farduino.ru%2Fsites%2Fdefault%2Ffiles%2FNotationNanoFront.jpg&hash=42f8b763cc4ba359f6c7cb645887f98bc33e6ea6)
Таким образом, работа с твоим экспериментальным устройством может выглядеть так: на твоей плате установлена кроватка. В неё вставлена ардуинина. От платы ардуина получает питание - и обеспечивает управление, как ты того захочешь.
Ты можешь поступить двояко - запрограммировать МП независимо - как описано выше, а потом вставить в свой прибор и включить его.
А можешь поступить ещё интересней - программировать МП прямо в схеме, через всё тот же USB.
При этом, усб работает не только на программирование, но может обеспечить и двустороннюю связь с компом - то есть, твоё устройство может успешно управляться и управлять компом.
Разумеется, для этого придётся писать свой комповый софт - так, что эта перспектива более отдалённая - но о ней нужно знать сразу же.
Я, собственно говоря, тормознул с применением микроконтроллеров только по той причине, что на том этапе их развития, нужно было писать самому ЮСБ интерфейс для МК. Это было сложно на стартовом этапе - и я отложил дело на потом.
И вот это потом наступило - появилось ардуино, где эти проблемы на 100% решены.
Так, что тормозить больше смысла нет - ардуино развивается не так уж долго, всего пару лет. И его осваивают очень широкие массы. Если сейчас стормозить - отстанешь сильно. Конкуренты сделают всё интересное и ты будешь только зубом цыкать: мол хотел, да не поспел...
Потому самое правильное - ступить на эту тропку именно сейчас - когда это уже почти ничего не стоит в деньгах, но есть ещё время на придумывание своего...
Вот тут - про версии ардуино: http://arduino.ru/Hardware
А тут - про особенности нано: http://arduino.ru/Hardware/ArduinoBoardNano
-
@ Ivana
"интерфейс", причем ориентированный на "хомосапа" (С). То есть, решает 2 задачи - позволяет хомосапу с использованием своих конечностей осмысленно и удобно изменять параметры девайса (привыкай к терминам и жаргону ) и сразу видеть текущие установки - в одном лице То есть, получается такой двусторонний Хуман Интерфейс
Сам сторонник таких дел. Стараюсь по мере возможности использовать.
и что собственно сделано например в твоем (как я полагаю) телеке - у него уже дааавно нет ни ручек ни крутилок, только кнопки без фиксации и расширенный функционал на пульте
Ненавижу всяческого рода кнопочное управление >:( >:( >:( (даже слов не находится :o).
Но!
В предполагаемой линейке моих продуктов намечаются примочки, в которых на верхней панели ничего нет, кроме одной ручки энкодера, который управляет множеством аналоговых параметров (все режимы пресетные - без свободы маневра).
-
Под пространственными эффектами я подразумеваю не тривиальный дилей, а реверберационные эффекты с суммированием множественных некратных, частотно корректированных отражений.
Согласен. Но этим не исчерпывается список пространственных обработок - гораздо более тривиальные дилеи востребованы музыкальной практикой не меньше, а может и больше чистых реверов. Именно, как FX.
А дилей с несколькими отводами требует весьма продвинутого управления - и уж во всяком случае система пресетов для него крайне желательна.
А есть ещё сэмплеры, между прочим - и ими нужно управлять в динамике, при весьма простом звуковом тракте, практически не требующем изголений над цифирьным звуком (то есть, решённым на класической аналоговой основе).
-
Но!
В предполагаемой линейке моих продуктов намечаются примочки, в которых на верхней панели ничего нет, кроме одной ручки энкодера, который управляет множеством аналоговых параметров (все режимы пресетные - без свободы маневра).
Ну прямо как в нашей стиральной машинке! ;D Штук 20 заранее составленных программ "на все случаи жизни" и энкодер перебирающий их по кругу :) Никакой свободы собственного программирования и выбора! ;D
-
Эх, Дядька_Вишня, мы ж с тобой в тему низкоуровневых программистов влезли, надо соответствовать степени выпендрежа терминами, иначе заклюют
Обломаются.
Этот топик как раз затравлен для того, что б ввести в курс дела тех схемотехников-практиков, которые давно уже имеют в творческом загашнике задачи, требующие машинного интеллекта для управления процессом, но не готовые к пониманию программерского слэнга.
Поскольку тут явно имеется целая группа подобных персонажей (не исключая меня, есно) - я и хочу организовать постоянно действующий виртуальный семинар для освоения новой грядки в творческом огороде.
-
ЗЫ так что, к примеру, делай уже во всех своих примочках сбоку мультиразъем, который отключает все крутилки и щелкалки на панели и выводит их входы на свои пины при подключении к нему внешнего цифрового управлятора
Про усб я уже тут сказал - но правильно оставить усб для инженерного (производственного) интерфейса, а примочками управлять через ИК или голубой зуб. Тем паче, что эти фишки уже стандартизированы в рамках проекта Ардуино - поддержаны и аппаратно, и программно.
-
Для управления все таки следует придерживаться музыкального стандарта - MIDI.
Скоро должна появиться спецификация MIDI через TCP, тогда можно будет уже рассматривать нестандартные среды передачи.
-
Тогда не теряй времени
К сожалению, пока что - жесточайший цейтнот.
Потому правильное действие: купить Ардуино Нано - это несколько сот рублей.
При первой же возможности.
Так, что тормозить больше смысла нет - ардуино развивается не так уж долго, всего пару лет. И его осваивают очень широкие массы. Если сейчас стормозить - отстанешь сильно. Конкуренты сделают всё интересное и ты будешь только зубом цыкать: мол хотел, да не поспел...
Эт, точно.
@ Ivana
Ну прямо как в нашей стиральной машинке! Штук 20 заранее составленных программ "на все случаи жизни" и энкодер перебирающий их по кругу Никакой свободы собственного программирования и выбора!
Есть у меня в планах примочка на 10-20 пресетов (и еще одна, с подачи камрада Ал-ндр).
Я диктую эти звуки. И никому не позволю их менять.
Можно подумать, что уровень ГТЛаба ограничивается только топаньем по двум-трем кнопкам преампа.
-
В предполагаемой линейке моих продуктов намечаются примочки, в которых на верхней панели ничего нет, кроме одной ручки энкодера, который управляет множеством аналоговых параметров (все режимы пресетные - без свободы маневра).
Обрати внимание, что в стандарт Ардуино входит поддержка шины I2C - если ты знаешь, что это такое.
Через I2C, к примеру, управляются цифровые потенциометры - не считая широкого ассортимента аналоговых обрабатывающих микросхем (эквалайзеры, регуляторы громкости и т.п.).
-
Потому правильное действие: купить Ардуино Нано - это несколько сот рублей.
При первой же возможности.
Полагаю, что обсуждение правильных поставщиков тоже должно входить в тематику треда - когда созреешь на практические действия, выставляй запрос в тред и мы обсудим, как это лучше сделать...
-
Этот топик как раз затравлен для того, что б ввести в курс дела тех схемотехников-практиков, которые давно уже имеют в творческом загашнике задачи, требующие машинного интеллекта для управления процессом, но не готовые к пониманию программерского слэнга.
Поскольку тут явно имеется целая группа подобных персонажей (не исключая меня, есно) - я и хочу организовать постоянно действующий виртуальный семинар для освоения новой грядки в творческом огороде.
Тогда имхо, надо заходить с другого конца - чуваки, "которые давно уже имеют в творческом загашнике задачи, требующие машинного интеллекта для управления процессом" - какими схемотехническими способами вы управляете своими процессами? Тумблерами и переменными резисторами в 99.999999% случаев и всё? Тогда давайте мы и оставаться в рамках этих двух вариантов, заменим их на сигнальные реле и..... ну очень не хочется сращивать переменник с моторчиком, а юзать кристальные подобные дела не труЪ.... Но что-то может уже придумали интересного в этом плане. Или мы банальный регулятор вольюма будем заменять с помощью УНУ? Вот и все, что требуется от схемотехников! И не надо им мучать свои мозги цифрой, а только выдать ТЗ (С) - менять то-то и то-то (в терминах переменников и тумблеров), так-то - юзеру, сяк-то - программно :) Если конечно не отходить от аналоговости самого девайся, иначе действительно окажется Зум 505 номер два :)
-
Для управления все таки следует придерживаться музыкального стандарта - MIDI.
МИДИ давно уже устарел - хотя его никто и не отменял и он используется там, где это имеет смысл.
Стандартом в управлении - в том числе в аудиотехнике - стал I2C.
Скоро должна появиться спецификация MIDI через TCP, тогда можно будет уже рассматривать нестандартные среды передачи.
Одно другому не препятствует.
Передачу МИДИ через компьютерную сеть давно уже использует Энди (Андрей Родионов) - он написал для этого свой MIDI LAN и юзает уж лет несколько в своей домашней студии, состоящей из полудюжины звуковых станций.
Нет проблем включить в состав устройств и обсуждаемые тут - через любой удобный вариант реализации сетки.
-
@ Ivana, уж извини, создается впечатление, что ты только "варишься в кастрюле перегрузов".
Есть масса других эффектов.
Перегрузы, как таковые, интересны мне лишь частично... ;)
-
@ Ivana
При включении в состав устройства микроконтроллера открывается широкий ассортимент аудиочипов, управляемых через I2C.
Это эквалайзеры, регуляторы громкости, цифровые потенциометры и целая туча прочих аудио-чипов.
Это совершенно новое направление в примочкостроении - и путь лежит исключительно через освоение МК для управления системой.
ХИНТ: конечно, вики в качестве пруфлинка - моветон, но на первый случай сойдёт.
http://ru.wikipedia.org/wiki/I%C2%B2C
UPD: вот тут тоже кое что правильного сказано
http://kazus.ru/articles/343.html
-
Uncle_Cherry причину наезда не понял, поэтому даже смешно :) Ты вообще с какого бока увидел перегрузы? ::)
Ответь мне на один вопрос - ЧТО ты предоставляешь юзеру своих девайсов для "управления параметрами" своей "массы других эффектов" кроме тумблеров-галетников и переменных резисторов? Допускаю, что в 0.000001% случаев это будут переменные конденсаторы и индуктивности :) Аааа...., ещё всякие емкостные датчики-сенсоры от рук-ног....
Ператрон, аудиочипы это конечно хорошо, и подозреваю что они вытеснят многие вещи, но.... во первых, не труЪ (особенно в лампе), во вторых - давай тогда, учи схемотехников-творцов мыслить категориями аудиочипов...
-
МИДИ давно уже устарел - хотя его никто и не отменял и он используется там, где это имеет смысл.
Стандартом в управлении - в том числе в аудиотехнике - стал I2C.
Я говорил о музыкальном стандарте, то есть управлением девайсом снаружи!
I2C - НЕ ПРЕДЕАЗНАЧЕН для работы снаружи устройств! Он изначально был разработан филипсом для ВНУТРИПЛАТНОГО обмена. Можешь мне поверить что на длинном кабеле НЕ РАБОТАЕТ.
А MIDI (как стандарт де факто) нужен чтобы синхронно управлять всем сетапом музыканта.
Одно другому не препятствует.
Передачу МИДИ через компьютерную сеть давно уже использует Энди (Андрей Родионов) - он написал для этого свой MIDI LAN и юзает уж лет несколько в своей домашней студии, состоящей из полудюжины звуковых станций.
Нет проблем включить в состав устройств и обсуждаемые тут - через любой удобный вариант реализации сетки.
Пока нет официальной спецификации, только рисковые разработки, станут ли они стандартом "де факто" еще вопрос.
-
иначе действительно окажется Зум 505 номер два :)
Мне это не грозит. В планах только ЭКСКЛЮЗИВНЫЕ звуки (некоторые давно ждут своего часа - их еще никто не слышал).
Неблагодарная стезя :(. Попробуй убедить в этом мир.
Но, какая-то сила бескомпромиссно ведет меня по этому пути.
Uncle_Cherry причину наезда не понял, поэтому даже смешно Ты вообще с какого бока увидел перегрузы?
Ответь мне на один вопрос - ЧТО ты предоставляешь юзеру своих девайсов для "управления параметрами" своей "массы других эффектов" кроме тумблеров-галетников и переменных резисторов? Допускаю, что в 0.000001% случаев это будут переменные конденсаторы и индуктивности
Любители кручения-верчения ручек - не мой контингент. В моей голове уже достаточная библиотека именно РАБОЧИХ звуков.
Остальное, как бы не при делах.
-
Отдельно следует обозначить тему цифровых потенциометров - она напрямую сопряжена с темой применения МК.
В целом, ЦП ещё дороговаты - но уже есть варианты с разумной ценой. Хотя б такой: http://www.platan.ru/cgi-bin/qwery.pl/id=926389355&group=162
Или тут: http://www.analog.com/ru/digital-to-analog-converters/digital-potentiometers/products/index.html
Как видим, есть поты с ценой даже 0.6$...
-
Любители кручения-верчения ручек - не мой контингент. В моей голове уже достаточная библиотека именно РАБОЧИХ звуков.
Остальное, как бы не при делах.
Ну тогда твои запросы (линейный кейс - и не переведу на русский, сам давай :) ) укладываются только в сигнальные реле - а они потрушнее цифровых потенциометров будут, да и реализуется это на раз плюнуть (ну, KMG на раз, мне повозиться придется конечно :))
Ператрон может, тогда ориентировать народ в 9-вольтовых примочках на цифровые потенцы? И не париться со всякими спецмикросхемами типа эквалайзеров (без особой нужды, конечно)?
-
Ператрон может, тогда ориентировать народ в 9-вольтовых примочках на цифровые потенцы? И не париться со всякими спецмикросхемами типа эквалайзеров (без особой нужды, конечно)?
Вот ещё! Ориентировать народ?!
Да пусть сам ориентируется... >:(
Что касается темы ЦП - она совершенно новая и неизученная. ЦП только-только вышли в область допустимых цен там, где гибкость применения важней трушности и т.п. важных в звукотехнике фичей.
Я, к примеру, не имею ни малейшего понятия о том, как они обойдутся со звуком - ведь это не углеродистая плёнка на гетинаксовой подложке, по которой движочком крутится щётка. ЦП - это специфический чисто полупроводниковый прибор и у него вполне прогнозируема куча своих особых тараканов.
Я даже не знаю - будет ли щёлкать при переключении значений.
Скорость исполнения - пока тоже неизвестна.
Главное, что я увидел сегодня - это то, что при решении каких то особых задач по управлению, имеет смысл заглянуть в прайс-листы: ЦП достаточно заметно дешевеют и становятся экономически оправданными...
-
Дядька Маршалл их с аж 92 года использует
http://milas.spb.ru/~kmg/files/schematics/marshall/jmp1-61-04.pdf
-
Преимущества МП в другом
Сколько можно на педальку поместить управляющих элементов? - максимум 5 - 6
А если в том же преампе нужно несколько регуляторов "гейна" перед ламповыми каскадами, на лицевую панель их все не вынесешь. Или ,например, сделать строенный регулятор с разными характеристиками, такой уже в природе такого не найдешь. Все это позволяет МП с выбором пресетов по желанию
Или, например, управление несколькими параметрами одновременно. Есть даже такое муз. направление - "музыка контролеров"
Вообще кроме Ютуба посоветовал бы всем окунуться в интернет-радио. Понятно у кого безлимитка, надеюсь что у большинства. От туда в несколько раз больше получаешь муз. информации, чем с других источников, носителей и т. д. Есть станции, вещающие строго в одном направлении. Слушаешь от туда разные звуковые заморочки, и пытаешься их как то перенести на язык схем
Говорю это к тому, что для людей традиционных стилей эта тема будет малоинтересно. Но если существует и другая музыка, значит кому-то и это надо.
-
Дядька Маршалл их с аж 92 года использует
http://milas.spb.ru/~kmg/files/schematics/marshall/jmp1-61-04.pdf
Не... Это, ИМХО, всё же несколько иное - это не ЦП, а электронный регулятор уровня.
Отличие в том, что ЦП подобен обычному поту и позволяет включать себя в цепи, изолированные от земли.
ЭРУ - это разновидность ЦАПа.
В качестве ЭРУ я использовал множительные ЦАП (572ПА1) ещё в начале 80х. Правда там использовалось параллельный код - но у налоговых девиц есть множительные цап с защёлкой, и я их присобачивал к микропроцессору.
Впрочем, что там тошиба придумала - не знаю. Может и что-то другое.
Но МЦАПы для регулировки звука - это проверенное решение, которое я, есно, держу в запасе...
По звуку, к слову, оно вполне прилично - даже на уровне ХЭ, а уж для гитаристики вообще без вопросов проходит.
Надо только найти МЦАП с И2Ц по разумной цене...
-
@ Ал-ндр
Давай всё ж с темы не сбивать - пока идёт достаточно продуктивный обмен информацией и лучше от него не отвлекаться. Так, что про стили-интернетрадио лучше в других топиках...
-
Имхо... Да нет никаких перспектив у "примочко"-строения... Пришивать к ним контроллерное управление... Можно конечно, в формате Дядьки Вишни энкодер с таблом... Но тогда уже наступает на пятки агрегированность до полноценного процессора - пусть и аналогового...
Примочки хороши своей лаконичностью и законченностью - обязательно с батарейкой! - вынул из кармана, воткнул между гитарой и кинутым тебе шнуром - и вот тебе эффект в кармане... А контроллерное управление хорошо для мноооогоканального микшера, процессора, студии и т.п...
-
У тошибы просто цепочка резисторов и ключи, которые преключают отводы
http://milas.spb.ru/~kmg/files/datasheets/toshiba/TC9170.pdf
Так что это все таки не цап, хоть и называется Electronic Volume.
-
Так что это все таки не цап, хоть и называется Electronic Volume.
Ну, если это резисторы с ключами - то как раз именно МЦАП (множительный ЦАП).
Электронные регуляторы (с аналоговым управлением) делают на токовых разветвителях (диффпарах).
-
Смотрели разработки TC Electronic? ИМХО как раз по теме.
-
Смотрели разработки TC Electronic? ИМХО как раз по теме.
Пруфлинком порадовал бы - посмотрели б...
-
http://www.tcelectronic.com/
Их продукция накрывает все разговоры в данном и подобных топиках, как зонт муравьиную кучу...причем, лет на пять вперед.
Боритесь, г-да...удачи. ;)
-
Ну, если это резисторы с ключами - то как раз именно МЦАП (множительный ЦАП).
Электронные регуляторы (с аналоговым управлением) делают на токовых разветвителях (диффпарах).
Я имел ввиду что это не классический R2R цап, а переключатель отводов цепочки резисторов.
Смотрели разработки TC Electronic? ИМХО как раз по теме.
Пруфлинком порадовал бы - посмотрели б...
http://www.tcelectronic.com/guitareffects.asp
Этот девайс
http://forum.gtlab.net/cgi-bin/yabb2/YaBB.pl?num=1312151395/0#15
как раз и был сделан для управления G-Major 2
http://www.tcelectronic.com/g-major2.asp
Переключением каналов в ампе, управлением лупером (перключателем цепочки примочек в педалборде) по миди.
-
http://www.tcelectronic.com/
Их продукция накрывает все разговоры в данном и подобных топиках, как зонт муравьиную кучу...причем, лет на пять вперед.
Боритесь, г-да...удачи. ;)
Разговор не создании их аналогов а о создании цифрового сервиса для своих устройств.
-
Когда развалилась ГДР, то в бундесвер попало несколько советских СУ-27, бывших в ГДР-овской армии.
Немцы их (СУ-27) исследовали и сильно закручинились: их перспективный истребитель, на который они потратили большие миллирды совместно с Францией-Англией-Италией-Испанией-Португалией и еще кем-то там, и который должен был появиться на свет лет эдак через десять, по планируемым характеристикам оказался хуже советского самолета, выпускаемого уже не первый год.
Такая вот похожая история, да?
-
@ DDD, а что, ГТЛаб обязательно должен быть в авангарде мирового примочкостроения? ::)
А вдруг здесь выродится нечто, доступное и интересное фанатам паяльника? ;)
-
"...а что, ГТЛаб обязательно должен быть в авангарде мирового примочкостроения?" - бесспорно!
И, даже если не получается, то стремиться к этому мы просто обязаны, иначе нафига все это дело?
Превратиться в то, что теперь представляет собою некогда достославный гитар.ру, ну очень бы не хотелось :-?
-
Я имел ввиду что это не классический R2R цап, а переключатель отводов цепочки резисторов.
Это классический R цап - их же мильён разновидностей напридумывали ;)
Впрочем, я понял - а остальное уже действительно не критично.
http://www.tcelectronic.com/guitareffects.asp
Ни разу не понял - где смеяться?
Ну, железяки... И что?
(это вопрос к DDD, есно)
Разговор не о создании их аналогов а о создании цифрового сервиса для своих устройств.
Именно.
-
Когда развалилась ГДР, то в бундесвер попало несколько советских СУ-27, бывших в ГДР-овской армии.
В ГДР-овской армии Су-27 никогда не было.
Вся остальная история тем более тут не к месту, поскольку офтопична...
-
@DDD, а что, ГТЛаб обязательно должен быть в авангарде мирового примочкостроения?
Отвечу от Ператрона: Да! Потому, что иначе смысла в ГТлабе нет. И ещё потому, что здесь - МЫ!
-
Я вот задумался над реализацией октавера на МК. Чтобы прыжков по нотам небыло как в боссовском. Хочу просимить, но надо алгоритм накидать.
-
Я вот задумался над реализацией октавера на МК. Чтобы прыжков по нотам небыло как в боссовском. Хочу просимить, но надо алгоритм накидать.
Это главная трудность :'(
Напомни про боссовский - какой там алгоритм?
Я могу пока предложить только на основе RS-триггера с двумя компараторами и детектором пика. Это лучший из не использующих спектральную обработку...
Если готов реализовывать в МК (лучше сразу на ардуине) - предложу для обсуждения алгоритм...
-
Боссовский работает на D-тригере, только детекторы неправильно иногда формируют импульсы + фильтр подрезает верхние частоты. http://guitarwork.ru/electronic/firm/Octaver/BOSS%20Octaver%20OC-2.gif
Ардуине в наших краях пока дорого стоит. Есть у меня ATMega 8, 32. (в основном работал с 8) Да и просимулировать их проще.
-
Боссовский работает на D-тригере,
???
:-?
На Д-триггере варианты не просматриваются - в альтернативе либо триггер шмитта, либо RS-триггер с двумя компараторами и детектором.
В данном случае - именно второй вариант.
Для устойчивой работы преобразователя требуется использовать только нековый сниматель - миксовать звучки или использовать бриджевый нельзя, поскольку от положения точки съёма относительно струны зависит гармонический состав сигнала, в котором при определённых позициях начинает преобладать вторая гармоника, а первая - вырождается (или недопустимо ослабляется).
Потому устойчивое преобразование на принципе прямого выделения основного тона компараторами/триггерами возможно только при жёстко нормированных положениях точки съёма.
А значит, невозможно устойчиво снять сигнал при произвольных положениях переключателей/потов на гитаре.
Это ограничение - фундаментально и преодолеть его можно только при использовании высокоинтеллектуальных алгоритмов (например - нейронных сетей, как то сделано в Аксоне). А это требует продвинутой вычислиловки - и значит должно решаться на основе ДСП. То есть, в другой теме.
Так, что для первых экспериментов с МК придётся таки ограничиться триггерно-детекторной системой и смоделировать в МК именно её.
Вот на такой проект я могу взойти, как соучастник.
При этом, предоставлю алгоритм для глубокого расширения способа формирования звуков - с октавингом не только вниз (что малоинтересно), а и вверх - на две-три октавы (что гораздо более ценно).
Имея линейку делителей частоты, можно очень эффективно сформировать спектр нужного состава.
Кроме того, МК способен эффективно формировать огибающую, а так же гейтовать преобразование тона - и сохранять ноту при её отсутствии (заглушении) на входе (что нужно для уверенного формирования релиза).
Тут же просматривается перспектива на МИДИ-конвертацию - что достаточно интересно.
Особенно это перспективно для темы пострунного съёма, которая тут была в ротации...
Ардуине в наших краях пока дорого стоит. Есть у меня ATMega 8, 32. (в основном работал с 8) Да и просимулировать их проще.
Если жаба протестует против покупки готовой ардуинины - то нет ничего проще, чем собрать её своими руками.
Ардуино - это прежде всего стандарт на подключение периферии, и потому достаточно придерживаться его в проекте, что б безболезненно совместить наработки от разных участников.
Потому без особых напрягов бери мегу, смотри спецификацию на ардуину - и используй выводы с ёё стандартами.
Далее - в проект ардуино входит софт (клон С). Потому вгружай в свою мегу ардуиновский загрузчик - и получай возможность использовать полный набор ардуиновских удовольствий.
Ардуино - проект открытый и на все компоненты имеется полная документация. Потому нет проблем это повторить самостоятельно, не покупая готовый МК.
Ардуино ведёт родословную от меги-8 - потому всё будет совместимо
Тут важно понять такую вещь - если начать городить собственные чудеса (использовать собственную архитектуру, методы программирования), то ты останешься в одиночестве.
Я затравил эту темку для того, что б привлечь внимание тусовки и дать понять, что время окомпьютериваться уже пришло - но никто не взойдёт на тему МК по полной программе (кто потенциально мог - давно это уже сделал бы). Слишком уж велик барьер для многих - потому надо искать путь максимального снижения уровня ментальной планки. И ардуино в этом отношении - единственный достойный вариант.
Так, что если не хочешь закрыть тему от других, а наоборот - максимально её расширить, то только через ардуино.
Реализовав гитарную приблуду на технологиях ардуино, максимально облегчишь повторение - последователям достаточно будет купить готовую Нано, поставить её в кроватку в гитарной примочке и зашить скетч через USB.
Любой другой вариант породит массу вопросов - и напрочь отобъёт желание соваться в тему МК.
Вместе с тем, ардуино никак и ничем не ограничивает возможности - это фактически стандартное ядро меги, и ничто не мешает ардуиновское железо использовать, как просто микроконтроллер общего назначения. В особо тяжёлых случаях можно использовать стандартное программирование через мисо/моси - на всех вариантах ардуины есть джамперы для подключения классического программатора.
Так, что опираться следует исключительно на ардуино - тут моя позиция жёсткая...
-
Propellurino - шилд с музыкальной ориентацией для ардуино:
http://www.youtube.com/watch?v=89M5rvolGGU
http://www.hobby-roboter.de/forum/viewtopic.php?f=5&t=72#p312
-
Зашел сегодня в "Мегаэлектронику", лицезрел Ардуино Нано ценою чуть больше килорубля...
Буду наблюдать за процессом со стороны.
-
если мозг пахать не может, ардуино не поможет :)
имхо, для массовых вещей есть тиньки по 2-3 бакса, вполне хватает. А для разовых - армы и пики. Работать с ардуиной - это тюнинг копейки, изучение ms-dos, или евроремонт в хрущевке. выбирайте кому что ближе.
-
Зашел сегодня в "Мегаэлектронику", лицезрел Ардуино Нано ценою чуть больше килорубля...
Буду наблюдать за процессом со стороны.
Китайские братья помогут!
Привезли домой за вполне разумные 4 сотни...
ЛЫТДЫБР: сижу и ваяю стенд - хлеборезка + 2-строковый ЖК-дисплей.
Дисплей такой: http://www.dfrobot.com/wiki/index.php?title=Arduino_LCD%26KeyPad_Shield_%28SKU:_DFR0009%29
В тестовом режиме уже пашет - так, что руки чешутся заняться непосредственно разработкой нового. Но нужно ещё к стенду присобачить аудиоразъёмы и другую холобуду...
ХИНТ: рекомендую глянуть на схемку подключения управляющих кнопок в дисплейном шилде - общим числом 5 штук:
http://www.dfrobot.com/wiki/images/a/a7/LCDKeypad_Shield_SCH.png
Используется только одна входная линия - через один из шести каналов АЦП.
Нажатая кнопка определяется из измерения напряжения на делителе...
-
если мозг пахать не может, ардуино не поможет :)
имхо, для массовых вещей есть тиньки по 2-3 бакса, вполне хватает. А для разовых - армы и пики. Работать с ардуиной - это тюнинг копейки, изучение ms-dos, или евроремонт в хрущевке. выбирайте кому что ближе.
IBM PC вкупе с WINDOWS - это настоящее УГ с точки зрения технического совершенства. В системе твоих образов - это тюнинг даже не запора, а вовсе мотоколяски СЗА.
Однако ж... В силу наличия огромного количества нужных юзерам приложений, выбрать что-либо другое попросту невозможно.
Повторю ещё раз - ардуино хорошо для нас прежде всего тем, что несёт с собой стандарт, обеспечивающий совместимость разработок разных конструкторов.
Другой фактор - для тех, кто не знает разницу между пиком и атмелом, не знает, как запрограммировать МК, не может составить схему подключения, ардуино представляет уникальную возможность: подключи - и работай!
[size=14]Это работает сразу!!![/size]
Ну, и никто не запрещает программировать ардуинскую железяку на ассемблере - добиваясь полного использования ресурсов МК.
Ардуино - совершенно обычный МК, в котором не урезаны никакие возможности...
-
Peratron
Если сейчас стормозить - отстанешь сильно. Конкуренты сделают всё интересное и ты будешь только зубом цыкать: мол хотел, да не поспел...
ну а где они были "10" лет ;D аврки то уже давненько появились , по крайней мере на офф сайте про "новые" серии атмег написано аж в 2002 году ;D
-
Для тех, у кого жаба в разгуле - вариант наколенного изготовления ардуино при помощи ЛУТ:
http://pobot.ru/topic/show/70/
-
По ассоциации - размещу эту ссылку в этой теме, хотя она заслуживает отдельного треда.
И уж чего она точно не заслуживает - быть потерянной:
http://maxmsp.ru/
2 zEROID: обрати особое внимание на эту ссылку!
-
Потихоньку изучаю матчасть - и радуюсь (в ожидаемых пределах).
Как и предполагал - на ардуени как нефиг делать создавать разнообразные миди-контроллеры.
Тем, кто заинтересован в нестандартных миди-примочках для живой игры, предлагаю формулировать техзадания - типа, нужно то то и то то.
Пишу специально для zEROID: к примеру, нет проблем сделать контроллер в виде хренушки, которая берётся в руку и акселерометрами промеряются все движения руки (включая повороты, взмахи и т.п.).
Это дело мидируется - и используется для управления звуком.
Поскольку существуют стандартные шилды для беспроводной связи - то нет проблем реализовать миди-управлялку в автономном виде.
Плата расширения Xbee Shield обеспечивает при помощи модуля Maxstream Xbee Zigbee беспроводную связь нескольким устройствам Arduino в радиусе до 35 метров (в помещении) и до 90 метров (вне помещения).
Подумайте - какие ещё датчики можно использовать для оживления игры?
Вот такая в меру безумная идея: подобный датчик крепится на грифе и по беспроводке управляет, скажем, кваком.
Ы?
То есть, теперь можно бегать по сцене, не привязываясь к педалборду и квакать взмахами грифа.
Само собой разумеется - как нефиг делать, собрать ДУ для педалборда. Причём, "лентяйка", прикреплённая к гитаре, обладает очень большим интеллектом и может быть запрограммирована на любые пресеты.
А если учесть, что я сейчас веду НИОКР по мото-крутилке потов на любой примочке (снимается ручка и на звездочку надевается привод от моторчика, управляемого дистанционно/по программе) - то появляется полная возможность управлять педалбордом с любого места сцены...
До кучи - обратите внимание на такую версию ардуины:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Farduino.ru%2Fsites%2Fdefault%2Ffiles%2FLilyPad_3.jpg&hash=506ee365bc01e9e3080a03602c7b3ce3ee2c4fa5)
Платформа Arduino LilyPad разработана с целью использования как часть одежды. Она может быть зашита в ткань со встроенными источниками питания, датчиками и приводами с проводкой
Или это:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Farduino.ru%2Fsites%2Fdefault%2Ffiles%2FArduinoFio.jpg&hash=a61b676c0a6369f26c23bf22caebd896b115de06)
платформа разработана для беспроводных применений. Fio содержит разъем для радио XBee, разъем для батареи LiPo и встроенную схему подзарядки
Есть ещё готовый вариант - в виде манжеты, надеваемой на запястье...
UPD: вот пример подключения акселерометров к ардуине: http://pobot.ru/topic/show/16/
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fpobot.ru%2Fuploads%2Fimages%2F52%2F469357156a.jpg&hash=e68fa6de91ef6d7018a0f7d285210888a8965509)
Для смеха - схема:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fpobot.ru%2Fuploads%2Fimages%2F52%2Fe66bb4a7e1.png&hash=3122483237d9d1443c5e045ccb239ddad7a68266)
Как видим - это не просто, а суперпросто.
Готовых библиотек для самых разных проектов - море.
Бери - и делай...
-
"Королева, я в восхищении!" (с)
Наверное, скоро конкретно подсяду на это дело.
-
"Королева, я в восхищении!" (с)
Наверное, скоро конкретно подсяду на это дело.
Давно пора!
Тут в голове крутятся очень прикольные варианты для задержек: вот тут осциллограф на ардуине - http://www.compcar.ru/forum/showthread.php?t=4457
Так на новом мега 328 с 16 мгц тактовой он тянет полосу до 50 кГц. А АЦП в атмеге - 10-разрядный.
Конечно, там есть проблемы с помехами - младшие разряды шалят. Но если залудить АДИКМ - то есть комбинацию ИКМ с АДМ, можно получить очень приличное качество при 8-битном кодировании и квантайзе в 16...20 кГц.
А запас мозгов в микроконтроллере позволит очень крутые алгоритмы адаптива сунуть.
Так, что это всё интересно не только в отношении решения чисто управленческих проблем - звуком тоже можно поиграться...
-
осцилл на этом убожестве. да, отлично, когда тебе 16 лет и ты плохо представляешь, что такое осцилл.
Особенно шикарно, что у него по факту 7.5 бит, плавающее время дискретизации и 2кОм входного. Но, программисты не заморачиваются такими мелочами, аппаратные проблемы - не их дело :)
вощем, тема превратилась в блог Ператрона...
-
А АЦП в атмеге - 10-разрядный.*******
звуком тоже можно поиграться...
вот именно поиграться и забыть...... :)
и поменеджеровским соображением даже в большинстве современных МК они продолжают
пихать именно 10 битный АЦП ;D
-
ну, если ядро усыпить, то может быть удастся снять 10 бит, да и с внутрисхемной отладкой все печально, насколько помню (ну, чтобы дешего и сердито).
-
осцилл на этом убожестве. да, отлично, когда тебе 16 лет и ты плохо представляешь, что такое осцилл.
Осцилл "на этом убожестве" нужен прежде всего для того, что б смотреть, что творится внутри схемы, в которой используется МК - а вовсе не для внешнего применения.
Я уже, к примеру, посмотрел дребезг контактов конкретных кнопок. Можно видеть постоянные времени пид-цепочек, качество потенциометров-задатчиков и множество других важнейших для конструктора параметров - ничего при этом не тыкая извне, а просто подключив временно программный модуль в МК.
К примеру, мне этот осцилл жизненно важен для отработки сорвосистемы - с его помощью смотреть динамические характеристики электродвигателей.
Не надо микроскопом колоть орехи - и всё будет в порядке...
вощем, тема превратилась в блог Ператрона...
Она такой и была с самого начала. И блогом research не станет - несмотря на пфосный ник и лихорадочный поиск компромата.
-
может пора и самому освоить гугль уже? :)
Я о том, что Ператрон разжевывает, и каждому в рот вкладывает: - Скушай за маму, скушай за папу...
А если я гугль не освоил, то где же тогда вообще все остальные?
-
Неприглядно и страшно будущее, в котором чарующий звук струны подчинен мёртвому разуму горстки килобайтов, шныряющих внутри черного камешка...
-
Неприглядно и страшно будущее, в котором чарующий звук струны подчинен мёртвому разуму горстки килобайтов, шныряющих внутри черного камешка...
Интересно, а что "шныряет" внутри самой крутой, самой навороченной лампы?
Хоть один человек на этой планете, способен это объяснить?
-
Эх, жалко на этом форуме не работают уведомления. Я бы подписался с удовольствием, чисто с профессиональной точки зрения поулыбаться перед сном. Хотя... Я таких эпопей довольно много видел. Сначала - эйфория - "ааа, щас вообще все что хош сделаю", потом, в связи с тем, что думать надо своими мозгами, а не интернетами с непонятно какими советами, резкое разочарование. Видал сотню тем новичков на своем профессиональном форуме - "Ааа, почему мне не хватает быстродействия" - это например. Есть, конечно, и другая категория - там ради "помигать светодиодом" обязательно линуха накатят и гигагерц захотят.
В общем, AVR - это, конечно, вчерашний день. Ценой в современный ARM (например, Cortex-M3 в инкарнации LPC11xx...13xx...17xx в порядке увеличения матерости) и с несравнимой производительностью.
С другой стороны, из собственной практики на мелком AVR (с минимумом сторонней обвязки) можно сделать:
1. Рукопашный (без специализированного отдельного контроллера) MAC для Ethernet 10Mbit с TCP-стеком, веб-интерфейсом и так далее - http://electronix.ru/forum/index.php?showtopic=44276
2. Захват видеокадра и пакование в JPEG (небыстрое, пару кадров в секунду ЧБ 320*240) - http://electronix.ru/forum/index.php?showtopic=49195
3. В сети есть очень прикольный проект USB Device на контроллере без оного (тоже AVR) (не мое, но очень годное с образовательно-показательной точки зрения).
НО! Если вы посмотрите в код этих проектов, то убедитесь, что внутренности их отнюдь не для начинающих.
Ну и дабы не быть полным флудерастом, упомяну прикольного чувака Chan'а, например, его "Эксперименты с цифровой обработкой сигналов по дешевке" - http://elm-chan.org/works/vp/report.html
В общем, я бы на месте Ператрона во-первых, умерил бы свою эйфорию (пока не обломала реальность), во-вторых - пересмотрел бы платформу.
-
В общем, я бы на месте Ператрона во-первых, умерил бы свою эйфорию (пока не обломала реальность), во-вторых - пересмотрел бы платформу.
Ну, Ператрон конечно, интриган еще тот...
Но, в моем представлении, он абсолютно прав - в качестве обвязки для аналоговых дел эта штука неслабо рулит.
-
Rst7 - ну чиркнул бы язвительной правды, или решил нас сразу завалить проектом а-ля axe fx за 8 баксов? :)
-
Rst7 - ну чиркнул бы язвительной правды
В смысле? Я свое мнение вроде изложил. Добавлю - раз любитель, а не профессионал - бери платформу шире. Правда, в таком случае никогда ничему не научишься (крайний результат - линукс для мигания светодиодиком), но на этом форуме вроде за звук разговаривают, а не за профессиональное владение такими инструментами, как микроконтроллеры.
-
Но, в моем представлении, он абсолютно прав - в качестве обвязки для аналоговых дел эта штука неслабо рулит.
Ну-ну. Бездумно гонять цифровые сигналы (причем быстрые и с хорошими фронтами, на AVR драйверы IO примерно как AC-серия, при 5тивольтовом питании миллиампер 80 в КЗ дают, я имел как-то наглость катать прямо с ножек проца шаговые двигатели от дисководов) рядом со звуком? Ладно бы, это были нормальные печатные платы, с умом разведенные - тогда ладно. Но реалии обычного стартеркита с паутиной проводов на аналоговые части - данунах...
При вменяемом профессиональном подходе - все хорошо. Вот у меня сейчас в работе проект модема специального - на двухсторонней плате размером 100мм на 60мм живет стомегагерцовый ARM в качестве проца (и в качестве DSP он же, ибо модуляция OFDM), Ethernet в качестве одного из интерфейсов, приемный тракт (центральная частота 500 или 1000кГц) с квадратурами и АЦП 24 бита c частотой дискретизации 130кГц, модулятор передатчика, передатчик в том же диапазоне (не очень мощный, три ватта) и плюс импульсный питальник этого дела - изготавливает из бортсети 24 вольта всякие +-5, +3.3, +2.5 вольта для питания как цифровых, так и аналоговых узлов. Так вот, спектр шума АЦП не поднимается выше -145дБ. Но такое в режиме макета недостижимо - будет одна срань и вонь.
-
@ Rst7, я в программировании абсолютный дуб.
Чем эта штука мне и интересна, что я могу простым топтанием по клавишам, получить нужные мне функции.
Речь не идет об обработке звука, речь идет об интеллектуальном управлении процессами.
-
@ Uncle_Cherry
это каша из топора. захотите действительно интеллектуального управления, придется разобраться в деталях, тогда поймете.
-
нету тут про звук, в том-то и дело. стена пафоса, ни о чем.
Остается только ждать от Ператрона реального устройства, чтобы заткнул язык всем обратно в глотку.
@ Uncle_Cherry
это каша из топора. захотите действительно интеллектуального управления, придется разобраться в деталях, тогда поймете.
Maybe... :-?
-
Речь не идет об обработке звука, речь идет об интеллектуальном управлении процессами.
А я о том, что звуковой тракт там рядом. И вся эта цифра в виде макеток будет срать и вонять.
-
Речь не идет об обработке звука, речь идет об интеллектуальном управлении процессами.
А я о том, что звуковой тракт там рядом. И вся эта цифра в виде макеток будет срать и вонять.
Не усложняй. Давай подождем конкретных результатов.
Я, кстати, совсем не против, когда цифра находится рядом с аналогом.
На сегодняшний день самый больной вопрос для меня - как развести две BBD-шки с разными тактовыми частотами (ох уж, эти "окна прозрачности" :o).
-
Но реалии обычного стартеркита с паутиной проводов на аналоговые части - данунах...
Каждому - своё (с)...
Кто то не умеет, кто то умеет.
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fperatron.narod.ru%2Fmuztec%2Fmicamp219m_comp.jpg&hash=56e4f690b029b30a07e7a53beda317552a0d1284)
На этой картинке - микрофонный преамп (на INA2017), который я сделал по первости под свои потребности, но потом толпа потребовала его срочно размножить, из чего и родились остальные преампы от ПЕРАТРОНИКИ.
Требования по качеству - максимальные (то, что способна выдать не самая хилая микросхема специализированного назначения).
Место размещения - внутри компа.
Питание - +12 от компового блока. Требование наличия фантома +48 обусловило применение бортового DC/DC конвертера, от которого заодно берётся симметричное питание для микросхемы преампа.
По картинке видно - расстояние от ДЦ-конвертера до аналоговой части минимальное. Экранировки нет - просто потому, что аналоговая часть схемы оптимизирована по помехоустойчивости (топологией проводников, пространственной ориентацией и адекватной фильтрацией важнейших сигнальных цепей).
Помехи на качество звучания не повлияли - это было досконально проверено в нескольких продвинутых студиях. Собственно, с того момента проверятели и потребовали срочно растиражировать микрофонный преамп, с которыми по тем временам (середина 90-х) был большой напряг в компьютерной звукозаписи.
А уж защититься от одинокой КМОПки - это просто праздник по сравнению с электромагнитной обстановкой внутри древнего писюка. К слову - на фото нутро 386-го, да ещё и в эру, когда понятие "зелёный" в отношении мониторов ещё не существовало и они лучили по жуткому. То есть, по тем временам защитой компьютерной техники от ЭМП просто не заморачивались.
Так, что надо будет - сделаем, как надо. А если у кого не получается - так сам и виноват.
Тема эта - не для новичков создана.
При вменяемом профессиональном подходе - все хорошо.
Вот и замечательно - в теме имеет смысл обсуждать способы достижения цели, а не негативные предписания "не получится".
Но такое в режиме макета недостижимо - будет одна срань и вонь.
Макет макету - рознь. Никто не запрещает использовать на макете адекватные задаче методы защиты от ЭМП.
И строго говоря - я уже два десятка лет не использую шанхай. Пожалуй, прототип упомянутого преампа был последней такой работой:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fperatron.narod.ru%2Fmuztec%2Fmaket_pcb.JPG&hash=7303a6d69a48beef5a6316f52e731812b2d13971)
Но и в нём с помехозащитой тоже всё в порядке.
Но ориентация на проект ардуино в значительной мере обусловлена именно наличием готовых конструктивов - четырёхслойные платы всё-таки в отношении паразитных излучений достаточно неплохи.
А аналоговая часть - во власти экспериментатора и всегда можно достигнуть нужный уровень помехозащиты.
Хотя, конечно, эта тема пока ни в коем случае не для новичков в звуке - тут придётся держать ухо востро.
Но это всё это преодолимо в рабочем порядке.
И подчеркну ещё раз - первым этапом будет применение МК в первую очередь для решения задач управления процессом и придания ему более высокого уровня системной интеллектуальности.
А звуковые примеры по потенциальным возможностям МК в аудио-обработках только подтверждают верность расчётов: у этого япончика не использовано очень много резервов по повышению качества звучания - а нам это не возбраняется.
Причём, он использует младшую линейку - Tiny, которая заведомо уступает старшей Mega по вычислительным ресурсам.
-
А я о том, что звуковой тракт там рядом. И вся эта цифра в виде макеток будет срать и вонять.
В цифровом ревере, которыми занимается д.Вишня, этой цифровой срани поболе будет - просто потому, что цифровая помеха размазана по цифровой рассыпухе, из которой сварганена дискретная линия задержки.
От МК в силу его компактности помех будет много меньше.
И не дядьке Вишне этого бояться - он по этим граблям пляшет не один десяток лет и давно знает, где они лежат.
-
Ну, я бы не сказал, что в задачах управления тинька сильно сливает меге. Просто тиньку >8 ног с АЦП сложно найти.
Умножение и прочие вещи - ерунда, ибо в задачах управления - одноразовые операции, и легко делаются подпрограммами. К тому же, с делением нормальным везде беда.
"как развести две BBD-шки с разными тактовыми частотами" чиркните в личку, попробую объяснить, посоветовать и дать кирпич программы от которого Вам скорей всего никуда не деться на любом МК.
Если коротко, то 2 ББДшки даже на тиньке - легко, до 500кГц. Впопрос в требуемой "плавности перестройки".
-
Rst7 +1 в том смысле что "каждому овощу свой фрукт", то есть нужно выбирать проц под конкретную задачу.
Мелкие AVRы выигрывают у ARMов в простейших зачачах типа сервиса из за своей компактности (малоногости).
Ардуино возможно хорошо для тех, кто впервые сталкивается с этой темой, чтобы переломить комплекс "я никогда не смогу в этом разобраться".
Хотя в любом случае нужно начинать с чтения даташита.
А после того как помигал светодиодом (кстати его можно использовать для оценки эффективности куска программы, включая на входе в процедуру и выключая на выходе, и осциллом посмотреть, а сколько же времени это займет в реале, особенно если это результат компилятора а не ассемблера), переходить к вдумчивому изучению предмета и решению какой процессор выбрать для конкретной задачи.
А piggy-back модуль, состоящий только из проца и FTDI, для кончательной конструкции это нонсенс.
Если не охота связываться с смд, можно взять ту же 8-ю мегу в дипе и прилепить на макетку для экспериментов.
-
не знаю, после сайтов "myrobot.ru" и прочих AVR учебных курсов, говорить, что в этом не разобраться, должно быть стыдно. Это снова менталитет играет в жилах.
Вот майкрочип пик - как сугроб на бошку, типа все всё знают, инфы мало и без учебных курсов, или курса МК в ВУЗе непросто трепыхаться. Но, немного упертости и они поддаются.
-
Ардуино возможно хорошо для тех, кто впервые сталкивается с этой темой, чтобы переломить комплекс "я никогда не смогу в этом разобраться".
Именно это обстоятельство для тусовки, состоящей из хороших схемотехников, не нюхавших никогда контроллеров, является решающим - на данном этапе конкретные технические параметры не являются хоть сколько-нибудь значащими, а главным является наличие готового железа + огромный парк примеров + развитой тутор.
Где, чего и сколько не хватает - неофиты прекрасно поймут по ходу решения своих персональных задач. И переход на любой другой вариант будет намного более простым и безболезненным по сравнению с моментом потери компьютерной невинности (в части понимания архитектуры МК и языка управления ими).
Хотя в любом случае нужно начинать с чтения даташита.
В ардуино-тусовке уже сложилось вполне устойчивая методика обучения. Единствено - на русскоязычной площадке (arduino.ru) информация намного скудней чем в родной arduino.cc. Но начальный старт есть и в русском домене.
Потому для старта достаточно зайти на ардуино.ру и почитать вводные директивы. Плюс рекомендации в этом обсуждении - но не типа "всё ерунда - надо брать что-то гораздее", а именно чёткие советы по ускоренному прохождению первых шагов.
И двигаться толпой тут гораздо выгодней, чем в одиночку!
А piggy-back модуль, состоящий только из проца и FTDI, для кончательной конструкции это нонсенс.
Напротив!
Это не ублюдок а именно, что оптимизированное ядро для решения наиболее широкого круга задач - нано в этом смысле идеален.
Во первых - это законченный модуль минимальных размеров, работоспособный как в автономе, так и в составе любого приборного комплекта. Размером он с широкий ДИП - и нет никаких проблем с его размещением в стандартной кроватке. Потому можно делать сразу несколько устройств разного назначения - и обходиться единственным гаджетом, вставляя его туда, где сейчас конкретно работаешь.
Это очень существено снижает стартовые расходы, да и вообще расходы на НИОКР.
С точки зрения функционала - ничего не урезано. Есть SPI, и потому можно программировать стандартным образом, забыв, что это ардуино. Гаджет будет себя вести, как совершенно обычный МК - Mega328, без каких либо ограничений.
Вместе с тем, избыточность нано мизерна - потому можно даже пойти на то, что б и в серийный продукт ставить нано. Всё равно нужно иметь интерфейс с компом - для того, что б юзер управлял гаджетом, если ты снабдишь его драйвером для руления функциями прибамбаса, а так же, для обновления фирмвары (которая наверняка потребуется в полном жизненном цикле устройства, эксплуатируемого конечным потребителем). Так, что ты просто дашь юзеру указание соединить с компом через усб и запустить тот файлик, который ты ему пришлёшь.
Если не охота связываться с смд, можно взять ту же 8-ю мегу в дипе и прилепить на макетку для экспериментов.
Вот это как раз полное варварство - героическое "создадим себе трудности сами, что б потом их успешно преодолевать".
Ну, подумай сам - тебе для экспериментов потребуется вся обвязка: кварц, как минимум SPI, последовательный порт на компе. А если нет сом-порта?! И даже если у тебя есть сом-порт - тебе всё равно придётся паять свой кабель для подключения программатора. А тут - без дураков воткнул усб, поставил драйвера виртуального ком-порта - и работаешь без геморроя.
Нано имеет кнопку ресета и четыре светодиода, через которые контролируется его жизнь (например, активность сериального порта)
Для того, что б соорудить МИДИ - тебе нужно только стандартную оптронную обвязку добавить.
В общем, пытаясь своими силами на макетке собрать минимальную конфигурацию, ты как раз нано и соберёшь. Только всё это будет более громоздкое - поскольку ты вынужденно используешь дип-версии. И сопливо это будет - там отвалилось, здесь замкнуло...
НУЕГОНАФИГ!!!
А главное - ты по цене нифига не выиграешь, если затриваться будешь рассыпухой через ближайший радиорынок.
Китайцы тебе в дом принесут готовую вещь практически за те же деньги, которые ты потратишь на сборку.
Правда, есть один забавный вариант:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fekits.ru%2Fpublished%2Fpublicdata%2FSHOPEKITEKITS%2Fattachments%2FSC%2Fproducts_pictures%2FSEM0010M-8A.jpg&hash=4dffbb021d57711890d912d6d6605d16cac01d9a)
http://ekits.ru/index.php?productID=2376&product_slug=sem0010m-8a
Цена 200 руб - за слепыш с микроконтроллером и обвязкой, это подарок.
Но это по сути одноразовая вещь - потому его следует использовать для опытных образцов по устоявшейся схеме. А для экспериментов нано вне конкуренции.
Предложение "взять чип и с ним экспериментировать" полностью эквивалентно предложению взять материнку и учиться работать с писюком на ней. :o
-
При дешевизне и мощи современных лэптопов лепить самодельные контроллеры следует только в условиях крупносерийного производства: вопрос касается отношения цены овчинки/выделки (стоимость устройства/разработки).
Плюс к тому - универсальность лэптопа, возможность получения в сто раз более широкой функциональности и несравненно более удобный дисплей.
-
Вот это как раз полное варварство - героическое "создадим себе трудности сами, что б потом их успешно преодолевать".
Ну, подумай сам - тебе для экспериментов потребуется вся обвязка: кварц, как минимум SPI, последовательный порт на компе. А если нет сом-порта?! И даже если у тебя есть сом-порт - тебе всё равно придётся паять свой кабель для подключения программатора. А тут - без дураков воткнул усб, поставил драйвера виртуального ком-порта - и работаешь без геморроя.
Нано имеет кнопку ресета и четыре светодиода, через которые контролируется его жизнь (например, активность сериального порта)
Кстати, для станка для экспериментов лучше тогда брать макимальный чип. Тогда на нем можно будет откатать и задачи под тиньку и под максимальный вариант, так как ядро одно и тоже и большинство периферии совпадает.
Просто при разрабртке под меньший чип использовать ту периферию и те объемы памяти что есть в маленьком чипе.
Для того, что б соорудить МИДИ - тебе нужно только стандартную оптронную обвязку добавить.
А вот это как раз уже не выйдет так как к порту микроконтроллера уже подключен FTDI чип и порт используется для загрузки программ. Именно этим мне не нравится ардуино.
-
Мелкие AVRы выигрывают у ARMов в простейших зачачах типа сервиса из за своей компактности (малоногости).
Это давно не соответствует действительности. Разве что только крайний 8миногий случай, но он очень крайний. И тут нефиг макетировать, надо сразу делать готовое изделие. Все остальные вопросы с куда большей эффективностью закрываются, например LPC11xx взамен ATMega48-88-168-328 - цена ниже(!!!) и производительность выше по всем параметрам - и разрядность выше, и мегагерц больше, и жрет меньше при той же производительности. Размер по плате - тот же.
-
А уж защититься от одинокой КМОПки - это просто праздник
Это не просто КМОПка аля 561я серия. Это как 74AC - токи дикие, изучите нагрузочные характеристики портов ввода-вывода в даташите, там CD4xxx (561) не угадывается вообще, нет даже таких крепких TTL-серий.
-
Если не охота связываться с смд, можно взять ту же 8-ю мегу в дипе и прилепить на макетку для экспериментов.
Я часто поступал так - припаивал прямо на ножки дипа кварц, кусочек PLS-линейки на выводы SPI для программирования, дальше на макетке это дело использовал. Давно забил на это и забыл как страшный сон, проще разводить макетные платы и заказывать их, благо под рукой есть производство с ценой макетного качества (две стороны, металлизация) 100 гривен ($12) за лист А4 :)
-
Это давно не соответствует действительности. Разве что только крайний 8миногий случай, но он очень крайний.
Я имел ввиду именно сегмент 8-20 ног.
32 ног и больше конечно выгоднее использовать ARMы.
Я часто поступал так - припаивал прямо на ножки дипа кварц, кусочек PLS-линейки на выводы SPI для программирования, дальше на макетке это дело использовал. Давно забил на это и забыл как страшный сон, проще разводить макетные платы и заказывать их, благо под рукой есть производство с ценой макетного качества (две стороны, металлизация) 100 гривен ($12) за лист А4
95% форумчан используют лут и платы заказывают только когда выходят хотя бы на мелкую серийку, это то же нужно учитывать.
-
Я имел ввиду именно сегмент 8-20 ног.
8 ног - это крайний и единственный случай. 20 - уже ARM. Хотя бы просто потому, что ATTiny2313 (20 ног) стоит аналогично ATMega48 (32 ноги) и аналогично LPC11xx (32 или 48), занимает места тинька на плате больше чем другие, а ресурсов - меньше всех. Так что вывод однозначен.
Ну а бояться QPF-корпусов - так это по нынешним временам просто стыдоба.
95% форумчан используют лут и платы заказывают только когда выходят хотя бы на мелкую серийку, это то же нужно учитывать.
Лут вполне обеспечивает технологию 0.25/0.25, что закрывает все вопросы с корпусами TQFP-32 (маленькие меги), LQFP и QNF (LPC11xx-13xx-17xx).
И вообще, учитесь у китайцев. Пятипортовый свич на односторонке:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg830.imageshack.us%2Fimg830%2F5125%2Fsw3r.jpg&hash=a0e24ad43302c59f312c380fb043fcb669b679e6) (http://imageshack.us/photo/my-images/830/sw3r.jpg/)
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg801.imageshack.us%2Fimg801%2F3016%2Fsw4a.jpg&hash=19a108d200208eab640434e0d565314bfd774ff0) (http://imageshack.us/photo/my-images/801/sw4a.jpg/)
Между прочим, с точки зрения профессионала вопросов к плате нет.
-
При дешевизне и мощи современных лэптопов лепить самодельные контроллеры следует только в условиях крупносерийного производства: вопрос касается отношения цены овчинки/выделки (стоимость устройства/разработки).
Плюс к тому - универсальность лэптопа, возможность получения в сто раз более широкой функциональности и несравненно более удобный дисплей.
При дешевизне и мощи современных гитарных процев лепить самодельные гитарные примочки следует только в условиях крупносерийного производства: вопрос касается отношения цены овчинки/выделки (стоимость устройства/разработки).
Плюс к тому - универсальность гитарного проца, возможность получения в сто раз более широкой функциональности и несравненно более удобный дисплей.
:o :o :o
Ну, и так далее...
::)
-
Кстати, для станка для экспериментов лучше тогда брать макимальный чип
В нано - максимальный чип. А именно - мега 328. то есть. старший в этой линейке (с наибольшим объёмом памяти).
Отличия между версиями дуины - исключительно в наличии/отсутствии третьестепенных прибамбасов типа гнезда питания 2.1 мм и прочих маловажных.
Нано имеет встроенный стабилизатор с возможностью его отключения - рабочий диапазон напряжений от 3.3 до 20 В.
Подчеркну ещё раз - нано с точки зрения функционала ни в чём не ущербен и имеет значительно уменьшенные габариты за счёт применения смд-компонентов вместо дипов. Ну, и гнездо усб взято мини, а не стандартное.
огда на нем можно будет откатать и задачи под тиньку и под максимальный вариант, так как ядро одно и тоже и большинство периферии совпадает.
Ардуино в целом и соответствует этому критерию - изначально оно было собрано на меге 8, а в последующих версиях проц заменяется более современными клонами именно восьмерки: мега168/мега 328.
То есть, за основу взят проц из старшей атмеловской линейки, обладающий хорошим запасом по функционалу.
Потому отрабатывать на дуине софт для тиньки - это совершенно без проблем.
А вот это как раз уже не выйдет так как к порту микроконтроллера уже подключен FTDI чип и порт используется для загрузки программ. Именно этим мне не нравится ардуино.
А как это помешает использованию в автономе?!
Залил программу - причём, без разницы, через усб, сериал или через SPI. После чего без проблем пользуешь миди.
Нет проблем соорудить миди и на других выводах - но только придётся озаботиться написанием своего собственного софта.
Зато дырок хватит на десяток миди-портов...
Между прочим, стандартный выводы программирования SPI точно так же являются мультифункциональными и вне фазы программирования используются для общих целей.
Это на всех атмелах так - и никто не парится...
-
Кстати, о макетках с матерыми корпусами. Совсем забыл про угарнейшую фотку
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fizhevsk.ru%2Fforums%2Ficons%2Fforum_pictures%2F001317%2Fthm%2F1317558.jpg&hash=d48caf58d762e5893e978bdbc591e98898009a7d) (http://izhevsk.ru/forums/icons/forum_pictures/001317/1317558.jpg)
Внезапно ARM9 в инкарнации AT91RM9200 (корпус для начинающих - PQFP208), SDRAM (100МГц, кстати, не балуйся), линуха, в общем, все дела. Работает у автора вполне без нареканий.
А вы говорите - ой-ой-ой, без DIP'а никак не можем ;D
-
Основополагающий ресурс для изучения AVR начинающими - разжёвано всё, и до безобразия.
Настоятельно рекомендую!
[size=14]
http://proavr.narod.ru/[/size]
-
у di:halt поинтереснее расписано все. у Николаева - тоже недурно.
Специально для Черешни :) http://forum.gtlab.net/cgi-bin/yabb2/YaBB.pl?num=1261262645/0
-
Мужики, это не из той ли примерно оперы, что вы тут обсуждаете?
http://www.oct-distribution.com/datasheets/SKRM-C8-G01.pdf
http://www.oct-distribution.com/datasheets/SKRM-C8-XXX.pdf
http://www.oct-distribution.com/
-
Нет, это модули на основе специализированного DSP Spin Semiconductor FV-1.
http://www.spinsemi.com/products.html
Функционально где то близкого к комплекту AL3201.
http://www.yerasov.ru/shop/product_info.php?cPath=27&products_id=201
В этой теме идет разговор о микроконтроллерах общего применения.
-
Мужики, это не из той ли примерно оперы, что вы тут обсуждаете?
http://www.oct-distribution.com/datasheets/SKRM-C8-G01.pdf
http://www.oct-distribution.com/datasheets/SKRM-C8-XXX.pdf
http://www.oct-distribution.com/
Эта тема заряжена для обсуждений применения микроконтроллеров (в первую очередь Ардуино) для управления аналоговыми приборами.
Потому это тут не в теме - если речь не о продвинутом устройстве управления режимами ДСП при помощи отдельного микроконтроллера, конечно...
-
Потому это тут не в теме - если речь не о продвинутом устройстве управления режимами ДСП при помощи отдельного микроконтроллера, конечно...
По теме управления ДСП.
Загрузчик пользовательской программы в AL3201 (вместо прошитых эффектов) совместим c "Wavefront DRE Development System".
Причем загружать можно "на лету" (без пересброса дсп) хоть одну команду дсп хоть всю программу.
Может кому в копилку пригодится.
http://milas.spb.ru/~kmg/files/projects/dre/avr/Dre.c
-
@ KMG
Давай под ДСП выделим другую тему - я понимаю, что на данном этапе тема скучна тем, кто уже владеет МК. Но не нужно её зашумливать - тема начального уровня нужна для тех, кто только присматривается к МК и пытается понять, насколько это доступно и с какой начальной точки следует во всё это погружаться.
Ы?
-
Тогда полезная книжка в оригинале и переводе.
http://milas.spb.ru/~kmg/files/literature/Kernighan_Ritchie_Language_C.pdf
http://milas.spb.ru/~kmg/files/literature/Kernighan_Ritchie_Language_C_ru.pdf
PS Женя, исходник привел как пример управляющей программы на AVRе.
С одной стороны последовательный протокол к РС (DRE Development System), с другой протокол загрузки в ДСП.
И ни слова о программировании для ДСП ;)
-
Но не нужно её зашумливать - тема начального уровня нужна для тех, кто только присматривается к МК и пытается понять, насколько это доступно и с какой начальной точки следует во всё это погружаться.
После появления ссылки на ресурсы аля-123 тему Вы свою сами зашумели по самое не могу, господин Peratron.
Может кому в копилку пригодится.
http://milas.spb.ru/~kmg/files/projects/dre/avr/Dre.c
Ну вот и наглядный пример заботливо разложенных граблей. Code Vision - это не компилятор, а УГ. При попытке собрать этот код вменяемым компилятором будет жопа. Код будет неработоспособным.
Одни из граблей кроются вот тут:
unsigned char DelayCnt;
...
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
..
if (DelayCnt != 0)
DelayCnt--;
...
}
...
Delay(int ValmS)
{
DelayCnt = ValmS;
while (DelayCnt != 0)
{
Wdog();
}
}
Ну и общий стиль программирования удручает, конечно. Вместо вменяемых размеров (uint_fast8_t) регистровых переменных везде всякие
void
WriteArea(unsigned long* Src, unsigned char Addr, unsigned char Len)
{
unsigned char BitCnt;
unsigned char WordCnt;
Первая же процедура обработки прерывания написана совершенно без оглядки на архитектуру ядра. Внезапно RISC-ядра - они все load-store архитектуры, посему технически грамотно писать код так
uint8_t RxByteCnt;
// USART1 Receiver interrupt service routine
void usart1_rx_isr(void)
{
uint_fast8_t rxc=RxByteCnt;
...
if (rxc<8)
{
...
rxc++;
}
if (rxc==10)
{
....
rxc=11;
}
....
RxByteCnt=rxc;
}
Понятное дело, это пример с одной переменной. А их там есть.
Настоятельно рекомендую разобраться в приведенных выше примерах граблей и неоптимальностей.
-
Ваааа!... Ничего не понятно... Но красиво! :o
Надеюсь и я когда-нибудь смогу разобраться в этих тонкостях ::)
ЗЫ а по поводу неоптимальности и без оглядки на структуру... Не читал ещё холиваров по этому поводу, но предполагаю что они есть. Оптимизировать можно многое, только если хватает ресурсов и работает надежно и дубово - то почему бы и не оставить? Несколько циклов в цикле, например, чем связываться с капризной рекурсией, которая может заглючить в любой момент (опять же, из-за недостаточной аккуратности написания)? А про ядро - может этот код будет таскаться по разным ядрам - зачем оптимизировать под одно? Или это стандарт?
ЗЫ хотя я сам уже лет 15 как зарабатываю на жизнь программированием в 1С (только не надо чванливо плеваться), и понимаю, как порой хочется оптимизировать чужой код, даже официальных разработчиков ::)
ЗЗЫ хотя вот это уже на глаза попадалось ::)
QUOTE (scifi @ Jul 27 2011, 16:01) *
Эх, причесать бы код и абстрагировать от железа - получился бы полезный для многих проект.
Я пока исходники вообще не смотрел, но к "оторвать от железа" сразу отношусь плохо - этих оторванных от железа, использующих от возможностей железа 0 целых хрен десятых уже понаписано немеряно. На данный момент максимальную ценность представляют решения которые наконец-то показывают, как максимально эффективно работать с конкретным железом и какой эффект от этого получается.
-
а по поводу неоптимальности и без оглядки на структуру... Не читал ещё холиваров по этому поводу, но предполагаю что они есть.
Среди профессионалов холиваров на эту тему нет.
чем связываться с капризной рекурсией,
Рекурсию вообще не следует использовать. Ибо это грабли еще те, причем, очень неэкономные по стеку.
А про ядро - может этот код будет таскаться по разным ядрам - зачем оптимизировать под одно? Или это стандарт?
Все современные (вменяемые) процессоры устроенны в принципе одинаково. И стиль оптимизации тоже одинаков. Тот пример оптимизации с регистрами, что я привел - он достаточно всеобъемлющий.
-
ЗЗЫ хотя вот это уже на глаза попадалось
О да, там срачик таки случился, но больше по архитектурным вопросам. Но, повторюсь, в том проекте порт стека с AVR на ARM занял два дня.
-
Рекурсию вообще не следует использовать. Ибо это грабли еще те, причем, очень неэкономные по стеку.
Ну вот и я к тому же :) Зато как оптимально может выглядеть код! Правда мне при этом всегда страшно - этот кусок производит впечатление кого-то очень умного но ненадежного :) Потихоньку собираю стереотипы и традиции, что народ предпочитает...
ЗЫ Про первые грабли надумал только, что не всякий интеджер влезет в ансигнед чар... Или ждем ответа KMG и держим общественность в напряжении? ;)
ЗЗЫ ну и совсем слова идиота - насколько верна догадка, что локальные переменные компилятором стараются быть засунуты в РОН а глобальные в ОЗУ? Тогда для изменения глобальной переменной лучше в функции присвоить её значение локальной регистровой, сравнивать раз 200 без операций выгрузки-загрузки в ОЗУ и только потом записать в глобальную - в ОЗУ? ::) Да и слова "uint_fast8_t" наводят на мысль что это указание компилятору использовать для данных переменных "быстрые" 8-битные РОН....
ЗЗЫ вы уж меня простите, мне просто надоело умничать на порно-форуме, теперь пытаюсь влезть в эту предметную область ::)
-
Или ждем ответа KMG и держим общественность в напряжении?
Господин KMG не возжелал публично проводить работу над ошибками прямо в этой теме, постучал в асю, я ему там все разъяснил, он по свободной минутке обещал тут на основе этих разборов полетов сделать небольшую памятку для начинающих, ибо вопросы как раз классических граблей, через которые все проходят.
Ну а пока он соберется, еще есть возможность поразмышлять и понасиловать гугль самостоятельно, ибо
Про первые грабли надумал только, что не всякий интеджер влезет в ансигнед чар...
конечно да, но это такой, мелкий огрех, есть куда более злой, приводящий к полной неработоспособности кода.
-
Интерееееесная штуковина... :) Хотел найти в гугле что значит "uint_fast8_t" - наткнулся вот на что :) (И везде эта аббревиатура Rst7 почему-то появляется! ;D)
KRS
Feb 21 2008, 13:19
Цитата(Rst7 @ Feb 21 2008, 13:01) *
А если еще и signed char, то вообще мраки начинаются...
Да тоже самое что и unsigned char, просто сдвиг другой для unsigned используется пара LSL/LSR а для signed LSL/ASR.
Вообще что бы код хорошо работал и на ARM и на AVR, я все локальные переменные объявляю uint_fast8_t, и все операции с переменными которые в памяти делаю через временные локальные объявленные как uint_fast8_t. Тогда все нормально загрузка идет через LDRB, а промежуточные операции все 32 битные (на ARM)
Тут главное помнить что uint_fast8_t может быть больше 8 бит....
примерно так
Код
uint8_t var;
void f(uint_fast8_t arg)
{
uint_fast8_t tmp;
tmp = var;
if ( tmp > arg) tmp = arg+5;
else tmp*=2;
var = tmp;
}
Половину не понял, но мне кажется, что общая мысль прослеживается :)
ЗЗЫ вернется Ператрон, "а голова в тумбочке"... ::)
-
Не, ну понятно желание господина KMG сэкономить время и пожалеть топик Ператрона, но а остальным страждущим и жаждущим познаний тоже хочется! ::) Я тут растекаюсь мыслями по древу, например ;D
ЗЫ а и ладно - тогда пока не подсказывайте и не разжевывайте - будем насиловать гугль и остатки собственных мозгов самостоятельно! ;D Но потом обязательно надо сверить полученные заблуждения! ::)
-
ЗЗЫ ну и совсем слова идиота - насколько верна догадка, что локальные переменные компилятором стараются быть засунуты в РОН а глобальные в ОЗУ?
Именно так. Только глобальные - они всегда в ОЗУ, а локальные - по возможности в РОН, а если не лезет, то в ОЗУ.
Тогда для изменения глобальной переменной лучше в функции присвоить её значение локальной регистровой, сравнивать раз 200 без операций выгрузки-загрузки в ОЗУ и только потом записать в глобальную - в ОЗУ?
Безусловно. Конечно, современные компиляторы стараются избавляться от лишних обращений к памяти, но все равно, человек это лучше - ему виднее в комплексе. Правда, попытки такой оптимизации именно компиляторами ведут к первым граблям. Это типа подсказка ;)
Да и слова "uint_fast8_t" наводят на мысль что это указание компилятору использовать для данных переменных "быстрые" 8-битные РОН....
Ну для конкретной платформы можно написать и unsigned char, как собственно и сделано. А вот для портабельности кода без потери производительности для регистровых переменных следует указывать именно типы uint_fastX_t. Приведу развернутое объяснение этого, которое я написал для господина KMG в асе
Смысл в том, что процессоры с разрядностью больше m>n обычно неэффективно в регистрах выполняют операции разрядностью n. Требуется лишний код на приведение типов. Посему правильно иметь регистровые переменные той же разрядности, как и регистры. Например, для ARM'ов:
uint8 - 8 бит
uint_fast8 - 32 бита
uint16 - 16 бит
uint_fast16 - 32 бита
uint32 - 32 бита
uint_fast32 - 32 бита
uint64 - 64 бит
uint_fast64 - 64 бита
Понятное дело, что для размещения переменных в памяти оптимально использовать размер не больше нужного, т.е. uint8/uint16 и т.д. А вот в регистрах - uint_fastX.
Потом очень мрачно смотреть на код, писанный в стиле для 8мибитника со сплошными char в коде при компиляции его на, скажем, ARM-архитектуру.
Так что к месту использование таких типов улучшает портабельность исходников на другие архитектуры.
По нынешним временам это актуально даже для большого брата, ибо int в архитектуре x64 остался 32хбитным, а регистры - 64хбитные. Со всеми вытекающими. Так что на большом брате надо тоже использовать uintX_fast_t.
Аналогичный вопрос может возникать при переносе, скажем, с архитектуры MSP (16 бит) как на AVR (8 бит), так и на ARM (32). Обычное бездумное использование int везде где можно на 16тибитных архитектурах при переносе на AVR приведет к перерасходу регистров, а на ARM - может повлечь за собой нежелательные эффекты за счет того, что int там не 16, а 32 разряда.
Не, ну понятно желание господина KMG сэкономить время и пожалеть топик Ператрона, но а остальным страждущим и жаждущим познаний тоже хочется!
Вот и я ему то же предлагал. А этот топик жалеть не надо после ссылок на говносайты. Пусть тут будет "школа молодого бойца" вменяемая.
-
Ай, спасибо,
айболит Rst7! Вынес 2 момента
1) я ещё не полный идиот :)
2) "не мешайте лыжам ехать" (С одного лыжника) не усложняйте жизнь компилятору собственной ленью и неинформированностью :)
ЗЫ а интересно тут стало ::) Даже интереснее, чем на порнофоруме! ;D
ЗЗЫ ещё некоторое время не подсказывайте по первому багу с Дилей_Каунт... Хочется донасиловать мозг ;D
-
Конечно, современные компиляторы стараются избавляться от лишних обращений к памяти, но все равно, человек это лучше - ему виднее в комплексе. Правда, попытки такой оптимизации именно компиляторами ведут к первым граблям. Это типа подсказка
У нас там одна единственная переменная, объявленная как глобальная - значит в ОЗУ. В функции Дилей камень не спит (как опять бы сделал я, простите за наглость :)), а мучает эту переменную сравнениями множество раз... Мне не хочется ожидать такой подставы от компилятора, что он для облегчения себе жизни просто перепишет её в свободный регистр и начнет сравнивать играючи без обращения к ОЗУ, где она декрементируется по прерыванию честно... :-?
-
Мне не хочется ожидать такой подставы от компилятора, что он для облегчения себе жизни просто перепишет её в свободный регистр и начнет сравнивать играючи без обращения к ОЗУ, где она декрементируется по прерыванию честно...
Это не подстава. Это - нормальный результат нормальной оптимизации. В Си есть средство для указания компилятору, что какая-то переменная может измениться поперек всего и он об этом может не знать. Это модификатор volatile.
Т.е. правильно было написать
volatile unsigned char DelayCnt;
(ну а на самом деле еще и volatile uint8_t DelayCnt)
И все, теперь компилятор в курсе дела, что переменная может модифицироваться без его ведома. И он будет ее действительно считывать из ОЗУ и проверять на каждой итерации цикла. Без этого модификатора действительно будет жопа - вечный цикл. Более того, даже проверки регистров не будет, только на 0 в самом начале функции, если 0 - выход, а если не 0 - то вечный цикл с вызовом функции Wdog.
Вот, собственно, и все вопросы и ответы на них. Стандартные грабли начинающих - о них забывать нельзя.
-
Лалала!... Нет слов - одни эмоции! :) Когда писал на ассемблере, я был единственным творцом логики и ответственным за свои же ошибки. Выделял регистры САМ и знал что в каком лежит И КАКИЕ МОЖНО КОРЕЖИТЬ А КАКИЕ НЕЛЬЗЯ! А на Си получается творим Хекс на пару - в соавторстве с компилятором, да ещё с его разными опциями, а отвечаю за общие ошибки я один! ;D И чтобы не было подстав от коллеги, придется изучать его характер :)
ЗЫ спасибо за очевидные для тех кто в теме и такие интересные моменты для меня! 8-)
ЗЗЫ надеюсь, не последний раз ::)
-
Когда писал на ассемблере, я был единственным творцом логики и ответственным за свои же ошибки.
Вообще-то тут зарыта глубокая философия. Си - язык довольно низкоуровневый, и код, генерируемый современными компиляторами практически невозможно сделать оптимальнее в рукопашную. А сам по себе Си позволяет программисту думать более абстрактно и избавляет от дурной работы в рукопашную на ассемблере. В остальном - разницы нет, по большому счету (при, конечно, понимании происходящего - части этого понимания мы тут посвятили несколько постов выше).
С другой стороны, современная парадигма компиляторостроения говорит, что "надо оптимизировать". Пусть у нас будет такой себе середячок-программист, но в среднем код будет терпимый - компилятор берет на себя работу по оптимизации. Зато за цену одного профессионала-ассемблерщика можно купить десяток педалистов на Сях средней руки. Пусть они сделают такое себе говнецо, но они сделают его быстрее - а значит, быстрее пойдут продажи готового продукта. Ну вот собственно говоря и философия компиляторостроения пришла к менеджерским терминам. Time to market, все дела.
Одно радует - в этом мире есть место профессионалам, отнюдь не всегда сто обезьян-студиозусов, вооруженных да пусть самым-разсамым компилятором, переплюнут мастера :)
-
Хорошее видение ситуации с высоты имеющейся информации :)
Ну. раз пошла такая пьянка - то ещё момент - в моей единственной ::) (не считая моргания светодиодами) написанной задаче на ассемблере, мне требовалось проводить измерения малых времен, при данной частоте камня надо было, чтобы цикл вне зависимости от того, по какой ветке пойдет внутри выполнение кода всегда выполнялся определенное количество тактов, которые я считал по каждой команде ассемблера с точностью до одного (потому что их было мало на цикл и нужна была такая точность). В Си есть такой момент, или это уже за гранью его возможностей и придется делать ассемблерные вставки? ;)
-
В Си есть такой момент, или это уже за гранью его возможностей и придется делать ассемблерные вставки?
Лучше делать асм-вставки. Дело в том, что подглядывая в листинг, можно, понятное дело, добиться того-же, чего и в рукопашную на ассемблере, но кто даст гарантию, что ничего не сломается при смене компилятора? Не с платформы на платформу, а с версии на версию, я имею в виду.
И вообще, не надо бояться асм-вставок/модулей, но наличие такого рукопашного кода надо минимизировать.
Для упрощения задачи я часто делаю так - пишу заготовку на Си, компилятором генерирую asm-файл этого модуля, а затем уже правлю руками полученный модуль до нужного состояния. Естественно, в проект подключается уже правленый модуль на ассемблере. Это пожалуй самый оптимальный метод борьбы.
-
Да, надо было в аську уходить.... Но для этого её надо скачать ещё и поставить, зарегиться... ;D
Метод "сначала топором а потом доработать напильником" имхо тоже лежит на поверхности и просится в жизнь... И вставки - я укажу номер регистра напрямую, а значит надо знать какой РОН компилятор для чего заюзал? А если он решит передумать после незначительной смены кода? Сорри за тупые вопросы - просто никак "не сходится" у меня структура МК и буквы на Си! :-[
Просто никак не могу примириться и довериться компилятору - в плане того, как он будет делать асм и самое прикольное - какие регистры для чего и как использовать... Просто нет опыта "езды на лошади" со своим характером, только пешком сам походил :)
ЗЫ Rst7, я тебе наверное уже денег должен :) Просто с одной стороны мне классно, что получаю важную информацию, а с другой неудобно немного отнимать твое ваше время...
-
И вставки - я укажу номер регистра напрямую, а значит надо знать какой РОН компилятор для чего заюзал? А если он решит передумать после незначительной смены кода? Сорри за тупые вопросы - просто никак "не сходится" у меня структура МК и буквы на Си!
Ну некоторые компиляторы позволяют это решить. В частности, в gcc очень развита инфраструктура ассемблеровских вставок в код на Си - там это можно указать, что используемый во вставке регистр соответствует некой локально переменной. Но я бы не советовал этим злоупотреблять - сам по себе инструмент этот прикручен криворукими писаками, которые не способны на изготовление нормального кода. Проще же потом с портабельностью, если ассемблеровский модуль отдельно, а не вкручен поперек сишного кода.
ЗЫ Rst7, я тебе наверное уже денег должен Просто с одной стороны мне классно, что получаю важную информацию, а с другой неудобно немного отнимать твое ваше время...
Да ну, мне не жалко. "Спрашивайте - отвечаем" (ЦЭ) Просто неохота, чтобы тут говном всяким вроде бы и годную по идее тему заваливали.
-
Грабли вылезут в компиляторе с высокой степенью оптимизации кода
Без объявления DelayCnt volatile
unsigned char DelayCnt;
...
// 114 Delay(int ValmS)
Delay:
// 115 {
// 116 DelayCnt = ValmS;
STS DelayCnt, R16
// 117 while (DelayCnt != 0)
TST R16
BREQ ??Delay_0
// 118 {
// 119 Wdog();
??Delay_1:
RCALL Wdog
RJMP ??Delay_1
// 120 }
// 121 }
??Delay_0:
RET
В заоптимизированном коде видно что попадаем в цикл из которого нет выхода
После исправления
volatile unsigned char DelayCnt;
...
// 114 Delay(int ValmS)
Delay:
// 115 {
// 116 DelayCnt = ValmS;
STS DelayCnt, R16
RJMP ??Delay_0
// 117 while (DelayCnt != 0)
// 118 {
// 119 Wdog();
??Delay_1:
RCALL Wdog
// 120 }
??Delay_0:
LDS R16, DelayCnt
TST R16
BRNE ??Delay_1
// 121 }
RET
Зато и в прерываниях он во всех обращениях к переменной будет работать через память, но
этого можно избежать используя временную регистровую переменную.
-
Зато и в прерываниях он во всех обращениях к переменной будет работать через память
Каша пока у меня в голове... Нет, все вышенаписанное даже понятно, дело не в том... Когда мы уходим от ассемблера к Си, то поднимаемся на следующий уровень абстракции - от РОН и ОЗУ до переменных: локальных и глобальных. А тут компилятор сам царит (если не указать ему напрямую). Писал бы на ассемблере - выделил бы под счетчик тайминга отдельный РОН - безо всяких глобальных переменных и чтения-записей ОЗУ, его бы и прерывание изменяло и процедура проверяла... Собственно, так я и делал. А дальше, после того как процедура "Подождать" выполнилась - можно использовать этот РОН по другому назначению. Вот и думаю, как уложить это с тем, что код, генерируемый современными компиляторами практически невозможно сделать оптимальнее в рукопашную
- даже на таком банальном примере... А Функция "Обождать Х ms" имхо используется чаще, чем какая-либо другая! По моему, её давно пора бы в стандартные Сишиные библиотеки для любого камня вынести - если она ещё не вынесена. А если вынесена - то почему KMG пишет её сам? ;)
-
Вот и думаю, как уложить это с тем, что Цитата:
код, генерируемый современными компиляторами практически невозможно сделать оптимальнее в рукопашную
- даже на таком банальном примере...
Никаких расхождений теории и практики. Проблема немного более тонка. Это в рассматриваемом примере регистров валом. А обычно они все заняты - кодом, который выполняется. Чем интенсивнее код использует регистры - тем он оптимальнее, и по быстродействию, и по размеру.
Кроме того, в принципе, для AVR есть возможность указать компилятору оторвать несколько регистров для рукопашного использования. Иногда, в крайних случаях, этим можно пользоваться - например, для оптимизации процедур прерывания, когда каждый такт на счету и, например, убирание пролога и эпилога функции прерывания (которые заняты сохранением/восстановлением регистров в/из стека) дает приличный выигрыш по производительности.
Однако, тут стоит смотреть на проблему в комплексе. Если вычисления в обычных функциях достаточно тяжелы и отнятие регистров приводит к тому, что в функциях все локальные переменные в регистры не помещаются - обычно происходит резкое падение производительности основного кода.
Так что надо выбирать - "или шашечки, или ехать".
А Функция "Обождать Х ms" имхо используется чаще, чем какая-либо другая!
Это она в таком очень простом примере используется так вот в наглую. В довольно обширных системах обычно таких процедур ожидания нет - ибо в это время проц просто простаивает. А обычно надо еще что-то делать. Но тут на помощь приходят всякие операционные системы реального времени с их потоками, сообщениями и прочим. Не обязательно общедоступные (например, FreeRTOS), часто и просто некие самописные вариации на тему RTOS.
-
А дальше, после того как процедура "Подождать" выполнилась - можно использовать этот РОН по другому назначению.
Ага, причем, таймер остановить или прерывания от него запретить, чтобы не запороть на ходу этот регистр, потом при новом входе в процедуру - разрешить. Как-то разрастается очень.
Хотя, конечно, в условиях крайнего ужимания по ресурсам бывает разное. И до такого доходит, но только если оно действительно оправданно - например, надо уложить весь функционал в минимальный по цене камень.
Но тут вылезет другая проблема. Допустим, мы неимоверными мозговыми усилиями утоптали все в самый маленький камень. Все, там нет места ни по памяти, ни по быстродействию. А завтра случилась дикая необходимость что-то добавить в функционале. И что? Жопа? Переделывать весь прибор? Хорошо, если есть камень шире, но с той же функциональностью и железом. А если нет? Опять тонны ручной работы по переделке?
-
Кстати, как у ARM при работе с оперативной памятью дело обстоит? 1 такт, или больше? Всеми нелюбимый (один из), например, первые 8к ОЗУ за 1 такт отрабатывает. переменных вмещается прилично.
-
Да, поговорили - теперь мне можно взять паузу (запустить функцию "Обождать" ;D) и подумать (не скатываясь в пауэр-даун ;D)! ::) А хороший топик начал Ператрон - интересный! ;D
-
Просто 2 года назад Димы еще небыло на этом ресурсе. А топики - были.
-
Кстати, как у ARM при работе с оперативной памятью дело обстоит? 1 такт, или больше?
Смотря какое ядро. На ARM7 - 2 такта запись, 3 - чтение. На Cortex-M3 - 2 такта запись, 2 - чтение, но там еще возможна конвееризация. На ARM9 - еще веселее. Это все для простых чтений/записей. Групповое (пачка регистров сразу) - по такту на слово.
-
Вести с фронта от "молодого бойца" ;D
Поставил Кейл, посмотрел на многа английских букаф... Пример Блинкер.с почитал... Минут через 10 уже захотелось спать - от бессилия! ;D
Но я не планирую отступать - нам нужна только победа! ::)
-
@ Андрей Степанов
Что конкретно в ардуине тебя интересует?
Какие проекты?
-
Приветствую Ператрон!
Вообще ничего конкретного пока. Просто интересен сам факт возможности удобного экспериментирования с МК, не углубляясь с самого начала в дебри низкоуровнего программирования. Я с самыми искренними намерениями пробовал изучить асм, собрал простой программатор (благодаря комраду KMG). Но я абсолютно не могу грамотно распределять свое свободное время. Постоянно куда то тороплюсь, работа-дом-работа. Выходные и те бездарно проходят в домашних заботах, на себя остается совсем немного. А тут краем уха увидел ардунину. ;D Готовая платформа, с большим потенциалом, и не только для экспериментов. Куча готовых к употреблению модулей, от функциональном назначении которых дух захватывает, сразу возникает интерес поработать, понаблюдать за их работой "изнутри". Можно писать на любимом языке программирования, не особо вдаваясь в особенности железа, по крайней мере мне так показалось.
P.S.: Нашел один огромнейший недостаток в Nano в сравнении с Uno!!! Для уны не нужно ставить драйвера. Что в свете моей тотальной расхлябанности и лени просто палочка-выручалочка. ;D ;D ;D Шутю конечно...
-
Просто интересен сам факт возможности удобного экспериментирования с МК, не углубляясь с самого начала в дебри низкоуровнего программирования.
Подтверждаю: для получения первого осмысленного результата достаточно одного вечера.
Осмысленный результат - это подключение ЖК-дисплея и вывод на него желаемой информации (в том числе - от базового компа).
Плюс к этому - получение в базовый комп инфы от ардуины через usb или com (наблюдая её через любую терминальную гляделку).
А когда у тебя работающая в сквозняке система - то нет проблем экспериментально постигать управление ею...
Можно писать на любимом языке программирования, не особо вдаваясь в особенности железа, по крайней мере мне так показалось.
С никогда не был в числе моих любимых :-[
А с железом как раз можно разбираться по ходу дела - и на практических задачах. Вот сейчас мучаю мелкий движок - для руления потами...
Нашел один огромнейший недостаток в Nano в сравнении с Uno!!! Для уны не нужно ставить драйвера.
:o :o :o
Какие драйвера?!
Ты это о чём?
Нано ничем не отличается от базовой арды.
А если речь о дровах для организации виртуального com-порта на основе USB - то это в равной мере распространяется на любую версию ардуины. И более того - вполне возможно, что на компе оно имеется по умолчанию (FT-232 - достаточно распространённый девайс в нынешних USB-устройствах).
Если хочется работать через com - нет проблем на любой версии, включая нано...
-
Какие драйвера?!
Ты это о чём?
На http://arduino.cc вычитал:
The ATmega328 provides UART TTL (5V) serial communication, which is available on digital pins 0 (RX) and 1 (TX). An ATmega8U2 on the board channels this serial communication over USB and appears as a virtual com port to software on the computer. The '8U2 firmware uses the standard USB COM drivers, and no external driver is needed.
Новая версия уны на ATmega8U2.
-
Если тут еще не боян, вот такой нашел проект
http://www.beavisaudio.com/projects/digital/ArduinoPunkConsole
как бы аналог вот такой пищалки http://compiler.kaustic.net/machines/apc.html
-
Новая версия уны на ATmega8U2.
Ну, если нужны приключения - то можно и с раритетом поиграться. Но новые версии на основе мега 328 работают без всяких драйверов.
Брать надо нано - я про это уже тут много раз сказал...
-
По поводу лабораторной конструкции - тут, конечно, на вкус и цвет, как известно друзей нет. Но на основе текущего опыта склоняюсь к тому, что нужно брать "хлеборезку" (breadboard) без лишних наворотов (если не жабиться - можно взять сразу две и пристыковать их друг к другу в ласточкины хвосты).
Избыток места не помешает - поскольку это пространство можно использовать для макетирования по примочечной тематике, а там количество точек нужно не маленькое.
Хлеборезку приклеить двухсторонним скотчем к листу оргалита - а уже на оргалите выклеивать всякие нужные кронштейны, ставить на полупостоянной основе поты, аудио- и иные разъёмы.
Сейчас у меня стенд выглядит так:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fperatronika.narod.ru%2Farticles%2Fgtlabinfo%2FDSCF0001.JPG&hash=8b6dd685c36499f4dfb67ce67347288d6a97db2c)
Пока на нём живёт на полустационаре только двухстрочный знаковый дисплей.
Отрабатываю управление мотофейдером ::)
В принципе, у меня уже есть и графический дисплей - ему тоже надо будет предусмотреть место на макете на постоянной основе...
Вот сегодня сгонял на радиобазар - и прикупил дополнительные прибамбасы:
- сверху пущу ряд клеммников (под винт), которые распаяю на отрезке слепыша и подоткну к ним контактные планки на цанговых разъёмах.
Клеммники нужны потому, что внешние провода прямо в плату втыкать влом - хлеборезка держит не сильно и нужно жёстко фиксировать провода, что б не выскакивали.
- так же пущу линейку лепестков, что б хвататься за них крокодилами измерительных приборов. Тоже ведь нужно фиксировать кабели - что б не играли.
- справа поставлю аудио-разёъмы (в расчёте на реампинг - что б подоткнул к компу и поехал).
- снизу - джек для гитары :P
Кроме того, снизу будет планка с дырками под поты - штуки на 4 как минимум.
Ну, ещё неплохо иметь расширитель для макетов на прототипе (слепыше).
Пару слов, почему выбран оргалит:
- дешевизна, но это не главное.
- удобство склеивания (просто канцелярским ПВА).
- удобство обработки - напильник, нож, надфиль...
И вот второе-третье - уже главное: я в своё время приловчился делать из оргалита демонстрационные образцы с выставочным уровнем качества. То, что это оргалит, можно узнать, только если уронить или процарапать. А если руками не трогать - то ни в жизни не догадаешься, что оно картонное.
Технология такова: оргалит легко режется на гильотинке или же резаком для стеклотекстолита.
Из мелких кусочков выклеивается любая форма - сначала с припуском склеивается нужный кронштейн, фигуристая панелька или держатель какой то загогулины. После просушки и грунтовки всё тем же ПВА всё это обрабатывается хоть в шарик, хоть в ролик - любые гнутые панели получаются без проблем.
В оргалит можно удачно вворачивать мелкие саморезы.
Прочности для лабораторного стенда - за глаза и за уши! А появится новая идея - не жалко отодрать и выклеить что-нибудь заново.
ХИНТ: описываю столь подробно просто для соблюдения единства места и действия: удобный макетный прибамбас входит в понятие "среды для проектирования" ;)
Потому этим следует озаботиться сразу же - потом это отзовётся неплохой экономией времени.
А если стенд не разваливается от прикосновения (не вылетают внутренние провода, а внешние - на цивильных разъёмах) - его легко снять с рабочего стола, упаковать в обувную коробку и отправить на хранение до следующей потребности в нём ;)
-
бардак на рабочем месте=бардак в делах=бардак в голове. Тут согласен с Чичваркиным.
оргалита не увидел, увидел лист ДВП и книгу про КПСС.
Попахивает тотальным ФГМ.
-
бардак на рабочем месте=бардак в делах=бардак в голове.
Есть другое понятие - "священный беспорядок".
Хотя у каждого свои пределы. Я видел такое... :o. Причем, у известного в стране человека.
-
А зачем там моторчик? Оно само ездит??? :o
-
Дык он потенц крутит.
-
бардак на рабочем месте=бардак в делах=бардак в голове.
Есть другое понятие - "священный беспорядок".
Хотя у каждого свои пределы. Я видел такое... :o. Причем, у известного в стране человека.
Некогда раз в год стол протереть? это ж не столярка. Да и в столярке нормальной уборку проводят.
-
А зачем там моторчик? Оно само ездит??? :o
Не само - под управлением...
:P
И называется всё вместе - мотофейдер...
Я уже говорил про проект: в педалборде (составленном из любых аналоговых примочек) с нужных потов снимаются ручки и надеваются крутильники - в результате можно наруливать пресеты (из памяти), а так же, управлять дистанционно - в т.ч. по миди - любым аналоговым потом.
-
Некогда раз в год стол протереть? это ж не столярка. Да и в столярке нормальной уборку проводят.
Тяжелый случай.
Лично я держу свой рабочий стол в идеальном порядке (за исключением отдельных свалочных мест, которыми тоже дорожу).
К чему я это.
Эх, такую бы мне жену! Я в смысле наведения порядка, ощущаю себя больше бабой, чем мужиком... :-?
-
как дела с рулежкой пары BBD? уже во всю?
я вот думаю, снова сесть за ревер на горсти 3007. С МК было бы удобно рулить всей семеркой.
-
Параллельно о своем, безардуинном... В процессе тематического серфа бескрайних просторов инета наткнулся на статью более чем 10-летней давности:
http://russian.joelonsoftware.com/Articles/LeakyAbstractions.html
Про компиляторы, оптимизацию (хотя в ссылке ни слова про это) и т.п.
-
Статья в машинном переводе, явно. Пролистал половину. мандалайщина/ператронщина.
так же человек нахватался верхушек и под веществами что-то настрочил.
"Простой пример: итерация по большому двумерному массиву может идти с совершенно разной скоростью, смотря как он обходится: горизонтально или вертикально."
горизонтально идет быстрее лишь в том случае, когда массив колется на вектора и работа идет с вектором, и элемент массива небольшого размера. При произвольном доступе, приходится и вектора перебирать.
если ОбстрОгироваться, то как раз пофиг становится, ибо INC и INC2 для элементов массива больше байта/пары становятся неактуальны, и даже ADD const (перебор по столбцам) занимает на современных камнях столько же тактов, сколько и INC. Другое дело, что данных в кэше может не оказаться. В общем, врывается куча нюансов. Но для небольших массивов, если руки не из опы, то одинаково все.
Вощем, статья о том, что систематизация приводит к потерям. Ну, любая уравниловка предполагает потери, зато рулежка проще. А кто поумней, оптимизирует на ходу.
-
человек нахватался верхушек**
да ну, чел всё таки стажировался в микрософте всё таки это уже о чёмто говорит.
ибо INC и INC2 для элементов массива больше байта/пары становятся неактуальны, и даже ADD const (перебор по столбцам) занимает на современных камнях столько же тактов, сколько и INC. ***
статья вобще не про МК , подозреваю что компилятор ООП для ПК может очень много всего нагородить при обращении к памяти с использованием структур
Другое дело, что данных в кэше может не оказаться. В общем, врывается куча нюансов. Но для небольших массивов, если руки не из опы, то одинаково все. **
а там как раз автор уточнил сразу что ведёт речь о больших массивах
-
Статья в машинном переводе, явно.
Ну когда машина начнет образно переводить американские идиомы с заменой на "Даму, которая сдавала в багаж", я пойду в грузчики ;D
На самом деле очень и очень годная статья. Профессионалы одобряют. Вообще там все статьи годные, вчера с удовольствием полночи читал все подряд. Кое-что мне попадалось раньше.
Вощем, статья о том, что систематизация приводит к потерям. Ну, любая уравниловка предполагает потери, зато рулежка проще.
Статья о том, что пользуясь бездумно современными технологиями быстрой разработки (в том числе и тем, что пропагандирует тут Peratron) никогда не получишь адекватного результата в целом. Учить надо таки с самого начала, чтобы было понимание.
А то вот что-то Peratron ЖКИ прицепил, буковки, пользуясь готовым кодом, повыводил, а моторчик не крутится, видать, нет готовых библиотек. Надо своим умом доходить. Абыдна, да ;D
-
Ну вот и славно! Для каждого статья оказалась о своем - как говорится
"да воздастся каждому по вере его" "да поймется каждому по степени желания понимать его" ::)
-
Такая реакция на ардуину мне чем то напоминает холивар типа Винда-Линукс. :)
Всему свое время, место и предназначение. Если захотелось for fun поиграться с МК в ночь с субботы на воскресенье, "вывести в реал" строки своего корявого кода, то обязательно этому должно предшествовать сборка программатора, изучение требухи контроллера, акцента асма? Я в своей нынешней профессиональной деятельности никак не связан с паяльником, программированием, даже компьютер вижу только в собранном и рабочем состоянии. Все потуги изучить МК по ТРУЪ правилам у меня не увенчались успехом - не могу выделить время на букварь, коих у меня и без этого в очереди... Есть ардуино, но это попса и оно не даст мне необходимых скиллов. Проще надо смотреть на такие вещи. Представьте, что захотев сделать банковский перевод необходимо было бы изучить порядок проведения платежей физических лиц без открытия расчетного счета, правила формирования платежей, кассовую работу... :) Пример немного кривой, но худо-бедно показывает, что я имею в виду.
Другое дело, если заниматься работой с МК профессионально, делать какой-нибудь продукт и потом его продавать, то тут я согласен - буквари читать от сих до сих, дабы не было потом мучительно больно из-за нестабильности "по непонятной причине", и писать на том, что предлагает разработчик МК.
-
Такая реакция на ардуину мне чем то напоминает холивар типа Винда-Линукс.
А дело не в ардуине - это просто банальная попытка троллинга ради рангового доминирования.
Ничего сверх этого...
-
@ Андрей Степанов
Делись успехами. Или проблемами - вместе будем думать, как их разгребать.
И не обращай внимания на троллей...
UPD: ты на какой версии работаешь?
-
я бы сказал, что холивар на тему линукс - ms-dos.
моторчики закрутятся, когда ператроныч нагуглит пример накатанный добродушным китайским студентом.
Кстати, я вот замену ардуине присмотрел: http://www.dealextreme.com/p/7-touch-screen-lcd-google-android-2-2-tablet-pc-w-wifi-camera-tf-arm-v5-349-79mhz-70053
вполне сгодится светодиодиками помигать. может даже и моторчик покрутить.
-
@ Rst7@ research
можно по подробнее о "линукс, что бы светодиодом моргать" может есть какие-то статьи по сборке такого чуда. Есть просто у меня "мечта идиота", ну или "мечта красноглазика" собрать самому линукс поддерживающую платформу, собрать под неё кернель и т.д.
Сам не знаю зачем мне это, но очень интересно.
-
Сам не знаю зачем мне это
И не надо. Я Вам настоятельно рекомендую не забивать голову. Процесс сборки ядра ничем не отличается от сборки его для большого брата, только таргет другой.
Если уж совсем неймется - возьмите подходящую отладочную плату. С ними даже весь комплект патчей ядра есть. Минимум телодвижений и минимум возможностей ошибиться.
-
@ Rst7 да я собирал ядра под АРМ, когда-то собирал себе линукс для windows mobile комуникатора и запускал через харет.
Не чего так даже иксы бегали и по инету нормально серфилось. Правда дров пришлось самому пописать, зато научился. Единственное, что не смог добить так это датчик отпечатков пальцев.
Вообще интересно было бы устройство типа изернет порт, ком порт, усб хост, что-то типа лпт порта (просто куча ножек для ввода вывода ) и линукс на всем этом деле. Если цена не заоблачная, то применений такой штуке можно найти массу.
-
Если цена не заоблачная, то применений такой штуке можно найти массу.
Причем, без Linux'а ;D
Чуть позже подкину пару ссылок на такие отладочники.
-
А, кстати, тысячи их тут - http://starterkit.ru/html/index.php
-
тысячи. на ибее не меньше.
но, когда наиграешься с ссылкой выше, то на память останется планшетничек.
К тому же, готовое изделие, в корпусе. Покупай, перешивай, рули моторчиками.
еще вариант - роутер помучать, там тоже армы и линукс.
О, даже совсем бюджетный вариант - рекламные плееры из плейбоя и (вог?). Народ их прекрасно допиливает. И цена вопроса - 4 бакса.
http://habrahabr.ru/blogs/DIY/119722/
@ Sanoend
с твоими скилами можно немного поработать и покупать все фирменное ;) я имею в виду месы и маршлаллы, а не париться с паяльником.
Тем более, если дров сам понаписал.
про LPT и COM - были кости в инете, вроде даже модуль ядра, для управления кофеваркой по LPT.
-
@ research с паяльником я парюсь для удовольствия. Девайсы на заказ давно уже не собираю, а зарабатываю на основной работе. Писать дрова под линукс не так сложно, как кажется. А в моём случае всё было совсем просто, ядро стартовало сразу, мне только пришлось дописать драйвер видео вывода с двойной буферизацией. И чуть чуть допилить дрова ЮСБ хоста. Для остального нашлись готовые модули подгружаемые через modprob.
-
Тогда тебе в пору с RST#7 потягаться, кто лучше перегруз сбацает на мк за 3 бакса :)
Чувствую, что скоро спикосим просто портируют VST под линукс, ARM9 явно потянет...
-
...тема заглохла, что-ли?
Жаль; при всей моей нелюбви к крестикам-ноликам есть в ней сок...
-
...тема заглохла, что-ли?
С троллями говорить бессмысленно. А если есть вопросы или предложения - высказывайся.
-
С троллями говорить бессмысленно.
Да мы всё ждем результата с моторчиками. Очень хочется поглядеть. Работу над ошибками провести, опять же. Ставлю литру на Ваш выбор, что ошибок там таки будет;)
Так что никакого трололо, все по теме.
-
...тема заглохла, что-ли?
С троллями говорить бессмысленно. А если есть вопросы или предложения - высказывайся.
Рад бы высказаться, да не секу в этом.
Однако, хотелось бы как-то увидеть он-боард (или "он-пояс") приблуду с радио-каналом для управления всякими эффектами и/или для генерации эффектов (это в качестве предложения/пожелания).
-
Рад бы высказаться, да не секу в этом.
Однако, хотелось бы как-то увидеть он-боард (или "он-пояс") приблуду с радио-каналом для управления всякими эффектами и/или для генерации эффектов (это в качестве предложения/пожелания).
Нет ничего проще, два таких модуля
http://www.ti.com/tool/ez430-rf2500t
Один он-боард (или "он-пояс"), другой на приемной стороне с выходом на миди.
И рули чем хочешь, например таким лупером для педалборда
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fmilas.spb.ru%2F%7Ekmg%2Ffiles%2Fprojects%2Flooper%2Flooper1_th.jpg&hash=fd3899723ae43db6727dd550eb4b63079d8859fc) (http://milas.spb.ru/~kmg/files/projects/looper/looper1.jpg)
-
Чайницкое предположение: выходит, уже с такими штуками за границей играют?:
http://www.diystompboxes.com/smfforum/index.php?topic=93464.0
-
Вот тут тоже обсуждение по теме топика:
http://www.freestompboxes.org/viewtopic.php?f=29&t=4858
-
Чайницкое предположение: выходит, уже с такими штуками за границей играют?:
http://www.diystompboxes.com/smfforum/index.php?topic=93464.0
Шилд для ардуины для подключения поляны в 64 кнопки:
http://www.spikenzielabs.com/SpikenzieLabs/Button64Shield.html
-
А вот это уже интересно: ардуень с кортексом
http://www.nixp.ru/news/Arduino-Due-%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%B0%D1%8F-%D0%BF%D0%BB%D0%B0%D1%82%D1%84%D0%BE%D1%80%D0%BC%D0%B0-%D1%82%D0%B5%D0%BF%D0%B5%D1%80%D1%8C-%D0%B8-%D0%BD%D0%B0-ARM.html
-
"...и 16 аналоговых выходов...."
афигенно перевели
-
Подскажите дилетанту :)
Хочу заказать отладочную плату http://starterkit.ru/html/index.php?name=shop&op=view&id=27
Насколько необходимо приобретение программатора-отладчика http://starterkit.ru/html/index.php?name=shop&op=view&id=16 ?
Или можно купить переходник USB-COM (у моего ноута нет железного COM-порта) и держать двустороннюю связь по нему, а программатор-отладчик никогда в жизни не понадобится поскольку в нем нет ничего полезного?
-
Хочу заказать отладочную плату http://starterkit.ru/html/index.php?name=shop&op=view&id=27
Вот это правильный выбор.
Насколько необходимо приобретение программатора-отладчика http://starterkit.ru/html/index.php?name=shop&op=view&id=16 ? Или можно купить переходник USB-COM (у моего ноута нет железного COM-порта) и держать двустороннюю связь по нему, а программатор-отладчик никогда в жизни не понадобится поскольку в нем нет ничего полезного?
Я всем начинающим настоятельно рекомендую обходиться без железного отладчика. Надо пользоваться отладочной печатью в консоль или маханием ножками в случае быстрых процессов.
А железный отладчик как по мне - штука малополезная. Ну остановил ты проц, разглядываешь регистры, память, а внешний мир - он не стоит на месте. Опять же, сложные математические алгоритмы правильно сначала отлаживать на большом брате.
Так что лично я не пользуюсь железным отладчиком вообще за всю свою практику.
-
Спасибо, вы подтвердили мои предположения. Я тоже склоняюсь к отладочной печати в гипертерминал и к маханию ножками. Просто думал - вдруг у этой железяки есть какие-то неоспоримые преимущества или режимы/фичи которые по другому никак не получить и которые я ещё не знаю, чтобы было основание ей пользоваться. Насколько я понял, это похоже на пошаговый отладчик программного кода в языках программирования высокого уровня на компе или то-же отладчик симулятора - только "настоящий" и железный, и однозначно работающий с периферией? Если процесс перепрошивки МК будет происходить быстро, тогда думаю будет проще несколько раз его перепрошить каждый раз выводя в отладочную печать то что нужно, и поймать ошибку.
-
Насколько я понял, это похоже на пошаговый отладчик программного кода в языках программирования высокого уровня на компе или то-же отладчик симулятора - только "настоящий" и железный, и однозначно работающий с периферией?
Да, так и есть.
Я тоже склоняюсь к отладочной печати в гипертерминал
Лучше не в гипертерминал. Одним хорошим профессионалом написан годный прошивальщик LPC из командной строки. Он после прошивки умеет сам быть терминалом. Курить тут - http://electronix.ru/forum/index.php?showtopic=29794
-
Подскажите дилетанту :)
Хочу заказать отладочную плату http://starterkit.ru/html/index.php?name=shop&op=view&id=27
В принципе, можно обойтись загрузкой через последовательный порт - для этого предварительно нужно в кристалл залить специальную программку-downloader и соответствующем образом запрограммировать управляющие fuse (биты, которыми программируются режимы кристалла - в том числе, и возможность рестарта через даунлоадер). Но для этого понадобится по крайней мере однажды воспользоваться стандартным программатором - для того, что б этот ДЛ зашить в МК.
ДЛ загружается в старшие адреса программной памяти и при холодном рестарте проверяет, нет ли на последовательном порту программы на закачку. Если есть - то ДЛ закачивает программу в младшие адреса и после закачки стартует её на выполнение.
Если заниматься МК как следует - то без программатора (по крайней мере последовательного - через внутрисхемный программатор ака ISP) не обойтись. Одного кристалла будет мало - а бегать к соседу прошивать ДЛ в каждый новый, это не набегаешься.
Но вот начинать с зашитого кем то другим кристалла - это самое то. И наиболее правильно, если это будет именно Ардуино - это потом всякие отладочные комплекты на любой вкус будут. А сначала нужно, что б оно включилось и заработало - и ардуень в этом смысле непревзойдённа, поскольку предоставляет законченную среду, включающую гарантированно совместимое железо и программу (IDE).
Насколько необходимо приобретение программатора-отладчика http://starterkit.ru/html/index.php?name=shop&op=view&id=16 ?
На начальном этапе критическим параметром является документированность - если опираться на любой отладочный комплект, а тем паче собирать его самому, документации будет намного меньше и вероятность преуспеть значительно снижается.
Потому ещё раз я на первый подход предлагаю имено Ардуино - кто б что б иного про это не говорил.
Ардуинное железо само по себе является тем же самым отладочным комплектом - и можно писать на любом языке помимо стандартного ардуиновского диалекта Си.
Огромное количество периферии и библиотек значительно облегчают жизнь на этапе освоения.
У меня сейчас три конвенциональных ардуени не считая однокристальных версий - для экспериментов по связи разного музыкального оборудования в единую сеть.
При этом, минимальная ардуень - это просто чип АТМега8 с резистором на выводе RESET!
Делается он так - в кроватку Ардуино Северино ставится новый чип, в него по ISP прошивается загрузчик (одним нажатием), после чего из IDE закачивается прикладной скетч (пользовательские программы в домене ардуино принято именовать "скетчами").
После этого кристалл извлекается из кроватки и ставится в целевой модуль.
http://mk90.blogspot.com/2011/01/arduino-3-atmega8a-bootloader.html
Разумеется, можно программировать и сразу в целевом модуле - через ISP.
Так, что ардуень ни чём не уступает никакой отладочной системе - имея существенное преимущество в виде полной унификации и максимальной дружественности: взяв независимый отладочный комплект, ты будешь всё строить сам - а если в качестве основы взята ардуень, ты, мало что соображая на начальном этапе, воспользуешься огромными залежами хорошо документированных прикладных программ, развитие которых происходит экспоненциально.
Или можно купить переходник USB-COM (у моего ноута нет железного COM-порта) и держать двустороннюю связь по нему, а программатор-отладчик никогда в жизни не понадобится поскольку в нем нет ничего полезного?
Переходник должен быть продвинутым - поддерживать бит-банг режим ком-порта! То есть, обязательным является приобретение FT232RL или эквивалента. Простые шнурки как правло это не поддерживают.
Бит-банг программер - это программатор, в котором управление процессом внутрисхемного программирования производится через вспомогательные линии ком-порта.
Приобретя ардуень с USB ты автоматически приобретаешь такой программатор:
http://arduino.cc/en/Tutorial/ArduinoISP
http://freeduino.ru/arduino/isp.html
Я тоже склоняюсь к отладочной печати в гипертерминал и к маханию ножками
Это стандартный способ отладки в среде ардуино - там даже есть кнопочка терминала, что б не лезть далеко.
Но помимо терминала, как отладочного средства, сразу озаботься "хлеборезкой" - на этапе первичных экспериментов, опробования различного периферийного железа это очень быстрый способ продвижения к положительному результату.
Насколько я понял, это похоже на пошаговый отладчик программного кода в языках программирования высокого уровня на компе или то-же отладчик симулятора - только "настоящий" и железный, и однозначно работающий с периферией?
Пошаговую отладку сложной математики (именно математики - то есть формульных вычислений) удобно делать в симуляторах - не вылезая в железо. Симуляторы есть в AVRStudio, Proteus и ряде других отладочных сред.
Когда математика выверена - можно вылезти в железо на хлеборезку. Или, если это в данном конкретном случае проходимт - сразу в целевое железо, отлаживая полный алгоритм через внутрисхемный программинг.
Если процесс перепрошивки МК будет происходить быстро, тогда думаю будет проще несколько раз его перепрошить каждый раз выводя в отладочную печать то что нужно, и поймать ошибку.
Так и делается - время перепрошивки сильно зависит от используемого адаптера ISP и варьирует от нескольких секунд, до нескольких десятков секунд.
Особенно удобно, если среда напрямую поддерживает программер.
Наиболее удобный - AVR ISP MkII. Он напрямую дружит с АВРСтудией - тогда скорректировал код, компильнул - и оно по умолчанию пишется в кристалл. Не надо выгружать объектный код, лезть в другое окно и шить его отдельной программой, поддерживающей твою железяку.
При работе в АрдуиноIDE такой сквозной режим обеспечивается по умолчанию с первой же минуты - и потому самый неопытный юзер попадает в дружественную среду, что значительно облегчает начальное освоение.
UPD: в порядке объективной критики ардуени - она ориентирована только на три базовых кристалла: АТмега8, АТмега168 и АТмега328.
Собственно говоря, это и есть единственный её реальный недостаток - который на самом деле является основой главных достоинств: многообразие возможностей на стартовом этапе только мешает - слишком большое количество степеней свободы осложняет реальный выбор.
Никто и ничто не мешает отработать задачу на этом стандартном железе - и лишь потом, будучи на 101% уверенным, переносить в любой другой кристалл.
ХИНТ: о чём сразу следует озаботиться - это собрать фьюз-доктора!
Совершенно определённо ты поначалу залочишь кучу кристаллов - просто из-за ошибок в установках фьюзов. А если ты во фьюзах записал запрет на RESET или на ISP, то доступ через простые программаторы у тебя накроется и ты сможешь снова работать с кристаллом, только "разлочив" его.
Для этого собирается специальное устройство, которое шьёт кристаллы по высокому напряжению и возвращает фьюзы в заводское состояние.
http://startcd.narod.ru/rstdisbl_mega8/rstdisbl.htm
http://www.getchip.net/posts/059-ispravlyaem-avr-fyuzy-pri-pomoshhi-atmega-fusebit-doctor/
http://avrdevice.ru/?page_id=225
ХИНТ2: собрать стандартную ардуень не составляет проблемы:
http://howtomakekit.blogspot.com/2009/11/arduino-severino.html
По серийному порту она может работать через любой убогий усб/сериал мост - поскольку использован стандартный протокол Tx/Rx...
-
Трёхосевой акселерометр в качестве датчика наклона: (https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fhabrahabr.ru%2Fblogs%2Farduino%2F126026%2F&hash=ffb85e9010329be84a22f062bb409c54237c5825)
-
Уважаемый Peratron! Вы уже наверное накрутили Ардуину вдоль и поперек. Скажите (навскидку) сколько контроллеров понадобится (это не считая обвязки, которая может быть принципиально любой и даже достаточно сложной) для того, чтобы в 12 каналах рулить тремя шаговыми двигателями. В каждом канале одномоментно задействовано не более одного двигателя. Время отклика пусть будет 0,1-0,5 секунды. То есть, из трех выбираем один, указываем ему направление вращения и даем команду на исполнение. Ограничение хода - программное (+ концевые выключатели на случай программного глюка :D). Хорошо, если бы все оперативно рулилось с компьютера. Вот. Ответьте, пожалуйста! Лень в даташиты лезть и в теме искать. Вы в этом смысле - первоисточник. Спасибо!
-
Подскажите дилетанту :)
Хочу заказать отладочную плату http://starterkit.ru/html/index.php?name=shop&op=view&id=27
В принципе, можно обойтись загрузкой через последовательный порт - для этого предварительно нужно в кристалл залить специальную программку-downloader и соответствующем образом запрограммировать управляющие fuse (биты, которыми программируются режимы кристалла - в том числе, и возможность рестарта через даунлоадер). Но для этого понадобится по крайней мере однажды воспользоваться стандартным программатором - для того, что б этот ДЛ зашить в МК.
...
Facepalm.jpg
Господин Peratron, Вы хотя-бы по ссылке сходили. Там на ARM отладочная плата, конкретно - LPC1768. Никаких фузов там нет, а начальный загрузчик с завода - наоборот есть.
Весь остальной текст соответственно к вопросу Ivana не имеет никакого отношения.
-
На Электроникс.ру спрашивать страшно, поэтому продолжу тут :)
"Одним хорошим профессионалом" (С) было сказано: Аналогично некорректно молча игнорировать (компиллятору - прим. переводчика), к сожалению, широко бездумно применяемое while( 1 ){.....}
Я первый раз увидел While(1) в коде KMG. Это меня ещё тогда помнится смутило, но мне было объяснено что это "корпоративный стандарт". Потом я подумал и решил, что логично постоянно сидеть в бесконечном цикле и ничего не делать, при этом по прерываниям не будут спешно делаться длинные процедуры - а только выставляться флаги, которые будут обрабатываться в нужном приоритете внутри этого бесконечного цикла. Потом я увидел эти While(1) во множестве фабричных примеров прямо с сайтов производителей. Но вышеприведенная цитата вернула меня к моим сомнениям. Хотя я понимаю что это по сравнению с другими вопросами - ловля блох ::)
ЗЫ извините, поспешил с вопросом :) Полазил-почитал - речь о While(1) vs for(;;)
и что первое не труЪ а второе по стандарту :)
ЗЗЫ а прикольно местный ВВ-декодер воспринял ";"+")" в конце for - вот тебе и пример, что пишешь и имеешь в виду одно, а компилятор выворачивает это абсолютно по другому! ::)
-
Выход из main() означает завершение задачи, поэтому необходимо обеспечить зацикливание программы внутри main(). Как раз while(1){...} или for( ;; ){...} это и обеспечивают.
В других местах программы стоит конечно избегать таких конструкций без насущной необходимости.
-
while( 1 ){.....}
Есть адекватная форма записи вечного цикла:
for(;;){....}
Так принято было отцами от рождения языка. Т.к. оптимизатор не всегда может до конца справится с выбрасыванием ненужного кода в сложных случаях, то не надо ему мешать всовыванием какой-то константы (тем более не уникальной, в отличии от примера ниже).
С другой стороны, форма
do{...}while(0)
имеет право на жизнь и общепринята для обрамления функций в #define
-
ЗЗЫ а прикольно местный ВВ-декодер воспринял
А есть правильный тег [сode]
:) ;) :D ;D >:( :( :o 8-) :-? ::) :P :-[ :-X :-/ :-* :'(
и без него:
:) ;) :D ;D >:( :( :o 8-) :-? ::) :P :-[ :-X :-/ :-* :'(
-
Вы уж простите меня за поспешные и глупые вопросы - просто наткнулся и спешно хотел вас застать пока вы оба онлайн ::) Хотя, насчет "do{...}while(0)" он тоже прошелся (с этого в принципе и все началось ::) ), аргументировал что достаточно просто "{...}". Но если про "while(1){...} vs for( ;; ){...}" я действительно все понял до конца, то про второй пример - нет, тем более вы говорите что это надо :) Буду
курить копать дальше ::)
А есть правильный тег [сode]
А я то думал - и как это у вас получается такие красивые вставки делать, да с полосой прокрутки, да без слова "Цитата"! :) Век живи - век учись. Это к вопросу, что свои команды надо правильно обрамлять - и на С в том числе ::) И к вопросу о том, что именно там я не хотел превращения его в смайлик - но исполнительный компилятор сделал это за меня :) Чувствую, я ещё пройдусь по полю с граблями с аналогичными случаями в С! ::)
-
Хотя, насчет "do{...}while(0)" он тоже прошелся
Там Игорь прошелся по нему исключительно из-за того, что это было написано совершенно не к месту. Обычное применение такой конструкции - в изготовлении inline-функции через #define (пример, конечно, из пальца высосан)
//Годный способ:
#define foo(a,b) do{c=(a)+(b);}while(0)
//Говнокод (с возможностью массы побочных эффектов при ошибках):
#define foo_bad(a,b) c=a+b;
....
foo(1,2); //Ok
...
foo(1,2) //пропущена ; => ошибка.
...
foo_bad(1,2) //; пропущена, а ошибки нет.
...
-
Красиво, блин! Уже второй раз чувствую себя "молодым бойцом", которому любезно разжевывают для многих очевидные вещи!... Непривычная роль, честно говоря :) Но хоть как-то результативно ::)
Может можно ещё как-то определить функцию в #define чтобы она с одной стороны не ругалась при определении, а с другой - требовала после себя ";"? Подумаю.
ЗЫ написать бы какой-нибудь макрос, который выжимает суть из мегабайт текста на форуме! ::)
-
Мелькнула шальная идея - написать (например, на 1С - ибо я его умею ::) ) некий анализатор-заменитель текстового файла Сишного кода, где во всех #define будет проверяться наличие do {} while(0) и при отсутствии подставляться, ещё подобных вещей наберу и тоже буду тестировать и заменять при возможности, также буду пользоваться своими собственными укороченными разработанными именами-заменами... И в конце концов это выродится в собственный язык программирования высокого уровня - с компилятором в С, реализованным в 1С ;D
-
;D
-
Уважаемый Peratron! Вы уже наверное накрутили Ардуину вдоль и поперек. Скажите (навскидку) сколько контроллеров понадобится (это не считая обвязки, которая может быть принципиально любой и даже достаточно сложной) для того, чтобы в 12 каналах рулить тремя шаговыми двигателями. В каждом канале одномоментно задействовано не более одного двигателя. Время отклика пусть будет 0,1-0,5 секунды. То есть, из трех выбираем один, указываем ему направление вращения и даем команду на исполнение. Ограничение хода - программное (+ концевые выключатели на случай программного глюка :D). Хорошо, если бы все оперативно рулилось с компьютера. Вот. Ответьте, пожалуйста! Лень в даташиты лезть и в теме искать. Вы в этом смысле - первоисточник. Спасибо!
Что понимается под контроллерами? Если микропроцессор - то без труда один и в реалтайме всеми сразу.
А если речь о ключах - то как правило кристалл на один ШД.
Вот типовой мотор-шилд для ардуени:
http://mk90.blogspot.com/2009/03/motorshield-adafruit.html
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Flh3.ggpht.com%2F-rCczUe5xpDw%2FSaq_d72h3lI%2FAAAAAAAABLM%2FZfEvZQCNrNA%2Fs640%2Fmshield_LRG.jpg&hash=3c03363bb71c67b488f172cc25df1cf916ddf201)
Руление с компа - элементарно через ком-порт. Или усб.
Под все такие дела существуют стандартные библиотеки - потому своего городить почти не надо.
-
Да, разумеется микропроцессор. То есть, те модели, которые используете вы, имеют не менее 12 портов работающих на выход? Конечно, мне следовало задать этот вопрос в первую очередь. На фото не совсем ясно ху из ху. Два светодиода выполняют роль индикаторов ограничения хода? Вы не будете против, если я задам вам пару вопросов в ЛС?
-
Мелькнула шальная идея - написать (например, на 1С - ибо я его умею ::) ) некий анализатор-заменитель текстового файла Сишного кода, где во всех #define будет проверяться наличие do {} while(0) и при отсутствии подставляться, ещё подобных вещей наберу и тоже буду тестировать и заменять при возможности, также буду пользоваться своими собственными укороченными разработанными именами-заменами... И в конце концов это выродится в собственный язык программирования высокого уровня - с компилятором в С, реализованным в 1С ;D
Не поверишь, но у меня написан похожий продукт.
Для создания информационно поисковых систем. Мышкой делаются все поля, все соответствия и т.д. на выходе шарповский код, который шарповским же компилятором и компилистя. И получается бинарник ИПС-ки. Штука на столько удобная, что я испольтзую её уже года два и заработал много денег, за счет того, что могу написать ИПС за 15 минут, а если бы я писал кодом, то затратил бы неделю времени.
Так что как бы абсурдно не звучала идея с 1С, но рациональное звено в ней есть!
-
Ага. Называется старым русским словом "Визард" :) Если слабо представляешь себе формат и особенности конечного продукта - то помогает абстрагироваться, но закрепощает в рамки. А если сам же его (визард) и написал - то только помощь, типа как "механизация ручного труда" ::)
ЗЫ а насчет 1С - я там много чего для себя утилитарного написал, и для нужд моего гитарно-электронного хобби в том числе, с выдачей таблиц и графиков ::)
-
То есть, те модели, которые используете вы, имеют не менее 12 портов работающих на выход?
О каких портах речь? О параллельных или последовательных?
В ардуени используется семейство мега8: мега8, мега168, мега328. Они имеют одинаковую цоколёвку и отличаются только объёмом памяти.
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fwww.robocraft.ru%2Ffiles%2Fatmega168pinmapping.png&hash=4fd3a05f01f69939a43eb5ff8f1589884178f28b)
Все выводы, кроме питания, могут быть использованы в качестве портов.
На фото не совсем ясно ху из ху
Ну, так запросите гугла - по волшебным словам "ардуино мотор шилд". Да и в ссылке, что над фотографией - детальное описание конкретно этого шилда (со схемой).
Вы не будете против, если я задам вам пару вопросов в ЛС?
Вэлкам...
-
Вести с фронта от молодого бойца :)
Первая боевая задача на С - включение/выключение, инициализация и взаимодействие с внешней железной периферией в виде GPS и GSM модулей по USART-у в асинхронном режиме. Придумал сделать её с использованием прерываний от сквозного системного таймера, доложил сказал об этой идее командиру руководителю проекта :) Командир сказал - отлично, в этом направлении и будем наступать, только в военных терминах это называется RTOS, её упрощенный вариант - только диспетчер задач :) И дал мне на изучение http://lifeslice.narod.ru/ - глава 2. Читаю и пытаюсь постигать хитрую военную науку ::) Мне мой сквозной таймер с глобальными флагами статусов задач казался проще :) Если я не вернусь - считайте меня .... кем хотите :)
-
Как же это КРАСИВО! ::) Такие навернутые многоярусные абстракции на последовательное исполнение ASM кода в рамках RISC архитектуры!...
-
А я всего-то хотел как белый человек сидеть смотреть телевизор и только каждые 5 минут бегать на секунду на кухню проверять как там варится мой борщ и не пора ли делать с ним следующую операцию, надеясь что если я засмотрюсь интересной передачей и пропущу много времени, то в борще ничего не переварится и не выкипит, и что я успею вернуться к экрану до следующего планового визита на кухню, ибо я буду несколько в замешательстве, если завозившись и находясь на кухне я увижу себя же, пришедшего проверить что там и как ::)
Хотя, наверное, встречи с собой на кухне можно избежать, если по приходу туда отключать командный звонок будильника не останавливая его ход ::) А если что-то в супе может перевариться, наверное надо стоять над кастрюлей от начала и до конца процесса, не отвлекаясь даже на звонки в дверь и сигнал воздушной тревоги...
-
Точно. А каждый мой визит на кухню будут выполняться следующие действия:
- Чтение из бортового журнала номера и времени начала текущего этапа всего процесса
- В зависимости от номера текущего этапа проверяется условие его успешного завершения
Если (это условие ложно) и (время таймаута данного этапа превышено) Тогда
Возврат ошибки
ИначеЕсли (это условие истинно) Тогда
Инициализируем следующий этап (возможно ветвление в зависимости от условий и/или содержания полученного ответа от устройства)
Записываем в бортовой журнал номер следующего этапа и время начала его выполнения
Иначе
// ничего не делаем - ждем окончания таймаута
КонецЕсли;
-
Продолжая монолог молодого бойца :)
Пишу себе на 1С симулятор логики драйверов внешних железных устройств: в одном углу рабочего окна будут кнопки и параметры задания миссий - методов драйвера (например, получить GPS координаты, или переключиться в режим автоматической выдачи и т.п.) а в другом - органы управления внешним устройством - и я буду играть за него, выдавая ответы сразу или нет, теряя и находя заново сеть, тормозить и просрочивать таймауты и т.п. и всячески пытаясь ввести драйвер в заблуждение :) И во все это можно будет играть параллельно с основной работой бухгалтера - ибо в 1С есть возможность вызывать определенную процедуру с заданной периодичностью.
-
По ходу боя - если знаете хорошую программу-терминал для общения с железками через COM (или его виртуальный аналог в железном USB), чтобы была получше гипер-терминала, желательно 2 окна - передачи и приема, чтобы передаваемые последовательности можно было вставлять из буфера и передавать так же спецсимволы типа <enter> и <return>, короче чтобы удобно было - посоветуйте хотя бы название или где скачать ::)
-
СОМ2000 - http://revich.lib.ru/programm.htm
Terminal v1.9b - описалово: http://easyelectronics.ru/terminalnye-programmy.html
-
СОМ2000 - http://revich.lib.ru/programm.htm
Выбросьте гадость. Вот - https://sites.google.com/site/terminalbpp/
-
А я уже скачал СОМ2000 - и даже запустил, принимает и даже показывает что отсылает, правда за пару секунд не разобрался во всех фишках и так и не сумел отправить длинные управляющие последовательности.... Сейчас скачаю bpp...
Большое спасибо вам обоим, дающим ссылки на снаряды :)
ЗЫ увидел исправление и Terminal v1.9b тоже скачал. Еще раз спасибо.
ЗЗЫ если вдруг вам будет нужна консультация по роликовым конькам (особенно беговым моделям) - обращайтесь, распишу все в деталях, как практикущий спортсмен - к примеру, в 2008 году наша команда стала второй по итогам межнационального кубка, уступив только сборной России ::)
-
Поставил и Terminal v1.9b (и старую версию от Ператрона и новую от Rst7) - при всем уважении к обоим рекомендовавшим, при моей стартовой скорости входящего потока он просто неприлично тормозил и зависал, не давал жать на кнопки... В итоге почитал комменты с ссылки Ператрона ( http://easyelectronics.ru/terminalnye-programmy.html ), понакачал - понаставил ещё несколько терминалов, но на данном этапе остановился на Realterm_2.0.0.70 с http://www.i2cchip.com/realterm/ - вроде и тормозов особых нет, и интерфейс отправки длинных строк удобный, можно поставить флажки какие спецсимволы добавлять в конце, а вкупе с крайне необходимым для GPS и недавно обнаруженным мной онлайн калькулятором (ничего лишнего - и максимальное удобство, даже результат ПОЛНЫЙ копируется в буфер) http://www.hhhh.org/wiml/proj/nmeaxor.html - с помощью этих полезных вещей я потихоньку дрессирую мой GPS модуль - некоторые команды он уже понимает (самое смешное то, что в "даташите" именно на мой модуль НЕТ списка команд, я скачал даташиты на похожие модули - а там список команд РАЗНЫЙ, пытаюсь действовать методом творческого тыка) ::)
-
Я тут подумал... Прерывание у нас может наступить МЕЖДУ ЛЮБЫМИ командами ASM кода? Если оно разрешено конечно, оно подождет несколько тактов пока будет выполняться длинная неделимая ASM команда и наступит сразу после, не будет рвать команду посередине, я прав? Получается, что если мы на С читаем в локальную переменную из глобальной, а это выполняется за много ASM команд, то у нас запросто может прийти прерывание которое пишет эту же глобальную переменную и в результате мы можем прочитать начало старого значения а конец нового? В этом заключается сложность и необходимость "исключительного доступа" к "общим" глобальным переменным? И как тогда читать? Через отдельную функцию, которая при старте запрещает нужные прерывания, читает переменную а потом возвращает прерывания? Или иметь флаг, который будет выставляться прерыванием при записи переменной и если в начале чтения и в конце он не совпадает - считать что процесс чтения завершен некорректно и данные невалидны? И надеяться, что этот флаг не постигнет та же участь - поскольку он будет читаться за ОДНУ ASM команду и никакое прерывание не приведет к неправильности его прочтения? Что скажете, господа? Я пока в замешательстве.... ::)
Я понимаю что эта коллизия может произойти раз в 1000 лет... А может и чаще - зависит от количества таких переменных и частоты обращения к ним. Просто очень не хочется писать код "более-менее условно работающий, но глючащий в отдельные моменты", а хочется устойчивый, методически правильный, чистый и шелковистый ::)
-
Я понимаю что эта коллизия может произойти раз в 1000 лет...
Главная причина трудноотлавливаемых глюков в программе!
Обязательно обрамлять вне прерываний доступ к переменным, которые читаются не одной командой, запретом/разрешением прерываний.
А так же следить за ситуацией: взятие общей переменной - длинный кусок кода - запись переменной, так как во время исполнения длинного куска кода прерывания могут изменить эту переменную.
-
Через отдельную функцию, которая при старте запрещает нужные прерывания, читает переменную а потом возвращает прерывания?
Нормальная подпрограмма сама заботится об исключении подобных коллизий - если в С функция написана через пень колоду, то боржом пить поздно...
Я понимаю что эта коллизия может произойти раз в 1000 лет...
При нормальном кодировании такая коллизия должна быть подавлена в зародыше.
Во всяком случае при написании мониторов для РК-86, а потом и для самоспроектированного PCХТ в любой вызываемой функции я ставил и запреты на прерывания, и отслеживание стека, и прочие причиндалы, исключающие сбои...
-
Значит я не зря озадачился этим вопросом. Но поскольку с ним должны были сталкиваться почти все, то скорее всего есть уже наработанные людьми методы решения, которые хочется узнать и изучить. Хотя я и свои придумать могу (пару уже предложил), но имхо неразумно и самонадеянно исключать возможность того, что есть красивые варианты до которых я не додумался ::)
-
Получается, что если мы на С читаем в локальную переменную из глобальной, а это выполняется за много ASM команд, то у нас запросто может прийти прерывание которое пишет эту же глобальную переменную и в результате мы можем прочитать начало старого значения а конец нового?
При любом многопоточном коде такое возможно - наличие разрешенных прерываний - это один из видов многопоточности.
Естественно, что доступ к объектам, который осуществляется неатомарным способом из нескольких потоков (например, за несколько команд) надо обрамлять в критические секции (вид этих критических секций может разнится от среды выполнения).
Следует понимать, что неатомарность доступа бывает везде. И если, например, на AVR на неатомарность можно наступить уже при работе с int (т.к. 16 бит), то на ARM это обычно проявляется при работе со структурами как с целыми объектами.
Обычно в среде различных RTOS есть специальные примитивы, которые позволяют обеспечивать быструю блокировку многопоточности для такого доступа. Следует, однако, иметь в виду, что блокировать шедуллер следует только на минимально возможное время - иначе могут возникнуть совершенно нежелательные задержки в работе других потоков. Если надо монополизировать доступ к какому-либо объекту на длительное время, то в средах RTOS рекомендуется использовать более продвинутые примитивы синхронизации - мьютексы и тому подобное.
Теперь о простом способе красивого написания атомарного кода (на Си). Я обычно пользуюсь таким макросом (пример для IAR'а в инкарнации ARM Cortex-M3)
//Содержимое подходящего .h-файла
#pragma inline=forced
static __istate_t get_INTERRUPT_and_CLI() {__istate_t s=__get_interrupt_state(); __disable_interrupt(); return s; }
#define ATOMIC_CODE() for(__istate_t __temp=get_INTERRUPT_and_CLI(),iter=0; iter<1; iter++,__set_interrupt_state(__temp))
//Использование
void foo(void)
{
...
ATOMIC_CODE()
{
//Этот код в пределах скобок будет выполнен с запрещенными прерываниями. После выхода из блока состояние прерываний будет восстановлено.
a++; //Кстати, если а - глобальная переменная, такой инкремент нифига не атомарен
}
...
}
Что делают функции __get_interrupt_state, __disable_interrupt и __set_interrupt_state, думаю, понятно само за себя. На самом деле пара __get/__set представляет из себя минимально возможный способ получить и восстановить состояние прерываний - обычно это одна-две команды на любой архитектуре.
Цикл в макросе оптимизатор полностью вычищает, т.к. его работа полностью предсказуема и представляет из себя одну итерацию.
Ну а в общем намного выше я рассказывал о прелестях регистровой архитектуры и правильным способом работы с переменными на процессорах с такой архитектурой - загрузили из ОЗУ в регистры, потрудились, выгрузили. Так вот в таком случае часто обеспечение атомарности упрощается - один атомарный блок в начале, один - в конце.
Во всяком случае при написании мониторов для РК-86
Господин Peratron, Вам абы слово вставить? На РК-86 сигнал прерывания на процессор не приходил никогда, ибо железно сидел на +5. А на вывод сигнализации о разрешении/запрете прерываний вообще был подвешен матюгальник. Ни о какой многопоточности из-за этого там не могло быть и речи, а следовательно никакие примитивы для синхронизации там были не нужны.
-
Сижу у заказчиков, интенсивно работаю и уже второй час не могу детально прочитать и обдумать вышенаписанное - а чувствую, что там есть над чем подумать! ::) Позже дома проанализирую. Спасибо! ::)
ЗЫ вообще, имхо часть постов из этого топика надо в меморис и на винт - как ценную информацию.
-
Насчет анализа вышеприведенного примера и общей философии по поводу что хорошо что регистры восстанавливаются после завершения прерывания а хотя бы область ОЗУ - нет, я возьму таймаут ещё на подумать ::)
А комментарии по ходу боя - у меня устройство шлет по USARTу регулярно немалый объем информации, мне из неё нужно максимум процентов 5 (в худшем случае). Хотел повесить на процедуру обработки прерывания приема небольшой анализатор принятого сообщения и дублирования его куда надо если оно ценное - но политика общего проекта такова, что мы USART максимально не нагружаем - а значит придется записывать ВСЁ ПОДРЯД что он пришлет в длинный буфер (причем, придется рассчитать его максимально необходимую длину), а потом долгими зимними вечерами (и только вечерами, а днем делать другое :) ) сидеть и разгребать - что же он нам там наприсылал и выискивать в этом крупицы ценных данных... Да ещё и думать - как это красиво организовать :)
-
Новость для тех, кто до сих пор живет в прошлом веке и кроме DIP-корпусов ничего не переваривает.
http://www.mt-system.ru/index.php?id=93243
-
Покидайтесь плиз помидорами - мне самому кажется что весьма коряво, но
красивее минимизорованнее по ОЗУ придумать не могу...
void GPS_send_command_RMC_call_freq(char call_freq)
{
//$PMTK314,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*2D<CR><LF>
char i, j;
i = 0;
GPS_command_buffer[i++] = '$';
GPS_command_buffer[i++] = 'P';
GPS_command_buffer[i++] = 'M';
GPS_command_buffer[i++] = 'T';
GPS_command_buffer[i++] = 'K';
GPS_command_buffer[i++] = '3';
GPS_command_buffer[i++] = '1';
GPS_command_buffer[i++] = '4';
GPS_command_buffer[i++] = ',';
GPS_command_buffer[i++] = '0';
GPS_command_buffer[i++] = ',';
j = call_freq;
if (j >= 100)
{
GPS_command_buffer[i++] = '0' + j/100;
j = j - 100*(j/100);
GPS_command_buffer[i++] = '0' + j/10;
j = j - 10*(j/10);
}
else if (j >= 10)
{
GPS_command_buffer[i++] = '0' + j/10;
j = j - 10*(j/10);
}
GPS_command_buffer[i++] = '0' + j;
for (j=0; j<17; j++)
{
GPS_command_buffer[i++] = ',';
GPS_command_buffer[i++] = '0';
}
GPS_command_buffer[i++] = 0;
j = 0;
i = 1;
while (GPS_command_buffer[i]) j = j^GPS_command_buffer[i++];
GPS_command_buffer[i++] = GPS_char_multiply;
GPS_command_buffer[i++] = '0' + j/16;
GPS_command_buffer[i++] = '0' + (j - 16*(j/16));
GPS_command_buffer[i++] = GPS_char_enter;
GPS_command_buffer[i++] = GPS_char_return;
GPS_command_buffer[i++] = 0;
}
-
Ну во-первых... Конечно, обычно компиляторы переделывают при возможности работу с массивами на работу с указателями, но более верно было бы
char *d=GPS_command_buffer;
*d++='$';
*d++='P';
*d++=....;
*d++=....;
....
Второе - это, конечно, преобразование числа в строку. Есть масса вариантов. Например, для ARM'а ниче так смотрится такое:
typedef unsigned long UREG32;
typedef unsigned long UREG;
char *i2a(char *s, UREG32 n)
{
UREG c;
char *res;
char *d=s;
do
{
UREG b=n%10; /* get next digit */
*s++=b+'0';
}
while ((n/=10)>0); /* delete it */
res=s;
while(c=*--s,d<s)
{
*s=*d;
*d++=c;
}
return res;
}
Функция печатает число в строку и возвращает указатель на следующий символ, т.е. в Вашем случае ее можно использовать так:
char *d=GPS_command_buffer;
*d++='$';
*d++='P';
*d++=....;
*d++=....;
d=i2a(d,call_freq);
...
Вообще, вопрос оптимизации процедуры печати десятичных чисел очень обширный. Я так, на вскидку, знаю еще пару более быстрых способов.
-
Как всегда спасибо за помощь и советы :) С указателями (и даже страшными указателями на функции ::)) чувствую, придется разбираться поплотнее, чтобы не просто думать что их "более менее понял", а активно использовать - иначе без них совсем как без рук :) Кстати, на каждую строку типа
GPS_command_buffer[i++] = '$';компилятор (почему-то) выдает мне warning, попробую Ваш вариант с указателями.
Прожую дома Ваши примеры :)
ЗЫ этот код как раз пишется для AVR, иначе вспомогательные переменные индексов я бы делал не char а разрядности регистров, например 32.
ЗЗЫ а преобразование числа в строку мне в этой задаче придется делать множество раз, поэтому было бы совсем хорошо иметь для этого одну красивую функцию ::)
-
ЗЫ этот код как раз пишется для AVR
...
поэтому было бы совсем хорошо иметь для этого одну красивую функцию
А, для AVR самый годный способ немного другой. Вечером положу пример. Правда, компилятор с оптимизацией справился не полностью, посему код был изготовлен полувручную - сначала был скомпилен сишный исходник, а потом допилен его асм-листинг.
Кстати, какой компилятор используете?
-
Спасибо за возню с моими блохами :) Компилятор WinAVR с официального сайта. Предпоследняя версия вроде, напишу как посмотрю её. Работаю в AVR Studio (но не последней, а предыдущей 4-й версии по моему - дома на компе посмотрю точнее, ибо в последней версии нет поддержки внутренним симулятором нужного камня - ....USB162..... четатам, дома уточню опять же :) )
-
Компилятор WinAVR с официального сайта.
Ну тогда сами регистры переименуете согласно соглашениям GCC о передаче параметров.
-
:) Я конечно буду признателен за допиленный ASM код этой функции для AVR, но на текущий момент я хотел бы отложить разбирательство в GCC соглашениях и использовании регистров, и ограничиться может не такой оптимизированной, но C - функцией, с которой надеюсь этот вопрос будет за кадром ::)
ЗЫ Я не то чтобы хочу Вашими руками и мозгами сделать свои задачи, конечно я хочу и буду писать сам и это и многое другое :) Вот Вы мне дали листинг этой функции для ARM, мне уже есть пища для подумать, и может дошлифовать её под AVR - насколько хватит ума, перед этим разобравшись в указателях и особенно методах её вызова ::) А если для сравнения дадите С функцию для AVR, да ещё если она будет отличаться сильно - будет ещё веселее :)
ЗЫ я подозреваю, что есть стандартные библиотеки типа std/io, где такие функции уже есть. Но по разным причинам хочется написать её самому (или разобраться с предложенной) ::)
-
А если для сравнения дадите С функцию для AVR, да ещё если она будет отличаться сильно - будет ещё веселее
Сильно по другому. Там другой алгоритм.
-
Другой алгоритм - это не страшно :) Я пока в восторге от лаконичности вызова
d=i2a(d,call_freq);при том, что я пока не понимаю детально совсем как он работает (сижу программирую у заказчиков на 1С, не могу даже отвлечься и вдуматься по уму) ::) Если метод вызова будет такой же или подобный, тоже удобный, то внутренний алгоритм получения разрядов может быть разным - он с точки зрения внешнего вызова за кадром :)
-
Перед осмыслением вышенаписанных функций - лирическое отступление - сказка/фантазияна тему "Как мы делили ОЗУ - много нас а оно одно!" ;D
Есть ОЗУ. Адрес/значение. Когда программировал на ASM - сам составлял модель разбиения его на блоки/сектора, время их заполнения, время когда они нужны и время когда их можно использовать под другие задачи - и при этом не был ограничен никакими рамками ::)
Есть C. Переменная/значение. И адрес, конечно. Или регистр ;D Ну допустим, условимся что адрес. Глобальные переменные сразу при определении отрезают у нас щедрый ломоть ОЗУ, который потом программа не сможет использовать ни подо что другое (если она конечно находится в здравом уме и светлой памяти, а не бежит, к примеру, по массиву когда он уже закончился ::) ). То есть, глобальные переменные сразу уменьшают свободный объем ОЗУ, которым может оперировать.... ээээээ.... компилятор - ведь мы же при программировании на С редко опускаемся до абсолютных значений адресов ОЗУ! Далее - локальные переменные. В оставшемся месте ОЗУ выделяется для них память, все хорошо. В любом месте функции я могу обратиться к ним по имени! Вызываю вложенную функцию... Формально это что? Rcall и ret? Однако, при этом вроде как сохраняются в стек регистры(?) и ТЕРЯЕТСЯ связь с переменными исходной функции по их именам! Но что делает компилятор если я во вложенной функции определяю новые переменные? Он нарезает для них место в ОЗУ, которое НЕ ЗАНЯТО переменными вызывающей функции - чтобы последние остались теми же после возвращения вызова! Однако, они есть - но обратиться к ним по именам мы не можем! (или я неправ?) А через указатели?..... Не знаю, надо думать :) Далее - что может моя вызываемая функция сделать полезного, кроме как вернуть значение БАЗОВОГО типа и поменять глобальную переменную? Тот же пример с числом в строку = массив символов. Функция не может вернуть массив. Хорошо, может заполнить массив и вернуть указатель на его начало! Но после выполнения функции её локальные переменные считаются очищенными - и этот массив тут же может затереться при последующих действиях в вызывающей функции! Может тогда определить в вызывающей функции локальную переменную - массив, и вызвать функцию, куда передать указатель на его начало, чтобы та функция его заполнила весь? Это то по крайней мере мне понятно, похоже на аналогию с глобальными переменными...
ЗЫ сумбурная лирика, понимаю.... Но мне все никак не удается сформировать у себя в голове красивую абстракцию, называемую "язык C"! :-[
ЗЗЫ такая ПРОСТЕЙШАЯ задача - преобразовать число в строку! У Керригана-Ритчи это азы букваря!.... С неё начинаются первые шаги!.... А я все никак не постигну :( .....
-
OFF
// Хорошо нам, тупым 1С-никам :)
Стр=Строка(Число);
// И свего делов-то
-
Да, всегда хорошо пользоваться инструментом, которым владеешь :)...
ЗЫ Будда в свое время был настолько целеустремленный, серьезный и бескомпромиссный, что однажды почувствовал суть и сказал - вот сейчас сяду под это дерево боддхи и буду сидеть до тех пор, пока не постигну суть! ::) И постиг! (По разным данным, сидя под деревом от 100 дней до 6-10 лет!) А я через полчаса собираюсь на каток опробовать новые коньки - а способ вызова и работу той функции с указателями из нескольких строчек так пока и не постиг ::) Куда уж тут на просветление рассчитывать....
ЗЗЫ Решился открыть К&R - глава "5.2 Указатели и аргументы функций" - и забрезжили первые признаки понимания.... Наверное, надо дальше почитать! ;D
-
Понял! :) Параметры в функцию передаются по значению, но мы всегда можем передать в функцию любое количество указателей на заранее объявленные переменные (как глобальные, так и в вызывающей функции, и даже в N-й функции уровня выше - транзитом через несколько функций ::) ), а в самой функции по этим указателям и читать и записывать значения соответствующих переменных! :) И +- от этих указателей вверх/вниз - имея в виду что это массивы и существуют (определены) соответствующие элементы! :)
Тогда предложенная строка вызова функции делает следующее - принимает текущий указатель на последний+1 элемент массива (который у нас глобальная переменная, но мог быть и локальной в вызывающей функции), добивает это массив дальше нужным количеством элементов и возвращает новое значение указателя последнего+1 элемента массива, который и присваивается переменной указателя в вызывающей функции! Кто-то скажет - просто! А я скажу - круто! ::)
ЗЫ если было бы надо добивать элементами 2 массива, надо было бы вернуть 2 новых указателя, а через возвращаемое значение это невозможно - но мы бы создали переменную в вызывающей функции, передали бы указатель на неё, в функции установили значение а после вызова прочитали бы в ней то что установила вызываемая функция! Победа разума над косной материей! ::) По этому поводу прошу поставить душевную песню - http://www.youtube.com/watch?v=X64Xw_avLLw :)
-
Передавать в функцию указатели на стековые пременные считается дурным тоном.
-
Ну вот.... А было так радостно от осознания наконец-то понятых возможностей :( Понимаю возможную занятость, но сразу возникают 3 вопроса:
1) что такое "стековая переменная"
2) почему это дурной тон?
3) а как же тогда?
-
Передавать в функцию указатели на стековые пременные считается дурным тоном.
Это еще почему??? О_о
-
Ну только плиз не надо в аськах-личках перетирать! ::) Если, конечно, не хотите сохранить тайну знания! ::)
-
Тут наверное имелась в виду классическая жопа типа такого:
int *foo(void)
{
int i=5;
return &i;
}
Так это не передача, а возврат указателя на локальную переменную. Сие конечно есть жопа.
-
Не, ну эту жопу даже я понимаю :) Какая же это тогда жопа! ;D Локальная переменная умерла после возврата из функции, а указатель не является ошибкой, но указывает.... на жопу ;D
Думаю, имелось в виду нечто другое, посерьезнее...
-
Стековые объекты существуют лишь в границах содержащего их блока. При выходе за его пределы автоматически вызывается деструктор. Разумеется, получение адреса стекового объекта - дело рискованное, если только вы абсолютно, стопроцентно не уверены, что этот указатель не будет использован после выхода за пределы области действия объекта. Все фрагменты наподобие приведенного ниже всегда считаются потенциально опасными:
{
int i;
foo f;
SomeFunction(&f);
}
Без изучения функции SomeFunction невозможно сказать, безопасен ли этот фрагмент.
SomeFunction может передать адрес дальше или сохранить его в какой-нибудь переменной, а по закону Мэрфи этот адрес наверняка будет использован уже после уничтожения объекта f. Даже если сверхтщательный анализ SomeFunction покажет, что адрес не сохраняется после вызова, через пару лет какой-нибудь новый программист модифицирует SomeFunction, продлит существование адреса на пару машинных команд и - БУМ!!! Лучше полностью исключить такую возможность и не передавать адреса стековых объектов.
PS я не сказал недопустимо, я говорил о дурном тоне, особенно в тимворке.
-
Жопа из серии "объекта уже нет, а указатель остался и указывает на жопу"... Понятно, что этого надо избегать. Но остается 3-й вопрос - как же тогда?! :-?
-
Без изучения функции SomeFunction невозможно сказать, безопасен ли этот фрагмент. SomeFunction может передать адрес дальше или сохранить его в какой-нибудь переменной
"Ну дай дураку в руки х.й стеклянный, он и вещь разобьет, и руки порежет." (ЦЭ) народная мудрость.
А вообще все эти писаки на тему "безопасного кода" ничего никогда не писали (в смысле программ). Так что не обращайте внимание, но всегда имейте четкое понимание возможных побочных эффектов функций. А то так можно договориться до того, что в классических функциях WinAPI ReadFile и WriteFile надо для возврата количества обработанных данных всегда заводить статическую переменную, а то вдруг ;D
Но остается 3-й вопрос - как же тогда?!
Как всегда. "ЗубовВолков бояться - в ротлес не даватьходить" (ЦЭ) там же.
-
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fs4.images.drive2.ru%2Fuser.blog.photos%2F1860%2F000%2F000%2F000%2F941%2F88cb672e461e92e0-main.jpg&hash=8ba4d343a7578ebe5b7c1cfd6eb0f62e381256c5)
Навскидку ничего более красочно характеризующее вышеописанную ситуацию не нашел :)
-
Вести с полей :) Спасибо за науку - переписал покрасивее. Только 1.5 момента: говорят, можно более красиво выделять 16-ричные разряды чем в лоб делением на 16, и второе - моя так горячо любимая функция int_to_string (которую я писал на ассемблере безо всяких сложностей - именно по такому же принципу как здесь) - не хочет вычислять при параметре >=int/2, хотя я делаю только вычитание! То есть, 32767 прожевывает, а 32768 - нет! Придется смотреть что там сделал компилятор ::)
ЗЫ нет, мне конечно хватит и 32767, но хочется написать универсально на все времена ::)
//-----------------------------------------------------------------------------------------------
char *int_to_string(char *s, int n)
{
int orders[] = {10000, 1000, 100, 10, 0};
int *order = orders;
char *begin = s;
char digit;
while(*order)
{
digit = 0;
while (n >= *order)
{
n = n - *order;
digit++;
}
if(digit || s!=begin) *s++ = '0' + digit;
order++;
}
*s++ = '0' + n;
return s;
}
//-----------------------------------------------------------------------------------------------
char *GPS_end_of_string(char *begin, char *end)
{
char *d;
char chek_summ = 0;
for(d=begin+1; d<end; d++) chek_summ = chek_summ^*d;
*d++ = GPS_char_multiply;
*d++ = '0' + chek_summ/16;
*d++ = '0' + (chek_summ - 16*(chek_summ/16));
*d++ = GPS_char_enter;
*d++ = GPS_char_return;
*d++ = 0;
return d;
}
//-----------------------------------------------------------------------------------------------
void GPS_send_command_RMC_call_freq(int call_freq)
{
//$PMTK314,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*2D<CR><LF>
char i;
char *d = GPS_command_buffer;
*d++='$';*d++='P';*d++='M';*d++='T';*d++='K';*d++='3';*d++='1';*d++='4';*d++=',';*d++='0';*d++=',';
d = int_to_string(d, call_freq);
for (i=0; i<17; i++)
{
*d++ = ',';
*d++ = '0';
}
GPS_end_of_string(GPS_command_buffer, d);
}
//-----------------------------------------------------------------------------------------------
-
Написал
char *int_to_string(char *s, unsigned int n)и все заработало. А я как наивный чукотский парень думал что по умолчанию всегда unsigned ::)
-
Я еще вот что рекомендую. Вот это
int orders[] = {10000, 1000, 100, 10, 0};
стоит сделать хотя бы static int.
-
Я догадывался, что надо с этим фактически константным массивом что-то такое написать, чтобы это явно показать. Но я по глупости написал const, компилятор заругался и я решил оставить эту затею :)
ЗЫ надо бы расписать на бумажке на досуге какие бывают переменные и области их видимости и действия. Например, командир мне недавно открыл глаза на то, что если я определяю константный массив - от пишется во флеш, но при компиляции создается его КОПИЯ В ОЗУ, с которой и происходит работа! Но есть какие-то хитрые директивы из центра, которые позволяют НЕ СОЗДАВАТЬ эту копию, а работать с константами напрямую читая их из флеша ::) А у меня в этом проекте как раз ОЗУ мало, а длинных строковых констант много :)
-
Для GCC в инкарнации для AVR курите тут - http://www.nongnu.org/avr-libc/user-manual/pgmspace.html
Через жопу, конечно, я бы только из-за этого использовал бы IAR.
-
- сыночек, да чтож ты суп-то руками!....
- кто обкурился? Я обкурился?!
;D Это я к тому, что буду курить, спасибо :)
-
Кстати, если в проце есть аппаратный умножитель, то довольно быстро (скорее всего с меньшим количеством накладных расходов) можно получить итерации так
unsigned short order=10000;
...
...
order=(((unsigned long)order*6554)>>16);
...
Правда, там тонкость, эта штука вместо последнего 0 дает 1, так что надо изменить проверку.
-
:) Если уж совсем честно, то в целях минимизации
накладных расходов
в свое время на ассемблере я даже массив не заводил и порядки в него не засовывал :) Я просто определил 4 числовые константы: 10000, 1000, 100 и 10 и 4 одинаковые короткие секции asm кода у меня шли подряд и дублировались - а в каждом я вычитал из регистра константу :) Так же можно было бы и тут написать - это я просто сделал "по-программистски", с претензией на масштабируемость :)
ЗЫ а поначалу я на asm тоже получал каждый порядок перемножением 10-к (через сложение, естественно :) ), но овчинка выделки не стоила :)
ЗЗЫ я сейчас пытаюсь массив порядков во флеш засунуть и оттуда читать :) зачем внутри кода считать то, что можно посчитать заранее?
(С) командир ::)
-
В Вашем последнем коде я правильно догадываюсь, что директива
(unsigned long)относится к результату операции
order*6554и таким образом приводит этот результат к указанному типу - unsigned long? Единицу то потом можно прибавить, только лучше ПЕРЕД вычитанием каждого порядка - я правильно догадываюсь, чтобы в минус не залезть? ::)
-
Попробовал так сделать на С и посмотреть что сделает компилятор - вроде все правильно, CP/CPC и т.д., но что-то не лаконично :) У меня это выглядело вот так (кусок из общего кода)
; для десятичной системы исчисления
.equ _SI_order = 10 ; для десятичной системы исчисления при выводе результатов
;.equ _max_length_SI = 5 ; макс. разрядность чисел в _SI_order
.equ _SI_order_0 = 1
.equ _SI_order_1 = _SI_order
.equ _SI_order_2 = _SI_order_1*_SI_order_1
.equ _SI_order_3 = _SI_order_2*_SI_order_1
.equ _SI_order_4 = _SI_order_3*_SI_order_1
.............................................................
.............................................................
.............................................................
;;--------------------------------------------------------------------
DECIMAL_value_KOI_8:
; _r_t1_hb:_r_t1_lb - остаток от числа, _SI_order-ичный разряд которого надо получить
; _r_count_measure_time_hb:_r_count_measure_time_lb - число _SI_order в нужной степени
; результат - в _r_transmit_data (и уже +$30 к цифре для получения её кода KOI-8)
clr _r_transmit_data
DECIMAL_value_KOI_8_1:
cp _r_t1_lb, _r_count_measure_time_lb
cpc _r_t1_hb, _r_count_measure_time_hb
brlo DECIMAL_value_KOI_8_END
sub _r_t1_lb, _r_count_measure_time_lb
sbc _r_t1_hb, _r_count_measure_time_hb
inc _r_transmit_data
rjmp DECIMAL_value_KOI_8_1
DECIMAL_value_KOI_8_END:
ldi _r_mom, $30 ; свиг для кода KOI-8 цифры
add _r_transmit_data, _r_mom
ret
;--------------------------------------------------------------------
.............................................
.............................................
.............................................
;--------------------------------------------------------------------
VALUE_transmit_RS232:
;_r_t1_hb:_r_t1_lb - на комп по RS232 в десятичной системе с запятой
;_r_count_measure_time_hb:_r_count_measure_time_lb - _SI_order
;_r_transmit_data - который потом шлем на комп по RS232
ldi _r_count_measure_time_lb, low(_SI_order_4)
ldi _r_count_measure_time_hb, high(_SI_order_4)
rcall DECIMAL_value_KOI_8
rcall DATA_transmit_RS232
ldi _r_count_measure_time_lb, low(_SI_order_3)
ldi _r_count_measure_time_hb, high(_SI_order_3)
rcall DECIMAL_value_KOI_8
rcall DATA_transmit_RS232
ldi _r_count_measure_time_lb, low(_SI_order_2)
ldi _r_count_measure_time_hb, high(_SI_order_2)
rcall DECIMAL_value_KOI_8
rcall DATA_transmit_RS232
; запятая
ldi _r_transmit_data, KOI_8_comma
rcall DATA_transmit_RS232
ldi _r_count_measure_time_lb, low(_SI_order_1)
ldi _r_count_measure_time_hb, high(_SI_order_1)
rcall DECIMAL_value_KOI_8
rcall DATA_transmit_RS232
ldi _r_count_measure_time_lb, low(_SI_order_0)
ldi _r_count_measure_time_hb, high(_SI_order_0)
rcall DECIMAL_value_KOI_8
rcall DATA_transmit_RS232
ret
;--------------------------------------------------------------------
-
Поигрался ещё - это попытка сделать аналогию с asm... Только тут остаток от исходного числа передается по ссылке через ОЗУ, а в примере выше - насквозь через регистр :) В той задаче я, кстати, вообще умудрился обойтись без ОЗУ, но 8-битных регистров хватило почти впритык ;D
//-----------------------------------------------------------------------------------------------
char count_of_order(unsigned int *n, unsigned int order)
{
char res = 0;
while (*n >= order)
{
*n = *n - order;
res++;
}
return res;
}
//-----------------------------------------------------------------------------------------------
char *int_to_string(char *s, unsigned int n)//n_value)
{
char *begin = s;
char digit;
//unsigned int n = n_value; зараза, так тоже работает,
//используя указатель не на внутреннюю переменную а на входящий параметр :)
if((digit = count_of_order(&n, 10000)) || s!=begin) *s++ = '0' + digit;
if((digit = count_of_order(&n, 1000)) || s!=begin) *s++ = '0' + digit;
if((digit = count_of_order(&n, 100)) || s!=begin) *s++ = '0' + digit;
if((digit = count_of_order(&n, 10)) || s!=begin) *s++ = '0' + digit;
*s++ = '0' + n;
return s;
}
//-----------------------------------------------------------------------------------------------
-
Ну кто там писал
Стр = Строка(Число);? Или, к примеру Стр = "" + Число; Я, кстати, всегда пишу Стр = СокрЛП(Число);, хотя результат одинаковый, но привычка использовать СокрЛП отсекает пробелы по сторонам, а часто это бывает нужно :)
-
Да-да, давай научим их как надо программировать :)
-
Используя команду "РассчитатьРегистрыВ(....)" :) Ведь логично, если есть "РассчитатьРегистрыНа(....)" и "РассчитатьРегистрыПо(....)" сделать и "В" ;D
.... и "Через(.....)" ;D
-
Кстати, хотел тут было убить 2-х зайцев - с помощью новой функции
count_of_order(unsigned int *n, unsigned int order) считать не только порядки десятичных разрядов, но и выделять шестнадцатиричные разряды контрольной суммы ;) Все вроде бы хорошо, но! Компилятор выдал не ошибку а предупреждение - указатель не на тот тип. У меня контрольная сумма типа char, а функция принимает указатель на int! :) Если бы функция принимала САМ int, произошло бы преобразование типов, и все бы хорошо выполнилось :) А так - вместо моего 8-битного char контрольной суммы в функцию попадет ещё и неизвестно какой рядом лежащий байт, и функция честно воспримет это как входящий int! Вот это, насколько я понимаю, уже настоящая жопа, хорошо что додумался :) Резюме - преобразование типов дело хорошее, но с указателями такое проделывать нельзя ::)
В результате пришлось завести фиктивную переменную типа int, присвоить ей посчитанный char и на этот int уже передать указатель...
-
В результате пришлось завести фиктивную переменную типа int, присвоить ей посчитанный char и на этот int уже передать указатель...
Не понял. А сделать просто указатель на char вместо int?
-
Прикол в том, что моя вызываемая функция принимает в качестве параметра указатель на int. Можно написать её дубль, принимающий указатель на char :) Просто при передаче параметра в лоб по значению, я бы принимал int а передавал int или char - а функция была бы одна... Неужели я ошибаюсь в своих мыслях?
ЗЫ или Вы про хитрый прием - принимать в функции указатель на char, а значение int получать сложением СЛЕДУЮЩЕГО адреса - как старшего байта в переменной int? Но имхо - это уже похоже на заход с черного хода :) Так можно конечно передавать и long через указатель на char - младший байт, а старшие выгребать инкрементированием этого указателя - интересный прием, но не знаю насколько он устойчив :)
-
Я что-то запутался. Покажите весь код.
-
Функция count_of_order и вызов её с указателем на int
//-----------------------------------------------------------------------------------------------
char count_of_order(unsigned int *n, unsigned int order)
{
char res = 0;
while (*n >= order)
{
*n = *n - order;
res++;
}
return res;
}
//-----------------------------------------------------------------------------------------------
char *int_to_string(char *s, unsigned int n)
{
char *begin = s;
char digit;
if((digit = count_of_order(&n, 10000)) || s!=begin) *s++ = '0' + digit;
if((digit = count_of_order(&n, 1000)) || s!=begin) *s++ = '0' + digit;
if((digit = count_of_order(&n, 100)) || s!=begin) *s++ = '0' + digit;
if((digit = count_of_order(&n, 10)) || s!=begin) *s++ = '0' + digit;
*s++ = '0' + n;
return s;
}
//-----------------------------------------------------------------------------------------------
Нужна фактически та же функция, но для char
//-----------------------------------------------------------------------------------------------
char *GPS_end_of_string(char *begin, char *end)
{
char *d;
char chek_summ = 0;
unsigned int int_chek_summ;
for(d=begin+1; d<end; d++) chek_summ = chek_summ^*d;
int_chek_summ = chek_summ;
*d++ = GPS_char_multiply;
*d++ = '0' + count_of_order(&int_chek_summ, 16);
*d++ = '0' + int_chek_summ;
*d++ = GPS_char_enter;
*d++ = GPS_char_return;
*d++ = 0;
return d;
}
//-----------------------------------------------------------------------------------------------
-
Ааа, так Вы хотели одновременно с вместе со всей генерацией данных считать контрольную сумму? Зря. Хуже будет по итогам.
-
Вопрос подсчета контрольной суммы оказался случайно - просто пример, когда нужно вызвать одну функцию с аргументами разного типа. А так - да, я оба разряда 16-ричных контрольной суммы ЧАСТИ всей строки посылки помещаю в саму строку и даже enter и return в конце и 0 - для облегчения работы процедуры обработки прерывания посылки по USART-у. Наличие этих разрядов контрольной суммы в посылке требует формат протокола обмена данными с модулем GPS. И я да - сначала забиваю всю строку. а потом пробегаю по ней и считаю контрольную сумму. Имхо, это проще, чем считать её во всех вложенных функциях при заполнении строки.
-
Собственно, попытаюсь выразить свои мысли по этому поводу в следующей небольшой зарисовке под названием "Указатели и ОЗУ - уровни абстракций" :)
Итак, ОЗУ. Для начала рассмотрим 8-битные AVR. Каждая ячейка ОЗУ - один байт, имеет некий адрес - физический и абсолютный, который, допустим, имеет длину 2 байта (зависит от размера ОЗУ), но в принципе это не главное - это имеет значение только когда мы этот адрес будем куда-то помещать и хранить-передавать. Для простоты будем писать адрес десятичным числом (хотя программисты привыкли к 16-ричному представлению :)) Вот и все. При написании на asm можно как угодно это использовать.
Что же нам предлагает С? Вводится понятие указателя. Причем, на определенный тип. Что это значит? Имхо, это "всего навсего" значит - как извлекать значение и как инкрементировать указатель. Например, беру указатель некоей переменной типа char. Компилятор знает, что он положил эту переменную в ячейку ОЗУ (которая как раз 8-битная) с номером 915. Числовое значение указателя = 915 (тип int). Если я теперь пытаюсь получить значение переменной по этому указателю, компилятор запросит значение этой ячейки ОЗУ и выдаст её содержимое. Если я определяю переменную типа массив char, то компилятор располагает её в одной области ОЗУ, так что все элементы идут последовательно по адресам. В принципе, это не единственный способ определить массив в ОЗУ, но так с ним гораздо проще работать. В этом случае, если наш указатель на ячейку с номером 915 указывает на 0-й элемент массива, то прибавив к указателю 1-цу мы получим 916 - адрес 1-го элемента массива, и таким образом можем перебирать элементы (собственно, так это на самом деле и происходит :))
Теперь возьмем указатель на int. Int у нас лежит уже в 2-х ячейках ОЗУ. Но само числовое значение указателя будет то же самое по разрядности. Указатель (в своем числовом значении) будет хранить адрес младшего байта нашей переменной. А компилятор будет знать, что раз это указатель на int, то чтобы взять значение переменной, надо младший байт прочитать из ячейки с номером указателя - 915, а старший из следующей - 916. Хотя сам указатель будет хранить всегда числовое значение адреса одной ячейки ОЗУ. Если же мы определим указатель на массив int, то мы так же можем перебирать элементы массива, инкрементируя указатель - но в данном случае наш умный компилятор, зная что это указатель на int, будет инкрементировать его не на следующий байт ОЗУ а через байт - на ячейку 917, хотя мы указали инкрементирование на 1-цу! То же самое происходит и со структурами, и с массивами структур и вообще с любыми объектами в ОЗУ. Всего 2 вещи: указатель всегда содержит адрес одной ячейки и компилятор помнит насколько его надо увеличить, чтобы получить следующий элемент.
А теперь самое интересное - возможные следствия этого ::) Абсолютное значение любого указателя - одно и то же по типу и разрядности - наши пресловутые 915. Но с этого адреса мы можем извлечь из памяти и char, и int, и вообще любое значение любого типа :) Весь вопрос в том - осознанно ли мы это делаем или нет :) Например, определив указатель на массив типа int, мы можем присвоить его значение (те же 915) другому указателю на char. И получить по значению этого указателя младший байт переменной int. А при последовательном инкрементировании этого указателя мы возьмем старший байт (из ячейки 916), потом младший байт следующего элемента (917) и т.д. :) Потому что наш умный компилятор будет знать, что раз это указатель на char, то инкрементировать его надо на 1-цу а не через байт :) Или, например, мы взяли указатель на переменную char, присвоили его значение указателю на int и читаем по нему. Младший байт прочитается из ячейки char а старший - из следующей, где в это время может лежать совершенно что угодно. Это все упирается в философский вопрос о том, знаем ли мы что находится в ОЗУ когда читаем оттуда по адресам.
Когда же может произойти "переопределение типа" указателя? При прямом присваивании значения указателя одного типа другому, при передаче в качестве параметра в функцию, при чтении значения указателя из переменной и т.д., подозреваю что способов много. Неприятные последствия этого очевидны - мы читаем из ОЗУ или пишем в него совсем не то и не по тем адресам, что мы думаем там находится. Выше приведенный пример с вроде бы красивым обращением к разным байтам длинных переменных по указателям char с одной стороны подкупает своей стильностью, но я бы не советовал пользоваться такими методами. Потому что, например, при переносе кода на 32-разрядные системы, все может поломаться совсем :) Потому что там char и int могут храниться в одной и той же 32-разрядной ячейке ОЗУ. А если система позволяет, то компилятор может вообще засовывать переменные char в разные группы разрядов 32-битной ячейки ОЗУ - хоть 4 в одну, имея в виду векторный адрес переменной (адрес ячейки + адрес байта: 0,1,2,3).
Проще говоря - заранее не зная, между какими структурами ОЗУ будет переноситься ваш код, подобные хитрости с указателями лучше не применять. Да и вообще, имхо их лучше не применять - чтобы жизнь была проще! ::)
ЗЫ ну что, похож я на писателя книг по устойчивому кодированию, который ни одной программы в жизни не написал? ::)
-
А при последовательном инкрементировании этого указателя мы возьмем старший байт (из ячейки 916), потом младший байт следующего элемента (917) и т.д.
Забыл еще одни грабли endianness или порядок упаковки байтов, даже при одной разрядности системы.
Intel/Motorola little-endian/big-endian.
http://en.wikipedia.org/wiki/Endianness
-
Точно, блин - ещё же и little-endian/big-endian! :) В общем, хватает особенностей разных ОЗУ, чтобы не лезть туда напрямую а оставить это компилятору, но при этом не вводить его в заблуждение переопределением типов указателей ::)
-
Также, разрядность int зависит от среды программирования, может быть любая, от 8 (забыли про 4х битные процессоры) и до ...!
Для конкретной разрядности пользуйся типами
int8_t/uint8_t
int16_t/uint16_t
int32_t/uint32_t...
-
Спасибо, я в конце концов так и хотел потом сделать - дошлифовать код напильником (в нормальном текстовом редакторе, где есть автозамена, групповое назначение-снятие комментариев, автоформатирование и т.п. - например, 1С :) ), добавить везде unsigned, где надо - static и т.п. Но оказалось (на примере функции перевода числа в строку), что unsigned надо добавлять сразу, а то работает до половины int ::) Так что, действительно, наверное лучше сразу по возможности писать всё как надо :)
-
Вести с полей с граблями :)
В результате определенной исследовательской работы выяснилось, что в таблице символов заглавные латинские буквы 'A', 'B' и т.д. идут не сразу за символами цифр '8', '9' а через некоторое расстояние, в связи с чем функцию преобразования числа в шестнадцатиричное строковое представление придется таки написать отдельно и сделать немножко поинтеллектуальнее амебы ::)
ЗЫ хорошо ещё, что 1-2-3 и А-B-C по порядку идут и 0 перед 1 а не после 9 - а то от этих.... таблиц всего ожидать можно ::)
-
Продолжение прогулки по граблям... Из-за своего упрямства и тупости потерял много времени выискивая ошибки - а у меня почти везде не было написано unsigned - и переменные залезали в минус, причем не всегда, а непредсказуемо! Уколебался выискивать эти моменты! >:( Впредь будет мне идиоту наука - писать сразу правильно, как советуют добрые люди!... Вот дебил-то, блин!...
-
Очередная сказка - "Про статическое и динамическое распределение ОЗУ." ::)
Глобальные и статические переменные с боем отвоевали свое право жить вечно в своих областях ОЗУ. Динамические переменные рождаются и умирают - совсем как мы с вами. В любом месте итогового hex кода у нас используется определенное количество ОЗУ. Начнем с гипотетического примера - пусть у меня в задаче есть только 2 функции, которые делают абсолютно никак друг с другом не связанные вещи. Одна для своей работы забирает 250 байт ОЗУ под локальные переменные, вторая - тоже 250. Вопрос - каковы мои максимальные претензии на ОЗУ? Если они вызываются по очереди, то это будет: глобальные переменные (допустим 16 байт) + все регистры (поскольку они сохранятся в ОЗУ при вызове функции), допустим, 64 байта + 250 байт = 330 байт. Я прав? Ничего не забыл? Ничего там больше компилятор без моего ведома внутреннего/служебного/закадрового/для облегчения себе работы не создаст и не затребует под это ОЗУ? Если мои предположения верны, то функция занятого ОЗУ от времени (хода кода) буде выглядеть так: 16 - 16 -330 - 330 - 16 -.... Если же я вдруг внутри одной функции решу вызвать вторую, то уже мои максимальные претензии на ОЗУ будут 16 + (64 + 250) + (64 + 250) = 644 байта. А функция использованного ОЗУ примерно будет такая: 16 - 330 - 330 - 644 - 644 - 330 - 16 - .... Очевидная жо следствие: если у нас аппаратно всего 512 байт ОЗУ то в первом случае все хорошо, а во втором мы не вписываемся в аппаратные ограничения.
Это был простейший пример. В реальности функций гораздо больше, но сути это не меняет - в каждый момент времени (шага кода) у нас однозначно определена функция количества требуемого ОЗУ. И мы можем всегда посчитать её максимальное значение чтобы гарантировано знать что влезем в ОЗУ при любых раскладах? Хрен там! :) Тут на сцену выходят 2 засады - рекурсия и прерывания ::)
Рекурсия - крутая вещь. Но количество вложенных вызовов при выполнении кода определяется входными данными и компилятор заранее при компиляции не может их посчитать! Поэтому не знает, сколько раз вызовется рекурсивно функция (в общем случае это количество ничем не ограничено!) и соответственно, определить максимальные претензии по ОЗУ. А мы как люди сами можем? В принципе да, принимая во внимание самый худший вариант входных данных, которые приведут к вызову рекурсии и будучи уверенными, что у нас никогда не встретятся данные, которые вызовут рекурсию большее количество вложенных раз. Но в нетривиальном коде сделать это также нетривиально, особенно учитывая неявные рекурсии - когда функция вызывает себя не напрямую, а через несколько других функций.
Прерывания - отличная вещь! Но при вызове сохраняются регистры в стек + процедура обработки прерывания запросто может предъявить претензии на ОЗУ. Учитывая многообразие прерываний, их возможную вложенность (!, правда не везде) и т.д., можно ли определить их максимальные претензии на ОЗУ? Не знаю! Правда, не знаю. Может и можно, допустив, что все они произошли условно одновременно, но только единожды (где это возможно), или произошло максимально требовательное к ОЗУ (где нет вложенности прерываний) - тут наверное можно рассуждать так. Хотя ощущения гарантии НЕ превышения некоего определенного количества затребованного ОЗУ при любом случае внешних прерываний у меня нет!.... :-[
К чему весь этот очередной длинный монолог? У меня мало ОЗУ, я вынужден об этом думать. Точнее, в итоговом проекте будет камень с бОльшим ОЗУ, но командир сказал - мне надо, чтобы твоя задача гарантированно укладывалась в ХХХ ОЗУ! Потому что у него таких задач много, и он должен быть уверен, что запустив, к примеру, одновременно а не последовательно задачи получения GPS координат и отправки их же по SMS через GSM модуль - он не упрется в ограничение по ОЗУ. И я его хорошо понимаю ::)
Собственно, вопросы :) Мой компилятор при билде проекта показывает количество используемого ОЗУ и проценты от общего. Он это делает корректно? Как я написал выше? Но не учитывая рекурсии и прерывания? Есть ли у меня гарантия, что если он написал - 95%, то всё будет хорошо всегда, если у меня нет рекурсий (явных и неявных) а максимально прожорливое прерывание требует 4% ОЗУ?
И конечно, как всегда, общий вопрос - что делать и кто виноват что скажете на эту тему, господа доктора? ::)
ЗЫ и ещё вопрос - я ещё не заколебал вас всех обоих своими монологами и вопросами? Просто я нахожусь в этом потоке и хочется делиться мыслями и слушать в ответ ::)
-
Мой компилятор при билде проекта показывает количество используемого ОЗУ и проценты от общего. Он это делает корректно? Как я написал выше? Но не учитывая рекурсии и прерывания?
GCC показывает только суммарный размер сегментов данных. Остальное в GCC отводится на стек (и на кучу, но ею Вы вряд ли пользуетесь). Попытки посчитать макс. размеры стека он не делает.
Есть ли у меня гарантия, что если он написал - 95%, то всё будет хорошо всегда, если у меня нет рекурсий (явных и неявных) а максимально прожорливое прерывание требует 4% ОЗУ?
Нет, конечно. Использование стека собственно функциями не учитывается.
-
ЗЫ и ещё вопрос - я ещё не заколебал вас всех обоих своими монологами и вопросами? Просто я нахожусь в этом потоке и хочется делиться мыслями и слушать в ответ
Так мы тут вроде отвечаем :) Значит, пока терпим ;D
-
Значит, все ещё хуже, чем я предполагал ::) Придется думать и считать самому ;D (это я про подсчет максимального требуемого ОЗУ и что компилятор тут совсем не помощник :) )
-
Ну я Вам могу вот что посоветовать. Т.к. регистр SP доступен без особых проблем (без использования ASM'а), то в самой объемной по стеку процедуре обработки прерывания сделайте такое
volatile unsigned int min_stack=0xFFFF; //Глобальная переменная
.....
процедура прерывания:
...
{
unsigned int sp=SP;
if (sp<min_stack) min_stack=sp;
}
...
А потом попечатайте в отладке min_stack.
Я только не помню, в инклудах у GCC SP описан как двухбайтовая переменная, или как однобайтовая. Если второе, то sp надо будет скомбинировать из SPL и SPH (младшего и старшего байта указателя стека).
-
Интересно... Нагрузить максимально задачами МК и засекать куда максимально заходит стек, ибо его поинтер всегда доступен? А вне процедуры обработки прерывания? Хотя, я могу от таймера прерывания инициализировать и именно для этой задачи - контроля SP ::) Действительно, интересный вариант. Надо будет его обдумать и попробовать реализовать.
-
А вне процедуры обработки прерывания?
А смысл? Интересно же максимальное значение, а оно суть макс. глубина стека по обычным функциям плюс самое жирное прерывание (ну если Вы там конечно с вложенными не бодаетесь).
Да в общем можно и в начало каждой функции такой контроль вставлять.
-
Хоть в одном меня радует что этот проект на AVR - что аппаратно невозможны вложенные прерывания ::) И самое жирное всё определяет :)
А насчет такого контроля в начале каждой функции - действительно классная идея - код маленький, ресурсов требует мало, выполняется быстро, польза есть :) Круто, блин! ::) Спасибо.
ЗЫ я не могу гарантировать, что самое жирное прерывание у меня придет когда я своими функциями максимально забью стек, но искусственно создав самую жадную до стека ситуацию со своими функциями и посчитав максимальное положение стека, я могу потом просто плюсануть к нему заранее посчитанное количество на максимально прожорливое прерывание ::)
-
Только одна тонкость есть. Например, IAR в начале любой функции сразу отъедает от стека столько, сколько понадобится в функции. Так ли делает GCC - сказать не могу. Посматривайте в код на всякий случай.
-
Хоть в одном меня радует что этот проект на AVR - что аппаратно невозможны вложенные прерывания
Но их можно организовывать руками, разрешая прерывания в обработчике прерываний ;)
-
Можно, но я в своем блоке по крайней мере так не буду делать :) Насчет отъедания стека в начале или по ходу - действительно, надо будет проверить, спасибо.
Только что вернулся от командира с тяжелой головой :) Воткнули мой блок в шаблон проекта, с диспетчером задач, библиотеками ввода-вывода и т.п. и залили в железо - уже готовая плата с GPS модулем, с выходом на комп по USB. Попробовали слать команды и читать через терминал отладочную печать :) Нихрена как надо не работает, но зато теперь буду пытаться сам уже все это дело в железе ковырять, а не просто в симуляторе AVR ::)
-
Работает! Мой драйвер GPS модуля на С - работает! :) Цветы, подарки - кладите уже куда нибудь и проходите, буду хвастаться! ;D
ЗЫ отладочная печать - капризная штука, именно она мешала моей программе работать! ;)
-
Ну а теперь рекомендую попробовать потыкать пинцетом в линию, по которой идут данные от модуля в Ваш проц и посмотреть устойчивость к ошибкам.
-
Эээээ...... в буквальном смысле? ::) Чтобы "навести помехи на линию" и посмотреть как мой алгоритм разборки входящего буфера справится с корявыми посылками? ;)
Пока страшно что-то тыкать, там же от одной ноги МК на него питание подается когда надо (кстати - не работало ТОЛЬКО из-за того, что забыл раскоментарить инициализацию этой ножки как выхода - и на модуль просто не поступало питание ::). А, ну и ещё коды enter и return перепутал, или их порядок что за чем идет обычно - я их до сих пор путаю, просто переставил местами прямо в #define ::)) Сейчас пока помучаю его разными вариантами вызова - частотой и интервалом выдачи данных :) Но потом конечно надо потыкать и пинцетом и вообще - чтобы проверить код на устойчивость.
-
Эээээ...... в буквальном смысле?
В буквальном. Пинцетом покорить линию на землю, например. Только осторожно со статикой и обычной историей с незаземленными компами и прочими устройствами с импульсными источниками питания.
-
Тыкание наверное отложу до командира - вместе с ним будем тыкать. Хотя, я более менее спокоен за алгоритм разбора - уж его-то я в симуляторе как только не проверял с разными тестовыми входными данными, плюс ещё контрольную сумму посылки проверяю :) Но посмотрим...
-
Вы будете смеяться - но после GPS модуля, командир параллельно с драйвером GSM модуля выдал мне ТЗ на следующее :)
Сервопривод шагового двигателя
техническое задание
Функциональные возможности программы:
1. Автоматический выбор программой режима работа: полношаговый, полушаговый или микрошаговый (дробление шага).
2. Максимальная скорость вращения — не менее 5000 шагов в секунду.
3. Максимальное количество шагов на оборот — 255.
4. Количество микрошагов в шаге — 128. Допустимо снижение кол-ва микрошагов до 64 или 32 в случае, если это будет обусловлено требованиями регулировки тока в обмотках.
5. Частота ШИМ режима микрошага или регулировки тока - за пределами звуковых частот, дабы избежать режущих слух высокочастотных составляющих.
6. Возможность работы как в режиме установки требуемого углового положения (значение берется из входного канала IN0 — угловое положение), так и в режиме "вращение" без контроля углового положения. Выбор режима "вращение" осуществляется с помощью подачи на вход канала IN0 (угловое положение) служебного сигнала "Канал дезактивирован".
7. Контроль тока через катушки двигателя с помощью обратной связи (датчика тока на резисторе) и регулировка данного тока с помощью ШИМ для удержания тока текущего режима (разгон, поддержание скорости, торможение, удержание) в заданном пределе. Точность задания тока не хуже 5% от максимально допустимого (при максимуме в 2А — 100мА).
8. Индикация технического состояния сервопривода с помощью светодиода. Режимы работы светодиода:
· горит непрерывно – работоспособное состояние;
· мигает – обрыв в цепи обмотки ШД либо неисправны силовые узлы на плате сервопривода, иными словами - отсутствие тока в одной или нескольких обмотках ШД;
· не горит – нет питания либо неисправен (неработоспособный) сервопривод.
9. Измерение и выдача температуры платы сервопривода с периодичностью не реже раз в 5 сек.
Входные каналы:
- (IN0) задание углового положения, обороты (знак определяет направление);
- (IN1) задание скорости вращения шпинделя, обороты в секунду (знак определяет направление);
- (IN2) задание ускорения (разгонная/тормозная характеристика для выхода на заданную скорость), обороты/секунду2;
- (IN3) количество полюсов (шагов) на оборот;
- (IN4) задание тока вращения, амперы;
- (IN5) задание тока разгона и торможения, амперы;
- (IN6) задание тока удержания, амперы;
- (IN7) значение, загружаемое в качестве значения текущего углового положения шпинделя при подаче бинарного сигнала "УСТАНОВ"
- (SET) бинарный сигнал "УСТАНОВ", активный уровень — низкий.
Выходные каналы:
- (OUT0) текущее угловое положение (*) (размерность соответствует IN0);
- (OUT1) текущая скорость вращения шпинделя (размерность соответствует IN1);
- (OUT2) текущее ускорение (размерность соответствует IN2);
- (OUT3) текущий ток потребления, амперы;
- (OUT4) температура платы, градусы Цельсия;
(*) – Во всех режимах выдавать текущее положение вала. При работе в режиме "вращение" при достижении конца разрядной сетки представления числа следует выводить служебный код "Авария на канале". В случае начала обратного вращения (возврат к рабочему диапазону представления чисел) продолжить работу канала в нормальном режиме.
Причем, написать это надо обязательно именно на ассемблере (с контролем количества тактов на все операции :) ) на Atmega48P(A).
Применяться это будет в системах промышленной автоматики. Так что все-таки я решу сабжевую задачу топика, без Ардуины на asm, хоть и далек от идеи применять это в качестве "песпективы примочкостроения" ::)
-
Причем, написать это надо обязательно именно на ассемблере (с контролем количества тактов на все операции ) на Atmega48P(A).
А смысл писать это на асме? У меня товарищ делает на таких процах частотник для асинхронных двигателей с обратной связью через энкодеры, причем, на входе он получает чуть ли не G-код, т.е. сам занимается интерполяцией и прочим. И ничего, никаким асмом там особо и не пахнет, все успевает.
-
Не, разумеется можно написать на С, откомпилировать и сказать что писал на асме :) Просто я на асме постоянно сталкивался с задачей контроля количества тактов - например, чтобы каждый проход цикла, независимо от выполнения различных ветвистых внутренних условий и действий по ним, выполнялся всегда за строго определенное количество тактов, и т.п. И подобные вещи конечно придется писать на асме или редактировать полученный после компилятора код - а мне кажется, что первое проще :) Хотя, может люди умеют такие вещи и на С через компиляторы делать :)
ЗЫ меня тут обрадовало недавнее "открытие" - я пишу а = в;
где а и в - переменные одного типа, и всё выполняется! ::) Казалось бы, что тут удивительного? Да, но это вроде как (насколько смог проверить) выполняется и в случае, если а и в - структуры, многие поля которых являются массивами! ::) Просто с массивами такое пока не пробовал проделывать, но мне кажется, просто присвоится указатель на 0-й элемент или компилятор заругается, но весь массив врядли скопируется. Значит будем создавать для красоты записи искусственные структуры, даже если нужен только массив :) Или я где-то ошибся? Но алгоритм в желез работает и данные в структуре-приемнике обновляются! ::)
ЗЗЫ что скажет компилятор на такое
// было первый раз правильно - что-то перестраховался
// и переписал ещё в 2-х вариантах :)
unsigned int global_i;
...............................
void f(void)
{
unsigned int i = global_i;
if (i != global_i) i = global_i;
........
}
void f(void)
{
unsigned int i_1;
unsigned int i_2;
do
{
i_1 = global_i;
i_2 = global_i;
} until (i_1 == i_2)
// используем любую переменную - i_1 или i_2
// может можно реализовать и с одной внутренней
// переменной - пока не придумал
........
}
// или ещё вариант
void f(void)
{
unsigned int i_1 = global_i;
unsigned int i_2 = global_i;
if (i_1 != i_2) i_1 = global_i;
// используем любую переменную - i_1
........
}
Надо написать "volatile" при объявлении глобальной переменной, чтобы компилятор оставил "все как есть"? Смысл этих строк - гарантированно получить корректное значение глобальной переменной, если есть шанс что она изменится в прерывании - а отключать прерывания неохота, ибо некоторые из них могут быть без флагов своего появления - и не подождут чтобы возникнуть потом, а потеряются навсегда ::)
-
Да, но это вроде как (насколько смог проверить) выполняется и в случае, если а и в - структуры, многие поля которых являются массивами!
Да, структуры уже давно копируются (означено в стандарте языка). Массивы - нет (так как на самом деле это просто указатели).
-
И структуры массивов структур массивов массивов ...... и т.д.? ::) Супер! А то я думал что С это не умеет и написал для копирования структуры отдельную функцию с пробеганием всех её вложенных полей и массивов поэлементно, а мне командир сказал - что ты делаешь, напиши просто! :) Я говорю - так поля же не только простые типы, но и массивы! Он сказал попробовать и проверить ::)
ЗЫ теперь буду все массивы засовывать единственным элементов с структуры! :) И копировать/присваивать их туда-сюда, и в качестве результата выполнения функций возвращать! Вот, блин, прикол - массивы не копируются и не возвращаются, а более сложные объекты, их содержащие в своем составе - запросто! ::)
-
Помогите с LPC1758. Нужно записать в его ROM массив данных из wav файла для дальнейших манипуляций с этим массивом. Как это сделать?
-
Поискать директиву подключения бинарников наподобие include-incbin, либо дамп преобразовать в директивы асма.
Обычно пишется небольшая програмка, которая 1,129,241 преобразует в текст DB 1,129,241 и все.
-
Нужно записать в его ROM массив данных из wav файла для дальнейших манипуляций с этим массивом. Как это сделать?
В адекватных средах разработки это может сделать линкер - положить бинарный файл в отдельную секцию. Конкретно надо курить мануал по применяемому линкеру.
Способ написания служебной программки, которая из входного бинарного файла изготовит файл в виде исходника (то ли это будет .asm-файл, то ли .c - не важно) можно применять, он универсален, но громоздок.
-
Уважаемые знатоки цифровых технологий, помогите пожалуйста отладить алгоритм свертки, не могу найти ошибку. Сделал в c++builder приложение, которое открывает две вавки и делает свертку.
Вот картинка: http://imageshack.us/photo/my-images/189/convz.jpg/
Сверху входной сигнал (синус, 1кГц, 1.17 сек), ниже импульс (0.25 сек.) и внизу результат.
Сначала все идет как надо (сравнивал с аудиоредактором) - переходный процессик и начинается установившийся режим.
Но дальше не могу понять, откуда берется скачок амплитуды и вообще непойми что в конце. Помогите разобраться ::)
Вот текст проги:
//---------------------------------------------------------------------------
#include <stdio.h>
#include <vcl.h>
#pragma hdrstop
#include "sound.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
short format_tag, channels, block_align, bits_per_sample,*sound_buffer;
BYTE id[4];
DWORD size, format_length, sample_rate, avg_bytes_sec, data_size ;
FILE *fp;
short iformat_tag, ichannels, iblock_align, ibits_per_sample,*isound_buffer;
BYTE iid[4];
DWORD isize, iformat_length, isample_rate, iavg_bytes_sec, idata_size ;
FILE *ifp;
unsigned int i,j,k;
float *rsound_buffer;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Label17->Visible=0;
Label18->Visible=0;
Label19->Visible=0;
Label20->Visible=0;
Label21->Visible=0;
Label22->Visible=0;
Label23->Visible=0;
Button2->Enabled=0;
Label7->Visible=0;
Label24->Visible=0;
Label25->Visible=0;
Label26->Visible=0;
Label27->Visible=0;
Label28->Visible=0;
Label29->Visible=0;
Button4->Enabled=0;
}
//----------Читаем описание формата входного файла---------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
fp = fopen("C:/16_44test.wav","rb");
if(fp)
{
fread(id,sizeof(BYTE),4,fp);
if((id[0]=82)|(id[1]=73)|(id[2]=70)|(id[3]=70)) //Check if RIFF
{
fread(&size,sizeof(DWORD),1,fp);
}
else ShowMessage("Not RIFF");
fread(id,sizeof(BYTE),4,fp);
if ((id[0]=87)|(id[1]=65)|(id[2]=86)|(id[3]=69)) //Check if WAVE
{
fread(id,sizeof(BYTE),4,fp); //Read "fmt"
fread(&format_length,sizeof(DWORD),1,fp);
fread(&format_tag,sizeof(short),1,fp);
Label18->Caption=IntToStr(format_tag);
fread(&channels,sizeof(short),1,fp);
Label19->Caption=IntToStr(channels);
fread(&sample_rate,sizeof(DWORD),1,fp);
Label20->Caption=IntToStr(sample_rate);
fread(&avg_bytes_sec,sizeof(DWORD),1,fp);
Label21->Caption=IntToStr(avg_bytes_sec);
fread(&block_align,sizeof(short),1,fp);
Label22->Caption=IntToStr(block_align);
fread(&bits_per_sample,sizeof(short),1,fp);
Label23->Caption=bits_per_sample;
fread(id,sizeof(BYTE),4,fp); //Read DATA subchunk
fread(&data_size,sizeof(DWORD),1,fp); //Read DADA size
Label17->Caption=IntToStr(data_size);
Label17->Visible=1;
Label18->Visible=1;
Label19->Visible=1;
Label20->Visible=1;
Label21->Visible=1;
Label22->Visible=1;
Label23->Visible=1;
Button2->Enabled=1;
}
else
ShowMessage("It is NOT a Wave file!!");
}
else ShowMessage("Shit!!!\nCan't open =(");
}
//-----------Читаем блок данных входного файла, выводим на график-----------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ //создаем входной массив
sound_buffer=(short*)calloc((data_size+idata_size)/2,sizeof(short));
for(i=0;i<=data_size/2;i++) //заполняем его
{
fread(sound_buffer+i,sizeof(short),1,fp);
Chart1->Series[0]->AddXY(i,sound_buffer[i],clRed);
}
}
//--------Читаем описание формата файла импульса-----------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ifp = fopen("C:/impulse.wav","rb");
if(ifp)
{
fread(iid,sizeof(BYTE),4,ifp);
if((iid[0]=82)|(iid[1]=73)|(iid[2]=70)|(iid[3]=70)) //Check if RIFF
{
fread(&size,sizeof(DWORD),1,ifp);
}
else ShowMessage("Not RIFF");
fread(iid,sizeof(BYTE),4,ifp);
if ((iid[0]=87)|(iid[1]=65)|(iid[2]=86)|(iid[3]=69)) //Check if WAVE
{
fread(iid,sizeof(BYTE),4,ifp); //Read "fmt"
fread(&iformat_length,sizeof(DWORD),1,ifp);
fread(&iformat_tag,sizeof(short),1,ifp);
Label24->Caption=IntToStr(iformat_tag);
fread(&ichannels,sizeof(short),1,ifp);
Label25->Caption=IntToStr(ichannels);
fread(&isample_rate,sizeof(DWORD),1,ifp);
Label26->Caption=IntToStr(isample_rate);
fread(&iavg_bytes_sec,sizeof(DWORD),1,ifp);
Label27->Caption=IntToStr(iavg_bytes_sec);
fread(&iblock_align,sizeof(short),1,ifp);
Label28->Caption=IntToStr(iblock_align);
fread(&ibits_per_sample,sizeof(short),1,ifp);
Label29->Caption=ibits_per_sample;
fread(iid,sizeof(BYTE),4,ifp); //Read DATA subchunk
fread(&idata_size,sizeof(DWORD),1,ifp); //Read DADA size
Label7->Caption=IntToStr(idata_size);
Label7->Visible=1;
Label24->Visible=1;
Label25->Visible=1;
Label26->Visible=1;
Label27->Visible=1;
Label28->Visible=1;
Label29->Visible=1;
Button4->Enabled=1;
}
else
ShowMessage("It is NOT a Wave file!!");
}
else ShowMessage("Shit!!!\nCan't open =(");
}
//---------Читаем блок данных файла импульса, выводим на график--------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{ //создаем массив импульса
isound_buffer=(short*)calloc(idata_size/2,sizeof(short));
for(i=0;i<=idata_size/2;i++)
{
fread(isound_buffer+i,sizeof(short),1,ifp);
Chart2->Series[0]->AddXY(i,isound_buffer[i],clRed);
}
}
//------------Собственно свертка---------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{ //создаем выходной массив
rsound_buffer=(float*)calloc((idata_size+data_size)/2,sizeof(float));
k=idata_size/2;
for(j=0;j<=(idata_size+data_size)/2;j++) //семплы результата
{
for(i=0;i<=idata_size/2-k;i++)
rsound_buffer[j]+=isound_buffer[i]*sound_buffer[j-i];
if(k>0)k--;
Chart3->Series[0]->AddXY(j,rsound_buffer[j],clRed);
}
}
//---------------------------------------------------------------------------
ЗЫ Горизонтальные оси чартов не настраивал, это не особо важно - главное, форму сигнала видно.
-
Вот текст проги:
Ну и как это читать? Неужели тяжело отформатировать исходный текст как положено?
-
@ Rst7
Ну это рабочий вариант... Не совсем понял, как форматировать?
Со скачком амплитуды посредине разобрался - в последнем цикле по i заменил "<=" на просто "<". Теперь получается вот так: http://imageshack.us/photo/my-images/35/convx.jpg/
Осталось разобраться, почему появляется импульс в конце данных. Чую, где-то в циклах свертки собака зарылась...
Короче, заработала моя приблуда, ура! Сравнивал на слух с популярным Sony Acoustic Mirror, разницы не заметил. Следующим шагом будет обработка в реал-тайме с линейного входа, а потом в ARM ее ::) Только б не забросить это дело, пока дойду до этого)
-
Народ, 10 лет назад я будучи разработчиком-железячником по случаю написал несколько программ на ассемблере для AVR 2313. Причем одной из прог напроч заняв все ресурсы всех памятей. т.е. насобачился неплохо.
Вопрос такой.
десять лет паузы - все основательно забыто. Сейчас возможно потребуется несложные по сравнению с теми программами программульки написать.. Стоит "С" изучать или дуть по накатанному?
-
Имхо молодого бойца - и дуть по накатанному и изучить С. Общее понимание ассемблера плюс архитектуры МК не будет лишним при использовании С, а иногда и до asm может потребоваться опускаться.
-
ну а что дает собственно С при простых задачах? задача типа регистрировать события на портах и потом индицировать что там происходило. возможно с сохранением данных в епром на случай отключения питания.
-
Имхо - возможность мыслить в более человечески-ориентированных абстракциях: математика, типы, условные операторы и т.п. Вдобавок, компилятор берет на себя много рутинной работы - распределение ОЗУ, сохранение промежуточных переменных при путешествии по уровням контекста и вплоть до распределения переменных в 1-2-4 ячеек ОЗУ или регистров - в зависимости от разрядности МК. То есть, можно писать код забыв о структуре ядра - компилятор сделает все что надо, или портирует код с одного ядра на другое. Хотя по-хорошему о структуре ядра забывать не надо :) Короче - С дает возможность программисту жить и думать в удобном мире стройных человеческих абстракций. Есть конечно плата за это - с компилятором надо уметь дружить, аккурано использовать различные опции оптимизации и знать соглашения о передаче параметров или использовании регистров и т.п. - для возможности создания симбиозов С-asm.
-
Ivana, спасибо.
мне казалось, что программы для микроконтроллеров уж очень завязаны на архитектуру, на порты, в отличие от каких нибудь вордов и екселов, которые вряд ли кто рискнет писать на ассемблере)) Подпрограммы типа преобразований аски туда-сюда или 16-разрядной математики существуют..
-
Rus, из картинки следует, что проблема явно в границах циклов. Вроде как файлы свернуты только один раз.
По коду я так и не понял какие используются диапазоны данных для свертки. Почему размеры данных и импульса постоянно делятся на 2 :-?
А вот здесь ты себя перехитрил. Тут заключена ошибка, приводящая к однократному выполнению свертки:
k=idata_size/2;
...
for(i=0;i<=idata_size/2-k;i++) {
..
if(k>0)k--;
}
-
П.С. Кстати, очень показательно для гтлаба: 10 ответов - 0 пользы, одно умничанье и позы Дартаньянов.
Не надо подменять понятия. Как бы вот:
Короче, заработала моя приблуда, ура!
Последняя редакция: 26.11.2011 :: 00:36:31 от Rus
Но, положа руку на сердце, задавать вопрос в такой форме суть неуважение. Ибо:
а) Надо вычленить только нужный кусок - нафига нам тут разбираться в загрузке файлов и рисовании картинок, если свертка не пашет.
б) Отформатировать. Общепринятые правила форматирования исходных текстов вполне расскажет гугль.
-
мне казалось, что программы для микроконтроллеров уж очень завязаны на архитектуру, на порты
На периферию (порты, устройства и т.п.) - очень даже завязаны. Я говорил про архитектуру ядра. Один и тот же код на С компиляторы успешно засунут и в 8-миразрядный AVR без аппаратного умножения (если он туда влезет) и в 32-х разрядный мощный процессор - и тебе не надо будет думать что интеджер в 8 бит не влезет и надо использовать 2-х или 4-х байтовую математику с переносом. Или думать как засунуть блок сложных условных переходов в breq/brne/sbis/ или что ещё. Один и тот же код на С превратится в совершенно разные коды на asm в результате компиляции - в зависимости от возможностей МК и параметров оптимизации в установках компилятора. В этом смысле С в известной мере абстрагирует логику разработчика от особенностей платформы. Ну а работу с периферией придется шлифовать, ибо обращение к ней различается порой весьма сильно.
ЗЫ Михаил KMG выкладывал ссылку на свои коды для AVR - футвсвич с индикацией. Написано на С. Можно самому написать на asm? Можно. Но на С проще, если конечно ты не гений ассемблера с нулевыми знаниями в С. Влез этот код на нужный МК? Влез. Портируется на другие МК? Портируется, с учетом шлифовки обращения с периферией.
ЗЗЫ я вот сейчас как раз на asm начну детально думать как писать драйвер шагового движка - и думать над умножением лонгов и с плавающей запятой, делением, трехэтажными условиями и прочими прелестями - и все это на 8-битном AVR! Как говорит командир - хорошая практика набить руку на asm ::)
-
Спасибо,
на что обратить внимание стоит, что изменилось за 10 лет в этом направлении? AVR не устарел морально? какой сейчас наиболее популярный микроконтроллер о 16-20ног? AVRstudio сильно улучшилась?
-
на что обратить внимание стоит, что изменилось за 10 лет в этом направлении?
На то, что рулят 32хбитные архитектуры. Цена ниже при намного большей производительности.
-
AVR не устарел морально?
Имхо для своих задач вполне подходит. Тот же вышеупомянутый футсвич на Cortex M3 делать имхо как-то... из пушки по воробьям, что ли :)
AVRstudio сильно улучшилась?
Вышла новая, кажется 5-я версия. Где, по слухам, нет этих идиотских ошибок из-за кириллицы в именах каталогов и даже имени учетной записи пользователя (!), есть возможность ставить комментарии на выделенный кусок строк, процедуры и функции на С сворачиваются по "+" в одну строку и еще много того. что надо было сделать ещё в версии 1. Но я продолжаю работать на 4-й потому что 5-я ещё далеко не все модели МК поддерживает.
-
Как я понимаю, начинать работу с кортексом как раз не грех с футсвича. На пониженной тактовой с низким энергопотреблением. Иначе так все и обомрет как ВАЗ 2105.
Потом можно сделать супер футсвич, не рвя на себе волосы, где взять ресурсы, и как обойти такую-то загагулину.
-
Имхо для своих задач вполне подходит. Тот же вышеупомянутый футсвич на Cortex M3 делать имхо как-то... из пушки по воробьям, что ли
Только в корпусах 8 ног - совсем крайний случай. Все. Точка. Если надо больше ног - уже 32 бита.
-
Кстати, вместо пропагандируемых (не только тут) ардуин вот хорошие стартеркиты
Большой кортекс:
http://www.embeddedartists.com/products/lpcxpresso/lpc1769_xpr.php
За 20 евро имеете плату с LPC1769 (и заодно Ethernet PHY на этой же плате уже стоит, снаружи надо только разъем с трансом подключить) + JTAG-Отладчик (который можно отпилить и потом использовать отдельно)
Маленький кортекс:
http://www.embeddedartists.com/products/lpcxpresso/lpc1114_xpr.php
То же, только под мелочь LPC1114 - как раз проц вместо восьмибитников.
-
Если уж на таком камне футсвичи писать, тогда туда же можно засунуть тюнер как минимум, драм-машинку, а потом и эмулятор Зума-505 го или ещё какого проца ::)
Кстати, метроном делается на раз-два вместе с индикацией текущей частоты. Тюнер тоже - безо всяких АЦП даже (хотя можно и с ними) - превращаем сигнал в меандр триггером и снимаем частоту по 0/1 на входной ноге, остается грамотно вывести показание на индикатор. И даже это всё, вместе с футсвичем, имхо можно засунуть в 8-миногую 8-мибитную Tiny-13 какую-нибудь (если хватит ног, ОЗУ и памяти программы :) ) ::)
-
На словах это все легко как два пальца, а на деле нет ни тюнеров, ни драм машин, ни толкового бит крашера.
-
Это
легко как два пальца
и на словах и в коде и в железе. В СПб нет ни тюнеров, ни драм машин, ни толкового бит крашера
?
Надо Турку сказать - пусть расширит ассортимент, озолотится :) Насчет бит-крашера не знаю что это вообще такое, но тюнер с метрономом даже мне написать очень просто, в оговоркой на возможную сложность индикационного табла ::) Кстати, простейшая задачка моргания светодиодом с изменяемой частотой, с которой начинает большинство свой путь в мучение МК - это уже готовый метроном.
-
метроном - да. А драмку, попробуй нормальных барабасов и крэшей впихни в 64к кристалл, и чтобы звучало заметно лучше Zoom. Не так-то просто, когда дело доходит до практики.
Под практикой подразумевается вещь, которой можно пользоваться, а не макет.
-
Не, про нормальные семплы и их склейки - отдельный разговор :)
Хотя, идея сделать метроном звучащий не щелчками а коротким семплом витает в воздухе. Например, записать крик какой-нибудь теннисистки при ударе и этим вскриком метрономить ::) Думаю, заниматься будет гораздо интереснее ;D
-
Rst7,
зашел на чип-дип, поискал что там есть под малые корпуса. 32битные это уже ног эдак 48, а зачем такие излишества?
адекватно моей задаче выходит ATTINY24A,
цена в $6 правда несколько расстроила..
-
цена в $6 правда несколько расстроила..
Так Вам шашечки (8 бит с знакомыми тремя буквами AVR за шесть баксов) или ехать (LPC1114FBD48 с корпусом о 48 ног в MT-System за 50 рублей в розницу)?
-
Rst7:
мне - результат. Я не уверен что он будет проще и быстрей если разрядность будет 32 бита.
-киньте в личку, плиз, где это можно купить
При моей данной конкретной задаче скорость и разрядность дело распоследнее (а-ля сигнализация).
Из важных параметров: наличие АЦП с опорой - отслеживать батарейку, 4-7 входных, 2-4 выходных ног, питание батарейное 3В, потребление минимальное, желательно чтоб батарейки (типа большой литиевой таблетки, наверное 200-500мАч) хватило на полгода-год при опросе входов раз в полсекунды.
PS:
Зачастую от процессора требуют решения ненужных задач. Например из опыта 10летней давности:
Некое устройство с 12бит АЦП которое требует калибровки.
Вариант 1 (ТЗ)- снятие данных с АЦП микроконтроллером, передача этих данных в РС вторым микроконтроллером (первый типа сильно загружен сканированием нескольких каналов с усреднением и передачей данных по компорту), расчет коэффициентов в РС (поскольку требуется 16-разрядное деление!. Поправочные коэффициенты затем спускаются сверху вниз, храняться и используются вторым микроконтроллером. Заняты делом 3 процессора.
вариант 2 - на единственный микроконтроллер приходит команда "калиброваться" - и он тупо прибавляя по 1чке подгоняет свои коэффициенты под входной образцовый сигнал. 16-ти разрядное деление просто не нужно. Ну и еще куча + по ТТХ, включая совместимость со сторонним софтом.
А на выход прошел вариант №1((
-
-киньте в личку, плиз, где это можно купить
А чем чипфайнд не угодил?! :-?
-
Peratron, спасибо.
я ж давно не у дел - больше 10 лет.( - откуда мне знать где искать.
Отдельно спасибо за Ардуино. Читал я в своё время спецификации и USB1.1 и PCI/32бит ))) Некоторые думают что это типа эволюция компорта и шины ISA.) Эх туда бы в 1999й эту Ардуину..
Беглый поиск по сайту дал по ATtiny24 - 45-70руб/шт
по LPC1114FBD48 - 100-150руб/шт
что в общем-то ощутимо если задача простая..
Честно говоря не огорчился.
Почему чип-дип торгует минимум в 2 раза дороже даже большими партиями? охренели?
-
В чип-дипии давно уже ловить нечего - а процессорную мелочь удобней всего брать на митьке. Там на цокольном этаже есть лавочка - кажется, называется "импортные микросхемы" и цены там реально невеликие. Она чипфайндом отыскивается - я так на неё и вышел.
Несмотря на завлекательные цены новые 32-разрядники обойдутся в совокупности дороже - и в том числе и по затрате ресурсов на освоение.
Для множества задач атмега8 является оптимальным по совокупности всех факторов.
Если что - пиши в личку...
-
-киньте в личку, плиз, где это можно купить
Я же вроде пальцем тыкнул - компания MT-System.
http://www.mt-system.ru/
Являются официальным дистрибьютором NXP в России. Соответственно минимальные цены на продукцию.
-
Несмотря на завлекательные цены новые 32-разрядники обойдутся в совокупности дороже - и в том числе и по затрате ресурсов на освоение.
Ну-ка обоснуйте.
-
Обсуждения тюнера были перенесены в [link=http://forum.gtlab.net/cgi-bin/yabb2/YaBB.pl?num=1327342899/0#0][splithere][/link]
-
Влезу снова со своей сверткой.
Известно (вроде как), что линейную свертку во временной области можно реализовать, перемножив Фурье-образы сигналов, а затем проделать оДПФ с результатом. Но у меня из этого получается какая-то фигня. При этом, точно могу сказать, что БПФ и оБПФ выполняются правильно. Может, там что-то еще какая операция нужна? Я просто почленно умножаю действительные и мнимые части результатов БПФ сигналов.
-
Известно (вроде как), что линейную свертку во временной области можно реализовать, перемножив Фурье-образы сигналов, а затем проделать оДПФ с результатом. Но у меня из этого получается какая-то фигня.
Не фигня, а циклическая свертка.
-
Я просто почленно умножаю действительные и мнимые части результатов БПФ сигналов.
Ну только не почленно, а (https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fru%2Fmath%2F2%2Fd%2Fe%2F2de101e522dc38cd897b833a8de63cae.png&hash=a5926eb58fc9e714d4410f46fb603b3649e41656)
-
Туплю что-то... это же формула с 5-го класса!
Может кто-то подсказать, как получить не циклическую, а линейную сверту из Фурье-образов? Книжки читал, но не нашел про этот аспект :(
Еще порылся в нете и добавил:
Вопрос решен :)
-
барабасов и крэшей впихни в 64к кристалл
А в чем проблем использовать нормальную флешку на сколько нужно гиг?
-
Вопрос скорее всего к Rst7, но если кто-то еще сможет помочь, буду очень признателен.
Имеется такой код, сделанный в Keil uVision для LPC1759, но я не понимаю, почему результаты свертки через FFT получаются неправильные. Перепроверял 500 раз все. По аналогичному алгоритму делал прогу на C++ в Билдере и все работало,а тут... Раскладывается в спектр и собирается обратно правильно. Каждый блок продлен нулями до длины, превышающей их сумму минус 1, что необходимо для вычисления линейной свертки.
Причем, если в импульсе (условно) установить только одну какую-то точку, а все остальные нули, то считается правильно. Если больше одной, отличной от нуля, начинается лажа.
Все реализовано на функциях из официальной либы от NXP - DSPLib.
Вот, собственно, код:
#include <system_lpc17xx.c>
#include <LPC17xx.H>
#include "arm_math.h"
#include "math_helper.h"
float32_t testInputA_f32[64] =
{
0, 3211, 6392, 9511, 12539, 15446, 18204, 20787, //один
23169, 25329, 27244, 28897, 30272, 31356, 32137, 32609, //входной блок
32767, 32609, 32137, 31356, 30272, 28897, 27244, 25329,
23169, 20787, 18204, 15446, 12539, 9511, 6392, 3211,
0, -3211, -6392, -9511, -12539, -15446, -18204, -20787,
-23169, -25329, -27244, -28897, -30272, -31356, -32137, -32609,
-32767, -32609, -32137, -31356, -30272, -28897, -27244, -25329,
-23169, -20787, -18204, -15446, -12539, -9511, -6392, -3211
};
float32_t testInputB_f32[64] =
{
0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, //"импульс"
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
};
#define MAX_BLOCKSIZE 128
float32_t Ak[MAX_BLOCKSIZE]; //входные
float32_t Bk[MAX_BLOCKSIZE]; //буферы;
float32_t AxB[MAX_BLOCKSIZE * 2]; //выходной буфер;
float32_t conv[128]; //референс
void up(void)
{
LPC_GPIO1->FIODIR |= 1<<0;
}
void down(void)
{
LPC_GPIO1->FIODIR &= 0<<0;
}
//-------------------------------------------------------------------------------------
int32_t main(void)
{
arm_cfft_radix4_instance_f32 cfft_instance; // объявляем аргументы функций
arm_cfft_radix4_instance_f32 cfft_instance_inv; // прямого и обратного БПФ
arm_cfft_radix4_instance_f32 *cfft_instance_ptr = //создаем
(arm_cfft_radix4_instance_f32*) &cfft_instance; //указатели
//на аргументы
arm_cfft_radix4_instance_f32 *cfft_instance_inv_ptr = //функций
(arm_cfft_radix4_instance_f32*) &cfft_instance_inv; //прямого и обратного БПФ
/* Заполняем входные буферы нулями*/
arm_fill_f32(0.0, Ak, MAX_BLOCKSIZE);
arm_fill_f32(0.0, Bk, MAX_BLOCKSIZE);
/* Копируем данные в половину длины каждого буфера*/
arm_copy_f32(testInputA_f32, Ak, MAX_BLOCKSIZE/2);
arm_copy_f32(testInputB_f32, Bk, MAX_BLOCKSIZE/2);
arm_conv_f32(Ak, 64, Bk, 64, conv); // для сравнения делаем свертку отдельной функцией
arm_cfft_radix4_init_f32(cfft_instance_ptr, 64, 0, 1); // Инициализируем
// прямое и обратное
arm_cfft_radix4_init_f32(cfft_instance_inv_ptr, 64, 1, 1); // БПФ
arm_cfft_radix4_f32(cfft_instance_ptr, Bk); // Делаем БПФ ядра
up();
arm_cfft_radix4_f32(cfft_instance_ptr, Ak); // Делаем БПФ данных
arm_cmplx_mult_cmplx_f32(Ak, Bk, AxB, MAX_BLOCKSIZE); // Комплексно перемножаем результаты
arm_cfft_radix4_f32(cfft_instance_inv_ptr, AxB); // Делаем обратное БПФ
down();
}
[size=11]Any suggestions?[/size]
-
Библиотечными функциями не пользовался, так что по ним не скажу. Но для начала загоните в проц готовые образы сделанные на том же матлабе, потом на проце проделать комплексное умножение двух этих массивов, вернуть результат и сделать ifft в том же матлабе (или в вашей программе на билдере)
Потом идем дальше, на пример переносим бпф на проц, а ибпф остается на матлабе(проге)
Так будет проще найти ошибку, чем ждать пока кто-то раскопает ваш код и найдет ее там...
вот скрипт для матлаба:
X=fft([x zeros(1,length(y)-1)])
Y=fft([y zeros(1,length(x)-1)])
conv(x,y)=ifft(X.*Y)
Ну и не забывайте про round-off-error.
у Вас же в коде на проце целочисленная float32 арифметика? а в проге на c++ какая?
-
@ burjak
Про ошибки округления это я в курсе, но там кардинально не соответствует. Спасибо за идею, попробую загнять fft образы с проги. С матлабом не оч дружу, если честно :-[
Да, и там и там float32. Но на проце он не приемлем по времени, так что в итоге планирую на int32 делать. Благо, там аналогичные функции для разных форматов есть.
-
Ну не обязательно Матлаб. Если Вы уже написали программу, корректно вычисляющую линейную свертку, то этого достаточно.
Хотя загоните сюда данные и результаты(проги и контроллера), я сравню с матлабовскими
-
Кажется, догадываюсь, в чем дело. Пересматривал еще раз доки на эти функции и увидел кое-что, что сначала ускользнуло: оказывается, БПФ надо скармливать комплексный сигнал парами значений re1 im1, re2 im2, и т.д. А я подсовывал ей действительный массив :D. Это как раз объясняет, почему прямое-обратное дает правильный исходный результат, а вместо перемножения образов перемножаем неизвестно что!
Пошел пробовать, как я раньше этого не доглядел!!!
Да, именно это и было причиной глюка. Спасибо, что откликнулись, burjak :)
-
Ну вот ;)
Рад, что разобрались
Сам бывает долго и нудно какую-то несчастную фигулинку ищу :)
-
Хочу собрать сей агрегат
http://www.diystompboxes.com/smfforum/index.php?topic=77471.0
МК нашел, купил. А вот с программатором дела обстоят похуже. Купить готовый не получается(где был- нету, а слишком навороченнный мне не нужен пока). Схем в инете валом, но выбрать мне сложно:) Подскажите, пожалуйста, вариант попроще для МК PIC 16F684.
-
PICkit3 очень даже.
Либо купи готовый контроллер прошитый (т.к. на этой прошивке многие тремоло делают), или прошей у соседа.
-
Домучил наконец свой проект в Keil'e...удалось получить длину импульса до 37.5 мс при частоте дискретизации 44.1.
Задумался вот теперь, как это воплотить в реальность. Микроконтроллеры в руках никогда не держал вообще. Пока положил глаз вот на эту борду http://www.rcscomponents.kiev.ua/product/EA-XPR-003.html. Подскажите, совместима ли она с Кейлом и надо ли что-то еще, чтоб прошить и запустить проц?
-
Keil поддерживает все ARM-ы, это какгбе родимый компилятор, только с другой оболочкой.
Чтобы нормально делать проекты на ARMах, надо иметь дебагер, j-link на пример.
С фурье в риалтайме ничего дельного не выйдет - будет задержка на длину импульса
А циклическая свертка "в лоб" - надо считать, хватит ли тактовой или нет, зависит от длины импульса.
Ну такие вещи лучше делать на DSP, там архитектура более заточена под такую математику, хотя в Cortex-M3 есть некоторые юзабельные инструкции, но все же спец.дсп будет быстрее.
-
Да я в курсе, что родной, но поддерживает ли он тот дебаггер, что я по ссылке привел?
Не спорю, что на специализированных дсп быстрее, но хочу пока что-то недорогое поиграться на первое время, обкатать алгоритмы, а дальше видно будет.
а с чего вы взяли про задержку в длину импульса? Не обязательно ведь делать входной буфер равным длине импульса. Можно и меньше ;) У меня в текущей конфигурации задержка ровно в 2 входных блока, что получается около 18 мсек при импульсе 37.5 мсек.
В лоб считать не пробовал, но думаю, что будет затратнее.
-
Да я в курсе, что родной, но поддерживает ли он тот дебаггер, что я по ссылке привел?
, сорри, не заметил,что то де баггер. Нет,конечно. No, there is no way connecting the LPC-Link to the Keil IDE.
а с чего вы взяли про задержку в длину импульса? Не обязательно ведь делать входной буфер равным длине импульса. Можно и меньше
Не, ну можно конечно делать ффт низкого разрешения, все зависит от импульса, требуемой детализации на нч тобышь...
Судя по задержке 18мс, разрешение где-то 44110/512.
По длине буффера - а как иначе? Интерполировать что ли?
-
Нет,конечно. No, there is no way connecting the LPC-Link to the Keil IDE.
Ну это ничего. Можно ведь отлаженнй проект из кейла перенести в родную IDE експрессы и через нее залить. Или через бутлоадер какой-нибудь. Пока не вникал в тонкости этого процесса.
Кстати... а на сколько симулятор кейла адекватен реальности? Боюсь, чтоб не получилось так, что в симе работает, а на железке не будет.
Ну смотрите... У меня длина буфера сигнала 400 точек и 1648 длина импульса. Следовательно, длина свертки будет 2047 точек. Поэтому, делаю 2048-точечное ффт 400-сот точек буфера и всего импульса (один раз при старте). А разрешение ффт от длины буфера не зависит, он м.б. и меньше, но проц не будет успевать считать.
-
Ну смотрите... У меня длина буфера сигнала 400 точек и 1648 длина импульса. Следовательно, длина свертки будет 2047 точек. Поэтому, делаю 2048-точечное ффт 400-сот точек буфера и всего импульса (один раз при старте). А разрешение ффт от длины буфера не зависит, он м.б. и меньше, но проц не будет успевать считать.
Ересь какая-то. Разрешение по частоте у Фурье - fдискретизации/N. Далее - тема склейки блоков не раскрыта совершенно. Далее - не охота тут разводить арифметику, но поверьте, для получения адекватной задержки с адекватной обрабатываемой длинной импульса есть только одна возможность - тупо считать свертку.
Дальше чистая арифметика (для Cortex-M3):
LDM в два регистра (текущий коэффициент и текущий семпл) - 3 такта
MLA (собственно операция MAC) - 2 такта
Примечание - буфер семплов и буфер коэффициентов - это одно и тоже, идет 32хбитный коэффициент (усеченный до 16 бит), потом 32хбитный семпл (усеченный до 16 бит) и так далее. Посему надо еще организовывать сдвиг семплов в буфере, но это выполняется при помощи DMA одновременно с собственно вычислением свертки самим процом.
Итого имеем 5 тактов на тап. При частоте дискретизации 48кГц и 100МГц тактовой имеем N=100МГц/(5*48кГц)=416 тапов. Что, конечно, маловато, ибо позволяет иметь нижнюю обрабатываемую частоту всего лишь 115Гц (=48кГц/416).
Ну можно соптимизировать до 4.25 такта на тап (с общей задержкой в 4 семпла), но это не сделает погоды. Можно еще скинуть семплрейт до 44.1кГц - в общем, можно достигнуть нижней обрабатываемой частоты в 82Гц.
Овчинка на CM3 не стоит выделки. Можно попробовать на Cortex-M4 - там есть двухствольный MAC, который за один такт обрабатывает 2 тапа. Плюс загрузка нужна будет только одна на два тапа - это будет 1+3 такта на два тапа, т.е. 2 такта на тап. При заявляемых частотах 150МГц и 48кГц будем иметь 1562 тапа за семпл, что, в общем, вполне адекватная цифра (30Гц нижняя обрабатываемая частота).
Как-то так.
-
Разрешение по частоте у Фурье - fдискретизации/N
И где я этому противоречил? Скорее всего, вы не так что-то поняли.
Далее - тема склейки блоков не раскрыта совершенно.
С ней все в порядке.
Овчинка на CM3 не стоит выделки. Можно попробовать на Cortex-M4 - там есть двухствольный MAC, который за один такт обрабатывает 2 тапа. Плюс загрузка нужна будет только одна на два тапа - это будет 1+3 такта на два тапа, т.е. 2 такта на тап. При заявляемых частотах 150МГц и 48кГц будем иметь 1562 тапа за семпл, что, в общем, вполне адекватная цифра (30Гц нижняя обрабатываемая частота).
На данном этапе меня вполне устраивает 1648 точек на 120 МГц проце. :)
Для особо неверующих:
http://www.onlinedisk.ru/image/842130/1.jpg
http://www.onlinedisk.ru/image/842131/2.jpg
-
Ересь какая-то. Разрешение по частоте у Фурье - fдискретизации/N. Далее - тема склейки блоков не раскрыта совершенно. Далее - не охота тут разводить арифметику, но поверьте, для получения адекватной задержки с адекватной обрабатываемой длинной импульса есть только одна возможность - тупо считать свертку.
+1, природу не обманешь
А так да, я тож на кортексе м3 начинал обработку делать, но потом забросил это дело, перешел на дсп и фпга. так что Rus, Вы на правильном пути. Тему раскисите и будете двигатся дальше ;)
По поводу 18мс - не знаю для чего Ваш девайс, но для звука это много, на слух 10мс уже слышно, при 20 я уже играть на гитаре не могу :)
-
перешел на дсп и фпга
К сожалению, FPGA с приличными ресурсами - слишком дорого. Из подходящих DSP могу предложить VS1053 - там вполне 50MMAC в секунду получается, что для 44100 дает длину импульса чуть больше килобайта, уже можно жить. Заодно в одном флаконе аудио-кодек.
Для особо неверующих:
http://www.onlinedisk.ru/image/842130/1.jpg
http://www.onlinedisk.ru/image/842131/2.jpg
Да таких картинок можно валом сделать. Дайте на вход пилот длинной 100мс (заведомо больше Вашего окна) и частотой 1кГц и покажите выход, вот тогда посмеемся.
-
Еще несколько ведер и получится Line6 M9 ;) ARM есть, еще к нему шарк, рамы и кодек, и все.
Если серьезно. Засоветуйте, каким инструментарием шить SPI ROM. Интересует бюджетный программатор (инструмент предпочитаю покупать, чем делать самому абы как) и ненаколеночный софт.
Уже много где спрашивал, но натыкаюсь или на проекты под LPT или варез под вин98.
-
Дайте на вход пилот длинной 100мс (заведомо больше Вашего окна) и частотой 1кГц и покажите выход, вот тогда посмеемся.
Не понял, что такое "пилот" - дал синус.
http://www.onlinedisk.ru/image/842508/1.jpg
Лень делать референсный тест в акустик миррор. Думаю, вы и сами знаете, как оно должно выглядеть. Всплеск в конце - следствие небольшой ступеньки в конце входного синуса. Т.к. он не закончился на 0, я его принудительно опустил. Но это не принципиально.
А теперь, Rst7, говорите, где смеяться. :D
Про 18 мс - да, согласен, для практического применения многовато (хотя лично для меня играбельно), но это не окончательный вариант.
-
Думаю, вы и сами знаете, как оно должно выглядеть.
Выглядит похоже. Как Вы склеиваете вместе окна? Просто встык?
-
@ Rst7
FPGA для более сложных вещей, где ресурсов даже 400мгц блекфина далеко не хватает. А так конечно дорого, а разработка еще дороже в разы :) Ну там своя кухня, можно и последовательно делать некот. вычисления, тем самым экономить вентили...
То все от задачи зависит, в одном проекте даже была пара простеньких фильтров на CPLD EPM1270 затактированный на 60мгц ;D просто нужно было считать довольно толстый поток, решение на процессоре стоило бы гороздо дороже в итоге
@ Rus, да картинки ни о чем не говорят, псевдокод выложите и всем знающим и так станет ясно
Да и на fft можно добится малой задержки, если в overlap-add напихать много нулей и мало сигнала, только по ресурсам это врядли дешевле будет, чем тупая свертка
-
@ Rst7
Завел выходной буфер, равный длине блока (А)+импульса. Свертки блоков суммирую с буфером, для каждой следующей итерации прибавляя к начальному индексу длину буфера. При этом последние А точек, к-рые ложатся на уже считанные данные, не суммирую, а перезаписываю.
@ klb128
Да, вроде-бы это так называется. Выигрышнее или нет, тут зависит от конкретной длины блока, длины ффт и длины импульса. Для короткого импульса может и будет выигрышнее в лоб считать.
-
Завел выходной буфер, равный длине блока (А)+импульса. Свертки блоков суммирую с буфером, для каждой следующей итерации прибавляя к начальному индексу длину буфера. При этом последние А точек, к-рые ложатся на уже считанные данные, не суммирую, а перезаписываю.
Я не о том. Смотрите, Вы бьете отсчеты входного сигнала на кадры (назовем их так). Каждый кадр размером, как я понимаю, 400 отсчетов (семплов). Дальше над каждым блоком Вы выполняете линейную свертку с импульсом. И результат записываете на выход? Так?
Так вот, если Вы делаете именно так, то это неверно для сигнала длительностью более фрейма. В вычислении свертки каждого следующего фрейма отсутствует предыстория предыдущего фрейма. Например, если мы подадим на вход сигнал в виде перехода 0->1, совпадающего с 50тым семплом фрейма и другой сигнал, но с точкой перехода на 350м семпле, то на выходе получим разный результат, чего, естественно, не должно происходить при обычной лобовой линейной свертке, ибо она инвариантна от времени.
-
На этом я уже съел собаку. В первых опусах долго не мог понять, в чем трабл. Но спустя какое-то время это прояснилось.
Сейчас у меня предыстория присутствует в виде хвоста предшествующего кадра, на место которого не перезаписываются, а суммируются отсчеты нового.
Так что все ок ;)
-
Сейчас у меня предыстория присутствует в виде хвоста предшествующего кадра, на место которого не перезаписываются, а суммируются отсчеты нового.
Что значит "хвост"?
-
Если взять, например, длину одного блока А, и длину импульса В, то длина их свертки С будет С= А+В-1. Под хвостом я имею ввиду все, что начинается с А+1-й точки и до конца С.
Писал уже страницу назад, что по аналогичному алгоритму навоял прогу под винду, через к-рую слушал и смотрел анализатором реальные звуковые файлы, значительно превышающие размер одного окна. И результат никак не отличался от небезызвестного acoustic mirror, с к-рым и сравнивал.
-
Под хвостом я имею ввиду все, что начинается с А+1-й точки и до конца С.
Вот теперь все ясно. Да, такой алгоритм правильный и действительно совпадает по результатам с прямым расчетом (если, конечно, нигде ничего не потеряли в реализации, но раз совпадает, то значит все ок).
Ну и дабы подкинуть информации к размышлению - рекомендую ознакомиться с преобразованием Хартли - http://www.radioscanner.ru/files/signals-analysis/file1862/
Чем хорошо - не надо производить операции с комплексными числами. Заметно меньше умножений, а значит - выше производительность. А так все одинаково - свертка выполняется аналогичным образом.
-
Любопытно. Надо будет ознаокмиться. Спасибо)
-
Если частота дискретизации в симуляторе плавает на +/- 70Гц, можно необращать внимания, или, если это существенно, как ее пожестче задать можно? Не понятно, почему так? У меня сейчас от таймера она генерится.
-
Если частота дискретизации в симуляторе плавает на +/- 70Гц,
...
У меня сейчас от таймера она генерится.
Что значит плавает? И как генерится?
-
всмысле изменяется. Меряю на одном участке сигнала между соседними отсчетами - 44.117, в другом месте 44.036, при отсутствии сигнала 44.150 и т.д.
А генерится так - АЦП выставлен на одиночное преобразование, к-рое выполняется в обработчике прерывания таймера.
С чем это может быть связано?
-
А генерится так - АЦП выставлен на одиночное преобразование, к-рое выполняется в обработчике прерывания таймера.
С чем это может быть связано?
Небось еще и таймер руками перезаряжаете вместо сброса по MAT? А так вообще обычный джиттер по входу в прерывание. АЦП надо тактировать жестко, например, пользуясь теми режимами битового поля START регистра AD0CR, которые запускают преобразование по MATx.x. В соответствующем таймере Вам кроме того нужно установить режим сброса таймера по этому же сигналу MAT. Тогда никакого джиттера не будет.
-
Небось еще и таймер руками перезаряжаете вместо сброса по MAT?
Да, перезаряжаю, записывая соответствующий бит в Match Control Register.
А как сделать перезарядку по МАТ? Мануал курил - не нашел. Нашел только, как задать реакцию выходов МАТ на совпадение (External Match Register), а вот как его обрабатывать, не совсем понятно...
-
Мануал курил - не нашел.
В регистр MRx пишете число тактов таймера для получения нужного периода, например, для периода 44100Гц и тактовой 120МГц надо писать туда (120000000/44100)-1=2720. Потом в соответствующем Match Control Register (MCR) устанавливаете в 1 бит MRxR - это будет приводит к сбросу счетчика таймера в 0 по достижению значения в регистре MRx. Затем запускаете таймер - в Timer Control Register пишете 1. Ну а предварительно настраиваете ADC на запуск по нужному MAT. А процедуру выгребания данных из ADC вешаете на прерывание от ADC по готовности данных.
Все.
-
Переделал, частота зафиксировалась железно. Спасибо большое!
Правда, немного иначе сделал - в External Match Control поставил режим toggle и считаю до 1360. А если делать, как Вы говорите, то установившийся после совпадения бит EMR как лучше сбрасывать? В прерывании от MRx?
-
Правда, немного иначе сделал - в External Match Control поставил режим toggle и считаю до 1360.
Да, походу это самое верное решение, я не дочитал немного даташит на предмет того, что там важен фронт или спад, просто в других камнях часто достаточно только события совпадения для запуска, а уж чего там делает сама ножка - до дупы.
-
Добрый вечер!
Подскажите, что почитать для понимания сути работы I2S интерфейса. Можно на английском. Вроде так в общем разобрался, сделал инициализацию, но мастер-клока на соответсвующей ноге не видать. И еще, не понятно почему, в регистре I2SDAO по дефолту все нули, хотя по усер-мануалу 0, 5 и 15 биты долджны стоять. :-?
LPC_SC->PCONP |= 1<<27; // power & clok to I2S
LPC_SC->PCLKSEL1 |= 1<<22; // set I2S clock to CCKL
LPC_PINCON->PINSEL0 |= 1<<14 | 1<<16 | 1<<18; //set I2S pins
LPC_PINCON->PINMODE0 |= 1<<14 | 1<<15 | 1<<16 | 1<<17 | 1<<18 | 1<<19; //Enable pull-down resistors for I2S pins
LPC_I2S->I2SIRQ |= 1<<1; //Enable transmit interrupts
LPC_I2S->I2STXRATE |= 120 | 1<<8; //set x and y
LPC_I2S->I2STXBITRATE |= 1; //set TX_MCLK devide value to produce bit rate
LPC_I2S->I2SDAO &= ~(1<<5); //set I2S transmitter as master
LPC_I2S->I2SDAO |= 1<<0 | 1<<1; //32-bit wordwidth
LPC_I2S->I2SDAO |= 1<<2; //mono
Использовать хочу для состыковки lpc1759 c внешним цап-ом.
Буду признателен за любую инфу по теме :)
-
Буду признателен за любую инфу по теме
Завтра гляну, заодно со своих исходников скопипастю код. Там, правда, я в режиме Slave I2S использовал.
-
Rst7
Нашли что-то?
Читал мануал на LPC, но никак не могу въехать, по какому механизму осуществляется передача, там про это ничего не пишется вообще((
На сколько я понял, передаваемое значение надо писать в регистр FIFO, а потом что с ним делать - не понятно. И еще такой параметр - FIFO level, что он означает?
-
Господа! Забыл как называется эффект, понижающий строй с шагом в полтона. Я так вообще понял, что реализовать его возможно только в цифре? В связи с чем вопрос: современные микроконтроллеры способны в достаточном (на уровне гитарного процессора) качестве обработать сигнал? Может, какие предложения озвучите? Спасибо!
-
FIFO level для того чтобы знать сколько свободного места в FIFO, сколько инфы можно туда записать для передачи.
Если передача включена, то FIFO "рассасывается" автоматически со скоростью битрейта.
Чтобы не было разрывов в передаче (заикания звука) нужно следить чтобы FIFO level не становился 0 в процессе передачи всего блока.
-
Нашли что-то?
Читал мануал на LPC, но никак не могу въехать, по какому механизму осуществляется передача, там про это ничего не пишется вообще((
Блин, пардон, совсем забыл... Значит так, вот есть кусок моего кода из рабочего проекта.
DEBUG_PUTS("RX: Init I2S module.\r\n");
PCONP_bit.PCI2S=1; //Power up I2S module
I2SDAI=((32UL-1UL)<<6)|(1UL<<5)|3; //32 bits half period, slave mode, 32-bit data
I2SRXMODE=0;
I2SRXBITRATE=1-1; //Divide RXMCLK by 1
PINSEL1|=(2UL<<14)|(2UL<<16)|(2UL<<18); //P0.23 - I2S RXCLK, P0.24 - I2S RXWS, P0.25 - I2S RXSDA
DEBUG_PUTS("RX: Setup I2S interrupt.\r\n");
NVIC_IntPri(NVIC_I2S,4<<3); //Приоритет 4.
NVIC_IntEnable(NVIC_I2S);
....
И собственно говоря, читалка на прерываниях:
void I2S_IRQHandler(void)
{
UREG i=RX_IQ_WP;
UINT32 *p=(UINT32*)(((UINT8*)RX_IQ_BUF)+i);
*p++=I2SRXFIFO;
*p++=I2SRXFIFO;
*p++=I2SRXFIFO;
*p++=I2SRXFIFO;
i+=4*4;
i%=sizeof(RX_IQ_BUF);
RX_IQ_WP=i;
}
Либо вариант с DMA
//RXSIZE
//Souce burst size=1
//Destination burst size=1
//Source transfer width=32-bit
//Destination transfer width=32-bit
//Source increment=0
//Destination increment=1
//Terminal count interrupt enable bit=1
#define RX_DMA_START_VALUE_CTRL (((RX_DMA_SZ)<<0)+(0UL<<12)+(0UL<<15)+(2UL<<18)+(2UL<<21)+(0UL<<26)+(1UL<<27)+(1UL<<31))
//Enable, Source - I2S, Destination - memory (ignored), peripheral to memory, ITC=1
#define RX_DMA_START_VALUE_CONF ((1UL<<0)+(5UL<<1)+(5UL<<6)+(2UL<<11)+(1UL<<15))
//Доинициализация DMA
DEBUG_PUTS("RX: Configure DMA.\r\n");
DMACCONFIGURATION=1; //Enable DMA
DMACC1DESTADDR=(unsigned long)RX_DMA_P;
DMACC1SRCADDR=(unsigned long)(&I2SRXFIFO);
DMACC1CONTROL=RX_DMA_START_VALUE_CTRL; //
DMACC1CONFIGURATION=RX_DMA_START_VALUE_CONF;
I2SDMA1=(4UL<<8)|(1UL<<0); //RX_DMA1_ENABLE=1, RX_DEPTH_DMA1=4
....
void GPDMA_IRQHandler(void)
{
UREG intf=DMACINTSTATUS;
if (intf&2)
{
//Прерывание от канала 1, приемник
DMACINTTCCLEAR=2; //Сбрасываем флаг прерываний
DMACC1DESTADDR=(unsigned long)RX_DMA_P; //Куда
DMACC1CONTROL=RX_DMA_START_VALUE_CTRL; //Размер и прочее
DMACC1CONFIGURATION=RX_DMA_START_VALUE_CONF; //Старт тут
NVIC_SetPend(NVIC_TIMER3); //Стартуем TMR3_IRQHandler - основной код приемника
}
}
-
Спасибо, буду разбираться....
А для передатчика есть примерчик?
-
А для передатчика есть примерчик?
Не, не делал, у меня там в проекте только АЦП были на I2S.
-
Да, пардон, потерял разрешение прерываний от I2S (если читать процом, а не при помощи DMA)
I2SIRQ=(4UL<<8)|(1UL<<0); //RX_IRQ_ENABLE=1, RX_DEPTH_IRQ=4
-
А RX_DEPTH_IRQ=4 - это значит, что прерывание вызывается, когда в FIFO остается меньше битов, чем указано в этом значении, или как?
-
это значит, что прерывание вызывается, когда в FIFO остается меньше битов, чем указано в этом значении, или как?
Для приемника - что в FIFO накопилось не менее чем 4 слова. Для передатчика - наоборот - места не менее, чем 4 слова.
-
Ясно. Еще такой момент проясните, пожалуйста.
В мануале FIFO определен, как один 32-х битный регистр. Но там-же указано, что их 8. Но обратиться можем к одному. :D Это значит, что если, допустим, я запишу туда какое-то значение, а потом следующее, то второе запишется рядом с первым, третье рядом со вторым и т.д.? И таким образом, пока кол-во заполненных регистров (в случае 32-х битного слова) не достигнет значения FIFO level, он будет заполняться. А когда достигнет, то первое слово уйдет на выход, и опять ждем, пока не придет новое значение и т.д.
Верно я понял, или бред написал?)
-
Хорошее представление о работе FIFO дает его второе название "очередь".
Представь себе очередь в кассу, первый подошедший (твои 32 бит) сразу оплачивает (начинает побитно сдвигаться в I2S), если за это время подойдет второй (третий...), то они пристраиваются в "хвост" и ждут своей очереди. С точки зрения софта ты видишь хвост очереди.
А на приеме ты сидишь в кассе и видишь "голову" очереди.
-
Вроде проясняется, спасибо)
-
http://habrahabr.ru/post/146489/
-
http://habrahabr.ru/post/146489/
Мда, человек не понимает, что такое Starter Kit и для чего он нужен.
С другой стороны согласен в том, что 8 бит - это уже мертво. Я сейчас для того, чтобы быстро какую-нибудь поделку споделить использую вот такое - http://www.embeddedartists.com/products/lpcxpresso/lpc1769_xpr.php
Особенно приятно лично для меня то, что для работы с Ethernet там не хватает только разъема со встроенным трансформатором. Других интерфейсов нынче не использую, ибо все говно.
Цена вопроса 20 евро плюс копеечная доставка, что суть стоимость трех часов моего рабочего времени. Скастрюлить такой модуль на коленке с учетом стоимости затраченного рабочего времени дешевле (и быстрее) никак не выйдет.
-
Мда, человек не понимает, что такое Starter Kit и для чего он нужен.
Про стоимость отдельный разговор, разговор о том что человек привыкший к кривому резиденту ардуины не будет переходить на нормальное программирование.
-
разговор о том что человек привыкший к кривому резиденту ардуины не будет переходить на нормальное программирование
Да можно подумать, в других областях софтописания как-то по другому. Все ищут какие-нибудь сторонние решения (библиотеки, компоненты, среды и так далее), которые за них должны все сделать. Классика жанра - шутка про быдлодизайнеров, которым в фотошопе/иллюстраторе и т.д. нужна одна кнопка "сделать пи$$aто".
Ну в общем и 99 процентов звукорежиссеров/музыкантов тоже ищут плагин/прибор обработки с одним тумблером - "говно/зае$$сь".
-
Подскажите, каким программатором прошить сей контроллер?
AT89C2051-24PU. Знаю, что старый он, найти купить готовый пока не вышло.
Если собирать самому, то нашел пока такое вот http://arv.radioliga.com/component/option,com_remository/Itemid,27/func,select/id,7/
-
Тут на старости лет боссы отправили на доучку, и для диплома стал возиться управлялками на Ардуине, как наиболее простом варианте.
Заодно поковырял на предмет использования в примочкострроении.
Некоторые обнаруженные нюансы (конкретно по Nano, возможно, секрет Полишинеля...) :
1. АЦП, в лучшем случае, можно использовать для считывания положения регуляторов, дискретизация 1024, но квантование для звука - никакое.
2. использование ШИМ для аналогового управления (с интегрированием) - тоже не
фонтан, дискретизация 256, а выходная ШИМ-частота примерно 1кГц в лучшем случае (о ШИМ-ДАУ ваще молчу, а губу раскатывал...).
В общем, увидел единственное применение - управлять ключами коммутации , и запоминать/выставлять их пресеты, крутить движками ручки резюков, по аналогу - разве что кодом управлять внешними ключами с резюками - наборами R/2R
Печально, аднака - думал, Atmega328 может пошустрее хотя бы ШИМ выдавать.
Или, может, если ее на асме программиуровать, а не на детском, но ущербном ардуинском сишке?
-
думал, Atmega328 может пошустрее хотя бы ШИМ выдавать.
Может. 2 канала 16 бит. Просто таймеры программировать нужно на уровне регистров, а не функции analogWrite().
Погуглите "atmega328 16 bit pwm arduino".
-
Рекомендую вместо Ардуины использовать что-нибудь из STM32 - сейчас есть несколько вариантов маленьких "плат разработчика" - фактически те же Ардуино (размер и форма платы со штырьками разъема) за очень небольшие деньги. Например, https://aliexpress.ru/item/32581820854.html - на STM32F103, там уже есть 2 АЦП 12 бит, тактовая частота 72 МГц и куча всяких пасочек/периферии. Я использовал такую плату с переставленным на нее процессором STM32F303 - на нем есть 4 АЦП и 2 ЦАП 12бит - для отработки алгоритмов на временных задержках (ревер/хорус/дилей). Для гитарного применения (в параллельной петле эффектов) вполне достаточно, хотя более удобным мне представляется использование внешнего звукового ЦАП на интерфейсе I2S - так получается заметно проще схемотехнически и качество выводимого звука выше. В общем - рекомендую, так получается гораздо более мощное устройство за меньшие деньги, чем Ардуино. Программируется с помощью программатора ST-Link (https://aliexpress.ru/item/32792513237.html?spm=a2g0o.detail.1000060.2.285d537aN6kF2D&gps-id=pcDetailBottomMoreThisSeller&scm=1007.13339.146401.0&scm_id=1007.13339.146401.0&scm-url=1007.13339.146401.0&pvid=79559246-20d1-4880-bc2a-08130e71b6ab). Единственная сложность (по крайней мере - была для меня :)) - это намного более сложное устройство МК и обилие настроек периферии (после ПИКов с АВРами). Пришлось заняться сначала переводами даташитов, потом освоением С...
PS Я в свое время не нашел нормальной документации по STM на русском, потому перевел себе кое-какие доки на Cortex 0, и частично на 3 и 4 - ну я читаю и по аглицки, но мне быстрее и удобнее читать по русски :)... Дык вот - ежели кому вдруг надо - охотно поделюсь своими переводами - вдруг кому поможет... :)
Вот вариант звукового модуля на основе STM32F411 и CS4344:
(https://picua.org/image/soundmodstm32f411-1.Na2oOn)
Это, правда, делалось не для гитары, а для клавишных, но схемотехника там практически одинаковая. Если ничего не помешает и будет время :) - соберу в законченное устройство чисто гитарную версию - ну, например, ТАР Дилей на этой основе. Да, процессор слишком мощный для таких применений, но учитывая его низкую стоимость, получается недорогое и качественное устройство...
-
Более того. Для ардуинщиков есть API и огромная база библиотек от ребят из проекта stm32duino. "Синяя Пилюля", понятное дело, - в топах :) Хороший старт для тех, кто не изучал основы программирования в ВУЗе. Как и в случае с AVR-arduino, можно мягко перейти к более "прямому" программированию.
-
Мысли вслух...
Честно говоря - никогда не понимал Ардуино и его поклонников: чему можно научиться, просто копируя чужие библиотеки и соединяя готовые модули? Естественно - это лишь мое личное мнение, а не истина в последней инстанции... Просто, думается мне, программировать даже на С (не говоря об ассемблерах) не зная досконально архитектуру процессора - профанация... Потому я и занимался переводами даташитов - изучал матчасть :)... В моем подходе есть и минус - легко портировать мои проги на другие камни фиг получится - они все "привязаны" к железу, везде работа с регистрами периферии...
-
Мысли вслух...
Честно говоря - никогда не понимал Ардуино и его поклонников: чему можно научиться, просто копируя чужие библиотеки и соединяя готовые модули? Естественно - это лишь мое личное мнение, а не истина в последней инстанции... Просто, думается мне, программировать даже на С (не говоря об ассемблерах) не зная досконально архитектуру процессора - профанация... Потому я и занимался переводами даташитов - изучал матчасть :)... В моем подходе есть и минус - легко портировать мои проги на другие камни фиг получится - они все "привязаны" к железу, везде работа с регистрами периферии...
Тут разница миров/методик обучения. Западный - сможет освоить каждый, а гении пусть находят себе задачи сами. И советский - для постройки оружия нам нужны только гении, для них образование и заточим, а посредственные люди пусть идут на народное хозяйство работать. И про военку - это не шутка, сами задумайтесь для чего вашей стране (были?) нужны хорошие спецы. Точно не хорошие автомобили производить :).
А ардуина взорвала ИТ мир, заинтересовав и подтянув в микроконтроллеры миллионы людей, благодаря низкой входной ступеньке. Слышал от коллеги, что пару лет назад, количество людей изучающих ассемблер - рекордное за все времена.
Если что, я сам - "старой закалки", писал машинные коды на бумаге 30 лет назад, но мне как-то отчётливо видна польза этих всех "детских игрушек". Особенно, когда ими занимаются именно школьники.
Sau
-
С этим я согласен, хотя и не полностью... Возможно потому, что тоже начинал с машинных кодов на бумаге, вручную вычисляя адреса переходов... :). Я же честно сказал, что это лишь мысли вслух - т.е. мое частное, и, возможно, ошибочное мнение... :)
Лично мне в идее Ардуины привлекает только аппаратная часть - многим (и мне тоже!) часто лень собирать по деталькам какую-либо схему, а тут масса готовых решений - датчики, моторчики, плюшечки и пасочки... Именно для начинающего. Но вот я, начиная осваивать STM, часто натыкался в интернете на сайты школярского уровня, где некий "гуру" учит еще больших новичков в стиле: "Смотрите, как круто я умею! Берем Ардуино, соединяем с экраном, закачиваем библиотеку и добавляем файл, который взяли на другом сайте. Вуаля! У нас тут нарисовалась картинка! Учитесь!"
А чему учится то? Соединить 5 проводков и закачать чужую прошивку?
Все равно ведь придется разбираться с архитектурой процессора - ну хотя бы, чтоб понять, как этим, блин, светодиодом моргать... А этот шаг сделает отнюдь не каждый, кто купил Ардуинку...
Я это к чему - Ардуино - это здорово, но это не волшебная палочка...
PS А хорошие спецы нужны любой стране! :)
-
Ну, я Ардуину рассматриваю, как очень быстрый способ получения результата, достаточного для поставленной задачи. А далее уже идет шлифовка-полировка, и при необходимости, смена платформы. Язык программирования - не проблема, перед упрощенным ардуинским С лично у меня была развлекаловка с ассемблером 51-го проца, а лет 20 раньше - с Z80. На бумажке, правда, как-то избегал кодить, респект тем, кто это делал, не имея своего компа или среды. Сейчас ощущаю, что надо кардинально менять концепсию всего наработанного , благодаря китайским товарисчам...
В итоге, по своему бзику TONWOOD Guitar Engine (с которым знакомил народ ), рисуется:
1 переход внешнего питания бревна на любое от 5 до 20 вольт, подаваемые по кабелю.
2 Внутреннее питание бревна перевести с +12в на двухполярку +5в 2А -5в 100мА с применением DC/DC на частоте 1-1.5 Мгц.
3 Задействовать на сикстейнере (6-канальном сустейнере) ШИМ-овские 5-ваттные PAM-ки в качестве усилителя драйверов, и хамбакерообразные низкоомные драйверы.
4 Управление пресетами (думаю, даже 8 хватит) режимов/гейна/фильтра на Ардуинке или другой достаточной платформе. Кнопками и энкодером.
Ну, приблизительно такие наполеоновские сумасбродные планы... ;-)
-
Фига се.... :o Масштабы (особенно мощность, подводимая по кабелю) поражают... Я пропустил - где было описание предполагаемого устройства? брось ссылочку, если не сложно.
Круто... А нужен ли 6 канальный сустейнер? Хаммонд изображать?
У меня планы пока скромнее - управление пресетами одной аналоговой искажалки и цифровой задержки (дилей, холл, хорус). Питание - 5v, для внутригитарного применения - LiPo с DC/DC на частоте 1-1.5 Мгц, для примочки - внешний стандартный БП.
Да! Полезная инфа! Я тут столкнулся с творением неизвестного мне мастера - прислали мне коробочку со слезной просьбой сделать хоть что-нибудь. Прибор типа аналогового процессора. 6 кнопок без фиксации, внутри набор плат-эффектов (компрессор, 3 драйва разных, эквалайзер, дилей и шумодав), управляется неведомым процом (я туда не долез - там нужно было все до основания разобрать). Дефект - жуткий фон. По небольшому исследованию я обнаружил, что наводку дает не источник питания и не внешние поля от трансов и розеток - наводит процессор, динамически опрашивающий (меандром, конечно) кнопки на частоте 40 Гц (а меандр изумительно наводится на входные цепи)...
Вот такое предупреждение - не стоит делать матрицу кнопок с динамическим опросом. Я у себя буду брать проц с достаточным количеством ног и кнопки опрашивать не динамически, а чисто уровнем (думаю, сделаю по прерыванию, так проще) - каждой кнопке своя нога.
-
мощность, подводимая по кабелю
Ранее использованные 12в 1 А - это по ограничению тока (там специальная быстродействующая схемка в БП), реально 12-вольтовый сикстейнер лопал не более 260мА в пике. Но это на 42-омных драйверах от буззеров.
Мощность - с запасом. Если делать на 3-ваттных ПАМ-ках, то при питании их 5в ток для той же мощности будет, соответственно в 2 с лишним раза больше, а хотелось бы увеличить запас мощности для улучшения динамики раскачки.
Mикрофонный кабель (с джеками) держит старый сискстейнер. А так - подумываю о переходе на стандартный микрофонный с разьемами XLR, устанавливаемый рядом с джеком, сдерживает пока необходимость ковырять дерево на бревнах.
брось ссылочку
http://forum.guitartonelab.ru/cgi-bin/yabb2/YaBB.pl?num=1149789854/308#308
Это мой текущий, рабочий вариант нескольколетней давности. Перспективный еще не тестился в железе, дурацкая учеба в универе временно остановила все - времени нет.
нужен ли 6 канальный сустейнер? Хаммонд изображать?
Больше на баян похож по звуку. ;-) Бзик. Это ведь мое хобби, а не бизнес - че хочу, то ворочу. ;-) А сам звук - вот :
https://www.youtube.com/watch?v=8pKS7LupFho
Лабух с меня не фонтан... ;-)
творением неизвестного мне мастера
Наверное, что-то он упустил.
а меандр изумительно наводится на входные цепи
Интересно, так было изначально ? Может, где-то кондер подсох, или это изначально неудачная разводка ?
и кнопки опрашивать не динамически, а чисто уровнем
Кстати, можно воспользоваться набором резюков с кнопками, и аналоговым входом ардуинки, как нередко делают, единственный недостаток - зависимость от некачественных/задолобаных/загрязненных/ кнопок.
Пример - http://arduino.net.ua/Arduino_articles/Arduino_proekty/Podkljuchenie%20knopok%20k%20odnomu%20analogovomu%20vhodu/
В ссылке бОльшая часть кода - на обслуживание дисплея, библиотека тоже для него.
А так достаточно всего лишь прочитать analogRead с нужного входа, и сравнить его с диапазоном чисел (0..1023).
-
Звук послушал, тему почитаю... Прикольно и достойно уважения, как самостоятельная разработка. Звук, я бы не сказал, что баянный, он гитарный, но немного особенный. В некоторых режимах - как две гитары одновременно, в других - как гитара с дофига гейном и на большой громкости... Просто одноканальный сустейнер я видел (у Валерия Гаины), а такую штуку - впервые.
Ну а по поводу бзиков - я сам такой. Вон клавишами увлекся, Муг сделал, сейчас Хаммонд клею по-немногу.(http://forum.guitartonelab.ru/cgi-bin/yabb2/YaBB.pl?num=1581521550/0)
Резюки с кнопками - тоже вариант, кстати... Спасибо за подсказку, я подумаю (Ардуина мне точно без надобности - я ж на STM делаю, да и сам код писать люблю). Мне бы вот еще кто подсказал, как и из чего сделать Хаммондовский Футбар (переключатель набора регистров-гармоник). В оригинале там 9 ползунов на 9 положений каждый... Потенцы ставить не хочу - ну разве что другого выхода не будет, а конструкция, воспроизводимая в домашних условиях - не вытанцовывается...
-
Муг сделал, сейчас Хаммонд клею по-немногу.
Гы, прикольно, особенно Хэммонд. Аналоговые синты уже как-то не удивляют, я их на восстанавливался и насмотрелся кучу, вон Moog Rogue, не забранный клиентом с начала дурацкой войнушки, лежит под шкафом. ;-)
(Ардуина мне точно без надобности - я ж на STM делаю, да и сам код писать люблю).
Был заказан китайцам и STM32 в формате нанки, придет - бум ковырять. Плохо, что проц не эмулится в Протеусе. Или я ошибаюсь ?
На счет ардуинки - для универа сделано 9 лаб и 1 курсак с разной периферией, диплом будет тоже с управлялкой на ней. Очень легкая для писАния и доступная платформа, хотя "со слоями", как у Шрека - можно программить и просто на Асме как обычную, АтМегу 328.
К сожалению, 2 с лишним мега в аттач не пропускает сайт, поэтому результат простым способом показать не выходит. А так, есть архив с проектами в Протеусе и исходниками к ним. Как наваяю че-то окологитарное - вывешу.
Хаммондовский Футбар
Поискал, так и не нашел инфы по нему.
-
К сожалению, сейчас из-за короновируса из Китая плохо идет - или воще не идет... Я заказывал ЦАП звуковой - такая платка, там ЦАП и усил для наушников - дык не пришел...
У меня есть пара-тройка :) плат на STM32 в формате Ардуины: две "голубых таблетки" на STM32F103C8T6 - я их у нас в магазинчике брал, одна - для всяких экспериментов, я на ней осциллограф отрабатывал (цифровую часть), а на второй я проц поменял на STM32F303CCT6 - он по цоколевке полностью совпадает. На этой я сейчас пытаюсь намутить интерфейс к аналоговому гитарному процу (и заодно эффекты задержек в ней же). Ну а еще одна - "черная таблетка" с STM32F411C - у меня на ней звуковой модуль для последнего варианта Хаммонда построен. Кстати - рекомендую именно ее для приобретения: цена почти :) соизмеримая с платой на STM32F103, но проц гораздо мощнее (STM32F103 - один из первых выпущенных, он небогат периферией, а главное (для меня) в нем неудобство - это отличная от всех остальных семейств настройка портов)... У STM32F411C заметно больше памяти - например, ОЗУ 128К позволяет нормально строить всякие Дилеи с Холлами, есть сопроцессор для вычислений с плавающей запятой (я пока не знаю, чего с ним делать :))... Единственная сложность (для новичка - ну если вы новичок) - сложность архитектуры. Лично я начинал с Cortex0, после Атмеги - сложновато, правда, я не владел С в тот момент... :)
Протеус у меня STM не поддерживает... Может, есть в последних версиях, не знаю. Я приловчился работать и без него, по-старинке - беру платку, на ней, как на Ардуинке, впаяны гребенки на все выходы проца, есть наборы проводков с соответствующими "мамами". А для удобства я спаял еще шлейфы для подключения экранчиков TFT, также есть энкодеры с такими же проводами, потенцы, кнопки...
Т.е. интерфейсную часть можно отлаживать, просто собирая нужную конфигурацию "на проводках", питая по шлейфу от ST-Link'а.
-
Я не люблю цифровой звук. Точнее - я не люблю звук гитарных процессоров. Ибо просто цифру мы слушаем постоянно, она стала привычной и при правильном использовании качество цифрового звука может быть очень высоким.
Я долго делал свои аналоговые примочки, и они даже неплохо получались (говорят :)). Но у меня сейчас "программистский" период и я пытаюсь приспособить микропроцессор ко всему, что шевелится. А что не шевелится - шевелю и приспосабливаю :).
Короче - решил я попробовать сделать цифровую примочку. Да - это я изобрету очередной велосипед, но - это будет мой велосипед!
Если по-порядку, то получилось так: отрабатывал я для своего проекта цифрового органа Хаммонд алгоритмы реверберации и хоруса, и подумалось мне, что неплохо бы приспособить эти эффекты и к гитаре. А как раз перед тем мне довелось конструировать набор эффектов для встраивания в гитару (проект моего друга) - там все было аналоговым и довольно громоздким... И вот я решил, что нужно приспособить микропроцессор к аналоговой искажалке - он будет хранить пресеты - все настройки дисторшна (управление цифровыми потенциометрами), а также все настройки эффектов задержки - дилей, ревер и хорус. Тут же возникла мысль, что неплохо бы туда добавить и динамическую обработку - компрессор и гейт - а что мешает-то, ведь есть цифровое управление усилением каскадов и выходным уровнем!
Сказано - сделано, специально для проекта собрал дисторшн на низковольтных операционниках MCP6002, оказалось 5В ему достаточно, собрал макет управляющей платы, прицепил маленький дисплей и начал писать интерфейс...
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F26qmcpcppz.jpg&hash=1a00d4b472ef57f4c3af497b5853871b07648afd) (http://img.radiokot.ru/files/99520/26qmcpcppz.jpg)
Продолжение следует... ;)
-
Интерфейс я начал делать простенький - чисто функциональный, если очень захочется, оформить менюшки более изящно можно и потом. Из органов управления предполагалось 6 кнопок вызова пресета, 2 кнопки смены банка + и - (в банке - 6/8 пресетов), кнопка ТАР и энкодер. Для входа в редактирование пресета я использовал одновременное нажатие + и -, переход по строкам меню + или -, вход в редактирование раздела и выход из него - ТАР. Энкодером меняется значение текущего параметра. Получилось похоже на интерфейс недорогого Зума или Корга, разве что название параметра выводится на экранчик (а не читается в мануале :)) и пресеты вызывать удобнее - все же 6 кнопок, а не 2. По выходу из редактирования все можно запомнить - я не стал цеплять внешнюю память, пока посчитал, что ресурса встроенной flash в 10 000 раз должно хватить.
Ко всему этому прицепил я пару (для начала) двухканальных цифровых потов и начал смотреть, как оно пытается работать. Как и задумывал, я сделал fade_out перед переключением пресета и fade_in сразу после - для устранения щелчка. Время фейдинга - около 50 мС. И вот тут-то и постигло меня первое разочарование... При пропускании сигнала (генератор) через потенциометр - должно было происходить его кратковременное замирание/восстановление. Оно-то происходило... Но кроме сигнала на экране осциллографа возникала странная картинка - сигнал был похож на мохнатую веревку-шпагат. Т.е множество коротких импульсных помех в момент смены положения "движка" потенциометра... В даташите это есть - но там масштабы явления явно преуменьшены... Я уже использовал эти потенцы в своем проекте "Moog" и там они нормально работают (правда - я там их не особо кручу на ходу), так что я сильно озадачился.
Вот так выглядит эта импульсная помеха в "растянутом" виде:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F26rppek4vu.jpg&hash=7f6e9e832957493a58a6bf90e5b50049611dc3e4) (http://img.radiokot.ru/files/99520/26rppek4vu.jpg)
Без фейда мне было не обойтись и решил я попробовать сделать его на другом принципе - использовать что-нибудь аналоговое. Для начала попробовал стандартную схему на LM13700 - это VCA. Единственное, что я сделал нестандартно - запитал его от однополярного 5в. Оказалось - работает, хотя и немного хуже, чем при нормальном питании (9-12в). Потом попробовал использовать TDA8199. Для понижения питания пришлось добавить в стандартную схему еще один резистор (понизить опорное напряжение). На 5в усиление упало, но схема оказалась вполне работоспособна, управляющее напряжение в сигнал не проникало...
И все же не нравился мне такой подход - слишком все сложно и неизящно...(похожая ситуация была на начальной стадии моего проекта цифрового органа)... Я задумался...
-
Что - ни кому не интересно? Жаль... :(
Покрутил я в голове этот проект - и понял, что хочу попробовать сделать все в цифре!
До этого я неоднократно задумывался - а как сделаны цифровые гитарные процессоры? По идее, как и с моделированием ламповых приборов на полупроводниках, нужно моделировать каждый элемент в звуковой цепи... Но если так все и делается - почему звук получается таки не очень? И почему задержка прямого звука всегда больше 6-8 мС? У меня не было возможности потрогать Axe, но разные Line6, Zoom и Korg я щупал многократно и был не в восторге...
Думаю дело в стандартном подходе и несовершенстве алгоритмов. С подходом все более-менее ясно - для частотных коррекций широко используется быстрое преобразование Фурье и свертки, они же применяются для реверберации. А несовершенство алгоритмов определяется нехваткой вычислительной мощности железа. Скорости на все не хватает, вот и упрощают, что могут...
Математик из меня хреновый :), потому, даже перейдя на довольно мощные процессоры STM32 для своих проектов я не осилил (может когда-нибудь?) ни FFT, ни свертки... Так что и не пытался сделать что-нибудь гитарное. Но время шло, и как-то работая над цифровыми приводами я "раскурил" алгоритмы простой фильтрации - аналоги RC цепочек. Сначала я применил это в проекте цифрового органа... Там же я попробовал пару алгоритмов цифрового ограничения сигнала...
В общем, когда я задумался над проектом цифровой примочки, я понял, что все необходимые алгоритмы у меня есть! И ограничители, и фильтры для межкаскадки!
Стало интересно - получится ли примитивными средствами получить нормальный звук? Кстати - "примитивность" средств должна была сыграть мне на руку: общая задержка сигнала должна была получиться в один период дискретизации, т.е. 32мкС при 31,25кГц (с частотой я еще не определился). Более того - алгоритмы фильтров первого порядка работали очень похоже на реальные RC цепочки - я ж не поленился проверять их работу на реальном сигнале с осциллографом, соответствовала не только АЧХ, но и ФЧХ! А что же такое примочка? 1/2/3/4 усилителя-ограничителя да межкаскадные связи...
И я решил попробовать...
-
Мне как-то практически халявно достался Zoom B1.
Не имея особых иллюзий по поводу его свойств, включил его, поиграл и... остался им полностью удовлетворён.
Несколько раз в году беру его в руки, стряхиваю пыль и играю.
Для диванного гитаризма - замечательная штука, а на сцене Ковент-гардена мне не выступать... ;D
-
Для диванного гитаризма - замечательная штука... ;D
Полностью согласен! Я сам как гитарист - ниже плинтуса, у меня есть аналогичный Korg и я на нем иногда играю. Мне он даже помогает - все кривые ноты приводит к чему-то среднему... Именно поэтому их так не любят профессионалы - такие процы полностью нивелируют все нюансы звукоизвлечения...
А в плюсах - однозначное удобство и компактность, много звуков в одной коробочке и доступная цена... Для дивана и не очень требовательных халтур (ресторан) - самое то...
Но... когда после проца включаешь хорошую аналоговую примочку - сразу понятно (даже мне :)), что такое правильный звук... А если включить не примочку, а ламповый комбик... :)
-
такие процы полностью нивелируют все нюансы звукоизвлечения
- подпишусь обеими руками. Действительно, звук получается излишне правильный и гладкий, даже при использовании садистических методов звукоизвлечения ;D
-
Итак... Продолжим!
Начал я с алгоритма ограничителя. Вообще то мой опыт говорит мне, что на окраску звука любого перегруза влияет в основном выходной ограничитель из всей цепочки каскадов усиления-ограничения. Объясняется это довольно просто - при слабом сигнале или малом гейне звук проходит через все каскады постепенно усиливаясь, но не ограничиваясь до самого конца, ибо имеет недостаточную амплитуду. И только последний каскад имеет шанс его ограничить - и именно с него и начинается ограничение. Естественно, от его передаточной характеристики и зависит тон перегруза на малом гейне... По мере нарастания сигнала или увеличения гейна подключаются и предыдущие каскады, но их влияние сказывается заметно меньше, ибо выходной каскад намного раньше уходит в ограничение сигнала, а в режиме ограничения коэффициент усиления каскада резко падает...
В общем - возьмем самый ламповый из ламповых усилков и дадим большой сигнал с большим гейном - и получим классический прямоугольник, как на самом последнем транзисторе... :)
Я проделывал такое неоднократно, изучал поведение и отдельной лампы и в связке - и вижу процесс именно так. :)
Ну и многие догадываются, что чем плавнее усилитель входит в ограничение, тем мягче и приятнее кранч (на хайгейне все едино :)).
Так что мягкое ограничение нам все равно пригодится - цифровой дисторшн я задумал, как универсальный, от блюза - до металла! :)
Для органа я делал уже ограничитель - но там очень большой гейн и не был нужен, для начала я сделал просто хардлимит - установил порог, выше и ниже которого сигнал просто обрезался и оставался на уровне этого порога. Для органа звучало неплохо, но я решил немного смягчить. Для этого задал еще один порог, ниже жесткого, и по достижении его сигнал уменьшал скорость нарастания (усиление) вдвое. Это легко реализовывалось в программе... Но особой разнице в звуке я не услышал - то ли нужно было повозиться с порогами, то ли слишком резко менялось усиление в точке первого порога... Для органа этот алгоритм подходил, а вот для гитары - я решил его переделать...
Поскольку вся обработка сигнала идет в цифире - почему бы не задать параметры ограничителя таблицей? Тогда меняя таблицу, легко менять характер ограничения. Ничто не мешает использовать разные таблицы для разных каскадов и даже для разной полярности сигнала! (асимметричное ограничение, как у вакуумного триода). Сочетая это с разным числом каскадов, можно получить очень разный звук!
Методом небольшого тыка :) я попробовал, подавая на вход треугольник, получить мягкое ограничение сигнала, подобно ограничителю на диодах, или, скорее, на светодиодах. Сначала я сделал это без всякой таблицы, просто расставив константы в виде порогов и усиления в каждом диапазоне сигнала... Вот что получилось (ограничивается только верхняя полуволна, сигнал - треугольник):
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F26vbofar9t.jpg&hash=c9e726a485a7791f6a81e92f2e7ea16143ea77ab) (http://img.radiokot.ru/files/99520/26vbofar9t.jpg) (https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F26vbpd2gjc.jpg&hash=cd8b4326e489235c1b7225d8de05b058f837acfb) (http://img.radiokot.ru/files/99520/26vbpd2gjc.jpg)
-
Попробовав принцип, я переписал подпрограмму ограничителя - сделал двухстороннее ограничение и добавил таблицу - 8 пороговых значений и 8 коэффициентов наклона в каждом диапазоне. В принципе, таблица может иметь и больший размер - это просто компромисс между точностью рисования кривой и скоростью работы подпрограммы, ибо на большой амплитуде входного сигнала она последовательно обрабатывает все пороги со своими коэффициентами.
Результат своих трудов я изучал визуально - благо в свое время насмотрелся на форму сигнала и после лампы, и после полупроводников...
Получалось весьма похоже на примочку - на малой амплитуде слегка круглило, на большой - вырождалось в прямоугольник...
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F26yjpkjtyh.jpg&hash=8f0f6a54b7de3e38486a674a4a989c5269c54dd8) (http://img.radiokot.ru/files/99520/26yjpkjtyh.jpg)
-
И опять никому ничего не интересно... Жаль
-
И опять никому ничего не интересно... Жаль
Как раз интересно. Жаль, что ничего не понимаю в программировании. :'( Слежу за темой с белой завистью...
-
Аналогично. Даже немного боюсь читать, чтоб не заспойлерить себе какую-нибудь идею, на случай если однажды тоже решу подобным заняться. В аналоговой схемотехнике, особенно на дискретке (лампах, транзисторах), к сожалению, сильно "плаваю" - так что приходится подробно вникать во все разъяснения к конструкциям, а вот с цифровыми эффектами тянет свой собственный велосипед изобрести, хоть и не знаю зачем.... ;D
Михаил, вы замечательное дело делаете! Думаю камрады молчат не от безразличия, а просто оттого, что очень мало кто из нас пробовал с этим экспериментировать. Следовательно, сложно предметно поддержать дискуссию - вы слишком далеко вырвались вперед на этом направлении. Но это никак не отсутствие интереса. Во всяком случае, я буду признателен, если продолжите делиться иногда результатами своих изысканий. :)
-
Угу... :-/
Я понимаю - на форуме гитарного оборудования обсуждать программный эффект - не лучшая идея... Но не к программистам же мне было идти с этим? :D
Насчет идей и обсуждений - хотелось бы, чтобы была хоть какая-то обратная связь - не обязательно быть программистом (я и сам-то условный программист-самоучка :)), чтобы прикинуть блок схему эффекта - из каких блоков состоит и как его попробовать воспроизвести... Я и сам не уверен, что получится что-то стоящее - но попытка - не пытка! :)
Для начала я решил попробовать склеить программно что-то похожее на мои же примочки - я неплохо знаю, как должны выглядеть осциллограммы в разных точках схемы и попробую их воспроизвести.
Была большая затыка с кодеком - у меня не было нормального АЦП, а ведь желательна разрядность (реальное отношение С/Ш) хотя бы 20 бит, иначе все утонет в шумах уже на среднем гейне! Ну и выводить сигнал тоже желательно не менее 16 разрядов - это ж не параллельная петля, а полный эффект... А вот оказалось - что ни в одном из наших магазинов кодеков тупо нет... Никаких. И в пределах досягаемости (с карантином) - тоже... Выручил коллега-приятель - у кого-то из его знакомых нашелся кодек на 24 бита и он мне его переслал. С предупреждением - что кодек, похоже, очень китайский и шумный... Ладно - другого нет - буду пробовать этот...
-
Мне применительно к гитарным процессорам как-то приходила мысль использовать нечто вроде компаднерной схемы. То есть, использовать сжатие динамического диапазона гитарного сигнала перед оцифровкой, какой-нибудь прецизионной логарифмирующей аналоговой цепочкой, и восстановление его уже в цифровом виде до оригинала. Систему можно откалибровать, чтобы это происходило достаточно точно и однозначно. "Физически" разрядности это, конечно, не добавит, но позволит использовать имеющиеся 16/18/20 бит более рационально на очень тихих и, наоборот - пиковых значениях сигнала.
Для аудиоэффектов не знаю насколько это применимо, но в технике связи что-то подобное используется.
-
OldMike,
вот озадачен выбором микроконтроллера . задачка простая типа пресеты переключать, но есть в ней коммуникационная часть и сначала думал компорт будет, и 8бит мк с минимальной памятью выше крыши.. Есть опыт работы с аврмега на асме, правда опыту уже годы. но восстановится несложно. потом смотрю stm8 вроде подешевле и поинтереснее, потом stm32 m0. за те же деньги. потом если чуть добавить STM32F103
- там еще и USB. хотя непонятно как тогда от помех отстраиваться - я так понимаю usb
долбит непрерывно в отличие от компорта где можно все свободное от коммуникаций время спать...
где б остановится и с чего начать если лезть в stm.. "С" надо осваивать или может еще какие есть варианты.. и какие то другие подходы. вы выше писали что есть трудности с инициализацией портов у 103ей.. несколько удивлен ибо что уж может быть проще чем инициализация портов, по крайней мере на асме в атммега я этого момента вообще не помню.
-
Мне применительно к гитарным процессорам как-то приходила мысль использовать нечто вроде компаднерной схемы. То есть, использовать сжатие динамического диапазона гитарного сигнала перед оцифровкой, какой-нибудь прецизионной логарифмирующей аналоговой цепочкой, и восстановление его уже в цифровом виде до оригинала. Систему можно откалибровать, чтобы это происходило достаточно точно и однозначно. "Физически" разрядности это, конечно, не добавит, но позволит использовать имеющиеся 16/18/20 бит более рационально на очень тихих и, наоборот - пиковых значениях сигнала.
Для аудиоэффектов не знаю насколько это применимо, но в технике связи что-то подобное используется.
В связи всё же допустимы достаточно большие искажения.
По-моему, изготовление двухполярного прецизионного аналогового логарифматора и последующее сочленение с цифровым антилогарифматором - задача очень непростая. Возможно, ошибаюсь. ::)
-
@ VAT
Для обозначенной задачи вполне достаточно AVR Atmega, ИМХО. Тем более, что у вас есть некоторый опыт и, скорее всего, есть чем программировать чип. Связываться с STM8 я бы не стал - не вижу ощутимого выигрыша ни по стоимости, ни по аппаратной части, зато система команд там похожа на STM32 и предполагает программирование на С (я толком не разбирался, глянул и понял, что гораздо полезнее научиться работать с STM32).
STM32 - отличная мощная и гибкая система, но освоить на них Ассм у меня не получилось (не, помигать светодиодиком я могу, а вот Hammond сделать - только на С :)). В результате пришлось хоть как-то осилить азы С, попробовать пару программ разработчика для STM (сейчас я на Atollic'е)...
Кроме того - у STM32 очень развитая периферия с огромным количеством настроек (например у таймера может быть чуть ли не десяток связанных с ним регистров), сложной системой тактирования, DMA и т.д.
Эт я не запугиваю, но я с полгода переводил себе даташиты (кстати - могу поделиться со всеми желающими, кто не очень читает по аглицки), пытаясь разобраться в логике построения периферии, ее настройках и использовании. Потом стало легче - и Cortex 3 и 4 пошли после разгрызания Cortex 0 уже не так туго - все они довольно похожи между собой, да и опыт уже появился...
А настройка портов... Для примера, чтобы настроить линию на выход, нужно прописать соответствующие настройки (где 1 битик, а где 2) - в три регистра: MODER (вход, выход, аналоговый, альтернативн,функция); OTYPER(пушпул/OD); OSPEEDR(скорость);
Перед этим нужно включить тактирование порта в регистре соответствующей шины, а если к линии подключена внутренняя периферия - то еще и выбрать тип альтернативной функции в соответствующих регистрах... Если же для входа нужна подтяжка - задействуем еще один регистр...
Вот и сравнивайте с AVR... :)
Зато когда уже освоил - на PIC и AVR возвращаться нет никакого желания...
-
Они набиты функциями до предела, отсюда возникают сложности при первоначальном изучении, это минус, но это же и плюс - так как купив даже бюджетную сотку (STM32F100) получаешь мощный комбайн почти на все случаи радиолюбительких поделок (т.к. большинство из них сделано на pic/avr, ну у буржуев еще моторолы и неки мелькают). Потом, когда уже более-менее разобрался, что там к чему и появились собственные заготовки, где вся рутинная часть по инициализации контроллера написана и надо только подправить под конкретный проект - дело пойдет быстрее. К тому же и внутри семейств STM8 и STM32, и даже между ними производитель стремился использовать максимально (насколько это технически возможно) похожую распиновку и периферию, чтоб облегчить процесс миграции вверх/вниз по семействам.
Еще мне не очень нравится как написана документация у ST, не особо она легко воспринимается с непривычки, но это придирки - ничего такого с чем нельзя было бы жить, просто можно и удобнее сделать.
Кстати, у ST есть полезная штука STM32CubeMX (и STM8CubeMX), где в графическом редакторе задаешь какие тебе модули необходимы, какие пины, их настройки и затем программа генерирует заготовку проекта с кодом инициализации для одной из нескольких популярных сред разработки на выбор. Сейчас у них появилась своя среда разработки STM32CubeIDE, которая по сути ребрендированный TrueStudio for STM32 (купленный ими со всем Atollic'ком несколько лет назад) со встроенным в него CubeMX. Была у них еще одна бесплатная IDE для STM32 - System Workbench, разработанная компанией AC6 Tools для них, но кажется особо не прижилась она, по итогу сделали ставку на Atollic. Впрочем, и первое и второе - суть есть Eclipse.
Также у коммерческих IDE от IAR и Keil есть бесплатный lite-режим с ограничением размера бинарника до 32к. У Кейла есть, также, бесплатные лицензии для семейств Cortex M0/M0+ (STM32F0, STM32G0, and STM32L0), с ограничением размеров кода до 256к, что для таких контроллеров за глаза.
Но естественно, все средства подразумевают использование языка С. Ассемблер для АРМов хоть и документирован, но для реального написания программ не применяется. Если простая задача быстрее будет слепить на чем-то уже известном, чем тратить время на изучение новой платформы. А если с заделом на будущее, то можно и попробовать.
-
Если переключатель пресетов будет просто размыкать/замыкать по команде несколько релюшек в усилителе, то СТМка явно избыточна, только разве что науки ради. Коммуникационая часть нужна, чтоб управлять им с выносного "ножного" пульта?
-
@ rubin
Насчет логарифмирования - боюсь, тут этот фокус не прокатит... Причина простая - точность аналогового логарифмирования не позволит восстанавливать исходную форму с достаточной точностью... Я немного знаю тему - применяли мы в одной приблуде логарифмирование импульсов в широком диапазоне - так вот там были бооольшие сложности с температурной стабильностью и повторяемостью, да и диапазон в 60дБ был получен упорным трудом моего тогдашнего шефа и учителя (гениального разработчика аналоговых схем, серьезно).
Ну да попробуем и без этого - у меня в заводском Korg'е стоит кодек на 24 с диапазоном, как у 18 битного - и работает, правда шипит на больших гейнах. А может - и не он шипит - там операционник на входе неудачно включен - инвертором (у него питалово 3,3В) - и по сигналу резистор большой, точно не помню, но больше 470к, так что он тоже шумит хорошо...
Буду пробовать. Кодек пришел, но я еще его не приколхозил - макет-то на печатке собран, теперь нужно его частично разобрать и на проводках приклеить кодек, да еще и часть сигналов меняется по выводам проца - мне ж на него нужно I2S подать, да еще в полном дуплексном...
Кстати - ты не разбирался с полным дуплексом на I2S?
Из руководства не очевидно, как его включить...
-
OldMike,
спасибо, так то да - для основной задачи хватило бы любого мк где есть АЦП, епром, возможность заснуть и проснуться по прерыванию и компорт.
И да, все есть для АВР хоть и пылится уже года 4. Но хоть появился бы стимул для освоения С. А если на АВР - я снова все сделаю на асм.
Пожалуй таки я рискну.
Заказал stlinkv2 и пару платок блюпил с stm32f103.
А настройка портов... Для примера, чтобы настроить линию на выход, нужно прописать соответствующие настройки (где 1 битик, а где 2) - в три регистра: MODER (вход, выход, аналоговый, альтернативн,функция); OTYPER(пушпул/OD); OSPEEDR(скорость);
Перед этим нужно включить тактирование порта в регистре соответствующей шины, а если к линии подключена внутренняя периферия - то еще и выбрать тип альтернативной функции в соответствующих регистрах... Если же для входа нужна подтяжка - задействуем еще один регистр...
Вот и сравнивайте с AVR...
если я правильно понял - для вот этого всего предлагается прога куб, которая все это облегчает.. ну ладно - посмотрим.
Если переключатель пресетов будет просто размыкать/замыкать по команде несколько релюшек в усилителе, то СТМка явно избыточна, только разве что науки ради. Коммуникационая часть нужна, чтоб управлять им с выносного "ножного" пульта?
да конечно избыточна и это просто само по себе создает дискомфорт. Хоть там и не несколько релюшек, а гдето 20-30. Какие то из них сидят на i2c, какие то непосредственно.. аналоговый статически сигнал иногда нужно померить. но все равно конечно - мир перевернулся. и - они относительно дешевы. сколько будет стоить АВР через 3г - хз.. и это мертвая ветка. хотя и 51е никуда не исчезли. Просто предлагают за ту же цену 1% возможностей.
Коммуникации мне нужны чтобы настраивать/перенастраивать устройство под изменившиеся нужды, кому то - никогда, кому то постоянно. Раньше предполагал компорт - типа просто внешняя специальная коробочка с кучей ручек и светодиодов. Но в общем то почему бы и не смартфон/пк? - а это тянет за собой некоторый переходник usb/rs232ttl - пусть дешевый - но тем не менее. А с копеечной стм103 этот вопрос может быть закрыт. Ну в общем задел на будущее. Радиоканал в качестве коммуникаций в данном случае - наверное можно - но вроде нет необходимости.
-
Ыыы... Лично мне Куб не понравился... Точнее не так. Он-то мне сначала понравился - типа удобно, но под IAR он чет у меня конфликтовал c программой мигания светодиодом :)(библиотеки HAL не совмещались с более старыми SPL). Я поскрипел зубами, а потом понял, что могу писать на С все в привычном мне стиле Асм: при настройках и с периферией работать непосредственно с регистрами, а способы проверки условий (например - нажатия кнопки или выхода параметра за допустимый предел) - в С очень похожи на Асм...
Так что я не пользуюсь Кубом. Поскольку все мои программы я пишу "для себя", могу себе позволить это делать так, как удобно мне. У меня есть "заготовки" для настройки различной периферии на разных ядрах семейства (ну те, что я уже использовал) и я их использую в новых проектах. Мне так удобнее и привычнее.
Кстати - вот у STM32F103 как раз некоторые настройки отличаются от всех прочих STM'ов - думаю, что этот проц был один из первых выпущен, и тогда еще не придумали, как лучше. Например - порты настраиваются не так, как я описал, USART немного другой, ну и там еще по мелочи.
В общем - советую начать с даташитов... Есть мой перевод на русский, если надо - ну он не всеобъемлющий, но основное я перевел.
А в Кубе я сейчас подглядываю систему синхронизации при включении незнакомых STM'ов - она там довольно наглядная (картинка :)).
В общем - ставь Atollic, IAR, или чего другое понравится, приобрети ST-Link китайский - и вперед!
У меня под эту платку с STM32F103 осциллограф написан :). Можешь прицепить к ней экранчик на ili9341 с SPI интерфейсом - а программу я тебе сброшу - сможешь для начала надергать из нее кусков - настройки портов, таймеров, SPI, DMA...
PS Почему я работаю в Атоллике? Сначала поставил IAR - довольно удобно... Все - кроме создания проекта - для меня это был такой танец с бубном! (возможно - я отупел со свими Асмовскими привычками - но мне было проще в одном проекте все работы делать по разным программам, чем создать новый проект...)
А потом коллега по работе посоветовал Атоллик... Тут, по крайней мере, создавать проект немного легче (особенно если не подключать стандартные библиотеки). Я понимаю - это же Ересь - без библиотек обходиться :), это не по правилам! Но - в стандартных библиотеках всегда куча лишнего - причем лишнего в коде, что замедляет исполнение программы (а для осциллографа или Хаммонда это таки критично). Потому я из библиотек "выпиливаю" нужные кусочки и вставляю себе в проект.
А обольщаться огромным быстродействием STM не стоит - использование "стандартных" С-шных подходов легко сводит его к скорости Atmeg'и.
А с точки зрения удобства работы/интерфейса - и IAR и Atollic и Keil - они как близнецы-братья, все очень похоже.
-
OldMike
В общем - советую начать с даташитов... Есть мой перевод - ну он не всеобъемлющий, но основное я перевел.
У меня под эту платку с STM32F103 осциллограф написан Улыбка. Можешь прицепить к ней экранчик на ili9341 с SPI интерфейсом - а программу я тебе сброшу
спасибо - я очень рад вашей поддержке и вероятно буду обращаться за помощью, форум вообще дружелюбный. Но - по ходу возникновения вопросов. Нет никакого толку от изучения чего-то в отрыве от реального нужного именно тебе дела. Пробовал как то теоретически изучать java. и даже вывел на экран "Хелло" копируя примеры по книжке. не было реальной задачи - толку никакого.
-
Да пожалуйста!
Просто по себе знаю - самое сложное - начать, "съехать с места", потом оно уже катится само. Потому готов помочь, чем смогу.
Продолжим по теме цифровой примочки.
Пока не прикручен кодек, я немного поупражнялся в алгоритмах обработки на 12 бит. Что я хотел добиться - имитировать темброблок. Вообще-то в аналоге можно решать эту задачку разными способами: классический маршалловский/фендеровский трехручечный, одна ручка "тон", как на простых примочках, параметрика, обрезной фильтр с резонансом...
Я делал в примочках своих по-разному, да и не только я...
Решил сделать и одноручечный (он неплохо работает как "презенс" и с трехручечным ТБ) и трехручечный - для имитации разных приборов.
Одноручечный делается в цифре довольно легко - RC цепь с изменяемым временем... А вот классический на 3 ручки - я пока не знал, как сделать. Решил сделать 3 полосы по своему (попробовал реализовать вариант своего ТБ, я когда-то его выкладывал здесь на форуме, он непохож ни на Баксандалла, ни на классику :)). Попробовал несколько вариантов - не то, что нужно ...
Тогда решил для начала сделать регулировку верха и низа. Сделал два фильтра 1го порядка и регулировку уровня сигнала каждого из них. Получилось похоже...
А вот с серединой - не пошло. Я разозлился и начал программировать резонансный фильтр :). За основу взял идею из http://we.easyelectronics.ru/Soft/prostoy-polosovoy-filtr.html - естественно, доработал до нужных кондиций. Оказалось - работает, можно настроить добротность, частоту и уровень сигнала. Получилось неплохо, хотя и не совсем классически (Маршалл в Jackhammer сделал что-то похожее). Покрутил на реальном сигнале и получил вот такие картинки (на входе - синус, он ограничен почти до прямоугольника) - ИМХО таки похоже на осциллограммы реальной примочки:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F2765isy9er.jpg&hash=2fd0dea332921a97e6b3922c3a5a76c91156e50f) (http://img.radiokot.ru/files/99520/2765isy9er.jpg) (https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F2765ixane3.jpg&hash=9822a9951bf5cd871117e5b746f38dade9a86181) (http://img.radiokot.ru/files/99520/2765ixane3.jpg)
На первой осциллограмме верх поднят больше, на второй - низ.
-
@ rubin
К сожалению, с I2S работать не пробовал, не было аудиозадач... Сейчас стало интересно, посмотрел - насколько я понимаю, он есть простецкий, симплексный в F1 и L1 (некоторых их подсемействах), а полнодуплексный точно заявлен в F4, и кажется еще отдельных ветках F3 или F2.
Этот режим и впрямь, очень кратко и странно описан в руководствах, аппнот тоже на него нет. Каких-то управляющих битов специально для него не нашел, возможно, он автоматически включается, когда мы задействуем пин I2Sx_ext_SD, который по сути нечто вроде SPI_MISO, да собственно он и мультиплексирован с ним.
"28.4.2 I2S full duplex
To support I2S full duplex mode, two extra I2S instances called extended I2Ss (I2S2_ext, I2S3_ext) are available in addition to I2S2 and I2S3 (see Figure 263). The first I2S fullduplex interface is consequently based on I2S2 and I2S2_ext, and the second one on I2S3 and I2S3_ext.
Note: I2S2_ext an I2S3_ext are used only in full-duplex mode.
I2Sx can operate in master mode. As a result:
• Only I2Sx can output SCK and WS in half duplex mode
• Only I2Sx can deliver SCK and WS to I2S2_ext and I2S3_ext in full duplex mode.
The extended I2Ss (I2Sx_ext) can be used only in full duplex mode. The I2Sx_ext operate always in slave mode.
Both I2Sx and I2Sx_ext can be configured as transmitters or receivers."
Довольно странно, что эти добавочные сигнальные линии описаны как некие отдельные сущности, дополнительные модули что-ли, и на этом рисунке 263 (который я не привел) они нарисованы двумя квадратиками, хотя на общей блок-схеме приемо-передатчика нарисован просто сдвиговый регистр и все, в карте регистров их тоже нет.
Попалась занятная АН, как эмулировать I2S используя SPI, может пригодится...:
AN5086 - I2S protocol emulation on STM32L0 Series microcontrollers using a standard SPI peripheral
-
Хотя, возможно, насчет отсутствия самостоятельного блока для полнодуплекса я погорячился. Сгенерил Кубом код инициализации для F401 (включив соответствующий режим), и стал смотреть получившиеся исходники - там об этой штуке упоминается (и в коде и в комментариях), как о некоем функционально урезанном IP-ядре по типу SPI, у него там свой базовый адрес в памяти, регистры, и функции для работы с ним.
Жесть какая-то. Ни в руководстве, ни в даташите ничего внятно не написано, надо лезть в библиотечные исходники, чтоб убедится, что модуль реально существует....
-
Спасибо! Я все это читал - и точно так же удивлялся тем же вещам...
Возможно - достаточно включить пин I2S2_ext на альтернативную функцию - и все заработает? :)
Выводить-то по I2S в 16 бит я насобачился, а тут мне нужно 24... А регистр сдвиговый - на 16... Нужно две посылки/2 приема, и не перепутать правый с левым...
Наверное, после выходных попробую таки физически прицепить кодек, сначала вывести на него 16 бит, потом 24, а вот потом пробовать и дуплекс... Ну - и библиотеки глянуть на I2S...
Вообще-то - очень странно... Ведь I2S действительно похож на SPI, а SPI обходится одним регистром и на ввод и на вывод - для чего городить отдельный приемный блок?
Ыыыы....
-
Кажется, примерно разобрался... там действительно есть урезанные "теневые" модули приемо-передатчиков для режима полного дуплекса, они могут работать только ведомыми, и они почти никак не показаны и еле упомянуты словами в основной документации. Более-менее вразумительно, хоть и скуповато, описаны только в библиотечных *.c/*.h-файлах драйверов периферии.
То есть для, включения этого режима помимо правильной настройки соответствующих пинов, надо включить и сами эти IP-блоки. У их регистров свое расположение в адресном пространстве контроллера, и там такая же управляющая структура как и для обычного SPI/I2S. В библиотеках SPL и HAL есть функции чтоб их запустить и настроить. Если больше близок "ассемблерный" стиль прямого обращения к регистрам без абстрагирующих прокладок, то можно посмотреть на внутреннее устройство этих функций и сделать все вручную, аналогично другим случаям.
Вот еще цитата (из библиотеки):
"It is possible to use SPI in I2S full duplex mode, in this case, each SPI peripheral is able to manage sending and receiving data simultaneously using two data lines. Each SPI peripheral has an extended block called I2Sxext (ie. I2S2ext for SPI2 and I2S3ext for SPI3).
The extension block is not a full SPI IP, it is used only as I2S slave to implement full duplex mode. The extension block uses the same clock sources as its master. To configure I2S full duplex you have to:
(#) Configure SPIx in I2S mode (I2S_Init() function) as described above.
(#) Call the I2S_FullDuplexConfig() function using the same structure passed to I2S_Init() function.
(#) Call I2S_Cmd() for SPIx then for its extended block.
(#) To configure interrupts or DMA requests and to get/clear flag status, use I2Sxext instance for the extension block.
~~~~~~~~~~~~~~~~~~~~~~~~~~
Example: To use SPI3 in Full duplex mode (SPI3 is Master Tx, I2S3ext is Slave Rx):
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
I2S_StructInit(&I2SInitStruct);
I2SInitStruct.Mode = I2S_Mode_MasterTx;
I2S_Init(SPI3, &I2SInitStruct);
I2S_FullDuplexConfig(SPI3ext, &I2SInitStruct)
I2S_Cmd(SPI3, ENABLE);
I2S_Cmd(SPI3ext, ENABLE);
...
while (SPI_I2S_GetFlagStatus(SPI2, SPI_FLAG_TXE) == RESET) {}
SPI_I2S_SendData(SPI3, txdata);
...
while (SPI_I2S_GetFlagStatus(I2S3ext, SPI_FLAG_RXNE) == RESET) {}
rxdata = SPI_I2S_ReceiveData(I2S3ext);"
Там этот модуль еще и глючный немного, надо выполнять определенную последовательность инициализации, чтоб не возникло рассинхрона между приемом и передачей. Перед тем как приступать к сопряжению с кодеком, гляньте на этот предмет эррату, чтоб не терять зря время на грабли.
-
Почитал UM на STM32xxx и понял что не зря в свое время выбрал LPC (конкретно LPC4078) от NXP, все-таки у них периферия не такая кривая.
-
Она мало того что малость кривоватая (причем почти все модули - работать вполне можно, но без эррат далеко не уедешь), так еще и стиль подачи информации у ST тот еще... иногда кучу доков приходится перерыть, чтоб получить ясный ответ на достаточно безобидный вопрос. Особенно, в начале освоения - вообще уматериться можно. Как будто квест проходишь. >:(
-
Всех в Праздником!
Да, это тот еще квест, но я уже внутри этого квеста... :)
Вообще-то мне STM нравится - возможно потому, что сравнивать могу только с PIC да AVR...
Ладно - продолжу грызть после выходных.
Нужно понять - как включить этот теневой модуль (тактирование где?) и как его настроить. Я действительно пишу в Асм стиле - (возможно - я туповат :), ибо не люблю структуры) - просматривал я их библиотеки наскоро, и пока не все понял. Чувствую, что придется собрать железо (основная сложность - на макете у меня придется перенести часть выводов, задействованных ранее для работы с экраном и кнопками, и переписать уже отлаженные программные модули) и по одному шажку двигаться вперед...
-
С праздником!
С модулем, насколько я понимаю это дело, примерно так (на примере F405/407). Согласно даташиту:
Регистровые блоки "основных" модулей имеют базовые адреса в памяти
SPI2/I2S2 - 0x40003800
SPI3/I2S3 - 0x40003C00
А "расширенных" соответственно:
I2S2ext - 0x40003400
I2S3ext - 0x40004000
Длина и набор регистров у них одинаковые с "основными", принципы работы тоже, за тем исключением, что они не работают как SPI и всегда slave'вы. То есть, допустим, настраиваем на определенный аудиобитрейт, протокол и формат аудиоданных ведущий модуль, и ставим скажем на передачу, настраиваем прерывания/ПДП (если надо), включаем. Затем тоже самое делаем с "теневым" модулем, устанавливаем его на прием и тоже включаем. Ну или наоборот. Можно даже их обоих ведомыми сделать, наверное, и приемник и передатчик, а ведущим - сам кодек, если в нем такая возможность предусмотрена.
За конкретный порядок операций инициализации ручаться, естественно, не могу - подробно не копал эту тему. Видимо, с этими нюансами и придется чуток подолбаться, чтоб оно нормально "взлетело".
-
Пришел заказанный STM32F401RET6... И я в раздумьях - нужно создать новый макет - и распиновка другая, ибо корпус на 64 ноги да и некоторые альтернативные функции другие...
-
Протравил вчера (наконец то!) плату под новый вариант примочки на STM32F401... Осталось просверлить и заполнить компонентами. Ну и - добиться взаимности от кодека...:)
2 rubin
А вы не в курсе - чет я сразу и не нашел там - тактирование модуля расширения включается отдельно, или он включен при включении основного модуля I2S?
-
Ну наконец-то собрал макет на новом проце! Чуть позже сфоткаю и покажу - он пока на работе, а у меня фотик в телефоне слабенький...
Подключил, запустил отладчик. Проект на новый проц пока не переносил - только общее тактирование настроил, чтобы убедиться, что железо работает. Теперь буду бодаться с кодеком... :)
-
Протравил вчера (наконец то!) плату под новый вариант примочки на STM32F401... Осталось просверлить и заполнить компонентами. Ну и - добиться взаимности от кодека...:)
2 rubin
А вы не в курсе - чет я сразу и не нашел там - тактирование модуля расширения включается отдельно, или он включен при включении основного модуля I2S?
Тоже вот не нашел - вероятно, вы правы - там тактирование общее для всего узла SPI/I2S. Но это, так сказать, то тактирование, которое обеспечивает работоспособность логики модуля в целом. Если я правильно понимаю документацию, есть еще тактирование обеспечивающее собственно передачу данных, несущую частоту, там своя кухня - выделенная PLL для I2S при выборе внутреннего, либо тактовый сигнал будет поступать извне, от кодека, например. В группе регистров, относящихся к системе RCC несколько штук относится к I2S так или иначе.
-
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F28322x3lqx.jpg&hash=9bf7c70e7e5ca3119510245038721a3cc9005cc7) (http://img.radiokot.ru/files/99520/28322x3lqx.jpg)
Ну вот...
Я и имел в виду тактирование узла, включающее его в работу.
Насчет настройки тактирования передачи данных I2S я разбирался на проекте органа и даже сумел настроить(!) вывод звука :) на чип CS4344....
Настройка I2SPLL у STM32F401 немного отличается от таковой в STM32F411, но я это поборол. Если чип кодека исправен - то я вывод с него запущу, скорее всего, без особых проблем...
Мне бы с вводом разобраться...
Ну это - после выходных.
Спасибо за ответ!
-
Итак - никогда не нужно заранее раздавать авансы: "....я вывод с него запущу, скорее всего, без особых проблем..."
Без проблем не получилось. Протрахался пару часов - выводит, но как-то криво... Короче - разрядность выводимого сигнала не соответствует желаемой (хотел 24, потом хотя бы 16 - но он упрямо не хочет брать пару старших разрядов, превращая их в искажения). В общем - завтра попробую тупо посмотреть осциллографом сам протокол - чего он там реально выводит и если все по даташиту - то виноват кодек (возможно - я чего-то не учел)...
Если подробнее - выводил табличный синус, выводило с явным превышением разрядности ("складывало" сигнал), пока я не стал делить сигнал на 4 (я пробовал и сдвигать - почему-то делению на 4 соответствует сдвиг вправо на 4 разряда - я знаю, что нонсенс, но так получалось). Потом я отключил оптимизацию :) - стало работать немного по-другому, но все равно криво... Пробовал перенастроить на 16 бит - все равно фигня-фигней выходит... Кодек - CS4272, режим stand along, i2S. Ничего не понимаю! (с) Братья пилоты
-
Пока ничего не получается! :(
Смотрел сигналы I2S между STM и CS4272. Осциллограф показывает картинку, как в даташите (синхронизировал сигналом LRCK, данные - 24 бита, и 8 нулей). А вот сигнал на выходе ЦАП (табличный синус) - неустойчивый. В смысле - он не дрожит и не дергается, но может после сброса стартовать нормально, может - с инверсным знаком... Незначительные изменения в программе (например, изменение длины программы прерывания - добавление строки даже с пустой командой), которые не должны влиять никак на протокол передачи и которые не влияют на картинку (данные - 24 бита, и 8 нулей и все как раньше) - но сигнал на выходе ЦАП может вообще пропасть или выродится в какой-то шум... С чем это связано - я так и не понял. Вообще-то, человек, что прислал мне эти микросхемы, говорил, что они вероятно подделки...
А других у меня нет... Че делать? Кто виноват? :o
-
@ OldMike
Очень сожалею, что ничем не могу помочь - в области цифровой обработки, передачи данных и т.п. я полный 0. Могу лишь как-то морально поддержать. За цифрой будущее (а, вообще-то уже и настоящее), не надо бросать эту тему.
P.S. С уважением и белой завистью.
-
Самое обидное - я ведь до цифровой обработки пока и не добрался... Я просто пытаюсь настроить железо - а оно упирается. Китайцы задолбали - с их поддельными микросхемами. Если б она просто не работала - тогда понятно... А это - вроде работает, но совсем не так, как написано. Я уже и по науке смотрел, и методом тыка пробовал... Привлек умного коллегу на помощь - а оно все равно не работает, а выделывается.
Типа - ну мы чего-то поменяли. например задержку отпускания Ресета при инициализации - хоба, вроде работает. Еще добаваили задержки - раз, уже не работает. Вернули на место - а оно уже и тут не работает, но по-другому, чем перед этим.
И так - весь день.
-
Сомневаюсь в полезности совета, но тем не менее - может в отладочных целях окажется полезным выводить константные значения (различные), а не отсчеты синуса. Естественно, звука при этом никакого не будет - будет постоянка на выходе ЦАПа, но зато обмен станет проще контролировать осциллографом, так как данные не меняются - ничего мельтешить перед глазами не будет.
Кстати, кто источник тактирования в системе - кодек или проц?
Еще не может ли быть такой момент, что кодек должен быть предварительно сконфигурирован на определенный режим работы - допустим по I2C (не I2S) или загрузкой данных из EEPROM (опять же, скорее всего I2C-ной). Возможно, внутри него есть блок преобразования входящего битстрима к какому-то определенному выходному формату по разрядности и/или частоте, варианты действий как преобразовывать - масштабировать, лимитировать "полкой" сверху/снизу, или тупо по цифровому клиппировать с переполнением разрядной сетки и этими вот характерными "провалами верхушек".
Даташит на кодек, честно говоря, не читал - так что это просто мои фантазии, мысли вслух.... но в общем случае подобная ситуация, наверное, возможна.
-
Китайцы задолбали - с их поддельными микросхемами.
это какие?
-
Еще не может ли быть такой момент, что кодек должен быть предварительно сконфигурирован на определенный режим работы
Вообще-то там 6 режимов формата данных по I2S, соответственно нужно привести кодек в соответствие с потоком данных от проца по I2C/SPI. I2C предпочтительнее, так как с ним есть уверенность, что чип воспринял конфигурацию (по биту ACK). Конфигурация по SPI "слепая", без возможности контроля.
-
@ KMG
Привет! Даташит я читал... Там есть 2 глобальных режима: Stand-Alone и Software. Я использую первый из них. В нем возможно только 2 формата приема данных: I2S и Left Justified, переключаются пином 13 I2S.
Так что у меня кодек аппаратно настроен на I2S. Есть рекомендованная последовательность включения - ее я тоже соблюдаю.
Просто для моих целей был вполне достаточен режим Stand-Alone, ибо мне не нужны дополнительные опции, а Software предполагает усложнение схемы, а главное - программы.
Сегодня для проверки прицепил на проводках CS4344 - и вуаля - заработало на всех настройках, на которых CS4272 работать не захотел... так что CS4272 какой-то левый...
2 rubin
Константу я пробовал - но по ней еще труднее понять что-либо. А еще там есть, если не ошибаюсь, цифровой ФВЧ, отрезающий постоянку...
2 VAT
Для осциллографа пытался заказать AD8065 - заказывал в разных местах и теперь у меня коллекция подделок (перемаркировок) - ни у одной из них нет заявленной полосы пропускания (140МГц), причем у одной полоса 1МГц, еще у одной - полоса около 40Мгц, но входы явно биполярные (имеется ощутимый входной ток) и т.д. И выглядят они немного по-разному...
Купил память (блин - схема на работе, тип не помню) 4Мб, SPI - вообще не отвечала...
Вот этот CS4272... На вид - вроде аккуратно отмаркирован - только по отметке 1 вывода под микроскопом видно, что его сошлифовывали...
Спасибо всем неравнодушным за советы! :)
-
воблин..
это али? какие то претензии предъявляли?
мне нужно несколько stm32f103 типа что на блюпил приобресть, и проверить то как то непросто - запаяешь такое в платы и ломай голову.
-
У меня пара блюпиллов есть - точнее, остался один, а проц со второго стоит в осциллографе - претензий к ним нет, работает устойчиво даже с разгоном.
А вот отдельно процы я на Али не брал - брал в Харькове на Космодроме и у нас в магазинчике... Тоже все норм.
Полагаю, что 103 подделывать вряд ли будут - они и так копейки стоят, да и выпущено их множество.
Подделывают что-то дорогое, маркируя под них более дешевое.
На Али я брал TFT экранчики - тоже лажа - из 8 разных заказанных экранов 3 пришло битых, деньги вернули - но зачем этот геморрой? В общем - нужно хорошо смотреть отзывы и не пытаться купить что-то эксклюзивное по-дешовке...
-
В общем, решил я разбарахолить звуковуху... Есть у меня Audigy4 - у нее внешний блок работать перестал. Возможно проблема в кабеле - я не разбирался, мне ее просто отдали без кабеля, так и лежала, ждала лучших времен. А ней есть 3 ADC очень приличного качества - PCM1804...
Сниму-ка я один из них и попробую приклеить его к макету... Иначе я проект вообще никогда не закончу! :)
Думал я снять кодек с какой-нибудь старой мамки - у меня пара есть, да и на работе у компутерщиков их десяток... Но... Они все имеют интерфейс стандарта АС 97'. Я в нем сильно не разбирался, но ознакомился и понял, что там данные идут совсем не так, как в I2S - они идут кадрами, в кадре не только данные, но и служебная информация. Я смог бы наладить и такой интерфейс, но - мне ж нужно, чтобы проц звук обсчитывал, а не интерфейс ублажал! I2S работает аппаратно, ему только данные по прерыванию нужно сбрасывать и все, а тут нужно пачку формировать и вручную отправлять, принимать и анализировать тоже руками. Времени на обработку сигнала может и не хватить. Так что от этой идеи я отказался.
-
Пришли StLink v2 (китайский) - но вроде проапгрейдился родной утилитой и в общем то не вызывает пока вопросов.
а вот 2 блюпила что пришли - c префиксом не STM как на сайте продавца с али, а CKS - и тут чтото идет не так.
через USB-COM он шьется системным загрузчиком нормально, а через STLink как то все напряжно.. законнектится можно нажав до и опустив ресет после "коннект" и что это за фигня я пока не разобрался. Похоже в китайской версии есть какие то инновации. Но тестовую программку с мигающим светодиодом записываю и удаляю через оба интерфейса.
Смущает то что зацепить в режиме отладочном к Атоллику тоже по простому не удается - тоже видимо давя ресет можно - но не пойму - это норма или нет.
Не знаю уж насколько отладка через STLink упрощает - никогда не пользовался отладочными средствами кроме светодиодов.
как то получается что шить/перешивать можно сколько хочешь при любых положениях свичей BOOT -но как только дал ресет и прошивка исполняется - чип дает отлуп и нужно жать ресет и коннектится в таком подожении
-
Привет! Причина может быть в следующем - если ты перенастраиваешь (по недосмотру, например, настраивая соседнюю линию PA12) линии портов, через которые подключен ST-Link (PA13 и PA15) - скажем, сбрасываешь их в положение "вход", то через ST-Link связь с компом после программирования теряется... Я на эти грабли тоже наступал, но мне подсказали добрые люди :) Для выхода из ситуации как раз и служит коннект под "ресетом".
Первое - проверь в тестовой программе - PA13 и PA15 не должны модифицироваться (для перенастройки портов А лучше использовать операции "чтение-модификация-запись" в регистре GPIOA->MODER), а если дело все же в кристалле (да вряд-ли) - StLink имеет и линию сброса, его нужно тоже подконнектить и все будет работать.
-
Спасиб.
да я не планировал прям сейчас заняться программированием - только проверить что к нужному моменту у меня все есть. но похоже придется повникать.
Мне нужен режим сна, а это и по опыту с авр с асмом была штука непростая. Пока задача устаканить схемотехнику и то что в принципе всего достаточно и нужна только программа
в качестве примера я тупо по серии уроков в инете прошел немного - там моргает светодиод и он не на портах занятых под SWD, правда там по STLink не упоминалось и я подумал - а нахрен я его купил? если честно я пока не пойму - нужная это вещь или нет.
-
STLink - удобная штука. Во первых - она штатно подключается ко всем программно-отладочным средам (я сейчас работаю в Атоллике), во-вторых - она позволяет удобно отлаживать прогу с остановами в нужных точках и просмотром регистров периферии и переменных. Ну это - то, чем лично я пользуюсь (она еще кое-чего может :)). Хорошо помогает, когда периферия не хочет работать (а по-первах она обычно не хочет работать!) - можно посмотреть, что именно настроено.
Правда - занимает две линии порта и об этом нельзя забывать, иначе приходится заходить из утилиты под сбросом, чтобы все настройки ресетнуть.
По портам: чтобы избежать ошибок, настраивай их, как я описал, например:
GPIOA->MODER |= 0x00200000; //PA10 AF = (10)
Это я настроил линию PA10 на альтернативную функцию (и не трогал PA13 и PA15!!!!)
Так гораздо проще избежать ошибок, особенно если настраиваешь не все линии портов одновременно, а по мере подключения периферии.
Да, я настраиваю периферию именно так - без Cube и структур, которые так любят приводить в видеоуроках разные "гуру". Мне так удобнее.
А светодиод у тебя не на тех выводах, но при настройке светодиода ты скорее всего перенастроил (сбросил) PA13 и PA15 - а они должны быть настроены на альтернативную функцию.
PS Я наконец собрал очередной макет цифровой примочки, на днях попробую оживить. По частям, для начала...
-
Итак... Запустил сегодня таки макет - пока только АЦП-ЦАП. Т.е. с генератора - на вход, оцифровка, затем вывод через ЦАП на осциллограф. АЦП - РСМ1804, ЦАП - CS4344, 24 бита 31.25 kHz и туда и обратно. Прерывания идут в 2 раза чаще - 62.5 kHz(ошибочка! см. пост ниже), ибо данные передаются по 16 бит и это нужно учесть - думаю, придется разносить ограничение и реверберацию по чет/нечет прерываниям, иначе не успеет обработать.
По настройкам STM: как ни странно, дополнительный I2SExt настроился без проблем - я настроил его точно так же, как основной, только режим я выбрал "ведомый - прием" вместо "ведущий-передача", и все сразу заработало.
Прерывания вызываются ведущим I2S по флагу пустого буфера передачи TXE, в начале прерывания я считываю данные с АЦП - ЦАП и АЦП работают строго синхронно и вызывать второе прерывание по RXNE не нужно.
Ну - буду потихоньку к проге подключать уже отработанные куски, посмотрим, что выйдет... Лишь бы хватило производительности - в прототипе я ж прерывания вызывал по таймеру в 2 раза реже, а здесь их вызывает I2S, а процедура входа/выхода из прерывания довольно длинная. Ну - есть еще небольшой резерв разгона, думаю, что раза в полтора этот проц тоже можно безболезненно разогнать...
-
Попробовал сегодня немного доработать прогу...
Сообразил, что прерывание от I2S идет с частотой 125 kHz - потому что 2 канала и 2 посылки на канал... Хреновенько, но ничего не сделать - нужно принимать данные (у меня на вход задействован один канал - левый, но если с правого не считывать - данные перестают обновляться - наступает overwrite), и отправлять их тоже в оба канала - оба полуслова по 16 байт (младший передаю 0, ибо особо не влияет), или тоже перестает генерировать MClk и начинает рвать выходной сигнал.
А хреновенько - потому, что слишком часто прерывание, могу и не успеть обработать сигнал, даже поделенный на все четыре прерывания на один отсчет. Пытался сегодня одно ограничение настроить - начало сбоить. Пришлось его немного разогнать (до 100 MHz) и только дома сообразил, что у меня отключена оптимизация (отключил на всякий случай, когда боролся с дохлым кодеком). Так что может там и не так все плохо...
Придумать бы, как это все отсинхронизировать без прерывания от I2S? Ну, типа, прерывание от таймера на 31.25kHz, а обмен с I2S по DMA... Но как сделать жесткую синхронизацию процессов? Теоретически возможно, думаю, а на практике могут быть сюрпризы...
-
нда.. я вообще то к сожалению не программер, жизнь заставляла иногда - и вот авр с асмом просто шел как по маслу.
какие доки нужны для хотя бы просто врубиться в синтаксис С для STM32?
я вот не пойму - регистр RCC_RC, цитирую из инета
Следующая строчка записывает число в регистр RCC_CR:
....
RCC->CR = 0x00010000;
я понимаю что записывают в регистр - но все остальное я вообще не могу осилить . каким образом посреди названия регистра вклинилось ->
причем это как раз аналог асма я так понимаю, не через HAL или LL.
что скажете про LL кстати.
почему то ощущение что асм компактнее на порядок не только по коду но и по тексту да и нагляднее. А тут походу надо осваивать слепую печать для начала..
-
я понимаю что записывают в регистр - но все остальное я вообще не могу осилить . каким образом посреди названия регистра вклинилось ->
Операторы в C и C++ (https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B_%D0%B2_C_%D0%B8_C++)
a->b - Обращение к члену структуры, объединения, класса («член b объекта, на который указывает a»)
Блок RCC скорее всего объявлен как указатель на структуру, включающую регистр CR.
RCC->CR - если RCC объявлен как указатель на структуру.
RCC.CR - в случае прямого обращения к структуре.
Неплохая книжка:
Толковый словарь стандарта языка Си Автор: Рекс Жешке
-
да я надеюсь что там все разумно..
-
Миша, как всегда, точен в определениях и академичен! Респект!
Сам я в С откровенно слабоват, спасает то, что в нем одно и то же можно записать разными способами, вот я и не заморачиваюсь, пишу, как в Асме.
А запись вида RCC->CR вполне удобна, RCC указывет на конкретную периферию (в данном случае RCC - это система тактирования, синхронизации и сброса) или иную часть архитектуры проца, а CR - на конкретный регистр (СR - контрольный регистр).
Конкретные названия периферии, регистров и битов настроечных регистров содержатся в файле определений. Например, Атоллик при создании проекта сам его подключает. Я широко пользуюсь этими определениями - они помогают не хуже комментариев вспомнить, чего я там настраивал и где.
Например:
RCC->CR |= RCC_CR_HSEON; // Включение HSE
если выделить RCC_CR_HSEON и нажать клавишу F3 (в Атоллике! :)), то откроется файл определений на регистре RCC->CR на значении RCC_CR_HSEON. Там же можно посмотреть, как называются другие биты этого и других регистров, когда нужно их применить.
Ну и самое главное - начинать нужно, как и в Асме - с изучения архитектуры проца и его периферии. Если этого не знаешь - не спасет никакая книжка по языку С...
А по С, лично я пользуюсь только аналогами Асмовских операторов циклов, проверок условий и пересылок данных. И прога у меня на Асмовскую похожа получается :).
PS Кажется придумал, как мне обойти учетверенную частоту прерываний! Попробую-ка я вызывать лишь одно прерывание с частотой 31.25kHz не от таймера, а по EXTI от ножки, на которую выводится сигнал WS (левый/правый). А данные на ЦАП/АЦП слать по DMA.
Если получится, то прога должна успеть все обсчитать.
-
Как ни странно - это у меня получилось ! :)
Сейчас у меня одно прерывание на 31.25 kHz (EXTI), данные ЦАП/АЦП идут по DMA. Красота. Дело за малым - сделать правильный алгоритм ограничения и удобный интерфейс...
Всего-то. Фигня вопрос! :)
-
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F28vxyge1cg.JPG&hash=6a49fc3fa2a66eceea9ec39a9ac2a249c1dd4524) (http://img.radiokot.ru/files/99520/28vxyge1cg.JPG)
Вот так выглядит схема на сегодняшний день...
Вход INB на железе подключен к средней точке и не используется - схема рисовалась "на будущее".
Программно работают только ЦАП и АЦП, экран пока не подключен.
Воевал немного сегодня с плавным ограничением... Кое-что получается, но еще много работы, чтобы получилось так, как я хочу, а не так, как получается :)...
-
Исправил схему - меня к тому подвигла еще одна ошибка - причем ошибка не только в схеме, но и в железе: я не проверил таблицу альтернативных функций и нарисовал подключение энкодера не к тем пинам (сделал, как у STM32F303). Пришлось подвесить пару перемычек, благо свободных пинов еще хватает...
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F2909h3y63i.JPG&hash=2dd9e27fa86dbbede6cf40b371d089d433009692) (http://img.radiokot.ru/files/99520/2909h3y63i.JPG)
И выглядит макет на сегодняшний день так:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F2909ldg35u.jpg&hash=900feeb28ec7bb0c7a469f8914e4a548366d3935) (http://img.radiokot.ru/files/99520/2909ldg35u.jpg)
Энкодер я прицепил и могу играть любым параметром - пока использую его для настройки плавного ограничения - там не все так просто получилось. Способ, который я применил, относительно прост и не занимает много времени - но его нельзя сразу привязать к какой-либо таблице - передаточной функции, приходится настраивать по одной ступени ограничения последовательно, а их там - 8.
И все это выводится на осцилл, который собирает на вход еще и помехи от компутера...
Уже приходят мысли - прицепить TFT (его все равно цеплять) и выводить на экран кривую, что получается при ограничении? Немного лениво такое писать... Но как-то с заданными кривыми же нужно сравнивать?
А еще не помню, где у меня учебники по ламповой технике... Кто-нибудь помнит, где есть ламповая передаточная функция для каскада с общим катодом? (не ВАХ, а ф-я вход-выход)? Я кончно могу подключить лампу и попробовать сам снять - но где-то я видел готовые уже... Помогите, кто знает, плз... :)
-
Кто-нибудь помнит, где есть ламповая передаточная функция для каскада с общим катодом? (не ВАХ, а ф-я вход-выход)?
Вот это?
(https://www.jj-electronic.com/images/stories/product/preamplifying_tubes/ecc83s/ecc83s_popis_002.jpg)
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fu5m2n9c3.stackpathcdn.com%2Fpdfhtml%2F0809%2F1041179%2Fpage5.png&hash=0116e5ddfa4360f8d19fcea2906fa4403361fd78)
-
Спасибо, Миш. Почти...
Это статические характеристики.
А мне бы - динамическую - я не совсем представляю, как ее из этого получить.
Т.е. - каскад с ОК (12АХ7, катод - на земле, анодный резистор - 100к, напряжение - 300В). И график - по оси Х - напряжение на сетке (включая положительное), по оси Y - напряжение на аноде...
Чет вот такого хочется - чтоб это можно было таблично описать... :)
Интересует нелинейность во всех проявлениях.
-
Можно попробовать прогнать кусочек схемы в какой-нибудь спайс-программе и на основе полученных виртуальных осциллограмм вручную построить необходимые зависимости. Но это получится в конечном итоге симуляция симуляции, ну и несколько трудоемко это.... Еще есть научные работы и патенты (в том числе и открытые) по моделированию аналоговых звуковых цепей, но опять же их надо искать и изучать - на роль быстрого решения не подойдет. Хотя если нужно просимить всего один/два простых каскада, то может и несложно будет.
-
Ну кое-что я и сам в этом направлении делал - тут (на сайте) была и моя статья по ограничению на лампах, но после обвала сайта она, похоже, не сохранилась...
Я не уверен, что спасовские модели отражают на 100% реальные характеристики - мы ведь лампу вгоняем в ограничение, а обычно ее используют на линейном участке характеристики...
Ладно - кое-что я понимаю, но хотелось большего. Я еще не совсем представляю, как я это могу смоделировать, но хочу попробовать.
-
а кусочнолинейные апроксимации и табличные всякие приемы не помогут? Рисуй что хошь.
И еще подумалось что если хочется приблизится к аналоговому оригиналу - то это задача для искусственного интеллекта.
-
Насчет аппроксимаций я думал... Может еще и вернусь к этой идее. Минус такого подхода - более сложный алгоритм пересчета (чем у меня :)). А поскольку я хочу имитировать до 4х каскадов да еще реверберацию - может не хватить быстродействия. А вообще нужно попробовать расписать алгоритм - может он и не намного сложнее. У меня сейчас заданы 8 порогов и 8 коэффициентов ослабления. Сигнал, который достиг очередного порога, выше него идет с другим коэффициентом ослабления и так 8 ступеней в цикле. Последний коэфф. у меня сейчас - 0, т.е. это жесткий порог, над которым уже не может быть ничего.
В принципе - похоже на кусочную аппроксимацию, с той разницей, что внутри каждого куска форма исходного сигнала сохраняется, меняется только масштаб от куска к куску.
Ну и конечно - тот же вопрос - где взять исходные данные для таблицы? Хоть бери и меряй реальную лампу... Точек так 200... или 256... :)
PS за неимением искусственного интеллекта будем применять естественный! :)
-
Сегодня вроде добил мягкое ограничение - по выходному сигналу получилось что-то вроде ограничителя на ОУ со светодиодами, хотя, пожалуй, еще мягче: начало ограничения более раннее и плавное, а потом довольно круто нарастает.
Вот на фото я крутил гейн на полном сигнале - от 1 и до 200 примерно (гейн - линейный, т.е. вначале нарастает довольно резко, потом плавнее).
Входной сигнал - треугольник максимального размаха (24 бита, генерится программно).
Прошу прощения за качество фоток - очень спешил. Ну форму-то сигнала там разглядеть можно, потому и выкладываю:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F291gc33qh6.jpg&hash=344563c58ea02f5790b4d9843c73e5e0e74e01b7) (http://img.radiokot.ru/files/99520/291gc33qh6.jpg) (https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F291gchznu3.jpg&hash=5a204449fc6337039b561f947e88f15d3c434858) (http://img.radiokot.ru/files/99520/291gchznu3.jpg) (https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F291gcuc8si.jpg&hash=ef4efa1be0d6f26569d610fabc877d3c442403c3) (http://img.radiokot.ru/files/99520/291gcuc8si.jpg) (https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F291gd6r5mb.jpg&hash=e5f5950be11f0071e9bcffcd8205207f13f7e7a0) (http://img.radiokot.ru/files/99520/291gd6r5mb.jpg)
Ну это я сделал в цифре "полупроводниковое" мягкое ограничение. Пожалуй, наиболее близкий аналог по форме выходного сигнала - ограничитель с кучей последовательных диодов в обратной связи, где каждая пара встречно-параллельных диодов запараллелена еще и с сопротивлением, причем сопротивления все разные - составляют подобранный ряд... В функциональных генераторах применялись подобные схемы - из треугольника синус делать... :) По мере нарастания сигнала открывающиеся диоды шунтируют последовательно резисторы от больших номиналов к меньшим, ступенчато уменьшая усиление каскада. У меня похожий алгоритм.
Жесткое ограничение можно из него же сделать, всего лишь заменив табличку с порогами. Может и не нужно - на самом деле жесткость ограничения определяется больше гейном, чем характеристикой ограничителя (на больших гейнах, конечно).
Насчет лампового ограничения пока думаю - там ведь не только нелинейность нужно задать, но и несимметричность входного сопротивления - сеточные токи - для правильной динамики...
-
Вот живой пример перегруза с мягким входом в ограничение до полного жесткача (Red Llama overdrive process at different input signal values (10mV/440Hz, 30mV/440Hz, 100mV/440Hz, 300mV/440Hz):
-
Здорово! Ну это же полупроводник? Хотя искажения на вид правильные...
Я сегодня тоже времени даром не терял :) - попробовал сделать асимметричное ограничение по типу лампового - круглое снизу и чуть скругленное сверху:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F292i022x6s.jpg&hash=048039d98ab416bb53211cebcf964a74cea974cf) (http://img.radiokot.ru/files/99520/292i022x6s.jpg) (https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F292i0hmd0k.jpg&hash=2db13d437a303a2d80efb736787216e52513d9da) (http://img.radiokot.ru/files/99520/292i0hmd0k.jpg) (https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F292i0sydrk.jpg&hash=a58141dd6d01531a0967d0ed55f8ca82a5994e2a) (http://img.radiokot.ru/files/99520/292i0sydrk.jpg)
Это я снимал лампу ECC83 лет 10 назад...
А вот чего получилось сегодня:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F292i2kmvud.jpg&hash=91e12ee48ad274b7300704ef07d37d26b1aee213) (http://img.radiokot.ru/files/99520/292i2kmvud.jpg) (https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F292i317dkd.jpg&hash=6d6caea07c1967efa77bbf2f35558dc563aa36b5) (http://img.radiokot.ru/files/99520/292i317dkd.jpg) (https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F292i3d06gg.jpg&hash=8e80abce6d1004dbb46791488d59bc28b97b7398) (http://img.radiokot.ru/files/99520/292i3d06gg.jpg) (https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F292i3my8en.jpg&hash=8f754cfda51f7e0016e3f00b9fa1a4388420317a) (http://img.radiokot.ru/files/99520/292i3my8en.jpg)
Ну - это просто ограничение...
А потом я напрягся, и добавил немного имитации сеточного тока. Что это дает? А переходные процессы с изменениями скважности на атаке и затухании.
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F292i577r3q.jpg&hash=2debd54ef23e5a0f9880949bbbda2236a3cb9d69) (http://img.radiokot.ru/files/99520/292i577r3q.jpg) (https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F292i5j00zn.jpg&hash=f878a4af3ca9eea7be800eee1613a04af8049fe9) (http://img.radiokot.ru/files/99520/292i5j00zn.jpg)
Здесь это выражается в том, что на второй картинке, где сигнал больше, импульс шире, чем пауза (а на реальной атаке скважность должна еще и "дышать" немного ). Тут главное - не перестараться, если скважность сильно уходит - звук становится неприятным...
Ну - до звука я пока не добрался, начинаю настраивать интерфейс - экран, кнопки, менюшки - хотя бы начерно нужно это сделать, чтобы можно было менять параметры и слушать...
PS Сделал скриншоты по правилам - на флешку, теперь жалею - на телефон красивее выглядело :).
-
Вот ещё картинки, вдруг пригодятся.
Есть у меня экспериментальный примус на низкогейновой лампаде 6Н3П, с питанием 50 Вольт. Звук его мне нравится, для блюза или блюз-рока он вполне пригоден.
Сначала картинки с минимальным гейном после первого триода, чтобы второй триод не вносил никаких искажений.
300 мВ/400 Гц:
https://yadi.sk/i/Y0q_t6S5BEJnAw
1 В/400 Гц:
https://yadi.sk/i/UQTkHCqRKRanDA
3 В/400 Гц:
https://yadi.sk/i/RpPi9THIVtbtGQ
Видно, что жёсткий обрез возникает лишь при запредельных входных сигналах, в реальности же звук просто слегка компрессируется и ужирняется.
С двумя каскадами (ручка гейна выставлена на 2/3) получается гораздо интересней.
30 мВ/400 Гц:
https://yadi.sk/i/W2nNRrNToaaMsg
100 мВ/400 Гц:
https://yadi.sk/i/9jiGR6s-ypPOtw
300 мВ/400 Гц:
https://yadi.sk/i/Sv3oI8euAhiMxQ
1 В /400 Гц:
https://yadi.sk/i/JTHYLMXWCOjbHg
3 В/400 Гц:
https://yadi.sk/i/QvefR-XVlwP4tg
Забавно, но при 100 мВ искажения выглядят как германиевая пара, а искажения при 30 мВ похожи на Рэнджмастер :)
-
Если примус не слишком сложный, что если попытаться сделать с него цифровую модель "слепок", и потом можно будет их сравнивать в лоб - реальный прототип с имитацией?
-
Как я заметил, у лампочных примусов мягкие искажения начинаются издалека, задолго до захода в зону грубой и явной нелинейности.
Возможно, именно это является основным компонентом их привлекательности :)
-
@ KSG
Если не трудно - закинь картинки мне на мыло? old1mike@gmail.com У меня ж Яндекс недоступен в принципе... А посмотреть интересно. Да, лампа вначале компрессит и сатурирует, а только потом начинает клиппировать, причем асимметрично. Вот это-то и интересно!
@ rubin
Ну лоб-в-лоб вряд ли выйдет - в аналоге и у меня все же совершенно разные принципы формирования сигнала, моя модель вряд ли будет точной.
Не в смысле плохо звучать (ну если получится, как я хочу :)), а в смысле точной копии чего либо.
Сегодня вдруг застрял на подключении TFT экранчика - чет с лету работать не захотел, хотя вроде прикручен правильно и прога та же самая, что отлично работала на 303м проце... Возиться времени не было особо - может завтра повоюю...
Вопрос к "монстрам программирования" - в некоторых поделках, например в простом осциллографе на "голубой таблетке" (без аналоговой части - он на нескольких сайтах валяется) встречается реалтаймовое FFT... Не попадались исходники где-нибудь FFT по-проще? Интересно бы глянуть...
PS А где делся Ператрон? Тему замутил, а самого не видно... Сделал он чего хотел на Ардуине?
-
Ператрон присоединился к большинству.
-
@ OldMike
Ператрон умер... :'(
-
Жаль...
-
Подключил TFT экран - все-таки в разных ядрах SPI работает по-разному. Оказалось, что для переключения разрядности у STM32F401 нужно предварительно выключать SPI, переключать бит разрядности, затем снова включать - на STM32F103 работало и без выключения SPI (команды и данные имеют разную разрядность).
Вывел пробную картинку
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F296fgre6i9.jpg&hash=c12bfbfaaf946af1c648e7b56054bbb944476f5a) (http://img.radiokot.ru/files/99520/296fgre6i9.jpg)
Теперь нужно придумать удобный интерфейс...
Всего-то :)
-
Пишу по-немногу интерфейс...
Много нудной и неинтересной работы.
Думаю - напишу для начала кусок редактирования искажалки - и попробую послушать - чего вышло... Или - не вышло :)
-
Для отстройки спаял Тубскример на своей же платке образца конца 80х... из всякого и палок :)
Буду по-немногу покаскадно приводить в соответствие цифру с аналогом.
-
У меня в закромах лежит бюджетный процессор Zoom B1.
Хотя он изначально предназначен для баса, в нём есть вполне приличные звуки и для гитары.
Если надо, могу сделать серию картинок работы его перегруза.
-
Не вижу принципиальных препятствий получить любые монотонные апроксимации хоть на диодах не говоря уже о процессоре - но видимо дело не в этом. Там динамика какая то..
-
@ KSG
Спасибо! У меня есть возможность снять формы с разных приборов - как в виде макетов, так и в виде готовых усилителей-примочек. Да я их много и снимал раньше - где-то есть фотки. Просто решил начать со знакомого прибора, причем сделать это прямым сравнением - и покаскадно (в этом смысле Зум мне никак не поможет, да у меня самого есть бюджетный Корг :)). Форма - ведь далеко не все, просто хочу посмотреть именно прохождение сигнала по цепочке.
И вот тут меня внезапно ожидала засада: получил на первом каскаде знакомого, как зубная щетка, тубскримера странную форму сигнала:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F29hvftkzo4.jpg&hash=22084f6df05294c562a3263e9d5ec3ceadac3291) (http://img.radiokot.ru/files/99520/29hvftkzo4.jpg)
Синий луч - аналоговый сигнал непосредственно с выхода 1го ОУ, желтый - цифровой (схема - стандартнейшая, ОУ - 140УД7, диоды - кремний, сигнал - синус). И вот не могу понять - подъем кривой к концу каждого полупериода обозначает подъем НЧ... Откуда он? Как он формируется? Цепочка ООС на входе ОУ наоборот, режет НЧ с частоты около 1 кГц (47нФ и 4,7кОм), а на видимом сигнале - подъем НЧ... Усиление каскада - ну раз 20-40 примерно стоит. Не понимаю... :(
-
Я тоже удивлялся таким гнусным кривулинам (звучащим, тем не менее, вполне пристойно), пока не нашёл этому объяснение:
https://www.electrosmash.com/tube-screamer-analysis
-
Спасибо, посмотрю.
-
Посмотрел :)
Ничего особо нового вроде не увидел... Но задумался над фразой о сдвиге фазы ФВЧ и кажется понял: такая форма сигнала получается от сложения прямого сигнала с фильтрованно-ограниченным таки из-за сдвига фазы ФВЧ. Попробовал смоделировать - получается похоже, хотя и не 1:1.
Спасибо за подсказочку!
-
Было сегодня время - подогнал немного Tubescreeemer программный :).
Вот формы сигнала на среднем гейне на выходе первого каскада - синий луч - это аналоговый сигнал, желтый - цифровой:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F29k2ebcspv.jpg&hash=f6e4d590ae2da8e88f33ef66bb9c9c7321877c02) (http://img.radiokot.ru/files/99520/29k2ebcspv.jpg)
Вот сигнал на выходе примочки при положении ручки Тон на максимум, синий луч - это аналоговый сигнал, желтый - цифровой:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F29k2gliv51.jpg&hash=65fd61fa8a48d88232752ddd55f0bcba711e28a3) (http://img.radiokot.ru/files/99520/29k2gliv51.jpg)
А вот сигнал на выходе примочки при положении ручки Тон на минимум, синий луч - это аналоговый сигнал, желтый - цифровой:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F29k2hfrekm.jpg&hash=803b8fb3357f9a5cde69c096c219f26932afeddc) (http://img.radiokot.ru/files/99520/29k2hfrekm.jpg)
Синий практически везде накрыт желтым. Можно было подогнать еще немного точнее - терпения не хватило :).
Да - задержка на цифре относительно аналога - 1.5 mS. Полагаю - задерживают ЦАП и АЦП - за счет фильтрации сигнала, заложенной в них производителем. Программная задержка - 32 uS.
-
Получилось! :)
-
Таки да!
Хочу зафигачить еще пару стандартных примочей и пару своих - вот тут то и натрахаюсь, ибо некоторые идеи я в аналоге не воплощал! :). Ну и с ламповыми аппаратами интересно - получится что-то похожее - или не очень?
Сегодня дотрахивался (после Скримера) - с трехручечным ТБ. Пока получается не очень. Низ и верх - там понятно, как сделать. А вот середина... Пробовал сделать параметрик на середине - он-то работает, но не так, как трехручечный - горб слишком резкий и провалы на переходе к низу и верху - а убираешь добротность - почти не работает.
Ну, пока ездил после работы на дачу - кое-что придумал, попробую завтра сделать в обед...
-
Вот удачное на слух решение темброобработки:
(https://3.bp.blogspot.com/-kq989pNrtME/TxQ5v0UVl8I/AAAAAAAAAkQ/tQV0VA6M2QQ/s1600/zvex_boxofrock_schematics.jpg)
-
Спасибо. но....
Нужно не просто удачное на слух решение.
Нужно - если поставлена цель повторить похоже, например, усилитель Fender Twin Reverb, повторить и ТБ со всеми его особенностями звука и органами регулировки. А кроме того - для меня еще довольно сложно придумать программную модель для этого ТБ, причем модель простую, чтобы успевать отрабатывать ее в прерывании вместе с ограничителями и реверберацией...
Ну - буду пробовать :)
-
глядя на регуляторы гейн и буст возникает вопрос - зачем конденсатор С6? Уж шуршать так шуршать.
-
https://www.zvex.com/guitar-pedals/box-of-rock-guitar-effects-pedal
Фрагмент инструкции:
"The Drive and Boost controls are
based on my original Super Hard On™ gain
control, so they may crackle when turned.
This is perfectly normal."
;)
-
Возвращаемся в тему... :)
Сегодня за обед добил таки трехручечный ТБ! :)
Сделал довольно похоже на Фендеровско/Маршалловский - середина очень плавная (у Ф/М она воообще не середина по сути, а широкополосный сигнал со слегка подрезанным низом). У меня же, если все регуляторы выставить на максимум - получается практически плоская АЧХ (верх приподнят на пару дБ). Т.е. регулировка середины намного глубже в +, что очень даже неплохо.
Ну и остался немного после работы (охота пуще неволи :)) - и начерно доделал Фендер Твин в примочечном варианте. Правда, пока шел домой (а на ходу мне лучше всего думается :)) придумал доработку модели лампы для более точной имитации сеточного тока - после выходных попробую, что получится.
-
they may crackle when turned. This is perfectly normal
Убил нафик...
;D
-
У меня ощущение, что пока я не запишу какой-нибудь звук, тема малоинтересна... :(
Ну - до звука пока не добрался, увы... Может сделаю какой реамп, но тут тоже есть сложности: дома пока работать нет возможности - ни времени особо, ни места, на работе время бывает не всегда, чаще только в обед, да и там реампить можно будет только "на сухую" - без вывода на динамик и записи микрофоном - ну это-то понятно :). Тогда нужно как-то эмулировать кабинет. Если взять программный софтовый кабинет - то могут возникнуть вопросы (у меня первого :)) - что в звуке от цифровой примочки, а что от проги-кабинета... Лучший вариант - сделать кабинет, как один из эффектов в примочке - это есть в моих планах, но тоже требует времени на написание и отработку-настройку...
А еще пока не дописан интерфейс (да и в интерфейсе не будет возможности настраивать абсолютно все параметры моделей, только аналоги крутилок педалей) - что тоже замедляет процесс настройки черновых версий эффектов...
Так что я работаю пока с осциллографом/генератором и картинками звуковых форм покаскадно. Напишу еще пару-тройку моделей, чтобы было что слушать, а вот тогда попробую перевести цифру в звук...
Ну - в Тюбскримере я уверен - эффект хорошо знакомый, формы и частотку каждого каскада я воспроизвел точно. Единственное, что вызывает некоторые сомнения - сама технология, это все же цифра... А в любом аналоге есть кусочек волшебства - или теплого от лампы, или прохладного от камней... :). И я пока не уверен - сумею я вложить свой кусочек волшебства... даже не знаю, какое оно в цифре должно быть... в свое творение?
Ну, кусочек души я в него вложил... Может это оно и есть?
:-?
-
Задумался вот об эмуляции процессов, связанных с сеточными токами лампового каскада...
Вот картинка начала ограничения на лампе:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F292i022x6s.jpg&hash=048039d98ab416bb53211cebcf964a74cea974cf) (http://img.radiokot.ru/files/99520/292i022x6s.jpg)
Нижнее скругление - это следствие ограничения входного сигнала диодом "сетка-катод" после усиления и инвертирования собственно лампой... В момент нарастания/спада сигнала от гитары (особенно на атаке) возникает ситуация, когда сигнал из-за несимметричности получает смещение по постоянке, которое потом плавно восстанавливается за счет разделительного конденсатора. Из-за сдвига происходит изменение скважности сигнала - вот и слышимая динамика...
Но - тут есть и сложности - при большом отклонении скважности сигнала от двойки звук становится неприятным, потому отклонения скважности стараются ограничить - третий-четвертый каскады хай-гейн усилителей содержат делители в сеточных цепях ламп с целью выравнивания входного сопротивления для положительной и отрицательной полуволн входного сигнала...
Все это я к чему - а нужно ли мне эмулировать входной ток? Вот эта картинка
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F292i317dkd.jpg&hash=6d6caea07c1967efa77bbf2f35558dc563aa36b5) (http://img.radiokot.ru/files/99520/292i317dkd.jpg)
показывает, что сигнал на определенной амплитуде и так делается асимметричным, что дает сдвиг постоянки, а при большей или меньшей амплитуде сигнал снова становится почти симметричным - что и требуется для хай-гейна...
Возможно, не нужно усложнять?
-
В момент нарастания/спада сигнала от гитары (особенно на атаке) возникает ситуация, когда сигнал из-за несимметричности получает смещение по постоянке, которое потом плавно восстанавливается за счет разделительного конденсатора.
Миша, ты немного путаешь причину и следствие, за счет сеточного тока изменяется постоянная составляющая на разделительном конденсаторе (даже если входной сигнал чистый синус), соответственно среднее напряжение на сетке и рабочая точка каскада съезжает в сторону отсечки.
Схемосимуляция: сверка моделей (http://forum.guitartonelab.ru/cgi-bin/yabb2/YaBB.pl?num=1252473740/3#3)
Но это все с точки зрения чистого синуса, на сложном сигнале все еще веселее, а если учесть, что в каждом каскаде сигнал еще и переворачивается на 180, получаем систему с N степенями свободы.
потому отклонения скважности стараются ограничить - третий-четвертый каскады хай-гейн усилителей содержат делители в сеточных цепях ламп с целью выравнивания входного сопротивления для положительной и отрицательной полуволн входного сигнала...
В любую сторону плохо, и чрезмерный уход рабочей точки - каша, и полная фиксация - вялая атака.
-
Миш, спасибо! - я не путаю, возможно, неточно сформулировал. Конечно - идет выпрямление входного сигнала и перезаряд разделительного конденсатора, что приводит к подзапиранию лампы. Но выходной сигнал тоже имеет разную площадь положительных и отрицательных полуволн, он инвертирован, проходит разделительный конденсатор, постоянка даже без сеточного тока следующего каскада будет динамически смещаться, так что "получаем систему с N степенями свободы".
При этом - полупроводниковые примочки часто имеют чисто симметричное ограничение и при этом некоторые из них и атаку неплохую сохраняют (ну хотя бы ЛС-4 для примера)!
Как думаешь - достаточно ли будет асимметрии ограничения, или все-таки нужно делать и асимметрию входного сопротивления? Тогда нужно вводить и коэффициент, учитывающий степень этой асимметрии, ибо в разных каскадах она разная... Да и модель лампы у меня специфичная: гейн у меня определяет не предусиление перед ограничителем, а уровень порогов и постусиление сигнала... Т.е. уровень входного сигнала каскада от гейна не зависит и нужно думать, как это все соотнести.
-
При этом - полупроводниковые примочки часто имеют чисто симметричное ограничение и при этом некоторые из них и атаку неплохую сохраняют (ну хотя бы ЛС-4 для примера)!
Как думаешь - достаточно ли будет асимметрии ограничения, или все-таки нужно делать и асимметрию входного сопротивления?
Ну ЛС-4 это скорее скример (грелка), а не пред.
Несимметрию не обсасывал только ленивый - разные диоды/диоды-светодиоды/разное количество диодов в плечах. Кстати, при несимметричном ограничении "об землю" с развязкой кондером между опером и диодами есть некоторое "плавание скважности" как раз на атаке/затухании.
-
Вот об этом я и думал - когда "плавание скважности" возникает не за счет выпрямления переменки, а за счет нарушения одинаковости площади положительных и отрицательных полуволн. Может быть, как раз такого изменения скважности и достаточно? Тем более, что при использовании в сеточной цепи делителя с номиналами 200-300k (а не 68k - 1M) - "плавание скважности" довольно маленькое происходит...
Ну я еще об этом подумаю, тем боле, что твои подсказки натолкнули меня еще на один возможный вариант построения ограничителя (именно по алгоритму ограничения).
А ЛС-4 - конечно, можно использовать и как грелку - но это отличный самодостаточный дисторшн с хорошим гейном - и полностью симметричный по схемотехнике...
-
Сегодня внимательно щупал свою "лампу" - и передумал ее переделывать. Насколько можно понять приборно - работает похоже на прототип. При резком изменении уровня слегка уходит и постоянка, и сразу плавно восстанавливается. Окончательная оценка будет на слух.
Склеил модель Блюзбрейкера. Ну, не так скрупулезно, как Скример (в аналоге не собирал :), обошелся моделью в Микрокапе), но довольно внимательно. Потом послушаю, что вышло. Вообще-то 100% сходства не является моей целью - главное, чтобы звук был правильный, для меня это важнее, чем просто повторение чужого звука.
А еще я сделал КабСим - по образу и подобию моего же аналогового Сима. Сделаю несколько вариантов с разными параметрами, точно подстраивать буду, опять таки, на слух.
Собственно, почему так быстро понаделывал разного? :) Да заготовка на Сим была, я только ее чуть по уровням подстроил, а БлюзБрейкер - он из тех же кирпичиков состоит, что и Скример, только параметры другие...
Так что еще пара моделей, интерфейс до хоть как-то рабочего состояния - и слушать...
И есть ощущение, что еще с цифровыми наводками настрадаюсь....:)
-
Доделал Каб Сим - пришлось подробно разбираться со своими же алгоритмами фильтрации - спустя месяц нашел там неточности и исправил (я так думаю :)), заодно написал ФВЧ второго порядка с настраиваемым резонансиком (чет типа Бессель - Баттерворт - далее по списку :)) - для имитации резонанса ящика и подреза самых низов.
Попробовал соединить две модели лампы в цепочку - и обоср... В смысле - работает, но криииииво... :)
Вторая "лампа" с увеличением гейна первой или сигнала начинает подзапираться, скважность сильно уходит. Подумал, что я плохо сделал имитацию сеточного тока, отключил ее - лучше не стало. Становится лучше, если вообще убрать разделительный конденсатор, но мне это не нравится, хочу имитировать межкаскадку...
Вывод - что-то работает не так, как задумано, и это что-то - входная цепь модели лампы... Нужно смотреть сигналы с привязкой к постоянному напряжению, звуковой ЦАП не годится - там есть встроенная фильтрация постоянки, сдвиги не видны.
Буду частично реанимировать проект на STM32F303, чтобы глянуть на встроенных ЦАПах, чего там деется...
-
Включил старый макет на STM32F303, пару часов протрахался, и наконец в обед нашел ошибку - аккуратнее надо быть с локальными переменными! :) (ошибка детская, но я себя серьезным программером на С и не считаю :)).
В общем - заработало, и на мой взгляд - по осциллу - довольно похоже.
Ковыряюсь теперь с интерфейсом, а там еще много работы.
-
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F29xegva0nq.jpg&hash=97eb9cbd14caeb2f9c6b7d438679664485d6d6c6) (http://img.radiokot.ru/files/99520/29xegva0nq.jpg) (https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F29xehf24nd.jpg&hash=551dc5de73da80aaaddd985eacc1f1e550766153) (http://img.radiokot.ru/files/99520/29xehf24nd.jpg)
Делаю интерфейс... Вторая картинка - выбор эффекта в цепочке.
Кстати...
Вот первая картинка - это экран редактирования эффекта. Переход между потенцами - кнопками + и - , изменение параметра - энкодером.
Но - была придумана и альтернативная схема - 6 потенцев подключены к АЦП и каждый отвечает за свой параметр, это похоже на регулировку аналоговой примочки. Есть смысл ставить потенцы/усложнять схему/увеличивать число органов управления? Как думаете?
-
Значения 128 и 255 ничем не отличаются по углу поворота, а 20 оказывается в центре шкалы - всё это нелогично и некомфортно.
Визуализацию потенциометров надо пересмотреть.
-
Сделано специально,
Поясняю: :) регулировки у меня линейные, а на слух ведь воспринимается все логарифмически. Для сохранения плавности регулировок я оставил линейную шкалу (можно было сразу пересчитать в логарифмическую, но при этом количество ступеней регулировки в середине шкалы сильно уменьшится), но для удобства быстрой оценки "на глаз" состояния настроек, штрихи я сделал в логарифмическом масштабе.
-
Понятно. Сделано для науки, но не для человека.
Как-то мне принесли на ремонт вот такой примус:
https://www.youtube.com/watch?v=k9X5_RMiZ2Q
https://www.youtube.com/watch?v=G4F2kPzLo3w
И никакого дискомфорта его визуальные регуляторы не вызывали - понятная и естественная шкала от 0 до 99.
Думаю, есть смысл подумать над этим... ;)
-
Подумаю :)
Как начну реально его крутить - сразу станет понятно, удобно это или нет/
Просто уже заметил - при регулировках сначала параметр (по осциллу) изменяет сигнал сильно, а по мере приближения к максимальному значению - все меньше и меньше. Например, гейн - в диапазоне где-то до 10 нарастает очень круто, до 20 просто круто, до 40 - заметно... А вот между 127 и 255 разница совсем небольшая... И цифра реального значения параметра этот факт не отображает. Потому я и сделал логарифмический штрих. Ну - попробую на практике и подумаю. Линейный сделать проще...
-
И цифра реального значения параметра этот факт не отображает
Индикация должна быть удобна и понятна пользователю, это главное :)
-
Ну что - решил переделать и переделал :)
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F29zlh20ym2.jpg&hash=50b7de8e1951f9d3c23ca4e765077ef798f26efb) (http://img.radiokot.ru/files/99520/29zlh20ym2.jpg)
Теперь шкала линейная от 0 до 63. Ну а дальше простая табличка переводит это ... ну почти в экспоненту :). Начиная так где-то с 24. Все, что ниже - линейно (там просто шага не хватает сделать экспоненту) - а выше уже экспонента.
Начал понемногу увязывать интерфейс с преобразованием звука - ну крутишь энкодер, параметр меняется и меняется картинка... :)
Сделал для начала искажалку на 6 крутилок (настраивал по модели Фендера, но должно работать на всех) и хорус. Пришлось немного потрахаться с Хорусом - его прога писалась-то на STM32F303 и выводилась на встроенный ЦАП 12 бит, пришлось вспоминать - чего ж я там напридумывал, чтобы приклеить ее к уже имеющимся искажалкам. Приклеил, но чуть не доделал интерфейсную часть - там всего 2 крутилки, но я просто не успел.
Сделал 3 варианта хоруса - моно классика и два варианта стерео.
Завтра - последний день перед отпуском, если получится - слегка допишу интерфейс до хоть немного законченного состояния и попробую забрать макет домой - вообще-то собираюсь заняться небольшой стройкой на даче, но попробую выкроить время и послушать, чего я там наваял... :)
-
Включил и послушал... :)
Ну че...
Звук вродь есть - я слушал легкий подгруз.
Но!
Но очень громкий шум, типа белого, прет. Шипенье. Проверил - программно закоротил вход - шум исчез (т.е. это шумит не алгоритм, а АЦП).
Ну не везет мне с АЦП...
Буду разбираться чего там не так - после отпуска, видимо.
ИМХО - проблема скорее в железе - либо в неправильном его включении.
-
Перепаял еще раз аналоговую цепь - стало не так красиво внешне - появилась перемычка от висящей в воздухе ножки АЦП - зато теперь на АЦП идет дифференциальный сигнал. Стало ощутимо тише - но самое странное - шум до конца не уходит, даже если замыкать дифференциальный вход накоротко...
Т.е. в момент замыкания слышен щелчок - постоянка наверное выравнивается, а затем шум продолжается с той же громкостью...
Проверил осциллом - чет не то с инвертирующим ОУ - то ли сдох? то ли сопля где то... В общем - я в поиске.
Похоже - сдох операционник... Сегодня выходной - а с завтрашнего дня я на даче - так что замена пока откладывается.
Еще одна возможная причина шипения - плохая фильтрация напряжения средней точки для ОУ - печатка-то под другой АЦП делалась и конвертировал я ее под PCM1804 - как мне проще было - в общем заменю ОУ и последовательно уберу все возможные причины шума. Надеюсь.
-
Не выдержал, включил микрофон, взял впервые за год :) гитару и потренькал:
https://drive.google.com/file/d/1U3nAhC3qqcLz4Aqo8VBdG_-HM1BPXBE6/view?usp=sharing
Это через комбик с миком, на скорую руку. Подгруз - ну, типа Фендер твин на среднем гейне :).
А вот то же самое, но с хорусом:
https://drive.google.com/file/d/1uIRx-yKNNQi-AzkL0iiRHHsa3Dg5b8L5/view?usp=sharing
И последнее - Через спикосим в компутер напрямую:
https://drive.google.com/file/d/1AYUj4wkONPVGlx9vgViqG_OT6BRewurU/view?usp=sharing
Мои впечатления - после удаления шипения будет вполне играбельно - звук довольно упругий на перегрузах (хайгейн пока не программировал) и хорошо передает особенности инструмента и звукоизвлечения (ну мне так показалось :)). Эффекты (хорус и дилэй) работают очень хорошо, но еще требуют мелкой подстройки (согласовать уровни входных и выходных сигналов). Спикосим - пока как заготовка - звук будет нормальный, но требуется повозиться с его настройками и сделать в нескольких вариантах.
В общем "еще 10 000 ведер - и золотой ключик у нас в кармане!" (с) Дуремар.
-
Help!
Выручайте, кто знает, как правильно все это включить!
Вот фрагмент схемы с АЦП:
(https://guitartonelab.ru/proxy.php?request=http%3A%2F%2Fimg.radiokot.ru%2Ffiles%2F99520%2Fthumbnail%2F2a2v7gsc1d.jpg&hash=81c846e8cd1624cde2d545808b6f1ab429ecff67) (http://img.radiokot.ru/files/99520/2a2v7gsc1d.jpg)
Сейчас сигнал вообще не подается, данные снимаются только с левого канала.
Входы оба (и + и -) соединены параллельно, т.е. входного сигнала в принципе нет (!) и подключены к внешней точке +2.5v.
Все аналоговые земли соединяются на печатке с цифровой в одной точке, опорное напряжение фильтруется парой конденсаторов.
На выходе (включена модель клинового усила с некоторым гейном для удобства наболюдения/прослушивания) - ощутимый белый шум (см. семплы постом выше). ОУ - вообще снят с платы.
Ну вот чего ей надо? Питание +3.3v довольно шумное (осцилл на пределе 5мВ видит шумок), но его блокирующий кондер прицеплен к цифровой земле. Конденсаторы на 4,7мФ и 1 мФ - керамика СМД.
И да - если я в программе вместо входных данных пишу 0 - шума на выходе нет (модель усила сама ощутимо не шумит)
В общем - я не знаю. куда смотреть...
-
Может это программный глюк? Но тогда он должен шуметь сильнее и работать через раз...
Алгоритм приема/передачи данных такой:
Есть массив данных на вывод (4 полуслова по 16 бит) и массив данных на ввод (4 полуслова по 16 бит). I2S передает/принимает по 16 бит два раза на канал. Массивы обслуживаются DMA по соответствующим запросам:
SPI3->CR2 |= SPI_CR2_TXDMAEN; для передачи и
I2S3ext->CR2 |= SPI_CR2_RXDMAEN; для приема
Синхронизация прерывания обработки звука происходит по спаду сигнала LRCK (EXTI) - что соответствует завершению передачи данных правого канала...(левый, с которого я и беру входные данные, к тому времени уже должен быть давно передан).
В самом начале прерывания идет копирование данных из массива приема и передача данных в массив передачи...
Может у меня тут чего не так? Ну, например, старшее полуслово идет правильное, а младшее не успевает - и идет как попало? Или DMA неправильно как-то их укладывает?
Вообще-то по уровню шума где-то рядом получается (в смысле - младшее полуслово вроде неправильное так бы шумело) - из-за несимметричного входа и повторителя на входе из 16 бит старшего полуслова у меня используется 12-13, расчет был на диапазон 20-24 бита...
Дык вроде ж нет - см. выше...
Ничего не понимаю! (с) Братья пилоты
PS Есть мысль - кажется я знаю, где закопана собака!... Вроде бы есть логическая ошибочка при перепаковке данных на 24 бита. Завтра посмотрю :)
-
Мне однажды пришлось столкнуться с цифровым шумом фабричного изделия и успешно его преодолеть.
История такова: в начале 2000-х компания Huawei выпустила бюджетную "раскладушку" ETS-668 в качестве массовой модели для рынка CDMA-450.
Всё было бы хорошо, если бы не одно "но", неочевидное для самого пользователя, но удручающее его собеседников: при негромком или тихом разговоре пользователя разборчивость его речи ухудшалась и превращалась в подобие скремблирования, что вызывало непонимание и переспрашивание на другой стороне.
Изъян был продемонстрирован представителю фабрики-изготовителя в сравнении с аппаратами других фирм, свободными от этой проблемы.
Прокурлыкав в микрофон несколько фраз на своём мяукающем языке и послушав результат на другом конце, сын великого народа не моргнув глазом заявил, что всё О.К.
Что делать? Стало очевидно, что придётся выплывать самостоятельно. Кстати, коллеги из московской МСС тоже пытались бороться с этой проблемой, но безрезультатно.
Выяснилось, что при работе с внешней гарнитурой зажёвывания звука микрофона нет совсем, и это никак не связано с её типом.
Забрезжил рассвет!
При внимательном рассмотрении схемы обнаружилось непостижимое: напряжение поляризации штатного микрофона подавалось с цифровой шины, а микрофон внешней гарнитуры подключался к аналоговой.
Решение проблемы оказалось делом нескольких минут: один резистор перепаивался, соединялся 2-х сантиметровым проводничком с нужной точкой на плате и - вуаля!
После этого можно было говорить в микрофон хоть шёпотом - слышимость и разборчивость стали безупречными.
Впоследствии тысячи телефонов этой марки были успешно подвергнуты такой доработке.
К чему это я? К тому, что причина дефекта была неочевидна, стабилизированное напряжение +3,3 V снималось с одного и того же регулятора и через миниатюрные монолитные ферритовые дроссели, обвешанные керамикой и электролитами, разветвлялось на шины аналоговую и цифровую, причём тестером обе шины между собой прозванивались как одно целое.
Высокочастотные продукты жизнедеятельности процессора, являясь неслышимой помехой в полосе звуковых частот аудиотракта, успешно дезорганизовывали его работу, никак не проявляя себя при отсутствии сигнала или при его достаточном уровне...
-
Хорошо все-таки физическая работа на даче мозг разгружает! :)
Я довольно грамотный схемотехник :) и прекрасно знаю, как все должно быть разведено - и земли раздельные, и питания... Я выше даже фрагмент схемы нарисовал... Но шум как был - так и остался. Причем я косвенно померял его амплитуду - и получилось, что сигнал = всего около 6-8 старших разрядов, остальное - шум, даже при закороченном входе. Земля - отдельная, соединена в одной точке. Питалово аналоговое - 5в через дроссель 470uH и керамика на аналоговую землю. Цифровое питалово - нефильтрованое 3,3в.
В общем - я пока не знаю в чем дело... Завтра снова еду на дачу до конца недели, вернусь - буду дальше думать :).
-
Ну че - я вернулся :)
Сегодня все проверял - например закоротил перемычкой сигналы данных I2S на вход и н а выход (без платы кодека) - проверил работу канала передачи данных и DMA. Как сигнал использовал медленный треугольник от Хоруса, в качестве выхода просто выводил цифру на индикатор - сначала она медленно нарастает, потом также медленно уменьшается и т. д.
Данные передаютя, принимаются и укладываются DMA нормально, без потерь и искажений.
Решил попробовать старую платку кодека с CS4272 - У меня ж тогда ЦАП не пошел - захотел проверить АЦП. Включил - вроде работает. Включил на проводках внешний ЦАП СS4344 - работает. Подключаю ЦАП CS4272- тоже работает, только почему-то без знака данные принимает. Несколько раз включил-выключил - стало и со знаком работать - как и описано. Но включается через раз - точнее случайным образом: хочет - включится, хочет - нет... Явно неправильная start up последовательность выходит.
Полез снова читать даташит - все вроде правильно делаю, но в одном месте там мельком написано, что для режима MASTER нужно резистор pull-up прицепить к выходу цифровых данных... И подумал я - а вдруг внутренней подтяжки там нет и нужно для режима SLAVE pull-down резистор приклеить? Настроил подтяжку вниз на входе STM - и вроде заработало...
Дело было под самый конец дня, так что пока толком ничего не проверено, но было бы неплохо, чтобы кодек наконец заработал и я занялся делом, а не фигней :).
-
Итак - по-видимому я его победил! :)
По крайней мере, ADC/DAC работает стабильно - правда на выходе DAC осцилл показывает ощутимый ВЧ шумок, но он не зависит от уровня входного сигнала (даже если на выход передавать не сигнал, а нули) и, судя по всему, является наводкой земляных петель на вход осцилла (макет соединен через программатор с компом, осцилл с компом соединен через землю в розетке, а еще есть адаптер питания макета :) и еще одна земля - сигнальная на щупе осцилла) и на втором DAC CS4344 он тоже присутствует.
Посмотрел на разрядность входного сигнала :) - сначала использовал только старшие 16 бит при минимуме сигнала на входе и максимальном гейне (были немного видны ступеньки), потом добавил еще 8 бит - ступеньки исчезли (напомнило анекдот про Штирлица и дуло в форточку :)). Можно сделать вывод - что бит с 20 мы в сигнале имеем.
А дальше... Продолжу доделывать интерфейс - для удобства возни с макетом, напишу еще несколько разных искажалок, и снова принесу его к гитаре, буду отстраивать эффекты на слух (как раньше настраивал свои аналоговые педальки :))
А еще хотелось бы туда компрессор, гейт, тремоло и тюнер вклеить! :)
Правда - тюнер я уже написал, его нужно лишь аккуратно перенести в проект, правда не знаю - насколько он мне удался...
-
Написал сегодня Тремоло - даже работает :)
Начал писать Нойс Гейт и немного дописал интерфейс - до момента записи Пресета...
-
Дописал Гейт - "на глаз" вроде работает. Подчищал интерфейные неточности...
-
Пообщался с Тарасом (ака Казак Мамай)...
Придется Гейт переделывать. Он мне рассказал, что в крутых процах (типа Фрактала), в отличие от аналоговых педалбордов, Гейт стоит прямо на входе - чтобы не резать реверберационные хвосты и дилеи. Я подумал - и согласился, ведь цифровой ревер, хорус и все такое практически не шумят, их гейтовать не обязательно, а вот хвосты - дело нужное! :) (спросите у своего кота :))
Ну возьму и переделаю...
PS Кстати: а кто-нибудь имел дело с цифровыми BOSS OD-1X или DS-1X?
Как они, интересно - сильно от аналоговых отличаются?
Интересно было бы с их программером пообщаться... :)
-
Снова тут никого, кроме меня нет... Грустно... :(
Ну что ж - напишу сам себе... :)
В воскресенье переписал Гейт - он теперь на самом входе цепочки.
Сегодня осилил компрессор. Понятно - это все заготовки, из которых еще предстоит выстругать несколько разных буратин, но хорошая заготовка - это уже половина успеха.
Компрессор получился интересный - на тестовом сигнале (синус, управляемый моей рукой :)) уровень выходного сигнала в диапазоне компрессирования держит мертво! Но если ему настроить атаку подлиннее - начинает на атаке впадать в ограничение (пока не было ограничения - он выпадал за диапазон ЦАП :)).
Ну и я еще реализовал одну давнюю идейку (она вообще-то не моя, но мне нравится) - поставил после компрессора ограничитель, как раз для срезания атак и подкрашивания звука, если компрессор используется для солячка. Если гейн установить 0 - ограничитель отключается, если больше - начинает плавно включаться в работу. В этом случае еще и ручка ТОН подключается - можно прибрать верх, как на простом овердрайве.
-
Я герой! :) Сегодня приклеил ранее написанный Тюнер (и он вроде бы даже работает) и реверберацию (толком не проверил, но должна бы :)).
Осталось дописать сохранение во флешь и чтение банков пресетов - и, вроде бы, Черновик закончен и можно приступать к отслушке и подстройке...
Сложность сохранения Пресетов в том, что в STM32F401 нет удобной памяти данных, а основная флешь имеет ограниченный ресурс и стирается только страницами (без стирания запись не пройдет). Есть мысли, буду пробовать...
-
Миша, посмотри сюда
Nonvolatile Ferroelectric RAM (https://www.cypress.com/products/f-ram-nonvolatile-ferroelectric-ram)
High-endurance 100 trillion (10^14) read/writes
151-year data retention (See the Data Retention and Endurance table)
NoDelay™ writes
Пишется/читается как ОЗУ
Есть варианты I2C/SPI, так что много ножек для управления не нужно.
Объемы есть "конские".
В рабочих проектах вовсю использую.
-
Миш, спасибо за подсказку.
Я читал об этих микросхемах - но пока не видел. Дело немного в другом - хочется сделать минимальную конфигурацию - возможно я потом сделаю версию с LED индикатором без экрана - если звуки понравятся и проект пойдет. Память то можно прицепить - да хоть по I2C серии 24С - ее можно и каскадировать, если объема не хватит и стоит она копейки (насчет Nonvolatile Ferroelectric RAM - я просто не уверен, что у нас продадут не китайскую подделку, я так купил W25Q32 у нас - а она со старта мертвая...), у меня банк из 8 пресетов занимает всего килобайт, а банков у меня 10, так что это не очень большая проблема - просто хочу сделать на встроенной. Там ее 512К, так что попробую использовать одну страничку на 128К. Алгоритм уже придумал - попробую реализовать :)
А уж если не выйдет - ну тогда попробую внешнюю...
-
F-RAM мне нравится тем, что не нужно стирать, ждать окончания операции, писать, снова ждать...
С 25 серией вообще лафа, заряжаешь DMA на SPI и все, только по прерыванию от DMA выставляешь флаг, что операция записи всего блока завершилась.
-
Ты так ее разрекламировал, что хочется попробовать! :)
Ну я пока ковыряю встроенную. Изучение затрудняет то, что в разных Кортексах у STM процедура записи несколько отличается, потому попытка перенести процедуру записи банка с STM32F303 на STM32F401 окончилась неудачей. Ну ничего сильно сложного там нет, разобрался и саму процедуру программирования/чтения/стирания запустил. Осталось теперь дописать этакую мини-ОС :) - систему поиска свободного места и записи банка в него, а потом систему поиска этого неизвестно куда записанного банка :).
Я кое чего уже накарябал - если завтра будет время - проверю, а вдруг заработает? :)
-
Я снова в печали. Не везет мне с кодеками...
Когда мне отдавали этот CS4272 - мне сказали, что он шумит... Я подумал - наверное, не умеют настраивать :). Оказалось - умеют!
АЦП у него работает (вроде бы!) нормально - а ЦАП действительно шумит, гад! Я, включая это все на работе, считал этот шум наводкой от БП компа на земляные цепи. Отчасти я был прав: при отключении от компа шум заметно уменьшался, но...
Принес домой, включил автономно - есть шумок, и ощутимый...
Проверю все еще раз - но он ведь шумит и без сигнала - просто когда 0 выводишь...
Чувствую, придется опять колхозить - АЦП оставить этот, а ЦАП приклеить СS4344...
Ладно - я снова в отпуск (догуливать :)) - вернусь и продолжу Сизифов труд моей жизни... :)
Да - а запись/чтение я почти добил - надо немного подчистить для удобства пользования, есть еще поглючивания.
PS А утром не выдержал - включил на звук ...:)
Негромко - и о чудо - шипенья почти не слышно (все равно нужно будет это решить - на будущее). Времени почти нет - нужно загружаться и ехать на дачу, но кое что пощупал.
Первые впечатления.
Возможно - я необъективен, но мне понравилось.
Дорабатывать еще немного нужно - но не критично. Звук живой, но вот насколько - нужно еще послушать в сравнении с аналоговым. Наконец я получил тот звук компрессора, о котором мечтал еще с института - чистый, звонкий и тянучий! :), ему даже подгруз не нужен, он и так хорош! (Pink Floyd "Shine on your crazy diamond").
Модель моего ВМ5 понравилась - звук хороший, хотя от аналогового ВМ отличается - нужно еще поиграть с темброблоком. Гейт работает неплохо, но я пробовал в основном без него - хотел заценить так. Реверберация - достойно, похоже на очень качественную пружину.
В общем - приеду, повожусь, и попробую сделать пару-тройку записей.
-
Приехал, повозился...
Начал с устранения явных багов, много чего поисправлял. Начал добавлять модели - и все вроде ничего - пока играешь всяко разно с подтяжками и вибрато, да еще с ревером или дилеем, да под фонограмму на комбике, который низ подрезает...
Но - вдруг прислушался в хороших наушниках - и на грани слышимости поймал неприятные призвуки... Точнее - грань слышимости напрямую зависит от гейна - чем больше, тем слышнее. Призвук слышен только для самых тонких 3х струн, причем призвук звучит в басах и сильно меняется по высоте от малейшего изменения тона струны. Я пришел к выводу, что это скорее всего биение (разностная частота) между несущей (31.25 кГц) и гармониками ноты, возникающими после первого каскада ограничения ("играет" одна из гармоник, близкая по частоте к 31.25 кГц).
Как с этим бороться - пока не знаю. Теоретически - нужно задавить перед каждым ограничивающим каскадом частоты выше половины несущей, но давить нужно сильно, простые аналоги RC цепей тут не помогут.
Есть идеи?
Компрессор работает отлично, малогейновые модели - тоже, хорус, ревер, дилей с тапом, гейт неплохой, 4 модели кабинетов, тюнер юзабельный...
И такая непруха на большом гейне...
-
Интересно, насколько благозвучно получается "хендриксовская растяжка" - две струны одновременно с интервалом тон между ними, а потом нижняя струна тянется до унисона с верхней.
У плохих жужжалок в этот момент формируется громкий фантомный бас...
-
Можно попробовать (дозрею как-нибудь до записи - пока гостит дочка с внучкой - нет возможности). Вообще-то звук неплохой - по гармоническому составу, читаемость - как у моих аналоговых примусов, с динамикой пока не определился - она немного хуже, но непонятно пока в чем. Немного больше уровень шума - но тут более-менее ясно - ОУ МСР6002 шумят раза в 2 сильнее 072. В принципе на искажалках (у меня тестовая модель - моя же ВМ5 в цифровом исполнении :)) - звук вполне мой. Осталось разобраться с этим нехорошим призвуком... Если я правильно его вычислил - может и получится... Есть один замечательный алгоритм ФНЧ...
Попробовал послушать подтяжку - интермодуляционный тон есть - он не оглушает, но его слышно... Попробовал включить единственную из имеющихся в наличии моих аналоговых примочек - там он тоже есть примерно с той же громкостью...
Полагаю, что избавиться от него не выйдет и на лампе - это ж математика чистой воды. А вот то биение, что у меня в цифре - оно есть само по себе и на одной ноте, ничего тянуть не нужно - изменения тона ноты при ее затухании вполне достаточно. Попробовал подфильтовать после каждого каскада с полным отрезанием сигнала на частоте половины несущей - ощутимо лучше не стало...:(
-
Послушал 800 Маршалл от KMG (на полевиках :)). Примерно то же самое - разностный тон тоже слышен. Он тем слышнее, чем больше низа у аппарата и чем сильнее он выкручен.
Решения по основному вопросу пока нет. Возможно, сделаю сильный перегруз аналоговым, слабый и все остальные пасочки - цифровыми... Все равно - немного не то, чего хотелося...
-
Как говорится, "без костей только сметана бывает". Одни жалуются на "волчки", а другие наловчились их обходить и прекрасно живут с этим :)
-
Я просто не обращал внимания - я не великий гитарист :).
Как доберусь до чего-нибудь фирменного - например на репбазу загляну, где когда-то подрабатывал - пощупаю Месу с Маршаллом на предмет фантомного баса...
И что-то (возможно - интуиция?) :) мне подсказывает, что на Месе уж точняком он будет слышен...
По перегрузу - пока не занимался изысканиями. Хочу хоть чего-то записать в имеющемся варианте - ну хоть для сравнения с тем, во что я его переделаю.
И с огромным удовольствием пиликаю Pink Floyd на компрессоре с ревером - звук очень нравится. Тюнер точно строит, хотя при настройках помигивает индикацией, особенно на толстых струнах почему-то...
-
Тюнер подмигивает потому, что в момент щипка/атаки струна чуть растягивается и частота чуть повышается, затем по мере падения амплитуды строй струны восстанавливается.
-
Там у меня тюнер немного не так работает: когда нота не строит - буква ноты красная и стрелка показывает, куда отклонение, если нота строит - она зеленая. В момент щипка - она чуть высит - красная, потом зеленеет...
Но когда тюнер ее достоверно определить не может - он ее рисует бледно-серым цветом.
Так вот на толстых струнах он помигивает серым - типа сигнал пропадает. На самом деле - какой-то глючок в алгоритме, попробую найти и исправить. Вообще-то он не очень мешает - просто можно сделать лучше.
Хотя я заметил - у меня есть и тюнерок отдельный на батарейке - так вот он тоже часто подергивается, а еще определяет ноту с запаздыванием, особенно если бас-гитару строишь...
А вот в Корге моем тюнер довольно удобный - там нет стрелки, зато мигает светодид с той стороны, куда отклонение, мигает тем быстрее, чем больше отклонение. Я так понимаю - там на биениях это построено - можно попробовать и у меня так сделать - единственно - у меня экран TFT - на него мигание не так удобно выводить, как на светодиод...
Ну - сначала нужно добить перегруз...
Попробовал довести Гейн до абсурда - все, что больше 5 - это 0x5FFFFF, все, что меньше -5 - это -0x5FFFFF. Диапазон -5 плюс5 - для нормальной работы гейта. :)
На наушники, верх и презенс прибрал.
Как ни странно - похабень только в паузе, пока гейт не закрылся - хруст, шум и шорохи. А звук - вполне певуч, бридж и нек - различимы, сустейн - практически бесконечен...
А вот призвук стал еще конкретнее. На нижних струнах его нет, а вот особенно на первой выше 12 лада - мама миа, причем призвук дает фантомный тон именно в басу и нижней середине, сильно меняющийся при небольших тональных изменениях струны. Такие явные биения, жуть.
В общем -думаю, что подтвердилось предположение, что это биения гармоник и несущей. И чего теперь делать? Несущую поднимать раз в 5? Не потянет, думаю...
-
Несущую поднимать раз в 5?
Может, для начала просто удвоить? :)
-
Буду пробовать, что смогу....
Для начала хочу попробовать уменьшить максимальную крутизну фронтов. Не срез аналога RC фильтра, а максимальную скорость нарастания. Ну как у Лионсаунда на УД12 был перегруз - там можно было регулировать быстродействие ОУ.
Что это даст? По идее - должно заметно уменьшить призвук, если оно при этом и звук особо не испортит....
Нечто похожее я наблюдал, когда свой цифровой Moog делал - когда генерился прямоугольник или пила - были похожие артефакты, причем удвоение несущей помогло мало. Пришлось растянуть вертикальные фронты (там табличные формы сигнала) - призвук пропал...
-
Размазывание, смягчение фронтов в итоге ослабляет высшие, самые жёсткие гармоники.
Надо исходить из того, что выше 5 кГц мало что есть хорошего, а уж выше 7 кГц ничего хорошего точно нет :)
-
а еще определяет ноту с запаздыванием, особенно если бас-гитару строишь...
а вот определить частоту по быстрому? Период нижней Е1 баса - ~25мс - так он еще и установиться должен ибо в момент удара там черте что.. Как работают гитарные синтезаторы запускаемые от струн?
В общем -думаю, что подтвердилось предположение, что это биения гармоник и несущей. И чего теперь делать? Несущую поднимать раз в 5? Не потянет, думаю...
несущая - это частота квантования?
а обязательно внутренним ацп пользоваться? там же последовательного приближения? вообще звук дельтасигмой обычно оцифровывают.
-
2 KSG
Хитрость в том, чтобы алгоритмически не допустить резких фронтов при ограничении - если сначала резко ограничить, потом пытаться отфильтровать - нифига не получается - биения возникают именно в момент возникновения крутых фронтов... А частотки - да хватает, у всех примочек/ампов после каждого каскада ограничения в той или иной степени верх режут...
2 VAT
Тюнер...
У меня для точности он набирает 16 периодов - иначе на верхних нотах очень приблизительно считает. При этом если он не набрал 16 достоверных периодов - светит серым. Как работают гитарные синты - фиг знает? Но если в задачу входит только измерение частоты - это можно сделать - поднять частоту квантования раз в 5 - 8 для точности, да и период считать, например, автокорреляционной функцией - и быстро и точно. У меня такой фокус не проходит - частота квантования низковата, да и хотелось по-проще.
Несущая - это частота квантования (ну я так для краткости обозвал, что не совсем правильно, конечно :)).
А внутренним АЦП я тут и не пользуюсь - с большим гейном 12 бит мало, 16 - тоже мало, у меня - 24 (судя по параметрам - там 20-22 бита значимые, остальное - шум), так что дельта-сигма 24 бит.
-
так что дельта-сигма 24 бит.
я не большой знаток - но насколько я понимал в свое время - там внутренняя частота квантования - мегагерцы - соответственно отсечь все частоты выше звуковых до оцифровки - не проблема. а потом эти мегагерцы понижают до привычных 44 или 48 и тп..
так что не оч понятно что еще тут можно или имеет смысл фильтровать
-
так что дельта-сигма 24 бит.
я не большой знаток - но насколько я понимал в свое время - там внутренняя частота квантования - мегагерцы - соответственно отсечь все частоты выше звуковых до оцифровки - не проблема. а потом эти мегагерцы понижают до привычных 44 или 48 и тп..
так что не оч понятно что еще тут можно или имеет смысл фильтровать
.. вернее отсечь нужно не частоты выше звуковых, а выше 1/2 от тех мегагерц..
-
Не...
Там тактирование MasterClock 8 МГц, это как раз для входного фильтра. И он реально круто режет на половине частоты квантования.
НО! У меня призвук возникает ВНУТРИ программы - т. е. входная фильтрация не причем - ведь я на вход подаю просто гитару после буфера, а все обработки, включая перегруз - программные...
-
Не...
Там тактирование MasterClock 8 МГц, это как раз для входного фильтра. И он реально круто режет на половине частоты квантования.
не .. там по другому как-то - для него на 4мгц должно быть чисто - и это нетрудно обеспечить если нам нужны звуковые частоты. а далее цифровой фильтр. меня по недоумию удивляло.. как так CD 44кгц при полосе 20кгц. этого не может быть просто.. а там не 44 на самом деле оказалось..
выведите звук с разных участков программы.
и кстати почему бы такому же эффекту не быть в чисто цифровом виде?
как то работают фишки типа замедления или ускорения звука притой же тональности. я это как чудо воспринимаю. а окружающим это обыденно. ;D
-
И еще раз... На входе все фильтруется, как надо - там (в АЦП) есть фильтр с передискретизацией, тактовая (MasterClock) на АЦП подается 8 МГц с интерфейса I2S. Реальная полоса, пропускаемая входным фильтром АЦП - немного меньше половины частоты дискретизации (у меня дискретизация 31,25 кГц) - около 15кГц, выше - срез высокого порядка (не измерял, но не 2 и не 3 - срез намного круче, смотрел осциллографом).
И на вход АЦП я подаю с гитары - там все хорошо.
В процессе ограничения внутри программы формируются избыточно-резкие фронты. Чтобы использовать подобные описанным выше (передискретизация + цифровая фильтрация высокого порядка) алгоритмы фильтрации - мне нужно многократно поднять частоту дискретизации - именно с ней и идет обработка звуковой информации в программе. Быстродействия моего процессора не хватит для многократного увеличения...
-
- мне нужно многократно поднять частоту дискретизации - именно с ней и идет обработка звуковой информации в программе.
Ясно. И еще наверное разрядность. А как делается на ПК программах? там чуть ли в 64битах считают.. А частоту сэмплирования интересно тоже поднимают программно ?
И как делается в процессорных примочках - там ведь не особо мощные контроллеры? Правда возможно исключительно поэтому они и имеют такую репутацию. просто мощи проца и памяти не хватает сделать хорошо.
-
Я не знаю, как делается в программах и примочках... Предполагаю - немного иначе - там вовсю используются свертки и FFT.
И - да, думаю, именно по-этому в бюджетных процах звук мыльный - не хватает вычислительной мощности железа, алгоритм упрощают и все зафильтровывают на максимум...
Пока серьезно не думал над проектом - на работе запарка, приходится много бегать, думать и программировать тоже, просто устаю. Т.е. общие размышления о возможных путях решения, конечно, присутствуют - я примерно представляю, что поробую сделать, как будет время и вдохновение, но конкретно пока не писал ничего...
На самый крайний случай остется путь аналоговой искажалки на входе с последующей оцифровкой уже ограниченного сигнала - но мне интересно попробовать выкрутиться чисто цифрой - это ж не противоречит теореме Котельникова(Найквиста)? Хотя... Помянутая теорема хорошо работает для шумовых сигналов (музыка - в частности), для чисто периодических и высокочастотных - гораздо хуже... Попробуй хотя бы теоретически вывести синус с частотой чуть меньше половины (да хоть и четверти) частоты дискретизации? Отож... У меня слышимые артефакты появляются где-то герц с 350, и чем выше - тем слышнее (и чем больше гейн).
-
Пробовал фронты сделать менее крутыми - звук притупился, но артефакты сохранились...
Попробовал просто загнать прямоугольник с генератора - все нормально, артефактов нет...
Не понимаю - что с чем дает биения? Если дискретизация с ограниченным сигналом - почему прямоугольник не дает биений? А если не дискретизация - то что?
-
Идеи кончились. Пока.
Включил перед цифровым модулем аналоговую искажалку - никаких артефактов, звук очень даже ничего. Наверное, пока попробую сделать таки киборга - голова будет аналоговая, тело - цифровое. В смысле - аналоговая двухкаскадная искажалка с цифровой регулировкой драйва, далее - оцифровка и все остальные пасочки, начиная от ТБ и кончая гейтом, тюнером и спикосимом. Осталось - собрать низковольтную искажалку - ну не хочется мне питать это все от 9В - будут сложности с цифровыми потами (под рукой только однополярные на 5В).
-
Понемногу ваяю Киборга...
Спаял низковольтную искажалку на 5В - вроде бы неплохо звучит, окончательно, конечно, буду слушать где-нибудь громко и на аппарате. ОУ использовал РСМ6002, рулится перегруз цифровыми потами. В цифре оставил компрессор, клиновый канал (по мотивам Fender Tween - там гейн невысокий нужен, артефактов практически нет), гейт (нужно повозиться с порогом), спикосим, темброблоки всех перегрузов и эффекты задержек. Минус такого решения - невозможность правдоподобно эмулировать разные усилки и примочки, все возможности ограничиваются использованием разных законов регулирования гейнов по каскадам, или использованием только первого каскада... Да - в основе схемотехника моих примочек, звук неплох, но хотелось много и разного... :)
В общем - работаю по-немногу...
Переписал тюнер - он теперь почти не дергается. Период меряется между максимуми сигнала - более стабильно, чем по пересечению 0 с одинаковым наклоном.
-
Понемногу доделываю - дозреваю чего-нибудь записать. Но - сразу несколько трудностей: сам я игрок слабый, тяготею к блюзу (который играть толком не умею и который молодежь не жалует - и играть сложно, и нужной суровости нет :)), а сейчас пандемия - не уверен, что репбаза, на которой я некогда подрабатывал, сейчас работает... Да еще и приболеть умудрился - пока еще не знаю, ТЕМ или нет - но никого из друзей и не позовешь домой...
На сегодняшний день Киборг выглядит так:
(https://img.radiokot.ru/files/99520/thumbnail/2df2jzd60i.jpg) (https://img.radiokot.ru/files/99520/2df2jzd60i.jpg)
Цепочка эффектов: Перегруз (клин/компрессор) - Хорус (тремоло) - Реверберация (дилей) - Гейт - Спикосим.
Перегруз - первые три эмуляции цифровые:
Компрессор - делал для соло под PinkFloyd;
Клин -Fender Tween - в моем, конечно, преломлении :) клин/легкий_кранч;
Tubescreemer - делал максимально похоже на TS808;
Далее идут более мощные дисторшны, реализованные аналоговой схемой:
ВМ-4 - вариант моей трехручечной примочки - немного олдскульный;
ВМ-4+ - вариант трехручечной примочки с вырезанием середины, более модерновый;
ВМ-5 - вариант моей пятиручечной примочки + ручка Presence;
Reactor Alpha - одна из моих последних педалей, гейновая, певучая, смахивает на Engl;
Reactor Uranium - одна из моих последних педалей, гейновая, тяжелая, металлюжная, смахивает на Bogner;
Хорус - три варианта - классика и два стерео, или тремоло.
Реверберация - Spring, Hall, tap Delay, Delay, Delay + Hall.
Гейт - просто гейт. Буду тестировать.
Спикосим - 4х12 Vintage30, 4x12 Greenback, 2х12 Vintage30, 1x12 Greenback - ну так, как я это слышу, конечно :). Первый - самый резкий, с плотным низом на резонансе ящика, второй такой же, но помягче вверху, третий - резкий, но не такой низастый, последний - самый мягкий и "спокойный".
Вот пока и все, что сделано. В память пресеты пишутся, но нужно еще проверить запись со стиранием - когда свободное место кончается, проц должен стереть предыдущую страницу и перенести туда последние записи. Это я еще не проверял...
-
Немного пореампил - пришлось вспоминать, где лежат исходники и как настроить всю систему - чтобы и слышать чего-нибудь, и записать при этом (использую две звуковухи).
https://drive.google.com/file/d/1omx0b6YP3nLZa2kd7JC2-6BR2sYrZiWP/view?usp=sharing
Цепочка эффектов на гитарной партии: Reactor Uranium, Delay, Gate, 4х12 Vintage30. Запись в линию, не обрабатывалась - только микс. Возможно, сделал звук верхастее, чем нужно - уши устали,пока настраивался... :)
Все регулировки очень глубокие - и низ, и верх, и презенс - можно настроить очень разный звук.
-
Таки действительно никому не интересно? :(
-
Очень интересно, слежу за этим разделом постоянно. Просто самому в этой теме пока сказать нечего. Вот и молчу в тряпочку. ;-) Что касается звука - то это не в моем вкусе, хотя ничего плохого о нем сказать не могу.
-
Мне тоже очень интересно. Нормальный звук. Меня интересует чем закончится проект с клавишами.
Когда то в 80-х тоже хотел сделать клавиши, но с записью живых сэмплов в ПЗУ. Но с памятью в то время было туго. Задумал на магнитных доменах. Обьем памяти позволял. Завод по моей просьбе выслал документацию, но оказалось быстродействие очень низкое.
С тех пор только оверы и лампы :).
-
OldMike, вы в статистику форума загляните.
У темы 90000 просмотров, фигассе -неинтересно...
-
Ага! Эт хорошо. А то, получается - пишешь, ожидаешь какой-то реакции - а в ответ - тишина... :)
Насчет звука и вкуса - эт просто один из образцов. Причем, почему-то, если открывать из браузера - (у меня) звучит хуже, чем открытый плеером...
Моя гитара звучит немного иначе, просто я играю слабенько и полноценную демку не запишу. Возможно - просто напишу набор разных звуков - но это ж не интересно... Звук - разный, лично мне нравятся звуки с меньшим гейном - очень красивый клин, овердрайвы... Ладно - на словах это не интересно.
Я пока болею, сижу дома - таки похоже короновирус - запахи пропали начисто. Вот и маюсь дурью программирую по-немногу.
Нашел баг в гейте - он иногда потрескивал, теперь все нормально.
Осталось проверить, как работает запись банков в память. Она-то работает - я ж периодически сохраняю настройки, но рано или поздно страница заполнится и нужно будет перейти на следующую, а эту стереть на будущее. И вот тут прога должна перенести все последние настройки на новую страницу - и это нужно проверить...
А еще параллельно думается - на базе STM32F303 вполне возможно сделать очень простое по схеме и недорогое отдельное устройство - например, ТАР-дилэй. В смысле - без внешнего ЦАП/АЦП и ОУ, без индикации настроек. Встроенные ЦАП/АЦП 12 бит достаточны для параллельной петли эффектов, ОУ там тоже есть встроенные, вывести только светодиод ТАР, пару-тройку потенцев и кнопку включения... Если сделаю, поделюсь схемой и прошивкой. Такой проект кому-то интересен? В смысле - не посмотреть, а собрать?
Да, с клавишей... Продолжу, как закончу с гитарным процем. Зато теперь у меня для Хаммонда есть нормальные алгоритмы перегруза и фильтрации!
-
Выздоравливайте, коллега.
О вкусах не спорят, я вижу в Вашем звуке вкусность и какую-то "округлость", но сам предпочитаю "звук пилорамы" на риффах, и пискульки-визгульки на соло, а также Мэевские полифонические виолончельные закосы, поэтому говорю так. Звук IMHO реально достойный. Хотя воспринимаю процовые фичи больше для управления аналоговыми параметрами гейна, тембра, и параметрами всяких задержек. И, в принципе, осознаЮ, что все DSP-фокусы уже давно реализованы _серийно_.
-
Спасибо за пожелания!
"Пилорама" у меня тоже возможна- ну почти :). На самом деле даже без спикосима звук особо "не режет" - виной довольно низкая частота дискретизации, из-за чего полоса пропускания ЦАП/АЦП - около 15кГц. Сделано сознательно - не люблю "песок". И да - у меня цифра - в основном эффекты задержек и темброобразования. Хотя - компрессор, гейт, тремоло и пара перегрузов таки цифровая! :) Задумка была - удобная замена портативного педалборда. Ну - посмотрим, чего получилось :)...
Еще раз подчеркну - хотя я и изобрел очередной велосипед, у меня там нет DSP-фокусов - для них стандартный микроконтроллер не очень подходит. Вообще-то в STM32 со старшими моделями ядра (кажется, это Cortex 7) есть и какой-то DSP модуль, но так глубоко я еще не забирался...
У меня же в программе используется довольно простая (и потому быстрая) математика (точнее - арифметика :)) - я не использую даже числа с плавающей запятой, в основном целочисленные знаковые переменные размерностью 16 и 32 бита.
Для примера - аналог RC -цепочки ФНЧ первого порядка выглядит, как две строчки программы:
значение сигнала = старое_значение_сигнала + (входное_значение_сигнала - старое_значение_сигнала) * частота_среза ;
старое_значение_сигнала = входное_значение_сигнала ;
И все вот в таком духе. Никаких FFT и сверток...
Пока болел - развел плату и заказал печатки китайцам - когда-нибудь придут. А сейчас переписал алгоритм сохранения банков в память. Проверяю...
Ну - пока работает как-то криво... :)
-
Проснулся ночью - и вдруг сообразил, где у меня ошибка! :) Программирую во сне...
Попробовал утром исправить - и да, вроде заработало (это я запись банков в память отрабатывал - у STM32 нет флешь памяти для данных - только та, что для программ с поблочным стиранием - это усложняет алгоритм).
Итак - вроде пока все... Конечно - на тестировании еще вылезут баги - например, вчера попробовал на клине накрутить все регуляторы на максимум - и вдруг начал пропадать и рваться звук - явно происходило переполнение переменной при обработке... Пришлось искать строки, где переменная переполняется и уменьшать разрядность приходящих данных, пока не исчез дефект. Что-нибудь такое еще найдется, думаю...
-
Все время вылазят мелкие недоделки - например переключил тип дилея - а время задержки не поменялось (не вставил перевычисление времени задержки), и вот такие мелкие упущения пока кое-где остались. Правлю по мере выявления. Платы вроде китайцы сделали, шлют, жду...
-
Пришли печатки... Изготовили китайцы их отлично. Буду собирать по-немногу...
-
Начал собирать...
(https://img.radiokot.ru/files/99520/thumbnail/2ea07myuu6.jpg) (https://img.radiokot.ru/files/99520/2ea07myuu6.jpg)(https://img.radiokot.ru/files/99520/thumbnail/2ea07qzohm.jpg) (https://img.radiokot.ru/files/99520/2ea07qzohm.jpg)
И все бы неплохо - но... :-/
Я разводил дорожки, пока болел. Был расслаблен и невнимателен...
В общем - забыл нарисовать 4 элемента схемы и теперь придется на эту неземную красоту приклеить их навесом...
-
Был расслаблен и невнимателен.../quote]
... и пренебрегал сквозным проектированием... ;-( Тогда можно было бы разводить платки даже полумертвым. Именно для того, чтобы ошибки на плате точно_совпадали_ с ошибками на схеме, оно и нужно. ;-)
Слов нет, платка симпатичная. Но не мой формат, в бревно не влезет, да и не нужна она в нем. Здоровья, успехов и удачи.
-
Насчет сквозного - бинго! :) Я ж развожу в лейауте - в нем я быстро умею... А для полноценного сквозного проектирования нужно освоить что-то по-серьезнее. Пока руки не дошли - но я дозреваю...
А в бревно должно влезть - для того и делалось (ну, не только, но изначально задумывалось и как встраиваемая примочка).
Платку практически набрал, а включать страшно... :) Вот включу - тут-то баги и полезут :)
-
Насчет сквозного - бинго! :)
Такое на Лэйауте - снимаю шляпу... Когда схемы стали сложнее и цифровее/большекорпуснее, лично у меня другого выхода не было - только сквозное - намного меньше уходит времени, и исключаются ошибки, если правильно работать. Для меня - это связка OrCad Capture+OrCad PCB386+, (древний, но быстрый и эффективный, с настроенным постпроцессингом как для гербера, так и для ЛУТ/ЛЛТ). По вкусу - сквозное есть у многих современных кадов - как крякнутых, так и бесплатных - Eagle, OrCad, DipTrace, EasyPC, gEda, KiCad, и.т.д. Если будет тяга, гдее-нибудь могу рассказать, какие плюсы и минусы в них увидел - очень много перепробовал. В основном, нв нравились разводилки - все мерзковато и аляповато, для полуавтоматической разводки, которую практикую, IMHO неудобно. Особо отличаются Proteus и CircuitMaker - там еще и эмули. На первом сейчас можно прикрутить и STM32, и в связке с ArduinoIDE с прикрученным этим же процом, сильно облегчить себе жизнь. Кстати, и сам пользуюсь Лэйаутом, если надо что-то быстро восстановить из картинки чужой разводки при отсутствии кадовского оригинала, или из скана чужой платы, но не больше...
А в бревно должно влезть - для того и делалось
Нет, у меня в Жбанец точно не влезет... В теликообразный Washburn/Disney тоже.
Вот включу - тут-то баги и полезут :)
Удачи, и минимума багов, или превращения их в фичи... ;-)
-
На работе у нас народ практикует Альтиум... Но я в нем слабоват, хотя чужой проект как-то заканчивал. Так что я , скорее всего, именно Альтиум освою.
Просто я, как ни странно, работаю не программистом и не электронщиком :). Хотя начальство меня знает и иногда бросает в отдел электроники на подмогу коллегам...
А Лейка - я на ее освоение воще времени не тратил - она интуитивно понятна, развожу я всегда ручками, авто не пользовался никогда, очень удобно для небольших схем. Но - бывают и прокольчики...
PS Первый баг найден - придется подрезать пару дорожек... Мелочь, но тоже аргумент за Альтиум :).
-
Иногда кажущая "простота хуже воровства". При сквозном проектировании я уже при расстановке вижу по "резиновым линиям", как лучше располагать железяки, а при разводке - как выкручиваться из "узких мест". Авторазводку использую только в самом конце, чтобы проверить, ничего ли не забыл. И не надо в голове держать схему - все соединения уже в проекте, а при определенной настройке сам кад не даст тебе провести неправильные с точки зрения схемы, соединения. Первоначальное освоение и _правильная_ отрисовка схемы очень сильно облегчает и упрощает разводку платы, так как при сквозном - схема - это уже не просто картинка, а база данных деталек, их корпусов, и их соединений между собой. А на каком каде их делать - это на вкус и цвет... Лишь бы было быстро, хорошо, и самому нравилось. Альтиум - это наследник Протеля и более раннего Трэксмейкера, имеющий хорошие конверторы из других кадов, и неплохую визуализацию, что важно при полуавтоматической разводки, которую я лично практикую, не доверяя полному автомату, как разводящему хуже меня...;-) Ну, я не агитирую, а просто сообщаю о том, сколько времени и усилий тратят те, кто не использует сквозное проектирование при боль-мень непростых схемах. Можно, конечно, и без него обойтись, но лично я уже - никак с тех пор, как освоил. ;-)
-
Все как всегда упирается в лень... :) Ну - если точно - это ж не совсем лень, это, скорее, дефицит продуктивного времени суток. Его можно потратить на то, или то, или это... Как с деньгами, точно! :) Либо учить Альтиум, либо дописать прогу, либо развести плату, либо спаять макет, либо почитать/попереводить о более мощном семействе STM... А на работе - есть еще и работа, кто бы сомневался! :) При том, что для работы как раз мне Альтиум не особо и нужен - если я и впрягаюсь по электронике, то занимаюсь схемотехникой и руководством, как правило, и мне в "бригаду" дают людей, умеющих разводить в Альтиуме и оформлять все в соответствии со стандартами предприятия...
Но я уже дозрел - действительно, такое вложение времени (изучение Альтиума) должно окупиться в будущем...
PS Макет на плате в целом запустил - но пока не регулируется аналоговый гейн... Ошибок в разводке не нашел на первый взгляд, возможно неисправна микросхема цифрового пота (у нас магазин то еще г... бывает продает) - буду искать. Просто ездил на дачу на пару дней - все там позакрывать и спрятать - и т.д. потому не занимался, а тут на носу НГ! :)
Всех с наступающим!
-
С гейнами на аналоговой части разобрался. Питание проца - 3,3в, а аналоговой части - 5в (ну там на дросселе еще немного падает). Для согласования уровней проца и пота я использовал выводы проца, толерантные к 5в в режиме открытого стока с внешними резисторами-подтяжками к 5в. Резисторы - 1к. Как и подозревал - емкости входов SPI пота не успевали перезаряжаться через резисторы, пришлось немного притормозить SPI на проце и все заработало. Ну - почти все :). Во-первых - на печатке я поменял местами входы ADC против макета - ну это легко исправилось программно. Во-вторых - есть мелкий схемотехнический ляп - из-за "заданного" производителем номинала цифрового пота пришлось извращаться со схемой регулировки гейна второго каскада, усиление там большое и напряжение сдвига входа ОУ при такой схеме включения нужно учитывать, а я этого не сделал (тут и сквозное проектирование не поможет - ошибка то в голове! :))... Придется поднимать ногу цифрового пота и клеить еще один конденсатор навесом, иначе на больших гейнах схема уходит по постоянке и подхрипывает... Странно - на макете этого не было... Ну - мож ОУ имел сдвиг меньше...
-
Всех с Новым Годом!
Здоровья!
Счастья, удачи, достатка!
Ну и хорошего гитарного саунда!
-
Спасибо, коллега OldMike, и тебе этого многократно.
Работа очень интересная.
-
Ну что - он таки настал, Новый Год... :), с чем всех и поздравляю!
Изо всех сил верим, что 21 будет лучше 20го... :)
И уже в 21м - я таки приклеил еще один конденсатор во исправление допущенных на этапе разработки схемы ошибок. Помимо чисто эстетических моментов, минусом подобного решения является использование SMD керамических конденсаторов "в проход" по сигнальным цепям - я этого не люблю и стараюсь не делать. Хотя, если совсем честно, то на напряжениях питания 9-12В (а у меня аналоговая часть работает на 5В, куда уж ниже! :)) я не слышу ощутимой разницы в звуке между пленкой и керамикой. Вот на "ламповых" напряжениях в несколько сотен вольт керамика ощутимо звенит, да и разная пленка звучит чуть по-разному. Думаю, все дело в напряжении поляризации диэлектрика, точнее в отношении рабочего напряжения к предельному для данного кондера. Чем меньше эта дробь, тем менее заметно влияние диэлектрика на звук.
Ну это все теории - в данной инкарнации Киборга по другому сделать сложно, для проверки заложенных в него идей пойдет, а дальше - если оно будет как-то востребовано - исправлю печатку.
Что дало исправление - звук стал, как на предыдущем макете (собранном из кусочков разных схем и четырех печатных плат на проводкаах :)), он перестал рваться на определенных пассажах. Теперь нужно засунуть ЭТО в какой-нибудь корпус и дать кому-нибудь понимающему поиграть... И в этом есть одна тонкость - примочка в красивом корпусе "звучит" лучше точно такой же, но в ржавом и мятом! (проверено неоднократно! :)). В общем - я в ленивых послеНовоГодних раздумьях... :)
-
Показал Киборга паре приятелей-музыкантов... :) Вид у него, конечно, не очень - просто плата с прицепленым на шлейфе экраном, но прослушать можно.
Явных дефектов не услышал ни один, ни второй.
Первый - мой давний друг Виталий, опытный студийщик-звукореж и немного гитарист - не Сатриани, но с блюзом слегка знаком... :). Слушали через самодельные мониторные колонки (есть у него и гитарный ламповый аппарат, но не густо со временем - четверо детей в последнее время, хотя недавно их было трое... :)). Вывод - Киборг - это не лампа... Но звук и набор эффектов понравился.
Второй - владелец музыкального магазина и большой любитель Pink Floyd Юра. Включали через гитарный комбик, гитары брали со стенда :) - Фендер-Скваер с Р90 и Эпифон Стандарт (Гибсонообразный до безобразия :)). Тоже долго тренькали - резюме аналогично: явных дефектов не обнаружили, все юзабельно, а вот насколько оно реально хорошо - нужно пробовать в живой работе. Ну - и записать чего-нибудь.
В общем - нужно делать корпус...