Например TDA7294

Форум РадиоКот • Просмотр темы - задать адрес в EEPROM для циклического обращения. РЕШЕНО
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Сб дек 13, 2025 21:58:32

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


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



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: задать адрес в EEPROM для циклического обращения. РЕШЕНО
СообщениеДобавлено: Вт сен 27, 2022 16:47:02 
Прорезались зубы

Карма: -5
Рейтинг сообщений: -18
Зарегистрирован: Ср янв 11, 2012 11:55:51
Сообщений: 217
Рейтинг сообщения: 0
Доброго всем добрым котам. Не добрым -- не доброго :)
Вопрос по явному заданию адреса для циклического чтения (ну и записи) в 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 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: явно задать адрес в EEPROM
СообщениеДобавлено: Вт сен 27, 2022 19:49:45 
Потрогал лапой паяльник
Аватар пользователя

Карма: 1
Рейтинг сообщений: 26
Зарегистрирован: Ср мар 09, 2016 08:07:41
Сообщений: 300
Рейтинг сообщения: 0
Цитата:
Мне необходимо инициализировать начальную ячейку адресного пространства 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));
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: явно задать адрес в EEPROM
СообщениеДобавлено: Вт сен 27, 2022 20:18:05 
Прорезались зубы

Карма: -5
Рейтинг сообщений: -18
Зарегистрирован: Ср янв 11, 2012 11:55:51
Сообщений: 217
Рейтинг сообщения: 0
Вы неверно понимаете указатели в Си. Если мы берем указатель uint8_t*, то он указывет на один байт данных, и читать с его помощью вы будете по байту.

Мне и надо читать по байту. В чем неверность понимания?
Большое спасибо за помощь. В таком виде вроде работает:
Код:
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 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: явно задать адрес в EEPROM
СообщениеДобавлено: Вт сен 27, 2022 20:59:01 
Друг Кота

Карма: -1
Рейтинг сообщений: 85
Зарегистрирован: Вт мар 13, 2012 12:16:13
Сообщений: 8867
Откуда: .ru
Рейтинг сообщения: 0
допустим надо записать массив в 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; // дата
};


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: явно задать адрес в EEPROM
СообщениеДобавлено: Вт сен 27, 2022 21:13:14 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: -14
Рейтинг сообщений: 103
Зарегистрирован: Вт янв 26, 2021 22:33:21
Сообщений: 2314
Рейтинг сообщения: 0
А как записать в прямую в епром , ну к примеру я хочу записать в атмегу 8 в епром с адресом 000Ф , значение 0Ф ! Это вопрос для среды программирования CVAVR ?

_________________
Не спрашивай по ком звонит колокол, он звонит по тебе !


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: явно задать адрес в EEPROM
СообщениеДобавлено: Вт сен 27, 2022 21:20:04 
Прорезались зубы

Карма: -5
Рейтинг сообщений: -18
Зарегистрирован: Ср янв 11, 2012 11:55:51
Сообщений: 217
Рейтинг сообщения: 0
Alex_641, как в моем примере. Указатель на адрес байта uint8_t* ptr=(uint8_t*)0x0F; и пишете значение eeprom_write_byte (ptr, 0x0F);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: задать адрес в EEPROM для циклического обращения. РЕШЕНО
СообщениеДобавлено: Ср сен 28, 2022 15:19:20 
Друг Кота
Аватар пользователя

Карма: 17
Рейтинг сообщений: 464
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Сообщений: 5552
Откуда: Воронеж
Рейтинг сообщения: 0
Для CVAVR можно просто указать модификатор EEPROM.

_________________
"Привет!" - соврал он.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 38


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

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


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