Внешняя EEPROM I2C 24C32, 64....

Внешняя I2C EEPROM 24C32, на плате с часами DS3231, а также другие с интерфейсом I2C

Пользовательские блоки дающие дополнительные возможности при работе с EEPROM и SD картами
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Аватара пользователя
Sancho
Полковник
Сообщения: 3999
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 571
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Внешняя EEPROM I2C 24C32, 64....

#1

Сообщение Sancho » 09.01.2018{, 11:16}

Тестовые образцы. Архив rar.
Запись и чтение по два байта и три интегера = восемь байт.
Итого 512 блоков (0-511) для 24С32.
Тестируем, отписываемся.
Возможно сделать блоки "общим весом" 2,4,8,16 и 32, 64 байта.
Единичные байты пока не рассматриваются - медленно.
Тема в разделе форума "Железо".

UPD. Диапазон адресов 24C32 - 0х50 - - 0х57.
Отсутствие перемычек на указанной плате- 1,
получаем на новой 0х57(стоит по умолчанию)

UPD. 14.08 Добавлен в архив блок для записи в память текста, номеров - тел. книга описание .
UPD. 19.08 (14.02мск) Предыдущий блок обновлён - добавилась функция поиска по номеру. На 24С32 - 127 записей по 32 символа.
UPD. 04.09 Добавил блоки с записью Float. Конструируйте любые варианты, необходимые в каждом конкретном случае. Незабывайте о размерности в 2,4,8,16 и 32 байта.
После переезда наведу порядок. Чуть погодя :)
UPD.31.01.2018. Добавлены два тестовых блока для 24С16. Запись и чтение по два байта и три интегера = восемь байт. 256 блоков.(0-255).
Перемычки адреса в микросхеме(внутри) 24С16 не подключены. На шине только одна!
Отпишитесь о результатах и пожеланиях.
UPD 05.02.2018. Добавлены несколько примеров. Добавил промежуточные варианты - для самостоятельной модификации.
UPD 13.02.2018 Добавлены блоки чтения / записи 4 байт

UPD 30.01.2019 Отдельно всё из папки. Для творчества, для идей. Почти всё :)
Вложения
I2C Memory.ubl
30.01.2019
(612.79 КБ) 254 скачивания
24C32_write_read_v3.rar
Перезалито 15.02.2018
(592.82 КБ) 416 скачиваний
24C32_write_read.rar
Перезалито 15.02.2018
(24.11 КБ) 335 скачиваний
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
Ivan_Kornege
Лейтенант
Сообщения: 318
Зарегистрирован: 29.04.2017{, 08:24}
Репутация: 23
Откуда: гАндурас
Имя: Ivan

Внешняя EEPROM I2C 24C32, 64....

#21

Сообщение Ivan_Kornege » 22.02.2018{, 09:06}

Sancho писал(а):
10.02.2018{, 11:14}
Надеюсь, в предыдущем посте я подробно изложил идею и возможности блоков?
Вам необходимо сохранять одну переменную один раз, или несколько? Т.е. сколько ячеек нужно и каких?
Еще раз спасибо за блок.
Я хочу писать время работы моего мотоблока. Что бы не убить память ардуины я решил писать во внешнюю память 24LC16B. Если умрет то просто заменю. Недорого и доступно. За основу взял проект с форума - пишит каждую минуту работы мотора. Пока не понял сколько минут можно записать в Ваш блок.
Я так понимаю что int1 это вход для записи в первую ячейку памяти?

Аватара пользователя
Sancho
Полковник
Сообщения: 3999
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 571
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Внешняя EEPROM I2C 24C32, 64....

#22

Сообщение Sancho » 22.02.2018{, 09:10}

Ещё один вариант использования описан тут
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
Ivan_Kornege
Лейтенант
Сообщения: 318
Зарегистрирован: 29.04.2017{, 08:24}
Репутация: 23
Откуда: гАндурас
Имя: Ivan

Внешняя EEPROM I2C 24C32, 64....

#23

Сообщение Ivan_Kornege » 22.02.2018{, 10:23}

Sancho писал(а):
22.02.2018{, 09:10}
Ещё один вариант использования описан тут
У меня нет памяти 24С32.

