|
|
  |
Запись на EEPROM |
|
|
|
Aug 29 2008, 10:52
|
Частый гость
 
Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801

|
Цитата(zhevak @ Aug 29 2008, 14:45)  Нет, нет. Я сразу же определил время записи. На Меге48 оно было 3.54-3.58 мс А!!! Понятно... С мегами48 не работал... А в других мегах по 8,5 мСек.. Вот и усомнился
|
|
|
|
|
Aug 29 2008, 10:59
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(defunct @ Aug 29 2008, 16:50)  может быть и везет. А может что-то не так с тестом.
Атача нет.. 1. Да, было бы не плохо, что бы еще кто-нибудь помучал (-ся) с проблемой убийства ЕЕПРОМ. 2. Что-то не получилось подключить файлик.  дублитрую
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Aug 29 2008, 11:09
|

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

|
Цитата(zhevak @ Aug 29 2008, 13:59)  2. Что-то не получилось подключить файлик.  дублитрую eeprom unsigned char sacrifice; поменяйте: volatile eeprom unsigned char sacrifice; мало ли какие причуды CV оптимизатора, без volatile он вправе брать значение из регистра.
|
|
|
|
|
Aug 29 2008, 11:31
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(defunct @ Aug 29 2008, 17:09)  eeprom unsigned char sacrifice; поменяйте: volatile eeprom unsigned char sacrifice; мало ли какие причуды CV оптимизатора, без volatile он вправе брать значение из регистра. Да вроде бы все путем. Вот ассемблерный код: Код ; 148 unsigned char TestEE(unsigned char n) ; 149 { _TestEE: ; 150 sacrifice = n; ; n -> Y+0 LD R30,Y LDI R26,LOW(_sacrifice) LDI R27,HIGH(_sacrifice) RCALL __EEPROMWRB ; 151 а вызов __EEPROMWRB выглядит так: Код __EEPROMWRB: SBIC EECR,EEWE RJMP __EEPROMWRB IN R25,SREG CLI OUT EEARL,R26 SBI EECR,EERE IN R24,EEDR CP R30,R24 BREQ __EEPROMWRB0 OUT EEDR,R30 SBI EECR,EEMWE SBI EECR,EEWE __EEPROMWRB0: OUT SREG,R25 RET Да и просмотр с помощью программатора ЕЕПРОМ-овского байта (по адресу 00) говорит о том, что запись идет.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Aug 29 2008, 11:42
|

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

|
Цитата(zhevak @ Aug 29 2008, 14:31)  Да и просмотр с помощью программатора ЕЕПРОМ-овского байта (по адресу 00) говорит о том, что запись идет. К записи претензий нет. Я высказал только недоверие по отношению к чтению. sacrifice = n; return (sacrifice == n); <--- вот этот код может быть выброшен оптимизатором. и функция будет возвращать всегда TRUE
|
|
|
|
|
Aug 29 2008, 11:56
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(defunct @ Aug 29 2008, 17:42)  К записи претензий нет. Я высказал только недоверие по отношению к чтению.
sacrifice = n; return (sacrifice == n); <--- вот этот код может быть выброшен оптимизатором.
и функция будет возвращать всегда TRUE Ага. Спасибо! Я на это дело тоже обратил внимание. В самом начале, в самой первой версии, я вообще чтение (и сравнение) и запись в ЕЕПРОМ разнес в разные функции (разные вызовы). Тоже боялся, что компайлер заоптимизирует. Но когда посмотрел, что он дает на выходе, то решил сделать так, как это сейчас есть. А по проге, в целом, -- не проблема! Я для того и выложил ее код, чтобы было от чего отталкиваться. Цель -- хотелось бы оценить границы хотя бы примерно. А то живем и знать не знаем, где "земля заканчивается и начинается небо".
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Aug 29 2008, 12:08
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Цитата(zhevak @ Aug 29 2008, 15:31)  Да вроде бы все путем. Вот ассемблерный код: Интересно, однако Код ; _TestEE: LD R30,Y ; байт в R30 LDI R26,LOW(_sacrifice) LDI R27,HIGH(_sacrifice) ; адрес в R27:R26 RCALL __EEPROMWRB
__EEPROMWRB: SBIC EECR,EEWE RJMP __EEPROMWRB ; подождать пока закончится прошлая запись IN R25,SREG CLI OUT EEARL,R26 ; адрес из R26, r27 не пригодился :) SBI EECR,EERE IN R24,EEDR ; почитали CP R30,R24 BREQ __EEPROMWRB0 ; ВЫЙТИ БЕЗ ЗАПИСИ, если записываем то же самое, что было OUT EEDR,R30 SBI EECR,EEMWE SBI EECR,EEWE ; если не то же самое, то записать __EEPROMWRB0: OUT SREG,R25 RET Получается, что если писать одно и то же то даже и никак не узнаешь, что запись реально не происходит! Вот так компилятор заботится об EEPROM'e. Я вижу, что в сишной программе пишутся разные значения! Но является ли ЗАПИСЬЮ в полном смысле операция записи нулевого бита поверх нулевого и так же единицы поверх единицы? получается, что за цикл 00..255 младший бит перезапишется 255 раз, а старший - всего 2! Или байт портится целиком?
|
|
|
|
|
Aug 29 2008, 12:15
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата К записи претензий нет. Я высказал только недоверие по отношению к чтению. вот кусок отассемблированного кода по чтению: Код ; 152 return (sacrifice == n); LDI R26,LOW(_sacrifice) LDI R27,HIGH(_sacrifice) RCALL __EEPROMRDB LD R26,Y RCALL __EQB12 RJMP _0x78 ; 153 } ; 154 оптимизации нет, на что указывает вызов __EEPROMRDB. Цитата(Maik-vs @ Aug 29 2008, 18:08)  операция записи нулевого бита поверх нулевого и так же единицы поверх единицы? получается, что за цикл 00..255 младший бит перезапишется 255 раз, а старший - всего 2! Или байт портится целиком? Я записываю только младший байт.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Aug 29 2008, 12:51
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Цитата(zhevak @ Aug 29 2008, 16:15)  Я записываю только младший байт. При чём байт? Я говорил про бит. Когда испортилось, что Вы читаете? КАК портится ячейка памяти?
|
|
|
|
|
Aug 29 2008, 13:08
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(Maik-vs @ Aug 29 2008, 18:51)  При чём байт? Я говорил про бит. Когда испортилось, что Вы читаете? КАК портится ячейка памяти? Извините, это я как-то не сразу и понял, о чем Вы говорили. Ну вообще-то да, наверно что-то есть в том, что нужно "передергивать" все биты в байте равномерно. Ведь, прежде чем записать новое значение в ячейку памяти (байт), автомат записи сначала ее стирает (0хFF). Под действие электрического импульса стирания попадают все биты, вне зависимости от их состояния. А вот под воздействие записи попадают только нулевые биты. Если это так, то тогда теоретически получается, что младший бит "изнашивается" быстрее, чем старший. А как оно практически получается -- х.з. Вот, типа мы все тут пытаемся установить. Попробуйте переделать прогу, может у Вас быстрее получится убить мегу.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Aug 29 2008, 13:19
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Цитата(zhevak @ Aug 29 2008, 17:08)  Ведь, прежде чем записать новое значение в ячейку памяти (байт), автомат записи сначала ее стирает (0хFF). Под действие электрического импульса стирания попадают все биты, вне зависимости от их состояния. А вот под воздействие записи попадают только нулевые биты. Если это так, то тогда теоретически получается, что младший бит "изнашивается" быстрее, чем старший. А как оно практически получается -- х.з. Вот, типа мы все тут пытаемся установить. Если он сначала стирает, то вообще нужно писать нули постоянно. Естественно, обойдя чтение-сравнение. Например писать 0-1-0-1... Никто почему-то не пишет, что происходит с битами, а может быть это и есть источник разницы в тестах? Цитата(zhevak @ Aug 29 2008, 17:08)  Попробуйте переделать прогу, может у Вас быстрее получится убить мегу. "Нет уж, лучше Вы к нам!" (с) мои меги запаяны, в маленьких корпусах, как бы убивать из интереса дороговато будет, в смысле перепайки и прочего.
|
|
|
|
|
Aug 29 2008, 15:02
|
Частый гость
 
Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801

