запись во внешнею EEPROM
- Войдите на сайт для отправки комментариев
Сб, 03/03/2012 - 23:31
КАК записать данные во внешний eeprom ? Я использовал вот этот скрипт, однако он выдаёт ошибку: строка 12 символ 1 файл не найден Информацию брал отсюда: timewitharduino.blogspot.com/2009/06/storing-strings-in-eeprom-byte-by.html
01 Const ForReading = 1 02 Const ForWriting = 2 03 04 '------------------------------------------------------------------------- 05 ' open USB serial port (COMx); 06 ' 07 ' If the serial monitor in Arduino IDE is open, you will get an "access denied" error. 08 ' Just make sure that the serial monitor is closed (so bytes are not sent by the arduino board). 09 '------------------------------------------------------------------------- 10 11 Set fso = CreateObject("Scripting.FileSystemObject") 12 Set com = fso.OpenTextFile("COM7:9600,N,8,1", ForWriting) 13 14 15 '--------------------------------------------- 16 ' read content of text file line by line; 17 ' write line to COMx; 18 '--------------------------------------------- 19 20 Set objFSO = CreateObject("Scripting.FileSystemObject") 21 Set objFile = objFSO.OpenTextFile("C:\arduino\arduino-0018\libraries\BookClock\quotes.txt", ForReading) 22 23 MsgBox("Ready to write file content to COM") 24 25 Do While objFile.AtEndOfStream <> True 26 '------------------------------------------------------------------------ 27 ' read 10 characters at a time; arduino serial buffer cannot take more than 32 characters; 28 ' writing a character to eeprom takes about 11 ms (assuming that there is no serial.prints in the loop); 29 ' therefore, after each batch of 10 chars sent to COM, we should wait no less than 110 ms; 30 ' we use 200 to have a margin of safety; 31 '------------------------------------------------------------------------- 32 strChars = objFile.Read(10) 33 com.Write(strChars) 34 WScript.Sleep(200) 35 Loop 36 37 38 objFile.Close 39 com.Close() 40 41 MsgBox("Finished writing to COM")
Ну , во первых если бы вставили нормально, без мусорной нумерации строк легче было-бы читать.
Во вторых, по вашей сылке этого сприпта нет. Так что брали вы его "откуда-то еще" (скорее всего из более ранних статей).
В третьих. Это именно скрипт, а не скетч. Судя по всяму на VBScript. Так что нигде кроме на на большом комьютере вы его запустите. Да и то - только под виндой.
К "ардуине" он имеет очень далекое отношение. Фактически вообще никакого. ОН просто берет файл quotes.txt и малыми порциями отправляет его в com-порт.
Если на этом порте будет висеть ардуина (или что-то другое), и будет что-то делать с принимаемыми данными, и что будет делать - скрипт совершенно не знает.
А вот в ссылке что вы дали (кстати ссылки лучше вставлять как ссылки), похоже и есть ардуино-скетч, который "слушает" на другом конце провода. Принимает эти данные и сохраняет в EEPROM
timewitharduino.blogspot.com/2009/05/getting-arduino-to-write-to-or-read.html вот правильная ссылка
Ну, так а в чем вопрос-то?
По этой ссылке видим два VB скрипта. Один умеет принимать данные из ком-порта (арудины) и записывать их в файл, второй - наоборот. Брать данные из файла и запихивать их в ком-порт.
Оба предназначены для запуска НА КОМПЬЮТЕРЕ, причем только под windows. Не на ардуино. ArduinoIDE, естественно, на попытку их компиляции будет кричать как беременный лось в теплую погоду. Потому что и "язык не тот" и "платформа не та".
Для записи с в EEROOM вам нужно смотреть, все-таки, на ссылку из вашего первого поста. Там есть скетч (то есть то, что запускается на ардуине), который принимает данный из ком-порта и сохраняет их в EEROOM.
спасибо , буду дома попробую
Вот , что есть:
Однако при запуске скрипта выходит ошибка , хотя порт указан верно и отключен serial mnonitor, в чём может быть проблема непонятно ?
s002.radikal.ru/i197/1203/1a/746018d60111.jpg
Вот скетч , который прописан в Arduino:
а вот Тот, что используется VBscript:
Ну саму ошибку можно перевести как "отказ в доступе к ком-порту".
У вас ардуина висит именно на COM6?
Я попробовал выполнить этот vb-скрипт (скет в ардуину не залиливал, просто пустил скипт) - скрипт отработал нормально.
Ошибок не выбил. Но запускал я его имея права администратора.
Направление в которых стоит покопать:
Возможно вы работате под пользователем у которого в настройках секьюрности запрещено VB-скрипту образатся к ком-портам. Попробуйте "стать админом" (если заработает, тогда уже будете искать "конкретно эту настройку").
Можно попробовать работать с ком-порте не через объект файловой системы. Гугл говорит что можно еще юзать Set comPort = CreateObject("MSCommLib.MSComm")
Убедится что ком-порт точно "никто не держит". Перегрузить машину, ArduinoIDE не запускать. Сразу пустить скрипт.
Проверить (и выключить) если есть какой-то сторонний софт работающий с портами "блютуз-менеджеры", какие-нибудь софт для мобилок и т.п. Вещи типа com0com (эмулятор виртуального нуль-модемного кабеля - от точно дается такую ошибку), всякие "виртуальные com-порты и т.п.
Плюнуть и попытатся, вместо VBScript использовать что-то более современное, типа powershell (то что Microsoft продвигает на смену VBScript). Примерно так blogs.msdn.com/b/powershell/archive/2006/08/31/writing-and-reading-info-from-serial-ports.aspx
leshak спасибо Вам огромное , за столь подобные разъяснения . Вообщем-то всё получилось , в EEPROM удалось записать. Правда сказать на моём ноуте это по какой-то причине сделать не получилось , а вот с стационара всё в норме. Ещё раз спасибо Вам !
Правда сказать на моём ноуте это по какой-то причине сделать не получилось , а вот с стационара всё в норме.
Может на ноуте порт другой юзаете? Посмотрите в Device Manager ТОЧНО на каком порту висит ардуина в данный момент. Они иногда "мигрирует по портам" (в другой USB воткнули, номер был кем-то занят и т.п.)
Ну и это опять подводит к вопросу " а не мешает ли какой-то блютус софт встроенный" (на ноутах он чаще бывает). Попробуйте выключить синезуб. Кстати при этом и ArduinoIDE при заходе в меню Tools будет меньше тормозить. Блютус софт часто создает килограмм ком-портов, и она их все, на всякий случай опрашивает.
Сейчас заметил такую особенность Arduino Duemilanove у меня весит на com4 , так вот в неё нормально шьётся , даже на ноуте, а вот UNO весит на COM6 , вот его не видит данный скрипт. Видимо он действительно занят чем-то ещё
Подниму тему. Я использую память 24C256. Проблема в том что в одну ячейку память можно записать только один байт. То есть число до 255. А мне нужно записывать числа до (скажем) 1023. Как мне это сделать! Здесь есть код ПРИМЕР. Я ничего из него понять не могу. Особенно ту часть кода где устанавливается адрес ячейки. Помогите!!!!!
У меня есть идея скрестит два кода
1 сам пример работы с памятью
2 пример работы с памятью мк.
Для выполнения записи "главная" строка эта: 57 i2c_eeprom_write_page(0x50, 0, (byte *)somedata, sizeof(somedata)); // write to EEPROM.
1й аргумент так и оставляем, 2й - наша переменная с инфрмациаей, 3й - "длина" нашей переменной,
можно еще разбить нашу информацию на байты и писать при помощи этого: 05 i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ), но тут вроде как надо будет сдвигать адрес eeaddress в памяти, куда пишем.
2й пример - это развитие первого, просто он пишет int в два байта, как 1й пример.
С адресами нет ничего сложного, адрес 1й ячейки и адрес 2й = адрес 1 + 1. А вот превращение содержимого 2ух ячеек в int интереснее: return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00); Сдвиг превращает байт в инт, а т.к. места в байте меньше, то и храним инт в 2ух байтах, стрший и младшие разряды.
Вот что у меня получилось. Код вроде рабочий. Проверил на нескольких числах (1;243;1234). Всё работает))))
Возможно ли как то оптимизировать код?
Надо взять на заметку.
А если сравить библиотеки для работы с SD картами и eeprom, какая жирнее? Как я понял, eeprom выигрывает в скорости чтения/записи, а еще в чем сладости?
И еще: у кого, у eeprom или sd ресурс жизни (циклов записи/чтения) меньше?
Хотя, сравнивать библиотеки wire и sd - мувитон...Wire универсальна, с sd не сравнить.
так же озадачился сохранением некоторых данных в EEPROM
но ресурс встроенного где то читал всего 100000
какие варианты будут оптимальнее для хранения десятка байт?
1. внешний EEPROM
2. подключить модуль RTC (часы) и туда сохранять
3. следить за питанием и чуть что сохранять во встроенный EEPROM
4. SD флешка
EEPROM все-таки будет намного проще. Как ни крути - а именно для таких задачь он и предназначен. Смысл вам беречь его ресурс если вы использовать его не собираетесь :) ?
Или вы планируете "ну очень активно его использовать"? К тому же данных-то у вас не так уж и много планируется (насколько я понимаю про шторы речь идет). Вы же не будете ими ездить туда/сюда целыми днями. Посчитайте за сколко времени вы выюзаете ячейку.
К тому же - можно "чередовать их" (раз данных немного). Один день одну, другой - другую... и т.п.
Плюс. Можно не писать при каждом изменении. А повесить конденсатор который даст несколько милесекунд проработать ардуине при отключении питания. Которых хватит запомнить в EEPROM текущие состояние. Тогда ресурс будете расходовать только при "пропало питание". Или батарейку небольшоую присобачить. Именно для "аварийного питания на несколько мгновений".
К тому же - можно "чередовать их" (раз данных немного). Один день одну, другой - другую... и т.п.
Реализовав таким образом маленкую SD-карточку. Которая, по сути своей, та же flash/eeprom/nand/nor...-память, с примерно тем же ограничением по числу циклов записи. Так что пункт 4 у вас избыточный.
Плюс. Можно не писать при каждом изменении. А повесить конденсатор который даст несколько милесекунд проработать ардуине при отключении питания. Которых хватит запомнить в EEPROM текущие состояние. Тогда ресурс будете расходовать только при "пропало питание". Или батарейку небольшоую присобачить. Именно для "аварийного питания на несколько мгновений".
Имя такой батарейке-конденссатору - ионистор.
Достаточно просто конденсатора. Поищите - есть в нете методики слежения за питанием. В контроллере, если мне не изменяет память, есть специальное прерывание для этого. Но придется существенно выйти за рамки IDE и писать на с.
Спасибо за комментарии, ближе к делу, как детельки получу, отпишусь о результатах :)
В контроллере, если мне не изменяет память, есть специальное прерывание для этого.
К сожалению, ни в табличке для ATMega328, ни в сводной (для всего семейства AVR) такой вектор не обнаруживается.
Если только аналоговым компаратором (ANALOG_COMP_vect) пожертвовать для этой цели... Но тогда необходимо иметь эталонное напряжение отключения.
пожалуй можно сделать небольшую схемку которая будет дергать за вывод на прерывании и так оптимизировать слежение за питанием
но с учетом, что питание не от батареи его можно не экономить и постоянно измерять в цикле - хотя это не красиво получится )
Да. Перепутал с другим контроллером. В общем случае, нужно контроллировать питание до стабилизатора, или, как вариант, запитать контроллер через диод с конденсатором. Вот здесь обсуждалось:
Как записать в EEPROM перед отключением питания (ветка на Радиокоте)
вопрос снят... была ошибка.