Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > проблема с eeprom в atmega8535


Автор: martyr 16.11.2005, 10:48
проблема такая, что при записи или при чтении в 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; 

} 



void write_byte_to_eeprom(uint16_t eeprom_address,uint8_t byte_eeprom) 
{ 

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; 
EECR = 0x02; 

asm("sei"); 
} 

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; 
EECR =0x01; 

byte_eeprom = EEDR; 

asm("sei"); 

return byte_eeprom; 

}

Автор: cardinal 16.11.2005, 10:51
Используйте теги [c ode=vb][/code] для подсветки кода!

Автор: PILOT 16.11.2005, 15:22
Вопроса не понял... smile

СУВ.

Автор: martyr 16.11.2005, 16:17
ну вообщем если я записываю значение 255, то eeprom мне выдаёт 255, а если я записываю 300, то eeprom выдаёт 44, т.е. считывает малдшую часть, а старшую нет. Вот :
1 я не знаю что он не правильно делает: записывает или читает
2. прога вроде нормально написано, не знаю где может быть косяк, я хотел, чтобы кто-нибудь взглянул на кусок проги свежим взглядом и посмотерл если бак в этом куске проги

Автор: cardinal 16.11.2005, 16:32
martyr, извини я конечно протормозил. На форуме есть и c/c++ теги, так что можешь подредактировать...

uint16_t read_byte_from_eeprom (uint16_t eeprom_address)

Автор: martyr 16.11.2005, 16:41
cardinal не помогает и почему uint16_t, если мы возвращает byte_eeprom а он у нас 8 бит?

Автор: cardinal 16.11.2005, 16:59
в коде должно стоять так: code=cpp

А насчет byte ты прав. Ну так ты тогда тогда и будешь имеет максимальное значение в 255. Если хочешь больше, то и записывай на соседние адреса в eeprom несколько байт. Потом также несколько байт и читать надо будет...

Автор: martyr 16.11.2005, 17:06
cardinal, почему максимум 255, пояни момент плиз подробнее как больше получить

Автор: cardinal 16.11.2005, 17:27
что такое байт:
http://www.google.ru/search?hl=de&lr=&oi=defmore&defl=ru&q=define:%D0%91%D0%B0%D0%B9%D1%82

Автор: martyr 16.11.2005, 17:29
я это понимаю, как мне сделать больше 255? я ведь как раз для этого при записи вызываю 2 раза функцию
write_byte_to_eeprom (eeprom_address, byte_eeprom);

Автор: cardinal 16.11.2005, 19:39
Код

write_byte_to_eeprom (0x2e, 0x3f2e1a6e); // старший байт
write_byte_to_eeprom (0x3f, 0x3f2e1a6f);  // младший байт 

или наоборот
Код

write_byte_to_eeprom (0x3f, 0x3f2e1a6e); // младший байт 
write_byte_to_eeprom (0x2e, 0x3f2e1a6f);  // старший байт

, смотря какой порядок в памяти хочешь иметь...

В результате (когда прочитаешь и слепишь в одно) получишь число 0x2e3f, то есть 11839.

Автор: martyr 16.11.2005, 20:40
так я так и делаю
Код
eeprom_address =(uint16_t) Device.CurrentPreset * 2; 
byte_eeprom = (uint8_t) Device.AzimuthToPreset ; 
write_byte_to_eeprom (eeprom_address, byte_eeprom); 

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

или так нельзя писать?

Автор: cardinal 17.11.2005, 00:15
Цитата(martyr @ 16.11.2005, 18:40)
или так нельзя писать?

Посмотри на содержание byte_eeprom на строке 3 и потом на строке 7 и поймешь можно или нет.
printf у тебя работает вообще для отдладки? Если нет, то сделай, чтобы работало. smile Или как-нибудь там с диодиками что-нибудь придумай.

Автор: martyr 17.11.2005, 11:06
printf не получится, я ведь не в консоле работаю, у меня есть окошко, кот-ой показывает обмен данными по инетерфейсу

Автор: martyr 17.11.2005, 11:51
ошибка нашлась, мне на работе дали новый комп, винда сама ставилась, по дефолту поставился год 2014, а заметил что 2014 год вчера, поставил 2005, и сегодня заметил, что у меня файл прошивки старый, компилятор не мог его создать писал, что старый файл прошивки 2014 года, а новый типа 2005, и компилятор мне говорил, что такого не может быть.
Вообщем как я это заметил долго матюгался,т.к. целый день искал ошибку :-(.
Теперь всё ок. :-)))))))))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)