Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблема c eeprom atmega8535
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
martyr
проблемая такая, что при зиписи или при чтении в eeprom он записывает или читает младшую.все переменный и функции объявлены в другом файлею Ввот код программы:

void write_preset(void)
{

if (Device.CurrentPreset < Device.PresetsRange)
{

// Device.AzimuthToPreset - азимут, который надо записать (16 бит)
// Device.CurrentPreset - номер пресета для записи текущего азимута (8 бит)

eeprom_address = Device.CurrentPreset * 2;
byte_eeprom = (uint8_t) Device.AzimuthToPreset ;
write_byte_to_eeprom (eeprom_address, byte_eeprom);

eeprom_address = Device.CurrentPreset * 2 + 1;
byte_eeprom = (uint8_t) (Device.AzimuthToPreset >> 8) ;
write_byte_to_eeprom (eeprom_address, byte_eeprom);


}

else

{

Device.ErrorNumber = 0x11;

}


}



void read_preset(void)
{

if (Device.CurrentPreset < Device.PresetsRange)
{

// Device.AzimuthFromPreset - азимут, который читаем (16 бит)
// Device.CurrentPreset - номер пресета, который читаем (8 бит)

eeprom_address = Device.CurrentPreset * 2;
Device.AzimuthFromPreset = (uint8_t) (read_byte_from_eeprom (eeprom_address));

eeprom_address = Device.CurrentPreset * 2 + 1;
Device.AzimuthFromPreset |= ((uint8_t) (read_byte_from_eeprom(eeprom_address) << 8));

}

else

{

// Device.ErrorNumber = Device.CurrentPreset;
Device.ErrorNumber = 0x11;

}
return Device.AzimuthFromPreset;

}


// ========================================
// служебные функции работы с EEPROM ===
// ========================================



// запись байта в EEPROM

void write_byte_to_eeprom(uint16_t eeprom_address,uint8_t byte_eeprom)
{
// ждём завершения предыдущей записи
// (пока в бите EEWE 1, ничего не делаем)
while (EECR & 0x02);

asm("cli");

/* Set up Address and Data Registers */
/*EEARH = (uint8_t) (eeprom_address >> 8) ; // устанавливаем адрес
EEARL = (uint8_t) (eeprom_address );*/
EEAR = eeprom_address;

EEDR = byte_eeprom; // загружаем


EECR=0x04; // устанавливаем флаг разрешения записи ( в разряд EEMWE ставим 1)
EECR = 0x02; // записываем, для этого в разряд EEWE устанавливаем 1

asm("sei");
}

// чтение байта из EEPROM

uint8_t read_byte_from_eeprom (uint16_t eeprom_address)
{


while (EECR & 0x02); // ждём завершения предыдущей записи

asm("cli");

/*EEARH = (uint8_t) (eeprom_address >> 8); // устанавливаем адрес
EEARL = (uint8_t) eeprom_address ;
*/ EEAR = eeprom_address;


// выполняем чтение, устанавливаем в EERE 1
EECR =0x01;

byte_eeprom = EEDR;

asm("sei");

return byte_eeprom;

}
KRS
попробуйте исправить запись вместо
EECR=0x04; // устанавливаем флаг разрешения записи ( в разряд EEMWE ставим 1)
EECR = 0x02; // записываем, для этого в разряд EEWE устанавливаем 1

Код
    EECR|=1<<EEMWE;
    EECR|=1<<EEWE;
haker_fox
На всякий случай даю функции работы с EEPROM, взяты с application notes или откуда-то еще, но точно "фирменные". Работают 100%, проверено на ATmega8 & ATmega16.

Код
//Записывает байт в EEPROM по указанному адресу
void eeprom_write_byte(unsigned int addr, unsigned char byte)
{
  while(EECR & (1<<EEWE));                            //ждем, если запись не окончена
  EEAR=addr;                                          //указываем адрес
  EEDR=byte;                                          //байт данных
  EECR|=(1<<EEMWE);                                   //разрешаем запись
  EECR|=(1<<EEWE);                                    //строб записи
}

//Читает байт из EEPROM по указанному адресу
unsigned char eeprom_read_byte(unsigned int addr)
{
  while(EECR & (1<<EEWE));                            //ждем, если запись не окончена
  EEAR=addr;                                          //указываем адрес
  EECR|=(1<<EERE);                                    //разрешаем чтение
  return EEDR;                                        //возвращаем считанный байт
}
]
С уважением ко всем!
martyr
ошибка нашлась, мне на работе дали новый комп, винда сама ставилась, по дефолту поставился год 2014, а заметил что 2014 год вчера, поставил 2005, и сегодня заметил, что у меня файл прошивки старый, компилятор не мог его создать писал, что старый файл прошивки 2014 года, а новый типа 2005, и компилятор мне говорил, что такого не может быть.
Вообщем как я это заметил долго матюгался,т.к. целый день искал ошибку :-(.
Теперь всё ок. :-)))))))))))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.