реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 5 >  
Reply to this topicStart new topic
> Запись на EEPROM
defunct
сообщение Aug 29 2008, 10:50
Сообщение #31


кекс
******

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



Цитата(zhevak @ Aug 29 2008, 12:31) *
Ничего не понимаю... Может это мне так везет. 05.gif

может быть и везет. А может что-то не так с тестом.

Цитата
Код написан CV (исходник "приартачен"). Код проги не является примером, для подражания или обучения.
Атача нет..
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 29 2008, 10:52
Сообщение #32


Частый гость
**

Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801



Цитата(zhevak @ Aug 29 2008, 14:45) *
Нет, нет. Я сразу же определил время записи. На Меге48 оно было 3.54-3.58 мс

А!!! Понятно... С мегами48 не работал... А в других мегах по 8,5 мСек.. Вот и усомнился wassat.gif
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 29 2008, 10:59
Сообщение #33


Знающий
****

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



Цитата(defunct @ Aug 29 2008, 16:50) *
может быть и везет. А может что-то не так с тестом.

Атача нет..


1. Да, было бы не плохо, что бы еще кто-нибудь помучал (-ся) с проблемой убийства ЕЕПРОМ.
2. Что-то не получилось подключить файлик. sad.gif дублитрую
Прикрепленные файлы
Прикрепленный файл  eekiller.rar ( 1.55 килобайт ) Кол-во скачиваний: 50
 


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 29 2008, 11:09
Сообщение #34


кекс
******

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



Цитата(zhevak @ Aug 29 2008, 13:59) *
2. Что-то не получилось подключить файлик. sad.gif дублитрую

eeprom unsigned char sacrifice;
поменяйте:
volatile eeprom unsigned char sacrifice;
мало ли какие причуды CV оптимизатора, без volatile он вправе брать значение из регистра.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 29 2008, 11:31
Сообщение #35


Знающий
****

Группа: Свой
Сообщений: 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) говорит о том, что запись идет.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 29 2008, 11:42
Сообщение #36


кекс
******

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



Цитата(zhevak @ Aug 29 2008, 14:31) *
Да и просмотр с помощью программатора ЕЕПРОМ-овского байта (по адресу 00) говорит о том, что запись идет.

К записи претензий нет. Я высказал только недоверие по отношению к чтению.

sacrifice = n;
return (sacrifice == n); <--- вот этот код может быть выброшен оптимизатором.

и функция будет возвращать всегда TRUE
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 29 2008, 11:56
Сообщение #37


Знающий
****

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



Цитата(defunct @ Aug 29 2008, 17:42) *
К записи претензий нет. Я высказал только недоверие по отношению к чтению.

sacrifice = n;
return (sacrifice == n); <--- вот этот код может быть выброшен оптимизатором.

и функция будет возвращать всегда TRUE

Ага. Спасибо! Я на это дело тоже обратил внимание. В самом начале, в самой первой версии, я вообще чтение (и сравнение) и запись в ЕЕПРОМ разнес в разные функции (разные вызовы). Тоже боялся, что компайлер заоптимизирует. Но когда посмотрел, что он дает на выходе, то решил сделать так, как это сейчас есть.

А по проге, в целом, -- не проблема! Я для того и выложил ее код, чтобы было от чего отталкиваться. Цель -- хотелось бы оценить границы хотя бы примерно. А то живем и знать не знаем, где "земля заканчивается и начинается небо".


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Aug 29 2008, 12:08
Сообщение #38


Местный
***

Группа: Участник
Сообщений: 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! Или байт портится целиком?
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 29 2008, 12:15
Сообщение #39


Знающий
****

Группа: Свой
Сообщений: 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! Или байт портится целиком?


Я записываю только младший байт.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Aug 29 2008, 12:51
Сообщение #40


Местный
***

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



Цитата(zhevak @ Aug 29 2008, 16:15) *
Я записываю только младший байт.


При чём байт? Я говорил про бит. Когда испортилось, что Вы читаете? КАК портится ячейка памяти?
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 29 2008, 13:08
Сообщение #41


Знающий
****

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



Цитата(Maik-vs @ Aug 29 2008, 18:51) *
При чём байт? Я говорил про бит. Когда испортилось, что Вы читаете? КАК портится ячейка памяти?