Отправлено спустя 19 минут 7 секунд:
Sancho писал(а):
09.01.2018{, 11:16}
UPD.31.01.2018. Добавлены два тестовых блока для 24С16. Запись и чтение по два байта и три интегера = восемь байт. 256 блоков.(0-255).
Если использую вход блока int1 то можно записать 8 байт? Т.е. 12345678 запишется?

Аватара пользователя
Sancho
Полковник
Сообщения: 3999
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 571
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Внешняя EEPROM I2C 24C32, 64....

#24

Сообщение Sancho » 22.02.2018{, 11:18}

Любой тип данных в памяти контролера представлен байтами.
Типы byte, char - занимают по одному байту, поэтому могут иметь всего 256 значений.
Тип integer занимает два байта, 65536 значений.
Типы long и float занимают 4 байта.
Всё вышеописанное относится к ардуино, в других местах может быть иначе...
Возьмём тетрадь в клеточку.
СпойлерПоказать
Пример распределения байт_1.png
Пример распределения байт_1.png (7.14 КБ) 2199 просмотров
Представим, что каждый квадрат это один байт информации( или восемь бит, но сегодня без них :) )
Блоки, описанные здесь, принимают на вход разный тип данных, но сразу сложные рабираются на байты.
При установке нужного номера блока и подаче сигнала Record происходит одновременная запись всех байт в ячейки памяти, соответствующие поданному адресу - Numblock.
При считывании происходит обратный процесс - устанавливаем адрес на входе Numblock - на выходе появляются записанные значения в том фомате, как и записывали.
ВСЁ!!!
Ivan_Kornege писал(а):
22.02.2018{, 10:42}
У меня нет памяти 24С32.
При чём здесь тип микросхемы? Вы принцип понимаете вообще???
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
Ivan_Kornege
Лейтенант
Сообщения: 318
Зарегистрирован: 29.04.2017{, 08:24}
Репутация: 23
Откуда: гАндурас
Имя: Ivan

Внешняя EEPROM I2C 24C32, 64....

#25

Сообщение Ivan_Kornege » 23.02.2018{, 10:36}

Sancho писал(а):
22.02.2018{, 11:18}
При чём здесь тип микросхемы? Вы принцип понимаете вообще???
Ну зачем мне рассматривать левые микрушки.
В принципе как радист я понимаю на уровне общеобразовательной школы
1год = 525600 минут -влезет в 3 байта ,
Из расчета в трех байтах - 2^24-1 = 16777215 .
Но мой вопрос именно что сможет Ваш блок.
Sancho писал(а):
22.02.2018{, 11:18}
Тип integer занимает два байта, 65536 значений.
Т.е. теоретически 525600 минут не влезет в integer
Sancho писал(а):
22.02.2018{, 11:18}
Типы long и float занимают 4 байта.
А вот сюда уже с запасом. В флпрог можно применить unsigned long integer =от 0 до 4294967295 (4байта)
Но неизвестно сможет ли Ваш блок работать с unsigned long integer ?

Аватара пользователя
Sancho
Полковник
Сообщения: 3999
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 571
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Внешняя EEPROM I2C 24C32, 64....

#26

Сообщение Sancho » 23.02.2018{, 11:13}

Ivan_Kornege,
Блоки можно сделать для всего!!!
А можно и так.
СпойлерПоказать
1_long_to_2_integ.png
1_long_to_2_integ.png (6.5 КБ) 2175 просмотров
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
Ivan_Kornege
Лейтенант
Сообщения: 318
Зарегистрирован: 29.04.2017{, 08:24}
Репутация: 23
Откуда: гАндурас
Имя: Ivan

Внешняя EEPROM I2C 24C32, 64....

#27

Сообщение Ivan_Kornege » 23.02.2018{, 13:02}

Sancho писал(а):
23.02.2018{, 11:13}
Блоки можно сделать для всего!!!
Почему Вы изначально сделали запись по 2 байта на каждый вход,
или unsigned long integer для записи 4байта в 24LC16B невозможно сделать блок?

Аватара пользователя
Nikan
Майор
Сообщения: 1129
Зарегистрирован: 29.12.2016{, 00:49}
Репутация: 87
Откуда: москва

Внешняя EEPROM I2C 24C32, 64....

#28

Сообщение Nikan » 23.02.2018{, 14:21}

