Woohoo.. Jeg sider lige og tænker på hvad det nu var at man kunne bruge port og portw.
Så vidt jeg husker er det vist noget direkte hw/bios tilgang noget, som IKKE er særlig heldigt i windows og dermed delphi. Så svaret er at port/portw/og lign. ikke findes i delphi. (tror jeg :)
Kære venner, I har ret: det var for upræcist. Mit problem er at addressere I2C bussen, som benytter 3 af benene i parallelporten. Jeg skal bruge det til et Welleman byggesæt, og det fungere fint under DOS med brug af port[], men der er svare problemer i 32 bits miljøet: Faktisk er der er ingen mulighed for direkte portadressering; M$ vil styre det hele. Jeg svævede rundt på deja.com igår og fandt et indlæg fra en, som jeg nu har mailet. Hvis løsningen kommer af den vej skal jeg nok holde jer underrettet.
unit Port95; {********************************************************************** * Description: Port95 - very simple unit, that lets you access port * * under Window 95,not under Windows NT. * * Status: Freeware * * You can freely use or distribute this unit * * Target: Delphi 2 and Windows 95 * * Version: 1.0 (April 27, 1997 * * Status: Freeware * * Author: Anatoly Podgoretsky * * Address: kvk@estpak.ee * * Tips: font Courier, tabs = 2 * * Problems: Word Read/Write utulities may problems on some * * computers or interface cards, that can't access whole * * word. To prevent it You can use slow equivalent of * * these procedures with suffix LS * * Copyright: Copyright (C) 1997, NPS * **********************************************************************}
interface
function PortReadByte(Addr:Word) : Byte; function PortReadWord(Addr:Word) : Word; function PortReadWordLS(Addr:Word) : Word; procedure PortWriteByte(Addr:Word; Value:Byte); procedure PortWriteWord(Addr:Word; Value:Word); procedure PortWriteWordLS(Addr:Word; Value:Word);
implementation
{**************************************************************** * Port Read byte function * * Parameter: port address * * Return: byte value from given port * ****************************************************************} function PortReadByte(Addr:Word) : Byte; assembler; register; asm MOV DX,AX IN AL,DX end; {**************************************************************** * HIGH SPEED Port Read Word function * * Parameter: port address * * Return: word value from given port * * Comment: may problem with some cards and computers * * that can't to access whole word, usualy it work. * ****************************************************************} function PortReadWord(Addr:Word) : Word; assembler; register; asm MOV DX,AX IN AX,DX end; {**************************************************************** * LOW SPEED Port Read Word function * * Parameter: port address * * Return: word value from given port * * Comment: work in all cases, only to adjust DELAY if need * ****************************************************************} function PortReadWordLS(Addr:Word) : Word; assembler; register; const Delay = 150; // depending of CPU speed and cards speed asm MOV DX,AX IN AL,DX // read LSB port MOV ECX,Delay @1: LOOP @1 // delay between two reads XCHG AH,AL INC DX // port+1 IN AL,DX // read MSB port XCHG AH,AL // restore bytes order end; {**************************************************************** * Port Write byte function * * Parameter: port address * ****************************************************************} procedure PortWriteByte(Addr:Word; Value:Byte); assembler; register; asm XCHG AX,DX OUT DX,AL end; {**************************************************************** * HIGH SPEED Port Write word procedure * * Comment: may problem with some cards and computers * * that can't to access whole word, usualy it work. * ****************************************************************} procedure PortWriteWord(Addr:word; Value:word); assembler; register; asm XCHG AX,DX OUT DX,AX end; {**************************************************************** * LOW SPEED Port Write Word procedure * * Parameter: port address * * Return: word value from given port * * Comment: work in all cases, only to adjust DELAY if need * ****************************************************************} procedure PortWriteWordLS(Addr:word; Value:word); assembler; register; const Delay = 150; // depending of CPU speed and cards speed asm XCHG AX,DX OUT DX,AL // port LSB MOV ECX,Delay @1: LOOP @1 // delay between two writes XCHG AH,AL INC DX // port+1 OUT DX,AL // port MSB end;
Det virker desværre ikke under Delphi 3. Jeg vil tro det vil virke i et 16 bits program, men det kan Delphi 3 desværre ikke lave. Når M$ nu har fjernet muligheden for direkte adressering burde der jo være en officiel vej til I2C bussen eller andre porte. Nogen bud?
PORt kommandoerne i Pascal bruger man til at styre I/O-kort (relækort) s¨ledes at man f.eks. kan tænde og slukke lys, pumper, transportb¨nd m.m.
Hvordan det virker under windows95 ved jeg ikke, men man burde kunne benytte samme fremgangsm¨de som i pascal, bortset fra at der ikke eksisterer post-kommandoer i delphi (til dette form¨l i hvertfald).
Under NT er det anderledes. Først skal der installeres en driver til det p¨gældende kort, og derefter, afhængig af driveren, kan man installere et komponent der taler med driveren og som tilbyder de "gamle" porte som properties. S¨generelt vil det under NT være et spørgsm¨l om at læse/skrive properties til et komponent der kan genkende kortet via den installerede driver.
Jeg har nu fundet ikke mindre end to løsninger: Der findes to freeware device drivers, som muliggør direkte portadgang i både Win9x og NT. Der er endda udviklet components som kan anvendes direkte i Delphi 3/4 samt i diverse andre programmeringssprog. Jeg har prøvet dem og de virker uden problemer. Jeg fandt dem ved gentagne søgninger i Deja.com.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.