Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.63/35: Рейтинг темы: голосов - 35, средняя оценка - 4.63
Otixomdirs
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
1

AVRstudio4 ASM. Адресация и инициализация EEPROM.

16.01.2013, 01:17. Просмотров 6413. Ответов 20
Метки нет (Все метки)

Есть кусок кода:
===== адреса переменных в EEPROM =====
.ESEG
.org 0
EE_code_Unlock: .byte 2
EE_code_Service: .byte 2
EE_code_Test: .byte 2
EE_code_Educat: .byte 2
EE_Status: .byte 1
;==================================
Тут все работает и все понятно. Впоследствии по этим адресам я обращаюсь к данным.

При компиляции мне нужно получить файл первоначального содержимого EEPROM. Создаю массив:
;===============================
.ESEG
.org 0
.db $1,$0,$1F,$0,$7F,$7F,$FF,$FF,$05
;===============================
AVRstudyo начинает ругаться на каждый байт массива. Почему??? Ведь в первом случае я объявил адреса, а во втором случае данные.
Мне, конечно, не сложно врукопашную создать файл еепром, но при частой отладке это напрягает. Как надо сделать, чтобы AVRstudyo сама сгенерила файл содержимого еепром?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2013, 01:17
Ответы с готовыми решениями:

Универсальный шаблон проекта на ASM AVRStudio4
Посидел, нацарапал. Покритикуйте пожалуйста. Может, что добавить, может -...

Битовая адресация аккумулятора в ASM (MCS-51)
Здравствуйте. Вот прочитал где-то, что Битовая адресация аккумулятора в...

