Vous êtes sur la page 1sur 18

D7 D6 D5 D4 D3 D2 D1 D0 HEX DES

128+64+32+16+8 + 4 + 2 + 1 2n
1 0 0 0 0 0 0 0 = 80 = 128
0 1 0 0 0 0 0 0 = 40 = 64
0 0 1 0 0 0 0 0 = 20 = 32
0 0 0 1 0 0 0 0 = 10 = 16
0 0 0 0 1 0 0 0 = 08 = 8
0 0 0 0 0 1 0 0 = 04 = 4
0 0 0 0 0 0 1 0 = 02 = 2
0 0 0 0 0 0 0 1 = 01 = 1

var
data : byte;
begin
data := StrToInt(Edit1.Text);
portout($378,data); delay(500);
portout($378,data or 16); delay(500);

implementation
procedure PortOut(Port : Word; Data : Byte); stdcall; external 'io.dll';
function PortIn(Port:Word):Byte; stdcall; external 'io.dll';
{$R *.dfm}
procedure TFORM1.delay(lama:longint);
var ref:longint;
begin
ref:=gettickcount;
repeat application.processmessages;
until ((gettickcount-ref)>=lama);
end;
{ Tentang OUTPUT PORT}
procedure TForm1.RunClick(Sender: TObject);
begin
if Run.Caption = 'Stop' then
Run.Caption := 'Run'
else
if Run.Caption = 'Run' then
Run.Caption := 'Stop';
repeat
PortOut($378,1); delay(1000);
PortOut($378,2); delay(1000);
PortOut($378,4); delay(1000);
PortOut($378,8); delay(1000);
PortOut($378,16); delay(1000);
PortOut($378,32); delay(1000);
PortOut($378,64); delay(1000);
PortOut($378,128); delay(1000);
until Run.Caption = 'Stop';
end;
procedure TForm1.OUTPUTClick(Sender: TObject);
var
data_out : byte;
begin
data_out := StrToInt(Edit1.Text);
PortOut($378,data_out)
end;
procedure TForm1.INPUTClick(Sender: TObject);
var

data_input : byte;
begin
data_input := PortIn($379);
data_input := data_input and $f8;
Edit2.Text := IntToStr(data_input);
end;
end.

D7 D6 D5 D4 D3 D2 D1 D0 HEX
128+64+32+16+8 + 4 + 2 + 1 2n
1 1 1 0 1 1 1 1 = EF
1 1 1 0 1 1 1 0 = EE
1 1 1 0 1 1 0 1 = ED
1 1 1 0 1 0 1 1 = EB
1 1 1 0 0 1 1 1 = E7
1 1 0 0 1 1 1 1 = CF
1 0 1 0 1 1 1 1 = AF
0 1 1 0 1 1 1 1 = 6F

DES
= 239
= 238
= 237
= 235
= 231
= 207
= 175
= 111

A
F

B SEGMEN NYALA = 0
SEGMEN PADAM = 1
C

D7 D6 D5 D4 D3 D2 D1 D0 7-SEG DES
128+64+32+16+8 + 4 + 2 + 1 2n
1 1 1 0 1 1 1 1 =
= 239
1 1 1 0 1 1 1 0 =
= 238
1 1 1 0 1 1 0 1 =
= 237
1 1 1 0 1 0 1 1 =
= 235
1 1 1 0 0 1 1 1 =
= 231
1 1 0 0 1 1 1 1 =
= 207
1 0 1 0 1 1 1 1 =
= 175

ADC0804
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, StdCtrls;
type
TForm1 = class(TForm)
cmdDAC: TSpeedButton;
BitBtn1: TBitBtn;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
Label4: TLabel;
cmdADC: TSpeedButton;
Edit3: TEdit;
Label3: TLabel;
Edit4: TEdit;
Label5: TLabel;
Edit5: TEdit;
Label6: TLabel;
Edit6: TEdit;
Label7: TLabel;
Edit7: TEdit;
Label8: TLabel;
Edit8: TEdit;
Label9: TLabel;
Edit9: TEdit;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
procedure cmdDACClick(Sender: TObject);
procedure cmdADCClick(Sender: TObject);
procedure BacaADC(chan:byte);
procedure delay(lama:longint);
private
{ Private declarations }

