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

Обсуждаем контроллеры компании Atmel.
Ответить
Модератор
Аватара пользователя
Сообщения: 19079
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

chtulhu, сначала влево сдвигается младший регистр (ZL), а потом старший (ZH).
а чтобы не терялся бит при сдвиге, сдвиг нужно делать через перенос (rol ZH).
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Родился
Сообщения: 10
Зарегистрирован: Вс апр 21, 2019 13:04:18

Сообщение chtulhu »

Игорь_396, Starichok51, спасибо за советы, Z регистр удваивается как должно, но у меня всё равно выходит какая-то ерунда. lpm по прежнему пишет в r0 значение 0xff (проверял в simavr). Сократил пример до минимально нерабочего

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

#define __SFR_OFFSET 0
	
#include	"avr/io.h"

	/* Секция кода */

	/*
1	0x000(1)	RESET	External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset
2	0x001	INT0	External Interrupt Request 0
3	0x002	INT1	External Interrupt Request 1
4	0x003	TIMER2 COMP	Timer/Counter2 Compare Match
5	0x004	TIMER2 OVF	Timer/Counter2 Overflow
6	0x005	TIMER1 CAPT	Timer/Counter1 Capture Event
7	0x006	TIMER1 COMPA	Timer/Counter1 Compare Match A
8	0x007	TIMER1 COMPB	Timer/Counter1 Compare Match B
9	0x008	TIMER1 OVF	Timer/Counter1 Overflow
10	0x009	TIMER0 OVF	Timer/Counter0 Overflow
11	0x00A	SPI, STC	Serial Transfer Complete
12	0x00B	USART, RXC	USART, Rx Complete
13	0x00C	USART, UDRE	USART Data Register Empty
14	0x00D	USART, TXC	USART, Tx Complete
15	0x00E	ADC	ADC Conversion Complete
16	0x00F	EE_RDY	EEPROM Ready
17	0x010	ANA_COMP	Analog Comparator
18	0x011	TWI	Two-wire Serial Interface
19	0x012	SPM_RDY	Store Program Memory Ready
	*/
	
	.section .text
	.org 0x0000
	
	rjmp RESET_vect
	reti	 		; INT0
	reti			; INT1
	reti			; TIMER2_COMP
	reti			; TIMER2_OVF
	reti			; TIMER1_CAPT
	reti			; TIMER1_COMPA
	reti			; TIMER1_COMPB
	reti			; TIMER1_OVF
	reti			; TIMER0_OVF
	reti			; SPI_STC
	reti			; USART_RXC
	reti			; USART_UDRE
	reti			; USART_TXC
	reti			; ADC
	reti			; EE_RDY
	reti			; ANA_COMP
	reti			; TWI
	reti			; SPM_RDY	
	
RESET_vect:
	ldi r16, RAMEND & 0xff
	out SPL, r16
	ldi r16, RAMEND >> 8
	out SPH, r16

	ldi r16, 0xff
	out DDRC, r16

	ldi r16, 0b00000000
	out PORTC, r16

	ldi ZL, lo8(variable)
	ldi ZH, hi8(variable)

	lsl ZL
	rol ZH
	
	lpm
	out PORTC, r0

_main:	
	rjmp _main

variable:
	.word 0xdead 

Реклама
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

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

   ldi ZL, lo8(variable)
   ldi ZH, hi8(variable)

   lsl ZL
   rol ZH
Забыл уже почти ассемблер. Но мне кажется, можно сразу указывать
ldi ZL, lo8(variable*2)
ldi ZH, hi8(variable*2)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Родился
Сообщения: 10
Зарегистрирован: Вс апр 21, 2019 13:04:18

Сообщение chtulhu »

[uquote="Gudd-Head",url="/forum/viewtopic.php?p=4482197#p4482197"]

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

   ldi ZL, lo8(variable)
   ldi ZH, hi8(variable)

   lsl ZL
   rol ZH
Забыл уже почти ассемблер. Но мне кажется, можно сразу указывать
ldi ZL, lo8(variable*2)
ldi ZH, hi8(variable*2)
[/uquote]

