Jump to content

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


Guest Игорь Плессер
 Share

Recommended Posts

Guest Игорь Плессер

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

Link to comment
Share on other sites

  • Replies 59
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

LIR-20 – модуль резервирования питания от MORNSUN
Компания MORNSUN расширила линейку продукции, монтируемой на DIN-рейку, выпустив модуль резервирования питания LIR-20 с максимальным током до 20 А на канал. Модуль можно использовать на шинах с напряжением 24 или 48 В (полный диапазон напряжения 22…60 В). Данный модуль применяется в системах, где даже выход из строя источника питания (ИП) не должен привести к потере напряжения. К модулю резервирования подключаются два источника питания, причем один из них может быть бесперебойным (ИБП; UPS), и нагрузка.

Читать подробнее >>

LED-драйверы MEAN WELL – выбор больше, стоимость ниже

Компэл расширил и существенно пополнил склад LED-драйверами компании MEAN WELL, одновременно снизив цену на них. В настоящий момент на складе представлена широкая линейка продукции для наружного (семейства HLG, ELG, XLG, LPC, LPV), и для внутреннего (APC, LCM, SLD, APV) освещения.

Имеется большой выбор моделей с различными режимами стабилизации выходных параметров. Кроме того, есть в наличии и линейка DC/DC-драйверов, как понижающих (семейство LDD), так и повышающих (семейство LDH).

Подробнее>>

Популярные модели литиевых батареек FANSO EVE Energy готовы к отправке
На складе КОМПЭЛ уже готовы к поставке одни из самых востребованных литиевых батареек типов ER и CR производства FANSO EVE Energy – одного из мировых лидеров на рынке первичных литиевых элементов питания.
Данные источники тока получили широкое применение в различных областях, будь то системы безопасности, приборы учета или мелкая бытовая техника. 

Подробнее о применениях>>
 

Guest Игорь Плессер

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

Edited by Игорь Плессер
Link to comment
Share on other sites

Источники питания MEAN WELL для медицинских устройств на складе Компэл

Компэл расширяет складскую программу по специальным ИП для применения в медицинских приборах и устройствах. Представлены ИП в диапазоне мощности от 5 до 500 Вт, по медицинскому стандарту EN60601-1 с двумя мерами защиты пациента (2хMOPP; тип BF) для устройств, контактирующих с пациентом.  Все эти надежные источники питания могут применяться не только в медицинских устройствах.

Подробнее>>

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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

Guest Игорь Плессер

Я конечно против си не чего не имею!Даже пробовал пару раз, но не задалось как то...Спасибо за советы)

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

Guest Игорь Плессер

Сделал!!!

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 так как у нас условие выхода из цикла, выходим из него, убираем лишний бит и присваиваем результат!!!

Edited by Игорь Плессер
Link to comment
Share on other sites

Guest Игорь Плессер

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

 

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

Guest Игорь Плессер

Я это заметил!Уже исправил!

 

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

 

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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

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

Edited by dm37
Link to comment
Share on other sites

Guest Игорь Плессер

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

 

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

Guest Игорь Плессер

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

Guest Игорь Плессер

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

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

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

  • Сообщения

    • странный вопрос , что мешает скачать даташиты с тырнета и проверить согласно описания? HC237 - обычный демультиплексор 3 на 8 I7662 - ICL7662 DC/DC преобразователь , формирует отрицательное напряжения для ОУ IL410 это вообще обычная смисторная оптопара с зеро-кроссом.   можно, проверить условия запуска осликом, и наличие смены напряжения на выходах, можно засунуть в програматор и проверить возможность чтения  бита конфига, а вообще убить ОТРку от мелкотельных это надо очень постараться.
    • Не зная, как должен работать прибор, не зная назначение и параметры выходных сигналов, не зная, что должно быть подключено к имеющимся на этой плате разъёмам, "ремонт" не имеет абсолютно никакого смысла. Да вы и сами это понимаете. И даже если вы, перебрав все элементы, наткнётесь на какой-то неисправный и замените, то никакого вклада в ваше "общее развитие" это всё равно не принесёт. Ну разве что приобретёте навык долго, бессмысленно и бесполезно трудиться. Прошивка в контроллере конечно есть (по крайней мере была), считать вы её не сможете.
    • Стрелочный индикатор.lay6 Плата исправленная. Лучше поздно как говорится  Понадобится скоро такой вероятно-вспомнил
    • Доброго времени суток! Прибор принесли после энного количества ремонтов.Последний кто смотрел сказал что один из транзисторов "снял шляпу",были проверены ещё несколько но неисправных не было,но он поменял несколько показавшихся подозрительными,-ничего не изменилось.Поменянные транзисторы не сгорели.При проверке было обнаружено что прибор формирует некий сигнал на выходе с напряжением в 50v,а вот сила тока в районе 2 микро ампер.На приборе присутствует регулировка мощности,но сила тока на выходе не меняется.При регулировке мощности на LM358 формируется сигнал с напряжением до минус 4,5 вольта.Прошивки (если она есть в контроллерах) в наличии нет и возможности узнать тоже нет.Можно ли определить это "мозги" или нет?ЛМ358,УЛН2003а  и x9c102s проверены,в порядке.Мелочёвка вроде тоже вся в номинале.Не совсем понимаю как проверить HC237 , I7662 и IL410. Прибор вряд ли будет использоваться,так как это какой-то СПА,используется в косметологии для кожи,а так как нет никаких гарантий,что сигнал тот,что необходим,то использование чревато последствиями...Ищу неисправность для общего развития.Если необходимо могу выложить осциллограммы и замеры(напряжение,ток,частота) с интересующих мест на плате. P.S. Коллекторные выводы на гнезде JP2 объединены из четырёх в один,выводов после "мамы" соответственно 2.
    • Для проведения квалифицированного ремонта не обязательно иметь диплом инженера. Достаточно иметь хорошую светлую голову на плечах, познание глобальных основ теории, немалый практический опыт и сообразительность. Бывают инженеры с тремя дипломами, а не могут нормально микросхему заменить. 
    • Никогда не собирал на экранах или панно, не нравится. Сейчас хороший выбор фонарей, те же ДХО. Уже купил но руки не доходят закончить схему и вопросы с дизайном.
    • ТС вроде световое панно делал или нет?
  • Similar Content

×
×
  • Create New...