FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#21
|
||||
|
||||
Yo pensé que por cada bit puesto a uno tenias señal en un pin del puerto paralelo (pines del 2 al 9)
00000001 para el 0 00000010 para el 1 00000100 para el 2 ............ 10000000 para el 8 11111111 para todos Tal y como se describe aquí. Saludos. |
#22
|
||||
|
||||
checando esto!!!
CONTROLAR TODOS LOS BITS DE SALIDA Cita:
de tu aplicacion y tu circuito dependera el bit que quieras utilizar del 0 al 255 para esto deberas implementar un circuito que te ayudara a formar más combinaciones... sludos!!!...
__________________
el cielo me dio un cariño sin merecerlo... chimikuilo!!! |
#23
|
||||
|
||||
aaa...
una cosa es el ping y otra el bit...
tenemos del (2 - 9) para convinaciones de hasta 255... saludos!!!...
__________________
el cielo me dio un cariño sin merecerlo... chimikuilo!!! |
#24
|
||||
|
||||
Perdoname, krlox31416, no se si por la mecánica de un anterior post tuyo, no termino de entenderte.
Cita:
El 3 es el 0011b, con lo que según yo creo, debería activar las salidas 2 y 3 del puerto paralelo. ¿Estoy en lo cierto? Saludos. |
#25
|
||||
|
||||
correcto!!!
sip...
los pines 2 y 3 son los que utilizas para el bit 3 de salida... lo que hacemos es mandar un pulso de 5 volts que es lo que manda el cpu... de tu aplicación dependera como vas a programar por ejemplo... mandar un estado alto seria cualquier bit del 1-255 menos el 0... y un estado bajo seria el 0... los pines del 2-9 dan salidas o estados altos de 5 volts... por eso es importante que antes de hacer pruebas le adaptes a tu circuito (el que va a controlar tu programa hecho con este código alimentado con una fuente segun lo que soporte el diseño del mismo)una etapa optoacopladora con el fin de no dañar tu puerto de salida de tu maquina... Cita:
como decia una cosa es usar los pines de salida y otra saber que bit voy a mandar de salida... saludos!!!...
__________________
el cielo me dio un cariño sin merecerlo... chimikuilo!!! |
#26
|
||||
|
||||
Bien, gracias veo que no estaba equivocado.
Saludos. |
#27
|
|||
|
|||
Gracias a todas sus respuestas, pero aber si entiendo un poco de todos esos numeros, en generar no se puede activar y desactivar un puerto por separado,
por ejemplo yo pongo : MOV AX,3 // bit que se quiere utilizar en mi caso el bit 3 MOV DX,378H // puerto paralelo 378h OUT DX,AX // damos salida lo que tenga AX en mi caso es 3 bit a DX que es el puerto 378h y lo que me hace es como dice escafandra me activa el ping de salida 2-3 pero yo no quisiera hacer eso, yo quisiera controlar los pines por separados, por que en el ping 2 quiciera poner un motor, en el 3 un bombillo, el 4 un Extractor, etc Pero quisiera encender y apagar cada uno por separado, no que para poder apagar uno tenga que apagarlos todos ni que cuando enciendo el 2 se encienda tambien el 3, quisiera hacerlo todo por separado, que numeros de bit tendria que poner para logar todo eso... (Se que para conectar todo eso a la PC tengo que poner un circuito electronico con transistores y relay.) Les agrdeseria toda la ayuda pocible ... [Saludos]... |
#28
|
||||
|
||||
yelian, No es complicado. El número 3 en binario es 0000 0011b esto quiere decir que de activan dos pines, pues dos están a "1".
Si quieres activar uno solo, pues pon a uno un sólo bit, es decir potencias enteras de 2. Si quieres activar de forma combinada pues es fácil, realizar una operación or binaria. Pin2 activo: 0000 0001 = 1 Pin3 activo: 0000 0010 = 2 Pin4 activo: 0000 0100 = 4 Pin5 activo: 0000 1000 = 8 ........... Si queremos activar el pin2 y el 3: Pin2 | Pin3, es decir 1 | 2, es decir 0000 0011. Así con cualquier pin o combinación. Fácil, ¿no? Saludos. |
#29
|
|||
|
|||
Gracias escafandra;
Por Favor pudieras continuar la Tablita que pusistes: Pin2 activo: 0000 0001 = 1 Pin3 activo: 0000 0010 = 2 Pin4 activo: 0000 0100 = 4 Pin5 activo: 0000 1000 = 8 -Aaaaaaa Probe el codigo de Ensamble con los numeros que me distes y me funciona bien pero hace una cosa que no gusta es que cuando enciendo el ping 2, se enciende bien pero cuando enciendo el ping 3 se enciende, pero me apaga el 2 me gustaria que trabajaran individual... [Saludos]... |
#30
|
||||
|
||||
yelian, esto es binario puro.
Como dice el chiste, existen 10 tipos de personas, las que saben binario y las que no. Bueno, la tablita es así: Pin2 activo: 0000 0001 = 1 Pin3 activo: 0000 0010 = 2 Pin4 activo: 0000 0100 = 4 Pin5 activo: 0000 1000 = 8 Pin6 activo: 0001 0000 = 16 Pin7 activo: 0010 0000 = 32 Pin8 activo: 0100 0000 = 64 Pin9 activo: 1000 0000 = 128 Esto enciende individualmente cada pin, y por lo tanto apaga todos menos el activo. Todos los que quieras activos deben estar a "1", y los inactivos a "0" Todos activos sería 1111 1111 en binario es decir 0xFF en hexadecimal ó 255 en decimal. Para mantenerlos activos a medida que enciendes otro, debes hacer una operación or antes de mandarlo al puerto, con esto pones los "unos" que te interesen. Saludos. Última edición por escafandra fecha: 10-03-2009 a las 16:34:14. |
#31
|
|||
|
|||
escafandra me pudiera mostrar un ejemplo como pudiera utilizar el XOR ,
|
#32
|
||||
|
||||
El XOR, es un or exclusivo, es decir si un bit de "sólo" uno o del otro operando es uno, entonces el resultado en ese bit es uno. Esta sería la tabla.
xor |0 1 ___|____ 0 ..|0 1 1 ..|1 0 En C ese operador binario se representa por "^" Ejemplo: .........5 = 0101 .........4 = 0100 __________________ 5^4 = 1 = 0001 Saludos. |
#33
|
||||
|
||||
Bueno, no se si lo que realmente quieres es el operador XOR o el OR, pero no cuesta trabajo exponer el or:
Basta con que un bit de cualquiera de los dos operandos este a uno para que el resultado en ese bit sea uno. Esta sería la tabla: .or |0 1 ___|____ 0 ..|0 1 1 ..|1 1 En C ese operador binario se representa por "|" Ejemplo: .........5 = 0101 .........4 = 0100 __________________ 5|4 = .5 = 0101 Saludos. Última edición por escafandra fecha: 12-03-2009 a las 01:05:26. |
#34
|
||||
|
||||
Y para no dejar nada, el operador and:
Los dos bits de cada operando deben ser uno para que el resultado sea uno. Esta sería la tabla. and|0 1 ___|____ 0 ..|0 0 1 ..|0 1 En C ese operador binario se representa por "&" Ejemplo: .........5 = 0101 .........4 = 0100 __________________ 5&4 = 4 = 0100 Saludos. Última edición por escafandra fecha: 12-03-2009 a las 01:07:40. |
#35
|
|||
|
|||
Gracias a krlox31416, escafandra, cHackAll por la ayuda brindad ,
Después de tanto buscar y buscar encontré unos códigos que me pueden servir para lo que quiero hacer, mezclando estos códigos con lo que me dio escafandra sobre (XOR, OR, AND). Códigos Encontrados: ---------------------- // para salida void outp(char x) { asm mov dx,0x378 asm mov al,x asm out dx,al } //para entrada char inp(void) { char x; asm mov dx,0x378 asm mov al,x asm in al,dx asm mov x,al return x; } -AAA Estos codicos los encontre en www.elrincondelc.com , espero que no tenga nada que ver que los ponga a qui no... Despues les cuento como me ha ido con todo esto... Gracias por toda la ayuda [Saludos]... |
#36
|
||||
|
||||
ok's hijo!!!... se agradecen las gracias...
yo casi no he tenido la oportunidad de ayudar o aportar algo de mi en este foro...
la verdad es que terde mucho en saber manejar las funciones de este foro y hasta hace poco le agarre ley... y si se siente chido que alguien desonocido que esta a mucha distancias te agradesca por la ayuda... = mete gracias a ti por seguir aportando ideas... es mas gracias a todos no??? o que show??? bueno pues gracias a todos!!! y... saludos a todos!!!...
__________________
el cielo me dio un cariño sin merecerlo... chimikuilo!!! |
#37
|
|||
|
|||
Solucionado
Hola a todos de nuevo;
Al final logre hacer lo que tanto queria, gracias a ustedes y a otras paginas que visite, Aqui les dejo algo de mi code utilizado por si alguien le interesa y tienen la misma duda que yo tenia... Code: (OnClick del Button) ------ int a=0; int b=0; int c=0; int d=0; int e=0; int f=0; int g=0; int h=0; int res=0; char resul=0; if (CheckBox1->Checked==true) a=1; if (CheckBox2->Checked==true) b=2; if (CheckBox3->Checked==true) c=4; if (CheckBox4->Checked==true) d=8; if (CheckBox5->Checked==true) e=16; if (CheckBox6->Checked==true) f=32; if (CheckBox7->Checked==true) g=64; if (CheckBox8->Checked==true) h=128; res=a+b+c+d+e+f+g+h; //Convirtiendo de int a char resul=(char)res; //Abriendo y Cerrando los puertos con codico de ensamble asm mov dx,0x378 asm mov al,resul asm out dx,al Explico un poco de lo utilizado: Tengo 8 CheckBox,cada uno me enciende y apaga un puerto diferente ejemplo si esta activado el CheckBox1 y 5 se te enciente el Ping 2 y 6 del puerto paralelo. -Todo ese codico recuerden que se pone en el OnClick de un boton que es el que va a Actualizar los puertos (Es el que va a hacer la funcion de Encender y Apagar los puertos selecccionados)... Espero que le sea de Utilidad . [Saludos]... |
#38
|
||||
|
||||
He investigado el tema de leer y escribir en los puertos, dada la peculiar dificultad en XP que obliga al uso de librerías externas o al uso de drivers.
Voy a colocar un código que funciona sin librerías ni drivers. El único requisito es que seamos Administradores del sistema. Con un driver funciona sin ser administradores, pero para instalar dicho driver si debemos tener esos privilegios. El truco está en usar una API poco conocida y que se usa para los Debuggers: ZwSystemDebugControl. Código:
//--------------------------------------------------------------------------- #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused //------------------------------------------------------------------------ #include <windows.h> #include <stdio.h> //#pragma comment(lib, "advapi32") //#pragma link "advapi32.lib" #define NTAPI __stdcall typedef int NTSTATUS; typedef enum _SYSDBG_COMMAND { SysDbgSysReadIoSpace = 14, SysDbgSysWriteIoSpace = 15 }SYSDBG_COMMAND, *PSYSDBG_COMMAND; typedef NTSTATUS (NTAPI * PZwSystemDebugControl) ( SYSDBG_COMMAND ControlCode, PVOID InputBuffer, ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength, PULONG ReturnLength ); PZwSystemDebugControl ZwSystemDebugControl = NULL; typedef struct _IO_STRUCT { DWORD IoAddr; // IN: Aligned to NumBYTEs,I/O address DWORD Reserved1; // Never accessed by the kernel PVOID pBuffer; // IN (write) or OUT (read): Ptr to buffer DWORD NumBYTEs; // IN: # BYTEs to read/write. Only use 1, 2, or 4. DWORD Reserved4; // Must be 1 DWORD Reserved5; // Must be 0 DWORD Reserved6; // Must be 1 DWORD Reserved7; // Never accessed by the kernel } IO_STRUCT, *PIO_STRUCT; BOOL EnablePrivilege (PCSTR name) { HANDLE hToken; TOKEN_PRIVILEGES priv = {1, {0, 0, SE_PRIVILEGE_ENABLED}}; LookupPrivilegeValue(0, name, &priv.Privileges[0].Luid); OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken); AdjustTokenPrivileges (hToken, FALSE, &priv, sizeof priv, 0, 0); CloseHandle (hToken); return (GetLastError() == ERROR_SUCCESS); } BOOL Inicializa() { HMODULE hNtdll; hNtdll = LoadLibrary ("ntdll.dll"); if(EnablePrivilege(SE_DEBUG_NAME)==FALSE){ printf("Usted no tiene suficientes privilegios\n"); return FALSE; } if(hNtdll){ ZwSystemDebugControl = (PZwSystemDebugControl)GetProcAddress(hNtdll, "ZwSystemDebugControl"); return TRUE; } return FALSE; } BYTE InPortB(int Port) { BYTE Value; IO_STRUCT io; io.IoAddr = Port; io.Reserved1 = 0; io.pBuffer = (PVOID)(PULONG)&Value; io.NumBYTEs = sizeof(BYTE); io.Reserved4 = 1; io.Reserved5 = 0; io.Reserved6 = 1; io.Reserved7 = 0; ZwSystemDebugControl(SysDbgSysReadIoSpace, &io, sizeof(io), NULL, 0, NULL); return Value; } void OutPortB(int Port, BYTE Value) { IO_STRUCT io; io.IoAddr = Port; io.Reserved1 = 0; io.pBuffer = (PVOID)(PULONG)&Value; io.NumBYTEs = sizeof(BYTE); io.Reserved4 = 1; io.Reserved5 = 0; io.Reserved6 = 1; io.Reserved7 = 0; ZwSystemDebugControl(SysDbgSysWriteIoSpace, &io, sizeof(io), NULL, 0, NULL); }; void BeepOn (int Freq) { BYTE b; if((Freq >= 20) && (Freq <= 20000)){ Freq = 1193181 / Freq; b = InPortB(0x61); if((b & 3) == 0){ OutPortB (0x61, (BYTE) (b | 3)); OutPortB (0x43, 0xb6); } OutPortB (0x42, (BYTE)Freq); OutPortB (0x42, (BYTE)(Freq >> 8)); } } void BeepOff (void) { BYTE b; b = (InPortB(0x61) & 0xfc); OutPortB(0x61, b); } // Sólo funciona en Windows XP y superiores // Se debe ser Administrador del Sistema int main(void) { if(Inicializa()==FALSE){ printf("Error al inicializar los puertos\n"); Sleep (2000); return 0; } // Aquí podemos utilizar las funciones InPortB y OutPortB // Activamos el altavoz del sistema durante 300ms con una frecuencia // de 1000Hz BeepOn(1000); // frecuencia de 1000Hz Sleep (300); BeepOff(); return 0; } Patra escribir y leer del puerto paralelo, basta con: Código:
Inicializa(); BYTE B = InPort(0x378); // Lee del puerto paralelo OutPort(0x378, 3); // Escribe en el puerto paralelo el valor 3 Última edición por escafandra fecha: 02-04-2009 a las 22:30:21. Razón: Mejoras en la claridad del código |
#39
|
||||
|
||||
lo malo es que hace tiempo no programo en c
interesante codigo!!!...
tendre que conseguirme el c... jejeje... saludos!!!...
__________________
el cielo me dio un cariño sin merecerlo... chimikuilo!!! |
#40
|
||||
|
||||
Cita:
Saludos. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Puerto paralelo | bactering | Varios | 8 | 15-09-2011 07:55:09 |
PWM con puerto paralelo... | emeceuy | Varios | 5 | 19-07-2007 20:30:23 |
Puerto paralelo en C | Chase | C++ Builder | 0 | 04-07-2005 12:29:37 |
Puerto Paralelo | jorge | Lazarus, FreePascal, Kylix, etc. | 1 | 20-04-2005 03:25:42 |
|