задать адрес в EEPROM для циклического обращения. РЕШЕНО

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Сообщение Land »

Доброго всем добрым котам. Не добрым -- не доброго :)
Вопрос по явному заданию адреса для циклического чтения (ну и записи) в EEPROM при работе со стандартной библиотекой eeprom.h
функция чтения байта из памяти там выглядит таким образом

Код: Выделить всё

uint8_t eeprom_read_byte (const uint8_t *__p) __ATTR_PURE__;
Если я правильно понимаю, то в функции используется указатель на адрес ячейки в EEPROM. Мне необходимо инициализировать начальную ячейку адресного пространства 0x0010 и последовательно читать до адреса 0x01FF (512 байт памяти). И вопрос собственно в организации адресации. Поскольку памяти 512 байт, то для адресации надо использовать двухбайтную переменную, в то время, как для указателя функция требует однобайтное значение. Как это правильно сделать, насколько корректно то, что я наваял?

Код: Выделить всё

uint8_t get_status(void)
{
	int ee_byte = 0x010;
	uint8_t *ee_byte_Ptr;
	ee_byte_Ptr = &ee_byte;
	flag_CLOSE = eeprom_read_byte(*ee_byte_Ptr); // начальный адрес в EEPROM
	for (*ee_byte_Ptr; (flag_CLOSE != 0xFF)&(ee_byte <=0x1FF); *ee_byte_Ptr++)
		flag_CLOSE = eeprom_read_byte(*ee_byte_Ptr);
	return flag_CLOSE;
}
Последний раз редактировалось Land Вт сен 27, 2022 21:26:27, всего редактировалось 1 раз.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 360
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

Мне необходимо инициализировать начальную ячейку адресного пространства 0x0010

Код: Выделить всё

uint8_t* ptr=(uint8_t*)0x10
Поскольку памяти 512 байт, то для адресации надо использовать двухбайтную переменную, в то время, как для указателя функция требует однобайтное значение. Как это правильно сделать,
Вы неверно понимаете указатели в Си. Если мы берем указатель uint8_t*, то он указывет на один байт данных, и читать с его помощью вы будете по байту. Если указатель будет uint16_t* то он будет указывть на два байта. Если к такому указателю прибавить единицу, то он будет указывать на следующие два байта данных.

Код: Выделить всё

 for(uint16_t i=0;i<512;i++){
        uint8_t value=eeprom_read_byte((uint8_t*)(ptr+i));
} 
Реклама
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Сообщение Land »

[uquote="JackSmith",url="/forum/viewtopic.php?p=4296249#p4296249"]Вы неверно понимаете указатели в Си. Если мы берем указатель uint8_t*, то он указывет на один байт данных, и читать с его помощью вы будете по байту.[/uquote]
Мне и надо читать по байту. В чем неверность понимания?
Большое спасибо за помощь. В таком виде вроде работает:

Код: Выделить всё

uint8_t get_status(void)
{
	uint8_t* ptr=(uint8_t*)0x10;
	for (ptr = 0x10; ((flag_CLOSE == 0xFF)&(ptr <=0x1FF)); ptr++)
	flag_CLOSE = eeprom_read_byte((uint8_t*)ptr);
        ptr--;
	return flag_CLOSE;
}
Последний раз редактировалось Land Вт сен 27, 2022 21:25:10, всего редактировалось 1 раз.
Друг Кота
Сообщения: 9451
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

допустим надо записать массив в EEPROM... и прочитать EEPROM в массив...

unsigned char x; // x - счёт
unsigned char E_int[128]={}; // E_int[128] - массив

//запись EEPROM:
for (x=0;x<128;x++) {
EEAR = x; // адрес
EEDR = E_int[x]; // дата
EECR |= 0b00000100; // разрешение записи EEPROM
EECR |= 0b00000010; // запись EEPROM
while(EECR & 0b00000010); // ждём окончания записи EEPROM
};

//чтение EEPROM:
for (x=0;x<128;x++) {
EEAR = x; // адрес
EECR |= 0b00000001; // чтение EEPROM
E_int[x]=EEDR; // дата
};
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Сообщение Alex_641 »

А как записать в прямую в епром , ну к примеру я хочу записать в атмегу 8 в епром с адресом 000Ф , значение 0Ф ! Это вопрос для среды программирования CVAVR ?
Не спрашивай по ком звонит колокол, он звонит по тебе !
Реклама
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Сообщение Land »

Alex_641, как в моем примере. Указатель на адрес байта uint8_t* ptr=(uint8_t*)0x0F; и пишете значение eeprom_write_byte (ptr, 0x0F);
Реклама
Друг Кота
Аватара пользователя
Сообщения: 5852
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж

Сообщение >TEHb< »

Для CVAVR можно просто указать модификатор EEPROM.
Усложнять просто. Упрощать сложно.
Контактная информация:
Ответить

Вернуться в «AVR»