Sancho писал(а):
23.02.2018{, 11:13}
А можно и так.
может я чего не понял. под спойлером. блок модуло на всякий случай...
Вложения
modulo_(CODE).ubi
(11.87 КБ) 100 скачиваний

Аватара пользователя
Sancho
Полковник
Сообщения: 3999
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 571
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Внешняя EEPROM I2C 24C32, 64....

#29

Сообщение Sancho » 23.02.2018{, 15:06}

Nikan писал(а):
23.02.2018{, 14:21}
может я чего не понял.
Вы почитайте вопросы выше и мои ответы....
Я устал объяснять, а ещё и рассказывать, что делает блок внутри...
Ivan_Kornege,
Для Вас на 23 февраля!
Вложения
Sancho_to_Ivan.ubl
(87.98 КБ) 117 скачиваний
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
AVGN
Капитан
Сообщения: 727
Зарегистрирован: 03.02.2017{, 12:23}
Репутация: 56

Внешняя EEPROM I2C 24C32, 64....

#30

Сообщение AVGN » 23.02.2018{, 17:21}

Sancho писал(а):
23.02.2018{, 15:06}
Я устал объяснять, а ещё и рассказывать, что делает блок внутри...
Подсобим малость...
Просто о сложном...
:moil: :wizard:

Памятка.
В один байт можно записать -один символ.
Пример: "Это что память?"
Имеем 12 букв = 12 символов, два пробела=2 символа, две кавычки= 2 символа и знак вопроса=1 символ.
Итого - 17 символов . Для хранения в памяти потребуется 17 байт.

Какое максимальное число можно записать считаем (^ -Возведение в степень).
в одном байте - 2^8-1 = 255
в двух байтах - 2^16-1 = 65535
в трех байтах - 2^24-1 = 16777215
в четырёх байтах - 2^32-1 = 4294967296 -1 = 4294967295
*****************************************************************************************
Тестовая программа для ARDUINO UNO с KEYPAD LCD 1602.
EEPROM_24LC16B_I2C_Flprog_UNO_test2.flp
(322.94 КБ) 129 скачиваний
Генерит каждую секунду и записывает в 24LC16B.
Обнуление 24LC16B – Замкнуть pin A2 на общий провод ( в проекте обозначен " RESET A2").
На дисплей выводится:
-верхняя строка – количество секунд считанные из 24LC16B и плюсуется каждая секунда которую генерим.
-нижняя строка - количество секунд считанных из 24LC16B
****************************************************************************************

Блок "24C16_Чтение_Long" для чтения из памяти 24LC16B.
На борту два выхода byte с возможностью чтения до 2 byte
+ один выход Integer с возможностью чтения до 2 byte
+ один выход unsig long Integer с возможностью чтения до 4 byte= итого 8 байт блоком.
Настройки блока "24C16_Чтение_Long".
Входы:
Reading – разрешение считывания если "true"
Numblock - номера блока от 0 до 255 , т.е. всего блоков 256. Можно организовать поблочное чтение.
Выходы:
byte_out_1 - один байт
byte_out_2 - один байт
int_out_1 - два байта , т.е прочитать не больше чем число 65535
Long_1 - четыре байта, т.е. прочитать можно не больше чем число 4294967295 или 4 символа.
-----------------------------------------------------------------------------------------------------------------------
Блок "24C16_Запись_Long" для записи в память 24LC16B
На борту два входа byte с возможностью записи до 2 byte
+ один вход Integer с возможностью записи до 2 byte
+ один вход unsig long Integer с возможностью записи до 4 byte = итого 8 байт блоком.
Настройки блока "24C16_Запись_Long".
Входы:
Record – разрешение записи при поступлении "true" в этом цикле происходит запись. Встроен R триггер. Что-бы не протереть дырку в памяти.
Numblock - номера блока от 0 до 255 , т.е. всего блоков 256. Можно организовать поблочную запись.
byte_in_1 - один байт
byte_in_2 - один байт
int1 - два байта , т.е записать не больше 65535
Long_1 - четыре байта, т.е. записать можно не больше чем число 4294967295 или 4 символа.
Последний раз редактировалось AVGN 09.03.2018{, 08:47}, всего редактировалось 1 раз.
Если вы не можете объяснить это просто – значит, вы сами не понимаете этого до конца.
☆Альберт Эйнштейн

