Контроллер испортил значение переменной.
- Войдите на сайт для отправки комментариев
Вс, 19/06/2022 - 00:49
Добрый день.
В процессе работы скетча контроллер сам поменял значение переменной на какой то левое
и продолжил работать.
В логе видно как идут шаги двигателя и текущие обороты, как набирается новый оборот, происходит событие.
Ни с чего сохраненное значение оборотов меняется с 2010 на 4021.
Что делать? Кто еще мог поменять значение переменной?
Часть кода, где связаны все трое и единственное место, где меняется Spins
unsigned int Spins = 0; //обороты unsigned int SpinsNow = 0; //обороты const float PeredatochnoeChislo = 3.1; //передаточное число между шестернями привода .... noInterrupts(); .... SpinsNow = Steps/1600/PeredatochnoeChislo; if (SpinsNow>Spins) { // каждый оборот Spins = SpinsNow; .... } interrupts();
ошибку ищи, контроллер
для начала сделать переменную волатильной
Добрый день.
...единственное место, где меняется Spins
Для того, чтобы быть уверенным, что это действительно единственное место, нужно проанализировать в программе кроме приведенного фрагмента еще все места, где осуществляется работа с массивами либо указателями.
В коде есть пид регулятор, который использует указатели:
И два массива:
Они как то могут "портить" мою переменную?
Так эта переменная не участвует в прерывании.
Так можно вообще все переменные объявить как volatile
весь код выкладывайте, по кускам на этом форуме никто гадать не будет
Так эта переменная не участвует в прерывании.
Так можно вообще все переменные объявить как volatile
вы точно уверены что компилятор загнал ее в ОЗУ, а не в регистр?
весь код выкладывайте, по кускам на этом форуме никто гадать не будет
вы точно уверены что компилятор загнал ее в ОЗУ, а не в регистр?
Вот этого я не знаю... =(
поправьте код, криво вставился
у вас строки огромного размера, разбейте их покороче. чтоб были не длиннее 100-120 символов
у вас что, почти во всем loop() отключены прерывания? и вы при этом пытаетесь с модбасом работать и в Сериал печатать? Вы ничего в прерываниях не смыслите, что ли?
Вам же на гайвере уже пытались обьяснить, что так делать нельзя!
Прерывания нужно отключать только для того, чтобы передать значения переменных из обработчика в основной код. У вас в прерываниях меняются две переменные - MoveStCurrentPosition и Steps. Создайте для них псевдонимы для работы в ЛУП и выключайте прерывания только на время копирования значений (на ДВЕ СТРОЧКИ КОДА!) и тут же включайте обратно.
Я уже пробовал и так и эдак.
Прерывания отключены только на части вычисления координат.
Как в куске кода где отключены прерывания, переменная сама поменяла свое значение?
Некоректный элсе иф. Это первое что попало на глаза.
Приведите скетч в нормальный вид и эту ошибку сами увидите.
В коде есть пид регулятор, который использует указатели:
И два массива:
Они как то могут "портить" мою переменную?
"Портить" переменную могут не сами массивы, а некорректная работа с ними. Например, попытка обратиться к первым двум по индексу равному 11 или к третьему - по индексу равному 3.
Некоректный элсе иф. Это первое что попало на глаза.
Приведите скетч в нормальный вид и эту ошибку сами увидите.
Привел в читабельный вид. В упор не вижу ошибки по if- else. Она еще есть?
ТС, если у вас таблица параметров катушек содержит 10 значений, зачем вы сделали массив на 11 элементов? Не можете привыкнуть, что в С массивы с нуля?:)
Это может быть источником ошибок, потому что вы не учитываете что будет, если из модбаса придет параметр =0
Вы правы, добавил в строке 146 проверку:
добавил в строке 146 проверку:
помогло?
пока без ошибок, тестирую. спасибо!