![]() |
| |
| ||
Programmierung und Zugang zu Häfen
Erstens ist etwas Verfahren wegen es, Sie fähig sein, sich zu entschließen, welcher die gemeine Adresse für den schnittstelle ist.
Als es wurde vorher gesagt, der parallele schnittstelle hat seine gemeine Adresse in Doppelverkehr von Gedächtnis aufeinanderfolgend. Dann ist der Inhalt dieser Richtungen des Gedächtnisses wegen gelesen, um sich zu entschließen, wenn ein schnittstelle existiert, und das seine Richtung ist.
MSDOS
Unter MSDOS kann der externe Befehl gebrauchte debug.exe auf die folgende Weise sein:
Exec der Befehl: debug.exe, bald erscheint das Symbol -
Schreiben Sie d 40:0008 nach diesem Zeichen
Von der Ausrüstung abzuhängen, erscheint den Staat der Erinnerung an die folgende Form: (die Daten können sich ändern)
0040:0000 ______________________78 03 00 00 00 00 00 00
Die Richtung des schnittstelles ist in umgekehrter Form (78 03), dann ist die Richtung:
0378 in hexadecimal. Es ist möglich, Benachrichtigung zu machen, daß diese Richtung in anderem PC anders sein kann.
(Schreiben Sie Q, um debug.exe zu verlassen)
In Turbo Pascal mit Assembler
Program buscar_base;
uses crt;
Var base : word;
begin
asm
mov ax, 0040h {Colocar 0040h en el reg. Ax}
mov es, ax {Direccionar el segmento es con el valor de ax}
mov ax, es:[si] {Colocar en ax el contenido de la dirección de memoria [0040:0008]}
mov base, ax; {Actualizar la variable base con el valor de ax}
end;
writeln (' La dirección base en decimal es : ',base);
end.
In Turbo Pascal
Program buscar_base;
uses crt;
Var base:word;
Begin
base:=memW[$0040:$0008];
writeln('La dirección base en decimal es : ',base);
end.
paralleler schnittstelleanalysator
Dieser Analysator wird benutzt, die gemeine Adresse für den schnittstelle zu bestimmen, und außerdem erlaubt er es, den Inhalt von den Rekorden in ununterbrochener Form und binärem Format und hexadecimal vorzustellen.
Dieses Programm stellt mit Turbo Pascal zusammen.
hotmail.com>]');{Archivo analisis.pas}
{Analizador de estado del Puerto Paralelo}
{Autor: Juan Carlos Galarza Roca}
{Diciembre de 1997}
{Versión : 1.0}
Program analisis_PP;
uses crt, dos, cadena, utiles;
var
dir_base,
dir_estado,
dir_control : Word;
puntero_int_1C : Pointer;
tick : Integer;
sw_m_t : Integer;
{$F+,S-,W-}
procedure manejador; interrupt;
{Este manejador se utiliza para temporizar el despliegue del
indicador de exploración, de modo que se haga la lectura de
datos y a la vez se despliegue el indicador}
var
a,
b,
x,
y : Integer;
begin
if sw_m_t=0 then begin;
{sw_m_t es la bandera del manejador de tareas
Esta bandera es actualizada por el programa
principal
}
x:=whereX;
y:=whereY;
{se guarda la posición del cursor en la pantalla}
tick:=tick+1;
{ La variable tick se incrementa cada 18,20677500572 segundos}
a:=6;
b:=3;
textcolor(7);
gotoxy(39+a,b);write('Explorando... ');
textcolor(2);
case tick of
13: begin gotoxy(60+a,b); write('> ');
gotoxy(52+a,b); write(' <');end;
15: begin gotoxy(60+a,b); write('-> ');
gotoxy(52+a,b) ;write(' <-');end;
17: begin gotoxy(60+a,b); write(' -> ');
gotoxy(52+a,b); write(' <- ');end;
19: begin gotoxy(60+a,b); write(' -> ');
gotoxy(52+a,b); write(' <- ');end;
21: begin gotoxy(60+a,b); write(' -> ');
gotoxy(52+a,b); write(' <- ');end;
23: begin gotoxy(60+a,b); write(' -> ');
gotoxy(52+a,b); write(' <- ');end;
25: begin gotoxy(60+a,b); write(' <- ');
gotoxy(52+a,b); write('< ');end;
27: begin gotoxy(60+a,b); write(' <- ');
gotoxy(52+a,b); write(' -> ');end;
29: begin gotoxy(60+a,b); write(' <- ');
gotoxy(52+a,b); write(' -> ');end;
31: begin gotoxy(60+a,b); write(' <- ');
gotoxy(52+a,b); write(' -> ');end;
33: begin gotoxy(60+a,b); write('<- ');
gotoxy(52+a,b); write(' -> ');end;
34: tick:=13;
end;
gotoxy(x,y);
{Devolver la posición original del cursor}
end;
end;
{$F-,S+}
begin
cursor_off;
tick:=0;
{Colocar el manejador de tareas}
GetIntVec($1C,puntero_int_1C);
SetIntVec($1C,Addr(manejador));
clrscr;
dir_base:=memW[$0040:0008];
dir_estado:=dir_base+1;
dir_control:=dir_base+2;
textcolor(2);
gotoxy(23,2);writeln('Analizador del Puerto Paralelo');
textcolor(9);
gotoxy(8,4); writeln('Direcciones: ');
textcolor(9);
gotoxy(10,5); writeln('Datos : ',dec_a_hexa(dir_base),' (h)');
gotoxy(10,6); writeln('Estado : ',dec_a_hexa(dir_estado),' (h)');
gotoxy(10,7); writeln('Control: ',dec_a_hexa(dir_control),' (h)');
{Ciclo repetivo principal}
repeat
sw_m_t:=1;
textcolor(9);
gotoxy(34,4); writeln('Estado: ');
gotoxy(36,5); write('Datos : ',port[dir_base]:3,' (d) ');
dec_bin(port[dir_base]);write(' (b)');
gotoxy(36,6); write('Estado : ',port[dir_estado]:3,' (d) ');
dec_bin(port[dir_estado]);write(' (b)');
gotoxy(36,7); write('Control: ',port[dir_control]:3,' (d) ');
dec_bin(port[dir_control]);write(' (b)');
textcolor(7);
gotoxy(9,9); write('Registro de Datos');
gotoxy(25,10); write('Pines 9 8 7 6 5 4 3 2');
gotoxy(25,11); write('Nombre D7 D6 D5 D4 D3 D2 D1 D0');
textcolor(2);
gotoxy(25,12); write('Valor '); dec_bin2(port[dir_base]);
textcolor(7);
gotoxy(9,14); write('Registro de Estado');
gotoxy(25,15); write('Pines 11 10 12 13 15 ** ** **');
gotoxy(25,16); write('Nombre -S7 S6 S5 S4 S3 ** ** **');
textcolor(2);
gotoxy(25,17);write('Valor '); dec_bin2(port[dir_estado]);
textcolor(7);
gotoxy(9,19); write('Registro de Control');
gotoxy(25,20); write('Pines ** ** ** ** 17 16 14 1');
gotoxy(25,21); write('Nombre ** ** ** ** -C3 C2 -C1 -C0');
textcolor(2);
gotoxy(25,22);write('Valor '); dec_bin2(port[dir_control]);
textcolor(2);
gotoxy(8,24);write('[Copyrigth (c) 1997 por JCGR Soft <pparalelo@
textcolor(7);
sw_m_t:=0;
delay(100);
until keypressed;
cursor_on;
{Restaurar manejador de tareas}
SetIntVec($1C,puntero_int_1C);
end.
Sendung und Interpretation der Daten des schnittstelles
Sendung von Daten zum schnittstelle
Der parallele schnittstelle kann wie eine direkte Kommunikation mit dem PC benutzt werden, auf diese Art ist möglich, Anträge in Zeit-wirklich zu entwickeln, daß braucht eine schnelle Antwortzeit.
Der Zugang, der ein Byte (8 Stückchen) in bestimmte Aufzeichnung Schreiben, wird. Dieses Byte muß ungefähr mit jedem einen von den Stückchen von der Aufzeichnung sprechen. Dies bedeutet, daß das Byte wegen es ist, definieren Sie, um in binäres System zu schreiben.
Zum Beispiel wenn wir wollen, ist dem Stückchen dann den Daten recoprd D0 und das Stückchen D2 das Byte einzufügen,:
|
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
= 5 in dezimal |
|
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
Daten zeichnen auf |
Bald ist man wegen es, schreiben Sie 5 in die Daten-Aufzeichnung (gemeine Adresse):
Notizen:
dir_base und dir_estado es ist von Wortart, und Daten sind von Artenbyte.
In Turbo Pascal
Port[dir_base]:=5;
In C
Outportb(dir_base, 5);
In Assembler
mov dx, dir_base {Direccionar en dx la dirección base}
mov al, 5 {Colocar en ² al ² el número 5}
out dx, al {Enviar al puerto}
Das Lesen von Daten des schnittstelles
Die Lektüre der Daten wird accesando zu einem Byte der bestimmten Registratur gemacht. Wenn die Lektüre zu machen, wegen der Drehung das binäre Byte dazu ist, ihn oder die Stückchen zu bestimmen, die interessieren. Merken Sie, daß nur die staatliche Registratur wegen gelesen ist, ist das, der Richtung base+1.
In Turbo Pascal
Var dato: byte;
dato:=Port[dir_estado];
In C
unsigned int dato;
dato=inport(dir_estado);
In Assembler
mov dx, dir_estado {Direccionar dx con el registro de estado del puerto}
in al, dx {Leer del puerto. En el registro ² al ² está el dato leído}
Zum Beispiel, wenn die gelesenen Daten zu 96 gleich sind, bedeutet es, daß die Stückchen S5 und S6 sind aktiv (sie haben ein hohes Niveau, einen 1,).
|
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
= 96 in dezimal |
|
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
S0 |
Registratur des Staates |
Maskierung
Als viel in der Sendung als Empfang binärer Daten werden Bedienungen in Niveau der Stückchen gemacht. Diese Bedienungen erlauben es, eine weitere Stückchen zu isolieren. Dieser Prozeß bezeichnet Maskierung.
Zum Beispiel, zu wissen wenn bestimmtes Stückchen, das gewesen ist, * * * reflxed mng der staatlichen Registratur, den es in einem hohen Niveau (1 logisches man) ist, ist möglich, der Operation "and" Logik (UND) von der Lektüre mit einem Wert geführt zu werden, der sich herausstellt, 2 zur Position zu erhöhen, die dieses Stückchen im Byte einnimmt, und bald den Vergleich zu machen.
Wenn das Stückchen, das gewünscht wird zu wissen, Stückchen 5 ist, dann ist die Bedienung:
Masc: = 2^5=32
(Byte_leido UND masc)
Im Fall, der 5 biß, ist in einem hohen Niveau:
Byte_leido
|
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
96 |
|
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
S0 |
Position |
UND
|
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
Maske = 32 |
Es ist
|
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
32 = Maske |
Im Fall, der 5 biß, ist nicht in einem hohen Niveau:
Byte_leido
|
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
80 |
|
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
S0 |
Position |
UND
|
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
Maske = 32 |
Es ist
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 < > Maske |
Wenn Stückchen 5 1 ist, dann ist das Ergebnis 16 oder entspricht zu masc.
Das Machen des Vergleiches:
Wenn (Byte_leido UND masc) = masc dann
Anfang
/* die Handlungen, um zu machen, wenn 4to Stückchen 1 sind *
Ziel
Wenn Stückchen 5 0 ist, dann ist das Ergebnis immer 0, die als masc anders sind.
Falls es gewünscht wird, die Tarnung ein bißchen aus mehr davon zu machen, wird es die Summe zu den Werten gemacht.
Ej. Maske für Stückchen 5 und die 7
Masc = 2^5+2^7=160
Fragen? pparalelo@hotmail.com