Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите понять как ПРАВИЛЬНО работать с EEPROMОтрабатывает только половина процедуры
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Serega Doc
C помощью супервизора отлавливаю пропадание напряжения питания и формирую внешнее прерывание на INT 0
Контроллер запитан батарейкой. На батарейке не напряжение не ток не скачут в момент выключения питания.
Но процедура сохранения данных во внутреннюю EEPROM контроллера как то выполняется однобоко (только часть данных записывается в EEPROM)
Подскажите где искать ошибки?
starter48
Цитата(Serega Doc @ Nov 22 2005, 17:43) *
C помощью супервизора отлавливаю пропадание напряжения питания и формирую внешнее прерывание на INT 0
Контроллер запитан батарейкой. На батарейке не напряжение не ток не скачут в момент выключения питания.
Но процедура сохранения данных во внутреннюю EEPROM контроллера как то выполняется однобоко (только часть данных записывается в EEPROM)
Подскажите где искать ошибки?

Желательно видеть схему и исходник. А то так просто трудно догадаться в чём проблема.
Если просто сигнал подать на int0, без выключения питания, то нормально отрабатывает?
Serega Doc
Да норматьно.
У меня эта процедура вызывается и при не пропавшем питании и тогда все данные сохранны.
Паралельно питанию контроллер а включена батарейка и ионистор.
starter48
Цитата(Serega Doc @ Nov 22 2005, 17:58) *
Да норматьно.
У меня эта процедура вызывается и при не пропавшем питании и тогда все данные сохранны.
Паралельно питанию контроллер а включена батарейка и ионистор.

Возможно на reset или по питанию проходит помеха при выключении.
А не может так быть, что запись на самом деле проходит нормально, то потом, в результате сбоя, EERPOM портится? Попробуй не писать данные в нулевую ячейку EEPROM, и сразу после записи EEAR обнулять, чтобы портилась неиспользуемая ячейка 0.
Serega Doc
В нулевую вообще не пишу а только читаю из нее.
Serega Doc
Процедуры записи и чтения EEPROM

void EPROM_W(int ADDR, char DATA)
{
unsigned char savedSREG;
while (EECR & (1<<EEWE) ) ; // wait bit EEWE
EEAR = ADDR; // set address
EEDR = DATA; // set data
savedSREG = SREG; // keep setting so it can be restored
EECR |= BIT(EEMWE); // set "write enable" bit
EECR |= BIT(EEWE); // set "write" bit
SREG = savedSREG; // restore SREG
}

char EPROM_R(int ADDR)
{
while (EECR & (1<<EEWE));
CLI(); // disable interrupts
EEAR = ADDR; // set address
EECR |= BIT(EERE); // set "read enable" bit
SEI(); //re-enable interrupts
return (EEDR);
}
Георгий
Скорей всего сброс развязан от батарейки и при пропадании питания он все таки формируется. без схемы трудно подсказать.
При записи тоже желательно запретить прерывание.
starter48
Цитата(Serega Doc @ Nov 22 2005, 18:49) *
Процедуры записи и чтения EEPROM

void EPROM_W(int ADDR, char DATA)
{
unsigned char savedSREG;
while (EECR & (1<<EEWE) ) ; // wait bit EEWE
EEAR = ADDR; // set address
EEDR = DATA; // set data
savedSREG = SREG; // keep setting so it can be restored

CLI(); // disable interrupts
Цитата(Serega Doc @ Nov 22 2005, 18:49) *
EECR |= BIT(EEMWE); // set "write enable" bit
EECR |= BIT(EEWE); // set "write" bit

while(EECR&(1<<EEWE));//wait for EEWE -> 0
EEAR=0;//to prevent EEPROM corruption
Цитата(Serega Doc @ Nov 22 2005, 18:49) *
SREG = savedSREG; // restore SREG
}

char EPROM_R(int ADDR)
{
while (EECR & (1<<EEWE));
CLI(); // disable interrupts
EEAR = ADDR; // set address
EECR |= BIT(EERE); // set "read enable" bit

EEAR=0;//to prevent EEPROM corruption
Цитата(Serega Doc @ Nov 22 2005, 18:49) *
SEI(); //re-enable interrupts
return (EEDR);
}

Я подправил, как считаю нужным. Т.е. суть в том, чтобы не использовать нулевую ячейку вообще. В ней будет мусор, вызванный сбоем проца при нарушении питания.
Может у тебя происходит повторный вход в обработчик прерывания?

Вот тема, где обсуждалась работа с EEPROM:
http://forum.electronix.ru/index.php?showtopic=7607
JeDay
Сбой наверно потому что напряжение падает слишком быстро. Попробуй ионистор еще один поставить, а запись, как скали выше, без прерываний делай.
При быстром падении напряжения возможно бит EEWE вылетает раньше времени.
dimka2001
тут надо на схемку позырить, наверное контроллер сбрасывается?!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.