Como acessar LPT2 ( USB/paralelo ) ?

Programação C em geral

Moderadores: 51, guest2003

Mensagempor LeandroPIC » 10 Mar 2008 12:31

andre_teprom escreveu:
No caso, estou utilizando um gravador de PIC pela paralela ( que me indicaram em outro tópico ), que funciona em outro micro, mas não nesse.




Monte um gravador de PIC pela USB! pode ser PICKIT2 ou GTPUSB.

Mas vc pode fazer assim, se vc estiver usando o winpic800, lá vc pode mudar os pinos da paralela do gravador, ai vc muda para aqueles pinos que estão bom.
Avatar do usuário
LeandroPIC
Byte
 
Mensagens: 163
Registrado em: 06 Jul 2007 12:19

Mensagempor andre_luis » 10 Mar 2008 13:10

Ok...eu sei que mudar para USB seria uma opção.
Mas na verdade, trata-se de uma curiosidade minha também.

Já fiz muita coisa usando a LPT1, e derrepente percebo que ela está não mais sendo implementada nos micros. Ela é muito fácil de usar ( inportb , outportb ), fácil de interfacear e de debugar também, e por isso não gostaria de desistir tão facilmente da porta paralela, sem alguma luta.

Obrigado.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor rafaelntg » 11 Mar 2008 08:24

André,
pelo o que entendi você somente precisa do endereço da LPT2, no seu caso, para trabalhar com o conversor USB/paralela, OK?

Experimente instalar o Everest e veja se consegue obter essa informação, já que ele (o Everest) possui praticamente todas as informações sobre o computador e tudo que está instalado nele (hardware e software).

O link que o Baixaki disponibiliza pra baixar a versão Trial do Everest é o seguinte: http://www.lavalys.com:8081/everestultimate420.exe.

Espero que você consiga obter essa informação com a ajuda do Everest e que também consiga utilizar seu conversor como se fosse a própria porta paralela física do computador.

Boa sorte!

Um abraço! Até mais!
Rafael Noronha
rafaelntg
Bit
 
Mensagens: 10
Registrado em: 12 Mar 2007 10:46
Localização: Santa Rita do Sapucaí/Brazópolis - MG

Mensagempor LeandroPIC » 11 Mar 2008 12:18

não intendo o endereço da lpt2 não é 278, 279 e 27A.
Avatar do usuário
LeandroPIC
Byte
 
Mensagens: 163
Registrado em: 06 Jul 2007 12:19

Mensagempor andre_luis » 11 Mar 2008 23:15

Leandro,

Também pensei nisso. Estou quase testando assim, embora duvidoso do resultado.

Bom...Acabei de testar o programa sugerido, mas lamentavelmente ele sequer traz informação a respeito do endereço da LPT1; mas é um excelente programa.

O jeito é esquecer esse cabo, que a princípio, me pareceu promissor.



+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor LeandroPIC » 13 Mar 2008 13:11

tenta assim:

Entre na bios da sua maquima e veja se tem alguma coisa sobre LPT2, geralmente tem se não tem use uma maquima mais antiga, talvez as novas não aceitem LPT2.
Avatar do usuário
LeandroPIC
Byte
 
Mensagens: 163
Registrado em: 06 Jul 2007 12:19

Mensagempor andre_luis » 13 Mar 2008 14:08

Leandro,

Realmente, a porta que o conversor emula é LPT3. Talvez a LPT2 esteja reservada. Só que o problema é que estou num Laptop, e não teria espaço para enfiar o flat do conector da paralela.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor andre_luis » 28 Mar 2008 09:19

A quem interessar :

Recebi do fabricante do Chip MOSCHIP os seguintes arquivos, que ainda nao tive tempo de testar, mas que aparentemente tem cara de funcionar :

Depois posto o resultado aqui.

Byte.cpp
Código: Selecionar todos
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<winioctl.h>
#include "byte.h"
#include "winerror.h"