|
Цитата(Боинг749 @ Aug 27 2008, 10:49)  Уговорили.. Пойду тоже запущу тест... Не.. всё же не буду.. Есть всего 3 девайса на руках... И каждый из них нужен... Если угроблю хотя бы один - нЕначем будет отлаживаться..
Подождём .. Мож ещё кто тест EEPROM погоняет и скажет о результатах... Кому не жалко изничтожить для таких целей проц... И будем набирать статистику.. А то пока только всего один участник заявил, что износостойкойсть EEPROM только чуть-чуть больше заявленных в даташите, и один заявил, что износостойкость EEPROM на порядок превышает те "100000 записей", о которых говорится в даташите Я всё же решился  Пожертвовать ячейкой EEPROM с адресом 0 в одном из своих девайсов и решил провести тест до её убийства. Тест запустил в 18-40 по московскому времени.. Темп записи примерно 7000 записей в минуту или 420000 записей в час. После каждых 256-ти записей (примерно раз в 2 сек) у меня моргает светодиод. Посмотрим когда он остановится. Если верить даташиту он должен был прекратить моргать в 18-54.. Сейчас 18-54.. Ещё пока моргает  P.S. Прога написана на АСМ-е.. Так что никаких глюков оптимизатора  Цитата(zhevak @ Aug 29 2008, 17:08)  Ведь, прежде чем записать новое значение в ячейку памяти (байт), автомат записи сначала ее стирает (0хFF). Под действие электрического импульса стирания попадают все биты, вне зависимости от их состояния. А вот под воздействие записи попадают только нулевые биты. Если это так, то тогда теоретически получается, что младший бит "изнашивается" быстрее, чем старший. Логично. Полностью с Вами согласен
Сообщение отредактировал Боинг749 - Aug 29 2008, 15:01
|
|
|
|
|
Aug 29 2008, 16:51
|
Частый гость
 
Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801

