• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Прерывание GPIO с частотой 30-50Hz и таймер

Подскажите пожалуйста какой пин лучше выбрать для внешнего прерывания , и как вызвать само прерывание? И как вызвать задержку скажем 100мс. или 1000мс. ?
И еще вопрос : сможет нормально работать WiFi и внешнее прерывание до 100Гц ?
 
Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
Подскажите пожалуйста какой пин лучше выбрать для внешнего прерывания
Любой который может работать как вход, и наверное для простоты не участвующий в процессе загрузки и прошивки (чтобы можно было вольно обращаться с подтяжками) io4,5,12,13,14. Можно и другие но с этими возни меньше.
и как вызвать само прерывание
"Дернуть за ногу...". Например подтянутой резистором к питанию ногой коснуться земли... ну кнопка или по внешнему сигналу транзистор открыть...
И как вызвать задержку скажем 100мс. или 1000мс.
Вопросом на вопрос: а какая нужна точность? Если так, более менее... читаете системный таймер, прибавляете к нему число микросекунд в секунде (если надо секунду) и сохраняете в переменной. Потом в начале общего цикла проверяете опять таймер и если он больше чем сохраненное значение выполняете свою задержанную задачу. Иначе пропускаете ее. Если нужна супер точность - внешние часы на одну из ног и по прерыванию выполняете свою задачку.
сможет нормально работать WiFi и внешнее прерывание до 50Гц
Смотря что будет в обработчике. Если просто сохранение какого то значения где-то - то без проблем, а если вы внутри прерывания еще и по wifi чего нибудь посылать собрались - разумеется нет. Ну и по середине широкая зона "может быть".
 
сохранение какого то значения где-то - то без проблем
Инкремент переменной 32бит.
"Дернуть за ногу...". Например подтянутой резистором к питанию ногой коснуться земли... ну кнопка или по внешнему сигналу транзистор открыть...
Это я знаю прекрасно . Я наверное некорректно вопрос задал..
Как прописать в коде и в каком лучше файле , чтобы организовать прерывание по входу ?
 

pvvx

Активный участник сообщества
Время в us в 64 бита от старта модуля:
Код:
#define MAC_TIMER64BIT_COUNT_ADDR 0x3ff21048
uint64 ICACHE_FLASH_ATTR get_mac_time(void)
{
    union {
        volatile uint32 dw[2];
        uint64 dd;
    }ux;
    volatile uint32 * ptr = (volatile uint32 *)MAC_TIMER64BIT_COUNT_ADDR;
    ux.dw[0] = ptr[0];
    ux.dw[1] = ptr[1];
    if(ux.dw[1] != ptr[1]) {
        ux.dw[0] = ptr[0];
        ux.dw[1] = ptr[1];
    }
    return ux.dd;
}
Пределы частоты прерываний при сохранении работы WiFi на ESP8266:
7 us (меньше не тянет при CLK CPU на 80 MHz). При 160 MHz предел обработчика простых прерываний к 5 us.
Если прерывание не NMI, то о том, что влияет на точность (периоды запретов прерываний в SDK):
При обычном соединении WiFi и передаче файлов по TCP часто идет задержка в 120..162 us при CLK CPU на 80 MHz, что для CLK CPU на 160 Mhz соответственно в 2 раза меньше.
В эти моменты аппаратные прерывания не работают - запрещены. Но работает NMI.
NMI прерывание тянет период до 4-х us. При обработчике прерывания от таймера через nmi выпадений не обнаружено. Обработчик NMI прерываний должен быть очень коротким - отрабатывать за менее 1 us. Если более - мешает WiFi.
Всё остальное находится в документации к ESP8266 и примерах UDK.
 
Последнее редактирование:
Pvvx , спасибо за ответ! Скажите , а как в Вашем проекте (TCP<>UART) отправить POST запрос на сервер? Можно простой пример кода ?
 
Уважаемый PVVX ! И как в этом примере отправить пост запрос и потом принять ответ сервера?
Я смотрю что GET запрос отсылается функцией :
Код:
err_t ICACHE_FLASH_ATTR tc_listen(TCP_SERV_CONN *ts_conn) {
#if DEBUGSOO > 1
    tcpsrv_print_remote_info(ts_conn);
    os_printf("send %d bytes\n", sizeof(tc_get)-1);
#endif
    return tcpsrv_int_sent_data(ts_conn, tc_get, sizeof(tc_get)-1);
}
А какой функцией принимается ответ ? И как посмотреть что гет передался? Веб страничка где то есть для мониторинга тср клиента?

Буду весьма признателен за пояснение.
 
Сверху Снизу