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

 
 
> Запись данных в 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
Ответов
Motion
сообщение Feb 10 2008, 19:55
Сообщение #2


Местный
***

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



Цитата
должно (в командах проца) пройти не более 4 тактов, читайте подробно даташит...

читал что-то такое...

Цитата
Ошибка скорее всего была в отсутствии оптимизации.

То есть после установки бита EEMPE менее чем за 4-е такта нужно установить EEWE? Но эти две команды стоят одна за другой.

Как включить оптимизацию?

Полистал справочник по С. Оказывается "|" означает логическое или. Со сдвигом тоже разобрался.

Разберём строку "EECR |= (1<<EEWE);"

1<<EEWE - сдвиг 1 влево EEWE раз. Какой единицы? А чему равно EEWE? Это значение бита EEWE регистра EECR? Ничего не понятно.


Вот что написано в книге по поводу сдвига. Пример:

x=7 00000111
x=x<<1 00001110

То есть сдвигаются все биты влево 1 раз. Тут для меня всё понятно.

Почему нельзя просто написать EECR.1=1?
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 10 2008, 20:24
Сообщение #3


дятел
*****

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



Цитата(Владимир_КПИ @ Feb 10 2008, 22:55) *
То есть после установки бита EEMPE менее чем за 4-е такта нужно установить EEWE? Но эти две команды стоят одна за другой.
Это в С они стоят рядом, что при этом будет при компиляции зависит
от выбранного уровня оптимизации, при отключенной, >4 тактов запросто.
Цитата
Как включить оптимизацию?
CV не знаю, исчите в меню или читайте хелп.
Цитата
1<<EEWE - сдвиг 1 влево EEWE раз. Какой единицы? А чему равно EEWE? Это значение бита EEWE регистра EECR? Ничего не понятно.
Вот что написано в книге по поводу сдвига. Пример:
x=7 00000111
x=x<<1 00001110

1<<X
пусть X=3, тогда
было 00000001 (1)
стало 00001000 (1<<3)

EEWE - номер бита в EECR который содержит соответствующий флаг.
должен быть описан в соответствующем include файле, типа так:
#define EEWE 1
те запись (1<<EEWE) <=> (1<<1) <=> 0b00000010
Цитата
Почему нельзя просто написать EECR.1=1?
можно, но не всегда, ищите в даташитах
упоминание Read-Modify-Write...
EECR |= (1<<EEWE) означает:
-прочитать регистр EECR
-загрузить в другой регистр константу (1<<EEWE)
-сделать OR между 2 регистрами
-записать результат в EECR

надеюсь теперь понятно откуда берутся >4 тактов между записями EEMWE EEWE

кстати у Вас похоже какие-то запутки с инклудами,
то у Вас EEMWE то EEMPE - это конечно одно и то же,
просто атмел в какой-то момент сменил имя и нужно свериться с инклудом на Ваш чип
Go to the top of the page
 
+Quote Post



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

 


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


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