////////////////////////////////////////////////////////////////////////////////////////////
//                        P R O T O T Y P E S
////////////////////////////////////////////////////////////////////////////////////////////
unsigned char WriteByte( HANDLE hDevice, unsigned char pRegIndex, unsigned char pRegValue );

unsigned char ReadByte( HANDLE hDevice, unsigned char pRegIndex );

////////////////////////////////////////////////////////////////////////////////////////////
//                             M A I N
////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
   HANDLE h;
   char portname[10];
   int port = 1;
   unsigned char *Buffer = NULL;
   unsigned char Value;
   FILE *byteLog = NULL;

   // Get the LPT Port No. from user and open the port..
   fflush(stdin);
   printf("Enter LPT number to open (1/2/3) : ");
   scanf("%d",&port);
   sprintf(portname,"LPT%d",port);
   
   
   // Method for opening the Driver Handle
   // Portname is available from the Device Manager and this cannot be hardcoded.
      
   h=CreateFile(portname,GENERIC_READ|GENERIC_WRITE,
                     FILE_SHARE_READ,NULL,
                     OPEN_EXISTING,
                     FILE_ATTRIBUTE_NORMAL,NULL);
   if(h==INVALID_HANDLE_VALUE)
   {
      printf("\nUNABLE TO OPEN HANDLE TO LPT port. Errorcode : %d \n", GetLastError());
      return;
   }

   // Switch the port mode to BYTE
   // Procedure to enable SPP mode

   Value = ReadByte(h, PP_ECR);         // Read the Value of the PP_ECR Register
   printf("Before setting BYTE Mode..\n");   
   printf("ECR Register : %x\n", Value);
   Value &= 0x1F;                     // Write the 000x xxxx in the ECR Register
   WriteByte( h, PP_ECR, Value );         // Write the Value to PP_ECR To Enables the SPP Mode
   Value = ReadByte( h, PP_ECR );
   printf("After setting BYTE Mode..\n");
   printf("ECR Register : %x\n", Value);


   // IOCTL codes for accessing data port, status port, and control port

   // Reading the status register
   // Status Register is READ ONLY
   Value = ReadByte(h, PP_DSR);
   printf("DSR Register : %x\n", Value);

   // Reading the Control Register
   Value = ReadByte(h, PP_DCR);
   printf("DCR Register : %x\n", Value);

   // Reading from the Data Register
   Value = ReadByte(h, PP_DATA);
   printf("Data Register : %x\n", Value);
   
   // Writing to the Data Register
   Value=0x56;      // Value to be written to the Data Register
   Value = WriteByte(h, PP_DATA,Value);

   // Reading from the Data Register
   Value = ReadByte(h, PP_DATA);
   printf("Data Register : %x\n", Value);

   if( Buffer != NULL )
      delete []Buffer, Buffer = NULL;
   CloseHandle( h );
}


///////////////////////////////////////////////////////////////////////////////////////////
// Function         :   WriteByte
// Module         :   Byte.exe
// Inputs         :   Handle to the device, register offset and value to be written.
// Returns         :    1 if successful else 0.
// Notes         :   Writes the given value into the given register offset index.
///////////////////////////////////////////////////////////////////////////////////////////
static UCHAR WriteByte(HANDLE hDevice, UCHAR pRegIndex, UCHAR pRegValue)
{
   ULONG BytesWritten = 0;
   PORT_STRUCT Port;

   Port.m_nRegIndex = pRegIndex;
   Port.m_nRegValue = pRegValue;

   if(!DeviceIoControl(hDevice,
                  IOCTL_PAR_PORT_WRITE,
                  &Port,
                  sizeof(Port),
                  NULL,
                  NULL,
                  &BytesWritten,
                  NULL ) ) {
      printf( "WriteByte Failed with error code : %d\n",GetLastError() );
      CloseHandle( hDevice );
      exit(1);
   }
   return (UCHAR)BytesWritten;
}