public
{ Public declarations }
end;
var
Form1
: TForm1;
dataDAC
: byte;
Vo,volt
: real;
dataL,dataH,data,intr
: byte;
d0,d1,d2,d3,d4,d5,d6,d7
: byte;
implementation
procedure PortOut(Port : Word; Data : Byte); stdcall; external 'io.dll';
function PortIn(Port:Word):Byte; stdcall; external 'io.dll';
{$R *.dfm}
{-37A.3 37A.2
-37A.1
-37A.0}
{1
MUX CONTROL MUX ADC DAC }
procedure TForm1.cmdDACClick(Sender: TObject);
begin
Vo := StrToFloat(Edit1.Text);
dataDAC := round(Vo*50);
{-37A.3 37A.2 -37A.1 -37A.0}
{ 1
0
1
0 }
portout($37A,12);
portout($378,dataDAC);
end;
procedure TFORM1.delay(lama:longint);
var ref:longint;
begin
ref:=gettickcount;
repeat application.processmessages;
until ((gettickcount-ref)>=lama);
end;
procedure TForm1.BacaADC(chan: byte);
begin
{ MUX : 378.7 378.6 378.5 378.4 378.3 378.2 378.1 378.0 }
{
X X
RD WR C
B
A
X }
{
0
0
1
1
0
0
0
0 = 30H }
{
0
0
1
0
0
0
0
0 = 20H }
{
0
0
0
1
0
0
0
0 = 10H }

{ -37A.3
37A.2
-37A.1 -37A.0 }
{ X
MUX/CONTROL -A/B
DAC }
{ 1
1
1
1
: 4 BIT BAWAH }
{ -379.7 379.6 379.5 379.4 379.3 }
{ D3
D2
D1
D0 INTR }
{ -37A.3
37A.2
-37A.1 -37A.0 }
{ X
MUX/CONTROL -A/B
DAC }
{ 1
1
0
1
: 4 BIT ATAS }
{ -379.7 379.6 379.5 379.4 379.3 }
{ D7
D6
D5
D4 INTR }
chan := chan shl 1;
portout($37A,15);
portout($378,$30 or chan);
portout($378,$20 or chan);
portout($378,$30 or chan);

{ RD = WR = 1 }
{ RD = 1, WR = 0 }
{ RD = WR = 1 }

repeat
intr := portin($379);
intr := intr and 8;
until intr = 0;
portout($378,$10 or chan); { RD = 0, WR = 1 }
{ 4 bit bawah }
portout($37A,15);
dataL := portin($379);
{ 4 bit atas }
portout($37A,13);
dataH := portin($379);
portout($378,$30 or chan); { RD = WR = 1 }
dataL := dataL and $0f0;
dataL := dataL shr 4;
d0 := dataL and 1;
d1 := dataL and 2;
d2 := dataL and 4;
d3 := dataL and 8;
d3 := not d3;
d3 := d3 and 8;
dataL := d3 + d2 + d1 + d0;
dataH := dataH and $0f0;
d4 := dataH and 16;

d5 := dataH and 32;


d6 := dataH and 64;
d7 := dataH and 128;
d7 := not d7;
d7 := d7 and 128;
dataH := d7 + d6 + d5 + d4;
data := dataL + dataH;
volt := (data *20)/1000;
delay(1);
end;
procedure TForm1.cmdADCClick(Sender: TObject);
begin
if cmdADC.Caption = 'Stop' then
cmdADC.Caption := 'Proses'
else
if cmdADC.Caption = 'Proses' then
cmdADC.Caption := 'Stop';
repeat
BacaADC(0);
Edit2.Text:=FloatTostr(volt);
BacaADC(1);
Edit3.Text:=FloatTostr(volt);
BacaADC(2);
Edit4.Text:=FloatTostr(volt);
BacaADC(3);
Edit5.Text:=FloatTostr(volt);
BacaADC(4);
Edit6.Text:=FloatTostr(volt);
BacaADC(5);
Edit7.Text:=FloatTostr(volt);
BacaADC(6);
Edit8.Text:=FloatTostr(volt);
BacaADC(7);
Edit9.Text:=FloatTostr(volt);
until cmdADC.Caption = 'Stop';
end;

const
errlim=1E-04;
alpha=0.675;

var
Form1: TForm1;
x: array[-7..6] of extended;
o4,r,d:array[0..2] of extended;
o2,o3:array[0..13] of extended;
w1:array[0..6,0..13] of extended;
w2:array[0..13,0..3] of extended;
w3:array[0..3,0..2] of extended;
target1, out1, oe1 :array[0..100] of extended;
number:array[0..10] of integer;
filename:textfile;
datanum:integer;
e4,de4:array[0..2] of extended;
e3,de3:array[0..3] of extended;
e2,de2:array[0..13] of extended;

