Страница 1 из 1

Директива SET (ассемблер)

Добавлено: Пн сен 14, 2015 11:11:27
sashavir
Помогите пожалуйста разобраться! Читаю по мануалам, вроде как можно переназначать значения директивы .SET по ходу программы, но на практике компилятор вычисляет как-то непонятно для меня, цифры как будто с потолка берет...

Алгоритм следующий:

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

.set tack=4 (число тактов за микросекунду)

.set us=10  (задержка в микросекундах)

RCALL Delay (подпрограмма задержки)

Delay:
 .set timer=tack*us/5 (вычисляю кол-во проходов подпрограммы задержки, чтобы получилось необходимое кол-во микросекунд)
 		 LDI  temp,LOW(timer)
		 LDI  temp1,HIGH(timer)
		 LDI  temp2,BYTE3(timer)  (загружаю получившееся в результате вычислений значение)
		 
Delay_start:

		 SUBI temp,1
		 SBCI temp1,0
		 SBCI temp2,0

		 BRCC Delay_start

		 RET
Суть в следующем, назначаю постоянную величину тактов в микросекунду, и перед каждой задержкой вставляю разные значения .set us. Компилятор должен по смыслу обсчитать значения и подставить необходимые в программу, но на деле получается белиберда, результат как будто с потолка берется. Можно таким образом использовать директиву .set вообще?

Пробовал в AVR Studio 4.19 и 6.2

Re: Директива SET (ассемблер)

Добавлено: Пн сен 14, 2015 14:30:26
ARV
можно так:

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

.set tack=4 (число тактов за микросекунду)
.set us=10  (задержка в микросекундах)
.set timer=tack*us/5 (вычисляю кол-во проходов подпрограммы задержки, чтобы получилось необходимое кол-во микросекунд)
rcall Delay; в подпрограмме директивы .set быть не должно

.set us=20  (задержка в микросекундах)
.set timer=tack*us/5 (вычисляю кол-во проходов подпрограммы задержки, чтобы получилось необходимое кол-во микросекунд)
rcall Delay

.set us=30  (задержка в микросекундах)
.set timer=tack*us/5 (вычисляю кол-во проходов подпрограммы задержки, чтобы получилось необходимое кол-во микросекунд)
rcall Delay
для компилятора подпрограмма Delay - это одно включение, и оно компилируется 1 раз. если хотите с обработкой директивы .set, то надо оформлять макросом, чтобы каждое включение приводило к новому вычислению "переменных":

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

.macro WAIT
.set timer=tack*us/5 (вычисляю кол-во проходов подпрограммы задержки, чтобы получилось необходимое кол-во микросекунд)
rcall Delay
.endm
ну или как-то так... :)

Re: Директива SET (ассемблер)

Добавлено: Пн сен 14, 2015 15:52:37
sashavir
Спасибо! Тоже уже дошел до этого, вынес директивы set за подпрограмму...