проблемая такая, что при зиписи или при чтении в 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;
}
|