Последовательная запись и чтение данных в EEPROM

Я работаю над проектом своего колледжа, который должен хранить данные в EEPROM AtMega32. Я могу записывать и читать данные в любом конкретном месте памяти. Но когда я пытаюсь записать данные последовательно с адреса от 0 до 1023, я получаю неправильные значения.

Вот функции, которые я написал.

Определение функции для чтения и записи данных

#include "eeprom.h"

uint8_t EEPROMRead(uint16_t uiAddress)
{
    /* Wait for completion of previous write */
    while(EECR & (1<<EEWE));
    /* Set up address register */
    EEAR = uiAddress;
    /* Start eeprom read by writing EERE */
    EECR |= (1<<EERE);
    /* Return data from data register */
    return EEDR;
}

void EEPROMWrite(uint16_t uiAddress, uint8_t ucData)
{
    /* Wait for completion of previous write */
    while(EECR & (1<<EEWE));
    /* Set up address and data registers */
    EEAR = uiAddress;
    EEDR = ucData;
    /* Write logical one to EEMWE */
    EECR |= (1<<EEMWE);
    /* Start eeprom write by setting EEWE */
    EECR |= (1<<EEWE);
}

Вот основная функция

static int epadr=0;
epread=EEPROMRead(epadr);      //reading from address stored in epadr
printf("%d",epread);           //printing values


if(epadr<=1023)
    {
        EEPROMWrite(epadr,high);    //writing at address stored in epadr
        epadr++;                   //increment address
    }
}

if(epadr>1023)
printf("Memory Full\n");

Я хочу хранить данные от 0 до 1023. Скажите, пожалуйста, что не так с этим кодом.


person Ravi Sharma    schedule 17.10.2016    source источник
comment
Каково определение переменных EEAR, EECR и EEDR и т. д.?   -  person Dai    schedule 17.10.2016
comment
Где вы инициализируете epadr? Вы полагаетесь на нулевую инициализацию переменных длительности статического хранения? Это плохая практика, особенно во встроенных системах, которые часто имеют нестандартный код запуска, который пропускает нулевую инициализацию.   -  person Lundin    schedule 17.10.2016
comment
@Dai 'EEAR, EECR, EEDR' зарегистрированы для доступа к EEPROM AVR.   -  person Ravi Sharma    schedule 17.10.2016
comment
@Lundin Я инициализировал epadr следующим образом: static int epadr=0;   -  person Ravi Sharma    schedule 17.10.2016
comment
Ошибка сохраняется, если вы измените ее на static int epadr; epadr=0; ?   -  person Lundin    schedule 17.10.2016
comment
@Lundin Да, это не влияет на вывод. Все еще получаю тот же результат   -  person Ravi Sharma    schedule 17.10.2016
comment
Кстати, вы знаете, что if(epadr<=1023) пишет только по адресу 0, а не от 0 до 1023, да? Нет петли.   -  person Lundin    schedule 17.10.2016
comment
@RaviSharma Можете ли вы опубликовать полную основную функцию?   -  person Anbu.Sankar    schedule 17.10.2016
comment
Если условие проверяет значение epadr, если оно меньше 1023, то оно будет записывать данные в соответствующее место. Можете ли вы объяснить, как он записывает данные в 0 месте?   -  person Ravi Sharma    schedule 17.10.2016
comment
@RaviSharma Вы здесь не упоминаете петлю.   -  person Anbu.Sankar    schedule 17.10.2016
comment
@ Anbu.Sankar Вот полный код a=adc_read(0); _delay_ms(10); a-=81; check=a; if (check>high) { high=check; if(epadr<=1023) { EEPROMWrite(epadr,high); epadr++; } } if(epadr>1023) drawString("Mem Full",10,250,2,BLACK);   -  person Ravi Sharma    schedule 17.10.2016
comment
@ Anbu.Sankar, но я увеличиваю значение epadr после каждой записи   -  person Ravi Sharma    schedule 17.10.2016
comment
Не изобретайте велосипед. Найдите ‹avr/eeprom.h›   -  person Secto Kia    schedule 17.10.2016


Ответы (2)


Нет необходимости определять собственную функцию для чтения и записи данных во внутреннюю EEPROM. AVR предоставляет библиотеку для этой цели. Вот пример кода: -

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>

int main(void)
{
    char read[5];

    eeprom_write_byte (0, '0');
    eeprom_write_byte (1, '1');
    eeprom_write_byte (2, '2');
    eeprom_write_byte (3, '3');
    eeprom_write_byte (4, '4');

    for (int count=0;count<5;count++)
    {
        read[count]=eeprom_read_byte((const uint8_t *)(count));
    }

    while (1); 

}
person tabish    schedule 17.10.2016

Вы не ждете завершения чтения перед чтением EEDR. Нет никакой гарантии, что значение будет готово для чтения, когда вы его прочитаете. Вам нужно добавить задержку около 1 мс после установки EERE и перед чтением EEDR.

См. запись в разделе Процедура чтения/записи EEPROM для получения дополнительной информации.

person David Schwartz    schedule 17.10.2016