Например TDA7294

Форум РадиоКот • Просмотр темы - Работа с памятью. Запись в EEPROM.
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пт июл 25, 2025 23:56:39

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 16 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 08:15:38 
Прорезались зубы

Карма: 2
Рейтинг сообщений: 0
Зарегистрирован: Сб янв 29, 2011 20:26:48
Сообщений: 238
Рейтинг сообщения: 0
Доброго времени суток! Выпускаются множество устройств, охранных сигнализаций. При прошивке контроллера, приходилось в ручную редактировать 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);
   }
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 08:24:51 
Поставщик валерьянки для Кота

Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45
Сообщений: 1995
Откуда: Цветочный город
Рейтинг сообщения: 0
а разве подготовить файл с данными для EEPROM и прошить его на этапе изготовления устройства нельзя? зачем вручную что-то править?
эта задача решается просто: надо использовать макрос EEMEM для описания переменных, тогда их начальные значения попадут в отдельный файл при компиляции:
Код:
#include <avr/io.h>
#define F_CPU 1000000UL
#include <avr/eeprom.h>
#include <util/delay.h>

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

_________________
битва с дураками проиграна, победители торжествуют. слава победителям!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 08:32:35 
Прорезались зубы

Карма: 2
Рейтинг сообщений: 0
Зарегистрирован: Сб янв 29, 2011 20:26:48
Сообщений: 238
Рейтинг сообщения: 0
Спасибо! Сейчас попробую!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 09:04:55 
Прорезались зубы

Карма: 2
Рейтинг сообщений: 0
Зарегистрирован: Сб янв 29, 2011 20:26:48
Сообщений: 238
Рейтинг сообщения: 0
Вместо этой строчки EEMEM uint8_t Mem1=0; я написал EEMEM uint16_t Mem1=0; Но запоминаются только первые 8 бит. Так как у меня 10 каналов. значение в EEPROM должно было записаться в 2 байта. Последние 2 бита не записываются. Почему?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 09:43:51 
Прорезались зубы

Карма: 2
Рейтинг сообщений: 0
Зарегистрирован: Сб янв 29, 2011 20:26:48
Сообщений: 238
Рейтинг сообщения: 0
А может архитектура памяти EEPROM не позволяет записать 2 байтовое значение?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 10:27:02 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 9
Рейтинг сообщений: 163
Зарегистрирован: Вс янв 09, 2011 16:51:39
Сообщений: 2335
Откуда: Санкт-Ленинград
Рейтинг сообщения: 0
king-live писал(а):
А может архитектура памяти EEPROM не позволяет записать 2 байтовое значение?
Так это у Вас спросить надо, что у Вас за МК. :)))

_________________
ICQ нет, и, в ближайшее время, не будет.


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 10:32:04 
Прорезались зубы

Карма: 2
Рейтинг сообщений: 0
Зарегистрирован: Сб янв 29, 2011 20:26:48
Сообщений: 238
Рейтинг сообщения: 0
Atmega8A


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 10:32:26 
Опытный кот
Аватар пользователя

Карма: 3
Рейтинг сообщений: 43
Зарегистрирован: Вт апр 12, 2011 18:38:19
Сообщений: 838
Откуда: с Земли
Рейтинг сообщения: 0
Обычно, для того чтобы проверить валидность данных в 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: Ежели чего непонятно, спрашивайте не стесняйтесь :)

_________________
Все будет только лучше, в крайнем случае - хуже.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 10:48:50 
Прорезались зубы

Карма: 2
Рейтинг сообщений: 0
Зарегистрирован: Сб янв 29, 2011 20:26:48
Сообщений: 238
Рейтинг сообщения: 0
Спасибо!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 10:51:38 
Поставщик валерьянки для Кота

Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45
Сообщений: 1995
Откуда: Цветочный город
Рейтинг сообщения: 0
king-live писал(а):
Вместо этой строчки EEMEM uint8_t Mem1=0; я написал EEMEM uint16_t Mem1=0; Но запоминаются только первые 8 бит. Так как у меня 10 каналов. значение в EEPROM должно было записаться в 2 байта. Последние 2 бита не записываются. Почему?
вы используете eeprom_update_word() для записи и eeprom_read_word() для чтения 16-битнгого числа?

_________________
битва с дураками проиграна, победители торжествуют. слава победителям!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 11:15:40 
Прорезались зубы

Карма: 2
Рейтинг сообщений: 0
Зарегистрирован: Сб янв 29, 2011 20:26:48
Сообщений: 238
Рейтинг сообщения: 0
Вот где ошибка! Теперь проверю код! Спасибо!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 11:21:11 
Прорезались зубы

Карма: 2
Рейтинг сообщений: 0
Зарегистрирован: Сб янв 29, 2011 20:26:48
Сообщений: 238
Рейтинг сообщения: 0
Цитата:
вы используете eeprom_update_word() для записи и eeprom_read_word() для чтения 16-битнгого числа?

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 11:48:31 
Опытный кот
Аватар пользователя

Карма: 3
Рейтинг сообщений: 43
Зарегистрирован: Вт апр 12, 2011 18:38:19
Сообщений: 838
Откуда: с Земли
Рейтинг сообщения: 0
:idea: Совет: старайтесь избегать описаний int, word итп. Я вот пишу под разные платформы, и чтоб не вспоминать какая там размерность int, я всегда использую описания типа int16_t, uint16_t, int8_t итд. Сразу все становится предельно ясно.

_________________
Все будет только лучше, в крайнем случае - хуже.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 11:54:14 
Поставщик валерьянки для Кота

Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45
Сообщений: 1995
Откуда: Цветочный город
Рейтинг сообщения: 0
king-live писал(а):
Цитата:
вы используете eeprom_update_word() для записи и eeprom_read_word() для чтения 16-битнгого числа?

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

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

_________________
битва с дураками проиграна, победители торжествуют. слава победителям!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 12:01:27 
Прорезались зубы

Карма: 2
Рейтинг сообщений: 0
Зарегистрирован: Сб янв 29, 2011 20:26:48
Сообщений: 238
Рейтинг сообщения: 0
Спасибо! Буду разбираться!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
СообщениеДобавлено: Пн авг 15, 2011 13:30:13 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Вт окт 27, 2009 22:39:19
Сообщений: 672
Откуда: Москва
Рейтинг сообщения: 0
king-live писал(а):
Спасибо! Буду разбираться!

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

_________________
— Не говорите мне что делать и я не скажу куда Вам идти...


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Google [Bot] и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y