Для ассемблера, который поставляется вместе с atmel studio да, можно указывать так. Но gcc-шный ассемблер выдаст ошибку. Как я понял, это связано с особенностями работты линковщика (или, если быть точнее -- с особенностями elf файлов) -- умножение и сложение взаимно нетранзитивны, и из-за этого итоговый адрес может быть неоднозначно определён (в зависимости от порядка вычислений). Генерируются ли elf файлы в ассемблере от авр, я не знаю
Последний раз редактировалось chtulhu Чт сен 28, 2023 18:39:12, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

А если через Сишный сдвиг вместо умножения?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Родился
Сообщения: 10
Зарегистрирован: Вс апр 21, 2019 13:04:18

Сообщение chtulhu »

[uquote="Gudd-Head",url="/forum/viewtopic.php?p=4482233#p4482233"]А если через Сишный сдвиг вместо умножения? [/uquote]

То же самое. Сдвиги и прочие битовые операции запрещены, только сложение и вычитание с константами (var + var тоже не проходит). Вот тут https://stackoverflow.com/questions/184 ... binary-and об этом читал
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Херня какая-то, а не компилятор.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Вымогатель припоя
Аватара пользователя
Сообщения: 554
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

chtulhu, а кто мешает взять студийный ассемблер?
Это ж не компилятор, который может по разному оптимизировать?

ПС. Попробуйте воспользоваться явным заданием целевого регистра
LPM Rd, Z
или
LPM Rd, Z+ - тут заодно и увеличится на 1 регистровая пара
Белая и Пушистая
Я не ИИ, поэтому могу ошибаться.
Друг Кота
Аватара пользователя
Сообщения: 15705
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Указатель надо инкрементировать перед чтением следующего байта.
Много зависит от размещения данных в ПЗУ: побайтово, пословно, какая директива используется DB или DW (и как про то говорится в документации пользователя на имеющийся компилятор)...
Это только адрес метки начала массива нужно сдвигать на бит влево.
Чтение ВСЕГДА ПОБАЙТОВОЕ - сначала байт с адресом, содержащим B0 = 0, затем с адресом с b0=1.
Но то для avrasm2...
У GCC ассемблер имеет в основном вспомогательную функцию или потребуется весьма плотненько его документацию изучить...
:roll:
Вымогатель припоя
Аватара пользователя
Сообщения: 554
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

BOB51, "перед чтением следующего" и "после чтения текущего" в данной трактовке равнозначны. Но LPM Rd,Z+ позволяет и байт прочитать, и указатель подвинуть.
DB и DW относятся только к размещению. LPM всегда читает побайтово..
Белая и Пушистая
Я не ИИ, поэтому могу ошибаться.
Друг Кота
Аватара пользователя
Сообщения: 15705
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Для АВРок у ПЗУ двойственность - вроде бы побайтовое, но команды то двухбайтовые и указатели на них (в том числе и на "метки" начала массивов) так же выставляются.
Результат чтения будет зависеть от того, как данные размещены в ПЗУ. При DW размещение оговорено(старший/младший байты слова) а вот при DB может быть произвольным.
Да и не всегда последовательное считывание выполняется.
К примеру - те же табличные кодеры/декодеры.
8)
Вымогатель припоя
Аватара пользователя
Сообщения: 554
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

BOB51, LPM - он байтовый. И адрес ему скармливается байтовый. И можно начинать читать и с нечетного адреса.
А вот метка может указывать только на слово. Отсюда и требование к выравниванию .DB до четного числа байт.
А организация хранения данных в ПЗУ - байтовая, пословная, big/little endian - это уже вопрос логики, но не команды LPM.
Белая и Пушистая
Я не ИИ, поэтому могу ошибаться.
Родился
Сообщения: 10
Зарегистрирован: Вс апр 21, 2019 13:04:18

Сообщение chtulhu »

Вобщем, решение оказалось исключительно простым и очевидным, но только когда ты о нём знаешь. Оказывается, в gcc-шном ассемблере вообще не нужен этот сдвиг. Надо просто записать адрес как есть, в виде

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

	ldi ZL, lo8(table)
	ldi ZH, hi8(table)
