Porta Paralela
Trabalho Escolar: Porta Paralela. Pesquise 862.000+ trabalhos acadêmicosPor: • 15/3/2015 • 2.483 Palavras (10 Páginas) • 414 Visualizações
1. OBJETIVO
Esta experiência tem por objetivo a familiarização com ferramentas de auxílio ao desenvolvimento de software no ambiente Linux e com conceitos de operação de entrada e saída na porta paralela sem a utilização de drivers.
2. INTRODUÇÃO
Os microprocessadores executam programas escritos em linguagem de máquina e que estejam gravados em determinadas posições de memória, de acordo com as características de cada arquitetura utilizada. Estes programas são normalmente denominados “Programas-Objeto Absolutos”.
A linguagem da máquina, entretanto, não é natural ao ser humano o que dificulta o desenvolvimento, direto de programas-objeto absolutos. Para vencer esta barreira, foram criadas as Linguagens de Montagem e as Linguagens de Alto Nível.
A linguagem de montagem ou “assembly”* é definida com base na linguagem de máquina, onde cada instrução da máquina é representada por um comando mnemônico em caractere alfanumérico. Os programas escritos nestas linguagens são específicos para cada família de microprocessadores, cujas instruções costumam ser definidas pelo próprio fabricante do microprocessador.
As linguagens de alto nível são caracterizadas por apresentar comandos alfanuméricos, onde cada comando costuma ser implementado por um conjunto de instruções de máquina, de forma transparente ao programador, que a princípio não necessita conhecer as características de arquitetura e programação de cada processador para poder programá-lo. As linguagens de alto nível, por sua vez, são independentes da máquina em que vai ser executado o programa, desde que se disponha de versões do compilador que gere código para cada processador que se pretenda programar.
Os programas escritos em linguagem de montagem ou de alto nível são denominados de “Programas-Fonte”. Estes programas são escritos em arquivos alfanuméricos através de editores de textos, que tenham capacidade de gerar arquivos sem utilizar recursos específicos de formatação comumente utilizados na edição de documentos.
3. MONTADORES E COMPILADORES
3.1. Principais Características
Os Programas Montadores ou “Assemblers” são ferramentas que permitem a tradução de programas-fonte escritos em linguagem de montagem para programas-objeto. Na verdade, essas ferramentas costumam fornecer recursos adicionais que auxiliam na tarefa de geração de programas, como por exemplo:
• Atribuição de nomes a posições de memória, a portas de entrada/saída e a constantes utilizadas nos programas.
• Utilização de vários sistemas de numeração para representar os dados (binário, octal, decimal, hexadecimal), e conversão de caracteres para ASCII ou EBCDIC.
• Recursos aritméticos para auxílio na geração dos valores numéricos utilizados como operandos de instruções e comandos.
• Separação das áreas de memória para código e dados, com definição de seus endereços iniciais, para efeito de carga na memória.
• Definição de tabelas de dados permanentes ou com valores iniciais após a carga na memória;
• Uso e definição de bibliotecas.
• Recursos avançados de geração de programas, como macros (que permitem a definição de seqüências de instruções a serem utilizadas diversas vezes em um programa, reduzindo e simplificando a escrita de um programa), e assembler condicional (que permite a geração de várias versões de um programa, a partir de um único programa-fonte); esses recursos nem sempre estão disponíveis.
Os principais tipos de programas montadores são:
• Cross-assembler: é executado em um computador com um processador diferente daquele para o qual se está gerando código.
• Macro-assembler: dispõe de recursos de macro, efetuando a expansão do código cada vez que uma macro for encontrada.
• Micro-assembler: permite a escrita de micro-instruções, definindo-se assim um conjunto de instruções de um processador microprogramável.
• Meta-assembler: é um assembler que pode montar programas para vários processadores diferentes.
• Assembler de um passo: varre o programa-fonte apenas uma vez, gerando o código (deve existir alguma forma de se revolver as referências adiante).
• Assembler de dois passos: varre o programa-fonte duas vezes para gerar o código, podendo assim resolver automaticamente as referências adiante.
Já os compiladores são ferramentas que permitem a tradução de programas-fonte escritos em linguagem de alto nível em programas-objeto. Essa tradução envolve tipicamente a conversão de uma instrução de alto nível em diversas instruções de um determinado processador. Para cada um há necessidade de se adquirir um compilador específico. Alguns compiladores apresentam recursos de otimização do programa final gerado, e também permitem a inserção de trechos de programa escritos em linguagem assembly.
3.2. Vantagens e Desvantagens
Como principais vantagens e desvantagens da Linguagem Assembly, tem-se:
• Total domínio do processo de geração de código por parte do programador, que pode gerar programas otimizados e eficientes (menor tamanho, uso de truques de programação,...).
• Necessidade de bons conhecimentos das características do processador e de seu conjunto de instruções, por parte do programador.
• Não-portabilidade, uma vez que cada processador possui (em geral) arquitetura e conjunto de instruções específicas.
• Alto custo de desenvolvimento e depuração dos programas, que são mais difíceis e demorados de serem produzidos e depurados.
Já as linguagens de alto nível apresentam como principais vantagens e desvantagens:
• Portabilidade, ou seja, independência do processador para o qual se está gerando programas.
• Maior preocupação com a descrição das tarefas, permitindo-se assim a geração mais rápida de programas. Costuma ser 10 vezes mais rápido fazer um programa em linguagem de alto nível do que em linguagem assembly, além de ser possível gerar uma melhor documentação melhor e mais compacta, facilitando futuras alterações. Tudo isso naturalmente acarreta em um menor custo de programação.
• Maior custo do compilador em relação ao custo do montador.
• Necessidade do conhecimento da sintaxe de mais uma linguagem por parte do programador.
• Geração de programas maiores e menos eficientes.
3.3. Escolha da Linguagem e Tendências
A escolha da linguagem mais adequada depende de cada aplicação. Como regras gerais, tem-se:
• Linguagem de Máquina:
• Nunca deve ser usada, a menos de situações especiais, como: testes em laboratório, que necessitem de pequenos trechos de programa, fase de aprendizado do programador, etc.
• Linguagem Assembly:
• Pequenos programas.
• Aplicações com pouca memória disponível, ou quando o seu custo é importante.
• Aplicações que necessitem de alto desempenho do programa e do processador, como aplicações em tempo real.
• Aplicações com muitas atividades de entrada/saída e pouco processamento de dados;
• Aplicações de alto volume de vendas (onde o custo de reprodução é mais importante do que o custo de desenvolvimento).
• Linguagem de Alto Nível:
• Programas grandes e complexos, e que requerem muita memória, muitos cálculos e processamento;
• Quando se deseja portabilidade;
• Aplicações de baixo volume de vendas (custo de desenvolvimento é mais importante do que o custo de reprodução);
• Produtos em constante evolução, requerendo freqüentes alterações.
Como tendências futuras tem-se naturalmente, o uso cada vez mais intensivo de linguagens de alto nível, pelas razões já apresentadas, e também pelo fato de que os compiladores estão cada vez mais poderosos e eficientes, os processadores mais complexos, e velozes, e o custo de memória cada vez menor. Contudo, as ferramentas disponíveis permitem a utilização de ambas as formas de programação em um mesmo programa. O uso de linguagem de baixo nível está-se restringindo a pequenos módulos, rotinas de entrada e saída, ou para otimizar módulos elaborados em linguagem de alto nível.
4. Porta Paralela
A porta paralela tem sido utilizada nos PCs desde o início da sua produção e se manteve inalterada durante todo esse tempo. Basicamente a porta paralela foi projetada para possibilitar que impressoras fossem conectadas ao PC. Quando a IBM trouxe o primeiro PC, ela resolveu que a porta paralela deveria ser compatível com as conexões utilizadas pela maior fabricante de impressoras da época a Centronics. A fabricante tinha desenvolvido um série de sinais de controle, que seriam capazes de controlar perfeitamente impressoras a partir de computadores pessoais. Assim muitos fabricantes de impressoras utilizavam esse padrão, que permaneceu até hoje. Mas quando a IBM desenvolveu o seu primeiro PC ela optou por não utilizar o conector da Centronics, que possuía 36 pinos. Ela optou utilizar um conector de 25 pinos, chamado DB-25. Desde então fabricantes de PCs tem utilizado esse padrão (DB-25) enquanto fabricantes de impressoras utilizam o padrão Centronics até hoje. Esse é o motivo pelo qual para conectarmos uma impressora no computador utilizando a porta paralela temos que utilizar
um cabo adaptador.
5. PARTE EXPERIMENTAL
5.1. Familiarização com o envio de dados para a porta paralela
Utilizando um editor de texto desenvolva um programa em C que gere uma onda quadrada nos pinos de dados da porta paralela.
5.2. Familiarização com a leitura de dados na porta paralela
Elaborar um programa em C que permite duplicar a freqüência da onda quadrada do item 5.1 através da leitura do estado do bit ACK na porta paralela. Note que o estado do pino de ACK em aberto é “1”.
5.3. Elaboração de um programa
Utilizando a porta paralela e uma seqüência de três led´s, elaborar um programa em C que faça o deslocamento de um bit no sentido horário e caso seja pressionado um botão o deslocamento do bit se faz em sentido anti-horário.
6. BIBLIOGRAFIA
[1] CUGNASCA, C.E. & ZERBINI, R.C. Experiência nº 2 - Ferramentas para o Desenvolvimento de Software. EPUSP, 1989.
[2] DONOVAN, J.J. - “Systems Programming” - McGraw-Hill, 1972.
[3] http://www.faqs.org/docs/Linux-mini/IO-Port-Programming.html
[4] http://www.howstuffworks.com
APÊNDICE I – COMANDOS DO LINUX – ACESSO DA PORTA PARALELA
/*
* example.c: Exemplo de como acessar a porta paralela
*
* Esse código basicamente escreve na porta paralela e lê dados
* da porta paralela. OBS: Rode o programa como root
*/
#include <stdio.h>
#include <unistd.h>
#include <asm/io.h>
#define BASEPORT 0x378 /* lp1 */
int main()
{
/* Setando a permissão para o acesso das portas */
if (ioperm(BASEPORT, 3, 1)) {perror("ioperm"); exit(1);}
/* Resetando todos os pinos de dados da porta paralela*/
outb(0, BASEPORT);
/* NOP por 1 segundo */
sleep(1);
/* Lê a porta de status (BASE+1) e mostra o resultado na tela */
printf("status: %d\n", inb(BASEPORT + 1));
/* Liberando as portas */
if (ioperm(BASEPORT, 3, 0)) {perror("ioperm"); exit(1);}
exit(0);
}
/* Fim do example.c */
IOPERM
int ioperm(unsigned long from, unsigned long num, int turn_on)
Ioperm seta a permissão de acesso de portas para “num” portas começando a partir do endereço da porta (“from”) para o valor “turn_on” (“1” para habilitar, “0” para desabilitar). Por exemplo ioperm(0x300,5,1) possibilitará o acesso das portas 0x300 a 0x304. O uso dessa função necessita de privilégios de administrador. Apenas as primeiras 0x3FF portas I/O podem ser liberadas dessa maneira.
INB
inb(unsigned long porta)
Para receber dados das portas, utiliza-se a função inb que retorna o byte lido na porta.
OUTB
outb(unsigned long valor, unsigned long porta)
Para enviar bytes para as portas utiliza-se o comando outb que envia o byte “valor” para a “porta” correspondente.
SLEEP
sleep(int tempo)
Interrompe a execução do programa por um número de segundos igual ao valor “tempo”.
APÊNDICE II – PINAGEM DA PORTA PARALELA
Descrição das portas
Porta de Dados (0x378)
A porta de dados corresponde aos bits de saída de dados D0 a D7.
Porta de Status (0x379)
A porta de status é utilizada apenas para entrada e retorna o estado dos seguintes sinais:
• Bits 0, 1 e 2: Reservados
• Bit 3: Error
• Bit 4: Select
• Bit 5: Paper End
• Bit 6: Acknowledgement
• Bit 7: Busy (invertido)
Porta de Controle (0x37A)
A porta de controle é utilizada apenas para saída e controla os seguintes sinais:
• Bit 0: Strobe (invertido)
• Bit 1: Auto Feed (invertido)
• Bit 2: Init
• Bit 3: Select In (invertido)
• Bits 4, 5, 6 e 7: Reservados
Descrição dos pinos
Strobe (saída)
O strobe line é o pino principal da porta paralela. Ela é responsável por avisar a impressora quando as infomações podem ser lidas na porta. Geralmente quando ela está em nível alto quando não existe a necessidade de transmissão e ela é zerada a informação já estão na porta de dados, prontas para serem transmitidas para a impressora. Sincronismo é fundamental aqui. Quando o pino de strobe é setado/zerado a informação deve estar estável nos pinos de dados. Numa impressora por exemplo, o tempo necessário para cada byte se estabilizar na porta é de cerca de meio microsegundo, após o strobe é zerado por cerca de 1 microsegundo logo após o strobe é setado novamente. Os dados ainda continuam nos pinos por cerca de meio microsegundo após o strobe ser setado. Portanto o tempo total para se transmitir um byte para porta paralela é por volta de 2 microsegundos.
Data (saída)
Esses 8 pinos carregam a informação a ser impressa e outros parâmetros como por exemplo, se o texto é negrito ou itálico. As informações aqui trafegam somente do computador para a o dispositivo que está conectado a porata paralela. Esse pinos funcionam com pradrões TTL.
Acknowledge (entrada)
Este pino é usado como uma confirmação de dados recebidos. Ele é normalmente está em nível alto e é zerado quando a informação foi recebida com sucesso, deixando o dispositivo pronto para a próxima informação.
Busy (entrada)
Como a transferencia de dados pela porta paralela pode acontecer numa taxa no qual a impressão não pode acompanhar existe a necessidade de haver meio que a impressora possa avisar o computador que a impressão ainda está sendo executada. Cada vez que que a impressora recebe um byte, ela seta o pino de busy, avisando assim o computador para parar a transmissão de dados. Quando o pino volta novamente para zero o próximo byte é enviado.
Paper Out (entrada)
Quando o papel acaba na impressora, esse pino junto com o de busy line são setados pela a impressora e computador imediatamente para a transmissão. Sem esse pino não haveria um modo de o computador ser informado da falta de papel na impressora.
Select (entrada)
Essa linha permite o computador ser informado se há algum dispositivo conectado ao computador. Quando o pino esta setado o dispositivo está online pronto para ser usado. Caso contrário o dispositivo não está pronto e nenhum byte será transmitido.
Auto Feed (saída)
Nem todas as impressoras tratam o retorno de carro da mesma maneira. Algumas apenas irá ir pra o começo da próxima linha e outras além disso também tem a necessidade de avançar o papel uma linha abaixo. O pino de AutoFeed permite que o software faça isso pela a impressora. Quando o sinal está resetado a impressora irá acrescentar uma linha quando houver um retorno de carro. Quando o sinal está setado o software tem que mandar um sinal de line feed junto com o retorno de carro para obter o mesmo efeito.
Error (entrada)
Este é um pino de erro geral. Não existe maneira de se identificar qual o tipo de erro. Quando nenhum erro é detectado, o pino esta setado. Quando um erro é detectado o pino é resetado. Alguns erros possíveis são: tampa da impressora aberta, cabeçote da impressora emperrado.
Initialize Printer (saída)
Esse pino é utilizado para reiniciar a impressora. Para isso o computador apenas reseta o pino.
Select Input (saída)
Permite o acionamento da impressora a partir do computador.
Ground
Terra (Referência nível 0).
APÊNDICE III – GCC EM AMBIENTE LINUX
Para a realização desta experiência em ambiente Linux, é necessário que estejam previamente instalados os pacotes do GCC.
1. Compilação de um programa em C para Assembler:
Utilize a seguinte linha de comando:
gcc -Os -S seu_programa.c
A explicação de cada uma das opções segue abaixo:
• Os – tenta reduzir o tamanho do código gerado;
• S – opção que compila para Assembler gerando um arquivo seu_programa.s;
• seu_programa.c (arquivo.c) – nome do arquivo em C.
2. Compilação de um programa em C para Objeto:
Utilize a seguinte linha de comando:
gcc -Os -c seu_programa.c
A explicação de cada uma das opções segue abaixo:
• Os – tenta reduzir o tamanho do código gerado;
• c – opção que compila para objeto gerando um arquivo seu_programa.o;
• seu_programa.c (arquivo.c) – nome do arquivo em C.
3. Ligação/Alocação:
Para a ligação e alocação do programa, utilize o seguinte comando:
ld -static -o seu_programa -L`gcc -print-file-name=` /usr/lib/crt1.o /usr/lib/crti.o seu_programa.o /usr/lib/crtn.o -lc –lgcc
Para maiores informações digite man ld.
...