///////////////////////////////////////////////////////////////////////////////////////////
// Function         :   ReadByte
// Module         :   Byte.exe
// Inputs         :   Handle to the device, register index to read.
// Returns         :    Read value.
// Notes         :   Reads the given reg offset index and returns the read value.
///////////////////////////////////////////////////////////////////////////////////////////
static UCHAR ReadByte(HANDLE hDevice, UCHAR pRegIndex)
{
   ULONG BytesRead = 0;
   PORT_STRUCT Port;

   Port.m_nRegIndex = pRegIndex;

   if(!DeviceIoControl(hDevice,
                  IOCTL_PAR_PORT_READ,
                  &Port,
                  sizeof(Port),
                  &Port,
                  sizeof(Port),
                  &BytesRead,
                  NULL ) ) {
      printf( "ReadByte Failed with error code : %d\n",GetLastError() );
      CloseHandle( hDevice );
      exit(1);
   }
   return    Port.m_nRegValue;
}



Byte.h
Código: Selecionar todos
#ifndef __BYTE_H__
#define __BYTE_H__


/*--------------------------------------------------------------------------------*/

// The Registers to access Data, Status and Control.
#define PP_DATA               0x00   // Reg Offset to Access Data
#define PP_DSR               0x01   // Reg Offset to Access Status
#define PP_DCR               0x02   // Reg Offset to Access Control
#define PP_ECR               0x0A   // Reg Offset to Access a Register which puts
                              // the device in SPP Mode(Value in PP_ECR Register
                              // should be 000x xxxx in order to set in SPP Mode).

/*--------------------------------------------------------------------------------*/

// IOCTL's To Write into the Regs

#define IOCTL_PAR_PORT_WRITE         CTL_CODE(   FILE_DEVICE_PARALLEL_PORT,   \
                                       97,                     \
                                       METHOD_BUFFERED,         \
                                       FILE_ANY_ACCESS            \
                                    )

// IOCTL's To Read from the Regs
#define IOCTL_PAR_PORT_READ            CTL_CODE(   FILE_DEVICE_PARALLEL_PORT,   \
                                       98,                     \
                                       METHOD_BUFFERED,         \
                                       FILE_ANY_ACCESS            \
                                    )

/*--------------------------------------------------------------------------------*/

// Structure Defns used in the DeviceIoControl
typedef struct PORT_STRUCT_TAG
{
   UCHAR m_nRegIndex;
   UCHAR m_nRegValue;   
} PORT_STRUCT, *PPORT_STRUCT;


#endif //__BYTE_H__


readme.txt
Código: Selecionar todos
This Package Contains Byte.h and Byte.cpp Files, which illustrates about how to use the IOCTLs Related to MCS7705.

The Byte.h Contains the,
Register offsets,
IOCTLs and
Structure Definitins used in the DeviceIoControl.

PP_DATA     0x00   This is the Data Register,where the Data is Written and Read.
PP_DSR      0x01   This is the Status Register, which is READ ONLY. the status can only be read.
PP_DCR      0x02   This is the Control Register.
PP_ECR      0x0A   
This is the Register which puts    the Device into SPP Mode.
To make the device work in the SPP Mode, We have to Write the Value '0' in the First Three Bits (starting from MSB) of the ECR Register.
i.e., the Value of the ECR Register should be 000x xxxx to make the device work in SPP Mode.


IOCTL_PAR_PORT_WRITE is the IOCTL used to Write Data to the Device.
IOCTL_PAR_PORT_READ    is the IOCTL used to Read  Data From the Device.

PORT_STRUCT_TAG is the Structure used to send data through the IOCTLs to the Driver.
m_nRegIndex: is the variable which is provided with the Register Index:(PP_DATA/PP_DSR/PP_DCR/PP_ECR)
m_nRegValue : is the Value to be Written to the register.

Following is the Pseudo Code of byte.cpp :

