четверг, 19 июля 2012 г.

Описание API вызова библиотеки COMCD4094EX.DLL (расширенная версия)

Данная библиотека, далее DLL, предназначена для работы с расширителем COM-порта на основе сдвигового регистра CD4094 на 8-выходов (или любого другого, например HC595, с соответствующей коррекцией схемы контроля через входы тактирования, строба и записи данных сигналами DTR/RTS/TX, и питающего напряжения) или каскадного их включения (до 64-х/N (любое количество) выходов), преобразующего последовательный код в параллельный. При этом, COM-порт может быть как физическим RS-232, так и виртуальным over USB на основе использования конвертора USB/RS-232 (UART TTL), к примеру - PL2303, CP2102/3, FTDI чипы (FT232RL и др.).



Cхема расширителя на одном регистре:



Cхема расширителя на 4-х регистрах (32 выхода):



Cистемные требования и зависимости
  1. Win OS.
  2. Расширитель порта на сдвиговом регистре (по схеме в архиве).
  3. Физический COM порт или конвертор USB/RS-232.
DLL предоставляет универсальный доступ к записи для других приложений вне зависимости от языка в среде Win32/64. Для использования DLL в своих проектах соблюдайте соглашение об stdcall-вызовах. Тип соглашения о вызове объявляется после прототипа функции, будь то объявление функционального типа или же объявление функции.

Каждый бит входного параметра 'inleds' экспортируемой функции setcom() библиотеки 'COMCD4094EX.DLL' размерностью 64 бита (uint64) отвечает за управление состоянием пинов Q1...Qn сдвигового регистра, согласно даташита 'CD4094BC.PDF' или каскадного их включения:


Таблица расшифровок входных и выходных параметров экспортируемой функции 'setcom()' библиотеки 'COMCD4094.DLL':


Таблица расшифровок входных и выходных параметров экспортируемой функции 'dynamicsetcom()' библиотеки 'COMCD4094EX.DLL':


Пример динамического подключения (Delphi 6/7/2006/2009/2010/TDL/XE5):
var LEDs  : UINT64;
    setcom: function(numcom: pansichar;        // COM-порт
                     baudrate: integer;        // скорость COM-порта
                     inLEDs: UINT64;           // 64 pos
                     count: integer            // кол-во выходов
                     ):pansichar;stdcall;
    dynamicsetcom: function(numcom: pansichar; // COM-порт
                     baudrate: integer;        // скорость COM-порта
                     inLEDs: pansichar         // ANYDATA
                     ):pansichar;stdcall;
    LibHandle: THandle;


{ инициализация }
function LinkProc(ProcName: string):Pointer;
begin
 result:= GetProcAddress(LibHandle, PChar(ProcName))
end;

...
 LibHandle:= LoadLibrary('COMCD4094EX.dll');
 if LibHandle<>0 then
  setcom:= LinkProc('setcom');
...

{ создание микросекундных задержек }
procedure DelayMicro(parMicroSek: INT64);
var Freq, TimeImp, TimeImpNow, dif: Int64;
begin
 QueryPerformanceFrequency(Freq);   // Частота импульсов в секунду
 QueryPerformanceCounter(TimeImp);  // Число импульсов с момента включения компьютера
 repeat
  QueryPerformanceCounter(TimeImpNow);  // Текущее кол-во импульсов
  dif := ((TimeImpNow - TimeImp) * 1000000) div Freq; // Расчет времени
 until dif > parMicroSek;
end;


{ преобразуем массив битов в UINT64 }
type TBit = 0..1;
type TBits = array[0..63] of TBit;
function BitsToInt64(const input:TBits): UInt64;
var i:byte;
begin
  Result := 0;
  for i := High(input) downto Low(input) do
    Result := Result * 2 + input[i];
end;


{ пример установки для 64-х нагрузок на скорости 9600 бит/сек }
var i: integer;
    t: TBits;
begin
 for i:= 0 to form1.ComponentCount-1 do
  if form1.Components[i] is TCheckBox then
   t[TCheckBox(Components[i]).tag]:= longint(TCheckBox(Components[i]).checked);

 leds:= BitsToInt64(t);
 sb.Panels[0].Text:= setcom('COM1', 9600, leds, 64)
...

{ пример управления любым количеством нагрузок на скорости 9600 бит/сек }
...
 sb.Panels[0].Text:= dynamicsetcom('COM1', 9600, pansichar(anydata.text{11111010001010101010101}))
...


ПОРЯДОК ИСПОЛЬЗОВАНИЯ
  1. Параметр 'numcom' функции setcom() можно оставлять пустым, по-умолчанию будет задаваться COM1.
  2. Допускается запись параметра 'numcom' функции 'setcom()' в любом регистре.
  3. Параметр 'count' функции setcom() можно оставлять нулевым, по-умолчанию будет задаваться равным 64-м выходам.
  4. При каскадном включении, сдвиговые регистры допускается наращивать для управления большим количеством нагрузок (до 64-х для заявленного беззнакового типа UINT64 при использовании функции 'setcom()' или произвольное количество при использовании функции 'dynamicsetcom()') , для этого выходной пин переноса Q'S следует соединить со входом DATA следующего регистра и т.д., а входы тактирования и стробирования объединить.
  5. Диапазон питающих напряжений ИМС регистра CD4094 (см. схему в архиве) составляет от 3 до 18 вольт. При использовании другого типа логики, чем КМОП, следует учитывать допустимый для них уровень напряжений согласно даташиту производителя.
  6. Для управления мощными нагрузками необходим буфер в виде умощняющих ключей по выходу регистра, также желательна установка опторазвязки (например оптопар TLP621) либо по входу схемы расширителя, либо по выходу каждого из каналов.
  7. Для реализации микросекундных интервалов управления используйте QueryPerformanceCounter().
Постскриптум

Вам не хватает ног с COM порта или МК для контроля сдвигового регистра? А знаете-ли вы, что им можно управлять вообще одной линией? Как известно, регистры сдвига тактируются передним фронтом ТИ при достижении логического уровня "1", что дает возможность задержать сигнал для DATA простым хаком - RC интегрирующей цепью (ФНЧ). При этом управляющие короткие импульсы будут проходить напрямую на CLK, но не проходить через фильтр, выход которого подключен к DATA. Импульсы же длительностью более постоянной времени цепи ln(2)*RC попадут на DATA, сформировав набор состояний регистра. При этом стробирующий вход не используется и его придется подтянуть к плюсу питания, тем самым во время записи данных в регистр выходные состояния будут меняться хаотично. Для исключения данного эффекта стробирующий вход можно подключить на управляющую линию через RCD цепь. Библиотеку для реализации подобного контроля по одной линии мы рассмотрим в следующий раз...

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.