• Система автоматизации с открытым исходным кодом на базе 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 сек...
 
Последнее редактирование:
Сверху Снизу