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

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Сообщение Мikа »

А можете подсказать, каким образом привязаться именно к конкретным битам конкретного регистра? Вы же не называете, например 0 буквой А(соответственно все 0 в программе), 1 буквой Б и т.п.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Реклама
akl
Друг Кота
Сообщения: 4470
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Мikа писал(а):Первый бит, который мне пришёл в голову - RXC для UARTа.
Замечу, RXC не доступен для записи. Лучше использовать UBRR, если в камне нет GPIO.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Все биты уже привязаны. В том же инклуде. Не изобретайте велосипед. А те, которые не привязаны можете обозвать сами через .def.
Например:

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

.def ABCDE=7

Фактически, Вы присваиваете здесь константе ABCDE число 7. И далее в программе можете использовать его для обращения к этому биту. Это нужно для того, чтобы допустим не забыть какой номер бита соответствует какому флагу в программе (из тех флагов, что Вы понапридумывали).
akl
Друг Кота
Сообщения: 4470
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

ИС-пытатель писал(а):Например:

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

.def ABCDE=7
:shock: Извините, но это ошибка.
Другой пример
Спойлер

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

	.equ	SCK=7
	.equ	DOUT=5
	.equ	SPI_IRQ=3
	.equ	SPI_CS=4
	.equ	SW_EN=6

	.def	_FF=R1
	.def	_01=R2
	.def	BIAS=R19


	.def	R_COUNT=R17
	.def	R_CRC=R18

	.def	R_DATA=R22

	.equ	BEGIN_POINT=$C0		; буфер памяти результата

	.equ	RAM_CONST=$70
	.equ	RAM_CONST_END=$B0

	.equ	BUF_COMAND=$60
	.equ	BUF_COMAND_END=$64

	.equ	N1_RAM=$80	; 32 байта скользящего среднего N1
	.equ	N2_RAM=$A0	; 32 байта скользящего среднего N2

	.set	PRIZ=0
	.set	PR_INIT=1
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Ого, set, я и не знал что им кто-то пользуется... Мне обычно equ хватает. А def да, только для переопределения РОН.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Ну, да, конечно же .equ или .set )) Ох уж эта каша в голове.. ) В Си #define. Ща прогу стряпаю с большим их количеством - вот .def и всунул с разгону. ))
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Сообщение Мikа »

Парни, так я как раз о том и говорю, что если присвоить имя какому-нибудь числу через

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

.equ   MPCM0   = 0
то это просто обзывание нуля таким именем. А если регистров с флагами 2, например. Поэтому я и поинтересовался, можно ли биты конкретного регистра как-то назвать? :)
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Да хоть 100 флагов, главное чтобы регистров хватило...
Спойлер

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

.def FLR1=R16 ;регистры под флаги, 2 шт.
.def FLR2=R17

.equ FLAG0=0 ;сами флаги, обзывайте как хотите
.equ FLAG1=1 ;желательно учитывая функциональность
.equ FLAG2=2
.equ FLAG3=3
.equ FLAG4=4
.equ FLAG5=5
.equ FLAG6=6
.equ FLAG7=7
.equ FLAG8=0
.equ FLAG9=1
.equ FLAG10=2
.equ FLAG11=3
.equ FLAG12=4
.equ FLAG13=5
.equ FLAG14=6
.equ FLAG15=7


.cseg
...
...
SBR FLR1,(1<<FLAG2) ;пример установки флагов
SBR FLR2,(1<<FLAG14)

SBRC FLR1,FLAG3 ;пример проверки флага
RCALL FLAG3_FUNCTION

А чтобы не путать какие флаги в каком регистре, имена флагов можно писать с префиксами: FL1_FLAG0, FL1_FLAG1,...,FL2_FLAG8,FL2_FLAG9.
Последний раз редактировалось Engineer_Keen Вт апр 22, 2014 10:26:13, всего редактировалось 2 раза.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Сообщение Мikа »

Ааа, разные имена для одинаковых цифр. Всё гениальное просто :) Спасибо!
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

#define в ассемблере тоже работает. Привязать имя бита к регистру? да нет проблем... указывайте регистр вместе с номером бита.

например #define zero_cross R25, 0
через EQU и SET сделать это невозможно да... #define мощнее этих директив, но и ответственность выше.(наворотить можно ууууу)
Что-то вроде такого:
Tbs7pmIdzW4.jpg
(44.2 КБ) 299 скачиваний
Еще есть макросы... определяешь один раз макрос и используешь каждый раз его имя вместо набора команд, а внутри макроса один раз указывается что делать с каким регистром и битом. #define по сути это тот же макрос только однострочный и без параметров. Уж использовать его для команд установки очистки битов - самое то.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

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

Сообщение Alexeyslav »

Стандартный AtmelStudio, всегда использую. Только надо иметь в виду - препроцессор регистрочувствительный, #DEFINE не сработает, будет писать "неизвестная директива" использовать нужно только #define. Я по началу путался, и не понимал почему не прокатывает, а оно вона как.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

В 4.19 тоже работает, впрочем дело тут не в версии студии, а в версии ассемблера, например директивы с '#' это фишки avrasm2.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

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

#define zero_cross R25, 0
А как тогда это в коде использовать, если мы тут и регистр обозначаем, и бит сразу?
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

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

#define WORK_DONE OCR0A, 1
#define zero_cross R25, 0
#define strobe PORTA, 4

SBRC zero_cross
SET
BST zero_cross
CBI WORK_DONE
CBI strobe
SBI strobe
Разве не удобно? Никакой путаницы какой бит какому регистру принадлежит - ты сам придумываешь имена и способ группировки этих флагов. Префиксами, например.
Так может быть группа из 12 бит распределенная по разным частям 2-3-5 регистров, а не только по 8.

Для работы с битами в регистрах правда, приходится использовать уже макросы т.к. нужно минимум 2 команды чтобы установить/сбросить бит в регистре.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

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

Сообщение Alexeyslav »

Для чего еще надо?
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

а какие возможности макросов в avr-as! :) я об ассемблере GNU, который в комплекте avr-gcc присутствует.
в свое время сделал и использовал макросы для написания такого вида кода:

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

   pushreg r1, r2, r16, r17 ; особый макрос сохранения в стеке списка регистров
... тут юзаем эти регистры
   popreg ; а этот макрос сам восстанавливает из стека ранее сохраненные регистры в нужном порядке
   ; и не надо запоминать, в каком порядке их в стек сохраняли!
   ret
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

А количество аргументов в макросе стандартно (допустим, равно исключительно 4)? или же оно плавает (может быть любым, но не меньше 1)? ;)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ИС-пытатель писал(а):А количество аргументов в макросе стандартно (допустим, равно исключительно 4)?
если этот вопрос по поводу моего сообщения, то отвечаю: может быть любым (за стопицот не поручусь, конечно :))) )
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

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