|
Прервал тест, чтобы доработать прогу тестирования в плане сохранения ожидавшегося значения. Т.е. я пишу в EEPROM по адресу 0 содержимое счётчика R25, а затем считываю содержимое ячейки 0 в R24. Так вот, раньше у меня не было предусмотрено сохранение R25 в случае обнаружения ошибки записи. Теперь же в случае ошибки я записываю R25, на котором остановился тест, в 7-ю ячейку EEPROM. Расскажу вкратце как я тестирую. У меня есть малый цикл, когда R25 меняется от0 до 255. И большой когда инкрементируется 16-ти разрядный счётчик больших циклов. После того, как R25 "пробежит" от о до 255 я инкрементирую счётчик больших циклов. Этот 3 копии счётчика больших циклов храню в EEPROM. Раньше R25, на котором "споткнулся" тест, я не сохранял. Но после слов одного из участников, что при таком тесте более вероятно что первым "накроется медным тазом" самый младший бит, решил проверить эту теорию. Для чего переделал прогу и ПЕРЕзапустил тест. Да, фусе-бит EESAVE, чтобы содержимое EEPROM не терялось при перепрошивке программы, у меня уже был запрограммирован ранее. Далее, тест рестартует только после выключения/включения питания. Для чего в программе анализирую бит PORF. И так.. Глянул сейчас на счётчик больших циклов. Он равен $096A. Значит было произведено $096A х 256 = 616000 записей... И полёт пока нормальный.. Светодиод по-прежнему мигает каждые 2 сек. (написал это где-то час назад... Светодиод пока мигает  Ну не хочет никак убивацц ячейка )
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|