weight:array[0..21] of extended;
temp1:array[0..20] of extended;
temp2:array[0..21] of extended;
rms:extended;
E,temp:extended;
anu:string[11];
q:integer;
timser,sine,thr1,thr2,thr3,thr4,thr5,thr6,thr7,thr8,wc11,wc12,wc21,wc22,wc31,wc32,wb11,wb12,wb13,wb2
3,wb31,wb32,wb33,wa11,wa12,wa13,wa21,wa22,wa23,error:array[-10..10000000] of extended;
thd1,thd2,thd3:array[1..14] of real;
// trainok,testok,//
inputok,trainok,testok:boolean;
max,min,tengah:real;
implementation
{$R *.dfm}

//=====================================================
procedure TForm1.TimeSeriesClick(Sender: TObject);
var
i:integer;
begin
max:=-100;
min:=1000;
i:=1;
assignfile(filename,'coba.txt');
// assignfile(filename,'harga_tinggi.txt');
reset(filename);
while not eof (filename) do
begin
readln(filename,sine[i]);
timser[i]:=sine[i];
inc(i);
end;
closefile(filename);
dec(i);
datanum:=i;
//datanum:=9;
for i:= 1 to datanum do
series1.addxy(i,sine[i]);
// for i:= datanum-5 to datanum do
for i:= 1 to datanum-1 do
begin
if sine[i]>=max then max:=sine[i];
if sine[i]<min then min:=sine[i];
end;
tengah:=(max+min)/2;
for i:= 1 to datanum-1 do
begin
sine[i]:=sine[i]-tengah;
end;
max:=-1000;
for i:= 1 to datanum-1 do
if sine[i]>=max then max:=sine[i];
for i:= 1 to datanum do

begin
sine[i]:=sine[i]/max;
series5.AddXY(i,sine[i]);
end;
inputok:=true;
end;
//======================================================
procedure TForm1.RecallTimeSeriesClick(Sender: TObject);
var
i,j,k:integer;
begin
if inputok=true then
begin
{retreival}
{optimized synaptic weight}
assignfile(filename,'w1.txt');
reset(filename);
for i:= 1 to 6 do
begin
for j:= 1 to 13 do
begin
read(filename,w1[i,j]);
end;
readln(filename);
end;
closefile(filename);
assignfile(filename,'w2.txt');
reset(filename);
for i:= 1 to 13 do
begin
for j:= 1 to 3 do
begin
read(filename,w2[i,j]);
end;
readln(filename);
end;
closefile(filename);
assignfile(filename,'w3.txt');
reset(filename);
for i:= 1 to 3 do

begin
for j:= 1 to 1 do
begin
read(filename,w3[i,j]);
end;
readln(filename);
end;
closefile(filename);
for i:= 6 to datanum-1
begin

do

{layer 1: input}
x[1]:=sine[i-5];
x[2]:=sine[i-4];
x[3]:=sine[i-3];
x[4]:=sine[i-2];
x[5]:=sine[i-1];
x[6]:=sine[i];
{layer2: o2}
for j:= 1 to 13 do
begin
temp:=0;
for k:= 1 to 6 do
begin
temp:=temp+x[k]*w1[k,j];
end;
temp:=temp-thd1[j];
o2[j]:=(1-exp(-2*temp))/(1+exp(-2*temp));
end;
{layer3: o3}
for j:= 1 to 3 do
begin
temp:=0.0;
for k:= 1 to 13 do
begin
temp:=temp+o2[k]*w2[k,j];
end;
temp:=temp-thd2[j];
o3[j]:=(1-exp(-2*temp))/(1+exp(-2*temp));
end;
{layer4: o4}
for j:= 1 to 1 do

begin
temp:=0.0;
for k:= 1 to 3 do
begin
temp:=temp+o3[k]*w3[k,j];
end;
temp:=temp-thd3[j];
o4[j]:=(1-exp(-2*temp))/(1+exp(-2*temp));
end;
out1[i]:=max*(o4[1])+tengah;
oe1[i]:= 100*abs((timser[i]-out1[i])/timser[i])
end;
for i:= 6 to datanum-1 do
series3.addxy(i+1,out1[i]);
//
for i:= 6 to datanum-1 do
Edit2.Text:= FloatToStr(out1[i]);
end;
testok:=true;
assignfile(filename,'recall_error.txt');
rewrite(filename);
for i:= datanum-6 to datanum do
begin
writeln(filename,i+1, ' ',timser[i+1],' ',oe1[i+1]);
end;
closefile(filename);
end;
// -----------------------------------------procedure TForm1.Button1Click(Sender: TObject);
label ulang,mulai;
var
i,j,k:integer;
begin
if inputok=true then
begin
{weight initialization}
for i:= 1 to 6 do
begin
for j:= 1 to 13 do
begin
w1[i,j]:= (randg(0,0.5));
end;

