Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » проблема с записью в ЕЕПРОМ 24LC64


проблема с записью в ЕЕПРОМ 24LC64

Сообщений 1 страница 9 из 9

1

Добрый день!
возникла небольшая проблемка с записью данных в EEPROM 24LC64

в проекте использую основу для работы с  памятью  исходники из темы "Исследование внешней EEPROM типа AT24Cxx и 24LCxx"
вроде все работает замечательно, но периодически начали "портится " данные при записи. мучал протеуса и выяснил что этот код :

Код:
===============================================================================
  Sub Write_lc24xxx_word(byval Copy_adress_word As Word , Byval Copy_data_word As Word)
'-------------------------------------------------------------------------------
    Адрес_ячейки_24lcxxx_word = Copy_adress_word
    Буфер_записи_24lcxxx_word = Copy_data_word

    I2cstart       ' Стартуем
    I2cwbyte Lc24xxx_запись       ' Адресное обращение к микросхеме
    I2cwbyte Адрес_ячейки_24lcxxx_high       ' Отправляем старший байт адреса ячейки памяти
    I2cwbyte Адрес_ячейки_24lcxxx_low       ' Отправляем младший байт адреса ячейки памяти
    I2cwbyte Буфер_записи_24lcxxx_high_byte       ' Записываемый в EEPROM байт
    I2cwbyte Буфер_записи_24lcxxx_low_byte       ' Записываемый в EEPROM байт
    I2cstop       ' Освобождаем шину I2c

    Gosub Подтвержение_записи_lc24xxx
'-------------------------------------------------------------------------------
  End Sub
'===========


при попадании адреса на конец физической границы страницы, первый байт Буфер_записи_24lcxxx_high_byte записывает по адресу Copy_adress_word,  а второй  переписывает на начало страницы! тем самым какбы " повреждает" данные .

изза чего я не могу записать пакетно данные :

Код:
 I2cstart                                                 ' Стартуем
   I2cwbyte Lc24xxx_запись                                  ' Адресное обращение к микросхеме
   I2cwbyte Адрес_ячейки_24lcxxx_high                       ' Отправляем старший байт адреса ячейки памяти
   I2cwbyte Адрес_ячейки_24lcxxx_low                        ' Отправляем младший байт адреса ячейки памяти

   I2cwbyte Переменная_для_записи_byte1(1)                  ' Записываемый в EEPROM байт
   I2cwbyte Переменная_для_записи_byte1(2)                  ' Записываемый в EEPROM байт
   I2cwbyte Переменная_для_записи_byte1(3)                  ' Записываемый в EEPROM байт
   I2cwbyte Переменная_для_записи_byte1(4)                  ' Записываемый в EEPROM байт

   I2cwbyte Переменная_для_записи_byte2(1)                  ' Записываемый в EEPROM байт
   I2cwbyte Переменная_для_записи_byte2(2)                  ' Записываемый в EEPROM байт
   I2cwbyte Переменная_для_записи_byte2(3)                  ' Записываемый в EEPROM байт
   I2cwbyte Переменная_для_записи_byte2(4)                  ' Записываемый в EEPROM байт

   I2cwbyte Переменная_для_записи_byte3(1)                  ' Записываемый в EEPROM байт
   I2cwbyte Переменная_для_записи_byte3(2)                  ' Записываемый в EEPROM байт
   I2cwbyte Переменная_для_записи_byte3(3)                  ' Записываемый в EEPROM байт
   I2cwbyte Переменная_для_записи_byte3(4)                  ' Записываемый в EEPROM байт

   I2cwbyte Буфер_записи_24lcxxx_high_byte                  ' Записываемый в EEPROM байт
   I2cwbyte Буфер_записи_24lcxxx_low_byte                   ' Записываемый в EEPROM байт


надо както программно определять конец страницы и продолжить запись на следующую страницу.. но как это сделать? вот в чем вопрос!
можно использовать побайтовую запись, но там слишком долго ждать приходится!  в 24LC64 запись одного байта 5мс

Отредактировано Penumbra (2018-11-12 10:57:10)

0

2

Обычная математика, "страницы" по 32 байта.
Как уже обсуждалось в других темах форума, пакетная запись - это лишний геморрой. Кто мешает просто писать по одной ячейки. Ибо если вы записываете 32 байта в память, то надо всё равно ожидать прохождения времени записи (как бы быстрее не получится).

