Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

Alexeyslav писал(а):Теперь стало яснее почему твой финт не сработал?
Как бы да.
В том то и дело, что вразрез логике.
По логике: зашёл - объявил, ну и отменил объявление перед выходом.

А тут по тексту значит...

Ладно, приспособимся...
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Просто реализация такой функциональности потребовала бы плотного взаимодействия с компилятором. Это был бы уже не препроцессор, и пришлось бы цепляться за КАЖДЫЙ выпущенный компилятор и его особенности, кроме того в каждом компиляторе надо было бы предусмотреть связи с каждым выпущенным препрроцессором - а работа это столь бесполезна сколь масштабна. Кто это будет делать и зачем, верней за какие деньги. Как представишь сколько это костылей породит, так и поймёшь почему оно такое какое есть сейчас. Если бы была только одна пара компилятор-препроцессор, это было бы пол беды. Ну а в каких-то языках так и сделано, там где нет разнообразия компиляторов.
Контактная информация:
Реклама
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Всем здравствуйте. Никак не доходит такая вещь : надо, чтобы регистр при каждом проходе увеличивался на 1, до, скажем, 240. По достижении этого значения начинаем отнимать от регистра до, пусть, 80. Достигнув 80 снова увеличиваем до 240 и тд. Суммирую или отнимаю с другим регистром, в который гружу то 01 то FF. Задействовал и флаг Т , то проскакиваю границы , то топчусь у границы. Подмогните пж с алгоритмом.
Я всё-всё узнAю и стану профессором.
akl
Друг Кота
Сообщения: 4475
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Как вариант

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

START:
	LDI	R22,80
	LDI	R21,1
GO_240:
	RCALL	PROHOD
	ADD	R22,R21
	CPI	R22,240
	BRLO	GO_240
	LDI	R21,-1
GO_80:
	RCALL	PROHOD
	ADD	R22,R21
	CPI	R22,80
	BRSH	GO_80
	RJMP	START

PROHOD:
	RETI
Вариант с одним регистром

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

START:
	LDI	R22,80
GO_240:
	RCALL	PROHOD
	INC	R22
	CPI	R22,240
	BRLO	GO_240
GO_80:
	RCALL	PROHOD
	DEC	R22
	CPI	R22,80
	BRSH	GO_80
	RJMP	START

PROHOD:
	RETI
Последний раз редактировалось akl Ср авг 19, 2020 10:59:16, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Сам алгоритм может быть простой

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

// До цикла:
d = 1;
// В цикле:
if (reg >= 240) {
    d = -1;
}
if (reg <= 80) {
    d = 1;
}
reg += d;
Только на ассемблер сами переводите :)
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

я бы делал так:
(r2<>0) skip
r2=0x01 (либо r2=1 делать в инициализации)
(r1<240) skip
r2=0xff
(r1>80) skip
r2=0x01
r1+r2

(результат в r1. на асм думаю переведёшь)
и обязательно убедиться что r1 и r2 не портятся другим кодом между итерациями (или нужно сохранять и восстанавливать их значения)
а как сам ты делаешь? :dont_know:

Добавлено after 18 minutes 30 seconds:
akl, мне не очень понятен Ваш код...
например: вызывается PROHOD (заметь - именно вызов, а не ГоТо) а за меткой сразу RETI... куда он вернётся?

Добавлено after 1 minute 36 seconds:
и, наверно этот кусок кода должен вызываться извне, а не сам вызывать...

Добавлено after 1 minute 23 seconds:
хотя... если посмотреть под тем углом, что возврат - это и есть вызов... то, даже норм будет :beer:

Добавлено after 1 minute 41 second:
получается направление движения хранится не в регистре, а в векторе возврата
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

akl, Ваш код ещё не пробовал, WiseLord и Ivanoff, так я пробовал, топчусь у границы. Ведь когда меняем знак и идём в обратную сторону, то опять попадаем на условие и Тут же знак меняется. Вот и топчусь у границы. Пардон, у меня срочный вызов, сейчас проверить не могу.
Я всё-всё узнAю и стану профессором.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18828
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

а я бы делал так:
пусть CNT - счетный регистр, LMT регистр границы счета, STEP - регистр с приращением (1 или -1).
1. если CNT равно LMT, то 2, иначе 7
2. STEP инвертировать
3. если LMT равно 240, то 6
4. LMT = 240
5. перейти на 7
6. LMT = 80
7. CNT+STEP
8. перейти на 1
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

ARV, это, похоже, работать будет. Я делал почти также, только вместо РАВНО (у Вас увидел) использовал brcc , brcs вместо breq и brne. Спасибо, а я, долгоёп, раз не додумался. Но проверю позже (код а не долгоёп я или нет). :)
Но спасибо - всем тоже :)
Я всё-всё узнAю и стану профессором.
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

на условие надо попадать при выходе из диапазона, а не при попадании в него.
т.е должно быть не
если (x>=80) то y=1;
если (x<=240) то y=-1;
x+y

