реклама на сайте
подробности

 
 
> Не работает умножение на микроконтроллере, PIC18F4520
Marser
сообщение Dec 7 2010, 09:36
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 162
Регистрация: 12-09-08
Из: Казань
Пользователь №: 40 143



Здравствуйте!
Микроконтроллер не выполняет умножение, если в качестве множителей стоят переменные. Вот код:
long x, y;
x=15;
y=x*2;
indicate(y); ///отображение числа y на семисегментном экране.
В результате отображаетс не 30, а 15, то есть вместо операции y=x*2 выполнилась операция x=y;
Если множители типа int, умножение так же не работает, вот код:
int x, y;
x=15;
y=x*2;
indicate(y); ///отображение числа y на семисегментном экране.
В результате отображается нуль.
Операция умножения работает, только если множители заданы числами:
long y;
y=15*2;
indicate(y); ///отображение числа y на семисегментном экране.
В этом случае отображается число 30, как и должно быть.
В чём может быть проблема?
Cпасибо.


Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
xemul
сообщение Dec 9 2010, 13:13
Сообщение #2



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Marser @ Dec 9 2010, 09:24) *
Симулировал он действительно прекрасно, но при прошивке программы в контроллер умножение не работало.

hex в контроллер заливался тот же самый или с поддержкой ICD?
Цитата
Умножение не работало с разными числами. Проверял сгенерированный ассемблерный код, там был код умножения, а не сдвига.

Я говорил про описанный Вами случай x*2. Здесь компилятор оставит умножение только при отключённой оптимизации.
Цитата
Ассемблерный код, сгенерированный компилятором, я могу только посмотреть, но не менять. Вы знаете способ изменить этот ассемблерный код перед созданием hex файла? (кроме использования ассемблерной вставки в С - коде)

Если очень хочется, то можно скомпилить в ассемблерные листинги, поковыряться, а потом из них собрать hex.
Касательно умножений (и остальной арифметики) - они живут в библиотеках, отлажены и вылизаны, сорцы функций доступны. Если есть подозрение, ничто не мешает включить эти сорцы в проект и убедиться, что они работают как задумано.
Цитата(dimka76 @ Dec 9 2010, 09:33) *
Так вот, может стека как раз и не хватало?

Вряд ли. Линкер использование стека отслеживает и при возможности переполнения ругается. Я бы в мап-файл заглянул, не накосячил ли линкер с расположением секций.
ТС не показал содержимое indicate(), но сомневаюсь, что там можно выбрать хотя бы хардварный стек. Если таки удалось, то это повод задуматься о замене контроллера на более разумный без таких ограничений - 31-уровневый стек - просто издевательство над полётом фантазии.sm.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 12:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01384 секунд с 7
ELECTRONIX ©2004-2016