--> ask the Port Number from the User.
(the port number is available in the ports under the Device Manager)
--> open a handle to the Device using CreateFile and portname took from the user.
--> program the SPP mode by writing into the ECR Register.
--> read the Status Register
--> read the Control Register
--> write to the Data Register
--> read the Data Register Back.
--> Deallocate the buffer.
--> Close the handle.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Wagner de Queiroz » 29 Mar 2008 13:06

deixe-me dar minha opiniao:

eu comprei o meu conversor paralelo USB e me arrependi amargamente dele. Ele usa o chip da empresa Prolific.

Ele é instalado automaticamente pelo windows como Suporte a Impressao USB.

resolvi me afundar no DDK do Windows para tentar achar um modo de fazer contato com o dito cujo. Sem sucesso, primeiro nao entendo aquele C maluco da Microsoft, segundo o Windows implementa um monitor de impressao que conversa com o driver de impressao USB. Infelizmente isso parece ser atrelado ao SPOOL de impressao e nao achei modo de mandar um byte ou ler um byte do conversor. Tentei falar com o Fabricante mas nao tive sucesso. Resultado. Esses conversores USB Paralelo com chip da Prolific é uma porcaria sem tamanho.

O acesso a USB é totalmente diferente do acesso a porta real. Apesar de ser possivel criar uma porta falsa LPT tipo 378 é direcionada a um programa, pois segundo sei o Windows faz isso, pois o acesso direto a porta é feito atraves do Windows que ja faz uma especie de abstração e pode em tese redirecionar este trafego para qualquer lugar.

Estou comecando a estudar o chip FTDI FT232R e estou pensando em usar ele como se fosse uma paralela pois ele pode trabalhar como tal.

A ideia basica é alterar a DLL InpOut32.dll que é o metodo usual mais conhecido para acessar a porta paralela para que saia pelo chip FTDI.

Se gostarem da ideia, seria interessante abrirmos um topico para este aspecto.
Seja Livre, Use Linux
Avatar do usuário
Wagner de Queiroz
Word
 
Mensagens: 872
Registrado em: 11 Out 2006 13:38
Localização: Barueri-SP

Mensagempor andre_luis » 31 Mar 2008 08:06

Olá Wagner,

