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

Обсуждаем контроллеры компании Atmel.
Ответить
akl
Друг Кота
Сообщения: 4470
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Команда CPI осуществляет знаковое сравнение, а команда BRLO осуществляет беззнаковое ветвление.
BRLO – Branch if Lower (Unsigned)
Кстати, команда BRSH тоже беззнаковая!!!
СКАЗОЧНИК писал(а):чтобы перевести его в обычное число надо вычесть единицу, а затем уже инвертировать...
Нет, надо проинвертировать и затем +1.

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

	cpi ZUUM, 125       ; Сравниваем с наибольшим
      brge NORM         ; Если больше или равно, то уходим на исправление
;      brsh NORM         ; Если больше или равно, то уходим на исправление
      cpi ZUUM, -55      ; Иначе, Сравниваем с наименьшим
      brlt NORMM         ; Если мньше, то уходим на исправление
;      brlo NORMM         ; Если мньше, то уходим на исправление
      rjmp TT            ; Иначе выходим вообще
NORM: ldi ZUUM, 125   ; Исправляем и уходим
      rjmp TT
NORMM: ldi ZUUM, -55
	RJMP	PC-1
TT:
	RJMP	TT

Реклама
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Если хочется иметь регулятор с отработкой и в 0 и в + и в - (DS18b20 к примеру) то для уменьшения мозготрепки можно контроль данных на больше/меньше делать с предварительно смещенной цифровой осью. Взять за условный 0 значение -55 а весь диапазон считать как 55+125=180 условных единиц уровня. Замер и обработка индикации выполняется в обычном режиме, а регулятор в приведенных к условным единичкам значениях.
8)
Реклама
akl
Друг Кота
Сообщения: 4470
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Проще пользоваться имеющимися командами работы со знаковыми числами.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

akl писал(а):BRLO осуществляет беззнаковое ветвление.
Елки палки... Тупизна моя зашкаливает :oops:
akl писал(а):проинвертировать и затем +1.
Это вроде же как перевести число в дополнительный код??? А если обратно, то и последовательность должна быть обратная? По крайней мере, у меня именно так работает.

З.Ы. Сейчас буду пробовать новые операторы. ))) Спасибо.

З.З.Ы. Точно РАБОТАЕТ! :music: А я два дня голову ломал... :facepalm:
Еще раз спасибо всем кто откликнулся! :beer:
Станислав
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

akl писал(а):Проще пользоваться имеющимися командами работы со знаковыми числами.

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

sbrc temp,MSB_BIT
neg temp
cpi temp,...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6347
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

akl писал(а):
СКАЗОЧНИК писал(а):чтобы перевести его в обычное число надо вычесть единицу, а затем уже инвертировать...
Нет, надо проинвертировать и затем +1.
Однохренственно.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

akl писал(а):Проще пользоваться имеющимися командами работы со знаковыми числами.
В основном таки возможно и да...
но регулируемый диапазон выбирает пользователь...
К примеру:
+1/-1 (средняя около нуля ходит)
или термостатируем в режиме нагреватель/холодильник объект на +37,
а температура в помещении от +20 до +35 (без кондиционера).
:roll:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 151
Зарегистрирован: Сб ноя 19, 2011 20:13:47
Откуда: Тамбов

Сообщение xorkrus »

