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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Ошибка в AVR Studio4
Wild007
сообщение Oct 30 2006, 07:58
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



Подскажите пожалуйста!!! Уже час не могу создать MACRO.
Привожу отрывок:
. . . .
.EQU TTT=4100/1000000
LDI r17,0x100-(TTT*20000000/1024)
. . . . .
выдает "error: Operand(s) out of range in 'ldi r17,0x100'"
Считаю на калькуляторе -- значение в скобках =0x50.
В чем проблема? (цифры приведены так как они передаются в MACROS по параметрам и просьба их не обсуждать)


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
TriD
сообщение Oct 30 2006, 08:08
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 29-12-04
Пользователь №: 1 728



HEX обозначается как $100
Go to the top of the page
 
+Quote Post
arttab
сообщение Oct 30 2006, 08:12
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Цитата
4100/1000000


Равно 0, а не 0,0041. и ругается он скорее на такую операцию.
попробуйте так:
.EQU TTT=4100
LDI r17,0x100-(TTT*20/1024)
для ТТТ <= 5120


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Wild007
сообщение Oct 30 2006, 08:14
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



Цитата(TriD @ Oct 30 2006, 11:08) *
HEX обозначается как $100

Не имеет значения Studio понимает любой вариант


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
Wild007
сообщение Oct 30 2006, 08:27
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



конструкция:
.EQU TTT=0.0041
LDI r17,$100-(TTT*20000000/1024);
выдает ошибку
а конструкция:
LDI r17,$100-(0.0041*20000000/1024);
нет
20000000 -- частота кварца
4100 -- время в мкс
передаются как параметры и не хотелось их менять, т.к. они уже мспользуются в других местах


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
arttab
сообщение Oct 30 2006, 08:30
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



а мой вариант?


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Wild007
сообщение Oct 30 2006, 08:34
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



Цитата(arttab @ Oct 30 2006, 11:12) *
Цитата
4100/1000000


Равно 0, а не 0,0041. и ругается он скорее на такую операцию.
попробуйте так:
.EQU TTT=4100
LDI r17,0x100-(TTT*20/1024)
для ТТТ <= 5120


Работает, но, как я писал 20000000 это параметр ккоторый не хотелось бы менять


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
arttab
сообщение Oct 30 2006, 08:41
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



.EQU TTT=0.0041*20000000
LDI r17,0x100-(TTT/1024)
так устроит?
Похоже на ограничение студии


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Wild007
сообщение Oct 30 2006, 08:56
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



Цитата(arttab @ Oct 30 2006, 11:41) *
.EQU TTT=0.0041*20000000
LDI r17,0x100-(TTT/1024)
так устроит?
Похоже на ограничение студии


Да. так работает (проверил со строкой в MACROSe) большое спасибо. Но конечно странное ограничение. Интересно с какого значения оно проявляется? Найду время -- проверю.


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
arttab
сообщение Oct 30 2006, 08:59
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Думаю что с <1


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
GinRider
сообщение Oct 30 2006, 11:47
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 13-10-06
Из: Финляндия
Пользователь №: 21 273



Думаю, что компилятор автоматически использует INT, если его принудительно не пнуть, как во втором примере. Должен быть какой-то идентификатор, чтобы подсказать тип константы. Сталкивался с подобным на старых компиляторах для x51.
Go to the top of the page
 
+Quote Post
Yura_K
сообщение Oct 30 2006, 14:05
Сообщение #12


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

Группа: Свой
Сообщений: 185
Регистрация: 5-05-06
Из: Ekaterinburg, Russia
Пользователь №: 16 821



Если использовать ассемблер первой версии (avrasm), то константы в директивах 32 бита целые, а если второй (avrasm2), то 64 бита с плавающей точкой. Из справки к AVR Studio:
Код
The Assembler incorporates constant expressions. Expressions can consist of operands, operators and functions. All expressions are internally 32 bits in AVRASM, and 64 bits in AVRASM2.
Operands
The following operands can be used:
User defined labels which are given the value of the location counter at the place they appear.
User defined variables defined by the SET directive
User defined constants defined by the EQU directive
Integer constants: constants can be given in several formats, including
Decimal (default): 10, 255
Hexadecimal (two notations): 0x0a, $0a, 0xff, $ff
Binary: 0b00001010, 0b11111111
Octal (leading zero): 010, 077
PC - the current value of the Program memory location counter
Floating point constants - AVRASM2 only.


--------------------
Чудес не бывает - бывает мало знаний и опыта!
Go to the top of the page
 
+Quote Post
Wild007
сообщение Oct 31 2006, 06:35
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



Цитата(GinRider @ Oct 30 2006, 14:47) *
Думаю, что компилятор автоматически использует INT, если его принудительно не пнуть, как во втором примере. Должен быть какой-то идентификатор, чтобы подсказать тип константы. Сталкивался с подобным на старых компиляторах для x51.

Но, ИМХО, значение в формуле 0x100-(TTT*20000000/1024) должен вычислять препроцессор, т.к. в ней используется различное представления чисел?


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
Andreas1
сообщение Oct 31 2006, 07:30
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 446
Регистрация: 12-03-06
Из: Москва
Пользователь №: 15 142



У меня не получалось назначить через .EQU нецелое, поэтому пользуюсь
#define - именно здесь можно использовать вещественные числа
Go to the top of the page
 
+Quote Post
Wild007
сообщение Oct 31 2006, 14:16
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



Решил проверить коректность работы компилятора, создал такую последователность команд:

.EQU A=4100
.EQU B=1000000
.EQU C=20000000
.EQU D=1024

LDI R18,low($100-(A/B*C/D));
LDI R19,high($100-(A/B*C/D))
;в результате R18=0x00 R19=0x01

LDI R18,low($100-(C/D*A/B));
LDI R19,high($100-(C/D*A/B))
;в результате R18=0xB0 R19=0x00 этот результат соответствует вычислению "в столбик" и можно заменить на строку
LDI R18,$100-(C/D*A/B);
без вылета в ERROR

LDI R18,low($100-((A/B)*(C/D)));
LDI R19,high($100-((A/B)*(C/D)))
;в результате R18=0x00 R19=0x01

LDI R18,low($100-((C/D)*(A/B)));
LDI R19,high($100-((C/D)*(A/B)))
;в результате R18=0x00 R19=0x01

Почему 2*3=6,а 3*2=5 sad.gif ?????????????????
Механизм получения правильного результата мне пока не ясен, может кто объяснит юзьверю smile.gif ?


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 14:52
Рейтинг@Mail.ru


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