Eu também teria interesse em saber como utilizar esse CI da FTDI.
No site do Rogercom, ele divulgou um trabalho interessante no qual utiliza os pinos de controle de fluxo da serial como E/S de dados paralelos. ( http://www.rogercom.com/PortaUSB/MotorPasso.htm )

Entretanto, o CI controlador desse conversor USB/Paralelo ( DB-25 ) da MOSCHIP a que me referi acima, ele realmente instala um dispositivo paralelo "LPT" no computador. ( no meu caso, LPT3 ou LPT4, dependendo do slot USB )

Também já comprei um conversor USB/Paralelo ( Centronics ) e pedi o dinheiro de volta, pois não era um conversor para paralela, como dizia na capa do produto. Ele apenas instalava um "dispositivo de impressão".

Por isso - tendo em vista que o programa acima foi fornecido pelo proprio fabricante - acredito fielmente que funcione. Só não tenho como testar ainda.

De qualquer modo, eu teria interesse em acompanhar ou participar de um tópico a respeito do que voce sugeriu.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Jorge_Francisco » 31 Mar 2008 08:40

Olha não entendi muito bem a conversa, mas aquele módulo que é vendido na TATO possui este chip??Se sim, nenhum deles se faz passar por Paralela(LPT), apenas possuem pinos Bi-Direcionais, usei o da TATO, e fiz meu programa para acessar tanto no Delphi quanto no C++ Builder. Até pq uma dll pode ser acessada em ambos, desde que o parametro seja do mesmo tipo. Pq não fazem com PIC mesmo??Uso o 18f4550 e me atende muito bem, mas é caro, se for usar só para converter para paralela talvez não seja razoavel.

Sobre o código postado, é o mesmo que tem dentro do ImpOut.dll que é distribuido na net, usa a API do Win para acessar dispositivos como serial,paralela e outros.

Vlw
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor Jorge_Francisco » 31 Mar 2008 08:46

Humm, esse da MOSCHIP emula uma LPT mesmo, então por isso que o código é o mesmo do acesso a porta paralela comum. Não uso mais paralela, prefiro serial e agora USB.

Vlw
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor andre_luis » 31 Mar 2008 11:31

Jorge_Francisco escreveu:...Não uso mais paralela, prefiro serial e agora USB...


Olá Jorge,

Bom, cada caso é um caso. Em se tratando de compatibilidade com gravadores já adquiridos ( download cable IV da XILINX, por exemplo ), a jente fica sem opção, e acabamos tendo que dar um jeito para conseguir uma porta compatível com o gravador que a jente tem.

Eu também gostaria de dar a minha opinião. Eu pessoalmente gosto muito da paralela por alguns motivos :
- Facil de debugar ( é só medir o pino ´problemático´ )
- Fácil de interfacear ( um conversor de nível, ou opto é suficiente )
- Fácil de programar ( basta setar ou ressetar o pino )

Obviamente não possui uma quantidade respeitável de pinos de entrada, mas uma lógica-zinha externa pode contornar isso; E sem a necessidade de um microcontrolador remoto !!!

É bem verdade que a serial possui o recurso de controle de bit de paridade, que adiciona um grau de segurança a mais, mas ainda assim voce precisaria desenvolver um hardware para receber e tratar esses dados.

Por isso, faço questão de não sepultar a paralela e nem os gravadores já adquiridos para ela.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Jorge_Francisco » 31 Mar 2008 11:59

andre_teprom escreveu:
Jorge_Francisco escreveu:...Não uso mais paralela, prefiro serial e agora USB...


Olá Jorge,

Bom, cada caso é um caso. Em se tratando de compatibilidade com gravadores já adquiridos ( download cable IV da XILINX, por exemplo ), a jente fica sem opção, e acabamos tendo que dar um jeito para conseguir uma porta compatível com o gravador que a jente tem.

Eu também gostaria de dar a minha opinião. Eu pessoalmente gosto muito da paralela por alguns motivos :
- Facil de debugar ( é só medir o pino ´problemático´ )
- Fácil de interfacear ( um conversor de nível, ou opto é suficiente )
- Fácil de programar ( basta setar ou ressetar o pino )

Obviamente não possui uma quantidade respeitável de pinos de entrada, mas uma lógica-zinha externa pode contornar isso; E sem a necessidade de um microcontrolador remoto !!!

É bem verdade que a serial possui o recurso de controle de bit de paridade, que adiciona um grau de segurança a mais, mas ainda assim voce precisaria desenvolver um hardware para receber e tratar esses dados.

Por isso, faço questão de não sepultar a paralela e nem os gravadores já adquiridos para ela.

+++


Também gosto da Paralela, sei que é de facil implementação e programação, ainda faço uso da mesma, só disse, ou queria, dizer que estou substituindo gradativamente. Com um chip externo teria o mesmo desconforto de um microcontrolador remoto, mas com a desvantagem de não emular uma LPT, acho que a melhor saida seja mesma aquele CI que falou, aliás, qual seria o modelo do mesmo e onde comprar??Pode ser que eu precise em algum projeto e informação nunca é dispensável!!

Vlw
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor andre_luis » 31 Mar 2008 12:15

Jorge,

Embora o MCS7705 seja apenas USB/paralela, no CD-ROM que acompanha o cabo 1usbCOMM-LPT ( www.novacomm.com.br ) vem o driver para o MCS7715, que é a versão USB/LPT + USB/serial.

Creio que o driver para ambos os chips seja o mesmo, e o fabricante desses conversores, muito provavelmente, deve possuir uma unica PCI, onde monta o MCS7715 e apenas os componentes relacionados á porta convertida ( serial ou paralela ).

Sobre onde comprar o chip, desconheço. Só precisei fuçar o fabricante para pedir o suporte técnico que divulguei acima. Mas se voce conseguir comprar, por favor divulga o contato, beleza ?

abraço

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Anterior

Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes

x