Выполнение кода из внешней EEPROM (ASM, AT89C51ED2)
Задача: Необходимо в память (EEPROM) записать исполняющий код (не важно что он...

AvrStudio4 и векторы прерывания на ATmega2560
Приветствую господа. Суть вопроса в том, что указываются не те адреса, при...

[РЕШЕНО] Директивы условной компиляции в AVRSTUDIO4
Коллеги доброго времени суток! Помогите разобраться с директивами условной...

20
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
16.01.2013, 01:29 2
Цитата Сообщение от Otixomders
;===============================
.ESEG
.org 0
.db $1,$0,$1F,$0,$7F,$7F,$FF,$FF,$05
;===============================
Как надо сделать, чтобы AVRstudyo сама сгенерила файл содержимого еепром?
Воткни метку перед ".DB"
0
Otixomdirs
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
16.01.2013, 01:40 3
Метка- это адрес. Адрес явно объявлен строкой выше: ".org 0"
Если я меняю эти куски кода местами (раньше-позже), то ругаться начинает, соответственно на строки объявления адреса. А вот если указываю неперекрывающиеся адреса, то компилит нормально, но данные, естественно, оказываются не там, где надо.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
16.01.2013, 01:57 4
Это всё на хрен, потому что студия сие не понимает и работает только по процедурам записи чтения принятых в системе команд AVR

Код
ESEG
.org 0
.db $1,$0,$1F,$0,$7F,$7F,$FF,$FF,$05
Запускаешь debug
Стоишь на ресет до посинения.
Отрываешь окно MEMORY - EEPROM
Ручками вбиваешь
Код
1,0,$1F,0,$7F,$7F,$FF,$FF,5
Открываешь вкладку DEBUG
Находишь UP/Downtood Memory
Записываешь дамп - в файл / Всегда можешь загрузить потом в память
Если установлен фьюз EESAVE - то вбитая тобой информация останется в мозгах навечно, нет - будешь после выкл питания подгружать из файла
0
Otixomdirs
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
16.01.2013, 02:17 5
Получается, что студия два раза видит одинаковое объявление адреса в одинаковых сегментах, и дальше отказывается компилить? И пофиг ей на все остальное?
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
16.01.2013, 02:24 6
Цитата Сообщение от Otixomders
Получается, что студия два раза видит одинаковое объявление адреса в одинаковых сегментах, и дальше отказывается компилить? И пофиг ей на все остальное?
AVR Studyo 4.15


<Изображение удалено>


<Изображение удалено>
0
SirkVOK
0 / 0 / 0
Регистрация: 30.06.2012
Сообщений: 177
16.01.2013, 12:50 7
Ребят, и мне подскажите.
Нужно в процессе работы девайса записать измеренное значение в EEPROM, по нажатию кнопки. Одновременно с этим нужные данные запишу и ROM.
В EEPROM нужно загнать 2 байта, пусть это буду первые две ячейки. Годится ли такая ПП, всё ли выдержано?
EEWrite:
sbic EECR,EEWE ; Ждем готовности памяти к записи. Крутимся в цикле
rjmp EEWrite ; до тех пор пока не очистится флаг EEWE

cli ; Затем запрещаем прерывания.
out EEARL, R16 ; Загружаем адрес нужной ячейки
out EEARH, R17 ; старший и младший байт адреса
out EEDR, R20 ; и сами данные, которые нам нужно загрузить

sbi EECR, EEMWE ; взводим предохранитель
sbi EECR, EEWE ; записываем байт

yms R16

EEW1: sbic EECR,EEWE ; Ждем готовности памяти к записи. Крутимся в цикле
rjmp EEW1 ; до тех пор пока не очистится флаг EEWE

out EEARL, R16 ; Загружаем адрес нужной ячейки
out EEARH, R17 ; старший и младший байт адреса
out EEDR, R21 ; и сами данные, которые нам нужно загрузить

sbi EECR, EEMWE ; взводим предохранитель
sbi EECR, EEWE ; записываем байт

sei ; разрешаем прерывания
ret ; возврат из процедуры

При включении устройства, после инициализации периферии, данные из EEPROM будут копироваться в ROM, для дальнейшей работы. Тоже есть соответсвтующая ПП.

И ещё..., для такой работы с EEPROM, нужно ли использовать директиву .ESEG и резервировать определённое количество ячеек как это делается для ROM?
Заранее благодарю
0
Otixomdirs
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
16.01.2013, 17:08 8
tyzord66, Вы меня неправильно поняли. Проблема возникает, если одновременно использовать резервирование адресов для компилятора и создание массива по этим же адресам. В первом посте все изложено.
0
Otixomdirs
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
16.01.2013, 17:15 9
SirkVOK, Вы два раза делаете почти одни и те же действия. Лучше написать отдельную процедуру обращения к еепром и вызывать ее командой RCALL. В апнотах и даташитах на контроллеры эта процедура конкретно расписана. Директиву .ESEG использовать совершенно не обязательно.
Еще один интересный момент: старайтесь не использовать нулевой байт ЕЕПРОМ, при опреденных аппаратных событиях, его содержимое может искажаться. Я на эти грабли наступал.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
16.01.2013, 18:14 10
Цитата Сообщение от Otixomders
tyzord66, Вы меня неправильно поняли. Проблема возникает, если одновременно использовать резервирование адресов для компилятора и создание массива по этим же адресам. В первом посте все изложено.
Что мешает сделать вот так:
===== адреса переменных в EEPROM =====
.ESEG
.org 0
EE_code_Unlock: .db $1,$0
EE_code_Service: .db $1F,$0
EE_code_Test: .db $7F,$7F
EE_code_Educat: .db $FF,$FF
EE_Status: .db $05
;==================================

или опять не так понял?
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
16.01.2013, 18:31 11
Цитата Сообщение от SirkVOK
Годится ли такая ПП, всё ли выдержано?

Код:
yms R16

Тут лучше к R16 прибавить "1" с учетом переноса в R17, чтоб после не чесать репу, когда понадобится сохранить где-нибудь на границе "FF". Связку SEI+RET=RETI (будет покороче)
0
Otixomdirs
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
16.01.2013, 18:40 12
Так скомпилилось, спасибо! Надо на кристалле прошивку проверить.
0
Otixomdirs
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
16.01.2013, 18:42 13
SirkVOK, вообще два байта- это уже массив. Со временем программы усложняются, массивы растут.
Массивы могут понадобится в любой области любой памяти. Возникает необходимость их обработки, загрузки и выгрузки из одной памяти в другую. Допустим при старте надо перегнать массив 100 байт (Var1-Var100) из EEPROM в SROM. А потом его долго и нудно обрабатывать, а потом загнать обратно.
В АВР есть мощная группа команд для косвенной адресации через пары индексных регистров XL:XH; YL:YH; ZL:ZH. Обращаемся к памяти через индексные регистры, вызываем процедуру с какими-либо действиями, смещаем указатель и по-новой. Этими командами можно адресоваться к ЛЮБОЙ памяти.
0
SirkVOK
0 / 0 / 0
Регистрация: 30.06.2012
Сообщений: 177
16.01.2013, 18:45 14
Цитата Сообщение от Otixomders
SirkVOK, Вы два раза делаете почти одни и те же действия. Лучше написать отдельную процедуру обращения к еепром и вызывать ее командой RCALL. В апнотах и даташитах на контроллеры эта процедура конкретно расписана. Директиву .ESEG использовать совершенно не обязательно.
Еще один интересный момент: старайтесь не использовать нулевой байт ЕЕПРОМ, при опреденных аппаратных событиях, его содержимое может искажаться. Я на эти грабли наступал.
Спасибо. А этот кусок кода у меня и оформлен в виде процедуры с вызовом по RCALL. Но я понял о чём вы говорите, учту на будущее. Ну у меня в EEPROMе есть где развернуться, отодвинусь подальше от начала..., нужно то всего 2 ячейки. Я правильно понимаю, что файл .eep меня не должен волновать? Я ведь из флеша пишу и читаю EEPROM.

tyzord66 гранд мерси, дельное предложение по поводу замены yms. Вот только разве можно выходить из ПП по reti?
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
16.01.2013, 18:52 15
Цитата Сообщение от SirkVOK
Вот только разве можно выходить из ПП по reti?
Строго говоря RETI никак не привязано к обработчику прерываний, все, чем она отличается от RET это попутно с возвратом устанавливает флаг «I» в SREGе.
0
Otixomdirs
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
16.01.2013, 19:06 16
SirkVOK, косвенная адресация для двух байт, это конечно лишнее. Но при помощи нее легко обзавестись такими процедурами, как "READ_EE", "WRITE_EE", "EEPROM_to_SROM", "SROM _to_EEPROM", "Ftosh_to_EEPROM" и, собственно, обработки переменных.
Указываешь на начало, указываешь размер, вызываешь процедуру. Все. А самое главное- это компактность и скорость.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
16.01.2013, 20:26 17
Указываешь на начало, указываешь размер,
указываешь направление
вызываешь
прерывание.
0
SirkVOK
0 / 0 / 0
Регистрация: 30.06.2012
Сообщений: 177
16.01.2013, 20:28 18
Спасибо, господа, почерпнул новое для себя.
Да... ,это я перепутал, нельзя выходить из обработчика по ret. А так, в процедуре с запретом, разрешеним прерываний, действительно, одной командой экономнее.
0
Otixomdirs
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
16.01.2013, 20:58 19
[QUOTE="YTYOUT"][QUOTE="Цитата:[/QUOTE]
вызываешь
прерывание.
Зачем плодить лишние прерывания? Основная цель прерываний- времязависимые процессы и/или аппаратные события. Этак можно и что-нибудь важное проспать.
Речь идет именно о процедурах (подпрограммах, функциях и.т.д), связанных с косвенной адресацией различных типов памяти. И при чем здесь прерывания?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
17.01.2013, 01:38 20
Зачем плодить лишние прерывания
Что бы не плодить вот это "READ_EE", "WRITE_EE", "EEPROM_to_SROM", "SROM _to_EEPROM", "Ftosh_to_EEPROM" и прочую хрень и не сидеть и ждать когда эти "процедуры" соизволят освободить проц.
0
17.01.2013, 01:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2013, 01:38

AtTiny2313 + AvrStudio4 - ошибка при симуляции
Пишу на ASM для AtTiny2313. Простая такая программка:...

AVRStudio4, ATMega128, GPS EB-500.нашел баг, исправил,делюсь
Приветствую. Уже давненько подключил GPS модуль к своему самодельному...

Непосредственная адресация
При непосредственной адресации в команде содержится не адрес операнда, а сам...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru