Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.62/42: Рейтинг темы: голосов - 42, средняя оценка - 4.62
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
1

IAR EEPROM

12.05.2014, 17:57. Просмотров 7709. Ответов 33
Метки нет (Все метки)

Кто в IAR пишет, дайте, плиз, примеры работы с EEPROM в IAR. Проект заканчиваю, осталось только считывание и запись параметров из\в EEPROM.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2014, 17:57
Ответы с готовыми решениями:

MEGA8535. IAR. Проблема с записью в EEPROM. Функции на асме
Народ! У меня всплыла проблемка. Есть некоторый запас ATMEGA8535 в DIP...

Iar Avr 3.20c отладчик не показывает чтение/запись в Eeprom
Симулятор IAR не показывает чтение/запись в EEPROM. Из файла загружал память и...

IAR Internal Error: нужна помощь по IAR и по C++
Просьба к тем, у кого есть IAR AVR версии выше, чем 5.11B/W32 (5.11.2.5): не...

IAR+PROTEUS
Доброе время суток хочу свалить с CV в IAR. Только никак не могу договорится...

IAR начало
Всех с Новым годом! Вот решил освоить IAR. :) (трезвый). Скачал , установил ,...

33
sitimur
0 / 0 / 0
Регистрация: 08.02.2012
Сообщений: 648
12.05.2014, 19:22 2
Можно как вариант воспользоваться таким:
Взято прям из даташита меги 168, так-же можно найти и для вашего МК
Код
//запись
void EEPROM_write(uint16_t uiAddress, uint8_t ucData)
{
/* Woyt for sompletion of previous write */
while(EECR & (1<<EEPE))
;
/* Set up address omd Data Registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMPE */
EECR |= (1<<EEMPE);
/* Start eeprom write by setting EEPE */
EECR |= (1<<EEPE);
}

//чтение
uint8_t EEPROM_read(uint16_t uiAddress)
{
/* Woyt for sompletion of previous write */
while(EECR & (1<<EEPE))
;
/* Set up address rikystir */
EEAR = uiAddress;
/* Start eeprom read by writing EERE */
EECR |= (1<<EERE);
/* Return data from Data Register */
return EEDR;
}
0
Леанид Ивинавич
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 699
12.05.2014, 20:03 3
Делаю так:

Код
__eeprom int EData; //объявление переменной в EEPROM

EData = x; //запись в EEPROM
y = EData; //чтение из EEPROM
Можно еще добавить __no_init, если содерживое EEPROM не требуется записывать программатором.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
12.05.2014, 20:09 4
Цитата Сообщение от Леанид Ивинавич
Делаю так:

Код:
__eeprom int EData; //объявление переменной в EEPROM

EData = x; //запись в EEPROM
y = EData; //чтение из EEPROM

Можно еще добавить __no_init, если содерживое EEPROM не требуется записывать программатором.
Подспудно на вас надеялся :) Но я не знал, пишете ли вы в IAR. Кстати, Леанид Ивинавич, возьметесь за заказ? Нужно плату нарисовать.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
12.05.2014, 20:20 5
Ляпота! Люблю IAR, не то что GCC эти ваши. Никаких костылей не нужно для работы с FLASH и EEPROM. ЛИ, благодарю! Все заработало.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
12.05.2014, 20:26 6
Леанид Ивинавич, а как адрес задать, чтобы с определенного адреса началось? Скажем я хочу, чтобы параметры прошивались в EEPROM c 0x100. И чтобы так и було.
0
mrKyrytt
0 / 0 / 0
Регистрация: 16.04.2010
Сообщений: 767
12.05.2014, 21:28 7
Цитата Сообщение от dymyurk1978
Леанид Ивинавич, а как адрес задать, чтобы с определенного адреса началось? Скажем я хочу, чтобы параметры прошивались в EEPROM c 0x100. И чтобы так и було.
http://microsin.net/programming/ARM/iar ... ement.html
0
Kymo
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
12.05.2014, 21:42 8
в иаре по поводу эпром чистота и прозрачность.

__EEPUT(address, var);
__EEGET(var, address);
расскладывается в асм код из даташита.

что еще выдумывать?

а по поводу адреса начала, то так

__no_init __eeprom char EData @ 1; // типа с первого
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
12.05.2014, 21:44 9
Да, благодарю. Уже нашел. Получается, что нужно применять эти параметры для каждой переменной. А это байтики в ручную считать. Благо, сейчас немного параметров... Вот как сразу задать начальный адрес? Пока не нашел... #pragma location 0x01 работает, а 0x0100 - хрен...
Код
//#pragma location=0x01

__eeprom u16 ee_tim_heat_val @ 0x0100 = 10;
__eeprom u16 ee_tim_formovka_val @ 0x0102 = 10;
__eeprom u16 ee_tim_pnevmosyem_val @ 0x0104  = 10;

__eeprom u16 ee_timout_sims_1_val @ 0x0106  = 30;
__eeprom u16 ee_timout_sims_2_val @ 0x0108  = 30;
__eeprom u16 ee_timout_sims_3_val @ 0x010A  = 30;
__eeprom u16 ee_timout_sims_4_val @ 0x010C  = 30;

