My Feed Title My Feed Description 2021-03-18T15:48:30+03:00 AlexBR https://putey.net/ etherpad - установка на CentOS7 + Kloxo https://putey.net/post/etherpad-ustanovka-na-centos7-kloxo 2021-03-18T15:48:30+03:00 2021-03-18T15:48:30+03:00

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

Первоначально в панели Kloxo необходимо создать клиента с доменом. Пусть это будет пользователь: black

Его домашний каталог: /home/black

Далее установка программного комплекса etherpad.

sudo curl -sL https://rpm.nodesource.com/setup_14.x | sudo -E bash -
sudo yum install -y nodejs
sudo node --version

git clone --branch master https://github.com/ether/etherpad-lite.git
cd etherpad-lite
src/bin/run.sh

остановить приложение

далее в папке /home/black/etherpad-lite

npm install socket.io-client

npm install ep_hash_auth ep_headings2 ep_markdown ep_comments_page ep_align ep_font_color ep_embedded_hyperlinks2 ep_font_size ep_table_of_contents ep_author_hover ep_set_title_on_pad ep_subscript_and_superscript ep_image_upload ep_code_formatting ep_clear_formatting ep_copy_paste_select_all ep_font_family ep_show_whitespace ep_mathjax ep_aa_file_menu_toolbar ep_special_characters ep_author_follow ep_adminpads2 ep_pad-lister ep_prompt_for_name ep_search  ep_authornames ep_print ep_tables4

npm install ep_password_change

убрать из файла etherpad-lite/node_modules/ep_password_change/package.json зависимость, заменить на

"dependencies": {},

из-за этой зависимости у меня не хотел работать плагин ep_auth_hash.

выйти в домашний каталог cd ~ и создать папку mkdir clone, перейти в новую созданную папку cd clone и выполнить команды:

git clone https://github.com/BayRepoOrg/ep_pad-lister.git
git clone https://github.com/BayRepoOrg/ep_password_change.git

далее скопировать файлы:

cp /home/black/clone/ep_pad-lister/index.js /home/black/etherpad-lite/node_modules/ep_pad-lister/index.js
cp /home/black/clone/ep_password_change/index.js /home/black/etherpad-lite/node_modules/ep_password_change/index.js

без этих двух правок etherpad зависал при старте.

и запустить программу:

src/bin/run.sh

теперь приложение должно успешно запуститься. Опять остановить его.

добавить файл настроек /home/black/etherpad-lite/settings.jsonс содержимым:

