Обсуждаем контроллеры компании Atmel.
Ответить

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

Вт сен 27, 2022 16:47:02

Доброго всем добрым котам. Не добрым -- не доброго :)
Вопрос по явному заданию адреса для циклического чтения (ну и записи) в 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

Мне необходимо инициализировать начальную ячейку адресного пространства 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

Вы неверно понимаете указатели в Си. Если мы берем указатель 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

допустим надо записать массив в 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

А как записать в прямую в епром , ну к примеру я хочу записать в атмегу 8 в епром с адресом 000Ф , значение 0Ф ! Это вопрос для среды программирования CVAVR ?

Re: явно задать адрес в EEPROM

Вт сен 27, 2022 21:20:04

Alex_641, как в моем примере. Указатель на адрес байта uint8_t* ptr=(uint8_t*)0x0F; и пишете значение eeprom_write_byte (ptr, 0x0F);

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

Ср сен 28, 2022 15:19:20

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