• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Помогите настроить таймер и прерывания ESP8266.

sasasa

Member
1. ESP8266. Как запустить одновременно timer0 и timer1. Почему-то после установки прерывания на timer1, прерывание на timer0 перестаёт работать.
Код:
  timer1_isr_init();
  timer1_enable(2,0,1);
  timer1_write( 10000);
  timer1_attachInterrupt(two);
  timer0_isr_init();
  timer0_attachInterrupt(one);
2. Как установить прерывание по совпадению? Может быть какие то готовые коды где хотя бы глянуть?

3. Что такое TIMER_FRC2_ALARM ?
 
Последнее редактирование:

sasasa

Member
Хорошо, про timer0 и timer1 не хотите говорить. Может быть тогда скажете что можно делать с timer2. Как установить прерывание не нём?
Обыкновенным способом timer2_attachInterrupt(funkc) не получается :(
Также timer2_write даёт какой то странный результат - считывая записанное значение получаю совсем другое
 
Последнее редактирование:

pvvx

Активный участник сообщества
Хорошо, про timer0 и timer1 не хотите говорить.
А кто-то обязан?
Может быть тогда скажете что можно делать с timer2. Как установить прерывание не нём?
Обыкновенным способом timer2_attachInterrupt(funkc) не получается :(
Также timer2_write даёт какой то странный результат - считывая записанное значение получаю совсем другое
TIMER_FRC1 - это hard таймер 0
TIMER_FRC2 - это hard таймер 1
TIMER_FRC2 используется системой. На нем работают os_timer_disarm(), os_timer_setfn(), os_timer_arm()... Инициализируется при старте SDK функцией ets_timer_init() для работы с шагом 1 ms, а далее пользователем для работы со счетом в us вызовом system_timer_reinit(). Процедуры назначенные в программном таймере вызываются только при обработке ets_run(), из неё, как и вызовы task(). При не завершении процедуры таймера или "таска" новый не сработает, пока управление не перейдет опять в ets_run().
В чипе есть ещё 2 таймера. Один 32-х битный, второй 64-х битный. Оба работают с шагом в us и имеют регистры alarm для вызова прерывания.
Так-же есть RTC и тоже имеет регистры alarm и дает прерывания...
 
Последнее редактирование:

sasasa

Member
TIMER_FRC1 - это hard таймер 0
TIMER_FRC2 - это hard таймер 1
Спасибо за разъяснение!
1. странно что вами указанная нумерация не совпадает с том что вижу в core_esp8266_timer.c . Тут видно что FRC1 это не timer0 а timer1.На пример здесь
Код:
void timer1_attachInterrupt(timercallback userFunc) {
  timer1_user_cb = userFunc;
  ETS_FRC1_INTR_ENABLE();}
и тут
Код:
//timer1's counter value(count from initial_value to 0)
#define FRC1_COUNT_ADDRESS  0x04
Если смотреть как они все 3 считают (пока я трёх смог увидеть используя timerx_read() или TxV), то видно что timer0 32bit, timer1 23bit, timer2 32bit
И именно timer1 это FRC1 так как единственный имеет 23бит, A timer0 это 32бит. Тут какая то путаница с нумерацией?
И кто такой в таком случае timer0??

2. timer1 я частично победил - записываю считываю без проблем. timer0 тоже, только вместе они не работают.
Код:
timer1_isr_init();
timer1_enable(2,0,1);
timer1_write( 10000);
timer1_attachInterrupt(userFunct);
но если теми же командами пробую управлять таймер2, то получаю какие то странные результаты. Записываю одну величину а получаю совсем другое.
например вместо 500 000 000 выдаёт что записанно 5 072 128. А прерывание вообще не работает :(
!! ОООчень большая просьба помочь с этим таймером2. Может быть какой то кусочек кода хотя бы взглянуть. Типа как я таймер1 запускаю.
Sorry, но я только начинаю вникать в программирование.
Использую Ардуино Иде и , timer2_enable(0,0,1); timer2_write(val); timer2_read(); timer2_attachInterrupt(test); T2L, T2V, T2C, T2I, T2A...

3. И всё же где ошибка в скетче из-за чего перестаёт работать таймер1 при запуске прерывания таймер0?
Код:
timer1_isr_init();
timer1_enable(2,0,1);
timer1_write( 10000);
timer1_attachInterrupt(two);
timer0_isr_init();
timer0_attachInterrupt(one);

В чипе есть ещё 2 таймера. Один 32-х битный, второй 64-х битный. Оба работают с шагом в us и имеют регистры alarm для вызова прерывания.
А можно подробнее хотя бы их названия/регистры, как их вызвать и как записать из Ардуино Иде прерывание в эти таймеры
 
Последнее редактирование:

pvvx

Активный участник сообщества
А можете объяснить зачем вы лезите в системный таймер (я его называю timer1)?
Есть функции назначения программных прерываний по этому таймеру os_timer_disarm(), os_timer_setfn(), os_timer_arm() (в дурино иде они имеют другое название).
 

sasasa

Member
А можете объяснить зачем вы лезите в системный таймер (я его называю timer1)?
Есть функции назначения программных прерываний по этому таймеру os_timer_disarm(), os_timer_setfn(), os_timer_arm() (в дурино иде они имеют другое название).
Наверное потому что толком не знаю что можно и что нельзя, мало опыта и пока только пробую всякие варианты. Как я понимаю из выше сказанного то его трогать лучше не надо. Хотя интересно что при моих действиях (timer1_enable(0,0,1);timer2_write(1000), timer2_attachInterrupt(test)) ничего не зависало. WiFi всё время работало хотя частота и счёт таймера менялись.
Да, Ардуино Иде не хочет распознавать такие функции os_timer_arm() и пока не смог их запустить :( Как их там записать?
В чипе есть ещё 2 таймера. Один 32-х битный, второй 64-х битный. Оба работают с шагом в us и имеют регистры alarm для вызова прерывания.
timer0 = 32bit = ??? что это за зверь? Это один из выше упомянутых дополнительных таймеров
timer1 ( по комментариям в файлах) = 23bit = TIMER_FRC1 - это hard таймер 0
timer2 ... = 32bit =TIMER_FRC2 - это hard таймер 1 - лучше не трогать

Остаётся 4-й таймер 64бит - как его достучатся?
 

pvvx

Активный участник сообщества
Ардуино Иде не хочет распознавать такие функции os_timer_arm() и пока не смог их запустить :( Как их там записать?
А сами поищите - я не любитель Дурины. Это вы пишите в тему Дурин.
timer0 = 32bit = ??? что это за зверь? Это один из выше упомянутых дополнительных таймеров
timer1 ( по комментариям в файлах) = 23bit = TIMER_FRC1 - это hard таймер 0
timer2 ... = 32bit =TIMER_FRC2 - это hard таймер 1 - лучше не трогать

Остаётся 4-й таймер 64бит - как его достучатся?
Это я вам давал список всех таймеров, которые есть в чипе ESP8266.
Описание к timer0 есть с примерами в самом SDK esp_iot_sdk_v140\examples\driver_lib\driver\hw_timer.c , к timer1 обращаются только через системные функции (иначе нарушите работу остальных приложений, таких как LwIP и т.д.), к третьему 32-х битному c шагом в 1 us (PHY часть чипа, счетчик по адресу 0x3FF20C00) и четвертому 64-битному c шагом в 1 us (PHY часть чипа, счетчик по адресу 0x3FF21048 и старшие биты по 0x3FF2104C) (64-х битный wDev_MacTim1SetFunc(func), wDev_MacTim1Arm(time_us)) и пятому (RTC блок) таймеру у вас доступа нет. Только если умеете дизасемблировать и заниматься "реверсом" китай-бинарников т.д.
На 64-х битном таймере (прерывании) в SDK 1.4.0 сидит soft-WDT с таймером на 1.6 сек...
 
Последнее редактирование:
Сверху Снизу