<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Нерабочие схемы</title><subtitle>Проверяем схемы. Объясняем, почему не работают. Отбираем рабочие</subtitle><author><name>Нерабочие схемы</name></author><id>https://teletype.in/atom/badradio</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/badradio?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@badradio?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=badradio"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/badradio?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-08T17:33:40.618Z</updated><entry><id>badradio:keyboard</id><link rel="alternate" type="text/html" href="https://teletype.in/@badradio/keyboard?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=badradio"></link><title>Шапочка из фольги для клавиатуры, или как ваш пароль был перехвачен на расстоянии v1.0</title><published>2026-02-15T11:31:16.045Z</published><updated>2026-02-26T11:40:34.119Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/42/53/425333d0-b0fe-4247-89e8-0bcce4c90af7.png"></media:thumbnail><category term="chempiony-sredi-oshibok" label="Чемпионы среди ошибок"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/c3/74/c374a20a-b0aa-4a17-bcf5-ccec5ffa1ad8.jpeg&quot;&gt;Еще в 2001 году исследователи из Швейцарии Martin Vuagnoux и Sylvain Pasini обнаружили, что паразитные излучения PS/2, USB, и даже встроенных в ноутбуки клавиатур позволяют перехватить пароли на расстоянии 20 м с вероятностью 95%.</summary><content type="html">
  &lt;p id=&quot;Ttwx&quot;&gt;Еще в 2001 году исследователи из Швейцарии &lt;strong&gt;Martin Vuagnoux&lt;/strong&gt; и &lt;strong&gt;Sylvain Pasini&lt;/strong&gt; обнаружили, что паразитные излучения PS/2, USB, и даже встроенных в ноутбуки клавиатур позволяют перехватить пароли на расстоянии 20 м с вероятностью 95%.&lt;/p&gt;
  &lt;p id=&quot;B2EE&quot;&gt;&lt;a href=&quot;https://web.archive.org/web/20150115020100/https://www.usenix.org/legacy/events/sec09/tech/full_papers/vuagnoux.pdf&quot; target=&quot;_blank&quot;&gt;https://web.archive.org/web/20150115020100/https://www.usenix.org/legacy/events/sec09/tech/full_papers/vuagnoux.pdf&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;UUPG&quot;&gt;Для примера рассмотрим старые PS/2 клавиатуры, в которых применяются неэкранированные кабели:&lt;/p&gt;
  &lt;p id=&quot;PJk7&quot;&gt;&lt;a href=&quot;https://oe7twj.at/images/6/6a/PS2_Keyboard.pdf&quot; target=&quot;_blank&quot;&gt;https://oe7twj.at/images/6/6a/PS2_Keyboard.pdf&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;f9Co&quot;&gt;Поскольку фронты импульсов Data и Clock достаточно крутые, спектр паразитных излучений (нечетные гармоники частоты тактирования клавиатуры) простирается за 200 МГц, и момент перехода сигналов через ноль хорошо заметен на анализаторе спектра:&lt;/p&gt;
  &lt;figure id=&quot;BInF&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c3/74/c374a20a-b0aa-4a17-bcf5-ccec5ffa1ad8.jpeg&quot; width=&quot;640&quot; /&gt;
    &lt;figcaption&gt;Перехват паролей на расстоянии: спектр паразитных излучений клавиатуры&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;qXIX&quot;&gt;Как принять эти побочные излучения и расшифровать набираемые на клавиатуре символы?&lt;/p&gt;
  &lt;p id=&quot;h5bF&quot;&gt;На вход &lt;strong&gt;быстрого АЦП&lt;/strong&gt; подключается антенна (через простейший ПФ и МШУ), сигнал записывается.&lt;/p&gt;
  &lt;p id=&quot;xEVl&quot;&gt;Применяется &lt;strong&gt;быстрое преобразование Фурье&lt;/strong&gt; (понятно описанные алгоритмы см. в книге &lt;a href=&quot;https://faculty.washington.edu/seattle/brain-physics/textbooks/drongelen.pdf&quot; target=&quot;_blank&quot;&gt;Signal Processing for Neuroscientists&lt;/a&gt;) для поиска &lt;strong&gt;нечетных гармоник&lt;/strong&gt; частоты тактирования клавиатуры (10...16.7 кГц).&lt;/p&gt;
  &lt;figure id=&quot;RRWY&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/22/22/2222d44d-c074-42d5-9cbe-9de458e44973.jpeg&quot; width=&quot;314&quot; /&gt;
    &lt;figcaption&gt;Рекомендуемая книга по цифровой обработке сигналов&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;6WMa&quot;&gt;В моменты, когда смесь нечетных гармоник присутствует, отмечается переход &lt;strong&gt;сигнала Clock&lt;/strong&gt; через ноль.&lt;/p&gt;
  &lt;p id=&quot;0hOY&quot;&gt;Момент перехода через ноль &lt;strong&gt;сигнала Data&lt;/strong&gt; обнаруживается по увеличенной амплитуде всплеска.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Hxle&quot;&gt;Авторы использовали АЦП осциллографа &lt;a href=&quot;https://www.tek.com/en/datasheet/tds5000-series&quot; target=&quot;_blank&quot;&gt;Tektronix TDS5104&lt;/a&gt; (частота дискретизации 5 ГГц), записанные сэмплы передавали для анализа на компьютер через сетевую карту.&lt;/p&gt;
    &lt;figure id=&quot;4oTe&quot; class=&quot;m_original&quot;&gt;
      &lt;img src=&quot;https://img3.teletype.in/files/23/a6/23a6babe-94c7-4b9e-b7f1-ce1d3d8ec87a.jpeg&quot; width=&quot;750&quot; /&gt;
      &lt;figcaption&gt;Осциллограф Tektronix TDS 5104&lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;p id=&quot;HLnB&quot;&gt;При использовании древнего &lt;a href=&quot;https://www.ettus.com/products/&quot; target=&quot;_blank&quot;&gt;USRP&lt;/a&gt; результаты были хуже (дальность 2 м).&lt;/p&gt;
    &lt;figure id=&quot;BJdp&quot; class=&quot;m_original&quot;&gt;
      &lt;img src=&quot;https://img1.teletype.in/files/87/a6/87a699e1-a7aa-4eb0-9df6-9def8cf798a0.png&quot; width=&quot;855&quot; /&gt;
      &lt;figcaption&gt;Современные приемники USRP&lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;p id=&quot;iy5n&quot;&gt;Наверное, перехватчик можно сделать даже на базе &lt;strong&gt;&lt;a href=&quot;https://greatscottgadgets.com/hackrf/one/&quot; target=&quot;_blank&quot;&gt;HackRF One&lt;/a&gt;&lt;/strong&gt; с его 20 МГц полосой (потребуется только написать софт и, для лучших результатов, посчитать ПФ).&lt;/p&gt;
    &lt;figure id=&quot;LxNs&quot; class=&quot;m_original&quot;&gt;
      &lt;img src=&quot;https://img3.teletype.in/files/e9/93/e993801a-c983-4218-9e60-572ea553323c.jpeg&quot; width=&quot;1200&quot; /&gt;
      &lt;figcaption&gt;HackRF One&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/section&gt;
  &lt;p id=&quot;DWt8&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;1Nwa&quot;&gt;&lt;strong&gt;Защита&lt;/strong&gt;: экранирование кабеля и контактных площадок клавиатуры с двух сторон.&lt;/p&gt;
  &lt;p id=&quot;jD2O&quot;&gt;Выпускаются специальные &lt;a href=&quot;https://www.directindustry.com/industrial-manufacturer/emc-shielded-keyboard-265383.html&quot; target=&quot;_blank&quot;&gt;экранированные клавиатуры&lt;/a&gt;, например, &lt;a href=&quot;https://www.directindustry.com/prod/key-technology-china-limited/product-68381-2481449.html&quot; target=&quot;_blank&quot;&gt;K-TEK-M390TP-FN-BL-ML-EMC-DWP&lt;/a&gt; (не реклама):&lt;/p&gt;
  &lt;figure id=&quot;OTxx&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6a/05/6a0523a7-a3df-4646-bc4b-6e7d7f6e1cf6.jpeg&quot; width=&quot;300&quot; /&gt;
    &lt;figcaption&gt;Экранированная клавиатура K-TEK-M390TP-FN-BL-ML-EMC-DWP&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;kw1S&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;9t4P&quot;&gt;&lt;strong&gt;Альтернативные методики&lt;/strong&gt; перехвата и еще много интересного:&lt;/p&gt;
  &lt;p id=&quot;4jfV&quot;&gt;&lt;a href=&quot;https://web.archive.org/web/20160731194717/https://secu.famillepasini.ch/index.php?page=keyboards.html&quot; target=&quot;_blank&quot;&gt;https://web.archive.org/web/20160731194717/https://secu.famillepasini.ch/index.php?page=keyboards.html&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;vSln&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;8TCT&quot;&gt;&lt;strong&gt;Подпишитесь&lt;/strong&gt; на блог, чтобы узнавать о новых статьях сразу!&lt;/p&gt;
  &lt;p id=&quot;y87J&quot;&gt;&lt;a href=&quot;/@badradio&quot;&gt;Все статьи →&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;18ey&quot;&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;w1aS&quot; data-align=&quot;center&quot;&gt;© Copyright 2025 Badradio. All rights reserved.&lt;br /&gt;Все права защищены. Копирование материалов сайта запрещено.&lt;br /&gt;При цитировании ставить кликабельную ссылку на первоисточник.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>badradio:noise</id><link rel="alternate" type="text/html" href="https://teletype.in/@badradio/noise?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=badradio"></link><title>Жучок ЦРУ SRT-SP: стабилизатор и генератор шума v1.0</title><published>2026-02-13T09:03:50.393Z</published><updated>2026-03-02T16:12:03.844Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/e5/8e/e58e1e7e-a236-468e-aad2-2cba2028433e.png"></media:thumbnail><category term="radiomikrofony" label="Радиомикрофоны"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/04/7a/047ac812-de2d-45d2-97dc-a3e33f44e822.png&quot;&gt;Как и обещал, публикую схему следующей части жучка ЦРУ SRT-SP — стабилизатора напряжения и генератора шума, который применяется для маскировки аудиосигнала.</summary><content type="html">
  &lt;p id=&quot;Wi3U&quot;&gt;Как и обещал, публикую схему следующей части жучка ЦРУ SRT-SP — &lt;strong&gt;стабилизатора напряжения и генератора шума&lt;/strong&gt;, который используется маскиратором аудиосигнала.&lt;/p&gt;
  &lt;p id=&quot;yitk&quot;&gt;Схема &lt;strong&gt;маскиратора&lt;/strong&gt; аудиосигнала: &lt;a href=&quot;https://teletype.in/@badradio/gold&quot; target=&quot;_blank&quot;&gt;https://teletype.in/@badradio/gold&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;0p7J&quot;&gt;Схема &lt;strong&gt;УНЧ с АРУ&lt;/strong&gt; жучка ЦРУ SRT-SP: &lt;a href=&quot;https://teletype.in/@badradio/agc&quot; target=&quot;_blank&quot;&gt;https://teletype.in/@badradio/agc&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;c8IN&quot;&gt;Напоминаю, что последнюю часть — высокочастотную (&lt;a href=&quot;https://cryptomuseum.com/covert/bugs/ec/srs153/srt153.htm&quot; target=&quot;_blank&quot;&gt;фото&lt;/a&gt;) — опубликую тогда, когда будет &lt;strong&gt;20 подписчиков&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;crBQ&quot;&gt;Все схемы нарисованы по фотографиям с сайта &lt;a href=&quot;https://cryptomuseum.com/covert/bugs/ec/sp/index.htm&quot; target=&quot;_blank&quot;&gt;https://cryptomuseum.com/covert/bugs/ec/sp/index.htm&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;DKdp&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/04/7a/047ac812-de2d-45d2-97dc-a3e33f44e822.png&quot; width=&quot;3507&quot; /&gt;
    &lt;figcaption&gt;SRT-SP CIA Bug Voltage Regulator and Noise Generator Schematic Diagram&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;XwQ6&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5a/80/5a807f67-ddac-426b-8373-a7e3d3b91ed3.png&quot; width=&quot;781&quot; /&gt;
    &lt;figcaption&gt;SRT-SP CIA Bug Voltage Regulator and Noise Generator Components Placement&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;X1VE&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;UbGD&quot;&gt;Стабилизатор с коэффициентом стабилизации несколько тысяч собран на транзисторах Q1-Q4 и особенностей не имеет.&lt;/p&gt;
  &lt;p id=&quot;m6xL&quot;&gt;Генератор шума на транзисторах Q5-Q11 представляет из себя просто УНЧ с большим коэффициентом усиления. Обратите внимание, что для повышения экономичности каскады Q5-Q7 и Q8-Q11 соединены по питанию последовательно.&lt;/p&gt;
  &lt;p id=&quot;Caa2&quot;&gt;В отличие от &lt;a href=&quot;https://teletype.in/@badradio/rapid#c9A3&quot; target=&quot;_blank&quot;&gt;рудометовского фейка&lt;/a&gt;, эта схема содержит стабилизатор и развязывающую цепочку R9C3C4, поэтому не самовозбуждается.&lt;/p&gt;
  &lt;p id=&quot;dryL&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Va5G&quot;&gt;&lt;strong&gt;Подпишитесь&lt;/strong&gt; на блог, не дайте фуфлыжникам шанса!&lt;/p&gt;
  &lt;p id=&quot;Ovd0&quot;&gt;&lt;a href=&quot;/@badradio&quot;&gt;Все статьи →&lt;/a&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;tHTE&quot; data-align=&quot;center&quot;&gt;© Copyright 2025 Badradio. All rights reserved.&lt;br /&gt;Все права защищены. Копирование материалов сайта запрещено.&lt;br /&gt;При цитировании ставить кликабельную ссылку на первоисточник.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>badradio:M7142</id><link rel="alternate" type="text/html" href="https://teletype.in/@badradio/M7142?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=badradio"></link><title>На пути к самодельному радиопеленгатору (по мотивам M7142) v1.0</title><published>2026-02-08T22:03:54.980Z</published><updated>2026-02-22T05:27:40.073Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/ae/cc/aeccafe2-5fd3-4b72-a0be-b667592f41ae.png"></media:thumbnail><category term="radiostancii" label="Радиостанции"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/33/72/3372a855-0c4d-4b3c-a2ea-a78f4d3ff122.png&quot;&gt;В этой статье я еще раз покажу, как VRTP препятствует появлению радиолюбительской спецтехники, даже когда речь идет о воплощении самых простых принципов.</summary><content type="html">
  &lt;p id=&quot;HqPf&quot;&gt;В этой статье я еще раз покажу, как VRTP препятствует появлению радиолюбительской спецтехники, даже когда речь идет о воплощении самых простых принципов.&lt;/p&gt;
  &lt;p id=&quot;W0fp&quot;&gt;Речь пойдет о портативном &lt;strong&gt;радиопеленгаторе Micromill M7142&lt;/strong&gt;, и почему у отечественных радиолюбителей до сих пор нет ничего подобного.&lt;/p&gt;
  &lt;p id=&quot;NYeP&quot;&gt;Источник всех фотографий: &lt;a href=&quot;https://cryptomuseum.com/df/micromill/m7142/&quot; target=&quot;_blank&quot;&gt;https://cryptomuseum.com/df/micromill/m7142/&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;PDIB&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/95/a3/95a34208-0db4-47c3-a4e3-3fed0f853390.jpeg&quot; width=&quot;1280&quot; /&gt;
    &lt;figcaption&gt;&lt;strong&gt;Micromill M7142&lt;/strong&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;5jnD&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/79/e5/79e54a05-4a9c-4c1c-91fb-4fc98317834c.png&quot; width=&quot;1182&quot; /&gt;
    &lt;figcaption&gt;&lt;strong&gt;Micromill M7142&lt;/strong&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;ROPE&quot;&gt;&lt;/h2&gt;
  &lt;h2 id=&quot;2BYO&quot;&gt;Теория&lt;/h2&gt;
  &lt;p id=&quot;ZDrD&quot;&gt;&lt;br /&gt;&lt;a href=&quot;https://www.qsl.net/dl4sdc/db0adf/db0adf.html&quot; target=&quot;_blank&quot;&gt;https://www.qsl.net/dl4sdc/db0adf/db0adf.html&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.longdom.org/open-access/dadf-digital-automatic-direction-finder-12801.html&quot; target=&quot;_blank&quot;&gt;https://www.longdom.org/open-access/dadf-digital-automatic-direction-finder-12801.html&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.ramseyelectronics.com/downloads/manuals/DDF1.pdf&quot; target=&quot;_blank&quot;&gt;http://www.ramseyelectronics.com/downloads/manuals/DDF1.pdf&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;cyer&quot;&gt;Две разнесенные в пространстве антенны попеременно подключаются на вход ЧМ приемника (с помощью p-i-n диодов), что эквивалентно изменению фазы несущей, поэтому на выходе появляется напряжение НЧ с частотой переключения. Сравнивая фазы переключающего и демодулированного напряжения НЧ, получаем азимут на передатчик.&lt;/p&gt;
  &lt;p id=&quot;FgQH&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;vPhY&quot;&gt;Устройство Micromill M7142 Radio Direction Finder (RDF)&lt;/h2&gt;
  &lt;p id=&quot;Jh6V&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;pC6E&quot;&gt;Ниже — &lt;strong&gt;коммутатор антенн&lt;/strong&gt; на неизвестных &lt;strong&gt;p-i-n диодах&lt;/strong&gt; из M7142 (маркировка F0D или FOD — возможно, это &lt;strong&gt;HSMP-3820&lt;/strong&gt;, которые маркируются &lt;a href=&quot;https://www.s-manuals.com/smd/f0&quot; target=&quot;_blank&quot;&gt;F0&lt;/a&gt;).&lt;/p&gt;
  &lt;p id=&quot;CbsQ&quot;&gt;Экранированный 50 Ом кабель идет на вход ЧМ приемника:&lt;/p&gt;
  &lt;figure id=&quot;FSOR&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9d/7f/9d7fa30b-124e-4f76-9101-04178c2db149.jpeg&quot; width=&quot;1280&quot; /&gt;
    &lt;figcaption&gt;Коммутатор антенн на pin диодах пеленгатора Micromill M7142&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;EjG4&quot;&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;fo8H&quot;&gt;А вот аналогичная &lt;strong&gt;радиолюбительская схема&lt;/strong&gt; от &lt;strong&gt;N0GSG&lt;/strong&gt; из &lt;strong&gt;CQ 7/2002&lt;/strong&gt; (см. стр. 2, на вид — рабочая):&lt;/p&gt;
    &lt;p id=&quot;bqPF&quot;&gt;&lt;a href=&quot;https://www.n5dux.com/ham/files/pdf/N0GSG%20-%20Portable%20Radio%20Direction%20Finder.pdf&quot; target=&quot;_blank&quot;&gt;https://www.n5dux.com/ham/files/pdf/N0GSG%20-%20Portable%20Radio%20Direction%20Finder.pdf&lt;/a&gt;&lt;/p&gt;
    &lt;p id=&quot;lN3U&quot;&gt;&lt;a href=&quot;https://cq-amateur-radio.com&quot; target=&quot;_blank&quot;&gt;https://cq-amateur-radio.com&lt;/a&gt;&lt;/p&gt;
    &lt;p id=&quot;hgKX&quot;&gt;Применены VHF pin диоды &lt;a href=&quot;https://www.alldatasheet.com/datasheet-pdf/pdf/87544/ONSEMI/MPN3700.html&quot; target=&quot;_blank&quot;&gt;MPN3700&lt;/a&gt; (1 пф) и два микроконтроллера &lt;strong&gt;AT90S1200A&lt;/strong&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;WwZY&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;XUJs&quot;&gt;&lt;strong&gt;Узкополосный ЧМ приемник&lt;/strong&gt; с двумя преобразованиями частоты особенностей не имеет и может быть собран на &lt;a href=&quot;https://vrtp.ru/index.php?showtopic=12548&quot; target=&quot;_blank&quot;&gt;MC3362&lt;/a&gt; (RSSI брать с вывода 10), MC3363, MC13135.&lt;/p&gt;
  &lt;p id=&quot;7sIw&quot;&gt;Частота данного экземпляра фиксированная — 168.360 МГц.&lt;/p&gt;
  &lt;p id=&quot;Xbyf&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;ooit&quot;&gt;&lt;strong&gt;УНЧ&lt;/strong&gt; собран на &lt;strong&gt;LM386N&lt;/strong&gt;.&lt;/p&gt;
  &lt;figure id=&quot;aELo&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/83/92/8392f73f-a204-43c5-a910-c1c59f412f4d.jpeg&quot; width=&quot;1280&quot; /&gt;
    &lt;figcaption&gt;Узкополосный ЧМ приемник с двумя преобразованиями частоты M7142&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;upPP&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;kgYn&quot;&gt;Сердце M7142 — верхняя &lt;strong&gt;плата управления и индикации:&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;jKZt&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;yEmg&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d0/ca/d0cad9c6-6d84-47b0-b17b-63555249a225.jpeg&quot; width=&quot;1280&quot; /&gt;
    &lt;figcaption&gt;Плата управления и индикации M7142. Вид со стороны компонентов.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;JM7p&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/72/d8/72d865e1-fe3c-4703-94fa-26fbec27af11.jpeg&quot; width=&quot;1280&quot; /&gt;
    &lt;figcaption&gt;Плата управления и индикации M7142. Вид со стороны монтажа.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;fEpc&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f8/7e/f87ee4df-69b1-4a46-853c-a15f65bb27de.png&quot; width=&quot;4960&quot; /&gt;
    &lt;figcaption&gt;M7142 Portable Radio Direction Finder (RDF) Schematic Diagram&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;fARv&quot;&gt;&lt;strong&gt;Генератор&lt;/strong&gt; собран на таймере &lt;a href=&quot;https://www.nxp.com/docs/en/data-sheet/ICM7555.pdf&quot; target=&quot;_blank&quot;&gt;ICL7555&lt;/a&gt; (IC1).&lt;/p&gt;
  &lt;p id=&quot;nV2c&quot;&gt;На ОУ IC4A (&lt;a href=&quot;https://www.alldatasheet.com/datasheet-pdf/pdf/1053944/RENESAS/ICL7612.html&quot; target=&quot;_blank&quot;&gt;ICL7612&lt;/a&gt;) собран &lt;strong&gt;синхронный детектор&lt;/strong&gt; по схеме из «Искусства схемотехники» Хоровица и Хилла (начинающим обязательно следует прочитать эту книгу). Прямоугольное напряжение подается с выхода первого D-триггера &lt;a href=&quot;https://www.alldatasheet.com/datasheet-pdf/pdf/17681/PHILIPS/HEF4013.html&quot; target=&quot;_blank&quot;&gt;HEF4013&lt;/a&gt; (вывод 1) через резистор R11.&lt;/p&gt;
  &lt;p id=&quot;A7If&quot;&gt;Пропорциональное разности фаз выпрямленное напряжение с вывода 1 IC4A поступает на &lt;strong&gt;ФНЧ&lt;/strong&gt; (IC4B), RC фильтр R21C21, &lt;strong&gt;буферный УПТ&lt;/strong&gt; на IC21A, и, наконец, на вход &lt;strong&gt;светодиодной шкалы&lt;/strong&gt; IC22 (вывод 5 &lt;a href=&quot;https://www.alldatasheet.com/datasheet-pdf/pdf/8898/NSC/LM3914.html&quot; target=&quot;_blank&quot;&gt;LM3914&lt;/a&gt;), куда также добавляется &lt;strong&gt;опорное напряжение&lt;/strong&gt; с выхода IC21A.&lt;/p&gt;
  &lt;p id=&quot;MNd7&quot;&gt;В то же время с выходов второго D-триггера HEF4013 (выводы 12, 13) через &lt;strong&gt;буферы&lt;/strong&gt; Q2, Q3 &lt;strong&gt;переключающее напряжение&lt;/strong&gt; подается на &lt;strong&gt;pin диоды&lt;/strong&gt; (контакты P3.DR1, P2.DR2, P1.5V).&lt;/p&gt;
  &lt;p id=&quot;FGBL&quot;&gt;Остальные ОУ используются так.&lt;/p&gt;
  &lt;p id=&quot;GYhw&quot;&gt;На первой половинке запаянного с обратной стороны аналога &lt;a href=&quot;https://www.alldatasheet.com/datasheet-pdf/pdf/178325/INTERSIL/ICL7621.html&quot; target=&quot;_blank&quot;&gt;ICL7621&lt;/a&gt; (позиционное обозначение не видно) собран &lt;strong&gt;усилитель-ограничитель&lt;/strong&gt; НЧ сигнала с выхода ЧМ приемника (с диодами D3, D4 и RV2 в обратной связи). C8R7 — вход (контакт P5.AF), R8C9 — выход (контакт P6.AUD1).&lt;/p&gt;
  &lt;p id=&quot;wlBL&quot;&gt;На второй — &lt;strong&gt;BIAS&lt;/strong&gt; для описанного выше синхронного детектора.&lt;/p&gt;
  &lt;p id=&quot;xUS7&quot;&gt;На IC21B собран &lt;strong&gt;повторитель опорного напряжения&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;740T&quot;&gt;&lt;strong&gt;Вертикальная шкала&lt;/strong&gt; отображает уровень &lt;strong&gt;RSSI&lt;/strong&gt;. Задействованы IC41 (ICL7612) и IC42 (LM3914).&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;eCc5&quot;&gt;&lt;strong&gt;Осторожно!&lt;/strong&gt; &lt;strong&gt;Схема&lt;/strong&gt; срисована с фотографий, поэтому &lt;strong&gt;содержит ошибки&lt;/strong&gt; и не полна. Например, неизвестно, куда ведут R49 и C4.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;tP1h&quot;&gt;Напомню, что с &lt;strong&gt;LM3914N&lt;/strong&gt; в индикаторе направления и уровня (RSSI) мы уже &lt;a href=&quot;https://teletype.in/@badradio/r10&quot; target=&quot;_blank&quot;&gt;сталкивались&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;TQuz&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;iEdw&quot;&gt;Как на VRTP полурабочую схему в нерабочую превратили&lt;/h2&gt;
  &lt;p id=&quot;JfaZ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Mqr0&quot;&gt;Во второй любительской схеме (от &lt;strong&gt;WB2HOL&lt;/strong&gt; из &lt;strong&gt;RDF 9/93&lt;/strong&gt;) применяется вполне рабочий (по крайней мере, в симуляции) синхронный детектор на основе CD4066, но ВЧ-часть — полный бред: два выпрямительных НЧ диода 1N4007 с огромной паразитной емкостью не могут заменить p-i-n СВЧ диод:&lt;/p&gt;
  &lt;figure id=&quot;5tAC&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/98/b5/98b56c31-7334-4e65-8c5c-61a32763f150.gif&quot; width=&quot;815&quot; /&gt;
    &lt;figcaption&gt;WB2HOL RDF 9/93 Handheld Direction Finder&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;bPVV&quot;&gt;&lt;a href=&quot;https://vrtp.ru/index.php?showtopic=10699&quot; target=&quot;_blank&quot;&gt;https://vrtp.ru/index.php?showtopic=10699&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;g5Y3&quot;&gt;Первоисточник (домашняя страница WB2HOL): &lt;a href=&quot;https://web.archive.org/web/20100227220951/https://home.att.net/~jleggio/projects/rdf/rdf.htm&quot; target=&quot;_blank&quot;&gt;https://web.archive.org/web/20100227220951/https://home.att.net/~jleggio/projects/rdf/rdf.htm&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Lj4B&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;lxLf&quot;&gt;И вот, &lt;strong&gt;чтобы эту полурабочую схему&lt;/strong&gt; добить, &lt;strong&gt;сделать совершенно нерабочей&lt;/strong&gt;, Werewolf (барабанная дробь)... в качестве приемника применяет &lt;strong&gt;&lt;a href=&quot;https://datasheet4u.com/datasheet-pdf/RF-Monolithics--Inc/RX5000/pdf.php?id=340537&quot; target=&quot;_blank&quot;&gt;RX5000&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;
  &lt;p id=&quot;8I1J&quot;&gt;&lt;a href=&quot;https://vrtp.ru/index.php?showtopic=15027&quot; target=&quot;_blank&quot;&gt;https://vrtp.ru/index.php?showtopic=15027&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;NqWf&quot;&gt;Если кто не знал, то &lt;strong&gt;RX5000 — это AM&lt;/strong&gt; (а не ЧМ) &lt;strong&gt;приемник&lt;/strong&gt;, поэтому схема становится совершенно нерабочей: при изменении фазы ВЧ сигнала напряжение на выходе АМ детектора не меняется!&lt;/p&gt;
  &lt;p id=&quot;K0CO&quot;&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;5ipt&quot;&gt;Многие схемы на VRTP из раздела «Радиопеленгация» сворованы отсюда: &lt;a href=&quot;https://farcircuits.net/Radio%20Direction_Finder%20RDF%20Projects%20Joe%20WB2HOL.pdf&quot; target=&quot;_blank&quot;&gt;https://farcircuits.net/Radio%20Direction_Finder%20RDF%20Projects%20Joe%20WB2HOL.pdf&lt;/a&gt;&lt;/p&gt;
    &lt;p id=&quot;q1f2&quot;&gt;Тоже бред: &lt;a href=&quot;https://vrtp.ru/index.php?showtopic=8960&quot; target=&quot;_blank&quot;&gt;https://vrtp.ru/index.php?showtopic=8960&lt;/a&gt;&lt;/p&gt;
    &lt;p id=&quot;pfzU&quot;&gt;Еще один нерабочий «Индикатор пеленгатор»: &lt;a href=&quot;https://vrtp.ru/index.php?act=categories&amp;CODE=article&amp;article=97&quot; target=&quot;_blank&quot;&gt;https://vrtp.ru/index.php?act=categories&amp;amp;CODE=article&amp;amp;article=97&lt;/a&gt;&lt;/p&gt;
    &lt;p id=&quot;0u3T&quot;&gt;Совсем примитивный «Радиопеленгатор» Алексая Гаврилова из журнала Радио: &lt;a href=&quot;https://vrtp.ru/index.php?act=categories&amp;CODE=article&amp;article=3089&quot; target=&quot;_blank&quot;&gt;https://vrtp.ru/index.php?act=categories&amp;amp;CODE=article&amp;amp;article=3089&lt;/a&gt;&lt;/p&gt;
    &lt;p id=&quot;7OrC&quot;&gt;Четыре страницы пустой болтовни: &lt;a href=&quot;https://web.archive.org/web/20150523072145/https://vrtp.ru/index.php?showtopic=1600&quot; target=&quot;_blank&quot;&gt;https://web.archive.org/web/20150523072145/https://vrtp.ru/index.php?showtopic=1600&lt;/a&gt;&lt;/p&gt;
    &lt;p id=&quot;5UdK&quot;&gt;(Продолжение следует...)&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;EtTf&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;392q&quot;&gt;Некоторые ссылки с VRTP&lt;/h2&gt;
  &lt;p id=&quot;Kmpq&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;GGxR&quot;&gt;&lt;a href=&quot;https://www.qsl.net/ve2emm/pic-projects/doppler3/doppler3-e.html&quot; target=&quot;_blank&quot;&gt;https://www.qsl.net/ve2emm/pic-projects/doppler3/doppler3-e.html&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;x0xc&quot;&gt;&lt;a href=&quot;https://www.ve2ums.ca/chasse/Serge/Transmitter%20Hunting/Doppler/doppler_links.htm&quot; target=&quot;_blank&quot;&gt;https://www.ve2ums.ca/chasse/Serge/Transmitter%20Hunting/Doppler/doppler_links.htm&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;zp8f&quot;&gt;&lt;a href=&quot;https://web.archive.org/web/20180809144930/http://www.silcom.com/~pelican2/PicoDopp/PICODOPP.htm&quot; target=&quot;_blank&quot;&gt;https://web.archive.org/web/20180809144930/http://www.silcom.com/~pelican2/PicoDopp/PICODOPP.htm&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;OlPT&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;1GiS&quot;&gt;Правильный путь&lt;/h2&gt;
  &lt;p id=&quot;VqWk&quot;&gt;&lt;/p&gt;
  &lt;ol id=&quot;cp2Z&quot;&gt;
    &lt;li id=&quot;OKkY&quot;&gt;ВЧ часть от M7142 на pin диодах (можно использовать MPN3700 или советские «переключательные», например, &lt;a href=&quot;https://eandc.ru/catalog/2a515a/&quot; target=&quot;_blank&quot;&gt;2А515&lt;/a&gt;)&lt;/li&gt;
    &lt;li id=&quot;rD00&quot;&gt;Приемник подойдет любой, в том числе готовый, лишь бы он был узкополосный ЧМ&lt;/li&gt;
    &lt;li id=&quot;FSp0&quot;&gt;Коммутатор на таймере 555 и CD4013&lt;/li&gt;
    &lt;li id=&quot;7PfD&quot;&gt;Фазовый компаратор на ваш выбор&lt;/li&gt;
    &lt;li id=&quot;3vtB&quot;&gt;Индикатор — светодиодная шкала на LM3914.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;SRP1&quot;&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;E1kL&quot;&gt;Пусть начинающих не пугает, что в одних схемах используется &lt;strong&gt;фазовый компаратор&lt;/strong&gt;, а в других — &lt;strong&gt;синхронный детектор&lt;/strong&gt;: результат один и тот же.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;K6IB&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;fvtr&quot;&gt;&lt;strong&gt;Подпишитесь&lt;/strong&gt; на блог, не дайте фуфлыжникам шанса!&lt;/p&gt;
  &lt;p id=&quot;ND9o&quot;&gt;&lt;a href=&quot;/@badradio&quot;&gt;Все статьи →&lt;/a&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;KsnA&quot; data-align=&quot;center&quot;&gt;© Copyright 2025 Badradio. All rights reserved.&lt;br /&gt;Все права защищены. Копирование материалов сайта запрещено.&lt;br /&gt;При цитировании ставить кликабельную ссылку на первоисточник.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>badradio:photo</id><link rel="alternate" type="text/html" href="https://teletype.in/@badradio/photo?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=badradio"></link><title>Фото настоящих жучков (2022)</title><published>2026-02-05T11:31:22.582Z</published><updated>2026-02-07T05:42:45.508Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/2a/c3/2ac316ef-2497-4dc7-9d63-4e6c1902cde4.png"></media:thumbnail><category term="radiomikrofony" label="Радиомикрофоны"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/26/5e/265e4b04-e284-4f70-961b-4b6003a78cde.jpeg&quot;&gt;Коллекционирую самые новые и самые интересные фотографии настоящих подслушивающих устройств. Вся информация из открытых источников.</summary><content type="html">
  &lt;p id=&quot;skjT&quot;&gt;Коллекционирую самые новые и самые интересные фотографии настоящих подслушивающих устройств. Вся информация из открытых источников.&lt;/p&gt;
  &lt;blockquote id=&quot;y9sD&quot;&gt;Не так страшен черт, как его малюют&lt;br /&gt;— русская народная поговорка&lt;/blockquote&gt;
  &lt;p id=&quot;mD3O&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;BGBz&quot;&gt;В отличие от &lt;a href=&quot;https://teletype.in/@badradio&quot; target=&quot;_blank&quot;&gt;других страниц&lt;/a&gt; моего блога, на этой нет ничего нового, просто понравившиеся мне фотограии с &lt;a href=&quot;https://teletype.in/@badradio/sitering&quot; target=&quot;_blank&quot;&gt;интересных сайтов&lt;/a&gt; собраны в одном месте.&lt;/p&gt;
  &lt;p id=&quot;NRiz&quot;&gt;Хотя именно этот &lt;strong&gt;фотоальбом спецтехники&lt;/strong&gt; вдохновляет многих людей &lt;a href=&quot;https://teletype.in/@badradio/cia&quot; target=&quot;_blank&quot;&gt;углубиться&lt;/a&gt; в тему, прочитать что-нибудь &lt;a href=&quot;https://teletype.in/@badradio/agc&quot; target=&quot;_blank&quot;&gt;интересное&lt;/a&gt; у меня &lt;a href=&quot;https://teletype.in/@badradio/gold&quot; target=&quot;_blank&quot;&gt;на сайте&lt;/a&gt; и &lt;a href=&quot;https://cryptomuseum.com/covert/bugs/index.htm&quot; target=&quot;_blank&quot;&gt;не только&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;DZ69&quot;&gt;К сожалению, сравнивая современные находки с миниатюрными изделиями 1970-х годов, приходишь к выводу, что самые лучшие образцы в этой фотогалерее отсутствуют, так как не были еще никем обнаружены.&lt;/p&gt;
  &lt;p id=&quot;w1EG&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Ktq9&quot;&gt;Болонья, 2018:&lt;/h2&gt;
  &lt;figure id=&quot;VrQb&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/26/5e/265e4b04-e284-4f70-961b-4b6003a78cde.jpeg&quot; width=&quot;2448&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;XgGp&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/70/74/70745e45-1ffc-48de-870c-71e6b66723f2.jpeg&quot; width=&quot;768&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;3TAJ&quot;&gt;&lt;/h2&gt;
  &lt;h2 id=&quot;2ZjT&quot;&gt;Дижон, 2022:&lt;/h2&gt;
  &lt;figure id=&quot;evS6&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c2/08/c2087230-72f2-47c2-92a2-2724e3516725.jpeg&quot; width=&quot;500&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;YDFG&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3e/a6/3ea669f6-7f61-45bc-9ddb-475589a7902f.jpeg&quot; width=&quot;500&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;C3SJ&quot;&gt;&lt;/h2&gt;
  &lt;h2 id=&quot;dN0C&quot;&gt;Лечче, 2017 (миниатюрный жучок):&lt;/h2&gt;
  &lt;figure id=&quot;RItK&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a6/9e/a69e2ab9-a67d-41ce-bff7-904412d7c801.jpeg&quot; width=&quot;1050&quot; /&gt;
    &lt;figcaption&gt;ABG bug&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;PRvC&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/23/82/23826079-6ff3-417c-96ce-a01e9037d8fa.jpeg&quot; width=&quot;840&quot; /&gt;
    &lt;figcaption&gt;ABG bug&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;h8q8&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Zqie&quot;&gt;Белфаст, 2015&lt;/h2&gt;
  &lt;figure id=&quot;3Gim&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7b/99/7b995de6-ed70-4e35-9cd2-2e7366f3c52d.jpeg&quot; width=&quot;885&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;hN4v&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;ZECH&quot;&gt;Гренобль, 2018:&lt;/h2&gt;
  &lt;figure id=&quot;dKhB&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/51/55/5155a004-c913-4b4e-a914-13b0994f2f30.jpeg&quot; width=&quot;1000&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;wrRk&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b6/7a/b67a6175-fe44-41eb-962e-83810515047a.jpeg&quot; width=&quot;1000&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;9omA&quot;&gt;ATmega128&lt;/p&gt;
  &lt;p id=&quot;6tIV&quot;&gt;&lt;a href=&quot;https://www.analog.com/en/products/adg2188.html&quot; target=&quot;_blank&quot;&gt;AD2188&lt;/a&gt; - I2C Analog Switch Array 8x8&lt;/p&gt;
  &lt;p id=&quot;xXzB&quot;&gt;&lt;a href=&quot;https://www.alldatasheet.com/datasheet-pdf/pdf/19815/PHILIPS/UAA2082.html&quot; target=&quot;_blank&quot;&gt;UAA2082H&lt;/a&gt; - однокристальный приемник до 900 МГц, применялся в пейджерах&lt;/p&gt;
  &lt;p id=&quot;ds8c&quot;&gt;Nitronex (MACOM) &lt;a href=&quot;https://www.mouser.com/datasheet/2/249/NDS-036r2%20NPTB00004A%20datasheet-693285.pdf&quot; target=&quot;_blank&quot;&gt;NPTB00004A&lt;/a&gt; - GaN HEMT транзистор, обеспечивающий выходную мощность до 5 Вт на частотах до 5 ГГц&lt;/p&gt;
  &lt;p id=&quot;vHKj&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;htUE&quot;&gt;Берлин, 2022:&lt;/h2&gt;
  &lt;figure id=&quot;AoQt&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/57/7b/577b3880-19f2-4d12-b29d-1ac203c3481f.jpeg&quot; width=&quot;4032&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;tpdh&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7e/43/7e43911a-8cc6-4b03-92ca-6b3a24053ea6.jpeg&quot; width=&quot;1200&quot; /&gt;
    &lt;figcaption&gt;DESAG Telematic NavKoS T&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;LuXr&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;NYjL&quot;&gt;Греция, 2019&lt;/h2&gt;
  &lt;p id=&quot;B1fj&quot;&gt;Сделан на основе GSM модуля Telit UC864-G (миниатюрность и расширенный температурный диапазон):&lt;/p&gt;
  &lt;figure id=&quot;Nkp2&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a4/46/a446ecf2-8ba0-4e39-b2ec-cc37d13a31c6.jpeg&quot; width=&quot;1322&quot; /&gt;
    &lt;figcaption&gt;Telit UC864-G GSM bug&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;SDcl&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;5qIx&quot;&gt;Афины, 2019 (GPS трэкер)&lt;/h2&gt;
  &lt;figure id=&quot;ooJt&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/19/ce/19ce3571-ca52-463d-962d-2b185f63bf80.jpeg&quot; width=&quot;1440&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;Xyb1&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4a/3d/4a3d1ac2-b3c9-4fc1-9678-85be538c434e.jpeg&quot; width=&quot;1440&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;DdUM&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;bm22&quot;&gt;Фоллоника, 2020:&lt;/h2&gt;
  &lt;figure id=&quot;GrFH&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4a/ef/4aefaf25-b53a-4618-8db3-e89b17c71fa3.jpeg&quot; width=&quot;388&quot; /&gt;
    &lt;figcaption&gt;Follonica GSM bug&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gIdl&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;zaQg&quot;&gt;Источник: &lt;a href=&quot;https://earsandeyes.noblogs.org/downloads/&quot; target=&quot;_blank&quot;&gt;https://earsandeyes.noblogs.org/downloads/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;rfMK&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;k4h0&quot;&gt;Италия, 2022&lt;/h2&gt;
  &lt;figure id=&quot;VtJz&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ef/17/ef17f13e-63eb-4288-b767-a87169b5f64b.jpeg&quot; width=&quot;3000&quot; /&gt;
    &lt;figcaption&gt;VOD&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;cbVq&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/20/e9/20e966eb-b2fb-44cb-b53c-2f94ab007019.jpeg&quot; width=&quot;3000&quot; /&gt;
    &lt;figcaption&gt;WESO&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;S5fv&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9a/93/9a937d99-2f53-42d0-b849-df700e0fbb47.jpeg&quot; width=&quot;3000&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Jkw9&quot;&gt;Источник: &lt;a href=&quot;https://www.reddit.com/r/TSCM/comments/14lizni/the_government_is_spying_me/&quot; target=&quot;_blank&quot;&gt;https://www.reddit.com/r/TSCM/comments/14lizni/the_government_is_spying_me/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;f7pS&quot;&gt;&lt;a href=&quot;https://imgur.com/a/gadget-minecraft-server-w8wGNu9&quot; target=&quot;_blank&quot;&gt;https://imgur.com/a/gadget-minecraft-server-w8wGNu9&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;QbLH&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Mfjs&quot;&gt;Для сравнения — изделие ABU 1974 года (радиомаячок в наручных часах)&lt;/h2&gt;
  &lt;figure id=&quot;R8di&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/da/18/da18bbc2-0096-4100-a492-ae6de9986e17.jpeg&quot; width=&quot;1280&quot; /&gt;
    &lt;figcaption&gt;168.360 MHz&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;prru&quot;&gt;Источник: &lt;a href=&quot;https://cryptomuseum.com/covert/bugs/telefunken/abu/&quot; target=&quot;_blank&quot;&gt;https://cryptomuseum.com/covert/bugs/telefunken/abu/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Vd4V&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;IVAC&quot;&gt;(Продолжение следует)&lt;/p&gt;
  &lt;p id=&quot;dd3V&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;kEz3&quot;&gt;&lt;a href=&quot;/@badradio&quot;&gt;Все статьи →&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>badradio:kt606</id><link rel="alternate" type="text/html" href="https://teletype.in/@badradio/kt606?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=badradio"></link><title>Неправильно указанная мощность в четырехканальной аппаратуре для радиоуправления моделями Чухаленко v1.0</title><published>2026-01-16T15:19:16.610Z</published><updated>2026-02-10T16:00:07.955Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/17/aa/17aad88a-ae30-4aac-a643-78e94d6680f6.png"></media:thumbnail><category term="radiostancii" label="Радиостанции"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/57/d0/57d000d9-c0f3-4b6f-8295-4c1f941b98fc.png&quot;&gt;Источник: «В помощь радиолюбителю». Выпуск 89 (1985). Четырехканальная аппаратура для радиоуправления моделями. А.Берестов, М.Васильченко, С.Чухаленко.</summary><content type="html">
  &lt;p id=&quot;iKUD&quot;&gt;Источник: «&lt;a href=&quot;https://archive.org/details/034_20240525/%D0%92%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%20%D1%80%D0%B0%D0%B4%D0%B8%D0%BE%D0%BB%D1%8E%D0%B1%D0%B8%D1%82%D0%B5%D0%BB%D1%8E%20089/page/n1/mode/2up&quot; target=&quot;_blank&quot;&gt;В помощь радиолюбителю&lt;/a&gt;». Выпуск 89 (1985). Четырехканальная аппаратура для радиоуправления моделями. &lt;strong&gt;А.Берестов, М.Васильченко, С.Чухаленко&lt;/strong&gt;. Тираж 900000 экземпляров.&lt;/p&gt;
  &lt;figure id=&quot;ttmk&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/57/d0/57d000d9-c0f3-4b6f-8295-4c1f941b98fc.png&quot; width=&quot;722&quot; /&gt;
    &lt;figcaption&gt;https://studfile.net/preview/16526372/page:6/&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;MYBf&quot;&gt;Ошибки в схеме передатчика:&lt;/p&gt;
  &lt;ol id=&quot;nUuS&quot;&gt;
    &lt;li id=&quot;WdWT&quot;&gt;Короткое замыкание с коллектора VT1 на землю (спасибо &lt;strong&gt;kelvin phitrow&lt;/strong&gt;, который это заметил; в сборнике ВПР №89 этой ошибки нет).&lt;/li&gt;
    &lt;li id=&quot;DvcY&quot;&gt;Забыли поставить электролит по питанию.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;l35X&quot;&gt;Схема была &lt;strong&gt;скорее вымучена, чем разработана:&lt;/strong&gt;&lt;/p&gt;
  &lt;ol id=&quot;Es39&quot;&gt;
    &lt;li id=&quot;jA0x&quot;&gt;Почему в коллекторе задающего генератора вместо экранированного колебательного контура с подстроечником стоит дроссель?&lt;/li&gt;
    &lt;li id=&quot;chzx&quot;&gt;Почему база КТ606 подключена к коллектору ГТ311Д фактически напрямую, &lt;strong&gt;без цепей согласования&lt;/strong&gt; (не к отводу от контура, например)?&lt;/li&gt;
    &lt;li id=&quot;g7gg&quot;&gt;Вопросы вызывают и входная цепь приемника, и контур гетеродина L4C27...&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;tADt&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ee/03/ee031bd4-b044-446c-9d0b-552dffdcc671.png&quot; width=&quot;1349&quot; /&gt;
    &lt;figcaption&gt;https://studfile.net/preview/16526372/page:6/&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;66AV&quot;&gt;Оптимальны эти узлы или нет, но &lt;strong&gt;и приемник, и передатчик данного комплекта работают&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;erN3&quot;&gt;Мелкие нестыковки:&lt;/p&gt;
  &lt;ol id=&quot;anbp&quot;&gt;
    &lt;li id=&quot;aVh0&quot;&gt;На стр. 10 сказано, что &lt;strong&gt;L1&lt;/strong&gt; должна содержать 15 витков провода 0.8 мм при длине 10 мм. Это невозможно, ведь даже без шага будет 15*0.8=12 мм.&lt;/li&gt;
    &lt;li id=&quot;KEwr&quot;&gt;20 витков того же провода в &lt;strong&gt;L2&lt;/strong&gt; даст 16 мм, а никак не 12 мм.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;RfRC&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;fy9A&quot;&gt;Переделка в CW передатчик на 10 м 1.28 Вт&lt;/h3&gt;
  &lt;p id=&quot;9Kxn&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;wLlw&quot;&gt;Вместо C6 и VT3 поставить телеграфный ключ. VT4, VT5 и все, что правее — не устанавливать.&lt;/p&gt;
  &lt;p id=&quot;mWb0&quot;&gt;Приемник собрать по другой схеме.&lt;/p&gt;
  &lt;p id=&quot;vv2w&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;A8sv&quot;&gt;Переделка в Си-Би радиостанцию с ЧМ (FM) 1.28 Вт&lt;/h3&gt;
  &lt;p id=&quot;2PqJ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;a2YJ&quot;&gt;Не проверял.&lt;/p&gt;
  &lt;p id=&quot;xCLp&quot;&gt;Вместо C6 и VT3 — перемычка. VT4, VT5 и все, что правее — не устанавливать.&lt;/p&gt;
  &lt;p id=&quot;uDoF&quot;&gt;Приемник собрать по другой схеме.&lt;/p&gt;
  &lt;p id=&quot;qouL&quot;&gt;Емкость C1 увеличить, последовательно с C1 включить варикап, подать на варикап постоянное напряжение смещения со стабилизатора. Модулирующее напряжение на варикап подавать через конденсатор 0.1 мкф и дроссель 47 мкГн.&lt;/p&gt;
  &lt;p id=&quot;iDau&quot;&gt;Выходной транзистор VT2 установить на радиатор.&lt;/p&gt;
  &lt;p id=&quot;JLfC&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;rPIj&quot;&gt;Переделка в Си-Би радиостанцию с АМ 1.28 Вт&lt;/h3&gt;
  &lt;p id=&quot;Ekxy&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;80kH&quot;&gt;Если выкинуть VT3 (ГТ403Б) и C6, вместо них включить вторичную обмотку трансформатора (с соотношением числа витков обмоток 1:1), первичную обмотку которого подключить к УНЧ около 5 Вт, получится &lt;strong&gt;рация с качественной АМ &lt;/strong&gt;(не проверял).&lt;/p&gt;
  &lt;p id=&quot;s1yR&quot;&gt;При модуляции напряжение питания передатчика должно изменяться от нескольких вольт до 18В, пиковая мощность будет около 5 Вт.&lt;/p&gt;
  &lt;p id=&quot;EtB2&quot;&gt;КТ907А или КТ606 придется установить на радиатор.&lt;/p&gt;
  &lt;p id=&quot;8Bfl&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;3FuJ&quot;&gt;Испытания&lt;/h2&gt;
  &lt;p id=&quot;Oofn&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;mY6V&quot;&gt;При закороченном ГТ403 мощность настроенного передатчика составила &lt;strong&gt;1.28 Вт&lt;/strong&gt; на нагрузке 50 Ом, потребляемый ток — &lt;strong&gt;360 мА при 9В&lt;/strong&gt;, КПД 40%.&lt;/p&gt;
  &lt;p id=&quot;YaTF&quot;&gt;Такой она была бы для &lt;a href=&quot;#A8sv&quot;&gt;ЧМ (FM)&lt;/a&gt; или &lt;a href=&quot;#fy9A&quot;&gt;CW SSB&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;gGZl&quot;&gt;Но для амплитудной модуляции (АМ) ситуация другая, и &lt;strong&gt;вместо заявленной мощности 600 мВт имеем 225 мВт&lt;/strong&gt; (потребляемый ток 200 мА).&lt;/p&gt;
  &lt;p id=&quot;maQG&quot;&gt;Малограмотные авторы просто измерили среднюю излучаемую мощность, с учетом потерь на ГТ403 как раз получилось 1.2Вт/2 = 600 мВт.&lt;/p&gt;
  &lt;p id=&quot;xX7n&quot;&gt;На самом деле мощность АМ передатчика в 4 раза меньше пиковой: 1.2Вт/4 = &lt;strong&gt;300 мВт&lt;/strong&gt; (при модуляции синусоидальным сигналом и глубине модуляции 100%).&lt;/p&gt;
  &lt;p id=&quot;P4mH&quot;&gt;Если вас это удивляет, пора прочитать &lt;strong&gt;учебник по радиопередающим устройствам&lt;/strong&gt; (&lt;strong&gt;Шахгильдяна&lt;/strong&gt;, например).&lt;/p&gt;
  &lt;p id=&quot;rzQH&quot;&gt;Кто-то может возразить, что в этом передатчике применяется &lt;strong&gt;импульсная модуляция&lt;/strong&gt; (C6 немного сглаживает), значит, мощность должна быть равна средней — 600 мВт.&lt;/p&gt;
  &lt;p id=&quot;R5Cz&quot;&gt;На самом деле при модуляции прямоугольным сигналом полезная мощность еще на 25% меньше, ведь энергия расходуется и на излучение гармоник модулирующей частоты (при 800 Гц — 2.4 кГц, 4 кГц и другие нечетные), которые игнорируются точно настроенным на одну частоту (800 Гц) дешифратором команд в приемнике.&lt;/p&gt;
  &lt;p id=&quot;J2fV&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;mz8f&quot;&gt;Плагиат А.Татаренко&lt;/h2&gt;
  &lt;p id=&quot;fNZ7&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;crTc&quot;&gt;С некоторыми изменениями схема была перепечатана в журнале &lt;strong&gt;Конструктор 4-5/2000 &lt;/strong&gt;(в бозе почивший сателлит «Радиоаматора» с тиражом 1000 экземпляров) под именем &lt;strong&gt;А.Титаренко&lt;/strong&gt;, который на самом деле &lt;a href=&quot;https://teletype.in/@badradio/plagiat#koze&quot; target=&quot;_blank&quot;&gt;Татаренко&lt;/a&gt; (РК 6/2000, стр. 43). &lt;strong&gt;Приведены чертежи печатных плат&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;M0va&quot;&gt;В модификации Татаренко ток потребления передатчика снизился почти в два раза (до 120 мА), во столько же раз &lt;strong&gt;упала и выходная мощность&lt;/strong&gt;; в схему добавлены новые ошибки (неполный список изменений):&lt;/p&gt;
  &lt;ol id=&quot;RimJ&quot;&gt;
    &lt;li id=&quot;eAnt&quot;&gt;Антенна передатчика подключена не через 6800, а через 6.8 пф (&lt;strong&gt;чтоб не работало&lt;/strong&gt;).&lt;/li&gt;
    &lt;li id=&quot;R9Jw&quot;&gt;«Удлиняющая» катушка помещена в экран, чего в заводской аппаратуре не бывает.&lt;/li&gt;
    &lt;li id=&quot;EO9i&quot;&gt;R3 увеличен с 91 Ом до 150 Ом, при этом R3 уменьшен с 6.8 кОм до 2.2 кОм.&lt;/li&gt;
    &lt;li id=&quot;ezcO&quot;&gt;C3 увеличен с 18 до 62 пф.&lt;/li&gt;
    &lt;li id=&quot;KeKs&quot;&gt;Модернизированы схемы стабилизаторов напряжения (КРЕН5).&lt;/li&gt;
    &lt;li id=&quot;YtzM&quot;&gt;В приемнике применены логические элементы и рэле вместо драйверов на VT13-VT18.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;O9xU&quot;&gt;&lt;strong&gt;Титаренко-Татаренко&lt;/strong&gt;, «забывший» упомянуть авторов оригинальной конструкции и &lt;strong&gt;добавивший ошибку в рабочую схему&lt;/strong&gt;, получает свое законное место в &lt;a href=&quot;https://teletype.in/@badradio/plagiat#koze&quot; target=&quot;_blank&quot;&gt;списке плагиаторов&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;DQeq&quot;&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;VGUf&quot;&gt;Также &lt;strong&gt;опасайтесь&lt;/strong&gt; других статей &lt;a href=&quot;https://teletype.in/@badradio/plagiat#koze&quot; target=&quot;_blank&quot;&gt;недоучки&lt;/a&gt; Татаренко, в которых могут скрываться довольно подлые ошибки:&lt;/p&gt;
    &lt;ol id=&quot;RxNJ&quot;&gt;
      &lt;li id=&quot;h9BV&quot;&gt;Усовершенствованная аппаратура радиоуправления моделями (РК 9-10/2000)&lt;/li&gt;
      &lt;li id=&quot;48Dz&quot;&gt;Аппаратура пропорционального управления моделями (РК 5,6,7/2001)&lt;/li&gt;
      &lt;li id=&quot;Kt7J&quot;&gt;Шифратор и дешифратор дистанционного управления (РА 11/2001)&lt;/li&gt;
      &lt;li id=&quot;0lvC&quot;&gt;ДУ — новые возможности старых микросхем (РА 8/2002)&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/section&gt;
  &lt;p id=&quot;CjsC&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Va5G&quot;&gt;&lt;strong&gt;Подпишитесь&lt;/strong&gt; на блог, не дайте фуфлыжникам шанса!&lt;/p&gt;
  &lt;p id=&quot;Ovd0&quot;&gt;&lt;a href=&quot;/@badradio&quot;&gt;Все статьи →&lt;/a&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;vYa1&quot; data-align=&quot;center&quot;&gt;© Copyright 2025 Badradio. All rights reserved.&lt;br /&gt;Все права защищены. Копирование материалов сайта запрещено.&lt;br /&gt;При цитировании ставить кликабельную ссылку на первоисточник.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>badradio:sim900</id><link rel="alternate" type="text/html" href="https://teletype.in/@badradio/sim900?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=badradio"></link><title>Восстановление исходников глючного GSM микрофона на SIM900 и PIC24FJ64GA004 от Tired/STG</title><published>2025-12-30T09:08:27.431Z</published><updated>2026-02-01T10:28:54.483Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/e8/c5/e8c51824-bf8e-44d8-972b-4c0ae400f151.png"></media:thumbnail><category term="radiomikrofony" label="Радиомикрофоны"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/56/06/5606dca1-c924-4707-95b4-c1d1da5af4bd.jpeg&quot;&gt;Прошло 14 лет, исписано 30 страниц форума, но этот код с VRTP так и остался кривым.</summary><content type="html">
  &lt;p id=&quot;IKBC&quot;&gt;Прошло 14 лет, исписано 30 страниц &lt;a href=&quot;#0c6n&quot;&gt;форума&lt;/a&gt;, но этот &lt;a href=&quot;#Matf&quot;&gt;код&lt;/a&gt; с VRTP так и остался кривым.&lt;/p&gt;
  &lt;p id=&quot;rhNP&quot;&gt;Что будет, если не читать книги по программированию &lt;strong&gt;Кнута&lt;/strong&gt;, &lt;strong&gt;Вирта&lt;/strong&gt; и &lt;strong&gt;Дейкстры&lt;/strong&gt;? Результат перед вами. Как говорится в таких случаях, не вздумайте повторять увиденное дома.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;2K0H&quot;&gt;Исходники GSM радиожучков на других модулях: &lt;a href=&quot;https://teletype.in/@badradio/lexi&quot; target=&quot;_blank&quot;&gt;SIM300&lt;/a&gt; (PIC16F648A), &lt;a href=&quot;https://teletype.in/@badradio/treshka&quot; target=&quot;_blank&quot;&gt;SIM800&lt;/a&gt; (PIC12F1822, очень кривой).&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;0c6n&quot;&gt;&lt;strong&gt;Оригинальная статья&lt;/strong&gt; (без исходников, разные версии прошивки):&lt;/p&gt;
  &lt;p id=&quot;lXOp&quot;&gt;&lt;a href=&quot;https://web.archive.org/web/20221208224213/https://vrtp.ru/index.php?showtopic=20314&quot; target=&quot;_blank&quot;&gt;https://web.archive.org/web/20221208224213/https://vrtp.ru/index.php?showtopic=20314&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;pcq8&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/56/06/5606dca1-c924-4707-95b4-c1d1da5af4bd.jpeg&quot; width=&quot;1036&quot; /&gt;
    &lt;figcaption&gt;Схема последней версии. Добавлены дополнительные охранные шлейфы&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;JiQj&quot;&gt;Похабная &lt;a href=&quot;#Matf&quot;&gt;прошивка&lt;/a&gt; от &lt;strong&gt;Tired&lt;/strong&gt; (№844) и &lt;strong&gt;STG&lt;/strong&gt; (№176) имеет классические ошибки безопасности. Прочтите комментарии в &lt;a href=&quot;#jW5Z&quot;&gt;листинге&lt;/a&gt;, чтобы научиться их избегать.&lt;/p&gt;
  &lt;p id=&quot;izQA&quot;&gt;Прекратите повторять конструкции с &lt;strong&gt;закрытым исходным кодом &lt;/strong&gt;или &lt;strong&gt;без расчетов&lt;/strong&gt;. Вы не знаете, какие ошибки, глюки и бэкдоры в них содержатся.&lt;/p&gt;
  &lt;p id=&quot;snL7&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;SRzq&quot;&gt;Вот только &lt;strong&gt;самые грубые косяки&lt;/strong&gt; этого GSM радиомикрофона на SIM900:&lt;/p&gt;
  &lt;ol id=&quot;ebfV&quot;&gt;
    &lt;li id=&quot;Fcjp&quot;&gt;Неправильно разведена печатная плата (уже &lt;a href=&quot;https://teletype.in/@badradio/treshka&quot; target=&quot;_blank&quot;&gt;проходили&lt;/a&gt; в «Трёшке»‬)&lt;/li&gt;
    &lt;li id=&quot;AL8F&quot;&gt;Нет автоматической перезагрузки GSM модуля при потере сети (виснет в течение суток)&lt;/li&gt;
    &lt;li id=&quot;vzQT&quot;&gt;Нет развязки SIM900 по питанию с помощью дросселя (глюки и жужжание)&lt;/li&gt;
    &lt;li id=&quot;TmLB&quot;&gt;Контролирующие шлейфы &lt;strong&gt;входы &lt;/strong&gt;контроллера &lt;strong&gt;не зашунтированы&lt;/strong&gt; конденсаторами (реагирует на любые импульсные помехи, в том числе от себя)&lt;/li&gt;
    &lt;li id=&quot;WGhv&quot;&gt;По достижении BUFSZ (127) символов &lt;strong&gt;буфер перезаписывается&lt;/strong&gt;. Например, подобрав длину SMS (может быть до 160 байт плюс заголовки SIM900) с текстом “RING”, можно заставить устройство подумать, будто идет входящий вызов. Кто раскрутит это до эксплуатируемой уязвимости?&lt;/li&gt;
    &lt;li id=&quot;sS37&quot;&gt;Ответы SIM900 проверяются «приблизительно»: не на равенство, а на &lt;strong&gt;вхождение подстроки&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;k5i4&quot;&gt;Успешность дозвона и отправки SMS не учитывается&lt;/li&gt;
    &lt;li id=&quot;ltWh&quot;&gt;Нестандартные ситуации (отсутствует SIM-карта, удалены номера) не отслеживаются&lt;/li&gt;
    &lt;li id=&quot;LOhZ&quot;&gt;Если ПИН-код неправильный, устройство введет его несколько раз, и &lt;strong&gt;карта заблокируется&lt;/strong&gt;!&lt;/li&gt;
    &lt;li id=&quot;8F3v&quot;&gt;Отсутствует резистор R2 для вывода MCLR контроллера (см. стр. 17 даташита).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;W79y&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;X2Lt&quot;&gt;Кроме того, даже не имея исходников и не зная, что за «шедевр» перед ними, форумчане VRTP выявили следующие &lt;strong&gt;недостатки&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;7V5j&quot;&gt;
    &lt;li id=&quot;RKEv&quot;&gt;При обрыве шлейфа идет звонок за звонком, высаживается батарея&lt;/li&gt;
    &lt;li id=&quot;EI1c&quot;&gt;Владелец никак не узнает про обрыв связи в результате зависания GSM модуля, а это случается регулярно&lt;/li&gt;
    &lt;li id=&quot;Qe46&quot;&gt;Наличие средств на счету не отслеживается&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Enis&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;39eU&quot;&gt;Кстати, &lt;strong&gt;&lt;a href=&quot;#0c6n&quot;&gt;на форуме&lt;/a&gt; VRTP есть множество ценнейших комментариев по конструированию GSM радиомикрофонов&lt;/strong&gt;, но все они были проигнорированы. Лишний раз убеждаешся, что цель VRTP — не помочь и научить, а подставить и обломать.&lt;/p&gt;
  &lt;p id=&quot;mk51&quot;&gt;Примечательно, что среди изученных мною &lt;a href=&quot;#2K0H&quot;&gt;прошивок&lt;/a&gt; &lt;strong&gt;ни в одной не приняты меры против «продвинутого» нарушителя&lt;/strong&gt;, который попытается имитировать садящуюся батарею или выход ее из строя, вызвать ложные срабатывания или зависание устройства. Ничто не позволит &lt;strong&gt;отличить&lt;/strong&gt; &lt;strong&gt;от постороннего вмешательства&lt;/strong&gt;:&lt;/p&gt;
  &lt;ol id=&quot;qWRM&quot;&gt;
    &lt;li id=&quot;1Pvw&quot;&gt;ошибку в прошивке&lt;/li&gt;
    &lt;li id=&quot;UQp3&quot;&gt;отказ GSM модуля&lt;/li&gt;
    &lt;li id=&quot;Zvq4&quot;&gt;неполадки на стороне оператора&lt;/li&gt;
    &lt;li id=&quot;84BY&quot;&gt;случаи медленно и внезапно севшей батареи&lt;/li&gt;
    &lt;li id=&quot;2suR&quot;&gt;неполадки с питанием.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Jr21&quot;&gt;Начинающим следует &lt;strong&gt;изучить несколько схем и прошивок промышленных ОПС&lt;/strong&gt;, прежде чем изобретать свой велосипед. Чтение руководства по микроконтроллеру, даташитов, аппнот и доступного открытого кода — обязательно.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;qSZQ&quot;&gt;Осторожно! В листинге еще масса несоответствий (использование &lt;strong&gt;naken_util&lt;/strong&gt; не позволяет пока получить идентичный hex-файл, в отличие от &lt;a href=&quot;#2K0H&quot;&gt;других прошивок&lt;/a&gt;, дизассемблированных с помощью &lt;strong&gt;gpdasm&lt;/strong&gt;), проверяйте все вызывающие подозрение места. Некоторые участки дизассемблер &lt;a href=&quot;https://github.com/mikeakohn/naken_asm&quot; target=&quot;_blank&quot;&gt;naken_util&lt;/a&gt; дизассемблировать не смог.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;Matf&quot;&gt;Оригинальный исходник написан на Си.&lt;/p&gt;
  &lt;nav&gt;
    &lt;ul&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#jW5Z&quot;&gt;mic.asm (первая версия прошивки)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#g7NU&quot;&gt;uart.asm (последовательный порт)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#S3Fb&quot;&gt;macro.asm (макросы)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#hjyz&quot;&gt;utils.asm (очистка буфера, задержки, поиск подстроки)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#26M6&quot;&gt;at.asm (строки AT-команд)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#aPpq&quot;&gt;atoi.asm (преобразование строки в число)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#rCnD&quot;&gt;naken.asm (исправление ошибок дизассемблера и макросы-сокращения)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#yGXB&quot;&gt;PIC24FJ64GA004.inc (минималистический включаемый файл)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#tRLC&quot;&gt;idata.asm (инициализация переменных)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#iCyh&quot;&gt;ivt.asm (таблица векторов прерываний)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#umeI&quot;&gt;idata2.asm (инициализированные данные)&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/nav&gt;
  &lt;h3 id=&quot;jW5Z&quot;&gt;mic.asm (первая версия прошивки)&lt;/h3&gt;
  &lt;pre id=&quot;qH9q&quot;&gt;; Disassembler: naken_util - by Michael Kohn
;                 Joe Davisson
;     Web: https://www.mikekohn.net/
;   Email: mike@mikekohn.net
;
; Version: May 25, 2025
;
; Loaded mic.hex of type hex / dspic from 0x0000 to 0x157ff
; Type help for a list of commands.
;
; Addr    Opcode     Instruction                              Cycles
; ------- ---------- ----------------------------------       ------

; Compilation:
; naken_asm -o mic_recompiled.hex -type hex mic.asm
; Также см. https://www.watelectronics.com/sim900-module/


; PIC24FJ64GA004
.PIC24


;===============================================================================


#define                 TRUE    1
#define                 FALSE   0
; смещение номера в ответе на AT+CLCC
#define CLCC_PHONE_OFFSET 18
; число символов в телефонном номере
#define PHONE_LEN 39
BUFSZ                   equ     127

; получить адрес переменной в Linear Data Memory
LINEAR_DATA_MEMORY      equ     0x8000
#define LDM(var)        #(var) + LINEAR_DATA_MEMORY

; alternate interrupt vector table (59)
ALTIVT_START            equ     0x0104

; маска для AND
#define MASK(bit)       (1 &amp;lt;&amp;lt; (bit))

; если операнд - байт
#define HIREG(reg)      (reg + 1)
#define HIBIT(bit)      (bit - 8)
#define HIMASK(bit)     MASK(HIBIT(bit))


#include &amp;quot;PIC24FJ64GA004.inc&amp;quot;


;===============================================================================
; DATA address definitions

buffer  equ 0x0c11              ; принятый ответ на AT-команду
;after  equ 0x0c90              ; первый байт после буфера

phone1  equ 0x1157              ; номера из записной книги SIM
phone2  equ 0x117f
phone3  equ 0x11a7

callee  equ 0x11cf              ; номер звонящего абонента
;cafter equ 0x11f6              ; первый байт после номера

active1 equ 0x11f8              ; флаги наличия номеров в записной книге SIM
active2 equ 0x11fa
active3 equ 0x11fc
unknown equ 0x11fe

state   equ 0x1202              ; конечный автомат
#define STATE_RESET 4
#define STATE_GSMON 5
#define STATE_PIN_OK 6

bufptr  equ 0x1208              ; индекс свободного байта в буфере

tm4h    equ 0x121C              ; ограничитель времени звонка?

var_a   equ 0x1230              ; ? - только чтение

lowbat  equ 0x1232              ; батарея разряжена
pollcnt equ 0x1234              ; ? - только запись

calling equ 0x1236              ; активен звонок

alert   equ 0x1238              ; шлейф сигнализации в обрыве
charged equ 0x123a              ; аккумулятор полностью заряжен
lbsent  equ 0x123c              ; сообщение о разрядившейся батарее отправлено

temp    equ 0x123e              ; временная переменная для многих операций

STKPTR  equ 0x27f0              ; стек

; indirect
i       equ 20
j       equ 14
k       equ 16
m       equ 10
pbk     equ 18                  ; прочитанный из записной книги номер
cbcpos  equ 12
search_result   equ 6           ; номер позвонившего обнаружен на SIM?
callee_offset   equ 8

;===============================================================================
; PINS usage definitions

LED_PORT            equ PORTB       ; светодиод
LED                 equ RB2

MIC_PORT            equ PORTB       ; управление чувствительностью микрофона
MICLEVEL            equ RB0

SENSOR_PORT         equ PORTB       ; шлейф сигнализации
SENSOR              equ RB8

CHARGE_PORT         equ PORTC       ; контроллер заряда
CHARGE              equ RC1

PWRKEY_PORT         equ PORTC       ; кнопка включения SIM900
PWRKEY              equ RC9         ; pin 1 of SIM900, pin 5 of PIC

STATUS_PORT         equ PORTB       ; SIM900 STATUS
STATUS              equ RB14

; PIC   - SIM900
; 2 RC6 - 10 RXD
; 3 RC7 - 9 TXD

DTR_PORT            equ PORTC       ; SIM900 DTR
DTR                 equ RC8         ; pin 3 of SIM900, pin 4 of PIC


#include &amp;quot;macro.asm&amp;quot;


.org 0


    goto main


; таблица векторов прерываний
#include &amp;quot;ivt.asm&amp;quot;


.org 0x200


main:
    mov #temp, w15

    ; стек
    mov #STKPTR, w0
    mov w0, SPLIM

    nop
    rcall setup1

    ; инициализированные переменные
    invoke2(intialize, #initialized_data, #0)

    ; ?
    mov #0, w0
    cp0 w0
    bra z, skip

    call 0

skip:
    call start
    sleep_
    reset


setup1:
    .scope

    ; Program Space Visibility in Data Space Enable bit:
    ; Program space is not visible in data space
    bclr CORCON, #PSV

    ; 8 trap vectors + interrupt vectors
    mov #(2 * (8 + 14) + ALTIVT_START), w0
    cp0 w0
    bra z, done

    mov #0, w0
    mov w0, PSVPAG

    ; Program space is visible in data space
    bset CORCON, #PSV

done:
    return
    .ends

#include &amp;quot;idata.asm&amp;quot;
#include &amp;quot;at.asm&amp;quot;


start:
    lnk #0x00

    ; A/D PORT CONFIGURATION REGISTER (199)
    setm w0
    mov w0, AD1PCFG

    ; Peripheral Output Function is Assigned to RP22 Output Pin bits (123)
    bset RPOR11, #0
    bset RPOR11, #1

    bclr RPOR11, #2
    bclr RPOR11, #3
    bclr RPOR11, #4

    ; Assign UART1 Receive (U1RX) to the Corresponding RPn Pin bits
    bset RPINR18, #0
    bset RPINR18, #1
    bset RPINR18, #2
    ; U1RXR3
    bclr RPINR18, #3
    bset RPINR18, #4

    ; TON: Timery On bit - 1 = Starts 16-bit Timery
    ; Timery Input Clock Prescale Select bits: 11 = 1:256
    mov #(TON | TCKPS1 | TCKPS0), w0
    mov w0, T4CON

    ; период таймера 4
    movlf(15200, PR4)

    mov #(TON | TCKPS1 | TCKPS0), w0
    mov w0, T3CON

    ; период таймера 3
    movlf(760, PR3)

    bclr IFS1, #T4IF
    ; T4IE: Timer4 Interrupt Enable bit
    bset IEC1, #T4IE

    movlf(STATE_RESET, state)

    delay(#1000)

    bclr TRISB, #TRISB2
    ; Change Notice 4 Pull-Up Enable
    bset CNPU1, #CN4PUE

loop:
    rcall SIM900_power
    rcall function_sim900_init
    rcall function_register
    bra loop


#include &amp;quot;atoi.asm&amp;quot;


interrupt_timer3:               ; 0x05f8
    .scope
    push.d w0
    push w2
    push PSVPAG
    mov #0, w0
    mov w0, PSVPAG
    lnk #0

    bclr IFS0, #T3IF            ; прерывание обработано

    IFNE(calling, TRUE, exit)   ; если соединение не активно, выход
    IBLINK
exit:

    ulnk
    pop PSVPAG
    pop w2
    pop.d w0
    retfie
    .ends


interrupt_timer4:
    .scope
    push.d w0
    push w2
    push PSVPAG
    mov #0, w0
    mov w0, PSVPAG
    lnk #0x00

    bclr IFS1, #T4IF            ; прерывание обработано

    ; увеличение счетчика времени в tm4h:initialized_data
    inc16(tm4h, initialized_data)

    IFNE(var_a, TRUE, exit)     ; мигаем, если var_a не ноль
    IBLINK
exit:

    ulnk
    pop PSVPAG
    pop w2
    pop.d w0
    retfie
    .ends


#include &amp;quot;utils.asm&amp;quot;
#include &amp;quot;uart.asm&amp;quot;


; кнопка включения модуля SIM900
SIM900_power:
    .scope
    lnk #0x00

    IFNE(state, STATE_RESET, exit)

    delay(#400)

    bclr TRISC, #TRISC9
    bclr PWRKEY_PORT, #PWRKEY

    delay(#2000)

    bset PWRKEY_PORT, #PWRKEY
    bset TRISB, #TRISB14

wait:                           ; ожидание SIM900 STATUS (66)
    mov.b HIREG(STATUS_PORT), wreg
    and.b #HIMASK(STATUS), w0
    CP0_W0
    bra z, wait

    rcall setup_uart

    movlf(STATE_GSMON, state)

exit:
    ulnk
    return
    .ends


function_sim900_init:
    .scope
    lnk #0x02

    IFNE(state, STATE_GSMON, exit)

    movlf(0, lbsent)

loop:
    ATCMD(at)                  ; отправляем &amp;quot;AT&amp;quot;

    blink                       ; мигаем
    blink

    unless_buffer_contains(ok + 1, retry)
    rcall clear_buffer
    bra autobauded              ; ответ содержит &amp;quot;OK&amp;quot;

retry:
    ATCMD(at)

    blink
    blink
    blink
    blink

    unless_buffer_contains(ok + 1, more)
    rcall clear_buffer
    bra autobauded

more:
    ATCMD(at)

    delay(#250)
    led_off
    delay(#250)
    blink
    blink
    blink
    blink
    blink
    blink
    blink

    unless_buffer_contains(ok + 1, loop)
    rcall clear_buffer

autobauded:                     ; получен &amp;quot;OK&amp;quot;
    clr w0
    mov w0, [w14]

repeat_pin:
    ATCMD(at_cpin)             ; нужен ли SIM PIN?

    blink
    blink

    if_buffer_contains(cpin_sim_pin + 1, pin_ready_or_sim_pin)
    unless_buffer_contains(cpin_ready, repeat_pin)

pin_ready_or_sim_pin:
    unless_buffer_contains(cpin_sim_pin + 1, enter_pin)

    movlo(TRUE, 0)              ; требуется ввод пин-кода

enter_pin:
    rcall clear_buffer

    mov #TRUE, w0               ; установлен пин-код?
    subr w0, [w14], [w15]
    bra z, repeat_enter_pin
    bra pin_accepted_or_no_pin

    ; если пин-код неправильный, зачем вводить его снова?
    ; SIM-карта будет заблокирована!
repeat_enter_pin:
    ATCMD0(at_cpin_2000 + 1)     ; вводим пин-код &amp;quot;2000&amp;quot;
    rcall clear_buffer
    delay(#1000)
    if_buffer_contains(ok + 1, pin_accepted_or_no_pin)
    bra repeat_enter_pin

pin_accepted_or_no_pin:         ; пин-код принят
    movlf(STATE_PIN_OK, state)

exit:
    ulnk
    return
    .ends


function_register:
    lnk #0x16

    IFNE(state, STATE_PIN_OK, wrong_state)

    ; ожидание регистрации в сети
registration_loop:
    ATCMD(at_creg)
    blink
    unless_buffer_contains(creg_01 + 1, registration_loop)

    delay(#500)

    ; чтение трех номеров из телефонной книги SIM карты

    rcall clear_buffer

    movlf(FALSE, active1)
    movlf(FALSE, active2)
    movlf(FALSE, active3)

    ATCMD0(at_cpbs_sm)
    delay(#2000)

    read_parse_phonebook(at_cpbr_1 + 1, phone1, active1)
    read_parse_phonebook(at_cpbr_2, phone2, active2)
    read_parse_phonebook(at_cpbr_3, phone3, active3)

    ATCMD0(at_cmgf_1)            ; переключаем SIM900 в текстовый режим

    led_on                      ; мигаем
    delay(#2000)
    led_off
    delay(#2000)

    ; пин MICLEVEL управляет выбором чувствительности микрофона
    mov.b MIC_PORT, wreg
    and.b w0, #MASK(MICLEVEL), w0
    CP0_W0
    bra nz, mic_sensitivity_high

    ATCMD0(at_cmic00)            ; установить низкую чувствительность микрофона

mic_sensitivity_high:
    mov.b MIC_PORT, wreg
    and.b w0, #MASK(MICLEVEL), w0
    CP0_W0
    bra z, mic_sensitivity_low

    ATCMD0(at_cmic015)           ; установить высокую чувствительность микрофона

mic_sensitivity_low:

    ; отправка SMS по каждому номеру
    ; успешность отправки SMS не проверяется!

    IFNE(active1, TRUE, skip_number1_sms_ready)
    delay(#1000)
    SEND_SMS(#phone1, Ready + 1, i)

skip_number1_sms_ready:
    IFNE(active2, TRUE, skip_number2_sms_ready)
    delay(#5000)
    SEND_SMS(#phone2, Ready + 1, i)

skip_number2_sms_ready:
    IFNE(active3, TRUE, skip_number3_sms_ready)
    delay(#5000)
    SEND_SMS(#phone3, Ready + 1, i)

skip_number3_sms_ready:
    delay(#1000)

    bclr IFS1, #CNIF            ; Change Notice Interrupt Flag

    mov #HIREG(IPC4), w1        ; INTERRUPT PRIORITY CONTROL REGISTER 4
    mov.b [w1], w1
    mov_w0(0x8f)                ; clear CNIP&amp;lt;2:0&amp;gt;
    and.b w1, w0, w0
    mov_w1(0x40)                ; set CNIP&amp;lt;2:0&amp;gt; to 100 - priority 4? (82)
    ior.b w0, w1, w0
    mov.b wreg, HIREG(IPC4)

    bset IEC1, #T1IE            ; Timer1 Interrupt Enable bit
    bset CNEN2, #CN22IE
    bset CNEN1, #CN8IE
    bset CNPU1, #CN8PUE

    movlf(FALSE, lowbat)
    movlf(2, pollcnt)

    delay(#1000)

    for (k, repeat, repeat)
    ; k++
    inco(w14, k)

    mov [w14+k], w0
    sub w0, #20, [w15]
    bra le, local11

    movlo(0, k)

    ; получить заряд батареи
    ATCMD(at_cbc + 1)
    delay(#500)

    ; проверяем наличие чего-то, похожего на ответ
    unless_buffer_contains(cbc, skip_sms_lowbat)

    ; позиция &amp;quot;ответа&amp;quot;
    invoke_strnpos(cbc)
    mov.b w0, [w14+cbcpos]

    ; преобразуем строку в число
    get_digit(14, w2)
    get_digit(13, w5)
    get_digit(12, w4)
    get_digit(11, w0)
    mov.b w2, w3
    mov.b w5, w2
    mov.b w4, w1
    rcall function_atoi

    ; напряжение 3.5В
    ; temp = 3500 - atoi(cbcpos + 11)
    mov w0, w1
    mov #3500, w0
    sub w1, w0, [w15]
    bra gtu, more3_5V

    movlf(TRUE, lowbat)

    mov lbsent, w0
    sub w0, #1, [w15]
    bra gtu, skip_sms_lowbat

    incf(lbsent)

    IFNE(active1, TRUE, skip_number1_sms_lowbat)
    SEND_SMS(#phone1, Low_battery, i)

skip_number1_sms_lowbat:
    IFNE(active2, TRUE, skip_number2_sms_lowbat)
    delay(#5000)
    SEND_SMS(#phone2, Low_battery, i)

skip_number2_sms_lowbat:
    IFNE(active3, TRUE, skip_number3_sms_lowbat)
    delay(#5000)
    SEND_SMS(#phone3, Low_battery, i)

skip_number3_sms_lowbat:
    delay(#1000)
    bra skip_sms_lowbat

more3_5V:
    movlf(FALSE, lowbat)

skip_sms_lowbat:
    rcall clear_buffer

local11:
    delay(#380)
    delay(#380)

    incf(pollcnt)

    delay(#380)
    delay(#380)
    delay(#380)

    led_on

    delay(#380)
    delay(#380)

    led_off

    ; входящий звонок?
    unless_buffer_contains(ring, local4)

    ; определить номер
    ATCMD(at_clcc + 1)

    delay(#380)
    delay(#380)
    delay(#380)
    delay(#380)
    delay(#380)

    for(m, local1, local2)
        erase(callee, m)
    endfor(m, PHONE_LEN, local1, local2)

    ; ошибка: даже если номер не определен,
    ; сравнение выполняется
    unless_buffer_contains(clcc + 1, check_phone)

    invoke_strnpos(clcc + 1)

    ; callee_offset = strnpos(clcc) + CLCC_PHONE_OFFSET
    ze w0, w0
    add w0, #CLCC_PHONE_OFFSET, w0
    mov w0, [w14+callee_offset]
    ; m = 0
    movlo(0, m)
    bra local3

local5:
    ; buffer[callee_offset + m] == &amp;#x27;&amp;quot;&amp;#x27;?
    mov [w14+callee_offset], w1
    mov [w14+m], w0
    add w1, w0, w1
    mov #buffer, w0
    add w1, w0, w0
    mov.b [w0], w1
    mov_w0(&amp;#x27;&amp;quot;&amp;#x27;)
    sub.b w1, w0, [w15]
    ; закрывающая кавычка
    bra z, check_phone

    ; копируем номер звонящего:
    ; callee[m] = buffer[callee_offset + m]
    mov [w14+m], w2
    mov [w14+callee_offset], w1
    mov [w14+m], w0
    add w1, w0, w1
    mov #buffer, w0
    add w1, w0, w0
    mov.b [w0], w1
    mov #callee, w0
    add w2, w0, w0
    mov.b w1, [w0]

    endfor(m, PHONE_LEN, local3, local5)

check_phone:
    ; звонит владелец?

    ; search_result = FALSE
    movlo(FALSE, search_result)

    ; 1. если сигнатура CLCC не обнаружена, в callee будет номер предыдущего звонка
    ; (почти всегда номер хозяина)
    ; 2. то же при пустом номере &amp;quot;&amp;quot; (запрет определения номера)

    check_number(active1, phone1)
    check_number(active2, phone2)
    check_number(active3, phone3)

    mov [w14+search_result], w0
    sub w0, #TRUE, [w15]
    bra nz, drop_call

    ; поднять трубку
    ATCMD(ata)

    mul.uu w0, #0, w0
    mov w0, initialized_data
    mov w1, tm4h
    bclr IFS0, #T3IF
    bset IEC0, #T3IE

    movlf(TRUE, calling)

    bra local4

drop_call:
    ; сбросить звонок
    ATCMD0(ath)

local4:
    ; tm4h:initialized_data &amp;lt; 0xf00?
    mov initialized_data, w2
    mov tm4h, w3
    mov #15, w0
    mov #0, w1
    sub w2, w0, [w15]
    subb w3, w1, [w15]
    bra leu, not_calling

    IFNE(calling, TRUE, not_calling)

    mov.b MIC_PORT, wreg
    and.b w0, #MASK(MICLEVEL), w0
    CP0_W0
    bra nz, not_calling

    ; повесить трубку
    ATCMD(ath)

    ; сбросить флаг активного звонка
    movlf(0, calling)

    bclr IFS0, #T3IF
    bclr IEC0, #T3IE

not_calling:
    ; нет связи?
    unless_buffer_contains(no_carrier, local7)
    rcall clear_buffer

    bclr IFS0, #T3IF
    bclr IEC0, #T3IE

    ; сбросить флаг активного звонка
    movlf(0, calling)

local7:
    unless_buffer_contains(ath2 + 1, check_alert)
    rcall clear_buffer

    bclr IFS0, #T3IF
    bclr IEC0, #T3IE

    ; сбросить флаг активного звонка
    movlf(0, calling)

check_alert:
    IFNE(alert, TRUE, dont_call)

    ; сбрасываем флаг тревоги
    movlf(0, alert)

    IFNE(active1, TRUE, number1_inactive)

    ; звоним по первому номеру
    CALL(phone1, 4)
    bra call_done

number1_inactive:
    IFNE(active2, TRUE, number2_inactive)

    delay(#5000)
    CALL(phone2, 2)
    bra call_done

number2_inactive:
    IFNE(active3, TRUE, call_done)

    delay(#5000)

    ; звоним по третьему номеру
    CALL(phone3, 0)

call_done:
    delay(#1000)

dont_call:
    IFNE(charged, TRUE, repeat)

    movlf(0, charged)

    IFNE(active1, TRUE, sms_number1_inactive)
    SEND_SMS(#phone1, High_battery + 1, j)

sms_number1_inactive:
    IFNE(active2, TRUE, sms_number2_inactive)
    delay(#5000)
    SEND_SMS(#phone2, High_battery + 1, j)

sms_number2_inactive:
    IFNE(active3, TRUE, sms_number3_inactive)
    delay(#5000)
    SEND_SMS(#phone3, High_battery + 1, j)

sms_number3_inactive:
    delay(#1000)
    bra repeat

wrong_state:
    ulnk
    return


#include &amp;quot;itoa_digit.asm&amp;quot;


; прерывание от охранного шлейфа
interrupt_sensor:
    .scope
    push RCOUNT
    push.d w0
    push.d w2
    push.d w4
    push.d w6
    push PSVPAG

    mov #0, w0
    mov w0, PSVPAG

    lnk #0x00

    ; Input Change Notification Interrupt Flag Status bit
    bclr IFS1, #CNIF

    ; контроль охранного шлейфа сигнализации
    mov.b HIREG(SENSOR_PORT), wreg
    and.b w0, #HIMASK(SENSOR), w0
    CP0_W0
    bra z, sensor_ok

    ; за это время можно и успеть восстановить шлейф (быстро войти и закрыть дверь)
    delay(#600)

    mov.b HIREG(SENSOR_PORT), wreg
    and.b w0, #HIMASK(SENSOR), w0
    CP0_W0
    bra z, sensor_ok

    ; тревога!
    movlf(TRUE, alert)

sensor_ok:

    ; аккумулятор полностью заряжен?
    mov.b CHARGE_PORT, wreg
    and.b w0, #CHARGE, w0
    CP0_W0
    bra nz, exit

    delay(#600)

    mov.b CHARGE_PORT, wreg
    and.b w0, #CHARGE, w0
    CP0_W0
    bra nz, exit

    ; аккумулятор заряжен
    movlf(TRUE, charged)

exit:
    ulnk
    pop PSVPAG
    pop.d w6
    pop.d w4
    pop.d w2
    pop.d w0
    pop RCOUNT
    retfie
    .ends

initialized_data:

; инициализированные данные
#include &amp;quot;idata2.asm&amp;quot;

; все неиспользуемые прерывания
interrupt_reset:
    reset
&lt;/pre&gt;
  &lt;p id=&quot;aqYA&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;g7NU&quot;&gt;uart.asm (последовательный порт)&lt;/h3&gt;
  &lt;pre id=&quot;lV2V&quot;&gt;; антипаттерн работы с последовательным портом
interrupt_uart:                 ; оригинальный адрес 0x0748
    .scope

    push.d w0
    push PSVPAG
    mov #0, w0
    mov w0, PSVPAG
    lnk #0x02

    ; прерывание обработано
    ; бит нужно сбрасывать в конце обработчика, а не в начале
    ; https://www.joelw.id.au/PicMcuTips
    bclr IFS0, #U1RXIF

    ; этот цикл - источник зависаний
    ; не проверяются FERR, PERR, OERR
wait:
    mov.b U1STA, wreg
    ; Receive buffer has data; at least one more character can be read
    and.b w0, #MASK(URXDA), w0
    CP0_W0
    bra z, wait

    ; принятый байт (а в буфере USART могут быть еще)
    mov U1RXREG, w0

    ; временно сохраняем
    mov.b w0, [w14]

    ; buffer[bufptr++] = c
    mov bufptr, w1
    mov #buffer, w0
    add w1, w0, w0
    mov.b [w14], [w0]

    incf(bufptr)

    ; буфер не заполнен?
    IFNE2(bufptr, BUFSZ, end)

    ; первые байты перезаписываются новыми,
    ; что может привести к интересным уязвимостям
    movlf(0, bufptr)

end:
    ulnk
    pop PSVPAG
    pop.d w0
    retfie
    .ends

transmit_char:
    lnk #0x02
    mov.b w0, [w14]

    mov.b U1STA + 1, wreg
    and.b w0, #2, w0
    CP0_W0
    bra nz, $-6

    se [w14], w0
    mov w0, U1TXREG

    ulnk
    return

setup_uart:
    lnk #0x00

    movlf(103, U1BRG)           ; Baud Rate Generator Prescaler Register (160)
    movlf(0, U1MODE)
    bset U1MODE, #BRGH
    bset U1MODE, #UARTEN        ; UARTx Enable bit (162)

    ; URXISEL = 0
    ; Interrupt is set when any character is received and transferred from the
    ; RSR to the receive buffer;
    ; receive buffer has one or more characters (164)
    movlf(0, U1STA)

    ; Transmit is enabled, UxTX pin is controlled by UARTx (164)
    bset U1STA, #UTXEN
    bclr IFS0, #U1RXIF

    bset IEC0, #T4IE            ; разрешить прерывания от таймера 4

    ulnk
    return

transmit_at_command:
    .scope
    lnk #0x02
    mov w0, [w14]
    bra loop

next_char:
    mov.b U1STA + 1, wreg
    and.b w0, #2, w0
    CP0_W0
    bra nz, next_char
    mov [w14], w0
    mov.b [w0], w0
    se w0, w0
    mov w0, U1TXREG
    inc [w14], [w14]

loop:
    mov [w14], w0
    mov.b [w0], w0
    CP0_W0
    bra nz, next_char

    ulnk
    return
    .ends
&lt;/pre&gt;
  &lt;p id=&quot;wnN9&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;S3Fb&quot;&gt;macro.asm (макросы)&lt;/h3&gt;
  &lt;pre id=&quot;AmA8&quot;&gt;;===============================================================================
; Макросы

#include &amp;quot;naken.asm&amp;quot;

.macro for(var, label_start, label_next)
    movlo(0, var)
    bra label_start
label_next:
.endm

.macro endfor(var, limit, label_start, label_next)
    inco(w14, var)
label_start:
    .if var == 0
        mov #limit, w0
        subr w0, [w14], [w15]
    .else
        mov [w14+var], w1
        mov #limit, w0
        sub w1, w0, [w15]
    .endif
    bra le, label_next
.endm

; for до конца строки
.macro endforc(buf, pos, label_start, label_next)
    inco(w14, pos)
label_start:
    getc(buf, pos)
    add.b w0, #1, [w15]
    bra nz, label_next
.endm

.macro endforc2(buf, pos, limit, label_start, label_next)
    inco(w14, pos)
label_start:
    getc(buf, pos)
    add.b w0, #1, [w15]
    bra z, break
    IFLEO(w14, pos, limit, label_next)
break:
.endm

.macro inc16(high, low)
    mov low, w0
    mov high, w1
    add w0, #1, w0
    addc w1, #0, w1
    mov w0, low
    mov w1, high
.endm

.macro erase(buf, var)
    movor(w14, var, w1)
    mov #buf, w0
    add w1, w0, w1
    ; 0xff
    setm.b w0
    mov.b w0, [w1]
.endm

; reg = base[pos]
.macro getc_(base, pos, reg)
    movor(w14, pos, w1)
    mov base, w0
    add w1, w0, w0
    mov.b [w0], reg
.endm

; w0 = base[pos]
.macro getc(base, pos)
    getc_(base, pos, w0)
.endm

.macro delay(n)
    mov n, w0
    rcall function_delay
.endm

; отправить AT-команду без предварительной очистки буфера ответа
.macro ATCMD0(cmd)
    mov LDM(cmd), w0
    rcall transmit_at_command
.endm

.macro ATCMD(cmd)
    rcall clear_buffer
    ATCMD0(cmd)
.endm

; отправить символ
.macro SEND(char)
    mov_w0(char)
    rcall transmit_char
.endm

.macro SEND_SMS(number, text, ii)
.scope
    ; AT+CMGS=&amp;quot;recipient_number&amp;quot;
    ATCMD0(at_cmgs + 1)

    for(ii, start, next)
        getc(number, ii)
        rcall transmit_char
    endforc(number, ii, start, next)

    ATCMD0(Ready - 1)
    SEND(&amp;#x27;\r&amp;#x27;)
    SEND(&amp;#x27;\n&amp;#x27;)

    delay(#1000)

    ATCMD0(text)

    ; ^Z - символ конца сообщения
    SEND(0x1a)
.ends
.endm

.macro led_on
    bset LED_PORT, #LED
.endm

.macro led_off
    bclr LED_PORT, #LED
.endm

.macro blink
    led_on
    delay(#250)
    led_off
    delay(#250)
.endm

.macro IBLINK
    mov.b LED_PORT, wreg        ; мигаем
    ze w0, w0
    lsr w0, #LED, w0
    and.b w0, #1, w0
    com.b w0, w0
    and.b w0, #1, w0
    and.b w0, #1, w0            ; что за ерунда?
    sl w0, #LED, w2
    mov #LED_PORT, w1
    mov.b [w1], w1
    mov_w0(~MASK(LED))
    and.b w1, w0, w0
    ior.b w0, w2, w0
    mov.b wreg, LED_PORT
.endm

.macro CALL(number, tmp)
.scope
    ATCMD0(atd + 1)

    for(tmp, start, next)
        getc(#number, tmp)
        rcall transmit_char
    endforc2(#number, tmp, PHONE_LEN, start, next)

    ATCMD0(tail + 1)
.ends
.endm

; вызов функции с двумя аргументами
.macro invoke2(func, arg1, arg2)
    mov arg1, w0
    mov arg2, w1
    rcall initialize
.endm

; вызов функции strnpos для поиска в буфере
.macro invoke_strnpos(needle)
    mov LDM(needle), w1
    mov #BUFSZ, w2
    mov #buffer, w0
    rcall strnpos
.endm

; буфер не содержит needle
.macro unless_buffer_contains(needle, label)
    invoke_strnpos(needle)
    CP0_W0
    bra lt, label
.endm

; буфер содержит needle
.macro if_buffer_contains(needle, label)
    invoke_strnpos(needle)
    CP0_W0
    bra ge, label
.endm

; читать номер из записной книги SIM карты
.macro read_parse_phonebook(cmd, number, flag_active)
    .scope
    ATCMD(cmd)
    delay(#1500)

    ; заполнить номер 0xff
    for(i, start1, next1)
        erase(number, i)
    endfor(i, PHONE_LEN, start1, next1)

    ; проверка корректности ответа
    unless_buffer_contains(cpbr + 1, error)

    invoke_strnpos(cpbr + 1)

    ze w0, w0
    add w0, #10, w0
    mov w0, [w14+pbk]

    for (i, start, next)
        mov [w14+pbk], w1
        mov [w14+i], w0
        add w1, w0, w1
        mov #buffer, w0
        add w1, w0, w0
        mov.b [w0], w1

        ; до закрывающей кавычки
        mov_w0(&amp;#x27;&amp;quot;&amp;#x27;)
        sub.b w1, w0, [w15]
        bra z, break

        ; сохраняем номер в number
        mov [w14+i], w2
        mov [w14+pbk], w1
        mov [w14+i], w0
        add w1, w0, w1
        mov #buffer, w0
        add w1, w0, w0
        mov.b [w0], w1
        mov #number, w0
        add w2, w0, w0
        mov.b w1, [w0]
    endfor(i, PHONE_LEN, start, next)

break:
    ; первый номер прочитан с SIM карты, пометить как активный
    movlf(TRUE, flag_active)
error:
    delay(#2000)
    .ends
.endm

.macro check_number(flag_active, number)
    .scope
    mov flag_active, w0
    sub w0, #TRUE, [w15]
    bra nz, exit

    for(m, start, next)
        ; number[m] == callee[m]?
        getc_(#number, m, w2)
        getc_(#callee, m, w0)
        sub.b w2, w0, [w15]
        bra nz, break
    endfor(m, PHONE_LEN, start, next)

break:
    ; number[m] != callee[m]
    mov [w14+m], w1
    mov #PHONE_LEN + 1, w0
    sub w1, w0, [w15]
    bra nz, exit

    movlo(TRUE, 6)

exit:
    .ends
.endm

.macro get_digit(ndigit, dest)
    mov.b [w14+cbcpos], w0
    ze w0, w0
    add w0, #ndigit, w1
    mov #buffer, w0
    add w1, w0, w0
    mov.b [w0], dest
.endm
&lt;/pre&gt;
  &lt;p id=&quot;37Pj&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;hjyz&quot;&gt;utils.asm (очистка буфера, задержки, поиск подстроки)&lt;/h3&gt;
  &lt;pre id=&quot;R3Sk&quot;&gt;clear_buffer:
    .scope
    lnk #0x02

    for(0, check_cond, repeat)
        erase(buffer, 0)
    endfor(0, BUFSZ, check_cond, repeat)

    movlf(0, bufptr)

    ulnk
    return
    .ends

function_delay:
    .scope
    lnk #0x02

    mov w0, [w14]

    movlf(0x8000, T2CON)
    bra start

loop:
    movlf(0, TMR2)
inner:
    mov TMR2, w1
    mov #3999, w0
    sub w1, w0, [w15]
    bra leu, inner
start:
    dec [w14], [w14]
    setm w0
    subr w0, [w14], [w15]
    bra nz, loop

    ulnk
    return
    .ends

; не используется
timer_delay:
    .scope
    lnk #0x02
    mov w0, [w14]

    movlf(0x8000, T2CON)

    bra start

repeat:
    movlf(0, TMR2)

wait:
    mov TMR2, w1
    mov #PHONE_LEN, w0
    sub w1, w0, [w15]
    bra leu, wait

start:
    dec [w14], [w14]
    setm w0
    subr w0, [w14], [w15]
    bra nz, repeat

    ulnk
    return
    .ends

strnpos:
.scope
    lnk #0x0c

    mov w0, [w14+4]             ; haystack
    mov w1, [w14+6]             ; needle
    mov w2, [w14+8]             ; максимальная длина (i + j)

    for(2, check, nextchar)  ; i (2) - позиция в haystack
    movlo(0, 0)                 ; j (0) - позиция в needle
    bra compare

match:
    inco(w14, 0)                ; j++

    ; needle[j] == &amp;#x27;\0&amp;#x27;?
    mov [w14], w1
    mov [w14+6], w0
    add w1, w0, w0
    mov.b [w0], w0
    CP0_W0
    bra nz, more

    ; нашли needle
    ; возвращаем i - позицию в haystack
    mov [w14+2], w0
    ze w0, w0
    mov w0, [w14+10]
    bra exit

more:
    ; еще не конец needle
    mov [w14+2], w0
    add w0, [w14], w1           ; i + j
    mov [w14+8], w0             ; максимальная длина
    sub w1, w0, [w15]
    bra ltu, compare

    ; подстрока не найдена
    ; достигнут предел суммы позиций в haystack и needle
    mov #0xff, w0
    mov w0, [w14+10]
    bra exit

compare:
    mov [w14+2], w0             ; i
    add w0, [w14], w0           ; j
    mov w0, w1

    mov [w14+4], w0             ; haystack
    add w1, w0, w0
    mov.b [w0], w2              ; w2 = haystack[i + j]

    mov [w14], w1               ; j
    mov [w14+6], w0             ; needle
    add w1, w0, w0
    mov.b [w0], w0              ; w0 = needle[j]

    sub.b w2, w0, [w15]
    bra z, match

    ; символы не совпали
    ; i++ (следующая позиция в haystack)
    inco(w14, 2)

check:
    ; достигли конца haystack?
    mov [w14+2], w1             ; i
    mov [w14+8], w0             ; предел haystack
    sub w1, w0, [w15]
    bra leu, nextchar

    ; конец haystack
    movlo(0xff, 10)             ; -1 - не найдено

exit:
    mov [w14+10], w0            ; результат
    ulnk
    return
.ends
&lt;/pre&gt;
  &lt;p id=&quot;Zqza&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;26M6&quot;&gt;at.asm (строки AT-команд)&lt;/h3&gt;
  &lt;pre id=&quot;T0ay&quot;&gt;org 0x290
    ; AT команды и ответы SIM900

.align_bits 8
at:
    ; &amp;quot;AT\r\n&amp;quot;
    db &amp;quot;AT&amp;quot;,0,0,&amp;quot;\r\n&amp;quot;,0,0,0

ok:
    ; &amp;quot;OK&amp;quot;
    db &amp;#x27;O&amp;#x27;,0,0,&amp;#x27;K&amp;#x27;,0,0,0

at_cpin:
    ; &amp;quot;AT+CPIN?\r\n&amp;quot;
    db &amp;quot;AT&amp;quot;,0,0,&amp;quot;+C&amp;quot;,0,0,&amp;quot;PI&amp;quot;,0,0,&amp;quot;N?&amp;quot;,0,0,&amp;quot;\r\n&amp;quot;,0,0,0

cpin_sim_pin:
    ; &amp;quot;+CPIN: SIM PIN&amp;quot;
    db &amp;#x27;+&amp;#x27;,0,0,&amp;quot;CP&amp;quot;,0,0,&amp;quot;IN&amp;quot;,0,0,&amp;quot;: &amp;quot;,0,0,&amp;quot;SI&amp;quot;,0,0,&amp;quot;M &amp;quot;,0,0,&amp;quot;PI&amp;quot;,0,0,&amp;#x27;N&amp;#x27;,0,0,0

cpin_ready:
    ; &amp;quot;+CPIN: READY&amp;quot;
    db &amp;quot;+C&amp;quot;,0,0,&amp;quot;PI&amp;quot;,0,0,&amp;quot;N:&amp;quot;,0,0,&amp;quot; R&amp;quot;,0,0,&amp;quot;EA&amp;quot;,0,0,&amp;quot;DY&amp;quot;,0,0,0

at_cpin_2000:
    ; &amp;quot;AT+CPIN=2000\r\n&amp;quot;
    db &amp;#x27;A&amp;#x27;,0,0,&amp;quot;T+&amp;quot;,0,0,&amp;quot;CP&amp;quot;,0,0,&amp;quot;IN&amp;quot;,0,0,&amp;quot;=2&amp;quot;,0,0,&amp;quot;00&amp;quot;,0,0,&amp;quot;0\r&amp;quot;,0,0,&amp;#x27;\n&amp;#x27;,0,0,0

at_creg:
    ; &amp;quot;AT+CREG?\r\n&amp;quot;
    db &amp;quot;AT&amp;quot;,0,0,&amp;quot;+C&amp;quot;,0,0,&amp;quot;RE&amp;quot;,0,0,&amp;quot;G?&amp;quot;,0,0,&amp;quot;\r\n&amp;quot;,0,0,0

creg_01:
    ; &amp;quot;+CREG: 0,1&amp;quot;
    db &amp;#x27;+&amp;#x27;,0,0,&amp;quot;CR&amp;quot;,0,0,&amp;quot;EG&amp;quot;,0,0,&amp;quot;: &amp;quot;,0,0,&amp;quot;0,&amp;quot;,0,0,&amp;#x27;1&amp;#x27;,0,0,0

at_cpbs_sm:
    ; AT+CPBS=&amp;quot;SM&amp;quot;\r\n
    db &amp;quot;AT&amp;quot;,0,0,&amp;quot;+C&amp;quot;,0,0,&amp;quot;PB&amp;quot;,0,0,&amp;quot;S=&amp;quot;,0,0,&amp;quot;\&amp;quot;S&amp;quot;,0,0,&amp;quot;M\&amp;quot;&amp;quot;,0,0,&amp;quot;\r\n&amp;quot;,0,0,0

at_cpbr_1:
    ; &amp;quot;AT+CPBR=1\r\n&amp;quot;
    db &amp;#x27;A&amp;#x27;,0,0,&amp;quot;T+&amp;quot;,0,0,&amp;quot;CP&amp;quot;,0,0,&amp;quot;BR&amp;quot;,0,0,&amp;quot;=1&amp;quot;,0,0,&amp;quot;\r\n&amp;quot;,0,0,0

cpbr:
    ; &amp;quot;+CPBR:&amp;quot;
    db &amp;#x27;+&amp;#x27;,0,0,&amp;quot;CP&amp;quot;,0,0,&amp;quot;BR&amp;quot;,0,0,&amp;#x27;:&amp;#x27;,0,0,0

at_cpbr_2:
    ; &amp;quot;AT+CPBR=2\r\n&amp;quot;
    db &amp;quot;AT&amp;quot;,0,0,&amp;quot;+C&amp;quot;,0,0,&amp;quot;PB&amp;quot;,0,0,&amp;quot;R=&amp;quot;,0,0,&amp;quot;2\r&amp;quot;,0,0,&amp;#x27;\n&amp;#x27;,0,0,0

at_cpbr_3:
    ; &amp;quot;AT+CPBR=3\r\n&amp;quot;
    db &amp;quot;AT&amp;quot;,0,0,&amp;quot;+C&amp;quot;,0,0,&amp;quot;PB&amp;quot;,0,0,&amp;quot;R=&amp;quot;,0,0,&amp;quot;3\r&amp;quot;,0,0,&amp;#x27;\n&amp;#x27;,0,0,0

at_cmgf_1:
    ; AT+CMGF=1\r\n
    db &amp;quot;AT&amp;quot;,0,0,&amp;quot;+C&amp;quot;,0,0,&amp;quot;MG&amp;quot;,0,0,&amp;quot;F=&amp;quot;,0,0,&amp;quot;1\r&amp;quot;,0,0,&amp;#x27;\n&amp;#x27;,0,0,0

; AT+CMIC=&amp;lt;channel&amp;gt;,&amp;lt;gainlevel&amp;gt;
; https://www.espruino.com/datasheets/SIM900_AT.pdf
; &amp;lt;channel&amp;gt; 0 main audio handset channel
; 1 aux audio headset channel
; 2 main audio handfree channel
; 3 aux audio handfree channel
; &amp;lt;gainlevel&amp;gt; int: 0-15

; animals:
; на канале 1 чувствительность кажется получше, но качество звука идеальное, чистый без искажений звук
; на 2 канале отличий не увидел, всё также как и канале 0

at_cmic00:
    ; &amp;quot;AT+CMIC=0,0\r\n&amp;quot;
    db &amp;quot;AT&amp;quot;,0,0,&amp;quot;+C&amp;quot;,0,0,&amp;quot;MI&amp;quot;,0,0,&amp;quot;C=&amp;quot;,0,0,&amp;quot;0,&amp;quot;,0,0,&amp;quot;0\r&amp;quot;,0,0,&amp;#x27;\n&amp;#x27;,0,0,0

at_cmic015:
    ; &amp;quot;AT+CMIC=0,15\r\n&amp;quot;
    db &amp;quot;AT&amp;quot;,0,0,&amp;quot;+C&amp;quot;,0,0,&amp;quot;MI&amp;quot;,0,0,&amp;quot;C=&amp;quot;,0,0,&amp;quot;0,&amp;quot;,0,0,&amp;quot;15&amp;quot;,0,0,&amp;quot;\r\n&amp;quot;,0,0,0

at_cmgs:
    ; AT+CMGS=&amp;quot;\x00&amp;quot;
    db &amp;#x27;A&amp;#x27;,0,0,&amp;quot;T+&amp;quot;,0,0,&amp;quot;CM&amp;quot;,0,0,&amp;quot;GS&amp;quot;,0,0,&amp;quot;=\&amp;quot;&amp;quot;,0,0,&amp;quot;\0\&amp;quot;&amp;quot;,0,0,0

Ready:
    ; &amp;quot;Ready&amp;quot;
    db &amp;#x27;R&amp;#x27;,0,0,&amp;quot;ea&amp;quot;,0,0,&amp;quot;dy&amp;quot;,0,0,0

at_cbc:
    ; &amp;quot;AT+CBC\r\n&amp;quot;
    db &amp;#x27;A&amp;#x27;,0,0,&amp;quot;T+&amp;quot;,0,0,&amp;quot;CB&amp;quot;,0,0,&amp;quot;C\r&amp;quot;,0,0,&amp;#x27;\n&amp;#x27;,0,0,0

cbc:
    ; &amp;quot;+CBC:&amp;quot;
    db &amp;quot;+C&amp;quot;,0,0,&amp;quot;BC&amp;quot;,0,0,&amp;#x27;:&amp;#x27;,0,0,0

Low_battery:
    ; &amp;quot;Low battery&amp;quot;
    db &amp;quot;Lo&amp;quot;,0,0,&amp;quot;w &amp;quot;,0,0,&amp;quot;ba&amp;quot;,0,0,&amp;quot;tt&amp;quot;,0,0,&amp;quot;er&amp;quot;,0,0,&amp;#x27;y&amp;#x27;,0,0,0

ring:
    ; &amp;quot;RING&amp;quot;
    db &amp;quot;RI&amp;quot;,0,0,&amp;quot;NG&amp;quot;,0,0,0

at_clcc:
    ; &amp;quot;AT+CLCC\r\n&amp;quot;
    db &amp;#x27;A&amp;#x27;,0,0,&amp;quot;T+&amp;quot;,0,0,&amp;quot;CL&amp;quot;,0,0,&amp;quot;CC&amp;quot;,0,0,&amp;quot;\r\n&amp;quot;,0,0,0

clcc:
    ; &amp;quot;+CLCC:&amp;quot;
    db &amp;#x27;+&amp;#x27;,0,0,&amp;quot;CL&amp;quot;,0,0,&amp;quot;CC&amp;quot;,0,0,&amp;#x27;:&amp;#x27;,0,0,0

ata:
    db &amp;quot;AT&amp;quot;,0,0,&amp;quot;A\r&amp;quot;,0,0,&amp;#x27;\n&amp;#x27;,0,0,0

ath:
    ; &amp;quot;ATH\r\n&amp;quot;
    db &amp;quot;AT&amp;quot;,0,0,&amp;quot;H\r&amp;quot;,0,0,&amp;#x27;\n&amp;#x27;,0,0,0

no_carrier:
    ; &amp;quot;NO CARRIER&amp;quot;
    db &amp;quot;NO&amp;quot;,0,0,&amp;quot; C&amp;quot;,0,0,&amp;quot;AR&amp;quot;,0,0,&amp;quot;RI&amp;quot;,0,0,&amp;quot;ER&amp;quot;,0,0,0

; дубликат строки
ath2:
    ; &amp;quot;ATH&amp;quot;
    db &amp;#x27;A&amp;#x27;,0,0,&amp;quot;TH&amp;quot;,0,0,0

atd:
    ; &amp;quot;ATD&amp;quot;
    db &amp;#x27;A&amp;#x27;,0,0,&amp;quot;TD&amp;quot;,0,0,0

tail:
    ; &amp;quot;;\x00\r\n&amp;quot;
    db &amp;quot;;\0&amp;quot;,0,&amp;quot;\r\n&amp;quot;,0,0,0

High_battery:
    ; &amp;quot;High battery 100%&amp;quot;
    db &amp;#x27;H&amp;#x27;,0,0,&amp;quot;ig&amp;quot;,0,0,&amp;quot;h &amp;quot;,0,0,&amp;quot;ba&amp;quot;,0,0,&amp;quot;tt&amp;quot;,0,0,&amp;quot;er&amp;quot;,0,0,&amp;quot;y &amp;quot;,0,0,&amp;quot;10&amp;quot;,0,0,&amp;quot;0%&amp;quot;,0,0,0
    db 0,0,0
&lt;/pre&gt;
  &lt;p id=&quot;0LlC&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;aPpq&quot;&gt;atoi.asm (преобразование строки в число)&lt;/h3&gt;
  &lt;pre id=&quot;nVGD&quot;&gt;.macro atoi_case(n, offset, label, nobra)
    movl(n, w0)
    movro(w0, w14, offset)
    .if nobra == 0
        bra label
    .endif
.endm

; avoid naken_asm 1024 chars macro limit
.macro atoi_subround(label, tmp1, tmp2, tmp3)
    ; select
    mov [w14+tmp1], w0
    mov [w14+tmp2], w1
    bra w0

    ; case
    bra $+20
    bra $+2*(10+1*2)
    bra $+2*(10+2*2)
    bra $+2*(10+3*2)
    bra $+2*(10+4*2)
    bra $+2*(10+5*2)
    bra $+2*(10+6*2)
    bra $+2*(10+7*2)
    bra $+2*(10+8*2)
    bra $+2*(10+9*2)

    atoi_case(0, tmp3, label, 0)
    atoi_case(1, tmp3, label, 0)
    atoi_case(2, tmp3, label, 0)
    atoi_case(3, tmp3, label, 0)
    atoi_case(4, tmp3, label, 0)
    atoi_case(5, tmp3, label, 0)
    atoi_case(6, tmp3, label, 0)
    atoi_case(7, tmp3, label, 0)
    atoi_case(8, tmp3, label, 0)
    atoi_case(9, tmp3, label, 1)
.endm

.macro atoi_round(tmp0, tmp1, tmp2, tmp3, label)
    mov.b [w14+tmp0], w0
    ze w0, w0
    mul.su w0, #1, w2
    mov #-&amp;#x27;0&amp;#x27;, w0
    mov #-1, w1
    add w0, w2, w2
    addc w1, w3, w3
    mov w2, [w14+tmp1]
    mov w3, [w14+tmp2]
    mov #9, w0
    mov #0, w1
    mov [w14+tmp1], w2
    mov [w14+tmp2], w3
    sub w2, w0, [w15]
    subb w3, w1, [w15]
    bra gtu, label

    atoi_subround(label, tmp1, tmp2, tmp3)

label:
.endm

function_atoi:
    .scope
    lnk #0x1c
    mov.b w0, [w14+8]
    mov.b w1, [w14+9]
    mov.b w2, [w14+10]
    mov.b w3, [w14+11]

    atoi_round(8, 12, 14, 6, overflow1)
    atoi_round(9, 16, 18, 4, overflow2)
    atoi_round(10, 20, 22, 2, overflow3)
    atoi_round(11, 24, 26, 0, overflow4)

    mov [w14+6], w1
    mov #1000, w0
    mul.ss w1, w0, w0
    mov w0, w2
    mov [w14+4], w1
    mov #100, w0
    mul.ss w1, w0, w0
    add w2, w0, w2
    mov [w14+2], w0
    mul.su w0, #10, w0
    add w2, w0, w0
    add w0, [w14], w0

    ulnk
    return
    .ends&lt;/pre&gt;
  &lt;p id=&quot;HqhI&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;rCnD&quot;&gt;naken.asm (исправление ошибок дизассемблера и макросы-сокращения)&lt;/h3&gt;
  &lt;pre id=&quot;8Rfo&quot;&gt;.macro sleep_
    ; unknown opcode
    db 0, 0x40, 0xda, 0
.endm

; константа - регистр
.macro movl(value, reg)
    .if (value) == 0
        clr reg
    .else
        mov #(value), reg
    .endif
.endm

; константа - файл
.macro movlf(value, file)
    movl(value, w0)
    mov w0, (file)
.endm

; [reg] and [reg+0] are not the same
.macro movro(src, dst, offset)
    .if (offset) == 0
        mov src, [dst]
    .else
        mov src, [dst+offset]
    .endif
.endm

; косвенная базовая адресация (со смещением и без)
.macro movor(src, offset, dst)
    .if (offset) == 0
        mov [src], dst
    .else
        mov [src+offset], dst
    .endif
.endm

.macro movlo(value1, var1)
    movl(value1, w0)
    movro(w0, w14, var1)
.endm

.macro inco(reg, offset)
    .if offset == 0
        inc [reg], [reg]
    .else
        mov [reg+offset], w0
        inc w0, w0
        mov w0, [reg+offset]
    .endif
.endm

; если [reg+offset] &amp;lt; n, перейти на label
.macro IFLEO(reg, offset, n, label)
    .if offset == 0
        mov #n, w0
        subr w0, [reg], [w15]
    .else
        mov [reg+offset], w1
        mov #n, w0
        sub w1, w0, [w15]
    .endif
    bra le, label
.endm

.macro incf(file)
    mov file, w0
    inc w0, w0
    mov w0, file
.endm

; naken_asm bugs fix

;cp0 w0
.macro CP0_W0
    db 0, 4, 0xe0, 0
.endm

; mov #b, w0
.macro mov_w0(b)
    db (b &amp;amp; 0x0f) &amp;lt;&amp;lt; 4, 0xc0 | ((b &amp;gt;&amp;gt; 4) &amp;amp; 0x0F), 0xb3, 0
.endm

; mov #b, w1
.macro mov_w1(b)
    db ((b &amp;amp; 0x0f) &amp;lt;&amp;lt; 4) | 1, 0xc0 | ((b &amp;gt;&amp;gt; 4) &amp;amp; 0x0F), 0xb3, 0
.endm

; если file не равно value, перейти на метку label
.macro IFNE(file, value, label)
    mov (file), w0
    sub w0, #(value), [w15]
    bra nz, (label)
.endm

.macro IFNE2(file, value, label)
    mov (file), w1
    mov #(value), w0
    sub w1, w0, [w15]
    bra nz, (label)
.endm&lt;/pre&gt;
  &lt;p id=&quot;Jxuz&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;yGXB&quot;&gt;PIC24FJ64GA004.inc (минималистический включаемый файл)&lt;/h3&gt;
  &lt;pre id=&quot;kcui&quot;&gt;;===============================================================================
; Самодельный PIC24FJ64GA004 для naken_asm
; см. include/dspic/convert.py для преобразования include-файлов
; из формата MPLAB в формат naken_asm (добавлено вручную - возможны ошибки!)

RPOR11  equ 0x06d6
RPINR18 equ 0x06a4
AD1PCFG equ 0x032c

PORTB   equ 0x02CA
RB14    equ 14          ; pin 14
RB8     equ 8           ; pin 44
RB2     equ 2           ; pin 23
RB0     equ 0           ; pin 21

TRISB   equ 0x02C8
TRISB14 equ 14
TRISB2  equ 2

PORTC   equ 0x02D2
RC9     equ 9           ; pin 5
RC1     equ 1           ; pin 26

TRISC   equ 0x02D0
TRISC9  equ 9

U1BRG   equ 0x0228
U1RXREG equ 0x0226
U1TXREG equ 0x0224

U1STA   equ 0x0222
UTXEN   equ 10
URXDA   equ 0

U1MODE  equ 0x0220
UARTEN  equ 15
BRGH    equ 3

T4CON   equ 0x011E
PR4     equ 0x011A
T3CON   equ 0x0112
T2CON   equ 0x0110
TMR2    equ 0x0106

TON     equ 0x8000
TCKPS0  equ 16
TCKPS1  equ 32

PR3     equ 0x010E

IPC4    equ 0x00AC

IEC1    equ 0x0096
T4IE    equ 11
T1IE    equ 3

IEC0    equ 0x0094
T3IE    equ 8

IFS1    equ 0x0086
T4IF    equ 11
CNIF    equ 3

IFS0    equ 0x0084
U1RXIF  equ 11
T3IF    equ 8

CNPU1   equ 0x0068
CN4PUE  equ 4
CN8PUE  equ 8

CNEN1   equ 0x0060
CN8IE   equ 8

CNEN2   equ 0x0062
CN22IE  equ 6

CORCON  equ 0x0044
PSV     equ 2

RCOUNT  equ 0x0036
PSVPAG  equ 0x0034
TBLPAG  equ 0x0032
SPLIM   equ 0x0020&lt;/pre&gt;
  &lt;p id=&quot;rPAU&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;tRLC&quot;&gt;idata.asm (инициализация переменных)&lt;/h3&gt;
  &lt;pre id=&quot;bi5b&quot;&gt;initialize:
    .scope
    ; Table Memory Page Address Register
    mov w1, TBLPAG
    mov w0, w1
    clr w0
    bra local1

local2:
    add w1, #2, w1
    addc TBLPAG
    tblrdl [w1], w3
    add w1, #2, w1
    addc TBLPAG
    tblrdl [w1], w5
    add w1, #2, w1
    addc TBLPAG
    clr w4
    lsr w5, #7, w6
    and #0x7f, w5
    cp.b w5, #0
    bra nz, local3

loop:
    clr.b [w2++]
    dec w3, w3
    bra gtu, loop

    bra local1

local3:
    cp w5, #1
    bra z, skip
    setm w4

skip:
    rcall function_026c

local1:
    ; reading the lower word
    tblrdl [w1], w2
    cp0 w2
    bra nz, local2

    return
    .ends


function_026c:
    .scope
start:
    tblrdl.b [w1++], [w2++]
    dec w3, w3
    bra z, exit

    tblrdl.b [w1--], [w2++]
    dec w3, w3
    bra z, next

    cp0 w4
    bra nz, local1

local2:
    add w1, #2, w1
    addc TBLPAG
    bra start

local1:
    tblrdh.b [w1], [w2++]
    dec w3, w3
    bra nz, local2

next:
    inc w1, w1

exit:
    add w1, #1, w1
    addc TBLPAG
    return
    .ends
&lt;/pre&gt;
  &lt;p id=&quot;NuaQ&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;iCyh&quot;&gt;ivt.asm (таблица векторов прерываний)&lt;/h3&gt;
  &lt;pre id=&quot;3VZy&quot;&gt;    ; таблица векторов прерываний
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_timer3,interrupt_reset, interrupt_reset, interrupt_uart
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_sensor
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_timer4
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, 0,                 0

    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_timer3,interrupt_reset, interrupt_reset, interrupt_uart
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_sensor
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_timer4
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
    dd interrupt_reset, interrupt_reset, interrupt_reset, interrupt_reset
&lt;/pre&gt;
  &lt;p id=&quot;DEv0&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;umeI&quot;&gt;idata2.asm (инициализированные данные)&lt;/h3&gt;
  &lt;pre id=&quot;a781&quot;&gt;    dd unknown, 0x40,   2,      0
    dd 0,       0,      0,      0
    dd 0,       0,      0,      0
    dd 0,       0,      0,      0
    dd 0,       1,      0,      0
    dd 0,       1,      0,      0
    dd 0,       0x800,  0x9FE,  0
    dd 0&lt;/pre&gt;
  &lt;p id=&quot;wy2L&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;7VZG&quot;&gt;Перейти к &lt;a href=&quot;#Matf&quot;&gt;оглавлению&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;jpaV&quot;&gt;&lt;strong&gt;Подпишитесь&lt;/strong&gt; на мой блог, не дайте &lt;a href=&quot;/@badradio/plagiat&quot;&gt;фуфлыжникам&lt;/a&gt; шанса!&lt;/p&gt;
  &lt;p id=&quot;eOtH&quot;&gt;&lt;a href=&quot;/@badradio&quot;&gt;Все статьи →&lt;/a&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;xFrg&quot; data-align=&quot;center&quot;&gt;© Copyright 2025 Badradio. All rights reserved.&lt;br /&gt;Все права защищены. Копирование материалов сайта запрещено.&lt;br /&gt;При цитировании ставить кликабельную ссылку на первоисточник.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>badradio:flind</id><link rel="alternate" type="text/html" href="https://teletype.in/@badradio/flind?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=badradio"></link><title>Нерабочий радиомикрофон Э.Флинда (1981) v1.0</title><published>2025-12-11T05:38:21.102Z</published><updated>2025-12-28T14:08:37.662Z</updated><category term="radiomikrofony" label="Радиомикрофоны"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/24/b5/24b5dad0-2809-4e02-8954-317ff5c278ce.jpeg&quot;&gt;Книга «Электронные устройства для дома» вышла в 1984 году тиражом 200000 экземпляров в СССР, но ошибку в радиомикрофоне никто так и не заметил.</summary><content type="html">
  &lt;p id=&quot;CvJY&quot;&gt;Книга «&lt;strong&gt;Электронные устройства для дома&lt;/strong&gt;» вышла в &lt;strong&gt;1984&lt;/strong&gt; году тиражом 200000 экземпляров в СССР, но ошибку в радиомикрофоне никто так и не заметил.&lt;/p&gt;
  &lt;p id=&quot;zzYf&quot;&gt;Схема нерабочего радиомикрофона Э.Флинда:&lt;/p&gt;
  &lt;figure id=&quot;GXJM&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/24/b5/24b5dad0-2809-4e02-8954-317ff5c278ce.jpeg&quot; width=&quot;525&quot; /&gt;
    &lt;figcaption&gt;Э.Флинд. Электронные устройства для дома. Рис. 3.1. Схема радиомикрофона&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;f2TK&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e6/32/e6323d5a-c397-41e3-8ab9-175e12749df0.jpeg&quot; width=&quot;525&quot; /&gt;
    &lt;figcaption&gt;Э.Флинд. Электронные устройства для дома. Рис. 3.3. Расположение элементов на плате радиомикрофона&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;y2Jy&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a2/a1/a2a1ecf4-1060-4bdd-a470-159d6598afea.jpeg&quot; width=&quot;525&quot; /&gt;
    &lt;figcaption&gt;Э.Флинд. Электронные устройства для дома. Номиналы элементов радиомикрофона&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;CxXS&quot;&gt;Частота — средневолновый диапазон 200-400 м, антенна магнитная (должна быть расположена соосно с магнитной антенной радиоприемника).&lt;/p&gt;
  &lt;p id=&quot;6pSa&quot;&gt;На транзисторе VT2 собран источник тока: I = ((9В * R5 / (R5 + R4)) - 0.6В) / R8.&lt;/p&gt;
  &lt;p id=&quot;cn45&quot;&gt;При модуляции в базу VT2 меняется ток генератора на VT3, VT4, следовательно и мощность.&lt;/p&gt;
  &lt;p id=&quot;QHmg&quot;&gt;Проблема в том, что при указанных на схеме номиналах I = ((9 * 8.2 / (8.2 + 39)) - 0.6) / 3.3 = 292 мкА, и при таком ничтожном токе генератор просто не будет работать.&lt;/p&gt;
  &lt;p id=&quot;UI9p&quot;&gt;Чтобы радиомикрофон Флинда заработал, нужно &lt;strong&gt;уменьшить R8 в 10 раз&lt;/strong&gt; — до 330 Ом.&lt;/p&gt;
  &lt;p id=&quot;tsW1&quot;&gt;Так как в режиме молчания на базе VT2 1.5В, а на эмиттерах VT3, VT4 3.3В, то модуляцию без искажений получить трудно. При положительной полуволне модулирующего напряжения ток VT3, VT4 будет возрастать линейно, а при отрицательной — упадет до нуля уже при уменьшении базового напряжения VT2 на 0.7В. Это легко исправить, уменьшив &lt;strong&gt;R6&lt;/strong&gt; с 18 до 10 кОм.&lt;/p&gt;
  &lt;p id=&quot;5nOP&quot;&gt;В английском оригинале книги Э.Флинда эта ошибка тоже есть.&lt;/p&gt;
  &lt;p id=&quot;pPDM&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;M7jA&quot;&gt;&lt;strong&gt;Подпишитесь на блог&lt;/strong&gt;, чтобы узнавать о новых статьях сразу.&lt;/p&gt;
  &lt;p id=&quot;jOat&quot;&gt;&lt;a href=&quot;https://teletype.in/@badradio&quot; target=&quot;_blank&quot;&gt;Все статьи →&lt;/a&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;9oSn&quot; data-align=&quot;center&quot;&gt;© Copyright 2025 Badradio. All rights reserved.&lt;br /&gt;Все права защищены. Копирование материалов сайта запрещено.&lt;br /&gt;При цитировании ставить кликабельную ссылку на первоисточник.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>badradio:kp305</id><link rel="alternate" type="text/html" href="https://teletype.in/@badradio/kp305?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=badradio"></link><title>Нерабочий радиомикрофон Осенчука на КП305Ж и 2Т325В v1.0</title><published>2025-12-09T05:39:45.365Z</published><updated>2025-12-12T04:27:56.900Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/11/58/11583401-04a9-457a-b501-6ce962f24257.png"></media:thumbnail><category term="radiomikrofony" label="Радиомикрофоны"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/9f/d4/9fd48f96-aac2-41e2-81cb-040a04d4fc8e.png&quot;&gt;Впервые схема радиомикрофона на КТ3102Г, КП305, КВС111 и КТ325 опубликована в журнале Радиолюбитель №7/1998 под названием «Радиомикрофон на 108 МГц». Автор — А.Осенчук из п.Нижнеангарск, Бурятия.</summary><content type="html">
  &lt;p id=&quot;9jVX&quot;&gt;Впервые схема радиомикрофона на КТ3102Г, КП305, КВС111 и КТ325 опубликована в журнале Радиолюбитель №7/1998 под названием «&lt;strong&gt;Радиомикрофон на 108 МГц&lt;/strong&gt;». Автор — &lt;strong&gt;А.Осенчук из п.Нижнеангарск, Бурятия&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;B0L7&quot;&gt;&lt;a href=&quot;https://teletype.in/@badradio&quot; target=&quot;_blank&quot;&gt;Все статьи →&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;V6HX&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9f/d4/9fd48f96-aac2-41e2-81cb-040a04d4fc8e.png&quot; width=&quot;1198&quot; /&gt;
    &lt;figcaption&gt;Схема радиомикрофона А. Осенчука с RadioStorage.net, дополненная цоколевками КП305 и КТ3102&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;dOZl&quot;&gt;В 2012 году эта схема вместе с ошибками была &lt;a href=&quot;https://teletype.in/@badradio/plagiat&quot; target=&quot;_blank&quot;&gt;сворована&lt;/a&gt; неким «вектором» (№74922) и выложена на VRTP:&lt;/p&gt;
  &lt;p id=&quot;Dhiy&quot;&gt;vrtp .ru/index.php?act=categories&amp;amp;CODE=article&amp;amp;article=2873 (без регистраии ссылка не открывается).&lt;/p&gt;
  &lt;p id=&quot;mlpi&quot;&gt;Уже традиционно для VRTP, в статье «&lt;strong&gt;Радио микрофон FM диапозона. 3 транзитора&lt;/strong&gt;» упомянута целая толпа: вектор, Markus, матроскин, но только не автор.&lt;/p&gt;
  &lt;p id=&quot;YSpo&quot;&gt;Девиз &lt;a href=&quot;https://teletype.in/@badradio/plagiat&quot; target=&quot;_blank&quot;&gt;плагиатора&lt;/a&gt; (это он сам на странице своего профиля пишет):&lt;/p&gt;
  &lt;blockquote id=&quot;t7Bl&quot;&gt;Собрали и смело включайте, лишнее выгорит!&lt;/blockquote&gt;
  &lt;p id=&quot;ijeN&quot;&gt;Тем не менее, прежде чем включать эту дрянь, я бы посоветовал сначала добавить &lt;strong&gt;электролиты&lt;/strong&gt; по питанию.&lt;/p&gt;
  &lt;p id=&quot;ry05&quot;&gt;Затем можно заметить, что сопротивление &lt;strong&gt;R2&lt;/strong&gt; в ООС УНЧ (47 кОм) &lt;strong&gt;указано неверно&lt;/strong&gt;. Оно должно быть в 15-20 раз больше (680 кОм). Вместо шумного КТ3102Г следует применить малошумящий КТ3102Е, а микрофон зашунтировать конденсатором 100 пф для защиты от наводок с мобильных телефонов.&lt;/p&gt;
  &lt;p id=&quot;Eyvv&quot;&gt;Также можно радикально улучшить разборчивость речи, заменив убогий однотранзисторный УНЧ &lt;a href=&quot;https://teletype.in/@badradio/aru&quot; target=&quot;_blank&quot;&gt;схемой Kotu&lt;/a&gt; с автоматической регулировкой усиления (&lt;strong&gt;АРУ&lt;/strong&gt;).&lt;/p&gt;
  &lt;p id=&quot;joeg&quot;&gt;Примененная Осенчуком схема задающего генератора на МОП-транзисторе — одна из лучших по стабильности, шумам и КПД. Но при повторении конструкции она фактически неработоспособна, потому что &lt;strong&gt;подложка должна быть соединена с истоком&lt;/strong&gt;, а у КП305 она соединена с корпусом, который незнающие этой «хитрости» просто заземлят.&lt;/p&gt;
  &lt;p id=&quot;siyQ&quot;&gt;Цепочка R10&lt;strong&gt;C6&lt;/strong&gt; (конденсатор &lt;strong&gt;100 пф — &lt;/strong&gt;четвертая &lt;strong&gt;ошибка&lt;/strong&gt;, заменить на 1...10 нанофарад) должна стоять в эмиттере VT3, стабилизируя рабочую точку усилителя мощности. У автора же она просто съедает лишний заряд батареи.&lt;/p&gt;
  &lt;p id=&quot;uB2W&quot;&gt;Только после исправления этих ошибок получим «рабочий» радиомикрофон.&lt;/p&gt;
  &lt;p id=&quot;CBaW&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;SYh7&quot;&gt;При указанных автором номиналах &lt;strong&gt;частота&lt;/strong&gt; будет не 108 МГц, а до 120 МГц.&lt;/p&gt;
  &lt;p id=&quot;GCyo&quot;&gt;При увеличении напряжения питания до 4В &lt;strong&gt;частота уходит вверх&lt;/strong&gt; на целых 4 МГц, так как напряжение на варикапной матрице КВС111 не стабилизировано.&lt;/p&gt;
  &lt;p id=&quot;3Lld&quot;&gt;Слово «рабочий» я взял в кавычки, потому что из-за &lt;strong&gt;безграмотной антенной цепи&lt;/strong&gt; значительная часть выходной мощности не излучается, а нагревает VT3.&lt;/p&gt;
  &lt;p id=&quot;wtTM&quot;&gt;Чтобы это исправить, вместо параллельного контура L5C5 нужно поставить ВЧ дроссель и &lt;strong&gt;П-контур&lt;/strong&gt;, согласовав антенну с усилителем мощности, после чего излучаемая &lt;strong&gt;мощность и КПД возрастут в разы при том же потребляемом токе&lt;/strong&gt;.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Qugu&quot;&gt;Зеленые &lt;a href=&quot;https://teletype.in/@badradio/radiokot.ru#c0VB&quot; target=&quot;_blank&quot;&gt;китайские дроссели&lt;/a&gt; тут не годятся, подойдут только самодельные без сердечника (как у &lt;a href=&quot;https://teletype.in/@badradio/transverter&quot; target=&quot;_blank&quot;&gt;Жутяева&lt;/a&gt;).&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;tUlw&quot;&gt;&lt;strong&gt;Расчет П-контура&lt;/strong&gt; для этого радиомикрофона оставляю в качестве домашнего задания, так как уже есть аналогичный &lt;a href=&quot;https://teletype.in/@badradio/filin&quot; target=&quot;_blank&quot;&gt;пример для радиомикрофона «Филин»&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;uwA0&quot;&gt;Найдите и скачайте методичку Титова «&lt;strong&gt;Проектирование цепей коррекции, согласования и фильтрации усилителей мощности радиопередающих устройств&lt;/strong&gt;». Вам понадобится таблица 2.2 на странице 13.&lt;/p&gt;
  &lt;p id=&quot;a19S&quot;&gt;Расчету П-контура предшествует выбор &lt;strong&gt;оптимального сопротивления нагрузки&lt;/strong&gt; транзистора 2Т325В при заданном напряжении питания. Методика есть в любом учебнике по проектированию радиопередатчиков (например, у &lt;strong&gt;Шахгильдяна&lt;/strong&gt;).&lt;/p&gt;
  &lt;p id=&quot;6xGg&quot;&gt;Пусть ток потребления выходного каскада этой схемы 20 мА при напряжении питания 3В. Значит, на R10 упадет 0.02А*56Ом=0.12В, и напряжение коллектора не более 3-0.12=2.88В. Оставив еще 0.3В на напряжение насыщения (в справочнике Петухова не указано), получим 2.58В. Тогда оптимальное сопротивление нагрузки будет 2.58В/0.02А=&lt;strong&gt;129 Ом&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;gYc4&quot;&gt;&lt;strong&gt;Импеданс антенны «четверьволновой штырь» около 35 Ом&lt;/strong&gt; (можно измерить NanoVNA).&lt;/p&gt;
  &lt;p id=&quot;JfxB&quot;&gt;Вот теперь, используя эти данные (35 Ом и 129 Ом) и зная частоту (около 120 МГц), можно по методичке Титова расчитать конкретные номиналы П-контура.&lt;/p&gt;
  &lt;p id=&quot;G5mb&quot;&gt;Первый шаг: коэффициент трансформации 129/35=3.69, ближайшее значение kтр в таблице 2.2 — 4. Дальше сами, полный пример &lt;a href=&quot;https://teletype.in/@badradio/filin&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;HcvG&quot;&gt;После выполнения расчетов &lt;strong&gt;поделитесь результатами в комментариях&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;KK2z&quot;&gt;Помните о &lt;a href=&quot;https://teletype.in/@badradio/protivoves&quot; target=&quot;_blank&quot;&gt;противовесе&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;LT4d&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;SM50&quot;&gt;&lt;a href=&quot;https://teletype.in/@badradio&quot; target=&quot;_blank&quot;&gt;Все статьи →&lt;/a&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;XsAi&quot; data-align=&quot;center&quot;&gt;© Copyright 2025 Badradio. All rights reserved.&lt;br /&gt;Все права защищены. Копирование материалов сайта запрещено.&lt;br /&gt;При цитировании ставить кликабельную ссылку на первоисточник.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>badradio:lexi</id><link rel="alternate" type="text/html" href="https://teletype.in/@badradio/lexi?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=badradio"></link><title>Исходник GSM «жучка» на PIC16F648A v1.0</title><published>2025-12-03T17:08:42.284Z</published><updated>2025-12-29T12:59:37.435Z</updated><category term="radiomikrofony" label="Радиомикрофоны"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/3c/ee/3cee2015-072d-4077-9bc8-a4cfde5b2a8a.jpeg&quot;&gt;Реверс инжиниринг демо-прошивки радиомикрофона на PIC16F648A/PIC16F628A и древнем GSM модуле SIM300DZ.</summary><content type="html">
  &lt;p id=&quot;ObvL&quot;&gt;Реверс инжиниринг демо-прошивки радиомикрофона на &lt;strong&gt;PIC16F648A&lt;/strong&gt;/PIC16F628A и древнем &lt;strong&gt;GSM&lt;/strong&gt; модуле &lt;strong&gt;SIM300DZ&lt;/strong&gt;.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;K5gv&quot;&gt;Также см. исходники GSM радиомикрофонов на других модулях: &lt;strong&gt;&lt;a href=&quot;https://teletype.in/@badradio/treshka&quot; target=&quot;_blank&quot;&gt;SIM800C&lt;/a&gt;&lt;/strong&gt; (PIC12F1822, очень глючная), &lt;strong&gt;&lt;a href=&quot;https://teletype.in/@badradio/sim900&quot; target=&quot;_blank&quot;&gt;SIM900&lt;/a&gt;&lt;/strong&gt; (PIC24FJ64GA004, очень глючная).&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;xIOa&quot;&gt;В отличие от «&lt;a href=&quot;https://teletype.in/@badradio/treshka&quot; target=&quot;_blank&quot;&gt;Трешки&lt;/a&gt;», ножек контроллера хватит и для &lt;strong&gt;дистанционного управления по SMS&lt;/strong&gt;, а программа кажется гораздо более вменяемой.&lt;/p&gt;
  &lt;figure id=&quot;Y9hE&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3c/ee/3cee2015-072d-4077-9bc8-a4cfde5b2a8a.jpeg&quot; width=&quot;350&quot; /&gt;
    &lt;figcaption&gt;Исходники GSM радиомикрофона на PIC16F648A, SIM300D&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;sf5X&quot;&gt;&lt;strong&gt;Антенну GSM используйте заводускую&lt;/strong&gt;, а не такую, как у автора, а то Ротхаммель будет вертеться в гробу, как волчок. Помните о &lt;a href=&quot;https://teletype.in/@badradio/protivoves&quot; target=&quot;_blank&quot;&gt;противовесе&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;oyQa&quot;&gt;Печатная плата «&lt;a href=&quot;https://teletype.in/@badradio/treshka&quot; target=&quot;_blank&quot;&gt;Трешки&lt;/a&gt;» является причиной страшных глюков. В этом GSM радиомикрофоне плата получше, особенно если светодиод с длинными выводами заменить бескорпусным, а микрофон применить от гарнитуры, как советует Eddy71.&lt;/p&gt;
  &lt;p id=&quot;RSJf&quot;&gt;Я не анализировал эту прошивку так подробно, как «&lt;a href=&quot;https://teletype.in/@badradio/treshka&quot; target=&quot;_blank&quot;&gt;Трешку&lt;/a&gt;», поэтому за надежность не ручаюсь. Но идея &lt;strong&gt;хранить номер на SIM карте и проверять по имени&lt;/strong&gt; гарантирует отсутствие ложных срабатываний и глюков от наводок, от чего так страдает «&lt;a href=&quot;https://teletype.in/@badradio/treshka&quot; target=&quot;_blank&quot;&gt;Трешка&lt;/a&gt;», судя по обсуждению на VRTP.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;ISv7&quot;&gt;Ни «&lt;a href=&quot;https://teletype.in/@badradio/treshka&quot; target=&quot;_blank&quot;&gt;Трешку&lt;/a&gt;», ни эту схему я не собирал, поэтому неприятные неожиданности возможны.&lt;/p&gt;
    &lt;p id=&quot;QG7X&quot;&gt;Вместо &lt;strong&gt;халтурных проверок ответов SIM300 по одному-двум символам&lt;/strong&gt; нужно сделать полноценные сравнения, как с &amp;quot;+CMT&amp;quot; (см. not_a_ring).&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;pB80&quot;&gt;Авторская прошивка является демонстрационной и содержит &lt;strong&gt;ограничения&lt;/strong&gt; на длительность и количество звонков. Интересные места прокомментированы.&lt;/p&gt;
  &lt;p id=&quot;x2vB&quot;&gt;Если вдруг окажется, что микропрограмма качественная, я советую связаться с автором и купить полную версию с управлением по SMS.&lt;/p&gt;
  &lt;p id=&quot;XFz2&quot;&gt;Комментарии автора:&lt;/p&gt;
  &lt;blockquote id=&quot;wt0u&quot;&gt;Полная прошивка распространяется уже прошитая в микроконтроллер – спрашивайте у автора.&lt;br /&gt;Если у Вас нету опыта и Вы собрали  программатор самостоятельно, то &lt;strong&gt;не рискуйте, прошивая внутрисхемно&lt;/strong&gt;. Вы можете потерять сотовый модуль.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;nF8T&quot;&gt;Устройство отвечает только хозяину. Чтобы прописать его номер в международном формате (+7905……….) Вам надо &lt;strong&gt;записать на сим-карту&lt;/strong&gt; его номер под имеем &lt;strong&gt;Ph1&lt;/strong&gt;. Обязательно отмените ввод пин-кода. Программирование осуществляется с помощью мобильника. Будьте внимательны – некоторые телефоны дописывают индексы к имени, это приведет к сбою работы. Например, так делают Sony Ericson.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;jvnx&quot;&gt;За полной прошивкой обращайтесь к &lt;strong&gt;автору&lt;/strong&gt; по &lt;strong&gt;ICQ: 288449055&lt;/strong&gt; или пишите на мыло &lt;strong&gt;device@open.by&lt;/strong&gt;. Автор принимает заказы на разработку устройств с применением контроллеров, GSM и GPS технологий.&lt;/blockquote&gt;
  &lt;p id=&quot;WG3K&quot;&gt;Оригинальная прошивка без исходников (говносайт «Паяльник» удалил все мои комментарии):&lt;/p&gt;
  &lt;p id=&quot;bNje&quot;&gt;&lt;a href=&quot;https://web.archive.org/web/20240512090900/https://cxem.net/radiomic/radiomic123.php&quot; target=&quot;_blank&quot;&gt;https://web.archive.org/web/20240512090900/https://cxem.net/radiomic/radiomic123.php&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;P7rF&quot;&gt;Страница с обсуждением на форуме cxem net:&lt;/p&gt;
  &lt;p id=&quot;dD4E&quot;&gt;&lt;a href=&quot;https://web.archive.org/web/20251203165751/https://forum.cxem.net/topic/50702-%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B9-gsm-%D0%BC%D0%B8%D0%BA%D1%80%D0%BE%D1%84%D0%BE%D0%BD-%D0%BD%D0%B0-sim300d/&quot; target=&quot;_blank&quot;&gt;https://web.archive.org/web/20251203165751/https://forum.cxem.net/topic/50702-%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B9-gsm-%D0%BC%D0%B8%D0%BA%D1%80%D0%BE%D1%84%D0%BE%D0%BD-%D0%BD%D0%B0-sim300d/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;3YYX&quot;&gt;Руководство по работе с GSM/GPRS модемом &lt;strong&gt;SIM300 на русском&lt;/strong&gt; языке:&lt;/p&gt;
  &lt;p id=&quot;dqBy&quot;&gt;&lt;a href=&quot;https://www.macrogroup.ru/content/data/store/images/f_158_213_1.pdf&quot; target=&quot;_blank&quot;&gt;https://www.macrogroup.ru/content/data/store/images/f_158_213_1.pdf&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;TV8j&quot;&gt;Правильная &lt;strong&gt;работа с UART&lt;/strong&gt; от Microchip (&lt;strong&gt;AN774&lt;/strong&gt;):&lt;/p&gt;
  &lt;p id=&quot;fNgN&quot;&gt;&lt;a href=&quot;https://ww1.microchip.com/downloads/en/appnotes/00774a.pdf&quot; target=&quot;_blank&quot;&gt;https://ww1.microchip.com/downloads/en/appnotes/00774a.pdf&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;0hl4&quot;&gt;&lt;a href=&quot;https://github.com/trygvis/pic16/blob/master/application-notes/an774-Asynchronous%20Communications%20with%20the%20PICmicro%20USART/Appendix%20A%20for%20PIC16/p16_tiri.asm&quot; target=&quot;_blank&quot;&gt;https://github.com/trygvis/pic16/blob/master/application-notes/an774-Asynchronous%20Communications%20with%20the%20PICmicro%20USART/Appendix%20A%20for%20PIC16/p16_tiri.asm&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;qjZF&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;i8Xl&quot;&gt;Блок-схема авторского обработчика прерывания&lt;/h3&gt;
  &lt;p id=&quot;6W8K&quot;&gt;Довольно сильно отличается от рекомендованного Microchip:&lt;/p&gt;
  &lt;figure id=&quot;L8eh&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d0/b4/d0b4f2c7-0ec2-466e-b60c-0eb9a27f2828.png&quot; width=&quot;537&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;C6yJ&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;KOQq&quot;&gt;Блок-схема примененного в прошивке алгоритма работы с SIM300&lt;/h3&gt;
  &lt;p id=&quot;saLg&quot;&gt;Красный — ошибки.&lt;/p&gt;
  &lt;p id=&quot;0QI3&quot;&gt;Оранжевый — опрос кнопки и сенсора зарядки.&lt;/p&gt;
  &lt;p id=&quot;vU7W&quot;&gt;Желтый — ограничения демонстрационной версии.&lt;/p&gt;
  &lt;p id=&quot;6Lqc&quot;&gt;Зеленый — переход в спящий режим.&lt;/p&gt;
  &lt;p id=&quot;ALPA&quot;&gt;Синий — отправка AT-команд модулю SIM300.&lt;/p&gt;
  &lt;p id=&quot;LHZR&quot;&gt;Темно-синий — управление кнопкной включения SIM300.&lt;/p&gt;
  &lt;p id=&quot;3LjY&quot;&gt;Фиолетовый — анализ ответов GSM модуля.&lt;/p&gt;
  &lt;figure id=&quot;XQHX&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/51/03/510342bf-60d6-4ebc-bd45-c350cf5ad255.png&quot; width=&quot;768&quot; /&gt;
    &lt;figcaption&gt;Блок-схема алгоритма применения GSM модуля SIM300 в качестве радиомикрофона на PIC16F648A&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ZVwO&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;XxLn&quot;&gt;Исходный код прошивки&lt;/h3&gt;
  &lt;pre id=&quot;EeRn&quot;&gt;        processor p16f648a
        radix dec

        include p16f648a.inc

; The recognition of labels and registers is not always good, therefore
; be treated cautiously the results.

        CONFIG  WDTE  = ON
        CONFIG  PWRTE = OFF
        CONFIG  FOSC  = INTOSCIO
        CONFIG  MCLRE = OFF
        CONFIG  BOREN = OFF
        CONFIG  LVP   = OFF
        CONFIG  CPD   = OFF
        CONFIG  CP    = ON

#define MAX_CALLS 10
#define MAX_TIME 114
#define BUFSZ 49
#define TRUE 1
#define FALSE 0
#define BAUD 9600
#define F_OSC 4000000

;===============================================================================
; DATA address definitions

#define EEPROM_CALLS_COUNTER 0x64

STATUS_TEMP     equ     0x21
FSR_TEMP        equ     0x22
PCLATH_TEMP     equ     0x28
bufptr          equ     0x29
buffer          equ     0x2a
after_buffer    equ     0x5b                                ; first byte after buffer
state           equ     0x5c                                ; finite state machine
#define STATE_OFF 0
#define STATE_READY 1
#define STATE_RESET 3

calls_counter   equ     0x5d
time_counter    equ     0x5e

flags           equ     0x5f
#define FLAG_CALL 0

commaptr        equ     0x63                                ; позиция &amp;#x27;,&amp;#x27; в буфере с СМС
regcnt          equ     0x63                                ; network registration
a               equ     0x63
i               equ     0x63

slotptr         equ     0x64                                ; sms slot offset
c               equ     0x64
blink_arg       equ     0x64
quotes          equ     0x64
namepos         equ     0x64

sms_slot        equ     0x65                                ; sms slot value
d               equ     0x65

dtr_arg         equ     0x66
tmp4            equ     0x66
cmgd_arg1       equ     0x66

delay_arg       equ     0x67
cmgd_arg2       equ     0x67

itoabuf0        equ     0x68
itoabuf1        equ     0x69
itoabuf2        equ     0x6a
itoabuf3        equ     0x6b

arg1            equ     0x6c
arg2            equ     0x6d
j               equ     0x6e

Common_RAM      equ     0x0070                              ; size: 16 bytes
k               equ     (Common_RAM + 7)
INTCON_TEMP     equ     (Common_RAM + 7)
result          equ     (Common_RAM + 8)
button_state    equ     (Common_RAM + 8)
clipptr         equ     (Common_RAM + 8)
highbanks       equ     (Common_RAM + 10)


;===============================================================================
; PINS usage definitions

LED             equ     RA1

PWRKEY          equ     RB0
PIN_DTR         equ     RB3
CHARGER         equ     RB4
BUTTON          equ     RB5


;===============================================================================
; Macroses

Bank0   MACRO
        bcf     STATUS, RP0
        ENDM

Bank1   MACRO
        bsf     STATUS, RP0
        ENDM

BSF1    MACRO   file, bit       ; установить бит регистра из банка 1
        Bank1
        bsf     (file), (bit)
        ENDM

BCF1    MACRO   file, bit       ; сбросить бит регистра из банка 1
        Bank1
        bcf     (file), (bit)
        ENDM

SETPC   MACRO                   ; для отправки AT команды
        bcf     PCLATH, 0
        bcf     PCLATH, 1
        bcf     PCLATH, 2
        addwf   PCL, F
        ENDM

MOVLF   MACRO   value, file
        movlw   (value)
        movwf   (file)
        ENDM

MOVLF0  MACRO   value, file
        movlw   (value)
        Bank0
        movwf   (file)
        ENDM

MOVLF1  MACRO   value, file
        movlw   (value)
        Bank1
        movwf   (file)
        ENDM

MOVFF   MACRO   src, dst
        movf    (src), W
        movwf   (dst)
        ENDM

IFG     MACRO   var, n, label   ; если больше
        movf    (var), W
        sublw   (n)
        btfss   STATUS, C
        goto    (label)
        ENDM

IFL     MACRO   var, n, label   ; если меньше
        movf    (var), W
        sublw   (n)
        btfsc   STATUS, C
        goto    (label)
        ENDM

IFNE    MACRO   var, n, label   ; если не равно
        movf    (var), W
        sublw   (n)
        btfss   STATUS, Z
        goto    (label)
        ENDM

IFEQ    MACRO   var, n, label   ; если равно
        movf    (var), W
        sublw   (n)
        btfsc   STATUS, Z
        goto    (label)
        ENDM

DTR0   MACRO                   ; сбросить DTR
        bcf     PORTB, PIN_DTR
        BCF1    TRISB, PIN_DTR
        ENDM

DTRP    MACRO                   ; дернуть DTR
        bsf     PORTB, PIN_DTR
        BCF1    TRISB, PIN_DTR
        ENDM

DELAY   MACRO   n               ; задержка
        MOVLF0  (n), delay_arg
        call    function_delay
        ENDM

LDELAY  MACRO   n, file         ; длинная задержка
        MOVLF   (n), (file)
        MOVLF   250, delay_arg
        call    function_delay
        decfsz  (file), F
        goto    $-4
        ENDM

BLINK   MACRO   n               ; мигание светодиодом
        MOVLF   (n), blink_arg  ; Bank0 уже выбран
        call    function_blink
        ENDM

BLINKP  MACRO   n               ; мигание светодиодом
        MOVLF0  (n), blink_arg  ; Bank0
        call    function_blink
        ENDM

SEND    MACRO   char            ; отправить символ
        movlw   (char)
        btfss   PIR1, TXIF
        goto    $-1
        movwf   TXREG
        ENDM

SENDF   MACRO   file            ; отправить &amp;quot;файл&amp;quot;
        movf    (file), W
        btfss   PIR1, TXIF
        goto    $-1
        movwf   TXREG
        ENDM

TXSTR   MACRO   m, proc, n      ; отправить строку
        LOCAL   next_char
        clrf    (m)
next_char:
        movf    (m), W
        call    (proc)
        incf    (m), F
        movwf   (Common_RAM + 7)
        SENDF   (Common_RAM + 7)
        movlw   (n)
        subwf   (m), W
        btfss   STATUS, Z
        goto    next_char
        ENDM

; отправить AT-команду
ATCMDB  MACRO   tmp, proc, length, delay
        ; очистить буфер до отправки
        call    function_clear_buffer
        TXSTR   (tmp), (proc), (length)
        LDELAY  (delay), (tmp)
        ENDM

ATCMDA  MACRO   tmp, proc, length, delay
        TXSTR   (tmp), (proc), (length)
        ; очистить буфер после
        call    function_clear_buffer
        LDELAY  (delay), (tmp)
        ENDM

;===============================================================================
; CODE area

        ; code

        org     __CODE_START

vector_reset:

        MOVLF   0, PCLATH       ; select program memory page 0
        goto    reset_vector
        nop

vector_int:                     ; обработчик прерываний

        movwf   (Common_RAM + 15)
        swapf   STATUS, W
        clrf    STATUS
        movwf   STATUS_TEMP
        MOVFF   (Common_RAM + 15), 0x20
        MOVFF   PCLATH, PCLATH_TEMP
        clrf    PCLATH
        swapf   0x20, F
        MOVFF   FSR, FSR_TEMP
        MOVFF   (Common_RAM + 7), 0x23
        MOVFF   (Common_RAM + 8), 0x24
        MOVFF   (Common_RAM + 9), 0x25
        MOVFF   (Common_RAM + 10), 0x26
        MOVFF   (Common_RAM + 11), 0x27

        bcf     STATUS, IRP     ; 0 = Bank 0, 1 (00h - FFh)
        Bank0
        MOVLF   PIE1, FSR       ; IRP:FSR&amp;lt;7&amp;gt; = 01 = Bank 1

        btfss   INDF, RCIE      ; 1 = Enables the USART receive interrupt
        goto    check_timer

        btfsc   PIR1, RCIF      ; test RCIF receive interrupt
        goto    byte_arrived

check_timer:
        MOVLF   PIE1, FSR
        btfss   INDF, TMR1IE    ; TMR1 Overflow Interrupt Enable bit
        goto    restore
        btfsc   PIR1, TMR1IF    ; TMR1 Overflow Interrupt Flag bit
        goto    timer_interrupt

restore:                        ; выход из обработчика прерывания
        MOVFF   FSR_TEMP, FSR
        MOVFF   0x23, (Common_RAM + 7)
        MOVFF   0x24, (Common_RAM + 8)
        MOVFF   0x25, (Common_RAM + 9)
        MOVFF   0x26, (Common_RAM + 10)
        MOVFF   0x27, (Common_RAM + 11)
        MOVFF   PCLATH_TEMP, PCLATH
        swapf   STATUS_TEMP, W
        movwf   STATUS
        swapf   (Common_RAM + 15), F
        swapf   (Common_RAM + 15), W
        retfie

byte_arrived:
        bcf     PCLATH, 3
        goto    byte_arrived2

timer_interrupt:
        bcf     PCLATH, 3
        goto    timer_interrupt2

function_ATE0:
        SETPC
        dt      &amp;quot;ATE0\r&amp;quot;, 0

function_ATCREG:        ; registration status
        SETPC
        dt      &amp;quot;AT+CREG?\r&amp;quot;, 0

function_ATCMGF:        ; SMS text mode
        SETPC
        dt      &amp;quot;AT+CMGF=1\r&amp;quot;, 0

function_ATCMGD:        ; delete SMS
        SETPC
        dt      &amp;quot;AT+CMGD=%d\r&amp;quot;, 0

function_ATCHFA:        ; set the audio channel to Half-Duplex
        SETPC
        dt      &amp;quot;AT+CHFA=1\r&amp;quot;, 0

function_ATCMIC:
        SETPC
        dt      &amp;quot;AT+CMIC=1,15\r&amp;quot;, 0

function_ATCLIP:
        SETPC
        dt      &amp;quot;AT+CLIP=1\r&amp;quot;, 0

function_ATCSCLK:
        ; enable the Serial Command Mode for SMS message waiting indications (SMS-CB)
        ; This command informs the module to send SMS-CB (Cell Broadcast) messages to the connected terminal.
        SETPC
        dt      &amp;quot;AT+CSCLK=1\r&amp;quot;, 0

function_ATA:
        SETPC
        dt      &amp;quot;ATA\r&amp;quot;, 0

function_ATH:
        SETPC
        dt      &amp;quot;ATH\r&amp;quot;, 0

function_ATCMGDC:       ; delete SMS
        SETPC
        dt      &amp;quot;AT+CMGD=%c\r&amp;quot;, 0

function_ATCBC:         ; report the battery charge status of the module
        SETPC
        dt      &amp;quot;AT+CBC\r&amp;quot;, 0

byte_arrived2:
        ; принятый ответ на AT-команду сохраняется в буфере:
        ; buffer[bufptr++] = RCREG;
        IFG     bufptr, BUFSZ, buffer_full
        movf    bufptr, W
        incf    bufptr, F
        addlw   buffer
        movwf   FSR

        ; Register Bank Select bit (used for indirect addressing)
        ; 0 = Bank 0, 1 (00h - FFh)
        bcf     STATUS, IRP

        ; источник зависаний
        ; правильный алгоритм работы с USART от Microchip см. в p16_tiri.asm
        btfss   PIR1, RCIF
        goto    $-1

        MOVFF   RCREG, INDF
        goto    the_end

buffer_full:
        ; источник зависаний
        btfss   PIR1, RCIF
        goto    $-1

        ; правильное поведение: при переполнении буфера лишние символы игнорируются
        movf    RCREG, W

the_end:
        ; ошибка, см. стр. 81 даташита
        ; Flag bit RCIF is a read-only bit, which is cleared by the hardware.
        bcf     PIR1, RCIF

        bcf     PCLATH, 3
        goto    restore

timer_interrupt2:
        btfsc   flags, FLAG_CALL
        incf    time_counter, F
        ; 1 = TMR1 register overflowed (must be cleared in software)
        bcf     PIR1, TMR1IF
        bcf     PCLATH, 3
        goto    restore

function_delay:

        MOVLF   delay_arg, FSR
        bcf     STATUS, IRP
        movf    INDF, W
        btfsc   STATUS, Z
        goto    label_015
label_011:
        MOVLF   1, (Common_RAM + 8)
label_012:
        MOVLF   191, (Common_RAM + 7)
        clrwdt
        decfsz  (Common_RAM + 7), F
        goto    $-2
        decfsz  (Common_RAM + 8), F
        goto    label_012
        MOVLF   74, (Common_RAM + 7)
        decfsz  (Common_RAM + 7), F
        goto    $-1
        nop
        clrwdt
        decfsz  INDF, F
        goto    label_011
label_015:
        retlw   0x00

function_blink:

        movf    blink_arg, F
        btfsc   STATUS, Z
        goto    label_016
        bcf     PORTA, LED
        BCF1    TRISA, LED
        DELAY   250
        BSF1    TRISA, LED
        DELAY   250
        decf    blink_arg, F
        goto    function_blink
label_016:
        retlw   0

; 1 - DTR pulse, 0 - DTR low
function_DTR:
        movf    dtr_arg, F
        btfss   STATUS, Z
        goto    label_017
        DTR0
        DELAY   50
        goto    label_018
label_017:
        DTRP
        Bank0
label_018:
        retlw   0

function_clear_buffer:

        clrf    bufptr
label_019:
        IFG     bufptr, BUFSZ, label_020
        movlw   buffer
        addwf   bufptr, W
        movwf   FSR
        bcf     STATUS, IRP
        clrf    INDF
        incf    bufptr, F
        goto    label_019
label_020:
        clrf    bufptr
        retlw   0

start:
        ; To allow the bit rate to be synchronized simply issue an &amp;quot;AT&amp;quot; or &amp;quot;at&amp;quot; string.
        ; This is necessary when you start up the module while autobauding is enabled
        call    function_clear_buffer
        SEND    &amp;#x27;A&amp;#x27;
        SEND    &amp;#x27;T&amp;#x27;
        SEND    &amp;#x27;\r&amp;#x27;
        call    function_clear_buffer

        LDELAY  2, a

        ; кривая проверка на &amp;quot;OK&amp;quot;
        IFEQ    buffer,     &amp;#x27;A&amp;#x27;, have_ok
        IFEQ    buffer + 2, &amp;#x27;O&amp;#x27;, have_ok

        MOVLF   FALSE, result
        goto    have_result
        ; unreachable code
        goto    have_result

have_ok:
        MOVLF   TRUE, result
        goto    have_result

have_result:
        bcf     PCLATH, 3
        goto    check_result

check_charger:
        BSF1    TRISB, CHARGER
        Bank0

        ; зарядка подключена?
        btfss   PORTB, CHARGER
        goto    no_charger

        movf    state, F
        btfss   STATUS, Z
        goto    check_battery

        ; передаем несколько раз &amp;quot;AT\r&amp;quot;
        clrf    a
send_at:
        IFG     a, 2, check_battery
        SEND    &amp;#x27;A&amp;#x27;
        SEND    &amp;#x27;T&amp;#x27;
        SEND    &amp;#x27;\r&amp;#x27;
        LDELAY  2, c
        incf    a, F
        goto    send_at

check_battery:
        ATCMDB   c, function_ATCBC, 7, 4

        ; +CBC: &amp;lt;battery connected status&amp;gt;, &amp;lt;battery charging_loop level&amp;gt;, &amp;lt;voltage&amp;gt;

        IFNE    buffer + 15, &amp;#x27;1&amp;#x27;, dont_blink
        BLINK   1
dont_blink:

        IFNE    buffer + 15, &amp;#x27;2&amp;#x27;, charger_disconnected

charging_loop:
        ; зацикливаемся на время зарядки
        BSF1    TRISB, CHARGER
        Bank0
        btfss   PORTB, CHARGER
        goto    charger_disconnected
        ; Для зарядки аккумулятора надо выключать устройство, подключить через
        ; шнур mini USB с соответствующему порту компьютера и дождаться
        ; постоянного горения светодиода.
        bcf     PORTA, LED
        BCF1    TRISA, LED
        DELAY   100
        goto    charging_loop

charger_disconnected:
        goto    charger_disconnected2

no_charger:
        BSF1    TRISA, LED
        Bank0

charger_disconnected2:
        bcf     PCLATH, 3
        goto    check_button

; Нажмите на кнопку и ждите короткой вспышки светодиода.
; Это означает, что контроллер обратил внимание на кнопку.
function_button:

        BSF1    TRISB, BUTTON
        Bank0
        btfsc   PORTB, BUTTON
        goto    label_048

        bcf     PORTA, LED
        BCF1    TRISA, LED
        DELAY   50
        BSF1    TRISA, LED
        DELAY   50
        BSF1    TRISB, BUTTON
        Bank0
        btfsc   PORTB, BUTTON
        goto    label_046

label_043:
        BSF1    TRISB, BUTTON
        Bank0
        btfsc   PORTB, BUTTON
        goto    label_045
        LDELAY  2, a
        goto    label_043

label_045:
        MOVLF   TRUE, button_state
        goto    exit_button
        goto    label_047

label_046:
        MOVLF   FALSE, button_state
        goto    exit_button

label_047:
        goto    exit_button

label_048:
        MOVLF   FALSE, button_state
        goto    exit_button

exit_button:
        retlw   0

function_SIM300D_power:

        bcf     PORTB, PWRKEY
        BCF1    TRISB, PWRKEY
        Bank0
        ; пауза
        clrf    c
label_050:
        IFG     c, 7, label_052
        LDELAY  2, d
        clrwdt
        incf    c, F
        goto    label_050
label_052:
        BSF1    TRISB, PWRKEY
        Bank0
        retlw   0x00

power_on_continue:
        clrf    a
        call    function_clear_buffer
        clrf    a

label_054:
        ; кривая проверка на &amp;quot;OK&amp;quot;
        IFEQ    buffer,     &amp;#x27;A&amp;#x27;, label_060
        IFEQ    buffer + 2, &amp;#x27;O&amp;#x27;, label_060
        IFNE    a, 7, label_055
        call    function_SIM300D_power
        clrf    a

label_055:
        call    function_clear_buffer
        SEND    &amp;#x27;A&amp;#x27;
        SEND    &amp;#x27;T&amp;#x27;
        SEND    &amp;#x27;\r&amp;#x27;
        call    function_clear_buffer
        LDELAY  2, c
        incf    a, F
        goto    label_054

label_060:
        call    function_clear_buffer
        ATCMDA  c, function_ATE0, 5, 2
        clrf    regcnt

network_registration_loop:
        ; регистрация в сети
        IFEQ    buffer + 11, &amp;#x27;1&amp;#x27;, registered
        IFNE    regcnt, 30, label_atcreg
        call    function_SIM300D_power
        clrf    regcnt
        goto    label_054

label_atcreg:
        incf    regcnt, F
        ATCMDA  c, function_ATCREG, 9, 2
        goto    network_registration_loop

registered:
        bcf     PCLATH, 3
        goto    after_registration

function_018:

        movf    arg2, W
        clrf    (Common_RAM + 8)
        subwf   arg1, W
        btfsc   STATUS, C
        goto    label_070
        MOVFF   arg1, (Common_RAM + 7)
        goto    label_072

label_070:
        clrf    (Common_RAM + 7)
        MOVLF   8, j

label_071:
        rlf     arg1, F
        rlf     (Common_RAM + 7), F
        movf    arg2, W
        subwf   (Common_RAM + 7), W
        btfsc   STATUS, C
        movwf   (Common_RAM + 7)
        rlf     (Common_RAM + 8), F
        decfsz  j, F
        goto    label_071

label_072:
        retlw   0

itoa:
        ; преобразование числа в строку
        movlw   &amp;#x27; &amp;#x27;
        btfss   cmgd_arg2, 4
        MOVLF   &amp;#x27;0&amp;#x27;, itoabuf0
        MOVFF   cmgd_arg1, (Common_RAM + 7)
        btfss   cmgd_arg1, 7
        goto    label_074
        comf    (Common_RAM + 7), F
        incf    (Common_RAM + 7), F
        MOVFF   (Common_RAM + 7), cmgd_arg1
        MOVLF   &amp;#x27;-&amp;#x27;, itoabuf0
        bsf     cmgd_arg2, 7

label_074:
        MOVFF   cmgd_arg1, arg1
        MOVLF   100, arg2
        call    function_018
        MOVFF   (Common_RAM + 7), cmgd_arg1
        movlw   &amp;#x27;0&amp;#x27;
        addwf   (Common_RAM + 8), W
        movwf   itoabuf1

        MOVFF   cmgd_arg1, arg1
        MOVLF   10, arg2
        call    function_018
        movlw   &amp;#x27;0&amp;#x27;
        addwf   (Common_RAM + 7), W
        movwf   itoabuf3
        movlw   &amp;#x27;0&amp;#x27;
        addwf   (Common_RAM + 8), W
        movwf   itoabuf2

        MOVFF   itoabuf0, (Common_RAM + 7)
        btfss   cmgd_arg2, 0x3
        goto    $+3
        btfss   cmgd_arg2, 0x7
        bcf     cmgd_arg2, 0x2

        btfsc   cmgd_arg2, 0x4
        goto    label_076
        btfss   cmgd_arg2, 0x7
        goto    label_078
        btfsc   cmgd_arg2, 0x2
        goto    label_078
        MOVFF   (Common_RAM + 7), itoabuf1
        btfsc   cmgd_arg2, 0x1
        goto    label_078
        MOVFF   (Common_RAM + 7), itoabuf2
        goto    label_078

label_076:
        movlw   &amp;#x27;0&amp;#x27;
        subwf   itoabuf1, W
        btfss   STATUS, Z
        goto    label_078
        MOVFF   (Common_RAM + 7), itoabuf1
        MOVLF   &amp;#x27; &amp;#x27;, itoabuf0
        btfss   cmgd_arg2, 0x3
        goto    label_077
        bcf     cmgd_arg2, 0x2
        bsf     cmgd_arg2, 0x1
        btfss   cmgd_arg2, 0x7
        bcf     cmgd_arg2, 0x1

label_077:
        movlw   &amp;#x27;0&amp;#x27;
        subwf   itoabuf2, W
        btfss   STATUS, Z
        goto    label_078
        MOVFF   (Common_RAM + 7), itoabuf2
        MOVLF   &amp;#x27; &amp;#x27;, itoabuf1
        btfss   cmgd_arg2, 0x3
        goto    label_077
        bcf     cmgd_arg2, 0x1
        btfss   cmgd_arg2, 0x7
        bcf     cmgd_arg2, 0x0

label_078:
        btfss   cmgd_arg2, 0x2
        goto    label_080
        SENDF   itoabuf0

label_080:
        btfss   cmgd_arg2, 0x1
        goto    label_082
        SENDF   itoabuf1

label_082:
        btfss   cmgd_arg2, 0x0
        goto    label_084
        SENDF   itoabuf2

label_084:
        SENDF   itoabuf3
        bcf     PCLATH, 3
        goto    return_from_itoa

remove_all_sms:
        ATCMDB   d, function_ATCMGF, 10, 2
        MOVLF   1, i
delete_next:
        IFG     i, 19, delete_done
        call    function_clear_buffer
        TXSTR   d, function_ATCMGD, 8
        MOVFF   i, cmgd_arg1
        MOVLF   31, cmgd_arg2
        goto    itoa
return_from_itoa:
        SEND    &amp;#x27;\r&amp;#x27;
        LDELAY  2, d
        incf    i, F
        goto    delete_next

delete_done:
        ATCMDB   d, function_ATCHFA, 10, 2
        ATCMDB   d, function_ATCMIC, 13, 2
        ATCMDB   d, function_ATCLIP, 10, 2
        ATCMDB   d, function_ATCSCLK, 11, 2

        bcf     PCLATH, 3
        goto    ready

ringing:
        clrf    quotes
        clrf    i

parse_call_info:
        ; +CLIP: &amp;quot;number&amp;quot;, &amp;quot;type&amp;quot;, &amp;quot;alphaId&amp;quot;
        IFEQ    quotes, 5, parse_call_done
        movlw   buffer
        addwf   i, W
        movwf   FSR
        bcf     STATUS, IRP
        movf    INDF, W
        ; подсчет количества кавычек
        sublw   &amp;#x27;\&amp;quot;&amp;#x27;
        btfsc   STATUS, Z
        incf    quotes, F
        incf    i, F
        goto    parse_call_info
        ; выход за пределы буфера не проверяется!

parse_call_done:
        MOVFF   i, namepos
        clrf    i

        ; memmove(buffer, buffer + namepos, BUFSZ + 1 - namepos)
movename:
        ; end of buffer?
        movf    namepos, W
        ; W = BUFSZ + 1 - namepos
        sublw   BUFSZ + 1
        ; W = i - (BUFSZ + 1 - namepos)
        subwf   i, W
        btfsc   STATUS, C
        goto    check_callee

        ; clipptr = &amp;amp;buffer[i]
        movlw   buffer
        addwf   i, W
        movwf   clipptr

        ; select Bank 2, 3 if clipptr &amp;gt; 0xff?
        clrf    highbanks
        btfsc   STATUS, C
        incf    highbanks, F

        ; FSR = &amp;amp;buffer[namepos + i]
        movf    namepos, W
        addwf   i, W
        addlw   buffer
        movwf   FSR

        ; itoabuf0 = buffer[namepos + i]
        bcf     STATUS, IRP
        MOVFF   INDF, itoabuf0

        ; FSR = clipptr = buffer + i
        MOVFF   clipptr, FSR
        ; 1 = Bank 2, 3 (100h - 1FFh)
        bcf     STATUS, IRP
        btfsc   highbanks, 0
        bsf     STATUS, IRP

        ; buffer[i] = buffer[i + namepos]
        MOVFF   itoabuf0, INDF

        incf    i, F
        goto    movename

check_callee:
        clrf    c

        ; проверка имени контакта на SIM карте (Ph1)
        IFNE    buffer, &amp;#x27;P&amp;#x27;, label_ATH
        IFNE    buffer + 1, &amp;#x27;h&amp;#x27;, label_ATH
        IFNE    buffer + 2, &amp;#x27;1&amp;#x27;, label_ATH

        ; очистить счетчик времени соединения
        clrf    time_counter

        ; принять звонок
        ATCMDB   d, function_ATA, 4, 2

        ; активен звонок
        bsf     flags, FLAG_CALL

        ; чтение счетчика удачных соединений из EEPROM
        MOVLF1  EEPROM_CALLS_COUNTER, EEADR

        bcf     EECON1, 7       ; Unimplemented
        bsf     EECON1, RD
        movf    EEDATA, W
        Bank0
        ; увеличение на единицу
        movwf   calls_counter
        incf    calls_counter, F
        ; запись нового значения
        MOVLF1  EEPROM_CALLS_COUNTER, EEADR
        Bank0
        movf    calls_counter, W
        Bank1
        movwf   EEDATA
        bsf     EECON1, WREN
        Bank0
        MOVFF   INTCON, INTCON_TEMP
        bcf     INTCON, GIE
        Bank1
        ; Flash programming unlock sequence
        MOVLF   0x55, EECON2
        MOVLF   0xaa, EECON2
        bsf     EECON1, WR
        btfsc   EECON1, WR
        goto    $-1
        bcf     EECON1, WREN

        movf    INTCON_TEMP, W
        Bank0
        iorwf   INTCON, F
        goto    label_121

label_ATH:
        TXSTR   d, function_ATH, 4

label_121:
        LDELAY  2, d
        bcf     PCLATH, 3
        goto    not_a_ring

sms_received:
        ; пришло СМС
        clrf    dtr_arg
        call    function_DTR
        clrf    commaptr
find_comma:
        movlw   buffer
        addwf   commaptr, W
        movwf   FSR
        bcf     STATUS, IRP
        IFEQ    INDF, &amp;#x27;,&amp;#x27;, comma_found
        incf    commaptr, F
        goto    find_comma

comma_found:
        ; пропустить запятую
        movlw   1
        addwf   commaptr, W
        ; номер слота СМС после запятой
        movwf   slotptr
        movlw   buffer
        addwf   slotptr, W
        movwf   FSR
        bcf     STATUS, IRP

        MOVFF   INDF, sms_slot

        ; Команды отсылаются с телефона хозяина, все “чужие” смс просто удаляются.

        ; В демонстрационной версии отсутствует код чтения СМС и выполнения команды.
        ; Надеюсь, в полной версии номер отправителя проверяется?

        ; ...


        call    function_clear_buffer

        ; удаляем СМС
        TXSTR   tmp4, function_ATCMGDC, 8
        SENDF   sms_slot
        SEND    &amp;#x27;\r&amp;#x27;
        LDELAY  2, 102
        MOVLF   1, dtr_arg
        call    function_DTR
        bcf     PCLATH, 3
        goto    not_a_sms

reset_vector:

        clrf    FSR

        ; очистить IRP, RP1, RP0 - Bank0
        bcf     STATUS, IRP
        movlw   ~((1 &amp;lt;&amp;lt; IRP) | (1 &amp;lt;&amp;lt; RP1) | (1 &amp;lt;&amp;lt; RP0))
        andwf   STATUS, F

        ; INTOSC oscillator frequency: 1 = 4 MHz typical
        BSF1    PCON, OSCF
        ; Bank1

        ; Baud Rate Generator Register (BRGH = 1):
        MOVLF   (F_OSC / BAUD / 16 - 1), SPBRG

        ; CSRC: Clock Source Select bit
        ; Synchronous mode: 1 = Master mode (Clock generated internally from BRG)
        ; TXEN: Transmit Enable bit
        ; BRGH: High Baud Rate Select bit
        ; TRMT: Transmit Shift Register STATUS bit: 1 = TSR empty
        MOVLF   (1 &amp;lt;&amp;lt; CSRC) | (1 &amp;lt;&amp;lt; TXEN) | (1 &amp;lt;&amp;lt; BRGH) | (1 &amp;lt;&amp;lt; TRMT), TXSTA

        ; SPEN: Serial Port Enable bit
        ; CREN: Continuous Receive Enable bit
        MOVLF0  (1 &amp;lt;&amp;lt; SPEN) | (1 &amp;lt;&amp;lt; CREN), RCSTA
        ; Bank0

        ; Comparators Off
        MOVLF   (1 &amp;lt;&amp;lt; CM2) | (1 &amp;lt;&amp;lt; CM1) | (1 &amp;lt;&amp;lt; CM0), CMCON

        clrf    bufptr
        MOVLF   STATE_RESET, state
        bcf     flags, FLAG_CALL

        ; T0CS: TMR0 Clock Source Select bit
        ; T0SE: TMR0 Source Edge Select bit
        ; PSA: Prescaler Assignment bit: 1 = Prescaler is assigned to the WDT
        ; PS2:PS0: Prescaler Rate Select bits
        ; TMR0 Rate 1:256 WDT Rate 1:128
        Bank1
        movf    OPTION_REG, W
        andlw   ~((1&amp;lt;&amp;lt;T0CS)|(1&amp;lt;&amp;lt;T0SE)|(1&amp;lt;&amp;lt;PSA)|(1&amp;lt;&amp;lt;PS2)|(1&amp;lt;&amp;lt;PS1)|(1&amp;lt;&amp;lt;PS0))
        movwf   OPTION_REG

        ; см. 6.3.1 SWITCHING PRESCALER ASSIGNMENT на стр. 39 даташита
        MOVLF   (1&amp;lt;&amp;lt;PSA)|(1&amp;lt;&amp;lt;PS2)|(1&amp;lt;&amp;lt;PS1)|(1&amp;lt;&amp;lt;PS0), (Common_RAM + 7)

        movlw   7
        Bank0
        clrf    TMR0

        MOVLF   OPTION_REG, FSR
        bcf     STATUS, IRP
        movf    INDF, W
        andlw   ~((1 &amp;lt;&amp;lt; PSA) | (1 &amp;lt;&amp;lt; PS2) | (1 &amp;lt;&amp;lt; PS1) | (1 &amp;lt;&amp;lt; PS0))
        iorlw   (1 &amp;lt;&amp;lt; PS2) | (1 &amp;lt;&amp;lt; PS1) | (1 &amp;lt;&amp;lt; PS0)
        movwf   INDF

        clrwdt

        movf    INDF, W
        andlw   ~(1 &amp;lt;&amp;lt; PSA)
        btfsc   (Common_RAM + 7), (1 &amp;lt;&amp;lt; PS1) | (1 &amp;lt;&amp;lt; PS0)
        andlw   ~((1 &amp;lt;&amp;lt; PSA) | (1 &amp;lt;&amp;lt; PS2) | (1 &amp;lt;&amp;lt; PS1) | (1 &amp;lt;&amp;lt; PS0))
        iorwf   (Common_RAM + 7), W
        movwf   INDF

        MOVLF   0x80|(1&amp;lt;&amp;lt;T1CKPS1)|(1&amp;lt;&amp;lt;T1CKPS0)|(1&amp;lt;&amp;lt;NOT_T1SYNC)|(1&amp;lt;&amp;lt;TMR1ON), T1CON
        MOVLF   0, (Common_RAM + 8)
        movwf   T2CON

        ; Timer2 Period Register
        MOVLF1  0, PR2

        ; ?
        ; Comparators Off
        MOVLF0  (1 &amp;lt;&amp;lt; CM2) | (1 &amp;lt;&amp;lt; CM1) | (1 &amp;lt;&amp;lt; CM0), CMCON

        ; ?
        Bank1
        movf    PORTA, W

        clrwdt
        MOVLF   2, k
short_delay:
        decfsz  k, F
        goto    short_delay
        goto    $+1

        ; ?
        Bank0
        movf    CMCON, W

        ; Clear pending interrupts
        ; CMIF: Comparator Interrupt Flag bit: 0 = Comparator output has not changed
        bcf     PIR1, CMIF

        Bank1
        clrf    CMCON

        ; разрешить прерывания от таймера и последовательного порта
        bsf     PIE1, TMR1IE
        bsf     PIE1, RCIE

        ; GIE: Global Interrupt Enable bit
        ; PEIE: Peripheral Interrupt Enable bit
        movlw   (1 &amp;lt;&amp;lt; GIE) | (1 &amp;lt;&amp;lt; PEIE)
        Bank0
        iorwf   INTCON, F

        ; OSCF: INTOSC oscillator frequency: 1 = 4 MHz typical
        BSF1    PCON, OSCF

        bsf     PORTA, LED
        bsf     PORTB, CHARGER

        MOVLF   EEPROM_CALLS_COUNTER, EEADR
        bcf     EECON1, 7       ; Unimplemented
        bsf     EECON1, RD
        IFNE    EEDATA, 0xff, check_calls_counter

        ; инициализация счетчика удачных соединений (демо-прошивка)
        MOVLF   EEPROM_CALLS_COUNTER, EEADR
        clrf    EEDATA
        bsf     EECON1, WREN
        Bank0
        MOVFF   INTCON, INTCON_TEMP
        bcf     INTCON, GIE
        Bank1
        ; Flash programming unlock sequence
        MOVLF   0x55, EECON2
        MOVLF   0xaa, EECON2
        bsf     EECON1, WR
        btfsc   EECON1, WR
        goto    $-1
        bcf     EECON1, WREN
        movf    INTCON_TEMP, W
        Bank0
        iorwf   INTCON, F
        Bank1

check_calls_counter:
        ; проверка счетчика звонков
        MOVLF   EEPROM_CALLS_COUNTER, EEADR
        bcf     EECON1, 7       ; Unimplemented
        bsf     EECON1, RD
        ; достигли максимального количества звонков для свободной версии?
        IFNE    EEDATA, MAX_CALLS, have_free_calls
        ; достигли - зацикливаемся
        BLINKP  5
        LDELAY  6, a
        Bank1
        goto    check_calls_counter

have_free_calls:
        ; еще не достигли
        bcf     OPTION_REG, NOT_RBPU    ; PORTB Pull-up Enable bit

        Bank0
        clrf    dtr_arg
        call    function_DTR

label_138:
        movf    state, W
        sublw   STATE_RESET
        btfss   STATUS, Z
        goto    bad_result
        goto    start

check_result:
        movf    result, F
        btfss   STATUS, Z
        goto    good_result
        clrf    state
        goto    bad_result

good_result:
        MOVLF   STATE_READY, state

bad_result:
        BSF1    OPTION_REG, NOT_RBPU    ; PORTB Pull-up Enable bit
        Bank0

        goto    check_charger

check_button:
        BCF1    OPTION_REG, NOT_RBPU    ; PORTB Pull-up Enable bit
        Bank0

        movf    state, F
        btfss   STATUS, Z
        goto    label_147
        ; state == STATE_OFF

        call    function_button
        movf    button_state, F
        btfss   STATUS, Z
        goto    power_on

        sleep
        goto    go_sleep2

power_on:
        ; Затем после того как вы отпустите он моргнет один раз – это означает
        ; что начался процесс включения модуля.
        DTR0
        BLINKP  1
        goto    power_on_continue

after_registration:
        ; Затем светодиод моргнет два раза – это означает что модуль
        ; настроен и зарегистрировался в сети GSM.
        BLINK   2
        goto    remove_all_sms

ready:
        ; После того как светодиод моргнет три раза – устройство готово к работе.
        ; Устройство перейдет в режим сна и будет ждать входящего звонка.
        BLINK   3
        DTRP
        MOVLF0  STATE_READY, state

go_sleep2:
        goto    go_sleep

label_147:
        call    function_button
        movf    (Common_RAM + 8), F
        btfss   STATUS, Z
        goto    power_off

        call    function_clear_buffer
        LDELAY  2, a

        ; &amp;quot;RING&amp;quot;
        IFNE    buffer + 2, &amp;#x27;R&amp;#x27;, not_a_ring
        IFEQ    buffer + 3, &amp;#x27;I&amp;#x27;, ringing

not_a_ring:
        ; пришло SMS
        ; &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;+CMTI: &amp;lt;mem&amp;gt;,&amp;lt;n&amp;gt;&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;
        ; value of mem is the storage location where the sms was stored.
        ; Usually its value is SM, which stands for SIM memory.
        ; the value of n is the sms slot on which the incoming message was stored
        IFNE    buffer + 2, &amp;#x27;+&amp;#x27;, not_a_sms
        IFNE    buffer + 3, &amp;#x27;C&amp;#x27;, not_a_sms
        IFNE    buffer + 4, &amp;#x27;M&amp;#x27;, not_a_sms
        IFEQ    buffer + 5, &amp;#x27;T&amp;#x27;, sms_received

not_a_sms:
        btfss   flags, FLAG_CALL
        goto    check_calls_counter2

        ; проверка максимальной длительности соединения
        IFL     time_counter, MAX_TIME, check_calls_counter2

        clrf    dtr_arg
        call    function_DTR

        bcf     flags, FLAG_CALL
        clrf    time_counter

        ; положить трубку
        ATCMDB   a, function_ATH, 4, 2

        MOVLF   1, dtr_arg
        call    function_DTR

check_calls_counter2:
        ; проверка счетчика удачных соединений (демо-прошивка)
        MOVLF1  EEPROM_CALLS_COUNTER, EEADR
        bcf     EECON1, 7
        bsf     EECON1, RD
        ; достигли максимума?
        IFNE    EEDATA, MAX_CALLS, have_free_calls2
        ; лимит исчерпан
        BLINKP  5
        ; сбрасываем звонок
        TXSTR   a, function_ATH, 4
        LDELAY  6, a
        ; зацикливаемся
        goto    check_calls_counter2
        Bank1

have_free_calls2:
        Bank0
        goto    label_138
        ; unreachable code
        goto    go_sleep

power_off:
        ; Выключение происходит как и включение.
        ; Нажмите на кнопку и держите покуда не моргнет светодиод, как отпустите
        ; он моргнет 2 раза. Это означает, что девайс выключен.
        BLINK   2
        call    function_SIM300D_power
        clrf    state

go_sleep:
        sleep

        end
&lt;/pre&gt;
  &lt;p id=&quot;K7eZ&quot;&gt;Если найдете ошибку, напишите в комментариях.&lt;/p&gt;
  &lt;p id=&quot;fzTE&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;P09k&quot;&gt;&lt;strong&gt;Подпишитесь на блог&lt;/strong&gt;, чтобы узнавать о новых статьях сразу.&lt;/p&gt;
  &lt;p id=&quot;xZw7&quot;&gt;&lt;a href=&quot;/@badradio&quot;&gt;Все статьи →&lt;/a&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;DnXR&quot; data-align=&quot;center&quot;&gt;© Copyright 2025 Badradio. All rights reserved.&lt;br /&gt;Все права защищены. Копирование материалов сайта запрещено.&lt;br /&gt;При цитировании ставить кликабельную ссылку на первоисточник.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>badradio:backup</id><link rel="alternate" type="text/html" href="https://teletype.in/@badradio/backup?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=badradio"></link><title>Что делать, когда этот блог удалят, или как цензура стала невозможной</title><published>2025-11-30T14:02:25.785Z</published><updated>2026-02-13T13:36:10.965Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/6e/12/6e123c19-0b65-4238-8ecb-47baf49991ee.png"></media:thumbnail><category term="chempiony-sredi-oshibok" label="Чемпионы среди ошибок"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/8a/12/8a123625-c834-4fb8-9310-f2f7a613e259.jpeg&quot;&gt;Цензура запрещается. — Статья 29 Конституции РФ. Но закон дает только право на свободу слова, возможность дают описанные в статье средства.</summary><content type="html">
  &lt;blockquote id=&quot;yhTP&quot;&gt;Цензура запрещается.&lt;br /&gt;— Статья 29 Конституции РФ&lt;/blockquote&gt;
  &lt;p id=&quot;2DKI&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;c0FP&quot;&gt;Как вы думаете, почему вам давно не попадались &lt;strong&gt;оригинальные&lt;/strong&gt; мысли очевидцев, любительские фото и видео с места важных событий?&lt;/p&gt;
  &lt;p id=&quot;Clbg&quot;&gt;Потому что действует драконовская цензура!&lt;/p&gt;
  &lt;p id=&quot;HiQt&quot;&gt;Закон дает только &lt;strong&gt;право&lt;/strong&gt; на свободу слова, а &lt;strong&gt;возможность&lt;/strong&gt; дают описанные в статье средства.&lt;/p&gt;
  &lt;figure id=&quot;25Lk&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8a/12/8a123625-c834-4fb8-9310-f2f7a613e259.jpeg&quot; width=&quot;1024&quot; /&gt;
    &lt;figcaption&gt;Свобода слова, пожираемая гнусными тараканами цензуры Google, YouTube и Facebook&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0Lhy&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;GPfn&quot;&gt;Для начала примерная схема цензуры на 2025 год:&lt;/h2&gt;
  &lt;p id=&quot;51rb&quot;&gt;&lt;/p&gt;
  &lt;ol id=&quot;THqj&quot;&gt;
    &lt;li id=&quot;K1GM&quot;&gt;Теневой &lt;strong&gt;бан в поисковых системах&lt;/strong&gt; — ваш сайт или комментарий просто не индексируется (или даже не показывается, как сделано в Reddit).&lt;/li&gt;
    &lt;li id=&quot;Iws3&quot;&gt;Катастрофа для свободы слова — &lt;strong&gt;гиганты&lt;/strong&gt; вроде YouTube, Facebook, Reddit и еще одна, упоминать которую здесь нельзя (признаны или будут признаны экстремистскими организациями, деятельность на территории России запрещена).&lt;/li&gt;
    &lt;li id=&quot;zKh0&quot;&gt;Все платформы и сервисы, требующие привязки к &lt;strong&gt;телефону&lt;/strong&gt; — вменяемых пользователей это отпугивает, кроме того они стимулируют &lt;strong&gt;самоцензуру&lt;/strong&gt;.&lt;/li&gt;
    &lt;li id=&quot;hKbu&quot;&gt;Несколько тысяч &lt;strong&gt;«новостных» говносайтов&lt;/strong&gt;, копирующих одну и ту же ерунду друг у друга. «Эксперт...», «сообщил...», «запретил...» — жвачка для умственно отсталых.&lt;/li&gt;
    &lt;li id=&quot;DGHx&quot;&gt;Продажные «&lt;a href=&quot;https://teletype.in/@badradio/radiokot.ru&quot; target=&quot;_blank&quot;&gt;форумы&lt;/a&gt;», сайты с «честными» отзывами и прочие маргинальные ресурсы. За редким исключением, содержатся &lt;strong&gt;дятлами&lt;/strong&gt;, ценные комментарии исчезают со скоростью света.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;h3EZ&quot;&gt;Итог: с одной стороны — «новостные» ссайты, созданные для таких плохих целей, что о них и писать нельзя; с другой — коммерческие сайты, где запрещено критиковать, чтобы не мешать продажам.&lt;/p&gt;
  &lt;p id=&quot;yuYf&quot;&gt;Плюс блокировки по IP, удаление комментариев, теневые баны, бесконечные капчи и непревзойденная фраза «что-то пошло не так».&lt;/p&gt;
  &lt;p id=&quot;kCEA&quot;&gt;В результате у правды не было бы шансов, если бы не существовало альтернативное средство...&lt;/p&gt;
  &lt;p id=&quot;PDvk&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Ak77&quot;&gt;Оказывается, текст статьи можно сохранить в блокчейне!&lt;/h2&gt;
  &lt;p id=&quot;CGB9&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;v6BS&quot;&gt;Статью блога можно поместить в комментарий к маленькому денежному переводу. После этого ее невозможно удалить, т.к. она будет храниться на миллионах компьютеров по всему миру. Анонимность такая же, как у используемой вами VPN. Денежный перевод элегантно решает проблему спама и платы за хранение информации:&lt;/p&gt;
  &lt;figure id=&quot;2K74&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/y_6Hsl-Qv2U?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
    &lt;figcaption&gt;How to Store A Text Message on the Ethereum Blockchain - Censorship Resistant - Cryptobulls &lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;QkYG&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;bxqi&quot;&gt;Подводя итог, когда этот блог удалят, &lt;strong&gt;ищите новые статьи где-то в блокчейне Ethereum!&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;wgYF&quot;&gt;А пока добавьте в закладки еще несколько запасных аэродромов:&lt;/p&gt;
  &lt;p id=&quot;Zu9s&quot;&gt;&lt;a href=&quot;https://badradio.noblogs.org&quot; target=&quot;_blank&quot;&gt;https://badradio.noblogs.org&lt;/a&gt; (скоро появится)&lt;/p&gt;
  &lt;p id=&quot;1M3x&quot;&gt;&lt;a href=&quot;https://thro.be/design-flaw-in-the-super-pulse-srt-sp-covert-listening-devic-19700101010001692c246a6d1c7&quot; target=&quot;_blank&quot;&gt;https://thro.be/design-flaw-in-the-super-pulse-srt-sp-covert-listening-devic-19700101010001692c246a6d1c7&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;cqQV&quot;&gt;&lt;a href=&quot;https://web.archive.org/web/20251001114406/http://teletype.in/@badradio&quot; target=&quot;_blank&quot;&gt;https://web.archive.org/web/20251001114406/http://teletype.in/@badradio&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;0uYy&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;wwFl&quot;&gt;Подписывайтесь, чтобы бороться и побеждать &lt;a href=&quot;https://teletype.in/@badradio/plagiat&quot; target=&quot;_blank&quot;&gt;говносайты&lt;/a&gt; вместе!&lt;/p&gt;

</content></entry></feed>