Обсуждаем контроллеры компании Atmel.
Ответить

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

Ср сен 27, 2023 20:27:49

chtulhu, сначала влево сдвигается младший регистр (ZL), а потом старший (ZH).
а чтобы не терялся бит при сдвиге, сдвиг нужно делать через перенос (rol ZH).

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

Чт сен 28, 2023 15:14:26

Игорь_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

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

Чт сен 28, 2023 17:52:26

Код:
   ldi ZL, lo8(variable)
   ldi ZH, hi8(variable)

   lsl ZL
   rol ZH


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

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

Чт сен 28, 2023 18:33:55

Код:
   ldi ZL, lo8(variable)
   ldi ZH, hi8(variable)

   lsl ZL
   rol ZH


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


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

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

Чт сен 28, 2023 18:36:19

А если через Сишный сдвиг вместо умножения?
Код:
0<<1

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

Чт сен 28, 2023 18:41:37

А если через Сишный сдвиг вместо умножения?
Код:
0<<1


То же самое. Сдвиги и прочие битовые операции запрещены, только сложение и вычитание с константами (var + var тоже не проходит). Вот тут https://stackoverflow.com/questions/184 ... binary-and об этом читал

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

Чт сен 28, 2023 19:03:09

Херня какая-то, а не компилятор.

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

Чт сен 28, 2023 19:33:09

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

ПС. Попробуйте воспользоваться явным заданием целевого регистра
LPM Rd, Z
или
LPM Rd, Z+ - тут заодно и увеличится на 1 регистровая пара

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

Чт сен 28, 2023 21:06:46

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

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

Чт сен 28, 2023 22:11:51

BOB51, "перед чтением следующего" и "после чтения текущего" в данной трактовке равнозначны. Но LPM Rd,Z+ позволяет и байт прочитать, и указатель подвинуть.
DB и DW относятся только к размещению. LPM всегда читает побайтово..

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

Пт сен 29, 2023 09:02:14

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

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

Пт сен 29, 2023 10:50:22

BOB51, LPM - он байтовый. И адрес ему скармливается байтовый. И можно начинать читать и с нечетного адреса.
А вот метка может указывать только на слово. Отсюда и требование к выравниванию .DB до четного числа байт.
А организация хранения данных в ПЗУ - байтовая, пословная, big/little endian - это уже вопрос логики, но не команды LPM.

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

Пт сен 29, 2023 15:23:32

Вобщем, решение оказалось исключительно простым и очевидным, но только когда ты о нём знаешь. Оказывается, в gcc-шном ассемблере вообще не нужен этот сдвиг. Надо просто записать адрес как есть, в виде
Код:
   ldi ZL, lo8(table)
   ldi ZH, hi8(table)

а сдвигами, как я понял, занимается линковщик. Всем спасибо за участие, а я для себя за эти пару дней приобрёл чуть более глубокое понимание организации памяти и вообще плотно поработал с ассемблером.

На всякий случай, прикреплю эту https://eclipse.umbc.edu/robucci/cmpe31 ... _Assembly/ ссылку - там автор сравнивает аврный и гццшный ассемблер, и показывает, в чём они различаются
Последний раз редактировалось chtulhu Пт сен 29, 2023 21:31:46, всего редактировалось 1 раз.

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

Пт сен 29, 2023 19:50:30

С тем GNUассемблером (для АВР) чаще встречаются те, что под GCC для АВРок работают.
Или кому надобно вставки для ардуино (и/или других семейств, поддерживаемых GNU Си) на ассемблере делать.
8)

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

Вт окт 10, 2023 11:36:00

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

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

Вт окт 10, 2023 13:46:43

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

З.Ы.: я в Студии фьюзы прошивал вручную, выставляя нужные галочки.

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

Вт окт 10, 2023 14:21:32

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

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

Вт окт 10, 2023 15:53:22

В студии была отдельная кнопка для выбора файла и заливки данных в ЕЕПРОМ.

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

Вт окт 10, 2023 16:01:21

У АВРок в отличии от ПИКов нет прямого доступа к фузам из файла исходника, аналогичного тому, что есть в шапке ПИКовых...
Прошивку с еепром из софт-оболочек "любительских" программаторов делать можно - там и окно кода и окно еепром и окошко фузов.
Систему комплектной прошивки делает ардуиноIDE при загрузке бутлоадера (для выбранной "платформы" и установленных в окне настроек/опций параметрах) - но как там все "обустроено" надо в самой IDE (и настройках используемой софтинки -аврдуде) копаться.
:roll:

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

Вт окт 10, 2023 17:22:32

У АВРок в отличии от ПИКов нет прямого доступа к фузам из файла исходника, аналогичного тому, что есть в шапке ПИКовых...

Есть все у АВР. Просто Атмел зачем то создал такую ситуацию в ПО. А поскольку ПО теперь пишет Микрочип, то и расклады стали другими. Иначе МПЛАБ не генерил бы код для фьюзов, а в настройках четвертого ПИККИТа возможность прошивки фьюзов управляема.

Добавлено after 3 minutes 8 seconds:
Прошивку с еепром из софт-оболочек "любительских" программаторов делать можно

Мне не нужны любительские программаторы. У меня вообще работа идет через JTAG. Это позволяет иметь нормальную внутрисхемную отладку. Поэтому я произвольно меняю фьюзы и контроллер никогда не лочится.
Ответить