Страница 2 из 5

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

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

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

Добавлено: 22 фев 2018, 09:10
Sancho
Ещё один вариант использования описан тут

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

Добавлено: 22 фев 2018, 10:42
Ivan_Kornege
Sancho писал(а): 22 фев 2018, 09:10Ещё один вариант использования описан тут
У меня нет памяти 24С32.

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

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

Добавлено: 22 фев 2018, 11:18
Sancho
Любой тип данных в памяти контролера представлен байтами.
Типы byte, char - занимают по одному байту, поэтому могут иметь всего 256 значений.
Тип integer занимает два байта, 65536 значений.
Типы long и float занимают 4 байта.
Всё вышеописанное относится к ардуино, в других местах может быть иначе...
Возьмём тетрадь в клеточку.
[spoiler]
Пример распределения байт_1.png
[/spoiler]
Представим, что каждый квадрат это один байт информации( или восемь бит, но сегодня без них :) )
Блоки, описанные здесь, принимают на вход разный тип данных, но сразу сложные рабираются на байты.
При установке нужного номера блока и подаче сигнала Record происходит одновременная запись всех байт в ячейки памяти, соответствующие поданному адресу - Numblock.
При считывании происходит обратный процесс - устанавливаем адрес на входе Numblock - на выходе появляются записанные значения в том фомате, как и записывали.
ВСЁ!!!
Ivan_Kornege писал(а): 22 фев 2018, 10:42У меня нет памяти 24С32.
При чём здесь тип микросхемы? Вы принцип понимаете вообще???

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

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

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

Добавлено: 23 фев 2018, 11:13
Sancho
[ref]Ivan_Kornege[/ref],
Блоки можно сделать для всего!!!
А можно и так.
[spoiler]
1_long_to_2_integ.png
[/spoiler]

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

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

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

Добавлено: 23 фев 2018, 14:21
Nikan
.

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

Добавлено: 23 фев 2018, 15:06
Sancho
Nikan писал(а): 23 фев 2018, 14:21может я чего не понял.
Вы почитайте вопросы выше и мои ответы....
Я устал объяснять, а ещё и рассказывать, что делает блок внутри...
[ref]Ivan_Kornege[/ref],
Для Вас на 23 февраля!

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

Добавлено: 23 фев 2018, 17:21
AVGN
Sancho писал(а): 23 фев 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
Генерит каждую секунду и записывает в 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 символа.

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

Добавлено: 25 фев 2018, 14:03
Ivan_Kornege
[ref=#ff8000]Sancho[/ref], Спасибо за блок- заработала микруха.
[ref]AVGN[/ref], Спасибо -доходчиво расписал!

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

Добавлено: 09 мар 2018, 07:08
ElectroMechaniC
Привет! Если в проекте используются ЧРВ DS3231, с памятью 24С32, в неё можно писать к примеру 8мь интегров, с помощью данных блоков,пусть не сразу?

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

Добавлено: 09 мар 2018, 07:16
Sancho
[ref]ElectroMechaniC[/ref],
Без проблем.
Вопрос в том - использовать блок или воспользоваться встроенной в программу поддержкой.
Просто назначение блоков весьма своеобразно, скажем так.
Выкладывайте задачу - будем решать.

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

Добавлено: 12 мар 2018, 05:59
ElectroMechaniC
Ок спасибо! Как только буду готов-выложу!
Ещё вопросик? А часами при этом можно пользоваться? Ну тлесть снимать показания жаты и времени, и одновременно производить чтение/запись в ееprom?

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

Добавлено: 12 мар 2018, 08:25
Sancho
ElectroMechaniC писал(а): 12 мар 2018, 05:59А часами при этом можно пользоваться?
Конечно, это разные устройства с разными адресами.

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

Добавлено: 02 июл 2018, 09:51
fsergei70
Здравствуйте, что то ни как не соображу как переделать блок под ESP, Как прописать выводы I2C.

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

Добавлено: 02 июл 2018, 11:19
Sancho
В коде изменить/добавить, пробуй
Wire.pins(0, 2); // sda, scl
Wire.begin();
Или
Wire.begin(0,2);

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

Добавлено: 02 июл 2018, 11:29
fsergei70
Sancho писал(а): 02 июл 2018, 11:19В коде изменить/добавить, пробуй
Wire.pins(0, 2); // sda, scl
Wire.begin();
Или
Wire.begin(0,2);
Спасибо сейчас попробую. Вот еще нашел пример в нем библиотеки дополнительные подключены. и выводы определены #define В вашем коде библиотеки не нужны?

[spoiler]
#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;
}
[/spoiler]

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

Добавлено: 02 июл 2018, 11:34
Sancho
fsergei70 писал(а): 02 июл 2018, 11:29В вашем коде библиотеки не нужны?
Только Wire.h

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

Добавлено: 02 июл 2018, 14:17
Golan
Сань, а для 24С64 можно такой блок забабахать?