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

=AK=

Свой
  • Постов

    3 234
  • Зарегистрирован

  • Посещение

  • Победитель дней

    5

Сообщения, опубликованные =AK=


  1. 1 hour ago, AlexandrY said:

    Не, не убедили.
    Здесь не интересен импеданс в среднем получившейся у вас структуры (кстати по отношению к чему?) , здесь интерес в  экранировании сигналов. 

    Экранирование - это одна составляющая, качество земли - другая. Обе важны.

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

     

    Quote


    Еще раз предлагаю посмотреть на плату TC и убедится что он точно следует вашей рекомендации. 
    Максимум что вы сможете - это добавить еще несколько переходных.

    "Это ваши смешные фантазии" (с) Нет ни via по периметру полигонов (TC об этом требовании скорей всего просто не знал), на предствленных рисунках нет ячеек нужного размера, и совсем не просматривается, чтобы земля одной стороны служила экраном проводникам на другой стороне. Поскольку показан только один слой. То есть, вы бесстыже натягиваете сову на глобус, представляя свои бредни в качестве некого аргумента.

     

    Стоит отметить, что такой уровень "аргументации", на уровне кухонных склок и выковырянного из носа бреда, опускает доверие к любым вашим словам просто ниже плинтуса.  Одумайтесь.  Инженеру стыдно поддаваться эмоциям и нести откровенную чепуху. Это уже не танцы с бубном, а гораздо хуже. :bad:

     

  2. 20 minutes ago, AlexandrY said:

    Сравните ваш фрагмент и рисунок платы TC. От также тщательно расставляет переходные. По виду у него их не меньше чем у вас. Только дорожки ортогональные. 
    Т.е. он однозначно в курсе  волн,  наводок и прочего. Поэтому я и не пытаюсь тут повторять некую физику. 
    Потому что грош цена пониманию физике и объяснениям если не можете дать численные оценки. 
    А численные оценки, как понимаю, дать не можете.
    Предлагаете ему способ  в стиле - вот это via не сюда, а туда поставь.
    Т.е. серьезно полагаете что точное места установки via имеет критическое значение.
    Но если вы не шаман и это не танец с бубном, но назовите алгоритм по определению точных координат via. :biggrin:

    Численные оценки я привел. Повторяю, размер ячейки в сетке должен быть не более 0.2 длины волны.  При выполнении этого условия точная координата via не имеет значения. Это даже студент должен был бы сообразить.:bb:

     

    Если условие  размера ячеек выполняется, импеданс полигона отличается от импеданса сплошного земляного слоя не более чем на несколько процентов. Назову - не более чем на 5%. Если можете - проверяйте, тогда вашему апломбу и уязвленному самолюбию будет найдено достойное применение. Ну а если не способны опровергнуть эту цифру, то примите ее как данность и не требуйте от других больше, чем на что способны сами, по-моему это было бы справедливо. :dirol:

     

     

  3. 7 hours ago, AlexandrY said:

    Нее.., типичный бубен это вот это - 

    А посмотреть изображение такого чуда можно?
    Думаю там просто один из слоев будет сплошной землей. 

    Нет. Земляные полигоны целиком покрывают обе стороны ПП и заливают все свободное от сигнальных проводников пространство.  Сигнальные проводники редактируются так, чтобы с противоположной стороны ПП под проводником по возможности была земля, а участки без земли под ними были как можно более короткими. Не допускаются большие пространства, свободные от земель с обеих сторон. Via сшивают земли противоположных сторон таким образом, чтобы земля образовала сетку с минимально возможным размером ячейки. Размер ячейки - не более 0.2 длины волны, т.е. порядка 25 мм для 2.4 ГГц, но лучше вдвое меньше. Сетка с ячейками такого размера обеспечивает низкий импеданс земли для этой частоты и для всех меньших частот, ненамного хуже, чем импеданс сплошной земли. По всему периметру ПП проходит цепочка via с небольшим шагом, сшивающая земляные полигоны, это заодно убивает паразитные щелевые антенны.

     

    Внешне такая ПП выглядит как обычная двухсторонняя плата. Но если присмотреться, можно увидеть большое кол-во земляных via.

     

    Для примера, фрагмент старой ПП, где на одной плате есть и радиоканал 433 МГц, и аналоговый измеритель 12-бит:

     

     

    2_layer_gnd.png.fca42eff23c697a57e40db4ef93dac13.png

     

    Например, обратите внимание на участок между C32 и резисторами R17, R18. Вертикальный проводник на красном слое (обратная сторона платы) не идет прямо, а изогнут,  чтобы разместить дополнительное земляное via. Аналогичное место рядом с C2, R9. И т.д. и т.п, это делается на последних стадиях разводки ПП и требует примерно лишний час-два времени на редактирование.

     

    Как видите, в отличие от ваших голословных высказываний, все обдумано, обосновано и опирается на физику, а не на приемы услышанные в курилке и применяемые вслепую, наугад,  без понимания, как они работают. Ибо если бы вы понимали - могли бы объяснить. Не можете объяснить - танцуете с бубном и бормочете шаманские заклинания.

     

  4. 23 hours ago, AlexandrY said:

    Не, это я перечислял фазы просветления. Или как бы вам советовали действовать дальше по мере получения отрицательной обратной связи.
    На самом деле конденсаторы сработают только на 4-х слойке. 
    Все остальное - танцы с бубном. 

    Вы знаете что значит "танцы с бубном"?  Это советы сделать то-то и то-то без объяснения и без понимания источников проблем и механизма борьбы с ними. Вот то что вы советуете - это как раз и есть танцы с бубном, во всей своей красе.

  5. 22 hours ago, Mysteo said:

    Включил устройство, выключил Wi-Fi модуль программно, с контактов котороми обозначил красными взял питание и землю и запитал второе устройство, где не стал отключать программно Wi-Fi , и если бы щелчки в динамике и микрофоне были связаны с просадкой напряжения, то я бы услышал щелчки во всех двух устройствах, однако щелчки были только на втором устройстве, а стабилизатор на два изделия работал. 

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

    Quote

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

    Ну почему именно "из-за разводки"? Это неочевидно и вообще довольно расплывчато.

     

    Весьма вероятная причина - прямая наводка WiFi сигнала на чувствительные звуковые цепи. В любом усилителе полнО pn-переходов, каждый из которых может стать детекторным приемником. Если к нему подходит проводник с длиной, сопоставимой с длиной волны WiFi, то это  довольно эффективная антенна. Длина волны 2.4 ГГц равна 12.5 см, четвертьволновой диполь на эту частоту - всего 3.125 см.  Каждый проводник такой длины будет очень эффективной антенной, проводники сопоставимой длины - менее эффективными, но тоже антеннами.

     

    Конечно, можно резко уменьшить эффективность этих антенн, если вплотную к ним расположить земляной полигон. Это автоматически получается в случае четырехслойной ПП. Вообще-то и на двухслойной плате можно "угробить" антенны, если немного подумать. Это можно назвать "разводкой".

     

    Кроме того, можно наведенный на антенну сигнал спустить на землю, если на чувствительных входах поставить керамические кондеры на землю порядка 100...470 пФ. Тогда сигнал на входе будет настолько слаб, что детекторный приемник просто не будет работать. Но это уже не разводка, это схемотехника.

     

    Ну и, наконец, можно поставить некий экран, который защитит чувствительные входы от ВЧ сигналов рядом стоящего передатчика, т.е. ESP-12. Это будет и не разводка, и не схемотехника.

  6. 8 minutes ago, Mysteo said:

    Да я даже поднимал модуль, на штырьки запаивал, ничего не изменялось

    Тем не менее, я так и не понял, какие развязывающие кондеры стоят рядом с модулем. Должно быть, как минимум, керамика 100 нФ и электролит 470 мкФ.

    Когда кондеры имеются, можно взрезать подводящую дорожку питания и вставить туда дроссель, скажем, 10 мкГн на ток не менее 100 мА, лучше - на 0.5А. На второй конец дросселя навесить еще один развязывающий кондер 100 нФ. И посмотреть что получится.

  7. 2 minutes ago, Mysteo said:

    Висит в воздухе 
    image.png.616e5f426d6b23cf39c0deda1c947d53.png

    Справа от модуля - висит. Слева - нет, ПП находится слишком близко к антенне и влияет на нее. Антенна рассогласована. У китайцев бывает намного хуже, но все равно, полностью свободной от влияния ПП я бы эту антенну не назвал.

  8. 1 hour ago, Mysteo said:

     

    Вот у меня есть 20 модулей ESP12F - совсеми проблемы кроме одного. Он какой-то другой , на его плате переходные отверстия по другому сделаны ) . Мою проблему там конденсатор 470мкФ помог устранить.

    Ставлю модуль с керамической антенной ESP-07 , с ним вообще никаких проблем, даже не надо электролит ставить. Но он у меня только один

    Вот вам и ответ: у него совсем другая антенна, и согласование этой антенны намного меньше зависит от окружения.

    Повторяю прямым текстом, раз вы совсем уж прозрачных намеков не понимаете: у вас антенна модулей ESP-12 находится над вашей ПП или висит в воздухе?

     

  9. 1 hour ago, AlexandrY said:

    Не, лучше выбросьте свои электролиты.  Вы просто сделали свое изделие необоснованно дороже. 

    Вот типичная реакция хорошего LDO на скачок тока:

     

    Повторяю: это на его выходных терминалах, пинах, клеммах. Компрене ву? Или разжевать?

     

    Учите как "отче наш": развязывающие конденсаторы должны стоять как можно ближе к ножкам (терминалам, клеммам) потребителей тока. Независимо от качества питания на выходных ножках (терминалах, клеммах) источника питания.

  10. 3 hours ago, Mysteo said:

    Схемотехнику делал по даташитам, брал микруху , смотрел рекоммендуемую обвязку, там электролитов не было. Что-то я упустил данный момент.

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

    Есть книги: Титце-Шенк, Горовиц-Хилл. Их надо знать. Они учат не только схемотехнике, но и здравому смыслу, что важнее.

    Quote

    Что то меня все запутали, одни говорят одно, другие другое ) . 

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

    Quote


    Я бы поверил что стабилизатор не справляется. Но если запитывать каждый потребитель от мощоных блоков питаний, то данные пощелкивания все равно по всей плате проходят.

    Угу. Только мощный источник вы подключаете с одного конца платы проводами неизвестной длины и сечения, а мощный потребитель - ESP-12 - находится на другом конце платы.

    ESP должен свои полампера в течении примерно 10 мс брать от электролита, который стоит рядом с его ногами. Чтобы эти полампера не циркулировали по всей плате, создавая провалы в питании и скачки потенциалов в землях.  А чтобы дать полампера в течении 10 мс емкость должна быть большая. 470 мкФ - это самый минимум. И керамика 100 нФ ему в параллель тоже нужна, конечно.

    1 hour ago, Mysteo said:

    Заменил Wi-Fi модули на другие, от других китаез, проблемы тоже исчезли, правда у меня только 2 модуля таких было.......

    Пиковый nок потребления ESP-12 зависит от того, насколько хорошо настроена его антенна. Пресловутые 0.5 А наблюдались на более старых ESP-12E когда его антенна лежала на "материнской" ПП. А для более новых ESP-12S с антенной, "висящей в воздухе", пиковые токи были вдвое меньше. Потому что кусок ПП толщиной 1.6 мм с диэлектрической постоянной 4.7 вплотную к антенне - это совсем не то же самое, что воздух с диэлектрической постоянной 1. Вполне очевидно, что производитель настраивает антенны своих модулей в воздухе, а не лежащими на другой ПП.

    4 hours ago, AlexandrY said:

    Электролиты могут вызвать нестабильную работу DC/DC. И вообще за стабильное питание отвечает стабилизатор, а не электролиты. 

    Выбросьте в топку такой DC/DC.

    Стабилизатор отвечает только за стабильное напряжение на своих выходных клеммах. А за отсутствие щелчков за счет импульсных токов, циркулирующих по длинным контурам земли и питания, он ни разу не отвечает.

  11. 20 hours ago, Mysteo said:

    Здравствуйте! Сделал макетные платы будущего устройства. В девайсе микроконтроллер STM32L100 , ESP12F (ESP8266), УНЧ микрофона и УНЧ D класса для динамика. Все функционирует как надо. Но вот при включении и работе Wi-FI по всем линиям питания помехи. 
    До этого я никогда не разводил платы.  Хотелось бы устранить их в будущем. Я сначала подумал что это из-за того что я УНЧ динамика запитал от того же стабилизатора, что и Wi-Fi модуль. Потом переделал, но щелчки никуда не ушли.

    Непонятно почему вы решили что проблема в разводке. Я на вашей плате не вижу ни одного электролита, вообще. А ESP8266 в момент передачи потребляет по 0.5 А короткими импульсами. Может, у вас просто питание просаживается.

    Рядом с выводами питания ESP-12 должен стоять электролит, как минимум 470 мкФ. Поскольку у вас звуковое устройство, я бы этот электролит поставил побольше, 2200 мкФ, и вообще наставил бы электролитов в питании по всей плате.

    9 hours ago, AlexandrY said:

    Без шансов. Частота 2,4 ГГц - эт не шутка.
    Без плэйна (сплошного и без разрывов слоя) земли у вас нет шансов подавить детектирование частоты 2.4  ГГц  аудио микросхемами и микрофоном. 

    Я без малейших проблем работаю на 2-слойных платах с ESP-12. Правда, микрофона нет, зато есть 12-битный АЦП.

  12. On 6/8/2019 at 11:30 PM, mantech said:

    Поздравляем их!  Вот объясните, зачем каждый чих все устройства для внутреннего пользования, выставляют в интернет? Ну вот зачем? Это первый раз удивило, когда все СМИ трубили о взломе симатиков в Иране, на АЭС - это просто сюр какой-то... 

    На сколь видно по описанию - это УАРТ-ориентированный протокол, т.е. под проводные интерфейсы. С радио несколько иные режимы обмена нужны...

    Почему обязательно интернет или RF? Достаточно заселиться в гостиницу под видом обычного клиента - и вы получаете доступ к проводке. У вас в номере будет несколько выключателей, снимаете любой - и все, есть доступ к интерфейсу.

  13. 1 hour ago, vladec said:

    Но это будут антенны только на высокие частоты, а не нашинкованные -- и на высокие и на низкие,

    Из ваших слов следует, что простое разрезание проводника на две части каким-то волшебным образом меняет его свойства? Более длинный проводник будет антенной  "и на высокие и на низкие" частоты, а более короткий - "только на высокие частоты". И при какой же длине проводника происходит такое качественное превращение? Назовите конкретную цифру. Это, очевидно, некая новая мировая константа, вроде скорости света. На нобелевку потянет...

     

    1 hour ago, vladec said:

    кроме того львиная доля излучений от полигонов, как от щелевых антенн, а VIA-сы на границах полигонов их подавляют.

    А это здесь причем? Я спросил чем плох вариант рис.8 из статьи. Про VIA  ни слова ни полслова не сказано, каким образом вы их сюда приплели, где связь?

  14. On 5/15/2019 at 10:15 PM, Myron said:

     Рис. 8 - плохой вариант - как минимум, там хорошаяя антенна из земли вокруг МК "острова".

    Любой кусок металла, в том числе любой проводник на печатной плате, является антенной. Чаще всего -  является "хорошей антенной", т.е. хорошо принимающей определенные сигналы из всего спектра частот. Но совсем непонятно, что в этом плохого.  Что прикажете делать с этим обыденным фактом?

     

    Шинковать проводники как капусту? Увы, не поможет, маленькие кусочки проводников все равно останутся "хорошими антеннами", но настроенными на более высокие частоты. Вместо хороших проводников использовать что-то плохо проводящее? Делать ground plane из резистивного материала? Пардон, это был бы просто бред.

     

    Так что же плохого в том, что земля вокруг МК "острова" является некой антенной, как и любой другой кусок провода? В чем проблема-то?

  15. On 7/9/2019 at 4:47 PM, jenya7 said:

    хм. UART + трансивер CAN это интересно. но кто будет разруливать колизии на шине? тут нужен строгий мастер слейв.

    Мастер-слэйв для разруливания коллизий не нужен. То же CAN прекрасно разруливает безо всяких мастер-слэйвов.  И KNX разруливает, и C-Bus, и HBus. У всех четырех парадигма "производитель-потребитель", мастер им не нужен, все узлы равны.

     

     

  16. 16 hours ago, AHTOXA said:

    Подскажите, для чего в протоколе введён такой вариант:

    
    0x1B-0x09 - insert 0x1B, 0x1B into data flow

    ? Для экономии трафика?

    Чтобы много памяти под буфера не отводить. Ну и трафик тоже. Хоть и далается вставка/удаление байтстаффинга "на лету", все же иногда приходится держать в буфере пакет с байтстаффингом.

  17. 2 hours ago, one_eight_seven said:

    На выходе получается очередное ущербное угробище. Приходилось несколько раз работать с таким. Перед началом работ с подобными приборами производитель говорит: "У нас CAN, всё работает". Начинаешь работать, и никакого CAN и в помине нет. А сроки уже обозначены, деньги получены. Приходится заниматься не работой, каким-то непотребством.

    Угробище получается не из-за использованных составных частей, а из-за дырок в головах разработчиков. На такое и на "генетически чистом CAN" можно напороться. "Хождение по камушкам" (т.е. привязка к накатанным шаблонам) никак не гарантирует наличие мозгов.

  18. Just now, mantech said:

    Тоже вариант, хотя я привык к архитектуре мастер-слейв, она мне просто больше нравится своей предсказуемостью...

    Никто не запрещает использовать "мастер-слэйв" связке (UART + трансивер CAN). В приведенном выше примере шина работает в двух режимах; "мастер-слэйв" при конфигурировании узлов и "производитель-потребитель"  в рабочем режиме. Одно другому не мешает.

  19. 23 hours ago, mantech said:

    Здесь нет смысла впиндюривать КАН. Самое удачное - RS-485. Очень дешево и сердито, уарт есть в каждом МК сегодня...

    UART - это правильно. Но непонятно зачем к нему приделывать такое допотопное угробище, как RS485 трансивер. Никто не мешает использовать совместно с UART трансивер CAN. Со всеми полагающимися при этом плюшками: отсутствием мастера, парадигмой "производитель-потребитель", избеганием столкновений (CSMA-CA) или в крайнем случае обнаружением столкновений (CSMA-CD), и т.п.

     

    А вот контроллер CAN и протокол CAN, действительно, обычно и нафиг не нужны. Я думаю, что их используют в основном в силу косности мышления, "чтобы не думать". Равно как RS485 трансивер с UART используют ровно по той же причине.

     

    Пример интерфейса на связке UART + трансивер CAN, без протокола CAN и без контроллеров CAN,  можно посмотреть здесь. Все делается на самой дешевой Ардуинке. 

  20. On 5/15/2019 at 4:45 PM, jenya7 said:

    В продолжение темы с уважаемым xvr.

     

    Мне нужно исполнять скрипт.

    Пользователь передает его в микроконтролер, скрипт сохраняется (в FLASH) и исполняется. в основном это проверка входных условий (переменных) и если условия выполнились - изменение выходных условий (переменных).

    Самоя сложное выражение (пока) это к примеру такое

    Выражений может быть до .... ну не знаю пока 40.

    в IF все AND - поэтому если хоть одно условие не выполниться THEN не исполняется.

     

      Reveal hidden contents
    
    
    char *ToLowerCase(char *str)
    {
      int i;
      for(i = 0; i < strlen(str); i++)
      {
          if(str[i]>='A' && str[i]<='Z')
           str[i]=str[i]+32;
      }
      //*str++ = '\0';
      return str;
    }
    
    uint32_t IsAlphaNumeric(char c)
    {
        return ( ( c > 64 && c < 91 ) || (c > 96 && c < 123) || (c > 47 && c < 58) );
    }
    
    uint32_t IsLetter(char c)
    {
        return (( c > 64 && c < 91 ) || (c > 96 && c < 123));
    }
    
    uint32_t IsDigit(char c)
    {
        return (c > 47 && c < 58);
    }
    
    uint32_t IsNum(char c)
    {
        return ((c > 47 && c < 58) || c == '.' /*|| c == '-'*/);
    }
    
    uint32_t IsCompare(char c)
    {
       return ((c == '>') || (c == '<') || (c == '=') || (c == '!'));
    }
    
    uint32_t IsMath(char c)
    {
       return ((c == '+') || (c == '-') || (c == '*') || (c == '/') || (c == '='));
    }
    
    uint32_t IsBitLogic(char c)
    {
       return ((c == '|') || (c == '&'));
    }
    
    uint32_t IsGroup (char c)
    {
       return ((c == '(') || (c == ')'));
    }
    
    uint32_t IsEnd(char c)
    {
        return (c == ';');
    }
    
    uint32_t IsEndOfLine(char c)
    {
       return ((c == '\n') || (c == '\r'));
    }
    
    uint32_t IsLogic(char *str)
    {  
        char *l_str = ToLower(str); 
        return ( (strcmp(l_str,"or")==0) || (strcmp(l_str,"and")==0) || (strcmp(l_str,"||")==0) || (strcmp(l_str,"&&")==0));
    }
    
    uint32_t IsIn(char *str)
    {  
        char *l_str = ToLower(str); 
        return ( (strcmp(l_str,"in")==0));
    }
    
    uint32_t IsOut(char *str)
    {  
        char *l_str = ToLower(str); 
        return ( (strcmp(l_str,"out")==0));
    }
    
    uint32_t IsIf(char *str)
    {  
        char *l_str = ToLower(str); 
        return ( (strcmp(l_str,"if")==0));
    }
    
    uint32_t IsThen(char *str)
    {  
        char *l_str = ToLower(str); 
        return ( (strcmp(l_str,"then")==0));
    }
    
    uint32_t LEXER_GetToken(char *expr, TOKEN *token, uint32_t *exp_idx)
    {
        //uint32_t idx = 0;
        uint32_t i  = 0;
        uint32_t slen = strlen(expr);
        uint32_t space = 0;
        
        //end of expression
        if(expr[*exp_idx]=='\0')
        {
            (*exp_idx)++;
    	    return LEXER_OK;
        }
    
        //skip spaces
        while(expr[*exp_idx] == ' ')
        {
    	//token->type = Space;
            space = 1;
            (*exp_idx)++;
    	if (*exp_idx > slen)
    	    return LEXER_FAIL;
        }
    
        //get compare
        if (IsCompare(expr[*exp_idx]))
        {
            i = 0;
            while (IsCompare(expr[*exp_idx]))
            {
                token->name[i++] = expr[(*exp_idx)++];
                if ( (i > 2) || (*exp_idx > slen))
    	        return LEXER_FAIL;
            }
            token->name[i] = '\0';
            token->type = Compare;
            
            return LEXER_OK;
        }
    
        //get a variable - start with a letter
        if (IsLetter(expr[*exp_idx]))
        {
    	i = 0;
    	while (IsLetter(expr[*exp_idx]) || IsDigit(expr[*exp_idx]))
    	{
    	    token->name[i++] = expr[(*exp_idx)++];
    	    if ( (i > TOKEN_MAX_SIZE) || (*exp_idx > slen))
    		return LEXER_FAIL;
    	}
    	token->name[i] = '\0';
            
            if (IsIn(token->name))
                token->type = In;
            else if (IsOut(token->name))
                token->type = Out;
            else if (IsLogic(token->name))
                token->type = Logic;
            else if (IsIf(token->name))
                token->type = If;   
            else if (IsThen(token->name))
                token->type = Then;   
            else     
    	    token->type = Alphanumeric;
            
            return LEXER_OK;
        }
    
        //get a number
        if (IsNum(expr[*exp_idx]))
        {
            i = 0;
    	while (IsDigit(expr[*exp_idx]))
    	{
    	    token->name[i++] = expr[(*exp_idx)++];
    	    if ( (i > TOKEN_MAX_SIZE) || (*exp_idx > slen) )
    	        return LEXER_FAIL;
    	}
    	token->name[i] = '\0';
    	token->type = Number;
            return LEXER_OK;
        }
            
        //get an arithmetic
        if (IsMath(expr[*exp_idx]))
        {
            // '-' may be operand or negative number
            if (expr[*exp_idx] == '-')
            {  
                i = 0;
                if (space == 1) 
                {
                    space = 0;
                    token->name[i++] = expr[(*exp_idx)++];
                    if (IsDigit(expr[*exp_idx]))
                    {
                       while (IsDigit(expr[*exp_idx]))
                       {
                           token->name[i++] = expr[(*exp_idx)++];
                           if ( (i > TOKEN_MAX_SIZE) || (*exp_idx > slen) )
    	                   return LEXER_FAIL;
                       }
                       token->name[i] = '\0';
    	           token->type = Number;
                       return LEXER_OK;
                    }
                    else
                    {
                        while (IsMath(expr[*exp_idx]))
                        {
                            token->name[i++] = expr[(*exp_idx)++];
                            if ( (i > 2) || (*exp_idx > slen) )
                            return LEXER_FAIL;
                        }
                        token->name[i] = '\0';
                        token->type = Math;
                        return LEXER_OK;
                    }
                }
                else
                {
                    while (IsMath(expr[*exp_idx]))
                    {
                        token->name[i++] = expr[(*exp_idx)++];
                        if ( (i > 2) || (*exp_idx > slen) )
                            return LEXER_FAIL;
                    }
                    token->name[i] = '\0';
                    token->type = Math;
                    return LEXER_OK;
                }
            }
            else
            {
                i = 0;  
                while (IsMath(expr[*exp_idx]))
                {
                    token->name[i++] = expr[(*exp_idx)++];
                    if ( (i > 2) || (*exp_idx > slen) )
                        return LEXER_FAIL;
                }
                token->name[i] = '\0';
                token->type = Math;
            }
            return LEXER_OK;
        }
        
        //get logic
        if (IsBitLogic(expr[*exp_idx]))
        {
            i = 0; 
            while (IsBitLogic(expr[*exp_idx]))
            {
                token->name[i++] = expr[(*exp_idx)++];
                if ( (i > 2) || (*exp_idx > slen) )
    		return LEXER_FAIL;
            }
            token->name[i] = '\0';
            
            if (i==1)
               token->type = Bitlogic;
            else if (i==2)
    	   token->type = Logic;
            
            return LEXER_OK;
        }
            
        if (IsGroup(expr[*exp_idx]))
        {
            i = 0; 
            token->name[i++] = expr[(*exp_idx)++];
            token->name[i] = '\0';
    	token->type = Group;
            return LEXER_OK;
        }
        
        if (IsEnd(expr[*exp_idx]))
        {
            i = 0; 
            token->name[i++] = expr[(*exp_idx)++];
            token->name[i] = '\0';
            token->type = End;
            return LEXER_OK;
        }
            
        return LEXER_OK;
    }
    

     

     

     

    Самое простое - сделать интерпретатор виртуальной Форт-машины, FVM. Полной (по Тьюрингу) машине надо всего пару десятков команд (токенов), что реализуется в несколько сотен строк текста на С. Как вариант можно попробовать использовать такую тулзу для автоматической генерации интерпретатора и кросс-компилятора для него, однако написать интерпретатор самому "с нуля" может оказаться быстрее и проще.

  21. 3 hours ago, Herz said:

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

     

    Резистор нижнего плеча конечно же низкоомный по сравнению с верхним. А коденсаторы ставят такой величины, чтобы постоянные времени верхнего и нижнего плеча оказались равны,  C1*R1 = C2*R2. В высоковольтном/высокоомном плече R1 нет нужды ставить дополнительные конденсаторы,  роль С1 играет проходная емкость самих резисторов - при условии что эти резисторы находятся далеко от земли и емкостная связь с землей, что называется, "не путается под ногами". В моем случае именно так и было, высокоомные резисторы были смонтированы на штырях, а земли под ними не было, только шасси (т.е. корпус) сантиметрах примерно в 5, как помнится. Ну а в низкоомном плече, естественно, для получения той же постоянной времени потребовался конденсатор С2 параллельно резистору R2.

  22. On 5/18/2019 at 8:18 PM, Herz said:

    Тогда что Вы там осциллографом смотреть собираетесь? Частотная компенсация здесь не только желательна, но и необходима. Без неё Вы получите гарантированный обман зрения...

    Компенсация нужна, бесспорно, но и слишком с ней усердствовать не надо.

    Кода-то давно делал я ОУ с размахом 10кВ на выходе. Время установления сигнала на выходе было 0.6 мс. Вернее, я не делал, а переделывал сделанное другим человеком.  Переделывать пришлось потому что этот ОУ работал нестабильно и, в частности, был склонен к возбуждению, да и просто выгорал по входу время от времени.

    Там в цепи ОС стоял самодельный делитель, набранный из пары десятков прецизионных 2-ваттных металлопленочных резисторов. И чуть ни на каждом резисторе висел мелкий конденсатор, "для компенсации", причем все разных номиналов. Из каких соображений автор их ставил и как побирал - не знаю, с автором я не пересекся ни разу, он ушел из фирмы.

    Помимо прочих изменений в ОУ, я выбросил из делителя все конденсаторы, стоявшие на резисторах верхнего плеча. Оставил только один, стоявший параллельно резистору нижнего плеча.  

    У меня был высоковольтный пробник для осцилла, Тектроникс 6015А, если правильно помню. Каково же было мое удивление, когда, сравнив сигналы с Тектроникса и с самодельного делителя, я убедился, что  делитель работает честно, а Тектроникс врет как сивый мерин: на полках долгих сигналов он показывает некую невесть откуда взявшуюся "просадку". Очевидно на полках резисторы высоковольтного плеча прогревались и "плыли", другого объяснения я не нашел. И фронты у Тектроникса были немножко похуже.

    В результате изменений возбуд я убрал, а время установления уменьшил вдвое.

  23. 5 hours ago, wim said:

    В трансформаторе делается межобмоточный экран.

    +1

    Лет десять назад попадались мне импульсные БП, у которых напряжение между землей и вторичкой было равно нулю, через транс ничего не пролезало. К сети они подключались 3-проводной вилкой. Я их не разбирал, но полагаю очевидным, что в них имелся межобмоточный экран, соединенный с землей. Ну и на входе фильтр, разумеется.

  24. On 12/13/2018 at 9:46 PM, Neznayka said:

    чем можно защитить контактные площадки на время проведения испытаний, чтобы они не окислились, но чтобы после испытаний защитный слой можно было относительно легко удалить?

    (Dow Corning) DOWSIL 3140 RTV или подобный силикон.

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