Еще один вопрос а можно ли организовать чтение из программной памяти при помощи индексной индексации ?
а как же! чтение флеш осуществляется командой LPM, которая в том числе имеет и вариант LPM Rd, Z+. для адресации используется регистровая пара Z
внимание! не для любых МК сие верно! смотрите хелп к ассемблеру - там все расписано.
Cтоп !! А разве LPM Rd , Z+ это не чтение с постинкрементом ? - это не то... я сейчас как раз ее и пользую... но при этой операции Z инкрементируется.. а мне нужно без инкремента прочитать по адресу Z+10
p.s. блин, наверное мегу я буду долго осваивать - а разве у AVR MEGA настолько разный набор команд ?!! где можно найти команды именно для меги64 ? (а то может там и команды деления есть ?!)
а мне нужно без инкремента прочитать по адресу 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. кто может показать работающий код самопрограммирования программной памяти ?
сейчас, за неимением (не знанием как организовать) индексной адресации делаю как раз с движением указателя.. <...> но такой способ не удобен если указатель приходиться двигать вперед назад...
Я например другого способа не знаю, может у меги 64 есть и другие возможности, но читать даташит за вас желания нет. Не удобен в каком плане? Обычно делается так: 1. Под число 0 можно отвести один из нижних регистров (т.к. используется постоянно) 2. Сложение двухбайтных чисел или регистровых пар выполнить макросом или подпрограммой (в зависимости от того, какая оптимизация нужна, по скорости или коду) После этого, для движения указателя можно использовать такие конструкции: LDI r16, 10 rcall load_byte
Я например другого способа не знаю, может у меги 64 есть и другие возможности, но читать даташит за вас желания нет.
почему нет? есть !! просто я ничего в нем по своему вопросу не нашел.. но учитывая что я еще не большой спец. в программировании мег на асме - спросил...
ploop писал(а):
Не удобен в каком плане? Обычно делается так: 1. Под число 0 можно отвести один из нижних регистров (т.к. используется постоянно) 2. Сложение двухбайтных чисел или регистровых пар выполнить макросом или подпрограммой (в зависимости от того, какая оптимизация нужна, по скорости или коду) После этого, для движения указателя можно использовать такие конструкции: LDI r16, 10 rcall load_byte
или в случае с макросом load_byte 10 Rd
я именно так и делаю.. только процедура по другому называется.. но сути это не меняет..
указатель приходиться постоянно двигать.. да и время теряем (а оно нужно для вычислений)
просто когда то очень давно еще на Z80 была возможность индексной адресации - это было очень удобно при программировании работы с массивами или структурами... в меге для RAM такие команды есть (LDD)... а вот для FLASH - с учетом того что никто ничего не подсказал - значит нет... (я это и сам увидел, просто надеялся что все таки не дочитал чего нить и меня общественность обрадует по этому вопросу)
Во-во, и мне будет интересно почитать, а то как-то брался, сразу не получилось - бросил . Не очень-то тогда нужно было.
ю ?
А вас на какой меге интересует ? а то может быть соберем все что есть ?
я никак с областями RWW и NRWW не разберусь... что где находиться и как задается (если задается вообще, а то может быть это жестко заданные области)
аа, и еще: внутри меги получается есть специальный буфер для самопрограммирования ? (его заполняют при помощи SPM) или этот буфер нужно выделять в RAM (или он сам выделяется?)
ресурс программной flash ограничен всего 10000 записей, причем запись возможна только страницами с предварительным стиранием всей страницы. гораздо правильнее поставить внешнюю EEPROM (i2c или spi), чем маяться с заведомо неразумной идеей хранения промежуточных данных в программной flash.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Для 64ой меги - 128 байт в одной странице размер области NRWW 32 страницы всего размер памяти 256 страниц..
теперь вопрос - а как задается конкретно адрес начала области NRWW ? (я правильно понимаю что код производящий запись в программную память должен находиться в этой области?)
ресурс программной flash ограничен всего 10000 записей, причем запись возможна только страницами с предварительным стиранием всей страницы. гораздо правильнее поставить внешнюю EEPROM (i2c или spi), чем маяться с заведомо неразумной идеей хранения промежуточных данных в программной flash.
а мы не будем там хранить промежуточные данные ! только итоговые
оо!! вот что еще нашел.. может быть чтото не совсем правильно, но пишу как понял
в общем у меги обычно действия по прошивке могут делать только из специальной области - области загрузчика (ну или Boot Loader Section)
далее, если нам нужен старт прошивки через загрузчик то мы должны поставить фюз BOOTRST в ноль.. если же там единица то старт будет с нуля..
для меня старт нужен обычный (без функций загрузчика), управление в область загрузчика я передам когда мне это будет нужно через CALL или JMP (это допустимо)
далее, размер секции загрузчика может быть измененем для этого используются фюзы BOOTSZ1 и BOOTSZ0 для моей 64ой меги
у меги есть команда SPM - описание чтото вроде запись в память программ... но на деле эта команда работает немного по другому.. по тем докам что я нашел SPM помещает данные в какой то буфер (внутри меги ?)
очень важен регистр SPMCR - он фактически является и флаговым (результат выполнения операций) и командным для операций программирования
Процесс самопрограммирования осуществляется постранично.. 1. Заполняем временный буфер (внутри меги?) содержимым для программирования 2. Очищаем страницу 3. программируем буфером страницу..
P.s. блин, чую что сейчас я во всем разбирусь )) если кто знает о процессе и видит ошибки-я надеюсь укажите.. чтобы я экспериментами голову себе не сломал...
в регистре Z адрес куда заслать пару. в регистровой паре R1:R0 два байта.. - в общем запись идет пословно.. вообще об этом нужно не забывать что адресация у нас пословная в программной памяти (я забываю иногда.. потом по 3-5 минут ищу откуда пошли глюки)
вот в этом месте непонятка.. вроде как адрес в Z нужно вносить байтный.. с нулевым значением младшего бита
Код:
ZL: 76543210 | | | | | | | +----- всегда ноль ! +-+-+-+-+-+-+---- адрес во временном (внутреннем) буфере
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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения