FLProg
Вход на сайт
Логин:
Пароль:
Поиск
...
Статистика
Воскресенье, 20.08.2017, 08:57
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: support, Сергей 
Форум » Основной » Железо (контроллеры, шилды, датчики и др.) » Внешняя EEPROM по шине I2C (Серия 24Схх(02, 04,....256))
Внешняя EEPROM по шине I2C
Sancho Дата: Пятница, 04.08.2017, 17:39 | Сообщение # 1
Полковник
Группа: Проверенные
Сообщений: 391
Награды: 12
Репутация: 12
Статус: Offline
Блоки для работы, пока тестовые, выложены в "Блоках пользователей".
Пример программы для понимания, насколько всё несложно прилагается.
Учитывая, что УВАЖАЕМЫЙ АВТОР не добавил в программу такое простое математическое понятие, как остаток от деления (modulo) придётся поработать ручками в коде, либо переделать алгоритм.( файл .txt нужно вставить в ide, уже испр).
О содеянном. Плата с DS3231 и 24C32, LED1602 с I2C, DHT22.
Записываются показания*10 и время каждые 5 сек, запись по кругу(512 блоков х 5сек= более 40 мин).
Три кнопки 10пин - текущее/архив, 11пин - вверх по архиву,12 - вниз.
В блок записи встроен R тригер, поэтому запишет только по фронту на Record(от дырки в памяти, если в каждом цикле).
Текущее значение времени преобразуется в один интегер и тоже записывается.
Читаем. Считываем при изменении номера блока на входе.
Распаковываем "временной" инт, преобразуем в перевариваемый формат.
Желающим позаморачиваться с возвратом точки в темп/влажности - плиз.
Чтобы значения не ёрзали по местам, когда нужно добавляем пробелы.

У кого есть железки - попробуйте. Первый раз при запуске поиграйтесь, пусть пишет минут 45. смотреть можно сразу, пишет всегда.
Потом, можно отключить на сколько угодного, вкл, и зайти на блоки 510, 509(пин 12),  так как писать начинает с 0,1 ...

Надеюсь, пригодится.
Вопросы по делу приветствуются!
Как и критика...
Жуть как не хватает MODULO!!!!

P.S. Не цепляется один, лежит тут.
Прикрепления: 5835783.txt(12Kb)


Если не получится на контроллере - сделаю на тразисторах и 155/176...

Сообщение отредактировал Sancho - Пятница, 04.08.2017, 17:42
 
fsergei70 Дата: Суббота, 05.08.2017, 06:52 | Сообщение # 2
Рядовой
Группа: Проверенные
Сообщений: 27
Награды: 0
Репутация: 0
Статус: Offline
Здравствуйте. Подскажите откуда взялась формула пересчета в вашем проекте
Собрали сек, мин, час в один интегер по формуле
сек(0-60)/5 + мин(0-60) * 16 + час(0-24)*1024
запись с периодом 5 сек, поэтому максимум от сек 12,
Если писать раз в 5 секунд то должно быть
сек(0-60)/5 + мин(0-60) * 12 + час(0-24)*720
ведь в одну минуту пишется 12 значений а в час 12*60

По поводу остатка разве нельзя его так посчитать? файл прикрепил внизу, если можно то все это можно загнать в блок.

Добавлено (05.08.2017, 06:52)
---------------------------------------------
Я в железе не пробовал, но мне кажется что значения с датчика надо писать в переменные, а уже с переменных считывать и подавать на блок записи в память. Ну а в блоке чтения наоборот.

Пересчет времени не совсем удобен, потому как не универсален, если нужен другой период опроса то в проекте надо переделывать формулы а если мне нужно будет вместо секунды/минуты/часы, сохранять например месяц/день/час вообще начнутся сложности, ведь количество дней каждый месяц разное. Да и переменной Integer со своим максимальным значением 32767 не бесконечная,  при использовании другой микросхемы памяти с большим объемом ее точно не хватит, а использовать другой тип переменной вместо Integer это уже 4 байта.  Поэтому лучше все таки хранить значения секунды/минуты/часы или скажем месяц/день/час каждую в своей переменной типа Byte.

P.S. И еще раз у нас целых 4096 байта  может имеет смысл сделать еще один блок по 16 байт и часть данных сделать строковой переменно, а часть в  integer.  Ведь не всегда нам нужно сохранять именно время или дату, например если использовать блоки  для хранения настроек Modbys Master, при работе с несколькими Slave, в строковых переменных можно хранить название опрашиваемого датчика или место их установки а в Integer допустим адреса и скорость обмена, тогда забив настройки один раз все Slave устройств можно будет из меню переключаться между ними.

