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

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

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

Сообщение ARV »

ВитГо писал(а):Еще один вопрос а можно ли организовать чтение из программной памяти при помощи индексной индексации ?
а как же! чтение флеш осуществляется командой LPM,
которая в том числе имеет и вариант LPM Rd, Z+. для адресации используется регистровая пара Z

внимание! не для любых МК сие верно! смотрите хелп к ассемблеру - там все расписано.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

ARV писал(а):
ВитГо писал(а):Еще один вопрос а можно ли организовать чтение из программной памяти при помощи индексной индексации ?
а как же! чтение флеш осуществляется командой LPM,
которая в том числе имеет и вариант LPM Rd, Z+. для адресации используется регистровая пара Z

внимание! не для любых МК сие верно! смотрите хелп к ассемблеру - там все расписано.

Cтоп !!
А разве LPM Rd , Z+ это не чтение с постинкрементом ? - это не то... :-( я сейчас как раз ее и пользую... но при этой операции Z инкрементируется..
а мне нужно без инкремента прочитать по адресу Z+10

p.s. блин, наверное мегу я буду долго осваивать - а разве у AVR MEGA настолько разный набор команд ?!! где можно найти команды именно для меги64 ? (а то может там и команды деления есть ?!)
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

а мне нужно без инкремента прочитать по адресу Z+10

LPM Rd, Z читает без постинкремента. У вас нет даташита на контроллер?
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

ploop писал(а):
а мне нужно без инкремента прочитать по адресу Z+10

LPM Rd, Z читает без постинкремента. У вас нет даташита на контроллер?


гм.. господа коты :-) у меня всего 78 сообщений на форуме, но вопрос я задал достаточно четко..

мне нужно прочитать данные из программной памяти используя индексную адресацию
аналог LDD Rd , X + s
где s - смещение адреса для чтения... если правильно помню 6-ти битовое...

про чтение из программной памяти
LPM Rd , X - косвенная адресация
LPM Rd , X - косвенная адресация и постинкремент указателя
я в курсе, знаю, уже использую.. вопросов в них у меня не возникло..

объясню зачем мне это нужно..
есть набор данных, данные это структура..
в X (Z, Y) у меня адрес первого байта структуры..
мне нужно считать 10ый байт структуры.. потом в зависимости от его значения, например, 5 или еще какой нить... и так далее..
Для этого удобно применять именно индексную адресацию, а не инкрементировать\декрементировать каждый раз указатель (X, Y, Z)..

сейчас, за неимением (не знанием как организовать) индексной адресации делаю как раз с движением указателя..
LDI r16, 10
LDI r17, 0
ADD XL , r16
ADC XH , r17
; в X указатель на 10ый байт..
но такой способ не удобен если указатель приходиться двигать вперед назад...
раскидать структуру по регистрам тоже не выход (структура около 20 байт) - все займу.. да и не получиться все равно (уже продумывал это)


p.s. кто может показать работающий код самопрограммирования программной памяти ?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

сейчас, за неимением (не знанием как организовать) индексной адресации делаю как раз с движением указателя..
<...>
но такой способ не удобен если указатель приходиться двигать вперед назад...

Я например другого способа не знаю, может у меги 64 есть и другие возможности, но читать даташит за вас желания нет.
Не удобен в каком плане?
Обычно делается так:
1. Под число 0 можно отвести один из нижних регистров (т.к. используется постоянно)
2. Сложение двухбайтных чисел или регистровых пар выполнить макросом или подпрограммой (в зависимости от того, какая оптимизация нужна, по скорости или коду)
После этого, для движения указателя можно использовать такие конструкции:
LDI r16, 10
rcall load_byte

или в случае с макросом
load_byte 10 Rd
Реклама
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

ploop писал(а):Я например другого способа не знаю, может у меги 64 есть и другие возможности, но читать даташит за вас желания нет.

почему нет? есть !!
просто я ничего в нем по своему вопросу не нашел.. но учитывая что я еще не большой спец. в программировании мег на асме - спросил...
ploop писал(а):Не удобен в каком плане?
Обычно делается так:
1. Под число 0 можно отвести один из нижних регистров (т.к. используется постоянно)
2. Сложение двухбайтных чисел или регистровых пар выполнить макросом или подпрограммой (в зависимости от того, какая оптимизация нужна, по скорости или коду)
После этого, для движения указателя можно использовать такие конструкции:
LDI r16, 10
rcall load_byte

