In this experiment we will show you how easy to drive
stepper motor serially. In this experiment we used a converter
serial to parallel that we build up by using microcontroller chip.
Data will be transfered serially from computer to stepper motor board,
as shown in picture bellow.
a. Puts 1 Edit Components, 1 Timer and label on Form,
as shown in picture bellow. Configure Object Inspector for Timer1 as
Enabled = True, Interval = 1000 ms, as shown in the picture bellow
b.Click on timer1 component to insert with the
program as shown bellow
var
form1: Tform1;
data,status:byte;
const
base = $3f8;{base address port serial}
lcr = 3; {line control register}
dll = 0; {divisor lacht low byte}
dlh = 1; {divisor lacht high byte}
lsr = 5; {line status register}
implementation
{$R *.DFM}
Procedure Initserial; begin asm mov dx,base+lcr; {address line control register} mov al,$80 ; {10000000b = access bit divisor lacht} out dx,al ; mov dx,base+dll; {address divisor lacht low byte} mov al,$30 ; {DLLB = 30h} out dx,al ; mov dx,base+dlh; {address divisor lacht high byte} mov al,$00 ; {DLLH = 00h} out dx,al ; {Pada saat ini Port serial} ; {memp.baud rate = 2400 bps} mov dx,base+lcr; {address line control register} mov al,$03 ; {00000011b =} out dx,al ; {bit 7=0, access to Rx buffer & Tx ; {bit 6=0, set break disable ; {bit 5-4-3=000, no parity ; {bit 2=0, one stop bit ; {bit 1-0=11,data lenght 8 bit} end; end;
Procedure Send_Data_Serial; begin asm mov dx,base mov al,data out dx,al end end;
procedure Tform1.FormCreate(Sender: TObject); begin Initserial; end;
procedure Tform1.Timer1Timer(Sender: TObject); begin timer1.enabled:=false; repeat asm mov dx,base+lsr ; {address line status register } in al,dx and al,$20 ; {00100000b =not masking bit 5} mov status,al ; {bit5=Empty Transmitting holding reg} end; until status = $20; { If ETHR = 1 then data ready tobe send } data:=254; {11111110b} Send_Data_Serial; timer2.enabled:=true; end;
procedure Tform1.Timer2Timer(Sender: TObject); begin timer2.enabled:=false; repeat asm mov dx,base+lsr ; {address line status register } in al,dx and al,$20 ; {00100000b =not masking bit 5} mov status,al ; {bit5=Empty Transmitting holding reg} end; until status = $20; { If ETHR = 1 then data ready tobe send } data:=253; {11111101b} Send_Data_Serial; timer3.enabled:=true; end;
procedure Tform1.Timer3Timer(Sender: TObject); begin timer3.enabled:=false; repeat asm mov dx,base+lsr ; {address line status register } in al,dx and al,$20 ; {00100000b =not masking bit 5} mov status,al ; {bit5=Empty Transmitting holding reg} end; until status = $20; { If ETHR = 1 then data ready tobe send } data:=251; {11111011} Send_Data_Serial; timer4.enabled:=true; end;
procedure Tform1.Timer4Timer(Sender: TObject); begin timer4.enabled:=false; repeat asm mov dx,base+lsr ; {address line status register } in al,dx and al,$20 ; {00100000b =not masking bit 5} mov status,al ; {bit5=Empty Transmitting holding reg} end; until status = $20; { If ETHR = 1 then data ready tobe send } data:=247; {11110111b} Send_Data_Serial; timer1.enabled:=true; end;
procedure Tform1.Button2Click(Sender: TObject); begin timer1.enabled:=false; timer2.enabled:=false; timer3.enabled:=false; timer4.enabled:=false; end;
procedure Tform1.Button1Click(Sender: TObject); begin timer1.enabled:=true; end;
c. To run the program, you can hits F9 or RUN menu, and then you will
show a picture as shown bellow, and try to simulate the program by writing
a data on edit1 with range value 0 .. 255 in decimal.