Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

Ответ
Опции темы

Как в CVAVR записать в EEPROM по определенному адресу?

Непрочитано 15.06.2007, 18:58   #1
woroba
Гражданин KAZUS.RUN
 
Регистрация: 13.06.2005
Адрес: РК г.Павлодар
Сообщений: 862
Сказал спасибо: 98
Сказали Спасибо 216 раз(а) в 139 сообщении(ях)
woroba на пути к лучшему
По умолчанию Как в CVAVR записать в EEPROM по определенному адресу?

Нужно переменные записывать по определенным адресам в EEPROM как это сделать в CVAVR?
Реклама:
woroba вне форума   Ответить с цитированием
Непрочитано 15.06.2007, 20:36   #2
konsvik
Прохожий
 
Регистрация: 05.09.2006
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
konsvik на пути к лучшему
По умолчанию

Использую для этих целей собственные функции:


#pragma warn- // this will prevent warnings

void WriteEeprom(unsigned int addres, unsigned char data) {
#asm
ldd r31,y+2 ;R31=MSB addres
ldd r30,y+1 ;R30=LSB addres
ld r26,y ;R26=data
__EEPROMWRB:
SBIC EECR,EEWE
RJMP __EEPROMWRB
IN r25,SREG
CLI
OUT EEARL,r30
OUT EEARH,r31
SBI EECR,EERE
IN r24,EEDR
CP r30,r24
BREQ __EEPROMWRB0
OUT EEDR,r26
SBI EECR,EEMWE
SBI EECR,EEWE
__EEPROMWRB0:
OUT SREG,r25
RET
#endasm
}


unsigned char ReadEeprom(unsigned int addres) {
#asm
ld r30,y ;R30=LSB addres
ldd r31,y+1 ;R31=MSB addres
__EEPROMRDB:
SBIC EECR,EEWE
RJMP __EEPROMRDB
PUSH r27
IN r27,SREG
CLI
OUT EEARL,r30
OUT EEARH,r31
SBI EECR,EERE
IN R30,EEDR
OUT SREG,r27
POP r27
RET
#endasm
}
#pragma warn+ // enable warnings


Удачи!
konsvik вне форума   Ответить с цитированием
Непрочитано 16.06.2007, 11:45   #3
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 306
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию

Код:
eeprom unsigned char var_name @10
переменная ложится на указанный адрес

99% что верно - почитай справку - там хорошо описано.
AndryG вне форума   Ответить с цитированием
Непрочитано 16.06.2007, 18:54   #4
woroba
Гражданин KAZUS.RUN
 
Регистрация: 13.06.2005
Адрес: РК г.Павлодар
Сообщений: 862
Сказал спасибо: 98
Сказали Спасибо 216 раз(а) в 139 сообщении(ях)
woroba на пути к лучшему
По умолчанию

Уважаемый AndryG

Если бы было так просто я бы не задавал вопрос.
А вы бы сначало попробовали а потом советовали.
А если лень компилировать, я вам отвечу вместо компилятора-" @ operator can be used only SRAM variables"
woroba вне форума   Ответить с цитированием
Непрочитано 17.06.2007, 07:16   #5
Laksus
Частый гость
 
Регистрация: 14.09.2005
Сообщений: 34
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Laksus на пути к лучшему
По умолчанию

Может так?
Код:
//CodeVisionAVR 1.24.8e Evaluation
#include ‹mega8.h› 
unsigned int eeprom* peei1=0x10;
//объявили указатель на ячейку eeprom 0x10(младший байт), а старший будет в 0x11
unsigned int i1;    
int main(void)
{
 i1= *peei1;//записали содержимое ячеек 0x10, 0x11 в i1
 i1 *=7;//получили новое значение
 *peei1= i1;//записали по адресу 0x10 новое значение
 while(1); 
 return 0;
}
(Это кстати не Вы?
http://www.fulcrum.ru/cgi-bin/bbs/me...ID=4945&page=1
)
Laksus вне форума   Ответить с цитированием
Непрочитано 18.06.2007, 06:44   #6
Ivax
Частый гость
 
Регистрация: 21.08.2006
Сообщений: 47
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Ivax на пути к лучшему
По умолчанию

Автору вопроса. А в чём собственно проблема? Если ты хочешь что-бы это были обычные преременные но по определенному адресу - так однозначно не получится и ты об этом знаешь сам.

