Обсуждаем контроллеры компании Atmel.
Ср сен 27, 2023 20:27:49
chtulhu, сначала влево сдвигается младший регистр (ZL), а потом старший (ZH).
а чтобы не терялся бит при сдвиге, сдвиг нужно делать через перенос (rol ZH).
Чт сен 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
Чт сен 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)
Чт сен 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 раз.
Чт сен 28, 2023 18:36:19
А если через Сишный сдвиг вместо умножения?
- Код:
0<<1
Чт сен 28, 2023 18:41:37
А если через Сишный сдвиг вместо умножения?
- Код:
0<<1
То же самое. Сдвиги и прочие битовые операции запрещены, только сложение и вычитание с константами (var + var тоже не проходит). Вот тут
https://stackoverflow.com/questions/184 ... binary-and об этом читал
Чт сен 28, 2023 19:03:09
Херня какая-то, а не компилятор.
Чт сен 28, 2023 19:33:09
chtulhu, а кто мешает взять студийный ассемблер?
Это ж не компилятор, который может по разному оптимизировать?
ПС. Попробуйте воспользоваться явным заданием целевого регистра
LPM Rd, Z
или
LPM Rd, Z+ - тут заодно и увеличится на 1 регистровая пара
Чт сен 28, 2023 21:06:46
Указатель надо инкрементировать перед чтением следующего байта.
Много зависит от размещения данных в ПЗУ: побайтово, пословно, какая директива используется DB или DW (и как про то говорится в документации пользователя на имеющийся компилятор)...
Это только адрес метки начала массива нужно сдвигать на бит влево.
Чтение ВСЕГДА ПОБАЙТОВОЕ - сначала байт с адресом, содержащим B0 = 0, затем с адресом с b0=1.
Но то для avrasm2...
У GCC ассемблер имеет в основном вспомогательную функцию или потребуется весьма плотненько его документацию изучить...
Чт сен 28, 2023 22:11:51
BOB51, "перед чтением следующего" и "после чтения текущего" в данной трактовке равнозначны. Но LPM Rd,Z+ позволяет и байт прочитать, и указатель подвинуть.
DB и DW относятся только к размещению. LPM всегда читает побайтово..
Пт сен 29, 2023 09:02:14
Для АВРок у ПЗУ двойственность - вроде бы побайтовое, но команды то двухбайтовые и указатели на них (в том числе и на "метки" начала массивов) так же выставляются.
Результат чтения будет зависеть от того, как данные размещены в ПЗУ. При DW размещение оговорено(старший/младший байты слова) а вот при DB может быть произвольным.
Да и не всегда последовательное считывание выполняется.
К примеру - те же табличные кодеры/декодеры.
Пт сен 29, 2023 10:50:22
BOB51, LPM - он байтовый. И адрес ему скармливается байтовый. И можно начинать читать и с нечетного адреса.
А вот метка может указывать только на слово. Отсюда и требование к выравниванию .DB до четного числа байт.
А организация хранения данных в ПЗУ - байтовая, пословная, big/little endian - это уже вопрос логики, но не команды LPM.
Пт сен 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 раз.
Пт сен 29, 2023 19:50:30
С тем GNUассемблером (для АВР) чаще встречаются те, что под GCC для АВРок работают.
Или кому надобно вставки для ардуино (и/или других семейств, поддерживаемых GNU Си) на ассемблере делать.
Вт окт 10, 2023 11:36:00
Внезапно вопрос. Имею некое изделие чужого САНКЦИОНИРОВАННОГО авторства, которое нужно реанимировать (повторить изготовление) на ATmega165P. Проект написан в Студии на avrasm2. Я его пересобрал для MPLABX, благо с Божьей помощью и посредством PICkit4 через JTAG можно спокойно дебажить код.
Но есть нюанс. Я не обнаружил (видимо херово искал) в документации синтаксис инициализации ЕЕПРОМ в АСМ коде.
Потому и вопрос.
ЗЫ. Заодно может кто знает как и фьюзы включить в проект? А то MPLABX типа генерит код фьюзов для avrasm2, но с каким то странным файлом в инклюде - pega165p.inc и синтаксисом неизвестного генезиса.
Вт окт 10, 2023 13:46:43
Так а в чём вопрос-то?
З.Ы.: я в Студии фьюзы прошивал вручную, выставляя нужные галочки.
Вт окт 10, 2023 14:21:32
Вопрос в том, как прошить еепром. У меня из инструментов есть только ПИККИТ4, то есть я могу работать только с МПЛАБ. МПЛАБ генерирует для еепрома отдельный файл в формате хекса - .eep (я понял как ЕЕПРОМ инициализировать в исходнике - в секции .eseg). Но я не вижу в среде как этот файл залить в чип.
Про фьюзы
Как прошить фьюзы в ручном режиме я знаю. Но это неудобно. Обнаружив, что МПЛАБ генерит код для фьюзов, я решил спросить кто-что об этом знает.
Вт окт 10, 2023 15:53:22
В студии была отдельная кнопка для выбора файла и заливки данных в ЕЕПРОМ.
Вт окт 10, 2023 16:01:21
У АВРок в отличии от ПИКов нет прямого доступа к фузам из файла исходника, аналогичного тому, что есть в шапке ПИКовых...
Прошивку с еепром из софт-оболочек "любительских" программаторов делать можно - там и окно кода и окно еепром и окошко фузов.
Систему комплектной прошивки делает ардуиноIDE при загрузке бутлоадера (для выбранной "платформы" и установленных в окне настроек/опций параметрах) - но как там все "обустроено" надо в самой IDE (и настройках используемой софтинки -аврдуде) копаться.
Вт окт 10, 2023 17:22:32
У АВРок в отличии от ПИКов нет прямого доступа к фузам из файла исходника, аналогичного тому, что есть в шапке ПИКовых...
Есть все у АВР. Просто Атмел зачем то создал такую ситуацию в ПО. А поскольку ПО теперь пишет Микрочип, то и расклады стали другими. Иначе МПЛАБ не генерил бы код для фьюзов, а в настройках четвертого ПИККИТа возможность прошивки фьюзов управляема.
Добавлено after 3 minutes 8 seconds:Прошивку с еепром из софт-оболочек "любительских" программаторов делать можно
Мне не нужны любительские программаторы. У меня вообще работа идет через JTAG. Это позволяет иметь нормальную внутрисхемную отладку. Поэтому я произвольно меняю фьюзы и контроллер никогда не лочится.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.