или в случае с макросом
load_byte 10 Rd


я именно так и делаю.. только процедура по другому называется.. но сути это не меняет..

указатель приходиться постоянно двигать.. да и время теряем (а оно нужно для вычислений)

просто когда то очень давно еще на Z80 была возможность индексной адресации - это было очень удобно при программировании работы с массивами или структурами...
в меге для RAM такие команды есть (LDD)... а вот для FLASH - с учетом того что никто ничего не подсказал - значит нет... (я это и сам увидел, просто надеялся что все таки не дочитал чего нить и меня общественность обрадует по этому вопросу)
Реклама
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

к сожалению в АVRках есть только LPM LPM Rb,Z и LPM Rb,Z+ все...
Чем дальше, тем больше становлюсь занудой...
Изображение
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

GP1 писал(а):к сожалению в АVRках есть только LPM LPM Rb,Z и LPM Rb,Z+ все...


угу :-(

а с самопрограммированием поможете ?

хочу некоторые переменные хранить где нить в программной памяти.. чтобы не расходовать еепром (эта память у меня все наперечет!)....

уже столько всего почитал про самопрограммирование но как то не складывается у меня "домик" :-(
есть работающий код ?
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

ВитГо писал(а):
а с самопрограммированием поможете ?


Во-во, и мне будет интересно почитать, а то как-то брался, сразу не получилось - бросил . Не очень-то тогда нужно было.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Я так понимаю, это возможно только на МК с поддержкой бутлоадера? Тогда тоже интересно посмотреть...
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

Jack_A писал(а): Во-во, и мне будет интересно почитать, а то как-то брался, сразу не получилось - бросил . Не очень-то тогда нужно было.
ю ?

А вас на какой меге интересует ?
а то может быть соберем все что есть ?

я никак с областями RWW и NRWW не разберусь... :(
что где находиться и как задается (если задается вообще, а то может быть это жестко заданные области)

аа, и еще: внутри меги получается есть специальный буфер для самопрограммирования ? (его заполняют при помощи SPM) или этот буфер нужно выделять в RAM (или он сам выделяется?)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

ресурс программной flash ограничен всего 10000 записей, причем запись возможна только страницами с предварительным стиранием всей страницы. гораздо правильнее поставить внешнюю EEPROM (i2c или spi), чем маяться с заведомо неразумной идеей хранения промежуточных данных в программной flash.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

Вот табличка по размерам областей..
Тип меги Размер страницы (слов) размер NRWW (страниц)

Device Include file name Page size (words) NRWW section size (pages) Total memory (pages) SPM Control register
ATmega8 iom8.h 32 32 128 SPMCR
ATmega8515 iom8515.h 32 32 128 SPMCR
ATmega8535 iom8535.h 32 32 128 SPMCR
ATmega88 iom88.h 32 32 128 SPMCSR
ATmega16 iom16.h 64 16 128 SPMCR
ATmega162 iom162.h 64 16 128 SPMCR
ATmega163 iom163.h 64 16 128 SPMCR
ATmega165 iom165.h 64 16 128 SPMCSR
ATmega168 iom168.h 64 16 128 SPMCSR
ATmega169 iom169.h 64 16 128 SPMCSR
ATmega32 iom32.h 64 32 256 SPMCR
ATmega323 iom323.h 64 16 256 SPMCR
ATmega329 iom329.h 64 32 256 SPMCSR
ATmega3290 iom3290.h 64 32 256 SPMCSR
ATmega64 iom64.h 128 32 256 SPMCR
ATmega649 iom649.h 128 32 256 SPMCSR
ATmega6490 iom6490.h 128 32 256 SPMCSR
ATmega128 iom128.h 128 32 512 SPMCSR
ATmega128_1 iom128.h 128 32 512 SPMCSR


Для 64ой меги - 128 байт в одной странице
размер области NRWW 32 страницы
всего размер памяти 256 страниц..

теперь вопрос - а как задается конкретно адрес начала области NRWW ? (я правильно понимаю что код производящий запись в программную память должен находиться в этой области?)
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

ARV писал(а):ресурс программной flash ограничен всего 10000 записей, причем запись возможна только страницами с предварительным стиранием всей страницы. гораздо правильнее поставить внешнюю EEPROM (i2c или spi), чем маяться с заведомо неразумной идеей хранения промежуточных данных в программной flash.


а мы не будем там хранить промежуточные данные !
только итоговые :))

10000 раз это настолько много ! :-)) мне хватит !!
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Так как запускать программы из ОЗУ не позволяет архитектура, то это единственный способ сделать самомодифицирующийся вирус для AVR :))
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