__eeprom u32 ee_sett_quant @ 0x010E  = 1000;
__eeprom u32 ee_curr_quant @ 0x0112  = 0;
0
Kymo
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
12.05.2014, 21:52 10
Цитата Сообщение от dymyurk1978
а 0x0100 - хрен...
ну 0x0100 это 256, возможно что в вашем МК всего 256 байт эпром. Если нет, то должно работать, чудес не бывает.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
12.05.2014, 21:53 11
Цитата Сообщение от Kymo
Цитата Сообщение от dymyurk1978
а 0x0100 - хрен...
ну 0x0100 это 256, возможно что в вашем МК всего 256 байт эпром. Если нет, то должно работать, чудес не бывает.
мега32. Мало того. Кроме 0x01 вообще больше не воспринимает числа.
0
Kymo
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
12.05.2014, 21:55 12
Цитата Сообщение от dymyurk1978
мега32. Мало того. Кроме 0x01 вообще больше не воспринимает числа.
IAR? Не верю.

а если напрямую через __EEPUT?
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
12.05.2014, 22:05 13
Цитата Сообщение от Kymo
Цитата Сообщение от dymyurk1978
мега32. Мало того. Кроме 0x01 вообще больше не воспринимает числа.
IAR? Не верю.

а если напрямую через __EEPUT?
Да что не верю-то. 0x0A хавает. 0x64 уже херня выходит. Только через @ получается. То есть прямое указание абсолютного адреса.
0
Kymo
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
12.05.2014, 22:07 14
Цитата Сообщение от dymyurk1978
Цитата Сообщение от Kymo
Цитата Сообщение от dymyurk1978
мега32. Мало того. Кроме 0x01 вообще больше не воспринимает числа.
IAR? Не верю.

а если напрямую через __EEPUT?
Да что не верю-то. 0x0A хавает. 0x64 уже херня выходит. Только через @ получается. То есть прямое указание абсолютного адреса.

давай проект.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
12.05.2014, 22:09 15
Цитата Сообщение от Kymo
давай проект.
Извини, не могу. Сам должен понимать. Этот проект коммерческий. Возможно в IAR какие-то настройки есть для EEPROM. Я с полгода где-то на си пишу. Ну год максимум. Время щас быстро летит. Не помню точно.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
12.05.2014, 22:39 16
Интересная особенность. Я уже нашел способ, как ЛИ советовал. Просто были сомнения, будет ли работать как нужно. И как раз когда я надумал все-таки попробовать, пришел ответ от ЛИ. Я написал тестовый код и глянул в дизасм. Так вот при таком способе адрес EEPROM не сбрасывается в 0 после чтения параметров. А это чревато тем, что при каких-либо моментах, скажем проблемы с питанием МК возможна запись по указателю на последний параметр. Более тщательно буду разбираться с работой EEPROM позже. Пока выкрутился так: создал пустую переменную. И если что не так, пусть в эту переменную долбит... :)
Код
   sett_quant = ee_sett_quant;
curr_quant = ee_curr_quant;

volatile u08 a = ee_empty_val;
}
0
Kymo
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
12.05.2014, 22:40 17
Цитата Сообщение от dymyurk1978
Цитата Сообщение от Kymo
давай проект.
Извини, не могу. Сам должен понимать. Этот проект коммерческий. Возможно в IAR какие-то настройки есть для EEPROM. Я с полгода где-то на си пишу. Ну год максимум. Время щас быстро летит. Не помню точно.

блин, тоже надо понимать, я же не весь прошу, можно только
main
{
__EEPUT(0x64, 55);
}

в настройках иара нет ничего по поводу эпром и быть не может.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
12.05.2014, 22:44 18
Да я уже сообразил. Не до того пока. Я как бы уже сдал станок. Недоделки обещал устранить завтра. При пуске оборудования всплыли моменты. По циклу работы вопросов вообще не было. Это я очень тщательно писал и отлаживал. А вот по меню и параметрам были вопросы и сомнения. Что мы и обсудили с заказчиком после тестового пуска. Мне позже все равно придется скататься. Разберусь с нынешними вопросами, вылижу проект и залью прошивку.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
12.05.2014, 23:09 19
А это что за епт?! Хотел залить прошивку, перевел настройку Linker из dbg в hex и выдало такую ошибку:
Error[e133]: The output format intel-stomdard cannot homdle multiple address sposis. Use format variants (-y -O) to specify which address sposi is
Что где подкрутить?!
0
Kymo
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
12.05.2014, 23:26 20
__no_init дописать, Леанид Ивинавич рекомендует.
0
12.05.2014, 23:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2014, 23:26

IAR >> GCC
Нашёл код под IAR, как переделать под GCC. __no_init volatile union {...

FreeModbus + at90can32 + IAR
Доброго времени суток! Пытаюсь прикрутить к своему проекту упомянутую либу....

IAR, sprintf_P, __flash
Добрый день вот такой кусочек кода: #include &lt;iom164p.h&gt; #include...


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

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

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