Извините, это я как-то не сразу и понял, о чем Вы говорили. Ну вообще-то да, наверно что-то есть в том, что нужно "передергивать" все биты в байте равномерно.

Ведь, прежде чем записать новое значение в ячейку памяти (байт), автомат записи сначала ее стирает (0хFF). Под действие электрического импульса стирания попадают все биты, вне зависимости от их состояния. А вот под воздействие записи попадают только нулевые биты. Если это так, то тогда теоретически получается, что младший бит "изнашивается" быстрее, чем старший. А как оно практически получается -- х.з. Вот, типа мы все тут пытаемся установить.

Попробуйте переделать прогу, может у Вас быстрее получится убить мегу.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Aug 29 2008, 13:19
Сообщение #42


Местный
***

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



Цитата(zhevak @ Aug 29 2008, 17:08) *
Ведь, прежде чем записать новое значение в ячейку памяти (байт), автомат записи сначала ее стирает (0хFF). Под действие электрического импульса стирания попадают все биты, вне зависимости от их состояния. А вот под воздействие записи попадают только нулевые биты. Если это так, то тогда теоретически получается, что младший бит "изнашивается" быстрее, чем старший. А как оно практически получается -- х.з. Вот, типа мы все тут пытаемся установить.

Если он сначала стирает, то вообще нужно писать нули постоянно. Естественно, обойдя чтение-сравнение.
Например писать 0-1-0-1... Никто почему-то не пишет, что происходит с битами, а может быть это и есть источник разницы в тестах?

Цитата(zhevak @ Aug 29 2008, 17:08) *
Попробуйте переделать прогу, может у Вас быстрее получится убить мегу.

"Нет уж, лучше Вы к нам!" (с) мои меги запаяны, в маленьких корпусах, как бы убивать из интереса дороговато будет, в смысле перепайки и прочего.
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 29 2008, 15:02
Сообщение #43


Частый гость
**

Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801



Цитата(Боинг749 @ Aug 27 2008, 10:49) *
Уговорили.. Пойду тоже запущу тест... Не.. всё же не буду.. Есть всего 3 девайса на руках... И каждый из них нужен... Если угроблю хотя бы один - нЕначем будет отлаживаться..

Подождём .. Мож ещё кто тест EEPROM погоняет и скажет о результатах... Кому не жалко изничтожить для таких целей проц... И будем набирать статистику.. А то пока только всего один участник заявил, что износостойкойсть EEPROM только чуть-чуть больше заявленных в даташите, и один заявил, что износостойкость EEPROM на порядок превышает те "100000 записей", о которых говорится в даташите

Я всё же решился lol.gif Пожертвовать ячейкой EEPROM с адресом 0 в одном из своих девайсов и решил провести тест до её убийства.

Тест запустил в 18-40 по московскому времени.. Темп записи примерно 7000 записей в минуту или 420000 записей в час. После каждых 256-ти записей (примерно раз в 2 сек) у меня моргает светодиод. Посмотрим когда он остановится. Если верить даташиту он должен был прекратить моргать в 18-54.. Сейчас 18-54.. Ещё пока моргает biggrin.gif

P.S. Прога написана на АСМ-е.. Так что никаких глюков оптимизатора lol.gif

Цитата(zhevak @ Aug 29 2008, 17:08) *
Ведь, прежде чем записать новое значение в ячейку памяти (байт), автомат записи сначала ее стирает (0хFF). Под действие электрического импульса стирания попадают все биты, вне зависимости от их состояния. А вот под воздействие записи попадают только нулевые биты. Если это так, то тогда теоретически получается, что младший бит "изнашивается" быстрее, чем старший.

Логично. Полностью с Вами согласен

Сообщение отредактировал Боинг749 - Aug 29 2008, 15:01
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Aug 29 2008, 15:08
Сообщение #44


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Насчет более быстрого изнашивания младшего бита - defunct в 25 посте привел результаты своего теста, так там отличаются записанный и прочитанный байт вовсе не младшим разрядом. Например 7F <-> 77.
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 29 2008, 16:51
Сообщение #45


Частый гость
**

Группа: Новичок
Сообщений: 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 сек.

(написал это где-то час назад... Светодиод пока мигает lol.gif Ну не хочет никак убивацц ячейка )
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 5 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 10:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01506 секунд с 7
ELECTRONIX ©2004-2016