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

 
 
> 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
Ответов (1 - 5)
Палыч
сообщение Feb 11 2011, 14:52
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Запись в EEPROM длится несколько миллисекунд, поэтому делать это из прерываний таймера - нежелательно. Наверное, нужно в таймере выставлять флаг требования записи, а в бесконечном цикле основной программы его проверять, при необходимости - делать запись данных и сброс флага.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 11 2011, 15:31
Сообщение #3


;
******

Группа: Участник
Сообщений: 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
RicLab
сообщение Feb 12 2011, 04:42
Сообщение #4


Участник
*

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



сделал так

Код
eeprom int Datamemory=40;             // обьявляем переменные
int readydata,var;

interrupt [TIM0_OVF] void timer0_ovf_isr(void){

readydata++;                                  //  в прерывании инкрементируем
};

while (1)
      {
    
      if (readydata==392) {                 // каждые ~ 100мсек
      readydata=0;                            
      if (Datamemory!=var) {       // если значение в eeprom не равно текущему значению
      Datamemory=var;               // записываем текущее значение в eeprom  
                                              };                      
                                     };
                };
}


временной интервал проверки уменьшил до 100мсек так как при оном равном 1 сек при выключении питания записывался мусор(при сбросе все нормально biggrin.gif ).
понимаю что так записывать наверно неправильно, так что жду критики. smile3046.gif

Сообщение отредактировал RicLab - Feb 12 2011, 04:43
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 12 2011, 07:16
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Условие лучше записать так:
Код
if (readydata >= 392)
а к переменной readydata добавить спецификатор volatile
Go to the top of the page
 
+Quote Post
RicLab
сообщение Feb 12 2011, 10:12
Сообщение #6


Участник
*

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



Палыч
Спасибо, полностью согласен с вами! biggrin.gif
Go to the top of the page
 
+Quote Post

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

 


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


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