Если не пугает работа с указателями - то всё просто, пиши куда хочешь и сколько хочешь. Еще можно массив натянуть на весь (не весь) EEPROM и писать в любую нужную ячейку. Тока зачем?

Ты бы задачу конкретнее описал - тогда можно выбрать подходящее решение, теоретически рассуждать не интересно.
Ivax вне форума   Ответить с цитированием
Непрочитано 18.06.2007, 09:27   #7
woroba
Гражданин KAZUS.RUN
 
Регистрация: 13.06.2005
Адрес: РК г.Павлодар
Сообщений: 862
Сказал спасибо: 98
Сказали Спасибо 216 раз(а) в 139 сообщении(ях)
woroba на пути к лучшему
По умолчанию

Ivax

Задача в следующем в EEPROM хранятся поравочные коэфициеты (изменяемые в конце процесса вычисления).

В зависимости от результата вычисления=адрессу EEPROM выбирается соответствующий коэфициент.
woroba вне форума   Ответить с цитированием
Непрочитано 21.06.2007, 08:23   #8
Syberian
Прохожий
 
Регистрация: 21.06.2007
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Syberian на пути к лучшему
По умолчанию

Кодевижен имеет native процедюры для записи/чтения еепром, и даже флэш!
Все просто:

Код:
eeprom char a; //переменная в еепром
flash float c; // переменная в флэш-памяти
void main{
...

a=2*c...... ;  // запись в еепром автоматическая! чтение из flash - тоже

tempvar=a*23*sqrt(2); // чтение из еепром
c=(float)(a*24.6); // есть даже запись во флеш(!)
}
если нужно возиться с таблицей - все без изменений, как с обычной в SRAM

Но учти: без фанатизьма! количество записей в одну ячейку EEPROM - 100 000, потом пойдут сбои
запись в пределах одной страницы flash (64-256 байт) - 1000-5000 раз.

И еще. Писать в еепром напрямую (вне переменных) можно, но не рекомендуется, т.к. переменные назначаются при каждой компиляции по-разному. Можешь запороть данные.

Флеш писать можно, дабы сделать внутрисхемную замену ПО. Делается это так:



Код:
flash char progm @0;
char progb[];// буфер записи флеш
... траляля, инит, все дела

main{......}

#org SMALLBOOTSTART
void sysprog(void)


// складываешь новую прошивку(фрагмент) в SRAM progb
// затем берешь по очереди байты и кладешь во флеш

*(progm+смещение)= progb[i];

//и так далее
Syberian вне форума   Ответить с цитированием
Непрочитано 21.06.2007, 08:33   #9
Syberian
Прохожий
 
Регистрация: 21.06.2007
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Syberian на пути к лучшему
По умолчанию

Цитата:
Задача в следующем в EEPROM хранятся поравочные коэфициеты (изменяемые в конце процесса вычисления).
если каждый раз будешь менять еепром - надолго его не хватит!

делай так:

Код:
char coeff_1[5]; // таблица коэфф-тов в памяти
eeprom char coeff_2[5]; // таблица коэф-тов в ПЗУ


{при включении питания}
coeff_1=coeff_2; //вспомнить коэф-ты

{в процессе работы, скажем каждую минуту}
coeff_2=coeff_1; //периодически сохраняем таблицу в ПЗУ (копирует весь массив целиком)

{процесс работы}
coeff_1[i+3]=#@$#@@~! ; // работаешь ТОЛЬКО с таблицей в SRAM!!!
Syberian вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как записать mp3/wav файл во флэш? svad0 Микроконтроллеры, АЦП, память и т.д 5 03.09.2008 08:55
как записать строку в массив? dimonbest Микроконтроллеры, АЦП, память и т.д 8 27.02.2008 12:18
Помогите записать EEPROM masterpc Микроконтроллеры, АЦП, память и т.д 4 16.02.2007 02:53
как записать массив 50 на 16 в еепром atmega128& sma-etu Микроконтроллеры, АЦП, память и т.д 0 15.02.2007 16:05
как записать в eeprom atmegi128? sma-etu Микроконтроллеры, АЦП, память и т.д 1 06.12.2006 15:35


Часовой пояс GMT +4, время: 18:00.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.