Например TDA7294

Форум РадиоКот :: Просмотр темы - Работа с памятью. Запись в EEPROM.
Форум РадиоКот
https://radiokot.ru/forum/

Работа с памятью. Запись в EEPROM.
https://radiokot.ru/forum/viewtopic.php?f=20&t=52909
Страница 1 из 1

Автор:  king-live [ Пн авг 15, 2011 08:15:38 ]
Заголовок сообщения:  Работа с памятью. Запись в EEPROM.

Доброго времени суток! Выпускаются множество устройств, охранных сигнализаций. При прошивке контроллера, приходилось в ручную редактировать EEPROM (записовал только "0"). Если не редактировать, то устройство не запускается. Как написать код так, чтобы без редактирования в ручную EEPROM, автоматически при первом включении устройства, в EEPROM записались "0" по адресу указанным в коде! Повторяю, только при первом включении устройства. При последующих включениях, устройство должно считывать с EEPROM, только данные которые были записанны при работе устройства, которые зависят от действия человека. Пример кода ниже.
Спасибо!

Код:

#include <avr/io.h>
#define F_CPU 1000000UL
#include <avr/eeprom.h>
#include <util/delay.h>
#define EEPROM_SECTION  __attribute__ ((section (".eeprom"))) // для удобства написания/чтения программы

unsigned char ON=1;
unsigned char OFF=0;
unsigned char e=0;
unsigned char CANAL1;

uint8_t Mem1   EEPROM_SECTION=0;

void Memori()
{
eeprom_update_byte(&Mem1,CANAL1);
}

int main(void)
{
DDRD=1;

CANAL1=OFF;

CANAL1=eeprom_read_byte(&Mem1);
while(1)
   {
   _delay_ms(500);
   e=e+1;
   if (e>200)
      {
      Memori();
      e=0;
      }
   if (bit_is_set(PIND,1))
   CANAL1=OFF;
   if (bit_is_set(PIND,2))
   CANAL1=ON;

   if(CANAL1==ON)   PORTD |= _BV(PD0);
   else   PORTD &=~_BV(PD0);
   }
}

Автор:  Мастер Ломастер [ Пн авг 15, 2011 08:24:51 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

а разве подготовить файл с данными для EEPROM и прошить его на этапе изготовления устройства нельзя? зачем вручную что-то править?
эта задача решается просто: надо использовать макрос EEMEM для описания переменных, тогда их начальные значения попадут в отдельный файл при компиляции:
Код:
#include <avr/io.h>
#define F_CPU 1000000UL
#include <avr/eeprom.h>
#include <util/delay.h>

EEMEM uint8_t Mem1 = 12; // в файл запишется 12 - начальное значение ячейки

Автор:  king-live [ Пн авг 15, 2011 08:32:35 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

Спасибо! Сейчас попробую!

Автор:  king-live [ Пн авг 15, 2011 09:04:55 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

Вместо этой строчки EEMEM uint8_t Mem1=0; я написал EEMEM uint16_t Mem1=0; Но запоминаются только первые 8 бит. Так как у меня 10 каналов. значение в EEPROM должно было записаться в 2 байта. Последние 2 бита не записываются. Почему?

Автор:  king-live [ Пн авг 15, 2011 09:43:51 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

А может архитектура памяти EEPROM не позволяет записать 2 байтовое значение?

Автор:  Dmitry Dubrovenko [ Пн авг 15, 2011 10:27:02 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

king-live писал(а):
А может архитектура памяти EEPROM не позволяет записать 2 байтовое значение?
Так это у Вас спросить надо, что у Вас за МК. :)))

Автор:  king-live [ Пн авг 15, 2011 10:32:04 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

Atmega8A

Автор:  coredumped [ Пн авг 15, 2011 10:32:26 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

Обычно, для того чтобы проверить валидность данных в eeprom используют такой прием, как запись magic number в определенную ячейку. Я обычно использую 0x55AA.
Идея проста. Читаем из eeprom по адресу magic (я обычно использую 0 адрес, но это не обязательно). Если там находится магическое число, то значит конфигурация записана, можно считывать. Если магического числа нет, используем значения по умолчанию.
Вот кусочек кода. Метода проверена уже мульён раз, берите и пользуйтесь.
Код:
#include <avr/eeprom.h>
#define EEPROM_SECTION  __attribute__ ((section (".eeprom")))

uint16_t      eeprom_magic    EEPROM_SECTION  = 0x55AA;   
uint16_t      eeprom_param    EEPROM_SECTION  = 0;      


int main(void)
{
   uint16_t param;


   //load params
   if(eeprom_read_word(&eeprom_magic)==0x55AA)   
   {
      param=eeprom_read_word(&eeprom_param);
   }
   else
   {
   //set default values
      param= 0;
// вот здесь можно сделать эту Вашу запись при первом включении
      eeprom_write_word(&eeprom_magic, 0x55AA); //write the magic number
      eeprom_write_word(&eeprom_param, param); //save parameter

   }

}


PS: Ежели чего непонятно, спрашивайте не стесняйтесь :)

Автор:  king-live [ Пн авг 15, 2011 10:48:50 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

Спасибо!

Автор:  Мастер Ломастер [ Пн авг 15, 2011 10:51:38 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

king-live писал(а):
Вместо этой строчки EEMEM uint8_t Mem1=0; я написал EEMEM uint16_t Mem1=0; Но запоминаются только первые 8 бит. Так как у меня 10 каналов. значение в EEPROM должно было записаться в 2 байта. Последние 2 бита не записываются. Почему?
вы используете eeprom_update_word() для записи и eeprom_read_word() для чтения 16-битнгого числа?

Автор:  king-live [ Пн авг 15, 2011 11:15:40 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

Вот где ошибка! Теперь проверю код! Спасибо!

Автор:  king-live [ Пн авг 15, 2011 11:21:11 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

Цитата:
вы используете eeprom_update_word() для записи и eeprom_read_word() для чтения 16-битнгого числа?

И как теперь исправить? Вместо eeprom_read_word() пишу eeprom_read_int(). Компилятор выдаёт ошибку на int.

Автор:  coredumped [ Пн авг 15, 2011 11:48:31 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

:idea: Совет: старайтесь избегать описаний int, word итп. Я вот пишу под разные платформы, и чтоб не вспоминать какая там размерность int, я всегда использую описания типа int16_t, uint16_t, int8_t итд. Сразу все становится предельно ясно.

Автор:  Мастер Ломастер [ Пн авг 15, 2011 11:54:14 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

king-live писал(а):
Цитата:
вы используете eeprom_update_word() для записи и eeprom_read_word() для чтения 16-битнгого числа?

И как теперь исправить? Вместо eeprom_read_word() пишу eeprom_read_int(). Компилятор выдаёт ошибку на int.

используйте те функции, что я указал.

Автор:  king-live [ Пн авг 15, 2011 12:01:27 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

Спасибо! Буду разбираться!

Автор:  md5sum [ Пн авг 15, 2011 13:30:13 ]
Заголовок сообщения:  Re: Работа с памятью. Запись в EEPROM.

king-live писал(а):
Спасибо! Буду разбираться!

Загляните в файл avr/eeprom.h и увидите, что функции eeprom_read_int() там нет.
Вам надо самому ее писать или использовать те, что описаны в этом заголовочном файле.
А по Вашей задачке используйте явное преобразование типа:
Код:
EEMEM uint16_t A;
int B;
eeprom_write_word(&A,(uint16_t)B);

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/