Вычисление страниц простое: страница = адрес / 32

Только оно вам ненужно, вам не страницы надо считать, а просто счетчик буфера (4.2 Page Write), делаете внутри обычный счетчик по 32 байта и при достижении его, просто нужно закрыть/закончить (стопануть) передачу и затем ожидать освобождения памяти для следующей записи (ожидание записи (BUS CHARACTERISTICS). Или просто выдержать задержку из датащита (это если вы очень быстро её пишите, сами определяйте, считайте).

0

3

Беда в том, что при побайтной записи у меня происходит задержка ( процесс записи) аж 100мс! и в это время процессор занимается только записью, что вносит погрешность вычисления и измерения которая накапливается со временем . при страничной записи процессор отправил пакет на запись  ~ 15-20ms и занимается своим делом пока еепром пишется.
у 24LC64 беда -страницы занимают строго определенное адресное пространство, например: 0-31, 32-63, 64-95 ,  а я использую 6768 байт  из 8192 и мне надо записать/изменить пакет длинной в 14 байт в этой области (6768 байт) памяти согласно расчетам. Например , сначала я пишу в 14 байт начиная с адреса  2115  потом могу начиная с адреса 4540.
и еще одна беда в том что если я во время последовательной записи упираюсь в конец страницы то все что дальше НЕ просто игнорируется а перезаписывается с начала страницы!

поэтому 

просто счетчик буфера (4.2 Page Write), делаете внутри обычный счетчик по 32 байта

вряд ли подходил.. надо подумать,

день потратил на побайтную запись и  опыты с возникающей погрешностью расчетов, завтра буду думать про страницы :canthearyou:

0

4

подумал: можно попробовать при ожидании записи (5мс) в это время занимать проц расчетами :idea:

0

5

Вся память типа 24 записывается по-странично - по 16 или по 32 байта на страницу.
Если прямо не указать на номер новой страницы - автоматического перехода на новую страницу не будет, и вся запись будет крутиться на  старой странице.
К стати, в PDF-ке это есть... извините за мой французский... :)

If a byte address is incremented from the last byte of a page, it returns to the first byte of that page.

Если адрес байта увеличивается с последнего байта страницы, он возвращается к первому байту этой страницы.

Отредактировано pavel1969 (2018-11-13 00:03:36)

0

6

Ну и главное:

1,000,000 erase/write cycles

Penumbra написал(а):

ожидании записи (5мс)

При такой частой записи получается, ресурс памяти слопается за 5000 сек (83 мин). :insane:

0

7

Все, решил вопрос, побайтно  не подошло, долго. Разбил адресное пространство на страницы и все. каждый пакет длинной 14 байт пишу    либо в начало страницы, либо  начиная с 16го  адреса страницы, и так все 6768 бавйт влезают. Да, остается по 2 свободных байта на странице но то уже фигня.. Не жалко

0

8

RDW написал(а):

При такой частой записи получается, ресурс памяти слопается за 5000 сек (83 мин).

ну , дык,  я же не в одну ячейку пишу. а в 6768, и пишу не непрерывно а при накоплении определенных данных( это может быть раз в 10 минут, а может и раз в сутки).  но  мне критично чтобы в момент записи процессор не стоял,  а производил замеры, и расчеты. ибо возникает погрешность которая со временем нарастает как снежный ком. и через 2-3 месяца это уже 20% от эталонного прибора в меньшую сторону. по этой причине  даже пришлось использовать 2 контроллера в своем чудо девайсе))  один  ведет расчеты и измерения непрерывно. второй отвечает за связь с ПК, вывод на ЛСД экран информации,  (меню, навигация, анализ) и прочую хрень. обмен данными друг с другом по юарт . геморно , знаю)  :insane: но это опытный образец, может потом модернизирую и переработаю девайс... но сейчас главное результат))

0

9

Непонятно о какой ошибки накопления идет речь, если только один АЦП уже медленно работает. ;)
Следовательно, пока он там измеряет (накапливает результат по прерыванию), параллельно можно записывать память.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » проблема с записью в ЕЕПРОМ 24LC64