Asm [AVR Studio] математические операции в процессе компила

Обсуждаем контроллеры компании Atmel.
Ответить
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Сообщение kras »

Задаю выражение:

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

.equ K_div = 10^6/(880*2^(27/12))
Правила другие какие-то. Подскажите, как сделать умножение, а может еще что поменять? Где почитать об этом? Как видно, это MATLAB'овский синтаксис.

2. Как сделать массив таких значений? То есть можно ли скомпилить один раз массив, и больше не генерировать его мк?
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Сообщение kras »

Кстати, понял, какие правила, вроде там и нету возведения в степень, хотя если есть - поделитесь секретом. А вот я не понимаю, как создать массив:(
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 330
Зарегистрирован: Чт июн 23, 2011 07:55:51

Сообщение korsaj »

Его не мк генерирует а компилятор (выполняет матиматические вычисления и результат присваивает константе K_div).
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Сообщение kras »

А мне так и надо. Ну пока начал делать по-другому, и пока понравилось так. Все числа на MATLAB посчитал, ок, в конце программы создал массив. Команда lmp позволяет обратиться к элементам этого массива, теперь следующий вопрос: как вычислить адрес некоторой метки? Мне из массива нужен ненулевой элемент. Моя попытка:

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

; выше в Z хранится смещение, но в итоге сейчас я решил сделать для простоты Z = 0000h
subi ZH, Low(-(key1<<1))
sbci ZL, High(-(key1<<1))

Не то выдает. key1 - метка начала байтового массива.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
Эиком - электронные компоненты и радиодетали
akl
Друг Кота
Сообщения: 4463
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Плохо понимаю в этих "кыржиках",

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

subi ZH, Low(-(key1<<1))
sbci ZL, High(-(key1<<1))
но ZH и ZL поменял бы местами
Реклама
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Сообщение kras »

поменял, но 1 в старшем регистре, а не 0, сейчас еще подумаю, почему. А самую простую программу написал! То есть теперь эта проблема. А как можно еще в AVR Studio задавать значения сигналов, идущих на входы PORTB?
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
akl
Друг Кота
Сообщения: 4463
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Знающий объяснил мне назначение этих "кыржиков". Я бы сделал, примерно, так

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

 .include "m8adef.inc"
.device ATmega8a
	;.equ key1 = 0
	.def key1_H=R22
	.def key1_L=R23
Reset:
	LDI	ZH,HIGH(TAB*2)
	LDI	ZL,LOW(TAB*2)

;	SUBI ZL, Low(-key1) ; такая конструкция, в принципе, бесполезна,
;	SBCI ZH, High(-key1); т.к. эти команды работают с константами
	ADD	ZL,key1_L
	ADC	ZH,key1_H
	LPM
; в R0 считывается значение массива 	
	RJMP	RESET

;	subi ZL, Low(-(key1<<1)) ;???????????? Тогда уж проще 	LDI	ZH,HIGH(key1*2)
;	sbci ZH, High(-(key1<<1)) ;??????????                   	LDI	ZL,LOW(key1*2)
	.ORG	$300
TAB:
	.DB	$77,$66,$55,$44
Друг Кота
Аватара пользователя
Сообщения: 15699
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

обращение к памяти программ пословное...
вот простейший пример массива:
znak7.txt
(2.12 КБ) 283 скачивания
может чего пряснится :tea:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

kras писал(а):Задаю выражение:

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

.equ K_div = 10^6/(880*2^(27/12))
Смысл делать такое выражение, если можно тупо на калькуляторе посчитать?
В этом случае все равно придется всю формулу заново лопатить.
Вот если пару чисел на Дефайненые константы заменить - то совсем другое дело.Типа этого:

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

.equ X = 880
.equ Y = 6
.equ K_div = 10^Y/(X*2^(27/12))
В поисках истины человек развивается.
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

kras писал(а):Задаю выражение:

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

.equ K_div = 10^6/(880*2^(27/12))
Если не ошибаюсь, то 4я студия не понимает дробные степени в режиме ассемблера.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Аватара пользователя
Сообщения: 15699
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

не стоит забывать, что все вычислительные заморочки в исходнике считает компилятор при трансляции а вот чего будет делать устройство при исполнении программы... :cry:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Точно точно, нужно результат привести еще к нужному виду, если это целое, то в целое превратить наверное,( правда как это на асме делается не представляю.)
А то получится дробь, а вы то не будете в программе своей учитывать и голову будете ломать в чем же дело.

Вообще есть в асме такая фича как 8000UL или тому подобное?
В поисках истины человек развивается.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

vitalik_1984 писал(а): Вообще есть в асме такая фича как 8000UL или тому подобное?
Переведи ! 8000 Вольт ?
Друг Кота
Аватара пользователя
Сообщения: 15699
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

это про такое что-ли?

"Функции

Определены следующие функции:
LOW(выражение) возвращает младший байт выражения
HIGH(выражение) возвращает второй байт выражения
BYTE2(выражение) то же что и функция HIGH
BYTE3(выражение) возвращает третий байт выражения
BYTE4(выражение) возвращает четвёртый байт выражения
LWRD(выражение) возвращает биты 0-15 выражения
HWRD(выражение) возвращает биты 16-31 выражения
PAGE(выражение) возвращает биты 16-21 выражения
EXP2(выражение) возвращает 2 в степени (выражение)
LOG2(выражение) возвращает целую часть log2(выражение)"
или в оригинальном helpе:
Functions
The following functions are defined:
LOW(expression) returns the low byte of an expression
HIGH(expression) returns the second byte of an expression
BYTE2(expression) is the same function as HIGH
BYTE3(expression) returns the third byte of an expression
BYTE4(expression) returns the fourth byte of an expression
LWRD(expression) returns bits 0-15 of an expression
HWRD(expression) returns bits 16-31 of an expression
PAGE(expression) returns bits 16-21 of an expression
EXP2(expression) returns 2 to the power of expression
LOG2(expression) returns the integer part of log2(expression)
The following functions are only defined in AVRASM2:
INT(expression) Truncates a floating point expression to integer (ie discards fractional part)
FRAC(expression) Extracts fractional part of a floating point expression (ie discards integer part).
Q7(expression) Converts a fractional floating point expression to a form suitable for the FMUL/FMULS/FMULSU instructions. (sign + 7-bit fraction)
Q15(expression) Converts a fractional floating point expression to a form suitable for the FMUL/FMULS/FMULSU instructions. (sign +15-bit fraction)
ABS() Returns the absolute value of a constant expression.
DEFINED(symbol) Returns true if symbol is previously defined using .equ/.set/.def directives. Normally used in conjunction with .if directives (.if defined(foo)), but may be used in any context. It differs from other functions in that parentheses around its argument are not required, and that it only makes sense to use a single symbol as argument.
STRLEN(string) returns the length of a string c+onstant, in bytes.

:)
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Jack_A писал(а): Переведи ! 8000 Вольт ?
каких вольт то? мы про компилятор говорим.
unsigned long
BOB51 , почти, только как сказать компилятору на сколько байт константу создавать?
В поисках истины человек развивается.
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

А никак.
Промежуточные вычсиления асм-компилятор делает в фиксированной разрядности (нужно смотреть документацию, в данном случае, я думаю, 32 бита).
И все константы автоматически в этой разрядности без необходимости указывать суффиксом.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15699
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

:)))
константу создаем мы сами, а остальное лишь для того, чтоб компилятор знал как чего обозвать и куда сунуть...
либо так:
.equ name = 0x55aa55
.set name2 = 0x70ff
либо так:
.cseg
signedw: .dw 0xf243
longconst: .dw 0x5589, 0x6699
а как воспринимать данные под меткой - выбирай сам - компилятор или выполнит то, что ему укажут или выдаст ошибку переполнения, если превышены возможности его вычислительных способностей по крайней мере, 4-х байтовые слова он понимает :)
Ответить

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