/*
 * This file must be valid JSON. But comments are allowed
 *
 * Please edit settings.json, not settings.json.template
 *
 * Please note that starting from Etherpad 1.6.0 you can store DB credentials in
 * a separate file (credentials.json).
 *
 *
 * ENVIRONMENT VARIABLE SUBSTITUTION
 * =================================
 *
 * All the configuration values can be read from environment variables using the
 * syntax "${ENV_VAR}" or "${ENV_VAR:default_value}".
 *
 * This is useful, for example, when running in a Docker container.
 *
 * EXAMPLE:
 *    "port":     "${PORT:9001}"
 *    "minify":   "${MINIFY}"
 *    "skinName": "${SKIN_NAME:colibris}"
 *
 * Would read the configuration values for those items from the environment
 * variables PORT, MINIFY and SKIN_NAME.
 *
 * If PORT and SKIN_NAME variables were not defined, the default values 9001 and
 * "colibris" would be used.
 * The configuration value "minify", on the other hand, does not have a
 * designated default value. Thus, if the environment variable MINIFY were
 * undefined, "minify" would be null.
 *
 * REMARKS:
 * 1) please note that variable substitution always needs to be quoted.
 *
 *    "port":     9001,            <-- Literal values. When not using
 *    "minify":   false                substitution, only strings must be
 *    "skinName": "colibris"           quoted. Booleans and numbers must not.
 *
 *    "port":     "${PORT:9001}"   <-- CORRECT: if you want to use a variable
 *    "minify":   "${MINIFY:true}"     substitution, put quotes around its name,
 *    "skinName": "${SKIN_NAME}"       even if the required value is a number or
 *                                     a boolean.
 *                                     Etherpad will take care of rewriting it
 *                                     to the proper type if necessary.
 *
 *    "port":     ${PORT:9001}...
]]>
Разбор схемы Sven VR V600. Часть 2 https://putey.net/post/razbor-skhemy-sven-vr-v600-chast-2 2021-03-02T14:46:13+03:00 2021-03-02T14:46:13+03:00

В прошлой статье, была тщательно разобрана схема стабилизатора VR V600.

Разобраны три режима стабилизации, разобраны в каком положении должны быть перемычки реле, для повышения, понижения напряжения или вообще работы без стабилизации.

Напомню схемы положения перемычек для разных режимов.

Повышающий режим:

Понижающий режим

Без стабилизации

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

Наиболее близкий контроллер по ножкам - это AVR Attiny26L, который был в наличии. Но нужна была схема-переходник. Которая бы скоммутировала 20 ножек в 16, которые разведены на плате.

Плату решил не переделывать, добавить только переходник.

Вот такая схема получилась в KiCad:

На переходник кроме разводки площадок для Holtek, добавлены:

  • разъем для чтения того, что считывает микроконтроллер. По протоколу I2C
  • емкость 100 микро фарад, для сглаживания импульсо выбрасываемых реле,при переключении

Расшифровка названий разъемов:

  • TEMP ADC - вход на АЦП по считыванию температуры трансформатора
  • INL ADC - вход на АЦП с входной линии стабилизатора
  • OUT ADC - вход на АЦП с выходной линии стабилизатора
  • GND - земля
  • RL3 s/w - ножка управления реле 3
  • RL2 s/w - ножка управления реле 2
  • RL1 s/w - ножка управления реле 1
  • R/D s/w - ножка управления красным светодиодом
  • Y/D s/w - ножка управления жельым светодиодом
  • RESET - ножка сброса микроконтроллера
  • +5V - питание МК

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

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

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

Немного расскажу о измерении входного напряжения. В прошлой статье в видео, было описано, что напряжение на АЦП подается с делителя напряжения, который представлеят собой: диод - резистор 940 кило ом - точка снятия напряжения - резистор 10 килоом - земля. Т.е входное напряжение понижается в 94 раза, его и считывает АЦП и перобразует в цифру.

Учитывая наличие диода, отрицательная полуволна отрезается и определить величину входного напряжения представляется возможным только на положительной полуволне:

Синяя линия - это входное напряжение.

т.е 10 миллисекунд нужно точно ждать, дожидаясь появления положительной полуволны.

Далее я сделал алгоритм нахождения максимума на положительной полуволне:

#define UNDEF 15000

uint16_t getWaveMax(uint16_t in_data){
    if (!beg){
        if (in_data>V100 && !waveMax){
            waveMax = in_data;
            } else if (in_data>V100 && prevVal<=in_data){
            if (waveMax < in_data) waveMax = in_data;
            beg = 1;
            } else {
            waveMax = 0;
        }
        } else {
        if (waveMax<in_data){
            waveMax = in_data;
            } else {
            if (in_data<=V100){
                tmpMax = waveMax;
                waveMax = 0;
                beg = 0;
                prevVal = 0;
                return tmpMax;
            }
        }
    }
    prevVal = in_data;
    return UNDEF;
}

в алгоритме запоминается старое значение и манипуляции происходят с новым значением. Реакция начинается при достижении полуволны, некоего порога V100. Т.е окончательное решение микроконтроллером о значении входного напряжения будет принято только когда положительная полуволна уйдет в значение ниже V100. Т.е это еще примерно 7 миллисекунд. Итого время...

]]>
Разбор схемы Sven VR V600 https://putey.net/post/razbor-skhemy-sven-vr-v600 2021-01-06T18:31:02+03:00 2021-01-06T18:31:02+03:00

Разбор схемы стабилизатора напряжения Sven VR V600.

Отдали мне стабилизатор VR V600, он не работал корректно.

Причина выхода из строя так же была не известна.

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

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

Выпайка деталей по отдельности(навесных детаелй),показала, что все они работают исправно.

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

картинка в оригинальном разрешении

А так же протестировал работу трансформатора схемы. Вот какие результаты получились:

Повышающий режим:

Понижающий режим

Без стабилизации

И наконец как представлен сам трансформатор:

Значения катушек индуктивности:

Вывод - земля Значение на измерителе 1 Значение на измерителе 2
13.5 0.18mH 0.18mH
V1/V2 4320mH 1970mH
V3 5700mH 2440mH

И описание схемы:

Удалось определить, что на выходах АЦП, которые должны быть контроллерами напряжения схемы постоянно контроллером выдается 5В, т.е такое впечатление, что некорректно стал работать сам микроконтроллер.

У меня в арсенале нет Holtek микроконтроллеров, хочу попробовать заменить его на AVR.

Продолжение следует...

]]>
Электронная нагрузка на полевом транзисторе https://putey.net/post/elektronnaya-nagruzka-na-polevom-tranzistore 2020-12-18T17:20:12+03:00 2020-12-18T17:20:12+03:00

Нашел статью об организации электронной нагрузки на транзисторах.

Интересно было собрать и проверить как работает. В качетсве основных компонент использовался полевой транзистор IRL510 и операционный усилитель MCP6283, которые были в наличии.

Процесс моделирования в KTechLab, проверки на макетной плате представлен на видео ниже.

Для схемы так же была разработана плата в KiCAD и разработан корпус во FreeCAD для печати на 3D принтере. Так же видео содержит демонстрацию нагрузки на: 1) лабораторном блоке питания(max 2A); 2) батарейка типа крона; 3) пальчиковые батарейки AA и 4) недорогой универсальный блок питания с переключателем выходного напряжения

Исходные файлы для KiCAD можно скачать здесь: https://github.com/bayrepo/embedded_avr/tree/master/nomc/load/kicad/nagruzka Stl файлы для 3D печати можно скачать здесь: https://github.com/bayrepo/embedded_avr/tree/master/nomc/load/stl

Вот что получилось:

]]>
Keyes Q37 подключение https://putey.net/post/keyes-q37-podklyuchenie 2020-12-18T17:19:52+03:00 2020-12-18T17:19:52+03:00 Подключение модуля Keyes Q37, это слабомощный лазер, может использоваться как указка. В глаза светить нельзя!

Модуль лазера Keyes Q37 выполнен на основе маломощного лазерного излучателя, питается от напряжения 5 Вольт.

]]>
Управление серводвигателями на attiny13a https://putey.net/post/upravlenie-servodvigatelyami-na-attiny13a 2020-12-18T17:19:42+03:00 2020-12-18T17:19:42+03:00

Задача: организовать считывание положения джойстика KY-023, по оси X и Y. На основе считывания привести в движение сервомоторы SG90-9G.

В статье Радионабор 433МГц. Джойстик с радиопередатчиком была рассмотрена программа для attiny45. Микроконтроллер управлял такой конструкцией:

Сервоприводы управлялись удаленно, но по видео ниже видно, что движения резкие и очень тяжело подвести кронштейн к нужной позиции.

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

Схема подключения:

И как схема выглядит на макетной плате:

Теперь программная реализация.

Сервомотор управляется импульсом от 0.6 мс до 2.4 мс, частота следования импульсов - 20 мс. Импульс - 1.5 мс - это центральная позиция, 0.6 мс - это минус 90 градусов поворота, 2.4 мс - это 90 градусов поворота.

1-й способ реализации программы

В данной реализации программы микроконтроллер отслеживает значение потенциометров Х и Y, с помощью встроенных АЦП на ножках PB3 и PB4. Используется таймер 0 и его прерывания по переполнению.

Сам текст программы: по ссылке на github

Пояснения:

#define ADCTR 4

это число раз перечитывания значений с АЦП, т.к оно можетбыть не стабильным, то значение считывается 4 раза и результат усредняется.

uint16_t readADC(uint8_t adc_num){
    ADCSRA = _BV(ADEN) | _BV(ADPS1) | _BV(ADPS0);

Включение АЦП и перевод его в режим Devision factor = 8.

Далее инетерсный момент в этих числах:

#define MAGICK_NUMBER 38 //Number of ticks in 1ms
#define DOWNV 25
#define MAXIV 87

Что это такое - объяснение ниже. В данном случае активирован режим срабатывания прерывания по переполнению таймера ISR(TIM0_OVF_vect), деления на таймере никакого нет:

    TCCR0A = 0;
    TCCR0B = _BV(CS00);
    TCNT0 = 0;
    TIMSK0 = _BV(TOIE0);

т.е при работе контроллера на частоте 9600000 Гц, прерывание будет возникать:

\(\frac{9600000}{256}=37500\)

37500 прерываний в секунду, т.е 0.00002666 секунд интервал между прерываниями. Значит за одну милиссекунду произойдет

\(\frac{0.001}{0.0000266666}=38\)

38 прерываний. А вот и #define MAGICK_NUMBER 38, за 0.6 мс произойдет 22 прерывания (#define DOWNV 25, я добавил три тика, чтоб двигатель сильно не бился в крайние позиции) и за 2.4 мс произойдет 90 прерываний (#define MAXIV 87, так же уьрал 3 тика, по той же причине что описал выше).

Здесь происходит преобразование yTrn_tmp = Ry_coord * (MAXIV-DOWNV) / 1024; считанных с АЦП значений в масштаб импульса(т.е в число тиков).

\(NEW_VAL=DOWNV+\frac{(MAXIV-DOWNV)*ADC}{1024}=\frac{87-25}{1024}*ADC+22\)

87-25 * ADC при любом ADC поместится в uint16_t.

Пример работы на видео ниже.

Недостатки:

  • т.к положение джойстика указывает в какую позицию поврнуть сервомоторы, то любая флуктуация напряжения питания заставляет дрожать двигатели.(попытка избежать флуктуаций - это повторно перечитывание значений АЦП и усреднение, а так же процедура addelem, которая заносит новое значение в массив, выталкивая старое и усредняет текущее значение на основе старых данных)
  • невозможность зафиксировать двигатели в одной позиции(в алгоритме предусмотрено нажатие кнопки, которое дает 5 секунд. чтоб установить позицию двигателей и после чего координата перестает меняться, т.е замораживается)

2-й способ реализации программы

Здесь я пытался убрать недостаток 1 и 2 предыдущего метода.

Сам текст программы: по ссылке на github

В программе так же присутсвуют магические числа, описанные ранее, только число попыток перечитывания АЦП существенно увеличилось до 16. И появились новые:

#define ADC_C_LOW 500...
]]>
Определение нажатия кнопки контроллером AVR с помощью прерывания https://putey.net/post/opredelenie-nazhatiya-knopki-kontrollerom-avr-s-pomoshyu-preryvaniya 2020-12-18T17:19:10+03:00 2020-12-18T17:19:10+03:00

Я уже рассматривал в статьях ранее работу микроконтроллера с кнопками, где решалась проблема дребезга с помощью 74HC14.

Теперь попробую подобную кнопку, но без 74HC14 соединить с контроллером и обрабатывать нажатия кнопки с помощью прерывания.

Схема кнопки апаратно подавляет дребезг и представлена: 1) резистором 100К 2) резистором 10К 3) емкостью 100nF

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

Выход данной конструкции соединен с портом PD2 контроллера ATMega8, который настроен как вход.

Вот код обслуживающий прерывания от кнопки:

#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <string.h>

#define SetBit(x,y) (x|=(1<<y))
#define ClrBit(x,y) (x&=~(1<<y))
#define ToggleBit(x,y) (x^=(1<<y))
#define FlipBit(x,y) (x^=(1<<y)) // Same as ToggleBit.
#define TestBit(x,y) (x&(1<<y))

#define _BV(bit) (1 << (bit))

#define BUTTON_STOP_MOTOR PD2
#define MOTOR_STOP_LIGHT PC5

#define MOTO_FLAG _BV(0)
uint8_t button_flags = 0;

ISR(INT0_vect){
    button_flags = button_flags ^ 1;
}

uint8_t prev_flag = 0;

void doMotorLight(){
    if (prev_flag != button_flags){
        if (button_flags & MOTO_FLAG){
            SetBit(PORTC, MOTOR_STOP_LIGHT);
            } else {
            ClrBit(PORTC, MOTOR_STOP_LIGHT);
        }
        prev_flag = button_flags;
    }
}

int main(void)
{
    //включаем вход для чтения кнопки PD2
    ClrBit(DDRD, BUTTON_STOP_MOTOR);
    ClrBit(PORTD, BUTTON_STOP_MOTOR);
    //включаем выход, для управления диодом PC5
    SetBit(DDRC, MOTOR_STOP_LIGHT);
    PORTC = 0;
    prev_flag = button_flags;
    //Садим кнопку на прерывание
    SetBit(GICR, INT0);
    //Конфигурируем прерывание на переход 0->1
    MCUCR |= _BV(ISC01) | _BV(ISC00);
    sei();
    while (1)
    {
        doMotorLight();
        _delay_ms(20);
    }
}

Особого внимания заслуживает участок кода

  //Садим кнопку на прерывание
    SetBit(GICR, INT0);
    //Конфигурируем прерывание на переход 0->1
    MCUCR |= _BV(ISC01) | _BV(ISC00);
    sei();

Здесь активируется внешнее прерывание по линии INT0 и устанавливается поведение порта, т.е генерировать прерывание при переходе 0-1.

При желании это поведение можно изменить, сделать срабатывание на любое изменение уровня входящего сигнала.

При дететкте нажатия, через ножку PC5 диод загорается или гаснет.

Ниже приведен видеоотчет о работе схемы:

]]>
Микромир из вазы с водой https://putey.net/post/mikromir-iz-vazy-s-vodoi 2020-12-18T17:19:00+03:00 2020-12-18T17:19:00+03:00 Наконец-то удалось поймать коловратку.

Проста ваза с полевыми цветами оказалась домом для таких микросуществ как: коловратки, сувойки, туфельки-инфузории обычные и спиральные.

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

Известно около 1500 видов коловраток, в России — около 600 видов. В основном это пресноводные обитатели, но также они водятся в море и влажных почвах. Большинство коловраток свободноподвижные, но есть и прикреплённые формы. Подавляющее большинство видов свободноживущие, но встречаются также паразиты и комменсалы.

По размеру коловратки не превышают 2 мм (в среднем гораздо меньше). Представитель этого типа Ascomorpha minima — самое мелкое многоклеточное животное, размер его составляет около 40 микрон. В связи с малыми размерами ткани часто приобретают синцитиальное строение. Для типа в целом характерна эутелия — постоянство клеточного состава, то есть постоянное число клеток у всех особей одного вида. Некоторые коловратки способны впадать в криптобиоз.

]]>
Ошибки при разработке схемы. Дистанционный выключатель с таймером. https://putey.net/post/oshibki-pri-razrabotke-skhemy-nakazator 2020-12-18T17:18:50+03:00 2020-12-18T17:18:50+03:00

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

Задумка алгоритма

Устройство должно состоять из двух частей: 1-передатчик и 2-приемник. Данные по радиоканалу должны передаваться зашифрованными и если были записанными, то не могли быть многократно воспроизведены.

Передатчик

Состоит из двух тактовых кнопок и одного выклюателя, питается от 3-х батареек АА. Имеет один семисегментный индикатор, который показывает какую команду нужно передать. 1ая кнопка переключает последовательно доступные команды, 2ая кнопка осуществляет передачу. Расшифровка значения показания индикатора:

Символ Команда
включить питание на приемнике немедленно
сбросить таймер в 0 у текущего режима
включить питание и установить таймер на 10 минут(отключить питание по достижении значения)
включить питание и установить таймер на 20 минут(отключить питание по достижении значения)
включить питание и установить таймер на 30 минут(отключить питание по достижении значения)
включить питание и установить таймер на 40 минут(отключить питание по достижении значения)
включить питание и установить таймер на 50 минут(отключить питание по достижении значения)
включить питание и установить таймер на 60 минут(отключить питание по достижении значения)
включить питание и установить таймер на 70 минут(отключить питание по достижении значения)
включить питание и установить таймер на 80 минут(отключить питание по достижении значения)
включить питание и установить таймер на 90 минут(отключить питание по достижении значения)
отключить питание немедленно

При нажатии на творую кнопку, команда шифруется и отправляется на приемник.

Приемник

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

Алгоритм передатчика

Для передачи данных по воздуху используются FS1000A и XY-MK-5V, набор 433 МГц про который упоминается в предыдущей статье. А так же используется аналогичная библиотека ManchesterRF.c, но с изменениями для ATMega8, интервалы длинного и коротких периодов.

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

Вот код передатчика: исходный код

За один сеанс передаи передается 12 байт. Стурктура массива следующая:

  • 0-й байт - открытый ключ A(Alise) по алгоритму Диффи-Хелмана.
  • 1-й байт - индекс, с котрого в массиве наинаются полезные данные(их 4 байт)
  • ...
  • N-й полезный байт - секртеный идентификатор устройства
  • N+1й полезный байт - команда
  • N+2й полезный байт - младший байт счетчика сессии
  • N+3й полезный байт - старший байт счетчика сессии
  • ...

Публичный ключ от Боба (B) забит прямо в код передатчика, т.к. передающее устройство работает только в одну сторону

void sendMode(uint8_t command){
    ClearMessage(message, MESSAGE_LEN);
    SipherArray(message, MESSAGE_LEN, command);
    ManchesterRF_transmitArray(MESSAGE_LEN, message);
    if (!sesIdent) {
        ClearMessage(message, MESSAGE_LEN);
        SipherArray(message, MESSAGE_LEN, RESET_SESSION);
        ManchesterRF_transmitArray(MESSAGE_LEN, message);
    }
}

Если идентификатор сессии равен 0, то приемнику посылается команда RESET_SESSION, что заставлеят приемник сброситься, подать питание. При включении передатчика посылается команда RESET_SESSION, поэтому, если приемник не реагирует, то можно просто включить и выключить передатчик.

Схема передатчика получилась весьма простая и в проекте находится в папке KiCad.

С передатчиком все достаточно просто получилось.

Алгоритм приемника

А вот с приемником получились проблемы... Которые нужно учитывать...

]]>
Трюки при разработке и проектировании схем с микроконтроллерами AVR https://putey.net/post/tryuki-pri-razrabotke-i-proektirovanii-skhem-s-mikrokontrollerami-avr 2020-12-18T17:18:38+03:00 2020-12-18T17:18:38+03:00 Обзор двух способов:

  1. как развести дорожки печатной платы с помощью KiCAD 5+FreeRoute
  2. как эмулировать входной сигнал при отладке в симуляторе Atmel Studio

Видеошпаргалка, как сделать автоматическую трассировку в KiCad 5 + FreeRoute

Видеоинструкция о том как применять stimuli файл в среде Atmel Studio

Для задачи на видео потребовалось отладить, как контроллер обработает входящий последовательный сигнал с приемника и как он выделит данные. С помощью логического анализатора было получено поведение изменения сигнала на входе и сконвертировано в stim файл, понятный для симулятора Atmel Studio. И потом шаг за шагом отслеживается выделение данных из полученного сигнала.

]]>