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

 
 
> Сохранение важных переменных в EEPROM при потере питяния
ATMExpert
сообщение Feb 8 2012, 13:05
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 20-11-09
Из: Ставрополь
Пользователь №: 53 756



Бодрого дня всем форумчанам. В моем проекте (на Mega640) требуется в момент пропадания общего питания сохранять 5-6 байт оперативной информации в еепром, дабы иметь возможность при подаче питания благополучно их считывать. Аппаратно для этих целей использую встроенный компаратор с внешней опорой (REF192) и делитель по питанию. В программе ставлю прерывание на компаратор, ну и пишу в еепром. Схема питания такая: +24-->+12-->diode-->condencator 2200 uF-->+5. При пропадании +24 схема детектирует просадку, вызывается прирывание. Конденсатор 2200 мкФ думаю достаточен, чтобы успеть записать в память до снижения питания ниже критического уровня. В железе показывает достаточно устойчивую работу (в лаб. условиях). Хочется услышать мнения по такой реализации, а также может нужно еще что-то в код добавлять если после успешной записи остается время (может нужно ожидать с ноги выхода компаратора смену уровня, если это была кратковременная просадка питания).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
desh
сообщение Feb 27 2012, 14:35
Сообщение #2


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

Группа: Свой
Сообщений: 113
Регистрация: 25-10-07
Из: Краснодар
Пользователь №: 31 725



А что вам мешает защищать ваши ячейки контрольной суммой? Например так:

CODE
#include "crc.h"
#include "eeprom.h"

//******************************************************************************
// Функция сохраняет данные в еепром с добавлением 2 байт CRC
//******************************************************************************
bool SaveBlock(unsigned short Address, char* Data, unsigned short Size)
{
char Ch;
unsigned short Crc = 0xFFFF;

for (unsigned short Index = 0; Index < Size; Index++)
{
Ch = Data[Index];
__EEPUT(Address + Index, Ch);
Crc = AddCrc16(Ch, Crc);
}
__EEPUT(Address + Size, (unsigned char)Crc);
__EEPUT(Address + Size + 1, (unsigned char)(Crc >> 8));
return true;
}

//******************************************************************************
// Функция читает данные из еепром с контролем 2 байт CRC
//******************************************************************************
bool LoadBlock(unsigned short Address, char* Data, unsigned short Size)
{
char Ch;
unsigned short Crc = 0xFFFF;

for (unsigned short Index = 0; Index < Size; Index++)
{
__EEGET(Ch, Address + Index);
Data[Index] = Ch;
Crc = AddCrc16(Ch, Crc);
}
__EEGET(Ch, Address + Size);
Crc = AddCrc16(Ch, Crc);
__EEGET(Ch, Address + Size + 1);
Crc = AddCrc16(Ch, Crc);
return Crc ? false : true;
}

xSemaphoreHandle EepromLockMutex = NULL;

//******************************************************************************
// Заблокировать интерфейс
//******************************************************************************
void EepromLock()
{
portENTER_CRITICAL();
if(EepromLockMutex == NULL) EepromLockMutex = xSemaphoreCreateMutex();
portEXIT_CRITICAL();
xSemaphoreTake(EepromLockMutex, portMAX_DELAY);
}

//******************************************************************************
// Разблокировать интерфейс
//******************************************************************************
void EepromUnlock()
{
xSemaphoreGive(EepromLockMutex);
}

//******************************************************************************
// Функция загружает конфигурацию из EEPROM в случае успеха возвращает true
//******************************************************************************
bool EepromLoadConfig(USHORT Offset, void* Config, unsigned short Size)
{
bool Ret = true;

Offset = (Offset + 2) * 2;
EepromLock();
if (!LoadBlock(Offset + 0, Config, Size))
if (!LoadBlock(Offset + Size + 2, Config, Size))
Ret = false;
EepromUnlock();
return Ret;
}

//******************************************************************************
// Функция сохраняет конфигурацию в EEPROM в случае успеха возвращает true
//******************************************************************************
bool EepromSaveConfig(USHORT Offset, void* Config, unsigned short Size)
{
Offset = (Offset + 2) * 2;
EepromLock();
SaveBlock(Offset + 0, Config, Size);
SaveBlock(Offset + Size + 2, Config, Size);
EepromUnlock();
return true;
}


Функции EepromLock/EepromUnlock и расчет смещения для нескольких записей можно удалить. Функцию для расчета crc добавить по вкусу.

Сообщение отредактировал IgorKossak - Feb 27 2012, 14:37
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ATMExpert   Сохранение важных переменных в EEPROM при потере питяния   Feb 8 2012, 13:05
- - aaarrr   Цитата(ATMExpert @ Feb 8 2012, 17:05) Кон...   Feb 8 2012, 13:13
- - V_G   Я в xmegy успеваю сохранить страницу (32 байта) пр...   Feb 8 2012, 13:15
- - zombi   Цитата(ATMExpert @ Feb 8 2012, 16:05) ......   Feb 8 2012, 13:36
- - ATMExpert   Кондер стоит по 12 вольтам. от этой же напруги пит...   Feb 8 2012, 16:06
|- - aaarrr   Цитата(ATMExpert @ Feb 8 2012, 20:06) Так...   Feb 8 2012, 16:12
|- - zombi   Цитата(ATMExpert @ Feb 8 2012, 19:06) При...   Feb 8 2012, 17:29
- - ATMExpert   Дык вот этой строчкой и жду вроде как: while (bit...   Feb 8 2012, 16:25
|- - aaarrr   Цитата(ATMExpert @ Feb 8 2012, 20:21) Дык...   Feb 8 2012, 16:27
|- - ATMExpert   Цитата(aaarrr @ Feb 8 2012, 20:27) В том-...   Feb 8 2012, 16:31
|- - aaarrr   Цитата(ATMExpert @ Feb 8 2012, 20:31) Т.е...   Feb 8 2012, 16:44
- - ILYAUL   1. Что мешает сразу сохранять данные в EEPROM? 2. ...   Feb 8 2012, 17:04
- - ATMExpert   Цитата1. Что мешает сразу сохранять данные в EEPRO...   Feb 8 2012, 17:48
|- - ILYAUL   Цитата(ATMExpert @ Feb 8 2012, 21:44) 1. ...   Feb 8 2012, 18:04
|- - ATMExpert   Цитата(ILYAUL @ Feb 8 2012, 22:04) Вы не ...   Feb 8 2012, 19:10
|- - zombi   Цитата(ATMExpert @ Feb 8 2012, 22:10) В с...   Feb 8 2012, 19:22
|- - ATMExpert   Цитата(zombi @ Feb 8 2012, 23:22) Как час...   Feb 9 2012, 04:50
|- - zombi   Цитата(ATMExpert @ Feb 9 2012, 07:50) А е...   Feb 9 2012, 08:40
- - demaven   в одной из работ потребовалось сохранять небыстро ...   Feb 9 2012, 09:04
|- - ATMExpert   Цитата(demaven @ Feb 9 2012, 13:04) в одн...   Feb 9 2012, 11:56
|- - defunct   Цитата(demaven @ Feb 9 2012, 11:04) видно...   Feb 19 2012, 04:27
- - smk   Ионистор ставить не желаете? А вообще для таких ус...   Feb 19 2012, 05:27
- - demaven   с двумя местами сохранения никак не получается. яч...   Feb 27 2012, 12:49
|- - zombi   Цитата(demaven @ Feb 27 2012, 16:49) с дв...   Feb 27 2012, 14:39


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

 


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


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