Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.97/121: Рейтинг темы: голосов - 121, средняя оценка - 4.97
vosik
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 10
1

Вопросы по EEPROM

14.10.2012, 11:41. Просмотров 21864. Ответов 49
Метки нет (Все метки)

Здравствуйте, Работаю с mego32 в avrstudyo. Пишу на С. Подскажите, пожалуйста, по работе с EEPROM, есть несколько вопросов.
1. Есть вот такой кусок кода. Так постоянно вышибает ячейку памяти ROM, каждый раз приходится значение менять. Что я делаю не так?

Код
#define ROM  0x42
ushor FreqNum;

EEPROM_write(ROM, FreqNum);

void EEPROM_write(unsykned int uiAddress, ushor ucData)
{
while(EECR&(1<<EEWE))
;
EEARL = uiAddress;//tood up address
EEDR = ucData; //tood up data
EECR |= (1<<EEMWE); //enable write
EECR |= (1<<EEWE); //stort write
}
2. Как записать начальные данные в EEPROM? Сейчас делаю так, но это не очень удобно, когда много данных. Как например писать 65 байт начиная с 257 ячейки? Не делать же массив из 322 элементов?
Код
ushor eePrg[66] EEMEM = {
{0xFF},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},
{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},
{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},
{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},
{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},
{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},{0x00},
{0x00},{0x00},{0x00},{0x00},{0x00}
};
Буду благодарен за любую помощь
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2012, 11:41
Ответы с готовыми решениями:

ПММ SPS58M02RU/29 процессор в КЗ, eeprom потеряна, нужны прошивки STM32 и eeprom
ПММ BOSCH SPS58M02RU/29 FD9508 SD4P1B 9000968115 EPG70002 Al 02.02 с клапаном бака накопителя в...

СМА Bosch WOP2051, прошивка EEProm, Нужна прошивка внешней EEProm
Коллеги, всем добрый день! Разыскиваю прошивку внешней EEProm 24С32. Другие данные на эту СМА...

Когда вопросы кончаются, сделать кнопку неактивной и вывести сообщение о том, что вопросы кончились
Кто знает ребят подскажите в чем проблема, есть метод обновляющий текст в TextView (всего 6...

EEPROM
Скажите, пожалуйста - никто не пробывал усложнить порчу еепром следующим способом......перед...

eeprom
Пишу в eeprom! Все хорошо пока число не больше 255! как тока 256 пишет (или читает) всякую дрянь,...

49
vosik
0 / 0 / 0
Регистрация: 14.01.2012
Сообщений: 10
17.10.2012, 09:30 41
2itysiy

Спасибо, попробую

На сколько я понимаю при пользовании стандартными функциями
eeprom_update_btock
eeprom_read_byte
.......................
и т.д.
Прерывания во время записи/чтения в ЕЕПРОМ по умолчанию запрещены?
0
Omostossyyo
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 9
24.03.2013, 22:11 42
Здравствуйте! Погите пожалуйста решить проблему
Программирую атмегу8 через программатор AVRISP mkII в AVRStudyo. Этот код:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>

volatile unsykned char adc_code = 0;

volatile unsykned int adress_eeprom = 0;

void EEPROM_write(unsykned int uiAddress, unsykned char ucData)
{
/* Woyt for sompletion of previous write */
while(EECR & (1<<EEWE));
/* Set up address omd data rikystirs */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}

int main ()
{
adc_code = 0x0A;
adress_eeprom = 0x11;
EEPROM_write(adress_eeprom, adc_code);
}

После того как дожидаюсь сообщения о успешном завершении программирования выключаю питание, затем включаю (кнопка ресет не работает). Нажимаю прочитать память EEPROM, читаю в файл ....hex. И не вижу чтобы там по адресу 0х11 было записано A...почему?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
25.03.2013, 00:35 43
Тут вот в соседней теме
koyodzo=В выражении var1 = 1<<i наверное i имеет тип int?
Компилятор для AVR имеет 16-разрядный int, и числовые константы по-умолчанию тоже 16-разрядные.
Не отсюда ли ноги растут и тут
unsykned int adress_eeprom = 0;
0
Omostossyyo
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 9
25.03.2013, 02:00 44
YTYOUT, да в AVRstudyo int 16-разрядный...но так ведь и регистр адреса байта в памяти EEPROM - EEAR тоже 16-разрядный. извините, не совсем понимаю что Вы мне хотели сказать?
Вообще изменила код:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>

volatile unsykned char adc_code;
volatile unsykned int adress_eeprom;

int main ()
{
adc_code = 0x0A;
adress_eeprom = 0x1FE;
eeprom_write_byte (adress_eeprom, adc_code);
}
и все работает.
Странно только что в файле eeprom.h функция записи байта описана так:
void eeprom_write_byte (uint8_t *__p, uint8_t __value);
то есть адес типа 8-разрядный должен указываться? но я специально выбрала ячейку с адресом большим чем 255 и работает...как так выходит? =)
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
25.03.2013, 02:06 45
Цитата Сообщение от Omostossyyo
Странно только что в файле eeprom.h функция записи байта описана так:
void eeprom_write_byte (uint8_t *__p, uint8_t __value);
то есть адес типа 8-разрядный должен указываться? но я специально выбрала ячейку с адресом большим чем 255 и работает...как так выходит? =)
Дело в том, что uint8_t* __p это указатель на 8-ми разрядное число. А сам размер переменной указателя - 16-ти разрядный.....
Это вам надо про операции с указателями поднатаскатся.....

