Avatar billede hhjollund Praktikant
22. september 1999 - 20:57 Der er 19 kommentarer og
1 løsning

Portaddressering

I Turbo-pascal addresseres porte via de to foruddefinerede ARRAYS Port[] og PortW[]. Hvordan gør man det i DELPHI ?
Avatar billede snorga Nybegynder
23. september 1999 - 09:32 #1
Sikkert via API kald..
Avatar billede lrj Nybegynder
23. september 1999 - 09:47 #2
Hvad vil du med det? Hvad skal det bruges til? Hvilken slags porte snakker vi om? COM eller logiske porte i TC/PIP?

Du er nok nødt til at præcisere... : )
Avatar billede snorga Nybegynder
23. september 1999 - 09:51 #3
Mon ikke her er snakket om Com/LPT porte?
Avatar billede lrj Nybegynder
23. september 1999 - 09:52 #4
Hvor skulle jeg dog vide det fra?
Avatar billede lrj Nybegynder
23. september 1999 - 09:52 #5
Det kunne jo også være til en port-scanner...

Folk laver de mærkeligste ting ;o)
Avatar billede snorga Nybegynder
23. september 1999 - 09:55 #6
>>lrj, Tager du en cola med?
Avatar billede lrj Nybegynder
23. september 1999 - 10:27 #7
>>snorga, Det kunne du jo bare have skrevet i en mail - var lige ved ikke at finde det : )
Avatar billede tknudsen Nybegynder
23. september 1999 - 15:25 #8
måske er det logiske I/O porte ?!
Avatar billede lrj Nybegynder
23. september 1999 - 15:32 #9
Jeg tror vi er nødt til at vente på at hhjollund kommenterer sit eget spørgsmål - det er alt for uklart i sin nuværende form...

Det kunne jo også være TCP/IP porte...
Avatar billede snorga Nybegynder
23. september 1999 - 15:48 #10
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 :)
Avatar billede lrj Nybegynder
23. september 1999 - 15:50 #11
.. men tilsvarende funktionalitet kan opnås på andre muligheder gennem windows api. Hvad er det du vil bruge denne hardware/bios-adgang til?
Avatar billede hhjollund Praktikant
23. september 1999 - 22:14 #12
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.
Avatar billede rnh Nybegynder
24. september 1999 - 10:51 #13
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;

end.
Avatar billede rnh Nybegynder
24. september 1999 - 10:52 #14
Men virker ikke under NT
Avatar billede hhjollund Praktikant
24. september 1999 - 21:50 #15
Det ser lovende ud. Jeg vender tilbage efter jeg har afprøvet det i løbet af weekenden
Avatar billede hhjollund Praktikant
26. september 1999 - 22:27 #16
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?
Avatar billede justincase Nybegynder
02. oktober 1999 - 10:39 #17
Jeg lavede et program engang med Delphi3 der læste parallelporten.

Jeg mener det var noget lignende det her :

Var
  ByteRead : BYTE;
begin
  asm
    MOV dx,$379;
    IN  al,dx;
    MOV ByteRead,al;
  end;
  return ByteRead;
end;

Jeg prøver lige at se om jeg ikke kan finde sourcen.


:)

JustinCase
Avatar billede snorga Nybegynder
12. oktober 1999 - 08:51 #18
>>JustinCase, har du fundet noget?
Avatar billede sjensen Nybegynder
13. oktober 1999 - 12:32 #19
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.

Sjensen
Avatar billede hhjollund Praktikant
11. november 1999 - 20:44 #20
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.

URL:
TVicHW32: www.entechtaiwan.com/tools.html

TDLPortIO:
www.diskdude.cjb.net/files/cbuilder/DLPortIO/port95nt.exe
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester