Ви не увійшли.
Колупаю протокол виносного пульта до інвертора Ective. Нічого складного, звичайна PWM. І все наче працює.. Дані успішно розкодовуються (там 1 байт всього
) Але щось мене смущає.
Вхідний ланцюжок зробив так. імпульси 5В (але хто знає наскільки з цим строго), довжина 18мс, період від 50 до 100 мс. На кожний наростаючий фронт налаштував переривання. Всередині таке:
// Обробник переривання GPIO (викликається при кожному наростаючому фронті)
static void IRAM_ATTR ective_isr_handler(void *arg)
{
uint64_t count_value;
if (gpio_get_level(GPIO_INPUT_ECTIVE) == 0)
{
// Якщо сигнал низький, ігноруємо його.
return;
};
// Отримуємо поточне значення таймера в мікросекундах
gptimer_get_raw_count(gptimer, &count_value);
// Скидаємо таймер в 0 для вимірювання наступного періоду
gptimer_set_raw_count(gptimer, 0);
gpio_set_level(2, 1); // Встановлюємо GPIO 2 в LOW для відладки
esp_rom_delay_us(10);
gpio_set_level(2, 0); // Встановлюємо GPIO 2 в LOW для відладкиТобто очікується на нозі GPIO2 1 імпульс довжиною 10 мкс. А в реальності іноді 1 імпульс, іноді 3:
Що дуже дивно. Підозрюю що сигнал на вході брудний, але подивитись нічим. SCO2 як виявилось не осцилограф а скоріше імітація. Синхронізується на нерегулярних сигналах не дуже, waveformи зберігати не вміє.
Питання: які є осцилографи, що вміли зберігати waveform, щоб не по ціні Боїнга? ![]()
В принципі можна спробувати замість обмежувача на стабілітроні трігер Шмідта впаяти..
Неактивний
https://forum.arduino.ua/img/members/3983/schema.png
Верхній кінець R23 до джерела імпульсів підключений? У джерела пушпульний вихід чи відкритий колектор з підтяжкою?
// Обробник переривання GPIO (викликається при кожному наростаючому фронті) static void IRAM_ATTR ective_isr_handler(void *arg)
Не шарю в фреймворку ESP32, тому питання: цей обробник в контексті переривання виконується чи в контексті задачі?
Якщо в контексті переривання, то так:
esp_rom_delay_us(10);
робити не варто.
Крім того, всі інші функції, які викликаються з обробника, також має бути дозволено викликати в контексті переривання.
Підозрюю що сигнал на вході брудний
Можна програмний debouncing реалізувати. Як задетектували очікувану подію, вимкніть це переривання. Потім по таймеру знову вмикайте. Тільки якщо там не level-triggered переривання, а лише edge-triggered, то звісно, перед вмиканням потрібно атомарно перевірити, чи вже не сталась очікувана подія, щоб її не пропустити.
Питання: які є осцилографи, що вміли зберігати waveform, щоб не по ціні Боїнга?
В якості кишенькового користуюсь FNIRSI 1C15. Інтерфейс не дуже зручний, але в решті більш-менш норм.
В принципі можна спробувати замість обмежувача на стабілітроні трігер Шмідта впаяти..
Ну, по входу GPIO він уже вбудований має бути. Також у ESP32C3 наче ж є hardware glitch filter.
Остання редакція dimich (Сьогодні 06:58:11)
Неактивний
Верхній кінець R23 до джерела імпульсів підключений?
Так
У джерела пушпульний вихід чи відкритий колектор з підтяжкою?
Чорний ящик
Плата розміром з ноутбук, щедро заляпана компаундом. В оригінальному пульті взагалі цікаво (респект німцям що відреверсили)
https://akkudoktor.net/uploads/short-url/t52nbsj6dSc9dz2ltItHY7x1w6V.pdf
Чи так вони навернули зверху софтово-залізний трігер Шмідта, чи ця штука універсальна і уміє підключатись до single wire uart..
Але там attiny, 5В, вбудовані тригери Шмідта (в esp32c3 їх немає)..
цей обробник в контексті переривання виконується чи в контексті задачі?
Переривання. Ну, хз. Пишуть, що некошерно, бо блокує основний потік, але на пару мкс нормально.
Можна програмний debouncing реалізувати
Він сам по собі вийшов
Далі по коду малі інтервали ігноряться, а закладеної похибки в +-5мс вистачає щоб вивезти ![]()
Відпаяв конденсатор - в принципі так теж працює. Фронти на вході кривенькі, так.
Але що ще більш дивує - 
Те що на зворотньому фронті теж можливі артефакти - припустимо. Але як переривання може спрацювати сильно до спаду імпульса? 45 мкс - дофіга.
Неактивний