|
EEPROM, Оптимальная запись/чтение EEPROM |
|
|
|
Mar 2 2006, 18:07
|
Группа: Новичок
Сообщений: 12
Регистрация: 20-10-05
Пользователь №: 9 894

|
Товарищи,  ! Такая проблемка: при записи в EEPROM на ATMEGE 8515 записывается только первый байт, остальные остаются прежними. Код функции... ..... void RTEEPROMwrite(int location, unsigned char databyte) { unsigned char savedSREG; EEAR = location; // set address EEDR = databyte; // set data savedSREG = SREG; // keep setting so it can be restored while(EECR & (1<<EEWE)); CLI(); // disable interrupts EECR |= BIT(EEMWE);// set "write enable" bit EECR |= BIT(EEWE); // set "write" bit SREG = savedSREG; // restore SREG } В чем может быть проблема? И еще вопросик... Bit EERIE: EEPROM Ready Interrupt Enable - бит отвечающий за прерывание, как им пользоваться и как сделать чтение/запись EEPROM по прерыванию? А то эти пустые циклы как-то не хорошо.
|
|
|
|
|
 |
Ответов
|
Mar 2 2006, 18:42
|
Группа: Новичок
Сообщений: 12
Регистрация: 20-10-05
Пользователь №: 9 894

|
Я правильно понял у вас сначала записываются адрес, данные потом EEMWE = 1 и EEWE=1. Дальше ждем пока EEWE не станет равным 0. Далее очищаем EEMWE и т.д. А может кто знает как можно обойтись без пустого цикла ожидания EEWE? Например сделать на прерывании? Интересно то, что мой кусок программу записи в еепром в симуляторе AVR Studio 4 работает нормально, а вот на реальном железе нет!
Сообщение отредактировал Дим - Mar 2 2006, 18:49
|
|
|
|
|
Mar 2 2006, 19:45
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Дим @ Mar 2 2006, 20:42)  Я правильно понял у вас сначала записываются адрес, данные потом EEMWE = 1 и EEWE=1. Дальше ждем пока EEWE не станет равным 0. Далее очищаем EEMWE и т.д. А может кто знает как можно обойтись без пустого цикла ожидания EEWE? Например сделать на прерывании? Правильно поняли, только вначале идет CLI. Можно сделать и по прерыванию, только тогда очередь надо будет организовывать. Вас что смущает ожидание в пару мкс для завершения записи? Цитата(prottoss @ Mar 2 2006, 20:49)  Даташиты совсем не читаете, товарисч :-) Похоже что он читал, только код в даташите во первых с ошибкой, а во вторых несколько своеобразен и не пригоден для корректной работы в обработчике прерывания и вне обработчика прерывания.
Сообщение отредактировал defunct - Mar 2 2006, 19:48
|
|
|
|
|
Mar 2 2006, 20:17
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(prottoss @ Mar 2 2006, 22:01)  "Это что же, во все даташитах от АТМЕЛА на АВРки? Объяните, где ошибка в коде? Да практически во всех... Ошибка в том, что в приведенных функциях не запрещаются прерывания. Из даташита алгоритм записи EEPROM: Цитата 1. Wait until EEWE becomes zero. 2. Wait until SPMEN in SPMCR becomes zero. 3. Write new EEPROM address to EEAR (optional). 4. Write new EEPROM data to EEDR (optional). 5. Write a logical one to the EEMWE bit while writing a zero to EEWE in EECR. 6. Within four clock cycles after setting EEMWE, write a logical one to EEWE.
Caution: An interrupt between step 5 and step 6 will make the write cycle fail, since the EEPROM Master Write Enable will time-out. If an interrupt routine accessing the EEPROM is interrupting another EEPROM Access, the EEAR or EEDR reGister will be modified, causing the interrupted EEPROM Access to fail. It is recommended to have the Global Interrupt Flag cleared during all the steps to avoid these problems. И тем не менее далее в своих примерах игнорируются собственные рекомендации, что приводит к неправильной работе описанных функций.
|
|
|
|
|
Mar 2 2006, 20:35
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(defunct @ Mar 3 2006, 03:17)  Цитата(prottoss @ Mar 2 2006, 22:01)  "Это что же, во все даташитах от АТМЕЛА на АВРки? Объяните, где ошибка в коде?
Да практически во всех... Ошибка в том, что в приведенных функциях не запрещаются прерывания. Из даташита алгоритм записи EEPROM: Цитата 1. Wait until EEWE becomes zero. 2. Wait until SPMEN in SPMCR becomes zero. 3. Write new EEPROM address to EEAR (optional). 4. Write new EEPROM data to EEDR (optional). 5. Write a logical one to the EEMWE bit while writing a zero to EEWE in EECR. 6. Within four clock cycles after setting EEMWE, write a logical one to EEWE.
Caution: An interrupt between step 5 and step 6 will make the write cycle fail, since the EEPROM Master Write Enable will time-out. If an interrupt routine accessing the EEPROM is interrupting another EEPROM Access, the EEAR or EEDR reGister will be modified, causing the interrupted EEPROM Access to fail. It is recommended to have the Global Interrupt Flag cleared during all the steps to avoid these problems. И тем не менее далее в своих примерах игнорируются собственные рекомендации, что приводит к неправильной работе описанных функций. А Вы хитрый. ОШИБКЕ ТО В КОДЕ НЕТ, а запрещать прерывания или нет, должен думать сам программист. Если в прерываниях нет обращений к ЕЕПРОМ, то и запрещать прерывания нет смысла. Или если обращения к ЕЕПРОМ ТОЛЬКО В ОДНОМ прерывании опять же нет смысла запрещать остальные прерывания. СМЫСЛ ЕСТЬ только в том случае, если несколько потоков могут читать/писать в/из ЕЕПРОМ. Так что НЕ ПУТАЙТЕ публику, код совершенно рабочий. В вышеприведенном англицком тексте об этом и написанно. Вот Вам вольный перевод: Предостережение: прерывание между шагом 5 и шагом 6 вызовет сбой цикла записи если програма прерывания будет изменять значения EEAR или EEDR. Рекомендуется очищать глобальный флаг прерывания перед исполнением всех шагов во избежание проблем. А если прерывния использует системный клок, как же нам тогда к ЕЕПРОМу то обращаться. Мы запретим прерывание, и клок собъется, мы на работу опазлаем...Однако... :-)))
Сообщение отредактировал prottoss - Mar 2 2006, 20:38
--------------------
|
|
|
|
Сообщений в этой теме
Дим EEPROM Mar 2 2006, 18:07 defunct У вас ошибка в коде в части с CLI().. вот рабочий ... Mar 2 2006, 18:17     defunct Цитата(prottoss @ Mar 2 2006, 22:35) А Вы... Mar 2 2006, 20:57      prottoss Цитата(defunct @ Mar 3 2006, 03:57) Цитат... Mar 2 2006, 21:51       defunct Цитата(prottoss @ Mar 2 2006, 23:51) А не... Mar 2 2006, 23:44 prottoss Цитата(Дим @ Mar 3 2006, 01:07) Товарищи,... Mar 2 2006, 18:49 beer_warrior Господа, а никто не делал библиотечки EEPROM полно... Mar 2 2006, 20:30 beer_warrior Цитатаwill make the write cycle fail, since the
EE... Mar 2 2006, 21:02 defunct Вот что у меня получилось с прерываниями.. Выигрыш... Mar 3 2006, 01:23 vet Цитата(defunct @ Mar 3 2006, 04:23) Вот ч... Mar 3 2006, 06:22  defunct Цитата(vet @ Mar 3 2006, 08:22) Цифра ... Mar 3 2006, 09:03 Георгий А если не заморачиваться и положиться на компилято... Mar 3 2006, 05:32 ArtemK По поводу буферизированной записи в EEPROM по прер... Mar 3 2006, 09:25 defunct Цитата(ArtemK @ Mar 3 2006, 11:25) По пов... Mar 3 2006, 09:38
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|