Доброго времени суток! Выпускаются множество устройств, охранных сигнализаций. При прошивке контроллера, приходилось в ручную редактировать 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"))) // для удобства написания/чтения программы
Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
Добавлено: Пн авг 15, 2011 08:24:51
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
а разве подготовить файл с данными для EEPROM и прошить его на этапе изготовления устройства нельзя? зачем вручную что-то править? эта задача решается просто: надо использовать макрос EEMEM для описания переменных, тогда их начальные значения попадут в отдельный файл при компиляции:
Вместо этой строчки EEMEM uint8_t Mem1=0; я написал EEMEM uint16_t Mem1=0; Но запоминаются только первые 8 бит. Так как у меня 10 каналов. значение в EEPROM должно было записаться в 2 байта. Последние 2 бита не записываются. Почему?
Заголовок сообщения: Re: Работа с памятью. Запись в EEPROM.
Добавлено: Пн авг 15, 2011 10:32:26
Опытный кот
Карма: 3
Рейтинг сообщений: 43
Зарегистрирован: Вт апр 12, 2011 18:38:19 Сообщений: 838 Откуда: с Земли
Рейтинг сообщения:0
Обычно, для того чтобы проверить валидность данных в eeprom используют такой прием, как запись magic number в определенную ячейку. Я обычно использую 0x55AA. Идея проста. Читаем из eeprom по адресу magic (я обычно использую 0 адрес, но это не обязательно). Если там находится магическое число, то значит конфигурация записана, можно считывать. Если магического числа нет, используем значения по умолчанию. Вот кусочек кода. Метода проверена уже мульён раз, берите и пользуйтесь.
//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: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:48:31
Опытный кот
Карма: 3
Рейтинг сообщений: 43
Зарегистрирован: Вт апр 12, 2011 18:38:19 Сообщений: 838 Откуда: с Земли
Рейтинг сообщения:0
Совет: старайтесь избегать описаний int, word итп. Я вот пишу под разные платформы, и чтоб не вспоминать какая там размерность int, я всегда использую описания типа int16_t, uint16_t, int8_t итд. Сразу все становится предельно ясно.
_________________ Все будет только лучше, в крайнем случае - хуже.
Загляните в файл avr/eeprom.h и увидите, что функции eeprom_read_int() там нет. Вам надо самому ее писать или использовать те, что описаны в этом заголовочном файле. А по Вашей задачке используйте явное преобразование типа:
Код:
EEMEM uint16_t A; int B; eeprom_write_word(&A,(uint16_t)B);
_________________ — Не говорите мне что делать и я не скажу куда Вам идти...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения