#1 Вчора 23:22:29

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 230

Обробка переривань, esp32c3, і всяке таке..

Колупаю протокол виносного пульта до інвертора Ective. Нічого складного, звичайна PWM. І все наче працює.. Дані успішно розкодовуються (там 1 байт всього wink) Але щось мене смущає.
schema.png

Вхідний ланцюжок зробив так. імпульси 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:
pulse.png

Що дуже дивно. Підозрюю що сигнал на вході брудний, але подивитись нічим. SCO2 як виявилось не осцилограф а скоріше імітація. Синхронізується на нерегулярних сигналах не дуже, waveformи зберігати не вміє.
Питання: які є осцилографи, що вміли зберігати waveform, щоб не по ціні Боїнга? wink
В принципі можна спробувати замість обмежувача на стабілітроні трігер Шмідта впаяти..

Неактивний

#2 Сьогодні 04:42:21

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 912

Re: Обробка переривань, esp32c3, і всяке таке..

jokeR пише:

https://forum.arduino.ua/img/members/3983/schema.png

Верхній кінець R23 до джерела імпульсів підключений? У джерела пушпульний вихід чи відкритий колектор з підтяжкою?

jokeR пише:
// Обробник переривання GPIO (викликається при кожному наростаючому фронті)
static void IRAM_ATTR ective_isr_handler(void *arg)

Не шарю в фреймворку ESP32, тому питання: цей обробник в контексті переривання виконується чи в контексті задачі?
Якщо в контексті переривання, то так:

jokeR пише:
        esp_rom_delay_us(10);

робити не варто.
Крім того, всі інші функції, які викликаються з обробника, також має бути дозволено викликати в контексті переривання.

jokeR пише:

Підозрюю що сигнал на вході брудний

Можна програмний debouncing реалізувати. Як задетектували очікувану подію, вимкніть це переривання. Потім по таймеру знову вмикайте. Тільки якщо там не level-triggered переривання, а лише edge-triggered, то звісно, перед вмиканням потрібно атомарно перевірити, чи вже не сталась очікувана подія, щоб її не пропустити.

jokeR пише:

Питання: які є осцилографи, що вміли зберігати waveform, щоб не по ціні Боїнга? wink

В якості кишенькового користуюсь FNIRSI 1C15. Інтерфейс не дуже зручний, але в решті більш-менш норм.

jokeR пише:

В принципі можна спробувати замість обмежувача на стабілітроні трігер Шмідта впаяти..

Ну, по входу GPIO він уже вбудований має бути. Також у ESP32C3 наче ж є hardware glitch filter.

Остання редакція dimich (Сьогодні 06:58:11)

Неактивний

#3 Сьогодні 12:27:09

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 230

Re: Обробка переривань, esp32c3, і всяке таке..

Верхній кінець R23 до джерела імпульсів підключений?

Так

У джерела пушпульний вихід чи відкритий колектор з підтяжкою?

Чорний ящик sad Плата розміром з ноутбук, щедро заляпана компаундом. В оригінальному пульті взагалі цікаво (респект німцям що відреверсили)
https://akkudoktor.net/uploads/short-url/t52nbsj6dSc9dz2ltItHY7x1w6V.pdf
Чи так вони навернули зверху софтово-залізний трігер Шмідта, чи ця штука універсальна і уміє підключатись до single wire uart..
Але там attiny, 5В, вбудовані тригери Шмідта (в esp32c3 їх немає)..

цей обробник в контексті переривання виконується чи в контексті задачі?

Переривання. Ну, хз. Пишуть, що некошерно, бо блокує основний потік, але на пару мкс нормально.

Можна програмний debouncing реалізувати

Він сам по собі вийшов wink Далі по коду малі інтервали ігноряться, а закладеної похибки в +-5мс вистачає щоб вивезти wink

Відпаяв конденсатор - в принципі так теж працює. Фронти на вході кривенькі, так.
photo_2026-11-02_11-12-18.jpg

Але що ще більш дивує -
2026-11-02_11-20.png

Те що на зворотньому фронті теж можливі артефакти - припустимо. Але як переривання може спрацювати сильно до спаду імпульса? 45 мкс - дофіга.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму