в общем победил. как выяснилось, таймеры в есп32 очень проблемная проблема и путешествует от камня к камню. в интернетах описано много разных способов победы но я не нашел рабочего.
Постоянная инициализация таймера с последующим её убийством работала когда то давно на каком то определенном камне(пример ниже)
не работает
наш таймер= timerBegin(0, 80, true);
timerAttachInterrupt(наш таймер, &функция по таймеру, false);
timerAlarmWrite(наш таймер, переменная, false);
timerAlarmEnable(наш таймер);```
далее в функции по таймеру
(делаем что то)
startTimer();
stopTimer();
startTimer();
или
(делаем что то)
timerAlarmDisable(наш таймер);
теперь повторная инициализация таймера приводит к ошибке и перезагрузке МК.
решение\костыль - инициализировать кусок таймера один раз :
void setup() {
Serial.begin(115200);
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
далее в функции по прерыванию обнулять его и заставлять считать заново нужные нам значения :
void ARDUINO_ISR_ATTR onTimer() {
if (COUNT) {
portENTER_CRITICAL(&timerMux);
что то делаем
portEXIT_CRITICAL(&timerMux);
COUNT = false;
}
}
void ARDUINO_ISR_ATTR timerfunc() { // Set BTN_STOP_ALARM to input mode
if (!COUNT) {
portENTER_CRITICAL(&timerMux);
timerRestart(timer);
timerAlarmWrite(timer, наша переменная, true);
portEXIT_CRITICAL(&timerMux);
timerAlarmEnable(timer);
COUNT = true;
}
}
у меня работает
ide 2.3.2
форк есп 2,0,12
весь код ниже
volatile bool COUNT = false;
hw_timer_t *timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
void ARDUINO_ISR_ATTR onTimer() {
if (COUNT) {
portENTER_CRITICAL(&timerMux);
TPS++;
portEXIT_CRITICAL(&timerMux);
COUNT = false;
}
}
void ARDUINO_ISR_ATTR timerfunc() { // Set BTN_STOP_ALARM to input mode
if (!COUNT) {
portENTER_CRITICAL(&timerMux);
timerRestart(timer);
timerAlarmWrite(timer, Ignition_Timing_Charge_Calc, true);
portEXIT_CRITICAL(&timerMux);
timerAlarmEnable(timer);
COUNT = true;
}
}
void IRAM_ATTR HallFUNC() { ///выход метала от датчика
if (digitalRead(HALL_PIN)) {
Hall_micros = micros() - HallFUNC_FALLING_micros; /////время нахождения выступа напротив датчика
if (Hall_micros > 400) { // if (Hall_micros < 8666 && Hall_micros > 400){
Deegree_micros = Hall_micros / 26;
RPM = 600000 / (Deegree_micros * 360);
if (RPM > 1 && RPM < 90) { ///if (RPM > 8 && RPM < 90) {
volatile int Advance_MAP[120]{
5, 5, 5, 5, 5, 5, 5, 3, 7, 10, ///1000 обмин
10, 10, 10, 10, 10, 15, 15, 15, 15, 15, ///2000 обмин 10, 10, 10, 10, 10, 15, 15, 15, 15, 15, ///2000 обмин 10, 15, 15, 15, 15, 15, 15, 15, 15, 15,
15, 15, 15, 20, 20, 20, 20, 20, 20, 25, ///3000 обмин 20, 20, 20, 20, 20, 30, 30, 30, 30, 30, ///3000 обмин
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, ///4000 обмин 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, ///4000 обмин
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, ///5000 обмин 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, ///5000 обмин
30, 30, 30, 30, 30, 30, 30, 30, 30, 30, ///6000 обмин
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, ///7000 обмин
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, ///8000 обмин
38, 38, 38, 38, 38, 38, 38, 38, 38, 38, ///9000 обмин......отсечка
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, ///10 000 обмин
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, ///11 000 обмин
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, ///12 000 обмин
};
portENTER_CRITICAL(&timerMux);
Ignition_Timing_Charge_Calc = ((Deegree_micros * (160 - Advance_MAP[RPM])) - Ignition_Timing_Charge); ///(247 /Deegree_micros)
portEXIT_CRITICAL(&timerMux);
timerfunc();}
} else
Hall_micros = 0;
//}
}
if (!digitalRead(HALL_PIN)) { // && KILLSW_OFF) { //
HallFUNC_FALLING_micros = micros();
}
}
void setup() {
Serial.begin(115200);
pinMode(HALL_PIN, INPUT_PULLUP);
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
attachInterrupt(digitalPinToInterrupt(HALL_PIN), HallFUNC, CHANGE);
}
void IRAM_ATTR loop() {
portENTER_CRITICAL(&timerMux);
Serial.println(TPS);
Serial.println(Ignition_Timing_Charge_Calc);
portEXIT_CRITICAL(&timerMux);
delay(500);
}