• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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);
}
А какой функцией принимается ответ ? И как посмотреть что гет передался? Веб страничка где то есть для мониторинга тср клиента?

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