a
если (x<=80) то y=1;
если (x>=240) то y=-1
x+y

т.е при х от 80 до 240 не должно выполняться ни одно условие, тогда не будет топтания.

Добавлено after 3 minutes 7 seconds:
равно использовать не рекомендую т.к и при х=244(например) условие зашкала вверх не будет выполнено
хотя при правильном выполнении кода такого произойти и не сможет...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Я и сам очковался насчет РАВНО, потому и пользовал сначала brcs/brcc. сделал так, работает:

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

	
        ldi	Up_Down,1
        sei

Start:	
	cpi	counter2,LimitH		
	brsh	minusas
	
	cpi	counter2,LimitL
	brlo	pliusas
	rjmp	PliusMinus
pliusas:
	ldi	Up_Down,1
	rjmp	PliusMinus
minusas:
	ldi	Up_Down,-1
		
PliusMinus:	
	add	counter2,Up_Down
         ....
Всё считает как надо, туда-сюда
На скорую руку не получилось инвертировать с NEG, главное, работает, потом добью

Ещё раз спасибо! :beer:
Я всё-всё узнAю и стану профессором.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18828
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Ivanoff-iv писал(а):равно использовать не рекомендую т.к и при х=244(например) условие зашкала вверх не будет выполнено
хотя при правильном выполнении кода такого произойти и не сможет...
не смотря на то, что я и сам в своём коде вместо жесткого равенства использую не жесткое сравнение >= или <=, никто никогда мне не смог объяснить, с какого перепугу счетчик в программе вдруг примет некорректное значение? я и сам не понимаю, но да, на равно не проверяю :dont_know:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Прерывания используются? Одни и те же регистры используются в основном цикле и в прерывании? Регистр SREG сохраняется в случае использования прерываний?
Контактная информация:
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3881195#p3881195"]Прерывания используются? Одни и те же регистры используются в основном цикле и в прерывании? Регистр SREG сохраняется в случае использования прерываний?[/uquote]
Да, используются, ВСЕ используемые прерыванием регистры и срег сохраняются, я ж не совсем чайник.
Если что, тини 13, свободны только 2 регистра. В РАМе только стек.
Я всё-всё узнAю и стану профессором.
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Тогда проект в студию, в той версии, с чего начался диалог. Где ошибка.
Контактная информация:
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3881203#p3881203"]Тогда проект в студию, в той версии, с чего начался диалог. Где ошибка.[/uquote]
Да всё хорошо, ведь разобрались уже. Всё арбайт.
Я всё-всё узнAю и стану профессором.
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

Коллеги, тут что-то непонятное с эмуляцией SPI на АТмеге 328Р. Первый раз решил поиграть с аппаратным SPI.
Спойлер

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

.equ	SPIDIV4=0
.equ	SPIDIV16=1
.equ	SPIDIV64=2
.equ	SPIDIV128=3
.equ	hSPIE=1<<SPIE
.equ	hSPE=1<<SPE
.equ	hDORD=1<<DORD
.equ	hMSTR=1<<MSTR
.equ	hCPOL=1<<CPOL
.equ	hCHAP=1<<CPHA


	ldi	r16,0x29 ; PB0, 3 & 5 -> Out
	out	DDRB,r16
L0:ldi	r16,hSPE | hMSTR | SPiDIV64
	out	SPCR,r16

	ldi	r17,10
L1:ldi	r16,0xFF
	 out	SPDR,r16
L2:in	r16,SPSR
	sbrs	r16,SPIF
	rjmp	L2
	subi	r17,1
	brne	L1
	ldi	r16,0x21
	out	portb,r16
	rjmp	pc

Прерывания запрещены. Код обмена я, в общем-то, списал из ДШ, только метки написал свои, и не стал оформлять подпрограммой, просто вставил внутренней частью своего цикла - 10 раз выдать на SPI код 0xFF. И оно не работает. Посмотрел в симуляторе, почему-то после первой или второй записи в SPDR гаснет бит MSTR (мастер) в SPXR, после чего навсегда гаснет бит SPIF в SPSR, и программа навсегда зацикливает в проверке под меткой L2. В реале тоже не работает - на бите 0х20 порта В (РВ5) висит светик, который зажигается при записи туда 1, так он не зажигается. ЧЯДНТ?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Друг Кота
Аватара пользователя
Сообщения: 15816
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Скорее симуляция аппаратного модуля с ограничениями - для начала посмотрите ерраты по симуляции в используемой IDE.
:roll:
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

1- А сбрасывать флаг SPIF кто будет?
2 - Вы оригинал? На куа subi вместо dec?!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15816
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Ну в данном случае что subi r17,1 , что dec R17 делают одно и то же и по размеру одинаковы - по 2 байта.
Другое дело - если бы контроль не по Z, а по С выполнялся...
:roll:
Ответить

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