Аватара пользователя
Ivan_Kornege
Лейтенант
Сообщения: 318
Зарегистрирован: 29.04.2017{, 08:24}
Репутация: 23
Откуда: гАндурас
Имя: Ivan

Внешняя EEPROM I2C 24C32, 64....

#31

Сообщение Ivan_Kornege » 25.02.2018{, 14:03}

Sancho, Спасибо за блок- заработала микруха.
AVGN, Спасибо -доходчиво расписал!

Аватара пользователя
ElectroMechaniC
Сержант
Сообщения: 230
Зарегистрирован: 21.09.2016{, 06:50}
Репутация: 1
Откуда: Донецк
Имя: Юрий

Внешняя EEPROM I2C 24C32, 64....

#32

Сообщение ElectroMechaniC » 09.03.2018{, 07:08}

Привет! Если в проекте используются ЧРВ DS3231, с памятью 24С32, в неё можно писать к примеру 8мь интегров, с помощью данных блоков,пусть не сразу?
:newrus: Все в руках человека. Поэтому всегда мойте руки перед и зад! :victory:
:smile225: :smile469: :smile427:

Аватара пользователя
Sancho
Полковник
Сообщения: 3999
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 571
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Внешняя EEPROM I2C 24C32, 64....

#33

Сообщение Sancho » 09.03.2018{, 07:16}

ElectroMechaniC,
Без проблем.
Вопрос в том - использовать блок или воспользоваться встроенной в программу поддержкой.
Просто назначение блоков весьма своеобразно, скажем так.
Выкладывайте задачу - будем решать.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
ElectroMechaniC
Сержант
Сообщения: 230
Зарегистрирован: 21.09.2016{, 06:50}
Репутация: 1
Откуда: Донецк
Имя: Юрий

Внешняя EEPROM I2C 24C32, 64....

#34

Сообщение ElectroMechaniC » 12.03.2018{, 05:59}

Ок спасибо! Как только буду готов-выложу!
Ещё вопросик? А часами при этом можно пользоваться? Ну тлесть снимать показания жаты и времени, и одновременно производить чтение/запись в ееprom?
:newrus: Все в руках человека. Поэтому всегда мойте руки перед и зад! :victory:
:smile225: :smile469: :smile427:

Аватара пользователя
Sancho
Полковник
Сообщения: 3999
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 571
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Внешняя EEPROM I2C 24C32, 64....

#35

Сообщение Sancho » 12.03.2018{, 08:25}

ElectroMechaniC писал(а):
12.03.2018{, 05:59}
А часами при этом можно пользоваться?
Конечно, это разные устройства с разными адресами.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
fsergei70
Капитан
Сообщения: 703
Зарегистрирован: 17.11.2015{, 20:36}
Репутация: 49
Откуда: Ессентуки-Кисловодск
Имя: Сергей

Внешняя EEPROM I2C 24C32, 64....

#36

Сообщение fsergei70 » 02.07.2018{, 09:51}

Здравствуйте, что то ни как не соображу как переделать блок под ESP, Как прописать выводы I2C.

Аватара пользователя
Sancho
Полковник
Сообщения: 3999
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 571
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Внешняя EEPROM I2C 24C32, 64....

#37

Сообщение Sancho » 02.07.2018{, 11:19}

В коде изменить/добавить, пробуй
Wire.pins(0, 2); // sda, scl
Wire.begin();
Или
Wire.begin(0,2);
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
fsergei70
Капитан
Сообщения: 703
Зарегистрирован: 17.11.2015{, 20:36}
Репутация: 49
Откуда: Ессентуки-Кисловодск
Имя: Сергей

Внешняя EEPROM I2C 24C32, 64....

#38

Сообщение fsergei70 » 02.07.2018{, 11:29}

Sancho писал(а):
02.07.2018{, 11:19}
В коде изменить/добавить, пробуй
Wire.pins(0, 2); // sda, scl
Wire.begin();
Или
Wire.begin(0,2);
Спасибо сейчас попробую. Вот еще нашел пример в нем библиотеки дополнительные подключены. и выводы определены #define В вашем коде библиотеки не нужны?
СпойлерПоказать
#include <Wire.h>
#include <EEPROM.h>