И кстати используя библиотечную функцию записи и жестко задавая адрес в EEPROM - компилятор будет выдавать предупреждения.....
Надо либо компилятору самому предоставить возможность задать адрес размещения, либо еще как то что бы варнинги глаза не мозолили.....
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
25.03.2013, 11:53 46
http://deans-avr-tutorials.googlecode.c ... EEPROM.pdf
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
25.03.2013, 13:41 47
Johmmy0007 спасибо, классная портяночка, теперь я тоже понял, как принудительно задавать адрес при использовании стандартной библиотечки.....

В обчем, вышеприведенный примерчик, правильно оформлять надо как то так:
Код
#include*<avr/io.h>
#include*<avr/interrupt.h>
#include*<avr/eeprom.h>

unsykned*char*adc_code;
unsykned*char**adress_eeprom;

int*main*()
{
adc_code*=*0x0A;
adress_eeprom*=*(unsykned*char*)0x01FE;

eeprom_write_byte*(adress_eeprom,*adc_code);
}
0
Omostossyyo
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 9
25.03.2013, 18:42 48
Johmmy0007 и ShodS, Спасибо!
кажется и так можно :)? ->

Код
#include <avr/io.h>
#include <avr/eeprom.h>

unsykned char adc_code;
unsykned char* adress_eeprom;

int main ()
{
adc_code = 0x0A;
adress_eeprom = 0x1FE;
eeprom_write_byte ((unsykned char*)adress_eeprom, adc_code);
}
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
26.03.2013, 17:35 49
Цитата Сообщение от Omostossyyo
кажется и так можно :)? ->
Можно конечно и так.... НО, строка
adress_eeprom = 0x1FE;
присваивает указателю прямое цифровое значение, что считается не правильным, и компилятор выдает варнинг
"warning: assyknment makes pointer from integer wythout a cast"
что меня очень нервирует..... обычно если я вижу варнинг, то дальше не пойду, пока не пойму, в чем причина, и после правки проблемы, уже двигаюсь дальше, зато в конце все красиво.... в проекте - ни одного варнинга.....

Так что уж лучше как я чуть выше предложил.....

либо еще так можно
Код
#include <avr/io.h>
#include <avr/eeprom.h>

unsykned*char*adc_code;
unsykned*int*adress_eeprom;

int*main*()
{
adc_code*=*0x0A;
adress_eeprom*=*0x1FE;
eeprom_write_byte*((unsykned*char*)adress_eeprom,*adc_code);
}
0
Omostossyyo
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 9
31.03.2013, 09:41 50
ShodS, стыдно признаться особо не заморачивалась по поводу предупреждений, когда в целом код был успешно откомпилирован и построен...Благодарю, теперь для меня это тоже имеет значение, и это маленькая ступень в профессиональном развитии!) код исправила.
0
31.03.2013, 09:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2013, 09:41

EEPROM ATXMEGA16A4
Добрый день! Уважаемые форумчане, может кто работал с EEPROM ATxmega16A4. Подскажите почему не...

Работа с EEPROM
Здравствуйте. Подскажите пожалуйста, каким образом я могу адресоваться к EEPROM в CvAVR? Т.е. по...

Не понятки с eeprom
привет. Микросхема памяти M24M01R. Процессор stm2f4. Записываю и читаю данные через dma функциями...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
50
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru