реклама на сайте
подробности

 
 
> Запись данных в EEPROM, не выходит
Motion
сообщение Feb 10 2008, 15:46
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



Пытаюсь записать пару чисел в EEPROM МК ATmega16.

Взял стандартную функцию записи из документации:

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}


При компиляции выдаёт ошибки:

undefined symbol 'EEWE'
undefined symbol 'EEMWE'




Попробовал так:

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EECR.1))
;
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EECR.2);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EECR.1);
}

Ошибки не выдаёт, но ничего не пишет в EEPROM


В основном цикле программы пишу:

EEPROM_write(0x00,0x00);
EEPROM_write(0x01,0xAA);

Для написания программы использую CodeVisionAVR. В стандарный листинг программы дописал лишь описание функции. А в основном цикле - вызов функции с параметрами.

Подскажите, что делаю не так.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Qwertty
сообщение Feb 10 2008, 17:13
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(Владимир_КПИ @ Feb 10 2008, 18:46) *
Подскажите, что делаю не так.

В CV достаточно просто объявить переменную:
Код
eeprom char beta;

Дальше с ней можно работать как с обычной переменной:
Код
beta = 0x4F;
x = beta;
beta++;


Ну если хочется на "низком уровне":
Код
#define EERE    0
#define EEWE    1
#define EEMWE   2

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
unsigned char _sreg_;
/* Wait for completion of previous write */
while(EECR & (1<<EEWE));
_sreg_ = SREG;
cli();
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
// фича CV - отключение оптимизации
#pragma opt-
/* Write logical one to EEMWE */
EECR = (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR = (1<<EEWE);
#pragma opt+
SREG = _sreg_;
}
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 10 2008, 17:51
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Qwertty @ Feb 10 2008, 20:13) *
Ну если хочется на "низком уровне":
Код
// фича CV - отключение оптимизации
#pragma opt-
/* Write logical one to EEMWE */
EECR = (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR = (1<<EEWE);
#pragma opt+
Вы точно уверены что в этом месте нужно оптимизацию выключать ?
И для чего ? Что бы между записью EEMWE и EEWE прошло > 4 тактов ?
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Feb 10 2008, 21:20
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(singlskv @ Feb 10 2008, 20:51) *
Вы точно уверены что в этом месте нужно оптимизацию выключать ?
И для чего ? Что бы между записью EEMWE и EEWE прошло > 4 тактов ?

Нет, это для того,чтобы компилятор первое присваивание не заоптимизировал до "совсэм нэт". От такой это странный продукт.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01338 секунд с 7
ELECTRONIX ©2004-2016