end;
for i:= 1 to 13 do
begin
for j:= 1 to 3 do
begin
w2[i,j]:= (randg(0,0.5));
end;
end;
for i:= 1 to 3 do
begin
for j:= 1 to 1 do
begin
w3[i,j]:= (randg(0,0.5));
end;
end;
q:=1;
mulai:
//i:=datanum-6;
i:=6;
E:=0;
ulang:
{layer 1: input}
x[1]:=sine[i-5];
x[2]:=sine[i-4];
x[3]:=sine[i-3];
x[4]:=sine[i-2];
x[5]:=sine[i-1];
x[6]:=sine[i];
target1[i]:=sine[i+1];
{layer2: o2}
for j:= 1 to 13 do
begin
temp:=0;
for k:= 1 to 6 do
begin
temp:=temp+x[k]*w1[k,j];
end;
temp:=temp-thd1[j];
o2[j]:=(1-exp(-2*temp))/(1+exp(-2*temp));
end;

{layer3: o3}
for j:= 1 to 3 do
begin
temp:=0.0;
for k:= 1 to 13 do
begin
temp:=temp+o2[k]*w2[k,j];
end;
temp:=temp-thd2[j];
o3[j]:=(1-exp(-2*temp))/(1+exp(-2*temp));
end;
{layer4: o4}
for j:= 1 to 1 do
begin
temp:=0.0;
for k:= 1 to 3 do
begin
temp:=temp+o3[k]*w3[k,j];
end;
temp:=temp-thd3[j];
o4[j]:=(1-exp(-2*temp))/(1+exp(-2*temp));
end;
{error}
e4[1]:=target1[i]-o4[1];
E:=E+0.5* sqr(e4[1]) ;
error[q]:=E;
{update weights}
{layer 3-4}
de4[1]:=e4[1]*(1+o4[1])*(1-o4[1]);
for j:= 1 to 3 do
begin
temp:=0;
for k:= 1 to 1 do
begin
temp:=temp+w3[j,k]*de4[k];
end;
de3[j]:=temp;
end;

for j:= 1 to 3 do
begin
e3[j]:=(1+o3[j])*(1-o3[j])*de3[j];
end;
for j:= 1 to 3 do
begin
for k:= 1 to 1 do
begin
w3[j,k]:=w3[j,k]+alpha*de4[k]*o3[j];
end;
end;
{layer 2-3}
for j:= 1 to 13 do
begin
temp:=0;
for k:= 1 to 3 do
begin
temp:=temp+w2[j,k]*e3[k];
end;
de2[j]:=temp;
end;
for j:= 1 to 13 do
begin
e2[j]:=(1+o2[j])*(1-o2[j])*de2[j];
end;
for j:= 1 to 13 do
begin
for k:= 1 to 3 do
begin
w2[j,k]:=w2[j,k]+alpha*e3[k]*o2[j];
end;
end;
{layer 1-2}
for j:= 1 to 6 do
begin
for k:= 1 to 13 do
begin
w1[j,k]:=w1[j,k]+alpha*e2[k]*x[j];
end;
end;
if i<datanum-2 then

begin
i:=i+1; //update data pattern
q:=q+1;
goto ulang;
end else
if E>errlim then goto mulai; //evaluasi error limit tiap seluruh data dipelajari
edit1.Text:=inttostr(q);
for i:= 1 to q do
series2.addxy(i,error[i]);
assignfile(filename,'w1.txt');
rewrite(filename);
for j:= 1 to 6 do
begin
for k:= 1 to 13 do
begin
write(filename,w1[j,k],' ');
end;
writeln(filename,' ');
end;
closefile(filename);
assignfile(filename,'w2.txt');
rewrite(filename);
for j:= 1 to 13 do
begin
for k:= 1 to 3 do
begin
write(filename,w2[j,k],' ');
end;
writeln(filename,' ');
end;
closefile(filename);
assignfile(filename,'w3.txt');
rewrite(filename);
for j:= 1 to 3 do
begin
for k:= 1 to 1 do
begin
write(filename,w3[j,k],' ');
end;
writeln(filename,' ');
end;

closefile(filename);
assignfile(filename,'error.txt');
rewrite(filename);
writeln(filename,q);
for i:= 1 to q do
begin
writeln(filename,i,' ',error[i],' ');
end;
closefile(filename);
trainok:=true;
end;
end;
end.

Vous aimerez peut-être aussi