Страница 1 из 1
Вычисление выражения
Добавлено: Вт окт 06, 2020 22:36:04
alex1126
Что то я затупил на пустом месте, нуждаюсь в вашей помощи.
Вообщем атмега16, по таймеру T1 по прерыванию по совпадению OCR1A "шагаю" шаговым двигателем. Проблема в том что если OCR1A "вычисляется", то ничего не происходит (я еще капитально не ковырял что там происходит, но двигатель не шагает), а если тупо цифрами значение задать - все норм. Вот код:
Код: Выделить всё
unsigned int v;
unsigned int uiSpeed=200;
...
v=(31250/uiSpeed)*10;
//v=1562;
OCR1A=v;
Выполняется это один раз перед запуском таймера. Если строчку с явным присваиванием разремарить - все работает, если нет - нехочет. В чем подвох?
Re: Вычисление выражения
Добавлено: Вт окт 06, 2020 22:42:27
АлександрЛ
Попробуйте отдельной строкой умножение на 10 сделать..
зы.. А не проще вместо "200" написать "20" и тогда на 10 умножать не придётся..

Re: Вычисление выражения
Добавлено: Вт окт 06, 2020 22:52:59
alex1126
[uquote="АлександрЛ",url="/forum/viewtopic.php?p=3902859#p3902859"]Попробуйте отдельной строкой умножение на 10 сделать..

[/uquote]
я конечно попробую завтра но это магия будет
зы.. А не проще вместо "200" написать "20" и тогда на 10 умножать не придётся..

200 это на период отладки, потом скорость будет задаваться с клавиатуры а тут она должна пересчитываться
Re: Вычисление выражения
Добавлено: Вт окт 06, 2020 23:45:42
АлександрЛ
[uquote="alex1126",url="/forum/viewtopic.php?p=3902869#p3902869"][uquote="АлександрЛ",url="/forum/viewtopic.php?p=3902859#p3902859"]Попробуйте отдельной строкой умножение на 10 сделать..

[/uquote] я конечно попробую завтра но это магия будет

[/uquote]
Никакая не магия.. Я как- то считал выражение на БАСКОМ-АВР-е, (давно), так там пришлось разбивать формулу на фрагменты, так как "всё в куче" считаться не хотело..

Re: Вычисление выражения
Добавлено: Вт окт 06, 2020 23:48:40
BlackKilkennyCat
бывает. надо смотреть хотя бы дизасм, что там и как. иногда спасает приведение, типа: v=(int)((31250/uiSpeed)*10);
Re: Вычисление выражения
Добавлено: Ср окт 07, 2020 00:10:48
vt1980
[uquote="alex1126",url="/forum/viewtopic.php?p=3902854#p3902854"]Если строчку с явным присваиванием разремарить - все работает, если нет - нехочет. В чем подвох?[/uquote]
Не знаю что и для чего считаете, но в результате операции v=(31250/uiSpeed)*10; будет число 1560 а не 1562
потому что при целочисленном делении, дробь отбрасывается.
Второй странный момент: Почему в 8-битному регистру OCR1A присваивается значение 16-битной переменной v ?
Re: Вычисление выражения
Добавлено: Ср окт 07, 2020 09:19:57
NStorm
OCR1A/B - 16-битные регистры.
Добавлено after 2 hours 15 minutes 26 seconds:
Переменные случаем в прерываниях не меняются нигде? Весь код бы выложили, проблема не чисто в приведенном куске, там всё правильно. За исключением конечно того, что будет ес-но 1560, а не 1562.
Re: Вычисление выражения
Добавлено: Ср окт 07, 2020 16:17:44
alex1126
Весь код почти 400 строк. В прерываниях нигде не меняется (да даже если бы и менялось то замена этих двух строчек не меняла бы общую картину). Явное приведение типов тоже пробовал. Сейчас возьмусь за более глубокий анализ

Re: Вычисление выражения
Добавлено: Ср окт 07, 2020 16:35:07
BlackKilkennyCat
посмотреть, что накомпилил компилятор
Re: Вычисление выражения
Добавлено: Ср окт 07, 2020 17:13:37
alex1126
Вроде разобрался. Считает все верно. Просто этот код выполняется у меня при нажатии на кнопку, кнопка опрашивается раз в 300мксек. Похоже ошибка именно в том что когда код вызывается несколько раз подряд происходит что то не запланированное. Если увеличить время опроса все работает. Всем спасибо, пошёл разбирается дальше.