Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Hrvoje Mojster
Pridružen/-a: Ned Apr 2005 13:50 Prispevkov: 48
|
Objavljeno: Sre Maj 11, 2005 4:17 pm Naslov sporočila: LPT I/O komunikacija |
|
|
Zna li tko kako pomoću delphi7 kontrolorati LPT I/O? |
|
Nazaj na vrh |
|
|
slawc Profesionalec
Pridružen/-a: Tor Jan 2004 11:41 Prispevkov: 102
|
Objavljeno: Sre Maj 11, 2005 9:25 pm Naslov sporočila: |
|
|
Kateri operacijski sistem? Win98, win2k ali XP?
Sam imam C++ Builder in Win2k, obvezno je potrebno uporabiti dodatni driver (DLL). _________________ LP,
Slawc |
|
Nazaj na vrh |
|
|
MarE Profesionalec
Pridružen/-a: Pet Nov 2004 23:38 Prispevkov: 177
|
Objavljeno: Čet Maj 12, 2005 10:09 am Naslov sporočila: |
|
|
Jaz imam na LPT obešen šift register 4094 in ga iz (win2k ali XP) krmilim preko enega inpout32.dll.
Lahko pripopam tudi nekaj kode:
0. Nekaj makrov za začetek:
Koda: | /*************************************************/
/*LPT Plate*/
/* prototype (function typedef) for DLL function Inp32: */
typedef short _stdcall (*inpfuncPtr)(short portaddr);
typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);
HINSTANCE hLib;
inpfuncPtr inp32;
oupfuncPtr outp32;
/*
* LPT port settings
*/
#define BASE 0x378 //lpt base register address
|
1. Nalaganje DDLja
Koda: | int _stdcall tLPTIO::IO_lib_init(void) {
/* Load the library */
hLib = LoadLibrary("inpout32.dll");
if (hLib == NULL) {
Application->MessageBox("LoadLibrary failed.", "Error!", MB_OK);
return -1;
}
/* get the address of the function */
inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
if (inp32 == NULL) {
Application->MessageBox("GetProcAddress for Inp32 Failed.", "Error!", MB_OK);
return -1;
}
outp32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");
if (outp32 == NULL) {
Application->MessageBox("GetProcAddress for Oup32 Failed.", "Error!", MB_OK);
return -1;
}
return 0; // OK
}
|
Takole pa "nafilam" verižico štirih 4049:
Koda: | void _stdcall tHYBIO::io1 ( unsigned long int komb)
{
unsigned char i,x;
x=inp32(BASE);
outp32 ( BASE,x);
for (i=31; i!=0; i--) {
x&=0xfb; // clr Data
x|=((komb>>i)&1)<<2; // Data
outp32 ( BASE,x);
x|=0x02; // clk = 1
outp32 ( BASE,x);
x&=0xfd; // clk = 0;
outp32 ( BASE,x);
}
}
|
Namesto funkcij pa lahko uporabljaš kar makroje:
Koda: | #define DATA_IN() (_inp(BASE))
#define DATA_OUT(b) (_outp(BASE,(b)))
#define CTRL_IN() (_inp(BASE+2))
#define CTRL_OUT(b) (_outp(BASE+2,(b)))
/*
SHIFT register manipulation macros
*/
#define MAX_DEVICES 4
#define SET_TO_1(b) (outp32(BASE,(BYTE )(inp32(BASE)|(1<<b))))
#define SET_TO_0(b) (outp32(BASE,(BYTE )(inp32(BASE)&~(1<<b))))
#define TOGGLE(b) (outp32(BASE,(BYTE )(inp32(BASE)^(1<<b))))
|
Tole premetat iz C++ v delphi (pascal) nebi smelo biti problema.
LP,
Mare |
|
Nazaj na vrh |
|
|
iskra Profesionalec
Pridružen/-a: Tor Jan 2004 16:29 Prispevkov: 254 Kraj: Sežana
|
|
Nazaj na vrh |
|
|
Hrvoje Mojster
Pridružen/-a: Ned Apr 2005 13:50 Prispevkov: 48
|
Objavljeno: Čet Maj 12, 2005 1:36 pm Naslov sporočila: |
|
|
inace koristim xp windose ali trebao bih za delphi6 ili 7 source kod za pisanje na portove! |
|
Nazaj na vrh |
|
|
tonni Profesionalec
Pridružen/-a: Tor Jan 2004 9:27 Prispevkov: 108
|
Objavljeno: Čet Maj 26, 2005 4:58 am Naslov sporočila: |
|
|
ojla
jaz v delphiju uporabljam to:
Koda: |
Procedure OutPortb(NaslovVrat:Smallint;Vrednost:Smallint);
Var ByteVrednost:word;
Begin
ByteVrednost:=Vrednost;
asm
push dx
mov dx,NaslovVrat
mov ax,ByteVrednost
out dx,ax
pop dx
end;
end;
function InPortb(NaslovVrat:Smallint):smallint;
Var ByteVrednost:word;
begin
asm
push dx
mov dx,NaslovVrat
in ax,dx
mov ByteVrednost,ax
pop dx
end;
InPortb:=smallint(ByteVrednost) and $00FF;{zanima nas samo spodnjih osem bitov}
end;
// Branje
vhod:= inportb(naslov_vrat);
// Vpis
outportB(naslov_vrat,vrednost);
|
|
|
Nazaj na vrh |
|
|
Hrvoje Mojster
Pridružen/-a: Ned Apr 2005 13:50 Prispevkov: 48
|
Objavljeno: Čet Maj 26, 2005 9:55 am Naslov sporočila: |
|
|
hvala ti na pomoci, mozes li mi jos molim te reci kako odabrati na koji port pises, ja moram pisati na LPT port |
|
Nazaj na vrh |
|
|
tonni Profesionalec
Pridružen/-a: Tor Jan 2004 9:27 Prispevkov: 108
|
Objavljeno: Čet Maj 26, 2005 7:12 pm Naslov sporočila: |
|
|
Lpt port ima osnovni naslov $387.
primer:
Koda: |
var vhod:byte;
vhod:=inportb($387); iz porta preberes vrednost in jo nalozis v "vhod"
outportb($387,5); na LPT port vpises vrednost 5
|
lahko vpisujes v katerikoli port (razne in/out kartice)vedeti
moras samo naslov.
lp |
|
Nazaj na vrh |
|
|
tonni Profesionalec
Pridružen/-a: Tor Jan 2004 9:27 Prispevkov: 108
|
Objavljeno: Čet Maj 26, 2005 7:15 pm Naslov sporočila: |
|
|
za serijsko komunikacijo pa uporabljam od Dejana Cernile
komponento,ki je brezplacna in se dobi na netu.
lp |
|
Nazaj na vrh |
|
|
MarE Profesionalec
Pridružen/-a: Pet Nov 2004 23:38 Prispevkov: 177
|
Objavljeno: Pet Maj 27, 2005 12:00 pm Naslov sporočila: |
|
|
tonni je napisal/a: | ojla
jaz v delphiju uporabljam to:
Koda: |
Procedure OutPortb(NaslovVrat:Smallint;Vrednost:Smallint);
Var ByteVrednost:word;
Begin
ByteVrednost:=Vrednost;
asm
push dx
mov dx,NaslovVrat
mov ax,ByteVrednost
out dx,ax
pop dx
end;
end;
function InPortb(NaslovVrat:Smallint):smallint;
Var ByteVrednost:word;
begin
asm
push dx
mov dx,NaslovVrat
in ax,dx
mov ByteVrednost,ax
pop dx
end;
InPortb:=smallint(ByteVrednost) and $00FF;{zanima nas samo spodnjih osem bitov}
end;
// Branje
vhod:= inportb(naslov_vrat);
// Vpis
outportB(naslov_vrat,vrednost);
|
|
To deluje na WIN98. Na XP/2000 ne bo delalo. |
|
Nazaj na vrh |
|
|
Hrvoje Mojster
Pridružen/-a: Ned Apr 2005 13:50 Prispevkov: 48
|
Objavljeno: Pet Maj 27, 2005 2:07 pm Naslov sporočila: |
|
|
ja prenesem kod u delphi ali uvijek mi se pojavi error pri izvođenju funkcije: "Project Project1.exe raised exception class EPrivilege with message. 'Privileged instruction' ..." i nikako da to premostim, ali mozda je to zato sto koristim xp windowse?
Jos nesto, mozete li mi objasniti ovu naredbu :
InPortb:=smallint(ByteVrednost) and $00FF; |
|
Nazaj na vrh |
|
|
slawc Profesionalec
Pridružen/-a: Tor Jan 2004 11:41 Prispevkov: 102
|
Objavljeno: Sob Maj 28, 2005 12:11 am Naslov sporočila: |
|
|
To je zaradi Windows XP. Isto je z Windows2000.
Uporabi inpout32.dll (http://www.logix4u.net/parallelport1.htm)
Obstaja se en program, ki "odklene" dostop do pomnilniskih lokacij. Zal sem pozabil ime in link. Vcasih sem ga tudi sam uporabljal, dela OK (vendar mi je pristop z inpout32.dll bolj vsec). _________________ LP,
Slawc |
|
Nazaj na vrh |
|
|
MarE Profesionalec
Pridružen/-a: Pet Nov 2004 23:38 Prispevkov: 177
|
Objavljeno: Ned Maj 29, 2005 10:29 pm Naslov sporočila: |
|
|
slawc je napisal/a: | Obstaja se en program, ki "odklene" dostop do pomnilniskih lokacij. Zal sem pozabil ime in link. Vcasih sem ga tudi sam uporabljal, dela OK (vendar mi je pristop z inpout32.dll bolj vsec). |
Ja, to je directIO |
|
Nazaj na vrh |
|
|
|