|
Ошибка в AVR Studio4 |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Oct 30 2006, 08:12
|

Профессионал
    
Группа: Свой
Сообщений: 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....
|
|
|
|
|
Oct 30 2006, 08:14
|

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

|
Цитата(TriD @ Oct 30 2006, 11:08)  HEX обозначается как $100 Не имеет значения Studio понимает любой вариант
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Oct 30 2006, 08:34
|

Местный
  
Группа: Свой
Сообщений: 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 это параметр ккоторый не хотелось бы менять
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Oct 30 2006, 08:56
|

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

|
Цитата(arttab @ Oct 30 2006, 11:41)  .EQU TTT=0.0041*20000000 LDI r17,0x100-(TTT/1024) так устроит? Похоже на ограничение студии Да. так работает (проверил со строкой в MACROSe) большое спасибо. Но конечно странное ограничение. Интересно с какого значения оно проявляется? Найду время -- проверю.
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Oct 30 2006, 11:47
|
Участник

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

|
Думаю, что компилятор автоматически использует INT, если его принудительно не пнуть, как во втором примере. Должен быть какой-то идентификатор, чтобы подсказать тип константы. Сталкивался с подобным на старых компиляторах для x51.
|
|
|
|
|
Oct 30 2006, 14:05
|
Частый гость
 
Группа: Свой
Сообщений: 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.
--------------------
Чудес не бывает - бывает мало знаний и опыта!
|
|
|
|
|
Oct 31 2006, 06:35
|

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

|
Цитата(GinRider @ Oct 30 2006, 14:47)  Думаю, что компилятор автоматически использует INT, если его принудительно не пнуть, как во втором примере. Должен быть какой-то идентификатор, чтобы подсказать тип константы. Сталкивался с подобным на старых компиляторах для x51. Но, ИМХО, значение в формуле 0x100-(TTT*20000000/1024) должен вычислять препроцессор, т.к. в ней используется различное представления чисел?
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Oct 31 2006, 14:16
|

Местный
  
Группа: Свой
Сообщений: 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  ????????????????? Механизм получения правильного результата мне пока не ясен, может кто объяснит юзьверю  ?
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|