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

Обсуждаем контроллеры компании Atmel.
Ответить
sashavir
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт дек 30, 2014 21:35:51

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

Сообщение 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
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение 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
ну или как-то так... :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
sashavir
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт дек 30, 2014 21:35:51

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

Сообщение sashavir »

Спасибо! Тоже уже дошел до этого, вынес директивы set за подпрограмму...
Ответить

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