Еще раз огромное Вам спасибо за блок.
Прикрепления: 2156186.flp(74Kb)


Сообщение отредактировал fsergei70 - Суббота, 05.08.2017, 07:07
 
fsergei70 Дата: Суббота, 05.08.2017, 07:45 | Сообщение # 3
Рядовой
Группа: Проверенные
Сообщений: 27
Награды: 0
Репутация: 0
Статус: Offline
Вот проект ваш немного переделал, я его не проверял  датчика влажности нет у меня, по идее должен работать. Единственное в чем не уверен, может данные с датчика надо писать в переменные а после с переменных считывать, не знаю сохраняются значения на выходе DHT в переуд между опросами Данные пишутся раз в минуту. Если кто проверит отпишитесь интересно все таки, сам то я проверить не смогу, потому как датчик DHT влажность мерит в попугаях, брешут сильно и приобретать его не вижу смысла а для температуры 18b20 есть.
Прикрепления: 9302942.flp(1443Kb)
 
fsergei70 Дата: Суббота, 05.08.2017, 07:47 | Сообщение # 4
Рядовой
Группа: Проверенные
Сообщений: 27
Награды: 0
Репутация: 0
Статус: Offline
проект в архиве
Прикрепления: __.rar(65Kb)


Сообщение отредактировал fsergei70 - Суббота, 05.08.2017, 07:49
 
Sancho Дата: Суббота, 05.08.2017, 10:44 | Сообщение # 5
Полковник
Группа: Проверенные
Сообщений: 391
Награды: 12
Репутация: 12
Статус: Offline
Цитата fsergei70 ()
Здравствуйте. Подскажите откуда взялась формула пересчета в вашем проектеСобрали сек, мин, час в один интегер по формулесек(0-60)/5 + мин(0-60) * 16 + час(0-24)*1024запись с периодом 5 сек, поэтому максимум от сек 12,Если писать раз в 5 секунд то должно бытьсек(0-60)/5 + мин(0-60) * 12 + час(0-24)*720ведь в одну минуту пишется 12 значений а в час 12*60
Я для удобства подсчётов использовал разрядность битов - ничего личного, мне так удобнее считать и запоминать. Каждый, в данном случае, волен выбирать, что душе угодно.
Цитата fsergei70 ()
По поводу остатка разве нельзя его так посчитать? файл прикрепил внизу, если можно то все это можно загнать в блок.
Считать остаток ИЗВРАЩЁННЫМИ методами, нет не я. Скормите Ваше творение IDE, посмотрите код, а потом сравните с X=Y%Z   А???? Разницу видите???
Цитата fsergei70 ()
Я в железе не пробовал, но мне кажется что значения с датчика надо писать в переменные, а уже с переменных считывать и подавать на блок записи в память. Ну а в блоке чтения наоборот.
Пользовательские блоки, точнее их входы/выходы - это уже переменные, задекларированные.
Чем меньше вокруг пользовательских блоков прослоек из доп. переменных - тем больше места нам остаётся в программе.
Цитата fsergei70 ()
Пересчет времени не совсем удобен, потому как не универсален, если нужен другой период опроса то в проекте надо переделывать формулы а если мне нужно будет вместо секунды/минуты/часы, сохранять например месяц/день/час вообще начнутся сложности, ведь количество дней каждый месяц разное. Да и переменной Integer со своим максимальным значением 32767 не бесконечная,  при использовании другой микросхемы памяти с большим объемом ее точно не хватит, а использовать другой тип переменной вместо Integer это уже 4 байта.  Поэтому лучше все таки хранить значения секунды/минуты/часы или скажем месяц/день/час каждую в своей переменной типа Byte.
Ответ:
Цитата Sancho ()
Пример программы для понимания, насколько всё несложно прилагается.

Добавлено (05.08.2017, 09:10)
---------------------------------------------

Цитата fsergei70 ()
P.S. И еще раз у нас целых 4096 байта  может имеет смысл сделать еще один блок по 16 байт и часть данных сделать строковой переменно, а часть в  integer.  Ведь не всегда нам нужно сохранять именно время или дату, например если использовать блоки  для хранения настроек.......
ВСЕ данные в контролере представляют собой байты, поэтому хранить можно хоть чёрта лысого, если его описать этими самыми байтами.  smile biggrin

