• Система автоматизации с открытым исходным кодом на базе 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 , а просто проверять флаг в одном из регистров управляющих таймером, но я с этим не разбирался, времени катастрофически не хватает, да и доков по регистрам ЕСПшки у меня нет.
 
Сверху Снизу