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

 
 
> eeprom avr, запись и чтение
RicLab
сообщение Feb 11 2011, 13:53
Сообщение #1


Участник
*

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



Добрый день.
в проекте необходимо записать переменную изменяемую пользователем в eeprom если она не изменяется в течении ~1сек.

Записываю так:
Код
eeprom int Datamemory=40;  // обьявляю переменную

void xxx (void)                      // функция вызываемая прерыванием таймера

if(oldvariable==newvariable){
x++;
                                          }
else                              {
x=0;
                                    };
if (x==3921){
Datamemory=variable;
x=0;
};

void main()void

variable2=Datamemory;


запись происходит не всегда и если записывается то мусор.
Как правильно организовать запись в eeprom?

Сообщение отредактировал RicLab - Feb 11 2011, 13:54
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Pasha
сообщение Feb 11 2011, 15:31
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Обычно, делаю так
Код
{
  static timer_t time;
  if(oldvar != newvar)
  {
    time = get_tick();
    newvar = oldvar;
  }
  else if(tick_diff(time) > T1SEC)
  {
    EE_write(&Datamemory, &newvar, sizeof(newvar)); // void EE_write(void *dst, void*src, size_t size)
  }
}

Несколько пояснений.
1.timer_t, get_tick(), tick_diff(time) - не думаю, что будут вопросы, но - есть некоторая переменная, которая каждые 1мС инкрементируется в прерывании. Но она доступна только через get_tick().

2. Я бы нагло проигнорировал эту сладенькую фичу
Код
Datamemory=variable;
потому что запись в еепром это и ожидание его освобождения, и сравнение считанных данных с записываемыми для того, чтобы не допускать лишней перезаписи, и выполнение критических задач на время записи. Это как минимум. Можно добавлять еще и коррекцию контрольной суммы, запись в резервную страницу памяти, обновление образа еепром в озу - кому и что надобно для конкретного девайса.

3. Приведенная операция производится в бесконечном цикле обработки событий, собсна как и построено 99,9% задач для МК без оси. Но никак не в прерывании. Задача прерывания - быстро все сделать и выйти. Подобные зависоны, как у Вас - очень большая редкость, и они должны быть сильно обоснованы
Go to the top of the page
 
+Quote Post



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

 


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


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