Это всего лишь ТЕСТОВЫЙ блок, сделать можно под ЛЮБОЙ!!! тип, комбинированные, особенно итересным представляется массив в формате использования его для web...
У микросхем от С64 и выше размер записываемого блока может доходить до 64 байт в один заход.
Надеюсь, очень, что моя писанина, не только в этом топике, помогает разобраться - сам по образованию не програмист.

Добавлено (05.08.2017, 10:44)
---------------------------------------------

Цитата fsergei70 ()
инуты/часы, сохранять например месяц/день/час вообще начнутся сложности, ведь количество дней каждый месяц разное. Да и переменной Integer со своим максимальным значением 32767 не бесконечная,  при использовании другой микросхемы памяти с большим объемом ее точно не хватит, а использовать другой тип переменной вместо Integer это уже 4 байта

Что Вам мешает получить из двух байтов инт, а из двух инт - лонг инт?
У 24С256 адрес последнего бита 32767, хватит.
А чего ещё не хватает в нашей либимой FLProg, кроме MODULO % ???
Правильно, типа переменной, который, также, как и   MODULO %, приходится править(делать) руками, но стандартен.
Ещё не догадались?
Да, думаю, все знают.
Правильно,  unsigned int, который позволяет работать в диапазоне 0-65535....
Особенно актуально, в моих случаях, в счетчиках, для выборки адресов - опять-же, правлю руками уже в коде.
Очень, Очень надеюсь, что Уважаемый АВТОР меня когда-нибудь, да услышит.... smile


Если не получится на контроллере - сделаю на тразисторах и 155/176...
 
fsergei70 Дата: Суббота, 05.08.2017, 14:58 | Сообщение # 6
Рядовой
Группа: Проверенные
Сообщений: 27
Награды: 0
Репутация: 0
Статус: Offline
Цитата Sancho ()
А чего ещё не хватает в нашей либимой FLProg, кроме MODULO % ???Правильно, типа переменной, который, также, как и   MODULO %, приходится править(делать) руками, но стандартен.
Ещё не догадались?
Да, думаю, все знают.
Правильно,  unsigned int, который позволяет работать в диапазоне 0-65535....
Особенно актуально, в моих случаях, в счетчиках, для выборки адресов - опять-же, правлю руками уже в коде.
если знаете где править то какие проблемы. Мне бы например очень пригодились переменные unsigned s hort    и  unsigned char для обмена по modbus, но их к сожалению нет, да и в float  порядок следования бит не настраивается. У каждого из пользователей есть свои хотелки, а автор программы у нас один, он при всем желании физически не в состоянии помочь всем. Сейчас вот Scada допиливает на языке FBD, штука безусловно нужная, хотя как по мне есть куча сторонних программ, взять хотя бы овен  телемеханика,  тот же язык FBD, работает правда она 2 часа а потом перезапускать ее нужно. 
Сори что то я от темы отвлекся.

Цитата Sancho ()
Что Вам мешает получить из двух байтов инт, а из двух инт - лонг инт?У 24С256 адрес последнего бита 32767, хватит.
Я не адресное пространство имел ввиду а получившееся число при расчете времени, если измерений будет больше писаться на другую микросхему, то мы можем выйти за диапазон 32767
 
Sancho Дата: Суббота, 05.08.2017, 15:48 | Сообщение # 7
Полковник
Группа: Проверенные
Сообщений: 391
Награды: 12
Репутация: 12
Статус: Offline
Цитата fsergei70 ()
Мне бы например очень пригодились переменные unsigned short
Чем отличается от  unsigned int в IDE?
 
Цитата fsergei70 ()
и unsigned char
А Вы проверили, как он реализован в IDE?
Цитата fsergei70 ()
для обмена по modbus
О каком режиме идёт речь?
Цитата fsergei70 ()
да и в float порядок следования бит не настраивается
Где проблема - я не понимаю!!! У Вас не получается принять флоат сторонними программами от FLProg? Расскажите, ОБЯЗАТЕЛЬНО поможем!
Цитата fsergei70 ()
Я не адресное пространство имел ввиду а получившееся число при расчете времени, если измерений будет больше писаться на другую микросхему, то мы можем выйти за диапазон 32767
Вот я и писал, что
Цитата Sancho ()
Правильно,  unsigned int, который позволяет работать в диапазоне 0-65535....Особенно актуально, в моих случаях, в счетчиках, для выборки адресов - опять-же, правлю руками уже в коде.


