Гость Игорь Плессер Опубликовано 17 февраля, 2017 Поделиться Опубликовано 17 февраля, 2017 Доброго времени суток! Делаю библиотеку для расширения возможностей EEPROM!Помогите в создании, идеями, мыслями, предложениями и всем в этом роде! Планирую добавить: -Чтение\запись отдельных битов; -Возвращение размера EEPROM(в байтах); -Возвращение размера отдельной строки в памяти EEPROM(в байтах); -Возвращение размера незанятой памяти EEPROM(в байтах, но желательно КБ); -Вывод\ввод данных EEPROM по UART/SPI/I2C(взаимодействие 2x EEPROM); -Чтение\запись STRING/HEX/BIN; -Еще хочу реализовать хранение символьных картинок типа(если возможно): //////////////////////////////////////////////////////////////////////////////////////////////////////// //#####//#####//####//####//#####//#////#//#////////////////////////#//////// //#//////////#//////////#////#//#////#//#//////#//#/#/#//#//////////////#////////#//////// //#####//#####//####//####//#//////#//#////#//#//////////###////////###//// //#//////////#//////////#////////#//#////#//////#//#////#//#//////////////#////////#////#// //#####//#####//#////////#///#///#####//#////#//#####//#####//#//##//// //////////////////////////////////////////////////////////////////////////////////////////////////////// Здесь написано EEPROMLib! -Ваши идеи,мысли,предложения! Всех кто будет содействовать(т.е. портиртировать из интернета или предлагать свои рабочие процедуры\функции и т.п.) созданию библиотеки запишу в начале библиотеки ник\имя,как человека\людей содействовавших\помогавших в создании библиотеки EEPROMLib! P.S. Сильно не ругайте!За то что по пустякам дергаю! 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mvkarp Опубликовано 17 февраля, 2017 Поделиться Опубликовано 17 февраля, 2017 Интересно, а то, что Вы желаете возвратить сама ЕЕПРОМ отдаст? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
artos5 Опубликовано 17 февраля, 2017 Поделиться Опубликовано 17 февраля, 2017 Отдаст , только надо уметь "просить" у нее )) 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Гость Игорь Плессер Опубликовано 17 февраля, 2017 Поделиться Опубликовано 17 февраля, 2017 А если серьёзно? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 17 февраля, 2017 Поделиться Опубликовано 17 февраля, 2017 Ну это все можно реализовать , только зачем?:) 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Игорь Плессер Опубликовано 17 февраля, 2017 Поделиться Опубликовано 17 февраля, 2017 (изменено) Хочу статью написать, ну и чтобы проще было работать с EEPROM)) вот наброски кода: unit EEPROMLib; uses AADL; var maxValue:integer; function EEPROM_WriteText(address:integer;var text:string[23]):boolean; function EEPROM_ReadText(address:integer):string[23]; procedure EEPROM_Clear(); function EEPROM_GetSize():integer; implementation function EEPROM_WriteText(address:integer;var text:string[23]):boolean; var dat:integer; begin dat:=Str2Int(text); if EEPROM_Read(address) = 0x00 then begin EEPROM_Write(address,dat); end else result:=false; if EEPROM_Read(address) = dat then begin result:=true; end else result:=false; end; function EEPROM_ReadText(address:integer):string[23]; var i,dat:integer; text:string[23]; begin dat:=EEPROM_Read(address); Int2Str(dat,text); result:=text; end; procedure EEPROM_Clear(); var i:integer; begin i:=0x06; repeat EEPROM_Write(i,nil); i:=i+0x01; until i = maxValue; end; function EEPROM_GetSize():integer; var i,dat:integer; begin i:=0x00; repeat EEPROM_Write(i,0xFF); dat:=EEPROM_Read(i); EEPROM_Write(i,nil); i:=i+0x01; until dat = nil; i:=i-0x01; result:=i; maxValue:=i; end; end. Сейчас работаю над функцией EEPROM_GetSize Изменено 17 февраля, 2017 пользователем Игорь Плессер 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ARV Опубликовано 17 февраля, 2017 Поделиться Опубликовано 17 февраля, 2017 Вы работаете на паскале с AVR? Тогда ваше желание улучшать "библиотеки" для работы с EEPROM понятно. Во всяком случае при работе с avr-gcc лично я делал "библиотеку" только для узкоспециализированного применения, а именно для обеспечения легкого перехода от встроенной EEPROM к внешней EEPROM I2C. Думаю, и вам стоит подумать об этом: внутренняя EEPROM маленькая и ресурс ее небольшой. 0 Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют... Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 17 февраля, 2017 Поделиться Опубликовано 17 февраля, 2017 На Паскале писать для avr - это пипец .. Да еще компилятор кривой ( когда то немного пробовал на нем). Лучше изучайте си . 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Игорь Плессер Опубликовано 17 февраля, 2017 Поделиться Опубликовано 17 февраля, 2017 Я конечно против си не чего не имею!Даже пробовал пару раз, но не задалось как то...Спасибо за советы) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dm37 Опубликовано 17 февраля, 2017 Поделиться Опубликовано 17 февраля, 2017 27 минут назад, Игорь Плессер сказал: Сейчас работаю над функцией EEPROM_GetSize для eeprom в IAR есть такой код (iom32.inc) /* Constants */ #define RAMEND 0x085F /*Last On-Chip SRAM location*/ #define XRAMEND 0x085F #define E2END 0x03FF #define FLASHEND 0x7FFF #define FLASH_PAGE_SIZE 0x80 #define EEPROM_PAGE_SIZE 0x04 возможно, что-то есть и у вас в паскале 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Игорь Плессер Опубликовано 17 февраля, 2017 Поделиться Опубликовано 17 февраля, 2017 (изменено) Сделал!!! function EEPROM_GetSize():integer; var i,dat:integer; str,t,s:string[4]; begin EEPROM_Write(0xD3,0x00); EEPROM_Write(0x00,0xFE); i:=1; repeat dat:=EEPROM_Read(i); i:=i+1; until dat = 0xFE; i:=i-1; result:=i; maxValue:=i; end; Пример на фото!Выдает точное значение! Принцип работы: Записывает в нулевой регистр значение а точнее FE, потом перебирает значения в EEPROM которые все равны нулю, цикл пока считает количество "просмотренных" битов, когда биты заканчиваются(конец EEPROM) он перебрасывает на начало т.е. на нулевой регистр где у нас записано FE так как у нас условие выхода из цикла, выходим из него, убираем лишний бит и присваиваем результат!!! Изменено 17 февраля, 2017 пользователем Игорь Плессер 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Игорь Плессер Опубликовано 18 февраля, 2017 Поделиться Опубликовано 18 февраля, 2017 Реализовал еще 3 функции: -Чтение бита; -Запись бита; -Возвращение свободной памяти EEPROM; Вот собственно код: //Записывает бит function EEPROM_WriteBytes(address:integer;dat:integer):boolean; begin if (dat <= 255) and ((address <= maxValue) or (address <>0)) then begin EEPROM_Write(address,dat); result:=true; end else begin result:=false; end; end; //Считывает бит function EEPROM_ReadBytes(address:integer):integer; var dat:integer; begin if (address <= maxValue) or (address <> 0) then begin dat:=EEPROM_Read(address); result:=dat; end else begin result:=0; end; end; //Возвращает доступное место EEPROM в битах function EEPROM_GetFreeSize():integer; var i,dat,j:integer; begin i:=1; j:=1; repeat dat:=EEPROM_Read(j); if dat = 0 then i:=i+1; j:=j+1; until j = maxValue; result:=i; end; 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dm37 Опубликовано 18 февраля, 2017 Поделиться Опубликовано 18 февраля, 2017 10 часов назад, Игорь Плессер сказал: Принцип работы: Записывает в нулевой регистр значение а точнее FE, потом перебирает значения в EEPROM которые все равны нулю, цикл пока считает количество "просмотренных" битов, когда биты заканчиваются(конец EEPROM) он перебрасывает на начало т.е. на нулевой регистр где у нас записано FE так как у нас условие выхода из цикла, выходим из него, убираем лишний бит и присваиваем результат!!! обычно пустое пространство eeprom заполнено значением 0xFF (вы проверяете пустоту по 0x00) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Игорь Плессер Опубликовано 18 февраля, 2017 Поделиться Опубликовано 18 февраля, 2017 Я это заметил!Уже исправил! Есть еще идеи что добавить в библиотеку? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dm37 Опубликовано 18 февраля, 2017 Поделиться Опубликовано 18 февраля, 2017 46 минут назад, Игорь Плессер сказал: Есть еще идеи что добавить в библиотеку? Я всегда пишу в eeprom контроллера с проверкой содержимого, т.е. если я хочу записать байт 0x55, а в ячейке уже находится это значение, то запись не производится. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Игорь Плессер Опубликовано 18 февраля, 2017 Поделиться Опубликовано 18 февраля, 2017 Хорошая мысль!Спасибо! 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dm37 Опубликовано 18 февраля, 2017 Поделиться Опубликовано 18 февраля, 2017 //============================================================================== // Запись uint8 в EEPROM с проверкой содержимого ячейки // входные значения: // uint16 addr - адрес ячейки // uint8 data - данные для записи //============================================================================== void EData_WriteInt8(uint16_t addr, uint8_t data) { if(EEPROM_Read(addr) != data) EEPROM_Write(addr,data); } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Игорь Плессер Опубликовано 18 февраля, 2017 Поделиться Опубликовано 18 февраля, 2017 if EEPROM_Read(address) <> dat then //Ìûñëü dm37 begin EEPROM_Write(address,dat); end; 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dm37 Опубликовано 18 февраля, 2017 Поделиться Опубликовано 18 февраля, 2017 (изменено) а вообще правильно вам сказали, что язык Си будет предпочтительней, да и ваша библиотека будет белее востребована начинающими И хочу сказать немного в поддержку C++. Те кто говорит, что C++ расточителен скорее всего это где-то прочитали, а сами так и не проверили, сейчас уже известны приёмы и ограничения использования C++ для микроконтроллеров. Вот небольшой мой пример работы с С++ (ATmega32): #include "mcu\mcu.h" #include "mcu\TFlag.h" #include "mcu\TFlags.h" #include "mcu\TCounter.h" using namespace MCU; //----- Флаги ------------------------------------------------------------------ typedef TFlags<1> Flags; // один флаг (количество флагов зависит от объёма RAM) typedef TFlag<Flags, 0> FCounter_100ms; // флаг 0 в регистре Flags (FCounter_100ms - имя флага для дальнейшего использования) //----- Прочее ----------------------------------------------------------------- typedef TCounter<100, FCounter_100ms> Counter_100ms; // счётчик прерываний на 100 (для работы необходим один флаг (FCounter_100ms)) //----- Периферия -------------------------------------------------------------- typedef TTimer0_SimpleCycle <TTimerTime<1>::ms> Timer_0; // таймер 0 на 1ms typedef TTimer1_SimpleCycle <TTimerTime<5>::ms> Timer_1; // таймер 1 на 5ms typedef TTimer2_SimpleCycle <TTimerTime<500>::us> Timer_2; // таймер 2 на 500us //============================================================================== // Прерывание таймера 0 по сравнению //============================================================================== #pragma vector = TIMER0_COMP_vect __interrupt void InterruptTimer0(void) { Counter_100ms::Tick(); } //============================================================================== // Прерывание таймера 1 по сравнению //============================================================================== #pragma vector = TIMER1_COMPA_vect __interrupt void InterruptTimer1(void) { } //============================================================================== // Прерывание таймера 2 по сравнению //============================================================================== #pragma vector = TIMER2_COMP_vect __interrupt void InterruptTimer2(void) { } //============================================================================== // //============================================================================== void main(void) { Timer_0::Init(); // инициалицация Timer_0::Start(); // запуск Timer_1::Init(); Timer_1::Start(); Timer_2::Init(); Timer_2::Start(); Counter_100ms::Init(); // инициализация счётчика TWDT::Enable(); // влкючение сторожевого таймера _SEI(); while(1) { TWDT::Reset(); // сброс сторожевого таймера if(Counter_100ms::Checked()) // проверка флага "прошло 100ms" { // действия каждые 100ms Counter_100ms::Reset(); // сброс флага "прошло 100ms" (мне так необходимо по алгоритму) } } } Если попытаетесь использовать количество флагов больше чем определено, то на уровне компиляции будет ошибка. Все расчёты значений для регистров таймера, производятся на уровне компиляции. Если вы задали значение времени, а на данном таймере это реализовать нельзя, то на уровне компиляции будет ошибка. Добавление нового флага производится так: typedef TFlags<2> Flags; // увеличиваем количество флагов на 1 typedef TFlag<Flags, 0> FCounter_100ms; typedef TFlag<Flags, 1> FCounter_200ms; // добавляем новый флаг никаких дефайнов Размер используемой памяти (IAR, speed) 370 bytes of CODE memory (+ 44 range fill ) 66 bytes of DATA memory (+ 14 absolute ) По RAM нет перерасхода ни на один байт По Flash соизмерим с кодом на Си (зависит от оптимизации) Причём это работает и на ATtiny2313 Конечно необходимо реализовать классы, позволяющие это делать, но то что в них находится и так приходится писать, только немного иначе Изменено 18 февраля, 2017 пользователем dm37 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Игорь Плессер Опубликовано 18 февраля, 2017 Поделиться Опубликовано 18 февраля, 2017 Я не говорю что СИ расточителен, просто каждый пишет на том что знает!Я пробовал писать на СИ, но потом бросил!Вот недавно скачал CODEVISIONAVR, просто никак начать не могу) А библиотеки на паскаль я делаю для расширения функционала самого mP, чтобы тем кто не может писать на СИ было легче на более легком языке! P.S. я не критикую СИ потому что сам хочу на него перейти, так как у него больше возможностей! Вообще эту библиотеку я делаю для статьи на сайте, а то там про EEPROM почти ничего нету! 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dm37 Опубликовано 18 февраля, 2017 Поделиться Опубликовано 18 февраля, 2017 19 минут назад, Игорь Плессер сказал: Я не говорю что СИ расточителен я писал про C++, но ваша работа, думаю, тоже важна для тех кто работает на паскале, тем более в виде статьи 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Игорь Плессер Опубликовано 18 февраля, 2017 Поделиться Опубликовано 18 февраля, 2017 Кстати а в чем различие C, C+ и C++? Помогите с реализацией передачи данных EEPROM по SPI\I2C(скиньте кусок кода хотя бы на С++, я попробую разобратся). 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dm37 Опубликовано 18 февраля, 2017 Поделиться Опубликовано 18 февраля, 2017 есть С и C++ C++ создан на базе C, но является объектно-ориентированным языком программирования (добавлены элементы ООП). Лучше почитайте и интернете https://www.google.ru/?gfe_rd=cr&ei=gvSnWOChDMb68Aeb6ZbABA&gws_rd=ssl#newwindow=1&q=с+с%2B%2B+отличия 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Игорь Плессер Опубликовано 18 февраля, 2017 Поделиться Опубликовано 18 февраля, 2017 Хорошо спасибо! Как думаете этих функций хватит на первое время? т.к. потом по возможности библиотека будет дорабатываться... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dm37 Опубликовано 18 февраля, 2017 Поделиться Опубликовано 18 февраля, 2017 можно, кроме чтения однобайтового зачения (byte), добавить функции чтения/записи ShortInt, Word, Integer, LongInt, Real, Single, Double, Extended, Comp (может ещё что в паскале есть) //============================================================================== // Запись uint16 в EEPROM с проверкой содержимого ячейки // входные значения: // uint16 addr - адрес ячейки // uint16 data - данные для записи //============================================================================== void EData_WriteInt16(uint16_t addr, uint16_t data) { uint8_t byte_h = HIGH(data); uint8_t byte_l = LOW(data); if(EEPROM_Read(addr) != byte_h) EEPROM_Write(addr, byte_h); if(EEPROM_Read(addr+1) != byte_l) EEPROM_Write(addr, byte_l); } 1 час назад, Игорь Плессер сказал: Помогите с реализацией передачи данных EEPROM по SPI\I2C(скиньте кусок кода хотя бы на С++, я попробую разобратся). скорее всего придётся ориентироваться на конкретную микросхему, например, одним способом подключить все микросхемы серии 24 (i2c) не получиться (есть особенности работы микросхем разных производителей). Существуют разные серии работающие по SPI, существуют разные режимы работы SPI. Ну и так далее.. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.