а сдвигами, как я понял, занимается линковщик. Всем спасибо за участие, а я для себя за эти пару дней приобрёл чуть более глубокое понимание организации памяти и вообще плотно поработал с ассемблером.

На всякий случай, прикреплю эту https://eclipse.umbc.edu/robucci/cmpe31 ... _Assembly/ ссылку - там автор сравнивает аврный и гццшный ассемблер, и показывает, в чём они различаются
Последний раз редактировалось chtulhu Пт сен 29, 2023 21:31:46, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 15705
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

С тем GNUассемблером (для АВР) чаще встречаются те, что под GCC для АВРок работают.
Или кому надобно вставки для ардуино (и/или других семейств, поддерживаемых GNU Си) на ассемблере делать.
8)
Друг Кота
Аватара пользователя
Сообщения: 25562
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Внезапно вопрос. Имею некое изделие чужого САНКЦИОНИРОВАННОГО авторства, которое нужно реанимировать (повторить изготовление) на ATmega165P. Проект написан в Студии на avrasm2. Я его пересобрал для MPLABX, благо с Божьей помощью и посредством PICkit4 через JTAG можно спокойно дебажить код.
Но есть нюанс. Я не обнаружил (видимо херово искал) в документации синтаксис инициализации ЕЕПРОМ в АСМ коде.
Потому и вопрос.
ЗЫ. Заодно может кто знает как и фьюзы включить в проект? А то MPLABX типа генерит код фьюзов для avrasm2, но с каким то странным файлом в инклюде - pega165p.inc и синтаксисом неизвестного генезиса.
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Так а в чём вопрос-то?

З.Ы.: я в Студии фьюзы прошивал вручную, выставляя нужные галочки.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 25562
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Вопрос в том, как прошить еепром. У меня из инструментов есть только ПИККИТ4, то есть я могу работать только с МПЛАБ. МПЛАБ генерирует для еепрома отдельный файл в формате хекса - .eep (я понял как ЕЕПРОМ инициализировать в исходнике - в секции .eseg). Но я не вижу в среде как этот файл залить в чип.
Про фьюзы
Как прошить фьюзы в ручном режиме я знаю. Но это неудобно. Обнаружив, что МПЛАБ генерит код для фьюзов, я решил спросить кто-что об этом знает.
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

В студии была отдельная кнопка для выбора файла и заливки данных в ЕЕПРОМ.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 15705
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

У АВРок в отличии от ПИКов нет прямого доступа к фузам из файла исходника, аналогичного тому, что есть в шапке ПИКовых...
Прошивку с еепром из софт-оболочек "любительских" программаторов делать можно - там и окно кода и окно еепром и окошко фузов.
Систему комплектной прошивки делает ардуиноIDE при загрузке бутлоадера (для выбранной "платформы" и установленных в окне настроек/опций параметрах) - но как там все "обустроено" надо в самой IDE (и настройках используемой софтинки -аврдуде) копаться.
:roll:
Друг Кота
Аватара пользователя
Сообщения: 25562
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="BOB51",url="/forum/viewtopic.php?p=4487421#p4487421"]У АВРок в отличии от ПИКов нет прямого доступа к фузам из файла исходника, аналогичного тому, что есть в шапке ПИКовых...[/uquote]
Есть все у АВР. Просто Атмел зачем то создал такую ситуацию в ПО. А поскольку ПО теперь пишет Микрочип, то и расклады стали другими. Иначе МПЛАБ не генерил бы код для фьюзов, а в настройках четвертого ПИККИТа возможность прошивки фьюзов управляема.

Добавлено after 3 minutes 8 seconds:
[uquote="BOB51",url="/forum/viewtopic.php?p=4487421#p4487421"]Прошивку с еепром из софт-оболочек "любительских" программаторов делать можно[/uquote]
Мне не нужны любительские программаторы. У меня вообще работа идет через JTAG. Это позволяет иметь нормальную внутрисхемную отладку. Поэтому я произвольно меняю фьюзы и контроллер никогда не лочится.
Ответить

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