|
Вопрос по работе с EEPROM в WinAVR, срочно нужна помощь |
|
|
|
May 25 2007, 07:09
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 22-12-06
Пользователь №: 23 780

|
Здравствуйте! Прошу помочь. Нужны функции записи и чтения из/в EEPROM AT90CAN128. Беру примеры из Даташита и компилирую WinAVR, не работают. Преверяю в AVRStudio - не работают. Вот эти функции из Даташита:
/********************************* * * ЗАПИСЬ БАЙТА В int-EEPROM * *********************************/ void RTEEPROMwrite (u16 adrEEPROM, u08 databyte) { u08 savedSREG; while(EECR & (1<<EEWE)); savedSREG = SREG // keep setting so it can be restored SREG &= ~0x80; EEAR = adrEEPROM; // set address EEDR = databyte; // set data EECR |= (1<<EEMWE); // set "write enable" bit EECR |= (1<<EEWE); // set "write" bit SREG = savedSREG; // restore SREG EEAR = 0;
} // end of RTEEPROMwrite
/********************************** * * ЧТЕНИЕ БАЙТА ИЗ int-EEPROM * **********************************/ u08 RTEEPROMread (u16 adrEEPROM) { while(EECR & (1<<EEWE)); EEAR = adrEEPROM; // set address EECR |= (1<<EERE); // set "read enable" bit EEAR = 0; return (EEDR);
} // end of RTEEPROMread
Хотел использовать функции из библиотеки:
uint8_t eeprom_read_byte (const uint8_t *addr);
void eeprom_write_byte (uint8_t *addr,uint8_t value);
Но не понятно как описать и работать с указателями на ячейки в EEPROM.
|
|
|
|
|
 |
Ответов
|
May 25 2007, 09:56
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 22-12-06
Пользователь №: 23 780

|
С EEAR = 0 это опечатка. Компилирую с уровнем оптимизации 0. Что такое фюз М103С я не знаю (я только недавно начал работать с WinAVR, так что прошу отнестисть с пониманием), но такого слова в makefile нет. Хотелось бы по подробнее узнать по приведению типа u16 к типу const uint8_t*. Если можно поясните на примере. Приведенный пример попробывал, не работает да он практически не отличается Даташитовского. Может необходима какая-то запись в makefile или .h файлы.
|
|
|
|
|
May 25 2007, 10:12
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(AlexPT @ May 25 2007, 13:56)  С EEAR = 0 это опечатка. Компилирую с уровнем оптимизации 0. Что такое фюз М103С я не знаю Про М103С извините ошибся, подумал что речь идет о ATmega128. Посмотрите код который генериться для строк: EECR |= (1<<EEMWE); EECR |= (1<<EEWE); Не уровне оптимизации -O0: Код EECR |= (1<<EEMWE); 92: 80 91 3c 00 lds r24, 0x003C 96: 84 60 ori r24, 0x04; 4 98: 80 93 3c 00 sts 0x003C, r24 EECR |= (1<<EEWE); 9c: 80 91 3c 00 lds r24, 0x003C a0: 82 60 ori r24, 0x02; 2 a2: 80 93 3c 00 sts 0x003C, r24 И на -O1: Код EECR |= (1<<EEMWE); 8e: e2 9a sbi 0x1c, 2; 28 EECR |= (1<<EEWE); 90: e1 9a sbi 0x1c, 1; 28 В первом случае не соблюдается условие установки бита EEWE не позже 4 циклов после установки EEMWE. Не используйте уровень оптимизации -O0, он нужен в очень редких случаях для отладки. Используйте библиотечные функции, как с ними работать описано в avr-libc-user-manual в директори WinAVR/doc/avr-libc. Анатолий.
Сообщение отредактировал aesok - May 25 2007, 10:16
|
|
|
|
|
Sep 30 2010, 06:40
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(aesok @ May 25 2007, 14:12)  Посмотрите код который генериться для строк: EECR |= (1<<EEMWE); EECR |= (1<<EEWE);
Не уровне оптимизации -O0: -O0 это полное отсутствие оптимизации, компилировать программу без нее глупо. Обычно это импользуется тогда, когда вы подозреваете оптимизатор в глючности, тогда отключив оптимизацию можно убедиться, что проблема в самой программе. Обычно для боевой программы используется уровень -Os Цитата(AlexPT @ May 25 2007, 11:09)  savedSREG = SREG // keep setting so it can be restored SREG &= ~0x80; А к чему такие сложности? Не проще ли написать cli(), sei()
|
|
|
|
|
Sep 30 2010, 06:50
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(777777 @ Sep 30 2010, 10:40)  -O0 это полное отсутствие оптимизации, .... Обычно для боевой программы используется уровень -Os Спасибо большое, я об этом уже 3 года как не знаю, побегу сейчас на рабору перекомпилирую проект, может заработаент!!! Цитата(777777 @ Sep 30 2010, 10:40)  А к чему такие сложности? Не проще ли написать cli(), sei() Такие сложности нужны для того, чтобы функция EEPROM_write делала только то что от нее требуется - записывала байт в EEPROM, и не делела то чего не должна, тоесть чтобы она не разрешала прерывания. Анатолий.
|
|
|
|
|
Sep 30 2010, 07:05
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(aesok @ Sep 30 2010, 10:50)  Такие сложности нужны для того, чтобы функция EEPROM_write делала только то что от нее требуется - записывала байт в EEPROM, и не делела то чего не должна, тоесть чтобы она не разрешала прерывания. Так вот для этого и используются псевдофункции cli() и sei(). А зачем при этом еще и сохранять SREG - для меня загадка  Цитата(aesok @ Sep 30 2010, 10:50)  Спасибо большое, я об этом уже 3 года как не знаю, побегу сейчас на рабору перекомпилирую проект, может заработаент!!! Ответ не тебе, а топикстартеру, а то что он трехлетней давности - что ж, не заметил...
Сообщение отредактировал 777777 - Sep 30 2010, 07:06
|
|
|
|
Сообщений в этой теме
AlexPT Вопрос по работе с EEPROM в WinAVR May 25 2007, 07:09 Tcom unsigned char EEPROM_read (unsigned int uiAdress)/... May 25 2007, 07:32 IgorKossak Цитата(AlexPT @ May 25 2007, 10:09) Хотел... May 25 2007, 07:38 singlskv Вот это лишнее:
Цитата(AlexPT @ May 25 2007, ... May 25 2007, 07:43 aesok Цитата(AlexPT @ May 25 2007, 11:09) Здрав... May 25 2007, 08:42     aesok Цитата(777777 @ Sep 30 2010, 11:05) Так в... Sep 30 2010, 07:27 AlexPT Большое спасибо за подсказку с оптимизацией. Все з... May 25 2007, 11:02 defunct В WinAVR есть готовые функции для работы с eeprom.... May 25 2007, 13:09 Mikron добрый вечер
решил поднять тему, просто проблема с... Sep 29 2010, 22:10 alexeyv используйте библиотечные функции.
Например, для за... Sep 30 2010, 04:51 Mikron alexeyv, спасибо, но в даташите я не нашел
нужно л... Sep 30 2010, 04:58 ARV Цитата(Mikron @ Sep 30 2010, 08:58) alexe... Sep 30 2010, 05:47 alexeyv Цитата(Mikron @ Sep 30 2010, 10:58) alexe... Sep 30 2010, 07:19
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|