Зависает loop, но продолжает работать прерывание в таймере

78125

✩✩✩✩✩✩✩
1 Дек 2019
76
2
Добрый день.
Иногда, в случайное время, основной цикл loop перестает работать.
Однако настроенный таймер5 с прерыванием продолжает вращать шаговый мотор.

C++:
#include <GyverTimers.h>

Timer5.setFrequency(JOG);
Timer5.enableISR(CHANNEL_B);
Timer5.outputDisable(CHANNEL_B);

ISR(TIMER5_B) { //прерывание по таймеру для двигателя вращения
                if ( (isEnable || ManualEnable)  && (EndlessRotation||(BigStCurrentPosition < BigStTarget)) ) {
                BigStCurrentPosition++;
                bitSet(PINC, 4);
                }
              }
куда копать?
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
И где в приведенном отрывке loop() ?
Если хотите помощи, выкладывайте код полностью.
 

78125

✩✩✩✩✩✩✩
1 Дек 2019
76
2
там безумное количество кода, сделал вот что:
C++:
if ((BigStCurrentPosition/STEPS_PER_REVOLUTION ) >= 1) { // каждый оборот сдвинуться     
                 noInterrupts();
                 BigStCurrentPosition -= STEPS_PER_REVOLUTION;
                 interrupts();
}
воздействие на переменную из прерывания закрыл скобками noInterrupts(); посмотрю...
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
Внутри прерывания закрыли или в основном коде?

По воду кода - до вас не доходит, что обсуждать проблему по трем строчкам бессмысленно? Зачем тогда в форум писать, разбирайтесь сами.
 

78125

✩✩✩✩✩✩✩
1 Дек 2019
76
2
Внутри прерывания закрыли или в основном коде?
в основном коде.
Я правда уверен что никто внимательно не будет вникать в 700 строк кода основного цикла...
Надеюсь что просто направят)

Сейчас мне интересно, если таймер остается живой, то значит что контроллер работает?
таймеры живут своей жизнью?
сбивается что-то что вешает только loop так бывает?
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
сбивается что-то что вешает только loop так бывает?
Ну смотря как зависло. Если исполнение инструкций остановилось - то и прерывания встанут, ядро-то одно. А если луп не остановился, а просто попал в бесконечный цикл - то все остальное будет работать.
 
  • Лойс +1
Реакции: vortigont

vortigont

★★★★★★✩
24 Апр 2020
1,022
542
Saint-Petersburg, Russia
вы бы хоть контроллер указали так чисто что бы не рассуждать о сферическом коне в вакууме.
Остановить/заблокировать луп преднамеренно или непреднамеренно довольно просто и не является ничем необычным. Не все контроллеры это любят, но в общем это вполне допустимо.

таймеры живут своей жизнью?
да, таймеры живут своей жизнью, это их судьба, иначе они не были бы нужны
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
Не видя кода ничего сказать нельзя.
И, кстати, 700 строк это совсем немного, особенно для Меги
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
542
Saint-Petersburg, Russia
@78125, если у вас в loop() 700 строк кода это говорит о том что у вас полный бардак, а не проект. Код нужно структурировать, тогда будет проще понимать что там творится и отлаживать отдельные блоки. Тогда и найдете где у вас что закливается или блокируется.