unit PP_ALL03;{$I-,S-}{=========================================================}{ }{ Unita pro ovladani programatoru HI-LO model ALL-03 }{ (c) DECROS pefi }{---------------------------------------------------------}{ Verze : 1.0.0 uvodni verze }{ 1.0.1 preformatovani zdrojaku miho }{ 1.0.2 prejmenovani na PP_ALL03.PAS }{=========================================================}interfaceprocedure ErrorProc;{== vypise slovne obsah chyby ==}procedure PowerOff;{== vypne programator ==}procedure Initialize(Baze :word);{== ziniciuje programator a nastavi bazovou adresu programatoru ==}procedure SetVoltageV1(Napeti : real);{== nastavi napeti na prevodniku s vahou 0.4, napeti je zadavano ==}{== ve voltech, max. napeti 9.6V. Zapina se jim programator, ==}{== musi byt pouzit vzdy ==}procedure SetVoltageV2(Napeti : real);{== nastavi napeti na prevodniku s vahou 0.6, napeti je zadavano ==}{== ve voltech, max. napeti 14.4V. ==}procedure SetVoltageV3(Napeti : real);{== nastavi napeti na prevodniku s vahou 1, napeti je zadavano ==}{== ve voltech, max. napeti je 25V ==}procedure SetBit(Pin,Stav:byte);{== nastavi pin podle parametru Stav. Piny jsou v rozsahu 1-40, ==}{== stav je 0 nebo 1. ==}procedure GetBitProc (Pin:byte;var Stav:byte);{== cte stav pinu,pin v rozsahu 1-40,Stav nabyva hodnot 0 nebo 1 ==}function GetBit(Pin:byte):byte;{== cte stav pinu, pin v rozsahu 1-40,vraci 0 nebo 1 ==}procedure ConnectV1(Pin:byte;On:boolean);{== pripojuje prevodnik V1 s vahou 0.4 k pinum, ==}{== piny v rozsahu 24-32,34,36,40 ==}procedure ConnectV2(Pin:byte;On:boolean);{== pripojuje prevodnik V2 s vahou 0.6 k pinum. ==}{== piny v rozsahu 9-32 ==}procedure ConnectV3(Pin:byte;On:boolean);{== pripojuje prevodnik V3 s vahou 1 k pinum. ==}{== piny v rozsahu 1,5-7,9-32,36 ==}procedure Gnd11(On:boolean);{== prepina zem mezi piny 20 a 11, true=pin 11, false= pin20 ==}procedure Led(On:boolean);{== ovlada led s napisem 'GOOD', true= sviti, false= nesviti ==}function ReadButton:boolean;{== vypne programator a cte tlacitko s napisem 'YES' , ==}{== true=stiknuto, false=uvolneno ==}{=========================================================}implementationuses DELAY;{== Definice konstant ==}const InitNum = 22; { pocet registru }const InitArray : array[1..InitNum,1..2] of byte ={== zakladni inicializace tj. vsechny piny jako vstupni,prevodniky ==}{== odpojeny od vsech pinu a vymulovany ==}((231,0),(230,0),(229,0),(238,0),(237,0),(241,0),(242,0),(242,0),(243,0),(232,0),(233,0),(234,0),(235,0),(236,0),(224,255),(225,255),(226,255),(227,255),(228,255),(247,0),(239,0),(245,0));const PinSet : array[1..40,1..2] of byte ={== tabulka pro ovladani jednotlivych pinu, na prvni pozici ==}{== prislusny I/O registr na druhe pozici maska pinu v registru ==}(($E0,$01),($E0,$02),($E0,$04),($E0,$08),($E0,$10),($E0,$20),($E0,$40),($E0,$80),($E1,$01),($E1,$02),($E1,$04),($E1,$08),($E1,$10),($E1,$20),($E1,$40),($E1,$80),($E2,$01),($E2,$02),($E2,$04),($E2,$08),($E2,$10),($E2,$20),($E2,$40),($E2,$80),($E3,$01),($E3,$02),($E3,$04),($E3,$08),($E3,$10),($E3,$20),($E3,$40),($E3,$80),($E4,$01),($E4,$02),($E4,$04),($E4,$08),($E4,$10),($E4,$20),($E4,$40),($E4,$80));const PinConnectV1: array[1..40,1..2] of byte ={== tabulka pro pripojeni prevodniku s vahou 0.4 k pinum, na prvni ==}{== pozici registr pro pripojeni, na druhe pozici maska ==}{== pinu v registru ==}(($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($EE,$80),($EE,$04),($EE,$02),($EE,$01),($ED,$80),($ED,$40),($ED,$20),($ED,$10),($ED,$08),($00,$00),($ED,$04),($00,$00),($ED,$02),($00,$00),($00,$00),($00,$00),($ED,$01));const PinConnectV2: array[1..40,1..2] of byte ={== tabulka pro pripojeni prevodniku s vahou 0.6 k pinum, na prvni ==}{== pozici registr pro pripojeni, na druhe pozici maska ==}{== pinu v registru ==}(($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($F1,$01),($F1,$02),($F1,$04),($F1,$08),($F1,$10),($F1,$20),($F1,$40),($F1,$80),($F2,$01),($F2,$02),($F2,$04),($F2,$08),($F2,$10),($F2,$20),($F2,$40),($F2,$80),($F3,$01),($F3,$02),($F3,$04),($F3,$08),($F3,$10),($F3,$20),($F3,$40),($F3,$80),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00),($00,$00));const PinConnectV3: array[1..40,1..2] of byte ={== tabulka pro pripojeni prevodniku s vahou 1 k pinum, na prvni ==}{== registr pro pripojeni, na druhe pozici maska pinu v registru ==}(($E8,$01),($00,$00),($00,$00),($00,$00),($E8,$10),($E8,$20),($E8,$40),($00,$00),($E9,$01),($E9,$02),($E9,$04),($E9,$08),($E9,$10),($E9,$20),($E9,$40),($E9,$80),($EA,$01),($EA,$02),($EA,$04),($EA,$08),($EA,$10),($EA,$20),($EA,$40),($EA,$80),($EB,$01),($EB,$02),($EB,$04),($EB,$08),($EB,$10),($EB,$20),($EB,$40),($EB,$80),($00,$00),($00,$00),($00,$00),($EC,$08),($00,$00),($00,$00),($00,$00),($00,$00));{== definice globalnich promennych ==}var BazovaAdresa : word;Error : integer; { cislo chyby }PortStat : array[1..5] of byte; { aktualni stavy pinu }ConnectV1Stat: array[1..2] of byte; { aktualni pripojeni prevodniku V1 }ConnectV2Stat: array[1..3] of byte; { aktualni pripojeni prevodniku V2 }ConnectV3Stat: array[1..5] of byte; { aktualni pripojeni prevodniku V3 }GndStat : boolean; { =1 GND na 11, =0 GND na 20 }{== vykonne procedury TPU ==}{== Vytiskne hlaseni o chybe a ukonci program ==}procedure ErrorProc;beginwriteln;write('Error: ');case Error of0:writeln('Zadna Chyba');1:writeln('Napeti pro prevodnik mimo rozsah');2:Writeln('Spatny stav pinu, mozne pouze 0 nebo 1');3:Writeln('Pin mimo rozsah, mozne 1-40, u pripojeni prevodniku jen nektere');end; {case}writeln;halt(1);end; {End Error}{== Zapise bajt do prislusneho registru programatoru ==}procedure OutPort(Adr, Data : byte);beginasmmov dx,BazovaAdresamov al,Adrout dx,aladd dx,2mov al,Dataout dx,alend; {asm}end; {OutPort}{== Precte bajt a prislusneho registru programatoru ==}function InPort(Adr : byte) : byte;beginasmmov dx,BazovaAdresamov al,Adrout dx,aladd dx,2in al,dxmov Adr,alend; {asm}InPort := Adr;end;{== Zinicializuje programator ==}procedure PowerOff;var n,i :byte;beginfor i:= 1 to InitNum doOutPort(InitArray[i,1],InitArray[i,2]);{--- nastav otisk pinu}for i:= 1 to 5 doPortStat[i]:=255;{--- nastav otisk pripojeni prevodniku V1}for i:=1 to 2 doConnectV1Stat[i]:=0;{--- nastav otisk pripojeni prevodniku V2}for i:=1 to 3 doConnectV2Stat[i]:=0;{--- nastav otisk pripojeni prevodniku V3}for i:=1 to 5 doConnectV3Stat[i]:=0;end; {PowerOff}{== Inicializace programatoru se zadanim Bazove adresy ==}procedure Initialize(Baze :word);beginBazovaAdresa:=Baze;Error:=0;GndStat:=false;PowerOff;end; {Initialize}{== Zadani napeti pro prevodnik s vahou 0.4 ==}procedure SetVoltageV1(Napeti : real);var Voltage:Integer;beginif Napeti<=9.6 then begin Voltage:=Round(((255/9.5)*Napeti));OutPort(231,Voltage);endelse begin Error:=1;end;end; {SetVoltageV1}{== Zadani napeti pro prevodnik s vahou 0.6 ==}procedure SetVoltageV2(Napeti : real);var Voltage:Integer;beginif Napeti<=14.4 then begin Voltage:=Round(((255/14.4)*Napeti));OutPort(230,Voltage);endelse begin Error:=1;end;end; {SetVoltageV2}{== Zadani napeti pro prevodnik s vahou 1 ==}procedure SetVoltageV3(Napeti : real);var Voltage:Integer;beginif Napeti<=25 then begin Voltage:=Round(((255/24)*Napeti));OutPort(229,Voltage);endelse begin Error:=1;end;end; {SetVoltageV1}{== Nastaveni pinu ==}procedure SetBit(Pin,Stav:byte);var PozReg:byte;beginif (Pin>=1) and (Pin<=40)then begin{--- urceni indexu I/O registru pro pole otisku}if (Pin>=1) and (Pin<=8) then PozReg:=1;if (Pin>=9) and (Pin<=16) then PozReg:=2;if (Pin>=17) and (Pin<=24) then PozReg:=3;if (Pin>=25) and (Pin<=32) then PozReg:=4;if (Pin>=33) and (Pin<=40) then PozReg:=5;if Stav=1then begin{--- pin do Log.1, zaznam do otisku}PortStat[PozReg]:=PortStat[PozReg] or PinSet[Pin,2];OutPort(PinSet[Pin,1],PortStat[PozReg]);{ writeln(PortStat[PozReg]); }endelse Error:=2;if Stav=0then begin{--- pin do log.0, zaznam do otisku}PortStat[PozReg]:=PortStat[PozReg] and not(PinSet[Pin,2]);OutPort(PinSet[Pin,1],PortStat[PozReg]);{ writeln(PortStat[PozReg]); }endelse Error:=2;endelse Error:=3;end; {SetBit}{== Cteni bitu jako procedura ==}procedure GetBitProc (Pin:byte;var Stav:byte);var ReadBit:byte;beginif (Pin>=1) and (Pin<=40)then beginReadbit:=InPort(PinSet[Pin,1]) and PinSet[Pin,2];if ReadBit=0 then Stav:=0else Stav:=1;endelse Error:=3;end; {GetbitProc}{== Cteni bitu jako funkce ==}function GetBit(Pin:byte):byte;var ReadBit:byte;beginReadbit:=InPort(PinSet[Pin,1]) and PinSet[Pin,2];if ReadBit=0 then GetBit:=0else GetBit:=1;end; {Getbit}{== Pripojeni prevodniku V1 s vahou 0.4 ==}procedure ConnectV1(Pin:byte;On:boolean);var PozReg:byte;TestPin:boolean;begin{--- lze pripojit k pinum 24,26-32,34,36 a 40}TestPin:=(Pin>=26) and (Pin<=32)or (Pin=24) or (Pin=34) or (Pin=36) or (Pin=40);if TestPinthen begin{ writeln('V1 ',Pin); }{--- urceni indexu I/O registru pro pole otisku}if Pin=24 then PozReg:=3;if (Pin>=25) and (Pin<=32) then PozReg:=4;if (Pin>=33) and (Pin<=40) then PozReg:=5;{--- na pin se musi zapsat log.1, udelej zaznam do otisku}PortStat[PozReg]:=PortStat[PozReg] or PinSet[Pin,2];{ writeln(PinSet[Pin,1],' ',PortStat[PozReg]); }{--- urci registr v poli otisku pripojeni}if (Pin>=24) and (Pin<=27) then PozReg:=1else PozReg:=2;if Onthen {--- udelej zaznam o pripojeni do otisku}ConnectV1Stat[PozReg] := ConnectV1Stat[PozReg]or PinConnectV1[Pin,2]else {--- udelej zaznam o odpojeni do otisku}ConnectV1Stat[PozReg] := ConnectV1Stat[PozReg]and not( PinConnectV1[Pin,2]);OutPort(PinConnectV1[Pin,1],ConnectV1Stat[PozReg]);endelse Error:=3;end; {ConnectV1}{== Pripojeni prevodniku V2 s vahou 0.6 ==}procedure ConnectV2(Pin:byte;On:boolean);var PozReg:byte;TestPin:boolean;begin{--- lze pripojit piny 9-32}TestPin:=(Pin>=9) and (Pin<=32);{--- pokud je pouzit pin 11 nebo 20 jako zem, nejze na nej ---}{--- pripojit prevodnik ---}if (Pin=11) and GndStat then TestPin:=false; { pin 11 je uzemen }if (Pin=20) and Not(GndStat) then TestPin:=false; { pin20 je uzemen }if TestPinthen begin{ writeln('V2 ',Pin); }{--- urceni indexu I/O registru pro pole otisku}if (Pin>=9) and (Pin<=16) then PozReg:=2;if (Pin>=17) and (Pin<=24) then PozReg:=3;if (Pin>=25) and (Pin<=32) then PozReg:=4;{--- na pin je nutne zapsat log.1, udelej zapis do otisku}PortStat[PozReg]:=PortStat[PozReg] or PinSet[Pin,2];{nastav na pin log.1}OutPort(PinSet[Pin,1],PortStat[PozReg]);{ writeln(PinSet[Pin,1],' ',PortStat[PozReg]); }{--- urci registr otisku pripojeni}if (Pin>=9) and (Pin<=16) then PozReg:=1;if (Pin>=17) and (Pin<=24) then PozReg:=2;if (Pin>=25) and (Pin<=32) then PozReg:=3;if Onthen {--- udelej zaznam o pripojeni do otisku}ConnectV2Stat[PozReg] := ConnectV2Stat[PozReg]or PinConnectV2[Pin,2]else ConnectV2Stat[PozReg] := ConnectV2Stat[PozReg]and not(PinConnectV2[Pin,2]);OutPort(PinConnectV2[Pin,1],ConnectV2Stat[PozReg]);endelse Error:=3;end; {ConnectV2}{== Pripojeni prevodniku V3 s vahou 1 ==}procedure ConnectV3(Pin:byte;On:boolean);var PozReg:byte;TestPin:boolean;begin{--- lze pripojit k pinum 1,5-7,9-32,a36}TestPin:=(Pin>=9)and(Pin<=32)or(Pin=1)or((Pin>=5)and(Pin<=7))or(Pin=36);{--- pokud je pouzit pin 11 nebo 20 pro zem, nelze na nej ---}{--- pripojit prevodnik ---}if (Pin=11) and GndStat then TestPin:=false; { pin 11 je uzemen }if (Pin=20) and Not(GndStat) then TestPin:=false; { pin20 je uzemen }if TestPinthen begin{ writeln('V3 ',Pin); }{--- urceni indexu I/O registru pro pole otisku }if (Pin>=1) and (Pin<=8) then PozReg:=1;if (Pin>=9) and (Pin<=16) then PozReg:=2;if (Pin>=17) and (Pin<=24) then PozReg:=3;if (Pin>=25) and (Pin<=32) then PozReg:=4;if (Pin>=33) and (Pin<=40) then PozReg:=5;{ writeln(PozReg); }{--- na pin nutno zapsat log.1 , udelej zapis do otisku }PortStat[PozReg] := PortStat[PozReg]or PinSet[Pin,2]; { nastav na pin log.1 }OutPort(PinSet[Pin,1],PortStat[PozReg]);{ writeln(PinSet[Pin,1],' ',PortStat[PozReg]); }{--- urci registr otisku pripojeni}if (Pin>=1) and (Pin<=7) then PozReg:=1;if (Pin>=9) and (Pin<=16) then PozReg:=2;if (Pin>=17) and (Pin<=24) then PozReg:=3;if (Pin>=25) and (Pin<=32) then PozReg:=4;if (Pin=36) then PozReg:=5;if Onthen ConnectV3Stat[PozReg] := ConnectV3Stat[PozReg]or PinConnectV3[Pin,2]else ConnectV3Stat[PozReg] := ConnectV3Stat[PozReg]and not(PinConnectV3[Pin,2]);OutPort(PinConnectV3[Pin,1],ConnectV3Stat[PozReg]);endelse Error:=3;end; {ConnectV3}{== Prepinani zeme mezi vyvody 11 nebo 20 ==}{ True = pripojen Pin11 }{ False = pripojen pin20 }procedure Gnd11(On:boolean);beginif On then beginOutPort($EF,1);GndStat:=true;endelsebeginOutPort($EF,0);GndStat:=false;end;end; {Gnd11}{== Ovladani LED 'GOOD' ==}{ True = sviti }procedure Led(On:boolean);beginif On then OutPort($F7,$8)else OutPort($F7,$0);end; {Led}{== Cteni tlacitka 'YES' ==}{ True = stisknut }function ReadButton:boolean;beginPowerOff;xDelay(50);writeln(InPort($E4));if (InPort($E4)and $80)<>0 then ReadButton:=trueelse ReadButton:=false;end; {ReadButton}beginend.