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

timer1_detachInterrupt(); проблема

sasasa

Member
Добрый вечер. Что то мне не получается востановить вызов функции хендлера после .
Код:
timer1_detachInterrupt();
если где то эта функция, то потом тишина
Там ещё что то надо делать?
кроме
Код:
  timer1_attachInterrupt(handler);
 
Последнее редактирование:

sally555

New member
функция
Код:
timer1_attachInterrupt(handler);
в качестве параметра handler должна принимать timercallback-функцию обработчика прерывания, из вашего листинга это не видно.
Например так:
Код:
timer1.attachInterrupt(readsensors());

void readsensors(){
// здесь сам код обработчика
}
 
Последнее редактирование:

sasasa

Member
Есть функция, как же без неё :) Я описал вкратце проблему

timer1.attachInterrupt(handlers()); Скобки () не пишется и достаточно только названия. Во всяком случае до timer1_detachInterrupt(); так работает, но вот после таймер ни по чём не хочет её запускать.
Код:
void handler(){
//...
}
void setup(){
pinMode(5, INPUT);
timer1_isr_init();
timer1_enable(0, 0, 1);
timer1_write(1000);
timer1_attachInterrupt(handler);
}
void loop(){
//до этого место всё работает
if (digitalRead(5) == LOW) timer1_detachInterrupt();
else timer1_attachInterrupt(handler);
//и всё - здесь уже глохнет. Функция handler() не запускается
}
Что не правильно ?
 
Последнее редактирование:

sally555

New member
Функция timer1_detachInterrupt() похоже сбрасывает настройки таймера, пришлось покопаться в системных библиотечках, чего она вообще делает. По этому после ее выполнения нет смысла сразу запускать timer1_attachInterrupt(handler), а следует по новой настроить таймер. Вот как то так.

Код:
bool timerOnOff = 0;        //флаг состояния таймера 0-выкл., 1-вкл.

void handler(){
              USE_SERIAL.println("100001111100000"); // пуляет в терминал мусор когда таймер работает
}

void setup(){
   pinMode(5, INPUT);
//************************************
    timer1_isr_init();
    timer1_enable(3, 0, 1);
    timer1_write(268430);
    timer1_attachInterrupt(handler);
    timerOnOff = 1;           // таймер включен
//************************************

}
void loop(){
//************************************  
    if(digitalRead(5)){                           // проверяем управляющий пин, если 1 то убиваем таймер
                             if(timerOnOff){            // проверяем флаг состояния таймера, если 1 то убиваем таймер
                                              timer1_detachInterrupt(); // убиваем таймер
                                              timerOnOff = 0;           // таймер выключен
                             }
    }else{                                              // если управляющий пин 0 то запускаем таймер
              if(timerOnOff==0){                       // проверяем флаг состояния таймера, если 0 то запускаем таймер
                            timer1_enable(3, 0, 1);
                            timer1_write(268430);
                            timer1_attachInterrupt(handler);
                            timerOnOff = 1;             // таймер включен
              }
    }
//************************************  
}
Ну это если вы точно хотите использовать функцию timer1_detachInterrupt(), более проще включать и выключать таймер оперируя соответственно функциями timer1_enable() и timer1_disable()
, для этого они и существуют. Вот с ними вариант:

Код:
bool timerOnOff = 0;        //флаг состояния таймера 0-выкл., 1-вкл.

void handler(){
              USE_SERIAL.println("100001111100000"); // пуляет в терминал мусор когда таймер работает
}

void setup(){
   pinMode(5, INPUT);
//************************************
    timer1_isr_init();
    timer1_enable(3, 0, 1);
    timer1_write(268430);
    timer1_attachInterrupt(handler);
    timerOnOff = 1;           // таймер включен
//************************************

}
void loop(){
//************************************   
    if(digitalRead(5)){                           // проверяем управляющий пин, если 1 то убиваем таймер
                             if(timerOnOff){            // проверяем флаг состояния таймера, если 1 то убиваем таймер
                                              timer1_disable(); // убиваем таймер
                                              timerOnOff = 0;           // таймер выключен
                             }
    }else{                                              // если управляющий пин 0 то запускаем таймер
              if(timerOnOff==0){                       // проверяем флаг состояния таймера, если 0 то запускаем таймер
                            timer1_enable(3, 0, 1);
                            timerOnOff = 1;             // таймер включен
              }
    }
//************************************   
}
Я только для наглядности уменьшил тактовую частоту таймера, первый аргумент функции timer1_enable(3,0,1) и число тактов в функции timer1_write(268430) , а то слишком часто срабатывало прерывание. Еще ввел глобальную переменную timerOnOff для определения состояния таймера.
 

sally555

New member
Пробуйте, у меня работает. Кстати, можно не создавать дополнительную переменную timerOnOff , а просто проверять флаг в одном из регистров управляющих таймером, но я с этим не разбирался, времени катастрофически не хватает, да и доков по регистрам ЕСПшки у меня нет.
 
Сверху Снизу