Страница 1 из 1

Atmega 128: не получается считать EEPROM

Добавлено: Пн фев 22, 2010 23:29:19
Christ
Здравствуйте!
Подскажите пожалуйста с такой проблемой
написал функцию для чтения из EEPROM

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

unsigned char EErd (unsigned int addr)
	{
	while(EECR & (1<<EEWE));
        EEAR = addr;
        EECR |= (1<<EERE);
        return EEDR;
}
она работает, но только в диапазоне адресов с 0000 до 00FF а мне необходимо считывать данные с большего количества адресов
в чем может быть проблема?

Добавлено: Пн фев 22, 2010 23:43:23
Sera_232
А если адрес выше FF то что происходит?

Добавлено: Пн фев 22, 2010 23:44:57
Christ
Sera_232 писал(а):А если адрес выше FF то что происходит?
происходит чтение из адреса 0000

проверял в Протеусе и на железе

точнее из адреса 00XX где XX младшие разряды addr

Добавлено: Пн фев 22, 2010 23:58:09
Sera_232
Если Вы пишите на Си, почему би не воспользоваться его возможнностями, например инициализация переменных или массивов в иипром:

eeprom char var;
eeprom char var[16];

Добавлено: Вт фев 23, 2010 00:09:36
Christ
Sera_232 писал(а):Если Вы пишите на Си, почему би не воспользоваться его возможнностями, например инициализация переменных или массивов в иипром:

eeprom char var;
eeprom char var[16];
объем данных около 3 кБ и считывать их надо либо по одному байту либо по несколько с разных адресов в зависимости от режима работы
поэтому целесообразней написать одну функцию чтения и указывать ей адрес
иначе количество переменных просто получается большое

Добавлено: Вт фев 23, 2010 06:56:13
ARV
в составе WinAVR имеется модуль eeprom.h, подключив который вы получаете в свое распоряжение готовые функции для чтения/записи из/в EEPROM одного байта, двух, четырех и произвольного количества, причем при желании о конкретных адресах думать не надо:

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

#include {avr/eeprom.h} // скобки заменить на уголки
// распределение ячеек EEPROM с начальными значениями
eeprom uint8_t byte = 12;
eeprom uint16_t word = 0x1234;
eeprom char str[] = "все очень просто!";
// чтение из EEPROM
uint8_t var = eeprom_read_byte(&byte);
int var2 = eeprom_read_word(&word);

char array[100];
eeprom_read_block(str, array, sizeof(str));
и не надо городить огород с самописными функциями :)

Добавлено: Чт фев 25, 2010 23:43:07
Christ
Чет или я торможу
но после того как подключил библиотеку с апноута 104 результат такой же
до адреса 00FF читаются дальше опять по кругу
не могу понять где ошибка

Re: Atmega 128: не получается считать EEPROM

Добавлено: Вс апр 11, 2010 15:19:12
Christ
Большая просьба закройте тему вопрос решен.

Re: Atmega 128: не получается считать EEPROM

Добавлено: Вт дек 07, 2010 05:27:56
mzspeed
что за люди... хоть бы написал что ли как вопрос решил...
тоже встала такая проблема ((( кто сталкивался, и знает решение?

Re: Atmega 128: не получается считать EEPROM

Добавлено: Вт дек 07, 2010 12:39:23
Christ
Решил проблему очень просто
-- когда писал программу проверял в Proteus ,где соответственно ничего не работало
-- когда собрал на железе всё заработало

вот рабочий код для работы с EEPROM

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


// Запись одного байта(data) в EEPROM адресу addr
    void EEwr (unsigned int addr, unsigned char data)
    {   PORTG|=0x08;

        while (EECR.1 != 0);
        EEAR = addr;
        EEDR = data;
        EECR.2 = 1;
        EECR.1 = 1; 
        PORTG^=0x08;
    }

    // чтение одного байта из EEPROM по адресу addr
   unsigned char EErd (unsigned int addr) 
   {    while(EECR&(1<<EEWE));
        EEAR=addr;
        EECR|=(1<<EERE);
        EEAR|=0x0000;
        return EEDR;
        }   
     
:)