Здравия желаю, уважаемые.
Вот тут я нашел почти то, что хотел. Единственное - хотелось бы чтобы состояние порта возвращалось в исходное через 5 секунд после переключения из браузера.
Обратился к автору - он не ответил :(
Пробовал сам - не понимаю. Ассемблер мне не дается от слова совсем :(
Был бы очень признателен уважаемым котам, если бы смогли поправить проект. И ещё больше был бы признателен, если бы рассказали как :)
Вложения
tinyhttp.zip
(12.72 КБ) 131 скачивание
Демократии нет и не будет!
Государство - это я!
Контактная информация:
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Сообщение Pnjom-Penb »

xorkrus писал(а):Пробовал сам - не понимаю. Ассемблер мне не дается от слова совсем.
Так напишите на Си, кто заставляет ограничиваться асмом?
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 151
Зарегистрирован: Сб ноя 19, 2011 20:13:47
Откуда: Тамбов

Сообщение xorkrus »

Pnjom-Penb писал(а):Так напишите на Си, кто заставляет ограничиваться асмом?
Atmel. Места в тиньке2313 маловато.
Демократии нет и не будет!
Государство - это я!
Контактная информация:
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Сообщение Pnjom-Penb »

Его в ней 2К, независимо от языка программирования.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 151
Зарегистрирован: Сб ноя 19, 2011 20:13:47
Откуда: Тамбов

Сообщение xorkrus »

Pnjom-Penb
Я вас понял. Сложно помочь - так и скажите. Если бы сумел уложиться в 2кб, то не обращался бы за помощью к таким проектам, а сделал бы все сам. Но увы не все являются супер программистами. Снимаю свой вопрос.
Демократии нет и не будет!
Государство - это я!
Контактная информация:
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Сообщение Pnjom-Penb »

xorkrus писал(а):Сложно помочь - так и скажите.
Именно помочь я и пытаюсь, однако, Вы же ищете не помощи, а того, чтобы кто-то сделал все вместо вас. Этого мне делать некогда. Поместите свое предложение в раздел "Есть работа" - туда заглядывают как раз те, кто может потратить свое время на решение ваших задач вместо вас - и все разрешится к вашему удовольствию.
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Привет всем!. Столкнулся я с непонятной мне вещью. Может кто разъяснит?
Есть обработчик прерывания по переполнению Timer0. Назвал его "Taimer". Он для того, чтобы если за определённое время не придёт некое событие не ждать тупо, а прыгать на метку . А вопрос в том, что при выходе из обработчика по RETI всё нормально, а вот если не дождались события выкидываю из стека адрес возврата и выхожу по RJMP, на метку . Но стек почему-то переполняется, после каждого перехода на метку SPL уменьшается на 2 (выводил в УАРТ SPL). Пришлось добавить ещё 2 POP, тогда всё нормально работает. Получилось 4 POP. Почему так?
Да, камень AT2313, Avr Studio4

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

Taimer:
	in 		r0,SREG
	inc		interrupt
	cpi		interrupt,80
	breq	        rst2
	out 	        SREG,r0
	reti
rst2:
 clr            interrupt
	pop		temp
	pop		temp
	pop		temp
	pop		temp
	rjmp	        taimer_overflow
Я всё-всё узнAю и стану профессором.
Друг Кота
Аватара пользователя
Сообщения: 4966
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

Ну прыгнул ты. А "out SREG,r0" кто будет делать?
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Seriyvolk писал(а):Ну прыгнул ты. А "out SREG,r0" кто будет делать?
Там, куда я прыгнул, SREG мне и нафиг не нужен, там почти начало прогрмаммы. Вопрос в стеке. SREG к стеку никакого отношения не имеет.
Я всё-всё узнAю и стану профессором.
akl
Друг Кота
Сообщения: 4470
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

По мне, это плохая практика. Почему бы не так
Спойлер

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

	.INCLUDE "tn2313def.inc"

.def	interrupt=r18
.def	temp=r16
	.CSEG

	.ORG	$0000
	RJMP	START

	.ORG	$0006
Taimer:
   inc      interrupt
   cpi      interrupt,80
;   breq           rst2
	BRLO	PC+2
	SET		; взвести флаг
	clr		interrupt
   reti
;rst2:
; clr            interrupt
 ;  pop      temp
  ; pop      temp
   ;pop      temp
;   pop      temp
;   rjmp		WAIT
;   rjmp           taimer_overflow


START:
	LDI	R22,LOW(RAMEND)
	OUT	SPL,R22

	LDI	R20,1<<TOIE0
	OUT	TIMSK,R20
	OUT	TIFR,R20

	LDI	R20,1<<SE
	OUT	MCUCR,R20

	LDI	R22,1
	OUT	TCCR0B,R22

	CLT
	SEI

WAIT:
	SLEEP
	BRTC	WAIT
taimer_overflow:
	NOP
	RJMP	START
.EXIT
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

А, понял, там, где ждём события дополнительно проверяем Т и если он взведён то уже оттуда прыгаем на метку? Или опять я не приехал?. Только по адресу $0006 будет RJMP, т.к. планирую завести собаку и она покусается с обработчиком по переполнению.
И всё же, почему мне пришлось ставить 4 POP а не 2? Просто интересно.
Я всё-всё узнAю и стану профессором.
akl
Друг Кота
Сообщения: 4470
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

dgrett писал(а):И всё же, почему мне пришлось ставить 4 POP а не 2? Просто интересно.
Не всё так безоблачно. Студия считает, что при выходе на метку указатель стека изменяется.
RJMP_ISR.GIF
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

akl писал(а):Не всё так безоблачно. Студия считает, что при выходе на метку указатель стека изменяется.
Да я тоже симулял свой код и следил за стеком. Всё ОК и с 2 ПОП ( в interrupt ставил 1, чтоб не гонять одно и то же 80 раз). Так ведь в железяке тинька перезагружалась, я потому и стал копаться. А за науку спасибо.
Я всё-всё узнAю и стану профессором.
Ответить

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