unsigned int EEPROMBank = 0x50; // Base address of 1st EEPROM chip
unsigned int EEPROMAddress = 0; // Sets the start EEPROM address
unsigned int EEPROMValue = 0; // EEPROM value
byte Dummy;

// EEPROM list taken from:
// http://vascoferraz.com/projects/24c-eeprom-check/
// Sets the Maximum EEPROM address, uncomment accordingly:
//#define MaxBankAddress = 128 - 1; //24C01 -> 1024 bit -> 128 byte
//#define MaxBankAddress = 256 - 1; //24C02 -> 2048 bit -> 256 byte
//#define MaxBankAddress = 512 - 1; //24C04 -> 4096 bit -> 512 byte
unsigned int MaxBankAddress = 1024 - 1; //24C08 -> 8192 bit -> 1024 byte
//#define MaxBankAddress = 2048 - 1; //24C16 -> 16384 bit -> 2048 byte
//#define MaxBankAddress = 4096 - 1; //24C32 -> 32768 bit -> 4096 byte
//#define MaxBankAddress = 8192 - 1; //24C64 -> 65536 bit -> 8192 byte
//#define MaxBankAddress = 16384 - 1; //24C128 -> 131072 bit -> 16384 byte
//#define MaxBankAddress = 32768 - 1; //24C256 -> 262144 bit -> 32768 byte
//#define unsigned int maxaddress = 65536 - 1; //24C512 -> 524288 bit -> 65536 byte

#define SCLPin D1 // I2C SCL Pin
#define SDAPin D2 // I2C SDA Pin

void setup() {
Wire.begin(SDAPin, SCLPin); // Initialize 2-Wire bus
pinMode(D1, INPUT_PULLUP); // I Need to validate this line
pinMode(D2, INPUT_PULLUP); // I Need to validate this line
Serial.begin(19200); // Initialize serial port
while(!Serial); // wait for serial
delay(3000); // Waits 3 seconds
Serial.println("\n============================="); // Sends preamble and Cr+Lf
EEPROMAddress = 0; // EEPROM word variable
EEPROMValue = 120; // EEPROM value
Serial.print("EEPROMAddress: ");
Serial.print(EEPROMAddress);
Serial.print(", EEPROMValue: ");
Serial.print(EEPROMValue);
Serial.print(", EEPROMBank: 0x");
Serial.println(EEPROMBank,HEX);
writeEEPROM(EEPROMBank, EEPROMAddress, byte(EEPROMValue));
for (EEPROMAddress = 0; EEPROMAddress < 3; EEPROMAddress++) {
Serial.print("EEPROMAddress: ");
Serial.print(EEPROMAddress);
Serial.print(", Value: ");
Serial.println(readEEPROM(EEPROMBank, EEPROMAddress), DEC);
}
}
void loop(){
}

void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data ) {
Wire.beginTransmission(deviceaddress);
//Wire.write((int)(eeaddress >> 8)); // MSB
//Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.write((int)(eeaddress)); //only for 8 bit addressing
Wire.write(data);
Wire.endTransmission();
delay(5);
}

byte readEEPROM(int deviceaddress, unsigned int eeaddress ) {
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
//Wire.write((int)(eeaddress >> 8)); // MSB
//Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.write((int)(eeaddress)); //only for 8 bit addressing
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
if (Wire.available()) rdata = Wire.read();
return rdata;
}

Аватара пользователя
Sancho
Полковник
Сообщения: 3999
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 571
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Внешняя EEPROM I2C 24C32, 64....

#39

Сообщение Sancho » 02.07.2018{, 11:34}

fsergei70 писал(а):
02.07.2018{, 11:29}
В вашем коде библиотеки не нужны?
Только Wire.h
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
Golan
Капитан
Сообщения: 827
Зарегистрирован: 26.11.2017{, 23:18}
Репутация: 76
Откуда: Деревня, 98 домов в Мордовии
Имя: Владимир
Контактная информация:

Внешняя EEPROM I2C 24C32, 64....

#40

Сообщение Golan » 02.07.2018{, 14:17}

Сань, а для 24С64 можно такой блок забабахать?
Добро не ценится в современном мире, люди от него наглеют!

Ответить

Вернуться в «EEPROM и SD карты»