KolibriOS на производстве

Using Kolibri in embedded systems
  • mov [by],bl
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • ... thanks.
  • procedure rc(var s:string);
    Spoiler:

    Code: Select all

    procedure rc(var s:string);
    var c:char; i,t:dword;
    begin s:=''; i:=1; t:=0;
      repeat
        while (In1021 and 1)<>1 do begin
          t:=t+1;
          if (t>2000) then exit;
        end;
        c:=chr(In1016);
        if c=chr(13) then break;
        s[0]:=chr(i);
        s[i]:=c;
        i:=i+1;
        if (i>30) then break;
        t:=0;
      until false;
    end;
    
    Last edited by VitZ on Fri Jul 12, 2013 4:46 pm, edited 9 times in total.
  • ... А гадкий LPT при включении компьютера посылает включающий сигнал на все свои выходы ...

    ТБ - вот с чего должна была начаться эта тема !!!
    (как, кстати, суметь потушить огнетушителем с электропроводящим
    содержимым неотключённую от электросети производственную
    электроустановку?)
    Last edited by VitZ on Wed Jan 29, 2014 8:28 pm, edited 1 time in total.
  • ... А гадкий LPT при включении компьютера посылает включающий сигнал на все свои выходы ...
    Ну а ты куда смотрел?
    Да, некоторые BIOSы играют сигналами на LPT-шине, по стандарту IEEE1284.
    А Винда в течение первой минуты после начала загрузки периодически опрашивает отклик ECP-устройств по древнему PnP протоколу.

    Прежде чем подключать железяку - проверь дефолтные состояния и игру сигналов при включении/выключении, это же азы!
    Евангелие от Иоанна: стих 1

    Code: Select all

    ; В начале было Слово:
    B32:        mov     ax, os_stack       ; Selector for os
    [/size]
  • function In1016:byte;
    var by:byte;
    begin
    asm
    mov dx,1016
    in al,dx
    mov [by],al
    end;
    In1016:=by;
    end;

    k.writeNumber(5,125,$33F1F1F1,0,5,In1016) в 3-ем пункте k.waitForEvent'a
    - даёт устойчивый приём последовательности одинаковых байтов,
    приходящих из второго компа (DOS'a):

    DOScom -> comKOS
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, ... или
    15, 15, 15, 15, 15, 15, 15, 15, 15, 15 ... и т. пр.
    Last edited by VitZ on Mon Aug 26, 2013 8:08 pm, edited 4 times in total.
  • function In1021:byte;
    var by:byte;
    begin
    asm
    mov dx,1021
    in al,dx
    mov [by],al
    end;
    In1021:=by;
    end;

    procedure open_com;
    begin
    {}
    zapis_v_port(1019,$80);
    zapis_v_port(1016, (1 and $FF) );
    zapis_v_port(1017, ((1 and $FF00) shr 8 ) );
    zapis_v_port(1019,3);
    zapis_v_port(1017,0);
    zapis_v_port(1018,7);
    {}
    zapis_v_port(1018,1);
    end;

    << open_com; >> надо записать сразу после захвата портов
    в основной части программы (между основными BEGIN и END)
    Last edited by VitZ on Wed Jun 12, 2013 1:19 pm, edited 1 time in total.
  • Всё; работает;
    посылаю из компа запрос '$01M' с конечным байтом 13,
    а приходит ответ '!017042' с конечным байтом 13
    (<<i7042>> - это и есть имя устройства, висящего на адресе 1 ПЛ).
    Last edited by VitZ on Wed Sep 04, 2013 8:22 pm, edited 3 times in total.
  • Поздравляю. Теперь можете писать любые драйвера для устройств на EIA485 и EIA232? Думали про USB<->EIA485 и EIA232<->USB?
  • PPro - это минидельфи в RTOS (KOS).
    Следующим шагом подключим устройство i7017
    и построим график (напряжения на [Vin0+ __ Vin0-]
    его входе).
    Spoiler:

    Code: Select all

    program hello96;    uses kolibri;    var k:TKolibri;
    const header:string='HelloWorld test'#0;
    
    procedure zapis_v_port(pdw:dword; b:byte);
    begin asm
      mov eax,43
      mov bl,b
      mov ecx,pdw
      int $40
    end; end;
    
    procedure draw_window;
    begin	k.BeginDraw;
    	k.DefineWindow(10,40,350,350,$33FFFFFF,0,integer(@header[1]));
    	k.DefineButton(5,5,65,25,7,7);
    	k.EndDraw; end;
    
    procedure zachvat_portov;
    begin asm
      mov eax,46
      mov ebx,0
      mov ecx,1016
      mov edx,1023
      int $40 
    end; end;
    
    procedure otdatj_porti;
    begin asm
      mov eax,46
      mov ebx,1
      mov ecx,1016
      mov edx,1023
      int $40 
    end; end;
    
    procedure open_com;
    begin
      zapis_v_port(1019,$80);
      zapis_v_port(   1016,(1 and $FF)   );
      zapis_v_port(   1017,((1 and $FF00) shr 8)   );
      zapis_v_port(1019,3);
      zapis_v_port(1017,0);
      zapis_v_port(1018,7);
      zapis_v_port(1018,1);
    end;
    
    function In1016:byte;
    var by:byte;
    begin
      asm    
        mov dx,1016
        in  al,dx
        mov [by],al
      end;
      In1016:=by;
    end;
    
    function In1021:byte;
    var by:byte;
    begin
      asm
        mov dx,1021
        in al,dx
        mov [by],al
      end;
      In1021:=by;
    end;
    
    procedure sc(s:string);
    var i,t:dword;
    begin     i:=1;    t:=0;
      if (   (length(s)<1)   or   (length(s)>30)   ) then exit;
      while (i<>length(s)+1) do begin
        while (In1021 and $20)=0 do begin
          {t:=t+1;
          if (t>200000000) then exit;}
        end;
        zapis_v_port(1016,ord(s[i]));
        i:=i+1;  t:=0;
      end;
      while (In1021 and $20)=0 do begin
        {t:=t+1;
        if (t>200000000) then exit;}
      end;
      zapis_v_port(1016,13);     
    end;
    
    procedure rc(var s:string);
    var  c: char;   i,t:dword;
    begin     s:='';  i:=1;  t:=0;
      repeat
        while (In1021 and 1)<>1 do begin
          {t:=t+1;
          if (t>200000000) then exit;}
        end;
        c:=chr(In1016);          
        if c=chr(13) then break;
        s[0]:=chr(i); 
        s[i]:=c;
        i:=i+1;
        if (i>30) then break;
        t:=0;
      until false;
    end;
    
    var  s1,s2:string;   key,j:dword;
    BEGIN	draw_window;   j:=1;
      zachvat_portov; 
      open_com;
      s1:='$02M'; 
      while true do case k.waitforevent of
        1:draw_window;
        2:k.getkey(key);
        3:begin 
          if j=1 then begin
            j:=2;
            sc(s1); 
            rc(s2); 
            k.writeText(5,125,0,0,s2);
          end;		
        end;
      end;	 
      otdatj_porti;  
    END.
    
    При запуске этой программы и нажатии на кнопку в окне
    должна появиться строка (чуть ниже в окне) -
    !027017
    - а это значит: устройство многоканального АЦП
    подключено к ПЛ (115200) и имеет адрес 02.
    Last edited by VitZ on Mon Aug 26, 2013 8:06 pm, edited 3 times in total.
  • График будем рисовать прямоугольничками (DrawBar(x,y,width,height,color)):
    каждые 3 секунды надо
    посылать строковый запрос устройству i7017: <<каково напряжение на твоём нулевом входе?>>,
    принимать ответ (в строку s2),
    вышифровывать из s2 пришедшее число вольтов (0 .. 10В) в переменную chislo_voltov_1 (integer),
    масштабировать его по оси <<- y>> на наш график (chislo_voltov_2: integer)
    (при повторении этого алгоритма через следующие 3 с - надо отступить вправо на 10 пикселей).
    [Снаружи - необходим реостатик, задающий напряжение - по известной схеме].
    Процесс этот желательно как-то закончить при <<дохождении>>
    прямоугольничками самописца до правого края окна.
    Last edited by VitZ on Mon Aug 26, 2013 8:03 pm, edited 4 times in total.
  • function sch_vr:dword;
    var t:dword;
    begin
    asm
    mov eax,26
    mov ebx,9
    int $40
    mov [t],eax
    end;
    sch_vr:=t;
    end;

    ...
    sch_vr_2:=sch_vr;
    if (sch_vr_2 > (sch_vr_1+299)) then {прошло 3 секунды} begin sch_vr_1:=sch_vr_2; Alg1; end;
    ...
    Last edited by VitZ on Thu Jun 20, 2013 2:04 pm, edited 1 time in total.
  • Кроме "прямоугольничков" график можно рисовать любыми ASCII-маркерами

    Code: Select all

    ☼  ►  ¤  ◄  ▲  ▼ ♥ ♦ ♣ ♠ • ○ Ж W o 
    с помощью 4-й функции (ecx=0x00RRGGBB, esi = 1)
  • ... http://www.icpdas.com/download/7000/manual.htm - страница с документацией по i7, некоторые файлы перепутаны местами ...

    (В случае управления мотором ПК лишь посылает <<число_угловых_градусов_в_секунду>>,
    а одно из устройств серии i7000 (контроллер) выполняет <<шимовую>>
    функцию - для пущей реальности времени.
    Хотя, поначалу управление техпроцессом лучше осуществлять
    контроллерами, и по месту, так, чтобы крах системы был невозможен
    из-за отказа сервера сбора инфы (колибри) - при отказе сервера (колибри)
    потеряется только инфа (при этом управление сохранится по месту)
    ).

    На запрос '#020' устройство i7017 ответит '>+001.23'.
    (То есть на нулевом входе устройства АЦП сейчас 1,23 В и
    коль оно пришло в комп - его можно как-то визуализировать на экран.)
    Chislo_voltov_1:=str5_to_num(s2[3]+s2[4]+s2[5]+s2[7]+s2[8]).
    Last edited by VitZ on Sun Nov 02, 2014 4:10 pm, edited 22 times in total.
  • Who is online

    Users browsing this forum: Yandex [Bot] and 5 guests