оо!! вот что еще нашел.. может быть чтото не совсем правильно, но пишу как понял

в общем у меги обычно действия по прошивке могут делать только из специальной области - области загрузчика (ну или Boot Loader Section)

далее, если нам нужен старт прошивки через загрузчик то мы должны поставить фюз BOOTRST в ноль.. если же там единица то старт будет с нуля..

для меня старт нужен обычный (без функций загрузчика), управление в область загрузчика я передам когда мне это будет нужно через CALL или JMP (это допустимо)

далее, размер секции загрузчика может быть измененем
для этого используются фюзы BOOTSZ1 и BOOTSZ0
для моей 64ой меги

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

BOOTSZ1 и BOOTSZ0  Размер Страниц память программ память загрузчика
1                 1                512         4      0000-7ВАА             7E00-7FFF
1                 0               1024        8      0000-7BFF              7C00-7FFF
0                 1               2048       16     0000-77FF              7800-7FFF
0                 0               4096       32     0000-6FFF              7000-7FFFF

Вроде тоже понятно.. пока размер кода не знаю, но предполагаю что килобайта хватит скорее всего BOOTSZ1=1 и BOOTSZ0=0 <- это фюзы !

есть еще определение областей RWW и NRWW - но там как то не очень укладывается все в голове...
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

идем дальше..

у меги есть команда SPM - описание чтото вроде запись в память программ...
но на деле эта команда работает немного по другому..
по тем докам что я нашел SPM помещает данные в какой то буфер (внутри меги ?)

очень важен регистр SPMCR - он фактически является и флаговым (результат выполнения операций) и командным для операций программирования

Процесс самопрограммирования осуществляется постранично..
1. Заполняем временный буфер (внутри меги?) содержимым для программирования
2. Очищаем страницу
3. программируем буфером страницу..

P.s. блин, чую что сейчас я во всем разбирусь :-))) если кто знает о процессе и видит ошибки-я надеюсь укажите.. чтобы я экспериментами голову себе не сломал...
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

1. Заполнение буфера..


в регистре Z адрес куда заслать пару. в регистровой паре R1:R0 два байта.. - в общем запись идет пословно.. вообще об этом нужно не забывать что адресация у нас пословная в программной памяти (я забываю иногда.. потом по 3-5 минут ищу откуда пошли глюки)

вот в этом месте непонятка.. вроде как адрес в Z нужно вносить байтный.. с нулевым значением младшего бита

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

ZL:
7 6 5 4 3 2 1 0
| | | | | | | +----- всегда ноль !
+-+-+-+-+-+-+---- адрес во временном (внутреннем) буфере


ZH как я понял в этот момент равен нулю (либо может быть его значение игнорируется?

наверное заполнение буфера будет выглядеть так
LDI YL , low (BUFF_TO_WRITE)
LDI YH , High(BUFF_TO_WRITE)
LDI ZL , 0 ;- cчетчик цикла и по совместительству адресный регистр
LDI ZH , 0 ;- кстати а что лучше LDI ZH, 0 или CLR ZH ?

Loop: ; цикл
LD r0, Y+
LD r1, Y+
SPM - заносим данные в буфер
INC ZL
INC ZL
CPI ZL , 0
BRNE Loop
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

2. Очистка страницы

в регистр Z записываем адрес страницы для стирания

я так понимаю что это будет регистр ZH (ZL=0)
LDI ZH , 0xA0
LDI ZL , 0

LDI SPMCR , 00000011
SPM

чтото вроде такого... (кто знает скажите !!)

3. Запись страницы
LDI ZH , 0xA0
LDI ZL , 0

LDI SPMCR , 00000101
SPM


наверное чтото такое :)
осталось вечером дома проверить..
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

(кто знает скажите !!)

Все наблюдают за увлекательным квестом. Продолжайте :)
Ответить

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