Добавлено (05.08.2017, 15:48)
---------------------------------------------
smile При архивировании времени - упаковке его для хранения- можно использовать не два байта, а три, четыре... - всё зависит от фантазии! smile Я, в примере, лишь сделал так, как мне было удобнее при пяти секундном интервале записей, и показал процесс сборки сек, мин, часов в другой формат.
К указанным в названии темы микросхемам данные разглагольствования никак не относятся.


Если не получится на контроллере - сделаю на тразисторах и 155/176...

Сообщение отредактировал Sancho - Суббота, 05.08.2017, 16:00
 
Sancho Дата: Понедельник, 14.08.2017, 17:15 | Сообщение # 8
Полковник
Группа: Проверенные
Сообщений: 391
Награды: 12
Репутация: 12
Статус: Offline
Сделал блок для записи в память телефонов с фамилиями и именами.

Отдельное СПАСИБО пользователю boroda, за идею приёма из уарта байтами...

В будущем будет работать в паре с gsm модулем, пока жду, едет из поднебесной...
Ввод всего производится через терминал - копипастом из таблицы эксель ПЕРВЫЕ ЧЕТЫРЕ СИМВОЛА - АДРЕС СТРАНИЦЫ, КУДА ЗАПИШЕТСЯ, энтер, посмотрели на дисплее - кнопку write, следующий...
Страница = 32 байта.
В памяти, которая с часами ds3231, 4096/32= 128 страниц
Переводим в чтение(вход write/read на общий), смотрим, листаем вверх/вниз, проверяем...
Блок для работы непосредственно с блоками gsm для поиска номера пока не делал.
Номер страницы намеренно сделал четырёх символьным - думаю, в будущем этот самый 4-й символ буду дописывать литерой A-Z и использовать для дальнейшей реакции на звонок - чего-то включить, выключить, поднять трубку, какие команды принять по дтмф, сбросить.......
Блок, вместе с другими тестами, лежит тут
Для нормальной работы необходимо пролечить две библиотеки, т.к. буфер шины i2c всего 32 байта, а для записи нужно 34. У себя поднял до 70 - в будущем, в другие 24С,  можно писать по 64 байта за один проход....
в файле \AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.19\libraries\Wire\src строка 28,
или C:\Program Files (x86)\Flprog\ideV2\hardware\arduino\avr\libraries\Wire\src
#define BUFFER_LENGTH 70
в файле %Arduino%\libraries\Wire\utility\twi.h строка 32или Поиск в помощь smile

#define TWI_BUFFER_LENGTH 70
Прикрепления: Test_memory.xlsx(20Kb)


Если не получится на контроллере - сделаю на тразисторах и 155/176...

Сообщение отредактировал Sancho - Суббота, 19.08.2017, 09:19
 
Sancho Дата: Четверг, 17.08.2017, 09:42 | Сообщение # 9
Полковник
Группа: Проверенные
Сообщений: 391
Награды: 12
Репутация: 12
Статус: Offline
iBells, для уменьшения кол-ва перепрошивок контролера, используйте переключение между платами.
Прикрепления: ext_EEPROM_R_W_.flp(174Kb)


Если не получится на контроллере - сделаю на тразисторах и 155/176...

Сообщение отредактировал Sancho - Четверг, 17.08.2017, 09:43
 
Sancho Дата: Суббота, Вчера, 09:23 | Сообщение # 10
Полковник
Группа: Проверенные
Сообщений: 391
Награды: 12
Репутация: 12
Статус: Offline
В архиве блока пользователя изменён блок "тел книги" - появилась функция поиска.
Для тестов используйте exel файл из поста выше.
Постарался всё закомментировать, так, что-бы можно было легко переделать под свои нужды, может под контроль доступа, ....
Поиск совпадений идёт с ПОСЛЕДНЕЙ цифры номера - считаю наиболее быстрый вариант.
Пример в комплекте. Не последняя версия.
smile
Прикрепления: 1922382.png(62Kb)


Если не получится на контроллере - сделаю на тразисторах и 155/176...
 
Форум » Основной » Железо (контроллеры, шилды, датчики и др.) » Внешняя EEPROM по шине I2C (Серия 24Схх(02, 04,....256))
Страница 1 из 11
Поиск:

FLProg © 2017
Яндекс.Метрика