А почему не упомянули что если кто то, из посмотревших решит все тоже самое повторить в цикле loop, в вашем случае Setup выполняется один раз, при старте, то может достаточно быстро протереть дыру в памяти, вообще с этой памятью нужно обращаться осторожно. Автор явно далек от электроники и от программирования. Правильно сказал мне как то один человек: "Раньше в интернете была только полезная информация, так как выходить в него могли в большинстве своем грамотные люди, а сейчас любой у кого есть компьютер строчит бестолковые статьи даже не разбираясь в том о чем ведет речь". Лучше нужно готовиться, а не стряпать ролики как попало.
Да я то не виню, просто кто то не опытный может споткнуться на этом месте, а вы этого не упомянули в видео, даже вскользь, что не есть хорошо, раз уж взялись пилить обзор, пилите до конца. А так получается обзор для галочки. В сети очень много контента, но так мало полезного и качественного.
Возьми стандартную библиотеку, переменные флоат занимают 4 байта, а вот булевые занимают байт, если хочешь уменьшить то через маску сохранять и писать свою функцию
a) Вообще-то любая память "не поддерживает" вещественные числа и EEPROM ничем от другой памяти в этом смысле не отличается - данные везде хранятся в двоичном виде. б) Тут встроенную не знаешь куда потратить... Обычно внешнюю память используют для временного сохранения новой прошивки, которую контролёр получает по IP, ибо в загрузчик вкорячить стек TCP/IP не получается. в) Переменные в EEPROM нормальные люди не хранят, ибо накладно по ресурсам. Хранят значения для инициализации переменных при старте, которые могут меняться в ходе жизни (не константы). г) "Хранение" с умножением вообще чушь полная! Иногда деньги хранят целыми числами, считая копейками т.е. умножая на 100 сумму перед сохранение, ограничивая таким образом число разрядов до 2-х после точки, которые не нужны. Т.е. можно вещественные числа хранить как целые, двигая десятичную точку, и оперировать с ними так же быстрее, где нет встроенной в проц вещественной математики. Но разрядами, т.е. умножая и деля на 10 .
f33net, лайк и в догонку пару комментов 1. Количество перезаписей у EEPROM хоть и ограничено, но очень велико, и если не писать что-попало ради того, чтобы что-то писать, то встроенной в контроллер хватит на всегда. 2. Если писать все таки реально приходится что-то часто, например некий лог, который необходимо сохранить даже в случае перезагрузки до момента слива его куда-то, то организуйте алгоритм так, чтобы не писать в одну и туже ячейку все время, а циклически двигайтесь по всей памяти, в таком случае её хватит еще на более долгий срок. 3. иногда удобней использовать EEPROM вместо флешки для хранения долгих данных, например я так в одном проекте хранил html'ки для веб сервера на ЕСП. Но в таких экзотических случаях подумайте и взвесьте все за и против, и поймите .что скорей всего вам это не надо.
"организуйте алгоритм так, чтобы не писать в одну и туже ячейку все время, а циклически двигайтесь по всей памяти" // Как после перезагрузки узнать адрес для считывания? Если его хранить по постоянному адресу, то его придётся каждый раз обновлять, что приводит нас к тому, с чего начали.
Ну так сказано "разработайте алгоритм", он будет в каждом конкретном случае свой, опираться на свои задачи... Но вот пример одного из простых. Разделите всю память на блоки. Например пусть будет так... Есть у нас 16 КB, делим на блоки таким образом 64B (служебная) + 32 * (500B (данные) + 10B (служебная блока)) В общем служебном блоке записываем номер текущего рабочего блока, при этом выделяем байт в служебной блоке нашей страницы для учета, количества записей, при переполнении изменяем текущий блок на следующий. Дополнительно в данной случае можно реализовать дублирование информации в соседних блоках и проверку корректности сохранения. Это один из способов. В каждом случае нужно смотреть на то ,какие данные нужно сохранять. требования к надежности, объему этих данных, скорости работы и прочее...
Да, со знанием алгоритмов и логикой поле не пахано. :) Самый простой и универсальный: перед использованием обнуляем всю флэшку, первое слово - длинна записи + размер слова, R1:=0, читаем по адресу R1, , если 0, по адресу R1 последняя запись, иначе прибавляем к R1 прочитанное и переходим к "читаем по адресу R1". Запись - аналогично, но когда R1+размер блока данных вылазит за размер флэшки, обнуляем флэшку и R1. И ещё раз: флешка не для пиления её часто меняющимися данными. А 100 000 циклов это каждую минуту непрерывно писать 3 года в одно место.
Здравствуйте, помогите решить такую задачу: Есть необходимость на платформе Arduino по команде (внешняя кнопка - например) включить шаговый двигатель. После выполнения заданного числа оборотов (1000) остановить его и включить второй шаговый двигатель с аналогичной задачей (допустим 2000 оборотов)и стоп. После получения второй команды программа отрабатывает все в обратном порядке. Сначала второй мотор 2000 оборотов в обратном направлении, затем первый 1000 оборотов в обратном направлении. Нужен скетч программы, по возможности с подробными комментариями, так-как ваш покорный слуга сущий чайник в программировании С уважением и надеждой.
Как говорил товарищ Бендер: "Я бы взял по частям, но мне нужно сразу". Что в моем случае означает - написал бы, да не умею. Поэтому и обратился к Вам.😶
xn--18-6kcdusowgbt1a4b.xn--p1ai/%D1%88%D0%B0%D0%B3%D0%BE%D0%B2%D1%8B%D0%B9-%D0%B4%D0%B2%D0%B8%D0%B3%D0%B0%D1%82%D0%B5%D0%BB%D1%8C-%D0%B0%D1%80%D0%B4%D1%83%D0%B8%D0%BD%D0%BE/ здесь для начала найдите меня в vk там пишите
Это что, прикол? Во-первых, hex - 16-ричное, а не двоичное. Во-вторых, о формате дробных чисел уже в школе рассказывают. Открою Вам гигантскую тайну: бывают еще и отрицательные числа. В школу, господа, в школу!
Здравствуйте. Заранее извиняюсь за возможно глупый вопрос.А есть ли возможность соединения нескольких модулей памяти друг с другом, тем самым увеличив общий объем энергонезависимой памяти. А далее вести запись или считывание уже с объединенной памяти?
Да, конечно. Чипы памяти подключаются параллельно , только пины EN от каждого чипа подключаются по отдельности. Активирую тот или иной пин EN вы задаёте в какую микросхему будет производится запись или чтение
У них совершенно разное назначение. Как бы не корректно сравнивать одно с другим. Правильно сравнивать SD и SPI FLASH. Я пробовал, но особой разницы не заметил.
Да, можно. Вот пример: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-ShnyOOcfbhc.html В этом видео я подключал дисплей и выводил на него несколько тестовых картинок
А чем отличаются 24с32 , 24с64, 24с128, 24с256, 24с512, кроме объема? Почему АТМЕЛ разделил эти модели по разным даташитам, ведь эта библиотека походу поддерживает все эти модели, все они с 16 битной (2-х байтовой) адресацией памяти, не подойдет эта библиотека только для 24с01-24с16 (эти 8 битную адресацию памяти имеют).
Даже и не знаю. Приходит на ум только две вещи: разное время производства (может у них разная структура?). Ну и разные производители. ST тоже производит такие же EEPROM
Хмм, а в чем вообще преимущество внешней ЕЕПРОМ, ведь можно просто микроСД карту использовать и хранить данные там. Ну разве что ЕЕПРОМ юзает i2c а микроСД SPI вроде.. но если выбирать между микроСД и ЕЕПРОМ, какие факты есть для перевеса в сторону внешней ЕЕПРОМ?
Между ними очень большая разница. Micro SD в первую очередь это хранилище файлов, а EEPROM - хранилище переменных. Это можно сравнить с компьютером. Жесткий диск - SD, а оперативка - EEPROM. Хотя такое сравнение тоже не совсем верное. EEPROM тоже предназначена для хранения информации. Но только переменных. На пример, у вас есть переменная х, которая = 211. Вы просто задаете адрес в EEPROM и туда эту переменную записываете, для сохранности. Потом (опять же) обратившись только к адресу EEPROM, можно назад получить значение переменной. Да, можно сохранять переменные и на флешку, но для этого нужно создать файл, открыть его для записи, записать переменную (при этом обязательно нужно знать сколько байт эта переменная занимает, но это верно и для EEPROM), закрыть файл. Потом, при восстановлении переменной, открыть файл, считать именно столько байт, сколько нужно, перевести считанные байты в значение переменной.... Зато работа с файлами и папками на флешке идет без проблем, а вот на EEPROM создать файловую систему не получится. Вообще рекомендую почитать на эту тему что-нибудь. Слишком много между ними отличий чтобы я смог их все перечислить. Еще одно отличие: EEPROM имеет очень "мало" памяти. 8 килобайт считается много. Сохранить картинку не получится. А вот переменных можно сохранить аж 8 тысяч! Ну а какой объем у флешек, думаю вы и сами знаете.
@@UCanDo благодарю за весьма подробный ответ! Примерно понятно, у ЕЕПРОМ доступ быстрее будет осуществляться, хотя смотря для каких целей.. скажем, прочитать настройки/опции при запуске системы такая разница в скорости наверное не критична.. другое дело если попытаться ее использовать как "оперативную память".. кстати.. отсюда вытекает такой вопрос - а есть ли вообще возможность как-то добавить оперативной памяти микроконтроллеру? Мне тут где-то в комментах попалось что-то про SPI Flash, потом я стал искать на Ютубе это, попалось Serial Flash, там рассказывалось что можно к МК подключить такой модуль и можно во время работы программы пользоваться этой памятью как если бы она была обычной встроенной оперативной, т.е. создавать переменные, обращаться к ним, как я понял это без дополнительных усилий типа специального обращения к чипу в коде.. возможно ли что-то такое на АТмега или тех же ESP32 STM32? Или же это совсем другое что-то.. в общем можно ли как-то добавить ОЗУ и при этом свободно ею пользоваться, чтобы скажем то же создание массива byte x[1000]; автоматически черпало память из дополнительного чипа?
Чтобы считать EEPROM нужно подключаться на прямую к микросхеме. Проблема заключается в том что при подаче питания на плату могут быть задействованы другие узлы устройства, которые займут шину данных EEPROM, из-за чего считать содержимое микросхемы не получится. Именно по этому EEPROM выпаивают и считывают отдельно на программаторе. В остальных ситуациях все крайне индивидуально. И зависит от схемотехники устройства. Но в любом случае содержимое EEPROM должно считываться на прямую при помощи программатора.
@@UCanDo С программатором проблем считать нет. Проблема в том, что корпус может быть не SOIC8, а BGA или TSSOP и ты уже её не зажмёшь... При этом мне нужно к примеру считать данный в конкретной ячейке. Что бы МК не дёргался и не занимал шину, полагаю надо прижать его ресет к земле, что бы он не дёргался... Я просто даже не знаю с чего начать в данном случае, никакой толковой инфы нет...
Есть переходники. EEPROM напаивается на переходник. А дальше обычное чтение через программатор. По схеме вам ничем не подскажу. Так каких-то крайне ситуативно.
А как организовывать быстрый поиск 10значных десятичных чисел по всему размеру памяти ? (понятно что там другой формат) Я самим принципом поиска интересуюсь. Но именно шустрого поиска.
Интересную задачку вы задали. Первый вопрос: в чем именно искать будете? В ОЗУ или в EEPROM? Относительно того как искать в ОЗУ, не подскажу, так как надо знать как она устроена, а я это уже забыл... EEPROM разделена на ячейки. Каждая хранит 1 байт, то есть 256 значений. Для хранения переменных Long Integer и Float используется 4 ячейки, то есть 4 байта. Для поиска переменной конкретной длинны вам нужно знать адреса начала всех переменных и сколько байт они занимают. Потому как 4 случайные ячейки могут содержать: - 4 разных переменных по 1 байт - или 2 переменные по 2 байта - или 2 переменные по 1 байт и 1 переменная 2 байта - или .... и так далее... Зная начало и длину можно пробегаться по ним, считывать, сравнивать с искомыми параметрами, считывать дальше... Без знания начала и длинны переменных искать ничего не получится.
Home Made - В епром нужно искать. Будут туда писаться 10значные десятичные цыфири, и потом в такой себе базе нужно быстренько сравнить, есть заданный или нету.
union позволяет объявить вместе структуру данных и одновременно массив из байтов в одном и том же месте памяти. Для работы с данными обращаемся к структуре, а для чтения-записи всего блока вместе - к массиву байт. Можно и через указатели, но так тоже можно.
На сколько я знаю, EEPROM можно прочитать только по ячейкам. А значит, нужно создать цикл, в котором поочередно будут читаться ячейки. А дальше записывать считанные данные в новую EEPROM
Ссылка рабочая. Только что проверил. Если открываете ссылку на телефоне или планшете, то иногда такое наблюдается. Попробуйте открыть ссылку на компьютере.
Добрый день. Ссылка работает. Только что проверил. Замечено что мобильные устройства (телефоны, планшеты) часто некорректно обрабатывают ссылки. По этому лучше открывать их с компьютера.
Сканер видит 24C04 и 24C16, не с одним, а с множеством адресов Сканер I2C eeprom AT24C04 Scanning... I2C device found at address 0x50 ! I2C device found at address 0x51 ! done ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-6cni_zKOsqA.html Сканер I2C eeprom AT24C16 Scanning... I2C device found at address 0x50 ! I2C device found at address 0x51 ! I2C device found at address 0x52 ! I2C device found at address 0x53 ! I2C device found at address 0x54 ! I2C device found at address 0x55 ! I2C device found at address 0x56 ! I2C device found at address 0x57 ! done ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-wOxwScntD_E.html Подскажите пожалуйста, как решить эту проблему или киньте ссылку где можно об этом узнать.
Нет, должна открыться в браузере страница с возможностью скачать файл. Это общедоступный ресурс. Попробуйте в другом браузере. Может у вас проблема с какими-то блокировщиками, или антивирусом.
@@UCanDo слушай, ну тогда подскажи как с компа через какой браузер качать? все мне известные выдают ошибку 404, тоже самое после формата ц и установки чистой системы. как черт побери у тебя работает эта ссылка?
Странно, у меня открывается. Пробую в Хроме. Только что проверил, в Опере ссылка не открывается (тоже 404). Раньше работало. Несколько дней назад изменилась политика предоставления услуг Гугла, может это как-то повлияло. Архив перезалил. У меня открывается во всех браузерах. Так же дублирую ссылку здесь: drive.google.com/open?id=1l99bhLMaMlG-IKiN5CK7zrPUeQ__8aQJ
Посмотрите это видео: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-S8cbIllYc1I.html Создаете нужную картинку, получаете массив вида: static unsigned char gImage_1[] U8G_PROGMEM = {0x00,0x00,0x00,............} Где каждая точка представлена в виде 0x00 Создаете скетч, с картинкой. Этот скетч "по точечно" сохранит картинку в EEPROM. Потом в пишите новый скетч в котором будет функция считывания картинки прямо с EEPROM
Для этого нужно число разбить на две части, старший и младший байты, и каждый байт сохранять отдельно. По этому для сохранения int понадобится две ячейки EEPROM. Немного позже приведу пример кода
Работает. Просто стандартные команды записи и чтения замените на команды записи и чтения для внешней памяти: Вместо EEPROM.update напишите: eeprom.writeByte EEPROM.read замените на: eeprom.readByte