Вычисление выражения

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Что то я затупил на пустом месте, нуждаюсь в вашей помощи.
Вообщем атмега16, по таймеру T1 по прерыванию по совпадению OCR1A "шагаю" шаговым двигателем. Проблема в том что если OCR1A "вычисляется", то ничего не происходит (я еще капитально не ковырял что там происходит, но двигатель не шагает), а если тупо цифрами значение задать - все норм. Вот код:

Код: Выделить всё

unsigned int v;
unsigned int uiSpeed=200;
...
v=(31250/uiSpeed)*10;
//v=1562;
OCR1A=v;
Выполняется это один раз перед запуском таймера. Если строчку с явным присваиванием разремарить - все работает, если нет - нехочет. В чем подвох?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 43942
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Сообщение АлександрЛ »

Попробуйте отдельной строкой умножение на 10 сделать.. :dont_know:

зы.. А не проще вместо "200" написать "20" и тогда на 10 умножать не придётся.. :dont_know:
Реклама
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

[uquote="АлександрЛ",url="/forum/viewtopic.php?p=3902859#p3902859"]Попробуйте отдельной строкой умножение на 10 сделать.. :dont_know:[/uquote]
я конечно попробую завтра но это магия будет :)
зы.. А не проще вместо "200" написать "20" и тогда на 10 умножать не придётся.. :dont_know:
200 это на период отладки, потом скорость будет задаваться с клавиатуры а тут она должна пересчитываться
Друг Кота
Аватара пользователя
Сообщения: 43942
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Сообщение АлександрЛ »

[uquote="alex1126",url="/forum/viewtopic.php?p=3902869#p3902869"][uquote="АлександрЛ",url="/forum/viewtopic.php?p=3902859#p3902859"]Попробуйте отдельной строкой умножение на 10 сделать.. :dont_know:[/uquote] я конечно попробую завтра но это магия будет :)[/uquote]
Никакая не магия.. Я как- то считал выражение на БАСКОМ-АВР-е, (давно), так там пришлось разбивать формулу на фрагменты, так как "всё в куче" считаться не хотело.. :dont_know:
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Сообщение BlackKilkennyCat »

бывает. надо смотреть хотя бы дизасм, что там и как. иногда спасает приведение, типа: v=(int)((31250/uiSpeed)*10);
Реклама
Встал на лапы
Сообщения: 106
Зарегистрирован: Вс апр 01, 2012 22:15:14

Сообщение vt1980 »

[uquote="alex1126",url="/forum/viewtopic.php?p=3902854#p3902854"]Если строчку с явным присваиванием разремарить - все работает, если нет - нехочет. В чем подвох?[/uquote]

Не знаю что и для чего считаете, но в результате операции v=(31250/uiSpeed)*10; будет число 1560 а не 1562
потому что при целочисленном делении, дробь отбрасывается.

Второй странный момент: Почему в 8-битному регистру OCR1A присваивается значение 16-битной переменной v ?
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

OCR1A/B - 16-битные регистры.

Добавлено after 2 hours 15 minutes 26 seconds:
Переменные случаем в прерываниях не меняются нигде? Весь код бы выложили, проблема не чисто в приведенном куске, там всё правильно. За исключением конечно того, что будет ес-но 1560, а не 1562.
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Весь код почти 400 строк. В прерываниях нигде не меняется (да даже если бы и менялось то замена этих двух строчек не меняла бы общую картину). Явное приведение типов тоже пробовал. Сейчас возьмусь за более глубокий анализ :)
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Сообщение BlackKilkennyCat »

посмотреть, что накомпилил компилятор
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Вроде разобрался. Считает все верно. Просто этот код выполняется у меня при нажатии на кнопку, кнопка опрашивается раз в 300мксек. Похоже ошибка именно в том что когда код вызывается несколько раз подряд происходит что то не запланированное. Если увеличить время опроса все работает. Всем спасибо, пошёл разбирается дальше.
Ответить

Вернуться в «AVR»