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

 
 
> Запись,чтение EEPROM
glebka
сообщение Jul 4 2006, 09:27
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 199
Регистрация: 22-06-05
Пользователь №: 6 217



Делаю проект на MEGA 168, использюю ICC. Пишу 4 слова в EEPROM, читаю только последнее записанное.Пример взял из даташита.В чем может быть проблема.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
glebka
сообщение Jul 5 2006, 09:03
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 199
Регистрация: 22-06-05
Пользователь №: 6 217



Уррра.заработалою.

Код

unsigned char EEPromRead( unsigned int Addr )
{

//Setup adress register
EEAR=(Addr&0xFF);


//start EEPOM read by writing EERE
SetBit(EECR,0);

//Return data from Data register
return EEDR;
}

void EEPromWrite( unsigned int Addr, unsigned char Val )
{
macroGlobalIntDisable;
EEAR = Addr; // Load address
EEDR = Val; // Load data to be written



//Set logical one to EEMPE
SetBit(EECR,2);

//Set logical one to EEPE
SetBit(EECR,1);

macroToggleWatchdog;
while(EECR&(1<<EEPE)){};

macroGlobalIntEnable;

return;
}
Go to the top of the page
 
+Quote Post
Crystaly
сообщение Jul 7 2006, 09:56
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 1-09-05
Из: Рыбинск
Пользователь №: 8 130



Цитата(glebka @ Jul 5 2006, 13:03) *
Уррра.заработалою.

Код

unsigned char EEPromRead( unsigned int Addr )
{

//Setup adress register
EEAR=(Addr&0xFF);


//start EEPOM read by writing EERE
SetBit(EECR,0);

//Return data from Data register
return EEDR;
}

void EEPromWrite( unsigned int Addr, unsigned char Val )
{
macroGlobalIntDisable;
EEAR = Addr; // Load address
EEDR = Val; // Load data to be written



//Set logical one to EEMPE
SetBit(EECR,2);

//Set logical one to EEPE
SetBit(EECR,1);

macroToggleWatchdog;
while(EECR&(1<<EEPE)){};

macroGlobalIntEnable;

return;
}

Я пишу на ассемблере, но дело не в этом. Я когда-то тоже писал в EEPROM несколько байт подряд, ждал предыдущей записи. Когда байтов было 2 - все ОК. Но когда стало 4 - не работало. Я долго парился пока не обнаружил, что просто повторно срабатывает прерывание (запись шла внутри прерывания) - слишком долго это все.
Короче я сделал такую вещь - небольшая структура типа буфера, похожая на стек (но не совсем стек, скорее куча), состоит из тела, указателя, размера.
Тело - содержит пакеты из трех байт, два байта адрес и один байт данные, размер тела = 3*N байт, где N-размер тела в пакетах;
Указатель - 2 байта, содержат адрес вершины кучи;
Размер - 1 байт, содержит количество положенных пакетов в кучу. Если =0 - куча пустая.
Подпрограммы такие: ПОЛОЖИТЬ_В_КУЧУ и ОБСЛУЖИТЬ_КУЧУ. В начале программы кучу инициализировать - указатель на начало тела, размер=0.
ПОЛОЖИТЬ_В_КУЧУ вызывается в любом месте программы, где надо записать в EEPROM очередное число. Берет адрес, данные, ложит в кучу по указателю, передвигает указатель на 3, увеличивает размер на 1. На время работы с кучей запретить прерывания.
ОБСЛУЖИТЬ_КУЧУ вызывается сравнительно редко по прерыванию, проверяет размер кучи если =0 ничего не делает, иначе проверяет завершилась ли предыдущая запись в EEPROM, если нет - ничего не делает, если да - берет из кучи по указателю данные, адрес, направляет в регистры EEPROM, запускает запись, передвигает указатель на 3 обратно, уменьшает размер на 1. Все.
Вот такая штука значительно облегчила мне жизнь smile.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- glebka   Запись,чтение EEPROM   Jul 4 2006, 09:27
- - IgorKossak   После записи каждого байта неплохо бы дождаться ок...   Jul 4 2006, 09:36
- - KRS   Цитата(glebka @ Jul 4 2006, 13:27) Делаю ...   Jul 4 2006, 09:36
|- - glebka   Код такой void EEPromWrite( unsigned int Addr, un...   Jul 4 2006, 09:42
|- - KRS   При чтении не надо ждать окончания записи, тем бол...   Jul 4 2006, 09:59
- - IgorKossak   DelayMilliSec( 10 ); Совершенно лишняя процедура, ...   Jul 4 2006, 09:57
- - IgorKossak   Похоже в Этом КодEEAR=Addr;может быть ошибка. EEAR...   Jul 4 2006, 10:02
- - beer_warrior   А не может ли быть следующего: 1.Читаете по указат...   Jul 4 2006, 10:17
|- - glebka   Цитата(beer_warrior @ Jul 4 2006, 14:17) ...   Jul 4 2006, 10:33
|- - IgorKossak   Цитата(glebka @ Jul 4 2006, 13:33) ...Воп...   Jul 5 2006, 07:12
|- - KRS   Цитата(IgorKossak @ Jul 5 2006, 11:12) Ци...   Jul 5 2006, 08:40
|- - IgorKossak   Цитата(KRS @ Jul 5 2006, 11:40) Цитата(Ig...   Jul 5 2006, 09:39
|- - IgorKossak   Совет по оптимизации: Код unsigned char EEPromRea...   Jul 5 2006, 09:21
- - XsanyaX   Извиняюсь за оффтопик,но зачем такие сложности.......   Jul 7 2006, 10:35
- - Crystaly   Дело не просто в опросе готовности. Дело в том, чт...   Jul 7 2006, 11:45


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

 


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


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