Перейти к содержанию

Делаю библиотеку для расширения возможностей EEPROM


Гость Игорь Плессер

Рекомендуемые сообщения

Гость Игорь Плессер

Доброго времени суток!

Делаю библиотеку для расширения возможностей EEPROM!Помогите в создании, идеями, мыслями, предложениями и всем в этом роде!

Планирую добавить:

-Чтение\запись отдельных битов;
-Возвращение размера EEPROM(в байтах);

-Возвращение размера отдельной строки в памяти EEPROM(в байтах);

-Возвращение размера незанятой памяти EEPROM(в байтах, но желательно КБ);

-Вывод\ввод данных EEPROM по UART/SPI/I2C(взаимодействие 2x EEPROM);

-Чтение\запись STRING/HEX/BIN;

-Еще хочу реализовать хранение символьных картинок типа(если возможно):

////////////////////////////////////////////////////////////////////////////////////////////////////////
//#####//#####//####//####//#####//#////#//#////////////////////////#////////
//#//////////#//////////#////#//#////#//#//////#//#/#/#//#//////////////#////////#////////
//#####//#####//####//####//#//////#//#////#//#//////////###////////###////
//#//////////#//////////#////////#//#////#//////#//#////#//#//////////////#////////#////#//
//#####//#####//#////////#///#///#####//#////#//#####//#####//#//##////
////////////////////////////////////////////////////////////////////////////////////////////////////////

Здесь написано EEPROMLib!

-Ваши идеи,мысли,предложения!

Всех кто будет содействовать(т.е. портиртировать из интернета или предлагать свои рабочие процедуры\функции и т.п.) созданию библиотеки запишу

в начале библиотеки ник\имя,как человека\людей содействовавших\помогавших в создании библиотеки EEPROMLib!

P.S. Сильно не ругайте!За то что по пустякам дергаю!

 

Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 59
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Гость Игорь Плессер

Хочу статью написать, ну и чтобы проще было работать с 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

Изменено пользователем Игорь Плессер
Ссылка на комментарий
Поделиться на другие сайты

Вы работаете на паскале с AVR? Тогда ваше желание улучшать "библиотеки" для работы с EEPROM понятно. Во всяком случае при работе с avr-gcc лично я делал "библиотеку" только для узкоспециализированного применения, а именно для обеспечения легкого перехода от встроенной EEPROM к внешней EEPROM I2C.

Думаю, и вам стоит подумать об этом: внутренняя EEPROM маленькая и ресурс ее небольшой.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

На Паскале писать для avr - это пипец .. Да еще компилятор кривой ( когда то немного пробовал на нем).

Лучше изучайте си .

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

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

возможно, что-то есть и у вас в паскале

Ссылка на комментарий
Поделиться на другие сайты

Гость Игорь Плессер

Сделал!!!

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;

Пример на фото!Выдает точное значение!

bandicam 2017-02-17 22-19-12-263.jpg

Принцип работы: Записывает в нулевой регистр значение а точнее FE, потом перебирает значения в EEPROM которые все равны нулю, цикл пока считает количество "просмотренных" битов, когда биты заканчиваются(конец EEPROM) он перебрасывает на начало т.е. на нулевой регистр где у нас записано FE так как у нас условие выхода из цикла, выходим из него, убираем лишний бит и присваиваем результат!!!

Изменено пользователем Игорь Плессер
Ссылка на комментарий
Поделиться на другие сайты

Гость Игорь Плессер

Реализовал еще 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;

 

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, Игорь Плессер сказал:

Принцип работы: Записывает в нулевой регистр значение а точнее FE, потом перебирает значения в EEPROM которые все равны нулю, цикл пока считает количество "просмотренных" битов, когда биты заканчиваются(конец EEPROM) он перебрасывает на начало т.е. на нулевой регистр где у нас записано FE так как у нас условие выхода из цикла, выходим из него, убираем лишний бит и присваиваем результат!!!

обычно пустое пространство eeprom заполнено значением 0xFF (вы проверяете пустоту по 0x00)

Ссылка на комментарий
Поделиться на другие сайты

46 минут назад, Игорь Плессер сказал:

Есть еще идеи что добавить в библиотеку?

Я всегда пишу в eeprom контроллера с проверкой содержимого, т.е. если я хочу записать байт 0x55, а в ячейке уже находится это значение, то запись не производится.

Ссылка на комментарий
Поделиться на другие сайты

//==============================================================================
// Запись uint8 в EEPROM с проверкой содержимого ячейки
//    входные значения:
//      uint16 addr - адрес ячейки
//      uint8  data - данные для записи
//==============================================================================
void EData_WriteInt8(uint16_t addr, uint8_t data)
{
  if(EEPROM_Read(addr) != data)
    EEPROM_Write(addr,data);
}

 

Ссылка на комментарий
Поделиться на другие сайты

а вообще правильно вам сказали, что язык Си будет предпочтительней, да и ваша библиотека будет белее востребована начинающими
И хочу сказать немного в поддержку 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

Конечно необходимо реализовать классы, позволяющие это делать, но то что в них находится и так приходится писать, только немного иначе

Изменено пользователем dm37
Ссылка на комментарий
Поделиться на другие сайты

Гость Игорь Плессер

Я не говорю что СИ расточителен, просто каждый пишет на том что знает!Я пробовал писать на СИ, но потом бросил!Вот недавно скачал CODEVISIONAVR, просто никак начать не могу) А библиотеки на паскаль я делаю для расширения функционала самого mP, чтобы тем кто не может писать на СИ было легче на более легком языке!

 

P.S. я не критикую СИ потому что сам хочу на него перейти, так как у него больше возможностей!

Вообще эту библиотеку я делаю для статьи на сайте, а то там про EEPROM почти ничего нету!

Ссылка на комментарий
Поделиться на другие сайты

19 минут назад, Игорь Плессер сказал:

Я не говорю что СИ расточителен

я писал про C++,
но ваша работа, думаю, тоже важна для тех кто работает на паскале, тем более в виде статьи

Ссылка на комментарий
Поделиться на другие сайты

Гость Игорь Плессер

Кстати а в чем различие C, C+ и C++?

Помогите с реализацией передачи данных EEPROM по SPI\I2C(скиньте кусок кода хотя бы на С++, я попробую разобратся).

Ссылка на комментарий
Поделиться на другие сайты

есть С и C++
C++ создан на базе C, но является объектно-ориентированным языком программирования (добавлены элементы ООП). Лучше почитайте и интернете

https://www.google.ru/?gfe_rd=cr&ei=gvSnWOChDMb68Aeb6ZbABA&gws_rd=ssl#newwindow=1&q=с+с%2B%2B+отличия

Ссылка на комментарий
Поделиться на другие сайты

Гость Игорь Плессер

Хорошо спасибо!

Как думаете этих функций хватит на первое время?

bandicam 2017-02-18 11-25-19-830.jpg

т.к. потом по возможности библиотека будет дорабатываться...

Ссылка на комментарий
Поделиться на другие сайты

можно, кроме чтения однобайтового зачения (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. Ну и так далее..

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...