Este curso tem por objetivo dar noes bsicas de programao usando a linguagem C. Sero desenvolvidos vrios programas utilizando os recursos aprendidos no decorrer do curso, que serviro como base para o desenvolvimento de projetos usando as interfaces paralela e serial do microcomputador.
Esta disciplina ser tambm um complemento da teoria aprendida no curso de Arquitetura e Sistemas de Computadores, proporcionando prticas de laboratrio de acordo com o andamento da teoria.
- Ementa do curso de Arquitetura e Sistemas:
Princpios bsicos dos computadores digitais; Arquitetura do microprocessador; Instrues do microprocessador; Modalidades de endereamento em microprocessadores; Execuo da instruo e microssequncias; Memria do microcomputador; Transferncias de I/O paralelas; Transferncias de I/O em srie; Princpios bsicos de fundamento e sistemas operacionais.
- Ementa do curso de Laboratrio de Arquitetura:
Componentes de hardware do PC-AT (8088,486 e Pentium); Observao dos sinais no barramento local e de expanso do PC-XT usando osciloscpio e analisador lgico; Temporizaes e acessos memria DRAM; Principais interrupes; Noes bsicas de programao utilizando a linguagem "C"; Projeto utilizando interface serial e paralela.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 2
- Programa:
I INTRODUO A LINGUAGEM C 1.0 Histrico. 2.0 Algoritmos. 3.0 Introduo ao Ambiente de Desenvolvimento de Programas.
II NOES BSICAS DE PROGRAMAO 1.0 Estrutura Bsica de um Programa em C. 2.0 Formataes Bsicas em C. 3.0 Constantes e Variveis. 4.0 Expresses e Operadores. 5.0 Laos. 6.0 Comandos de Deciso. 7.0 Matrizes e Strings. 8.0 Funes. 9.0 Estruturas e Unies. 10.0 Ponteiros. 11.0 Leitura e Escrita em Disco.
III PROJETOS UTILIZANDO A INTERFACE PARALELA 1.0 Introduo. 2.0 Pinagem. 3.0 Registradores. 4.0 Propriedades de Hardware. 5.0 Padres Existentes. 6.0 Porta Paralela para Impressora. 7.0 Programando a Porta Paralela. 8.0 Projetos Utilizando a Interface Paralela.
IV PROJETOS UTILIZANDO A INTERFACE SERIAL 1.0 Introduo. 2.0 Modos de Transmisso Serial. 3.0 Padres de Interface Serial. 4.0 Comunicao Serial no PC. 5.0 Pinos e Sinais da Porta Serial. 6.0 Registradores 7.0 O Hardware da Porta Serial. 8.0 Padres Existentes. 9.0 Programando a Porta Serial. 10.0 Conectando Hardware a Porta Serial.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 3
- Critrio de Avaliao:
Dois projetos de pesos iguais, mais um projeto servindo como prova substitutiva por semestre. Os projetos sero programas utilizando os recursos aprendidos durante o curso e a nota ser composta da seguinte maneira: (Projeto x 0,5) + (Apresentao x 0,5).
Os programas sero entregues em grupos de no mximo 5 pessoas. Ser sorteado um aluno de cada turma, que far a apresentao do projeto. Os demais grupos tero a nota do Projeto valendo de 0 a 10. A nota do semestre ser a mdia dos dois projetos.
- Bibliografia Bsica:
VIVIANE, Vitorine Treinamento em Linguagem C: Curso Completo Rio de janeiro Editora McGrow Hill
JAMSA, Kris Microsoft C: Dicas, Segredos e Truques So Paulo Editora Makron Books, 1992 701 p.
ZELENOVSKY, Ricardo; MENDONCA, Alexandre PC e Perifricos: Um Guia Completo de Programao Rio de Janeiro Editora Cincia Moderna, 1996 493 p.
- Bibliografia Complementar:
NORTON, Peter Desvendando o PC Rio de Janeiro Editora Campus, 1997 735 p.
ZELENOVSKY, Ricardo; MENDONCA, Alexandre PC: Um Guia Prtico de Hardware e Interfaceamento Rio de Janeiro Editora Intercincia, 1996 350 p.
TANENBAUM, Andrew S Organizao Estruturada de Computadores Traduo de Hlio Marques Sobrinho, Luiz Fernando Costa, 3 edio Rio de Janeiro Editora Prentice Hall, 1992 460 p. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 4
I INTRODUO A LINGUAGEM C
1.0 Histrico:
A primeira verso de C foi criada por Dennis Ritchie em 1972 nos laboratrios Bell para ser includo como um dos softwares a serem distribudos juntamente com o sistema operacional Unix do computador PDP-11, na equipe certificada por Ken Thompson.
Do ponto de vista tcnico, o surgimento do C iniciou com a linguagem ALGOL 60, definida em 1960. ALGOL era uma linguagem de alto nvel, que permitia ao programador trabalhar "longe da mquina", sem se preocupar com os aspectos de como cada comando ou dado era armazenado ou processado. Foi criado para substituir o FORTRAN. ALGOL no teve sucesso, talvez por tentar ser de muito alto nvel em uma poca em que a maioria dos sistemas operacional exigia do usurio um grande conhecimento de hardware.
Em 1967 surgiu CPL (Combined Programming Language) nas universidades de Londres e Cambridge com o objetivo, segundo a equipe do projeto, de "trazer ALGOL terra", ou "manter contato com a realidade de um computador real". Da mesma forma do ALGOL, CPL no foi bem aceita, em especial pelos projetistas de sistemas operacionais que a consideravam difcil de implementar.
Ainda em 1967, em Cambridge, Martin Richards criou o BCPL (Basic CPL), uma simplificao do CPL, tentando manter apenas as "boas coisas do CPL".
Em 1970, Ken Thompson, chefe da equipe que projetou o UNIX para o PDP-11 do Bell Labs, implementou um compilador para uma verso mais reduzida do CPL. Batizou a linguagem de B.
Tanto BCPL quanto B mostravam-se muito limitadas, prestando-se apenas para certas classes de problemas. Isto se fez sentir especialmente na primeira verso do PDP-11, lanado no mercado em 1971. Um dos fatores que levou isto foi a inteno do grupo responsvel pelo UNIX de reescrev-lo todo em uma linguagem de alto nvel, e para isto B era considerado lenta.
Estes problemas levaram a que o projetista Dennis Ritchie, do Bell Labs, fosse encarregado de projetar uma nova linguagem, sucessora do B, que viria ento, a ser chamada de C.
A linguagem C buscou manter o "contato com o computador real" e ainda assim dar ao programador novas condies para o desenvolvimento de programas em reas diversas, como comercial, cientfica e de engenharia.
Por mais alguns anos (aproximadamente 6) a sintaxe (formato) tida como padro da linguagem C foi a fornecida com o UNIX verso 5.0 do Bell Labs. A principal documentao deste padro encontra-se na publicao "The C Programming Language", de Brian Kernighan e Dennis Ritchie (K&R), tida como a "bblia da linguagem C".
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 5
O mais interessante desta verso de C era que os programas-fonte criados para rodar em um tipo de computador podiam ser transportados e recompilados em outros sem grandes problemas. A esta caracterstica d-se o nome de portabilidade. Com ela, uma empresa que desenvolve um programa pode faz-lo rodar em diferentes computadores sem ter um elevado custo a cada vez que isto for feito.
Em 1985, a ANSI (American National Standards Institute) estabeleceu um padro oficial de C o chamado "C ANSI".
1.1 Resumo Cronolgico:
Ano Acontecimentos 1960 ALGOL 60. 1967 BCPL: Martin Richards. 1970 B: Ken Thompson PDP-7. 1972 C: Dennis Ritchie PDP-11. 1974 Pcc: Steve Johnson primeiro compilador C comercial. 1978 Kernighan e Ritchie (K&R) escrevem um livro padronizando a linguagem C. 1983 X3J11: criado um comit para padronizao da linguagem C. 1985
Surge o padro ANSI C. Bjarne Stroutrup trabalha no aperfeioamento da linguagem C e cria o C++, que uma linguagem modular orientada a objetos. 1989 Surge o ISO/IEC 9899, idntico ao padro ANSI.
1.2 Principais Caractersticas:
Linguagem de programao mais usada em software de sistemas (sistemas operacionais, interpretadores, editores, programas montadores, compiladores e gerenciadores de banco de dados);
Linguagem de mdio nvel, segundo Herbert Schild;
Considerada uma linguagem estruturada;
Simplicidade, versatilidade e flexibilidade;
Alta portabilidade;
Permite manipulao de bits, bytes e endereos;
Quantidade de palavras chaves: 32 (padro K&R) o BASIC para PC contm 159 palavras;
Adequao a hardware e Sistemas Operacionais (maior eficincia);
Padronizao e disponibilidade; Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 6
1.3 Deficincias e Restries:
Pouca verificao semntica: - Verificao de tipos; - Converso de dados.
Pouco controle de memria: - Verificao de arrays; - Controle de apontadores; - Acessos ilegais.
Conjunto restrito de primitivas: - Simplicidade extremada; - Diferenas entre bibliotecas.
1.4 Compilao na Linguagem C:
No processo de compilao de um programa em C, o programador vai transformar os vrios arquivos fonte do sistema e dele prprio em um nico programa executvel. A figura 1.1 mostra um exemplo de compilao composto por 3 etapas:
Figura 1.1 Etapas de compilao de um programa em C.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 7
Na primeira etapa, os arquivos fonte produzidos pelo programador (arquivos.c ou .cpp) juntamente com os arquivos de incluso do sistema e do programador (arquivos.h) so compilados e transformados em linguagem Assembly;
Na segunda etapa, um programa montador vai transformar os vrios arquivos Assembly em arquivos em linguagem de mquina (cdigo objeto);
Finalmente, um programa ligador (LINK) transforma os arquivos objeto, juntamente com as bibliotecas em um programa executvel.
1.5 Mapeamento de Memria:
Um programa C no modo executvel cria e utiliza quatro regies distintas na memria com funes especficas:
A primeira regio armazena o cdigo do programa (as instrues); Na segunda regio so armazenadas as variveis globais do programa; As demais regies so a pilha (stack) e o heap (amontoar).
A pilha ou stack utilizada para vrias funes enquanto um programa executado. Ela armazena endereos de chamadas de funo, argumentos de funo, e variveis locais. Ela tambm salva o estado corrente da CPU. O heap uma regio disponvel de memria onde o programa pode ser utilizado para realizar funes relacionadas com alocao dinmica de memria, como por exemplo listas ligadas a algoritmos que percorrem estruturas em rvore.
A figura 1.2 mostra um exemplo de mapeamento de memria para um programa em C. Embora o layout fsico preciso de cada uma das regies de memria varie com o tipo de CPU e verses do C, este exemplo mostra de forma conceitual como um programa implementado em C aparece na memria.
Figura 1.2 Mapeamento de memria de um programa em C.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 8
2.0 Algoritmos:
Um trabalho de programao pode se tomar muito mais fcil se for dividido em partes menos complexas. Um problema a ser solucionado pelo computador pode ser separado em duas fases:
1) Fase da resoluo do problema 2) Fase de implementao do problema
A primeira fase se refere elaborao de um algoritmo para solucionar o problema. S ento, aps a elaborao do algoritmo que devemos passar para a fase de implementao do algoritmo em alguma linguagem de programao.
Os computadores apenas executam o que passamos para ele e no o que desejamos que eles faam. Assim, as instrues a serem executadas no devem ser ambguas. Muito cuidado deve ser tomado para garantir que o computador siga pelo nico caminho correto, e como resultado, as respostas corretas. Escrevendo um algoritmo antes de elaborarmos o programa, podemos obter uma formulao mais correta do problema, evitando assim, possveis erros.
Dessa forma, o algoritmo pode ser definido como uma seqncia ordenada, sem ambigidade, de instrues que levam soluo de um dado problema. A figura 2.1 mostra as fases de implementao de um problema pelo computador.
Figura 2.1 Fases de implementao de um problema.
A utilizao do algoritmo bastante comum. Como exemplo, podemos citar: as indicaes para se chegar a uma determinada rua, constituem um algoritmo para encontrar esta rua; uma receita para se fazer um bolo ou um esquema para se montar um brinquedo constituem exemplos de algoritmos, pois todos possuem uma seqncia de aes a serem cumpridas para atingir o objetivo.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 9
O algoritmo destina-se a resolver um determinado problema, estabelecendo um conjunto de regras a serem seguidas, com o objetivo de alcanar o resultado final e como conseqncia solucionar o problema. Como exemplo, seja a seqncia de nmeros: 1, 5, 9, 13, 17, .... Para determinamos o prximo elemento desta srie, devemos determinar a regra de formao desta seqncia. Para tal, observamos que o prximo nmero a soma do anterior com 4. Portanto, este somatrio constitui a regra de formao de qualquer nmero desta srie.
Para ilustrar, vamos elaborar um algoritmo bastante usado em nosso cotidiano: trocar uma lmpada queimada. Este algoritmo pode ser expresso em dois passos:
1) retirar a lmpada queimada 2) colocar a nova lmpada
Podemos observar que cada passo do algoritmo para trocar uma lmpada, possuem diversos detalhes. Como exemplo, o primeiro passo para retirar a lmpada queimada pode ser expandido para os seguintes passos:
pegar a escada posicionar a escada embaixo da lmpada a ser trocada subir na escada at que a alcanar a lmpada queimada retirar a lmpada queimada
O passo "colocar a nova lmpada" pode ser divido nas seguintes tarefas:
pegar uma lmpada nova colocar a nova lmpada no soquete descer da escada guardar a escada
Observamos que o algoritmo para trocar uma lmpada queimada passou de 2 para oito passos, aps o detalhamento de cada passo do primeiro algoritmo. Analisando o segundo algoritmo, vemos que ele constitui de uma seqncia de instrues mais detalhadas para a execuo da tarefa. Portanto, conclui-se que o algoritmo deve ser formado por um conjunto de passos simples e bem definidos de forma que possa ser entendido diretamente pelo agente que ir execut-lo. Suponhamos que o agente seja um computador. Como o computador no tem conhecimento prvio, o conjunto de passos de um algoritmo devem estar bem detalhados de forma que o computador possa reconhece-los, execut-los e produzir os resultados esperados.
2.1 Obstculos na Elaborao de um Algoritmo:
Complexidade do problema Legibilidade: constitui na capacidade de compreenso do algoritmo. Quanto mais legvel for um algoritmo, menor ser a sua complexidade. Portabilidade: devemos projetar um algoritmo em uma linguagem (em uma notao) de forma que possa ser entendido e convertido diretamente para qualquer linguagem de programao. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 10
Mtodo cartesiano: consiste em dividir o problema em partes menores e tratar cada parte individualmente, tornando-o mais simples e mais especfico. Se cada parte no estiver bem compreendida, esta deve novamente ser dividida. Este procedimento de diviso das partes do problema deve continuar at que cada parte possa ser facilmente compreendida e elaborada. Planejamento Reverso: partindo do produto final, vamos separ-lo at obtermos os componentes bsicos que o constitui. No nosso caso, a partir das informaes de sada, determinamos os componentes de entrada e suas transformaes.
2.2 Propriedades de um Algoritmo:
Os passos (ou seja, as instrues) de um algoritmo devem ser simples e no devem produzir ambigidades. A ordem de execuo dos passos devem ser obedecidas e deve estar bem definida. Todo algoritmo deve ter uma seqncia finita de passos.
Os mtodos para a elaborao de um algoritmo, iniciam-se com uma soluo genrica do problema e em seguida, passamos para um nvel de detalhamento do algoritmo.
O algoritmo deve ser escrito de forma que possa ser compreendido pelo agente que ir executa-lo. Portanto, para que o computador possa executar um determinado algoritmo, necessrio que este esteja limitado a um conjunto de instrues que possam ser compreendidas pelo computador.
2.3 Mtodos para a Construo de Algoritmos:
Ler atentamente o enunciado do problema. A partir do enunciado, obter os dados de entrada, ou seja, quais so os dados a serem fornecidos. Obter as informaes de sada a partir do enunciado do problema, ou seja, os resultados finais ou o objetivo do algoritmo. Determinar quais so as funes a serem desenvolvidas para transformar os dados de entrada nas respostas desejadas. Nesta etapa, elaboramos um layout do algoritmo, pois a partir dos requisitos especificados, determinamos a seqncia de aes. Aqui podemos utilizar o mtodo cartesiano ou o planejamento reverso. Construir o algoritmo definitivo. Testar o algoritmo. Consiste em executar os passos do algoritmo, verificando os resultados e detectando possveis erros. Aqui, rastreamos o algoritmo analisando cada instruo deste.
2.4 Fluxograma:
Consiste em uma descrio grfica do algoritmo. Um fluxograma mostra a lgica do algoritmo, enfatizando os passos individuais e suas interconexes. O fluxograma possui 5 smbolos para representar as instrues bsicas. A figura 2.2 ilustra estes smbolos: Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 11
Figura 2.2 Simbologia bsica de um fluxograma.
O fluxograma composto por um conjunto desses smbolos interligados por linhas, mostrando a ordem de execuo das operaes. A figura 2.3 mostra um exemplo de fluxograma.
Figura 2.3 Fluxograma. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 12
O fluxograma no permite especificar claramente muitos dos comandos bsicos que uma linguagem de programao implementa, mas tem como vantagem, uma melhor visualizao da lgica do programa, pelo fato de ser uma ferramenta grfica.
2.5 Linguagem Algortmica:
Consiste em uma forma de descrio do algoritmo bastante similar s linguagens de programao. A passagem do algoritmo expresso neste tipo de descrio para uma linguagem de programao quase direta. A seguir mostrado um algoritmo na forma de linguagem algortmica.
Incio
[ Declarao de variveis ]
[ Comandos ]
Fim
A seguir mostrado um exemplo de algoritmo na forma de linguagem algortmica.
Incio
N1, N2, M: real [ declarao das variveis ]
Leia (N1, N2) [ l os dados que so atribudos s variveis N1 a N2 ]
M = (N1 + N2)/2 [ avalia a expresso e atribui o resultado varivel M ]
Escreva("Mdia: ", M) [ exibe o resultado, imprimindo a constante "Mdia: " e o valor da varivel M ]
Fim
Observao:
Os comandos obedecem a seqncia estabelecida e so executados na ordem em que foram colocados.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 13
3.0 Introduo ao Ambiente de Desenvolvimento de Programas:
O compilador que usaremos durante o curso, o Borland C++ 3.1 para DOS. Embora seja um compilador para C++, ele pode ser usado com programas em feitos C bsico, sem nenhum problema. Esta uma caracterstica do compilador da Borland, mesmo havendo aprimoramentos na linguagem ele mantm as verses anteriores incorporadas. A figura 3.1 mostra o ambiente de desenvolvimento do Borland C.
Figura 3.1 Ambiente de Desenvolvimento de Programas
Na parte superior da tela esto os menus de comandos, que podem ser acessados pressionando a tecla F10. Na parte inferior esto as informaes das teclas de atalhos, o qual concentram as operaes mais efetuadas (Ajuda, Salvar, Abrir, Compilar, Criar arquivo Executvel e Menu) nas teclas de funo. A seguir ser feita uma breve descrio dos menus.
3.1 File:
New: inicia um novo arquivo fonte (arquivo.cpp). Open: abre um arquivo fonte existente. Save: salva o arquivo fonte em uso. Save as: salva o arquivo fonte possibilitando a mudana de nome e diretrio. Save all: o Borland possibilita que mais de um arquivo fonte esteja aberto ao mesmo tempo. Esta opo salva todos os arquivos abertos. Change dir: muda o diretrio em uso pelo Borland. Print: imprime o arquivo fonte. DOS Shell: abre a linha de comando em DOS. Quit: sai do ambiente de programao.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 14
3.2 Edit:
Undo: desfaz as alteraes feitas no arquivo fonte. Redo: refaz as alteraes desfeitas. Cut: recorta um texto selecionado. Copy: copia um texto selecionado. Paste: cola um texto copiado. Clear: elimina um texto selecionado. Copy Example: copia um programa exemplo do help, possibilitando sua compilao e utilizao. Show clipboard: insere o contedo do clipboard no ambiente de programao.
3.3 Search:
Find: procura caracteres ou palavras em um arquivo fonte. Replace: procura caracteres ou palavras com possibilidade de substituir os mesmos por outros. Search again: efetua novamente a ltima procura realizada com o comando Find. Go to line number: vai para uma determinada linha informada pelo programador. Previous error, Next error: se forem encontrados erros no arquivo fonte, possvel navegar pelo erros e fazer as alteraes necessrias. Previous error volta um a um os erros encontrados e Next error avana para os prximos erros. Locate function: localiza uma funo no arquivo fonte. Funciona somente durante o processo de depurao do programa.
3.4 Run:
Run: compila o arquivo fonte e executa o programa. Program reset: para o processo de depurao e execuo do programa e libera a memria reservada para estas operaes. Go to cursor: executa o programa at a posio onde se encontra o cursor.
Trace into: executa o programa passo a passo, parando a cada novo comando. Step over: parecido com trace into, step over executa linha a linha uma funo.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 15
Arguments: alguns programas podem precisar de argumentos na linha de comando, como por exemplo o comando format (format C:). Format o comando e C: o argumento. Esta opo abre uma janela onde estes argumentos podem ser usados.
3.5 Compile:
Compile: faz a compilao do programa buscando possveis erros de sintaxe. Make: gera um arquivo executvel a partir do arquivo compilado e montado. Link: faz a ligao do cdigo e as bibliotecas. Build all: executa a compilao e gerao de executvel para todos os arquivos fonte abertos. Information: abre uma caixa de informaes estatsticas sobre o programa. Remove messages: remove todas as mensagens da janela de mensagens.
3.6 Debug:
Inspect: abre uma janela onde podem ser observados os valores dos dados. Evaluate / modify: possibilita avaliar uma varivel ou expresso, e alterar seus valores. Call stacks: abre uma caixa de dilogo que permite avaliar as seqncias de comandos que seu programa est executando. Watches: abre o menu de watches, que so pontos de parada e observao de comandos executados pelo programa. Toggle breakpoint: insere ou remove uma parada incondicional na execuo de um programa, exatamente onde se encontra o cursor. Breakpoints: abre uma janela de dilogo onde possvel especificar condies para a parada na execuo do programa.
3.7 Project:
Open project: abre ou cria um novo projeto. Close project: fecha um projeto. Add item: adiciona um arquivo ao projeto. Delete item: deleta um arquivo do projeto. Local options: abre a caixa de dilogo de opes do projeto. Include files: abre uma caixa de dilogo que permite visualizar todos os arquivos que fazem parte do projeto. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 16
3.8 Options:
Applications: altera as configuraes iniciais do programa. Compiler: altera as configuraes do compilador. Transfer: adiciona ou remove programas do menu de sistema ( - ). Make: configura o gerenciador de projetos. Linker: altera as configuraes do ligador. Librarian: altera as configuraes das bibliotecas existentes. Debugger: altera as configuraes do depurador. Directories: altera os diretrios padres dos arquivos usados pelo Borland C++. Enviroment: altera as configuraes do ambiente de desenvolvimento. Save: salva todas as alteraes feitas dentro do menu Options.
3.9 Window:
Size / Move: altera o tamanho ou a posio da janela de um arquivo fonte. Zoom: redimensiona uma janela para o tamanho mximo. Cascade: sobrepe todas as janelas dos programas abertos, de forma que qualquer uma possa ser acessada rapidamente. Title: posiciona todas as janelas lado a lado. Next: navega entre as janelas dos programas abertos. Close: fecha a janela de um programa ativo. Close all: fecha todas as janelas abertas. Message: abre a janela de mensagens. Output: mostra o resultado de qualquer programa executado em DOS. Watch: mostra o valor de qualquer expresso tipo Watch.
Use screen: mostra o resultado de um programa em tela cheia. Register: mostra os valores dos registradores e flags da CPU quando um programa executado. Project: mostra diversas informaes sobre um projeto aberto. Project notes: abre o arquivo de anotaes de um projeto. List all: abre uma janela informando todas as alteraes e comando de um programa.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 17
3.10 Help:
Contents: abre a janela de ajuda mostrando todos os itens, sintaxe da linguagem e menus de funo. Index: abre o ndice da ajuda da sintaxe de programao. Topic search: abre o mesmo ndice de ajuda. Previous topic: abre os tpicos de ajuda anteriores at chegar a janela de Contents. Help on help: abre a janela de ajuda que ensina como tirar um melhor proveito da ajuda do Borland C++. Active file: possibilita a escolha do tipo de ajuda que ser ativado quando for solicitada ajuda. About: abre a janela de informaes sobre o Borland C++.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 18
II NOES BSICAS DE PROGRAMAO
1.0 Estrutura Bsica de um Programa em C:
Todo programa em C composto basicamente por uma ou mais funes C. A nica funo que obrigatoriamente deve estar presente no programa chamada main( ). Essa funo a primeira a ser chamada quando se inicia a execuo de um programa. Em um cdigo C bem escrito, main( ) contm, o que na essncia, uma viso geral do que o programa dever fazer. A seqncia a seguir ilustra a forma geral de um programa fonte escrito em C:
variveis globais main() { variveis locais seqncia de comandos }
A relao a seguir mostra as 32 palavras chaves utilizadas pelo padro K&R da linguagem C:
auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while
Todas as palavras devem ser utilizadas em letra minscula. Esse conjunto no pode ser usado para indicar nome de varivel.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 19
A seguir ser mostrado um exemplo de programa escrito em C para clculo da mdia aritmtica de 5 nmeros inteiros.
/*************************************************************/ /* Funcao: calculo de media aritmetica de 5 numeros inteiros */ /* Autor: Daniel Campos */ /* Data de criacao: 20/02/00 */ /* Ultima alteracao: 01/03/01 */ /* Hora: 18:00 */ /*************************************************************/
#include <stdio.h>
void main() { // Declaracao das variveis. int i, soma, aux1; float media;
soma = 0; media = 0;
// Entrada de dados.
for(i=0; i<5; i++) { printf("Entre com o %d inteiro.\n",i+1); scanf("%d",&aux1); soma = soma + aux1; }
// Calculo da media. media = ((float)soma)/(float)5; printf("Somatoria dos numeros: %d\n", soma); printf("O valor da media aritmetica: %.2f\n", media); }
Exemplo 1.1 Clculo da mdia de 5 nmeros.
2.0 Formataes Bsicas em C:
2.1 Funo printf( ):
A funo printf( ) uma das funes de E/S que podem ser usadas em C para escrever na tela do computador.
No interior dos parnteses esto as informaes passadas pelo programa main( ) funo printf( ). Estas informaes so chamadas de argumentos de printf( ).
Quando o programa encontra esta linha, passa o controle para a funo printf( ), que imprime na tela do computador o que foi solicitado. Quando for encerrada a execuo da funo, o controle transferido novamente para o programa.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 20
- Sintaxe:
printf(expresso de controle, lista de argumentos);
Os exemplos a seguir empregam a funo printf( ) para escrever diversos tipos de informaes na tela do computador.
#include <stdio.h>
void main() { printf("Meu primeiro programa em C.\n"); }
Exemplo 2.1 Primeiro programa usando printf( ).
Depois de executado, este programa escreve na tela a seguinte frase:
Meu primeiro programa em C.
#include <stdio.h>
void main() { printf("\n"); printf("Este e o numero dois: %d.\n", 2); printf("\n"); }
Exemplo 2.2 Segundo programa usando printf( ).
Depois de executado, este programa escreve na tela a seguinte frase:
Este o nmero dois: 2.
A funo printf( ) pode ter vrios argumentos. No exemplo 2.1 colocou-se um nico argumento: "Meu primeiro programa em C". No 2.2, colocou-se dois: "Este o nmero: %d" que est esquerda e o valor 2 direita, separados por vrgula. A funo printf( ) pode receber um nmero varivel de argumentos, os quais devero ser separados por vrgula.
#include <stdio.h>
void main() { printf("\n"); printf("%s esta a %d milhoes de milhas \ndo sol.\n", "Venus", 67); printf("\n"); }
Exemplo 2.3 Terceiro programa usando printf( ). Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 21
Depois de executado, este programa escreve na tela:
Venus esta a 67 milhoes de milhas do sol.
Como pde ser observado nos exemplos anteriores, \n representa mudana de linha.
Notar que 'j' delimitado por aspas simples ( um caractere) e "jota" por aspas duplas ( uma cadeia ou string).
2.2 - Tabelas de Cdigos Especiais:
A tabela a seguir mostra os cdigos de C para caracteres que no podem ser inseridos diretamente do teclado. A funo printf( ) aceita todos eles.
Cdigos Especiais Significado \a Beep \b Backspace \f Avano de pgina \n Mudana de linha \r Return (Enter) \t Tabulao horizontal \v Tabulao vertical \\ Barra invertida \ Aspas simples \ Aspas duplas \? Interrogao Tabela 2.1 Caracteres no impressos.
A tabela a seguir mostra os cdigos para impresso formatada de printf( ).
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 22
Especificador de Formato Tipo de Valor Exemplo %c Caractere em formato ASCII A, b %d ou %i Inteiro decimal 10 %e ou %E Notao cientfica 25E2 %f Ponto flutuante 3.78 %g ou %G Ponto flutuante no formato %f ou %e 3.78 ou 2.5E2 %o Inteiro octal 30 %u Inteiro decimal sem sinal 128 %s String de caracteres com terminador nulo Compilador C %x ou %X Inteiro hexadecimal 0x220h Tabela 2.2 Especificadores de formato.
3.0 Constantes e Variveis:
Uma constante tem um valor fixo e inaltervel. Em C temos constantes numricas, caracteres e cadeias de caracteres.
Uma varivel em C um espao de memria reservado para armazenar um certo tipo de dado e tendo um nome para referenciar o seu contedo. O espao de memria de uma varivel pode ser compartilhado por diferentes valores.
Um exemplo de constante foi o mostrado do exemplo 2.2. O nmero 2 uma constante que ser mostrada na tela atravs da funo printf( ). O exemplo a seguir mostra o uso de uma varivel que escrever na tela o mesmo valor 2.
#include <stdio.h>
void main() { int num; num = 2;
printf("\n"); printf("Este e o numero dois: %d.\n", num); printf("\n"); }
Exemplo 3.1 Programa usando uma varivel.
Aparecer na tela a mesma sada do exemplo 2.2:
Este e o numero dois: 2.
A instruo (int num;) um exemplo de declarao de varivel e a instruo (num = 2;) atribui o valor 2 varivel num.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 23
3.1 - Declarao de uma Varivel:
A declarao de uma varivel uma instruo para reservar uma quantidade de memria apropriada para armazenar um tipo especfico de dado.
Ela consiste no nome de um tipo (int, float, char, etc.) seguido do nome da(s) varivel(is). Exemplo:
#include <stdio.h>
main() { int a, b, c, d, aviao, carro; float x, y, temperatura; . . . } Exemplo 3.2 Declarao das variveis.
A linguagem C no trabalha com variveis no declaradas.
3.2 Tipos de Variveis:
O tipo informa a quantidade de memria, em bytes que a varivel ir ocupar. Em C existem 6 tipos de variveis bsicas:
Tipo Bit Bytes Escala char 8 1 -128 a 127 int 16 2 -32.768 a 32.767 enum 16 2 -32.768 a 32.767 float 32 4 3.4E-38 a 3.4E38 double 64 8 1.7E-308 a 1.7E308 void 0 0 Sem valor Tabela 3.1 Tipos de variveis.
Com exceo de void, os tipos de dado bsicos podem estar acompanhados por modificadores na declarao de variveis. Os modificadores de tipos oferecidos por C so:
Tipo Bit Bytes Escala unsigned char 8 1 0 a 255 short int 16 2 -32.768 to 32.767 unsigned int 16 2 0 a 65.535 unsigned long int 32 4 0 a 4.294.967.265 long int 32 4 -2.147.483.638 a 2.147.483.647 long double 80 10 3.4E-4932 a 1.1E4932 Tabela 3.2 Tabela dos modificadores dos tipos. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 24
O tipo int tem sempre o tamanho de uma palavra da mquina, ou seja para computadores de 16 bits, ele ter 16 bits de tamanho.
No exemplo 3.3 temos um programa que utiliza variveis: caractere, ponto flutuante e inteiro.
#include <stdio.h>
void main() { int evento; char corrida; float tempo;
evento = 5; corrida = 'C'; tempo = 27.25;
printf("\n"); printf("O tempo vitorioso na eliminatoria %c", corrida); printf("\nda competicao %d foi %.2fs.", evento, tempo); printf("\n"); }
Exemplo 3.3 Uso de variveis int, char e float.
O resultado ser:
O tempo vitorioso na eliminatoria C da competicao 5 foi 27.25 s.
Nmeros em ponto flutuante correspondem mais ou menos ao que os matemticos chamam de nmeros reais. Eles so guardados na memria em duas partes: mantissa, que o valor do nmero e expoente que a potncia que ir aument-lo. Por exemplo, a representao do nmero 12345 fica:
Figura 3.1 Representao de um nmero em ponto flutuante.
3.3 Inicializando Variveis:
Em um programa, uma varivel sempre dever ser inicializada ou assumir um valor inicial. Se isto no ocorrer, ela poder herdar um valor no desejado j colocado na memria anteriormente. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 25
possvel combinar uma declarao de varivel com o operador de atribuio. Por exemplo:
int evento = 5; char corrida = 'c'; float tempo = 27.25;
3.4 - Nomes de Variveis:
Para a escolha de nomes de variveis, deve-se ater aos seguintes pontos:
Uma boa escolha de nomes ajuda a entender o programa e prevenir erros. Uma varivel no pode ter o mesmo nome de uma palavra-chave de C. Letras maisculas e minsculas so consideradas diferentes. Para o MS-DOS somente os 8 primeiros caracteres so significativos.
4.0 Expresses e Operadores:
4.1 Funo scanf( ):
scanf( ) outra das funes de E/S implementadas em todos os compiladores C. Ela o complemento de printf( ) e permite ler dados formatados na entrada padro (teclado).
scanf( ) possui uma sintaxe similar a de printf( ), ou seja, uma expresso de controle seguida por uma lista de argumentos separados por vrgulas.
A principal diferena entre scanf( ) e printf( ) que na lista de argumentos devem ser informados os endereos das variveis (no lugar do nome colocamos o endereo).
C oferece um operador para tipos bsicos chamado operador de endereo e referenciado pelo smbolo & que retorna o endereo do operando.
- Sintaxe:
scanf(expresso de controle, lista de argumentos);
O exemplo a seguir ilustra o uso da funo de scanf( ):
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 26
#include <stdio.h>
void main() { int num;
printf("\nDigite um numero inteiro: "); scanf ("%d", &num); printf("\nO mumero digitado foi: %d.\n", num); }
Exemplo 4.1 Programa usando a funo scanf( ).
A sada deste programa fica:
Digite um numero inteiro: (o cursor fica parado esperando um nmero)
Supondo que o nmero 5 foi digitado, aps pressionar a tecla <Enter> aparecer na tela:
O numero digitado foi: 5.
4.2 O Operador de Endereos:
Toda varivel ocupa uma certa localizao na memria. Um inteiro ocupa (normalmente) 2 bytes. Se declararmos a varivel n como inteira e atribuirmos a ela o valor 2, quando n for referenciada devolver 2. Entretanto, se referenciarmos n precedido de & (&n) ser devolvido o endereo do primeiro byte onde n est guardada. O exemplo 4.2 imprime o valor e o endereo de n:
Um endereo de memria visto como um nmero inteiro sem sinal, por isso usamos %u.
Sada do programa:
Valor = 2, endereo = xxxxx. (varia com o compilador)
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 27
4.3 Cdigos de Formatao da Funo scanf( ):
A tabela a seguir mostra os cdigos de formatao utilizados:
Especificador de Formato Tipo de Valor Exemplo %c Caractere em formato ASCII A, b %d ou %i Inteiro decimal 10 %e ou %E Notao cientfica 2.5E2 %f Ponto flutuante 3.78 %g ou %G Ponto flutuante no formato %f ou %e 3.78 ou 2.5E2 %l Inteiro longo 1.285.382 %o Inteiro octal 30 %u Inteiro decimal sem sinal 128 %s String de caracteres com terminador nulo Compilador C %x ou %X Inteiro hexadecimal 0x220h Tabela 4.1 Especificadores de formato.
O exemplo 4.3 mostra o uso da funo scanf( ) lendo valores em ponto flutuante:
#include <stdio.h>
void main() { float anos, dias;
printf("\nDigite sua idade em anos: "); scanf("%f", &anos);
dias = anos * 365;
printf("\nSua idade em dias e: %.2f.\n", dias); }
Exemplo 4.3 Funo scanf( ) para ler valores em ponto flutuante.
A sada do programa ser:
Digite sua idade em anos: 10 Sua idade em dias e: 3650.
4.4 As Funes getche( ) e getch( ):
Em algumas situaes, a funo scanf( ) no se adapta perfeitamente, pois necessrio pressionarmos a tecla <ENTER> depois da sua entrada para que scanf( ) termine a leitura. A biblioteca C oferece funes que lem um caractere no instante em que digitado, sem esperar o <ENTER>.
A funo getche( ) l o caractere do teclado e permite que seja impresso na tela. Esta funo no aceita argumentos e devolve o caractere lido para a funo que a chamou. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 28 O Exemplo 4.4 chama a funo getche( ) e atribui o caractere que ela devolve varivel ch para depois imprimi-la com printf( ):
Digite algum caractere: d A tecla que voce pressionou foi: d.
A funo getch( ) l o caractere no teclado e no permite que seja impresso na tela, ou seja, o caractere digitado no aparece na tela. Como getche( ), ela no aceita argumentos e devolve o caractere lido para a funo que a chamou.
O exemplo a seguir chama a funo getch( ) e atribui o caractere que ela devolve varivel ch, para depois imprimir o caractere e seu sucessor na tabela ASCII:
A sada do programa, supondo-se que ser pressionada a letra a, ser:
Digite algum caractere: A tecla que voce pressionou foi: a. A sua sucessora ASCII e: b.
4.5 - A Funo getchar( ):
Obtm o prximo caractere da entrada cada vez que chamada, s terminando a leitura quando a tecla <ENTER> for pressionada. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 29
A funo getchar( ) retorna o caractere como seu valor e no aceita argumentos, ou seja, em:
c = getchar();
a varivel c contm o prximo caractere de entrada;
Se getchar( ) estiver sendo usada para ler o contedo de um arquivo, quando encontrar a indicao de fim de arquivo esta funo retorna 1.
4.6 Funo putchar( ):
o complemento de getchar( ) e aceita um argumento cujo valor ser impresso. Os comando a seguir mostram como ler um caractere de entrada, atribuir seu valor varivel c e imprimir o contedo da varivel c na sada padro (monitor):
c = getchar(); putchar(c);
O Exemplo 4.6 mostra uma utilizao das funes getchar( ) e putchar( ):
#include <stdio.h>
void main() { int c;
printf("\nDigite um caractere: ");
c = getchar(); putchar(c); printf("\n"); }
Exemplo 4.6 Uso das funes getchar( ) e putchar( ).
4.7 Operadores Aritmticos:
C uma das linguagens mais ricas em operadores; possui em torno de 40. A seguir sero descritos os principais tipos de operadores:
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 30
O operador parnteses altera a ordem de uma expresso, de acordo com a necessidade dos clculos.
4.7.2 Operadores de Estrutura de Acesso:
Operador Descrio Exemplo . Selecionador de membros diretos s.m -> Selecionador de membros indiretos ou ponteiros s->m
Estes operadores trabalham com membros diretos ou indiretos de uma estrutura. So mais comumente usados em C++.
4.7.3 - Operadores de Incremento e Decremento:
Operador Descrio Exemplo Resultado ++ Incremento A = 5++ A = 6 -- Decremento B = 8-- B = 7
O operador de incremento (++) incrementa de 1 seu operando e o operador de decremento (--) decrementa de 1 seu operando. Eles trabalham de dois modos: pr- fixado ou ps-fixado.
a) Pr-fixado: O operador aparece antes do nome da varivel: ++n. Quando ++n usado em uma instruo, n incrementada antes de seu valor ser usado.
b) Ps-fixado: O operador aparece depois do nome da varivel: n++. Quando n++ usado em uma instruo, n incrementada depois de seu valor ser usado.
Os exemplos a seguir ilustram o uso do operador de Incremento:
#include <stdio.h>
void main() { int n, x;
n=5; x = n++;
printf("\nx = %d n = %d\n", x, n); }
Exemplo 4.7 Uso do operador de incremento ps-fixado. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 31
A sada do programa ser:
x=5 n=6
#include <stdio.h>
void main() { int n, x;
n=5; x = ++n; printf("\nx = %d n = %d\n", x, n); }
Exemplo 4.8 Uso do operador de incremento pr-fixado.
A sada do programa ser:
x=5 n=6
Quando um destes operadores aparece sozinho em uma instruo, no faz diferena o uso pr ou ps-fixado: num++ equivalente a ++num (quando sozinho).
4.7.4 - Operadores Bit a Bit:
Operador Descrio Exemplo Resultado >> Deslocamento para a direita 1111 >> 2 0011 << Deslocamento para a esquerda 1111 << 2 1100 ~ Complemento de um ~ 1111 0000 ^ OR exclusivo 0000 ^ 1100 1100 & AND 0101 & 1111 0101 | OR 0101 | 1100 1101
Os operadores de deslocamento direita ou esquerda, dizem ao compilador para deslocar os bits dentro do valor pelo nmero de posies especificado. O compilador coloca zeros nos locais vazios deixados pelo deslocamento.
O operador complemento de um inverte cada bit, de modo que um 1 passe a ser 0 e um 0 passe a ser 1.
Os operadores: OR exclusivo, AND e OR trabalham sempre com dois valores e comparam os bits correspondentes em cada posio dos dois valores.
A operao com o operador OR exclusivo resulta 1 para cada posio onde os bits forem diferentes e 0 onde os bits forem iguais. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 32
A operao com o operador AND resulta em 1 apenas se nas duas posies os valores forem 1, ou seja, ele faz uma multiplicao entre os bits.
A operao com o operador OR resulta em 1 se em umas das posies houver um 1, ou seja, ele faz uma soma entre os bits.
Representam as operaes aritmticas bsicas de multiplicao, diviso, soma e subtrao. O exemplo a seguir utiliza vrios operadores aritmticos e converte temperatura Fahrenheit em seu correspondente em graus Celsius:
#include <stdio.h>
void main() { int ftemp, ctemp;
printf("\nDigite a temperatura em graus Fahrenheit: "); scanf("%d", &ftemp);
ctemp = (ftemp - 32) * 5/9; printf("\nA temperatura em graus Celsius e: %d\n", ctemp); }
Exemplo 4.9 Uso dos operadores de aritmtica bsica.
4.7.6 Operadores de Atribuio:
Operador Descrio Exemplo Resultado = Atribuio a i = 5 O valor de i 5 += Adio-igual i +=2 i = i + 2 -= Subtrao-igual d -= 3 d = d 3 *= Multiplicao-igual x *= y + 1 x = x * (y + 1) /= Diviso-igual t /= 2.5 t = t / 2.5 %= Mdulo-igual p %= 5 p = p % 5
O sinal de igual no tem a mesma interpretao dada em matemtica. Ele representa a atribuio da expresso direita ao nome da varivel esquerda. Por exemplo:
num = 2000;
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 33
atribui o valor 2000 varivel num. A ao executada da direita para a esquerda neste operador. A expresso 2000 = num no tem sentido em C, pois no podemos atribuir um valor a uma constante. C aceita vrias atribuies numa mesma instruo:
laranjas = cenouras = abacates = 80;
Os demais operadores so usados com um nome de varivel sua esquerda e uma expresso sua direita. As expresses com estes operadores so mais compactas e normalmente produzem um cdigo de mquina mais eficiente.
O operador mdulo ( % ) aceita somente operandos inteiros e retorna o resto da diviso do inteiro sua esquerda pelo inteiro sua direita (p = 3 % 2 o resultado ser 1).
4.7.7 Operador Unrio:
Operador Descrio Exemplo Resultado - Unrio i = -5 O valor de i -5
O operador unrio usado somente para indicar troca do sinal algbrico do valor.
4.7.8 Operadores Relacionais:
Operador Descrio Exemplo Resultado > Maior que a > b a maior que b < Menor que a < b a menor que b >= Maior ou igual a a >= b a maior ou igual a b <= Menor ou igual a a <= c a menor ou igual a b == Igual a == b a igual a b != Diferente a != b a diferente de b
Os operadores relacionais so usados para fazer comparaes, principalmente em comandos de deciso e laos.
Uma ateno especial deve ser tomada com relao ao operador relacional de igualdade, pois se ao invs de utilizar o duplo igual ( == ) for utilizado o igual ( = ), a expresso direita do operador no ser comparada da esquerda, mas sim atribuda mesma.
4.7.9 Operadores Lgicos:
Operador Descrio Exemplo Resultado && AND lgico a && b a e b || OR lgico a || b a ou b ! NOT lgico !b Tudo, exceto b
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 34 Os operadores lgicos permitem que seja feita uma lgica entre variveis, principalmente quando so exigidas decises mais complexas. Por exemplo, supondo-se que a varivel teste seja igual a 10 e esta varivel deva ser comparada ao intervalo de 0 a 20, o cdigo seria:
if(teste >= 0 && teste <= 20)
Este exemplo utiliza um comando de deciso ainda no estudado, mas basicamente est comparando se teste maior ou igual a 0 E menor ou igual a 20.
4.7.10 Precedncia dos Operadores:
Os operadores aritmticos tm maior precedncia que os relacionais (sero avaliados antes). Para ilustrar a precedncia dos operadores, a tabela a seguir mostra os diversos tipos ordenados de maior para menor procedncia, comeando de cima para baixo:
Exemplo 4.10 Precedncia dos operadores. A sada ser:
A resposta e: 0.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 35
possvel incluir expresses envolvendo operadores aritmticos (e outros operadores) diretamente em funes como printf( ):
#include <stdio.h>
void main() { int ftemp;
printf("\nDigite temperatura em graus Fahrenheit: "); scanf("%d", &ftemp); printf("\nA temperatura em graus Celsius e: %d.\n", (ftemp-32)*5/9); }
Exemplo 4.12 Uso de operadores no printf( ).
5.0 Laos:
5.1 Lao for:
O lao for engloba 3 expresses em uma nica. utilizado para repetir uma instruo ou um bloco de instrues, inicializar uma ou mais variveis, testar uma varivel de controle e incrementar uma ou mais variveis com cada alterao.
- Sintaxe:
for(inicializao; teste; incremento) instruo;
O exemplo a seguir utiliza o comando for para mostrar na tela os nmeros de 0 a 9:
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 36
conta = 0. conta = 1. conta = 2. conta = 3. conta = 4. conta = 5. conta = 6. conta = 7. conta = 8. conta = 9.
No lao for a inicializao executada uma nica vez antes do lao ser iniciado (conta=0). O teste uma instruo de condio que controla o lao. Se a expresso for verdadeira o corpo do lao executado, seno o programa continua a execuo da instruo imediatamente posterior ao lao. O incremento define a maneira como a varivel de controle vai ser alterada. Esta instruo sempre executada imediatamente aps a execuo do corpo do lao.
O prximo exemplo utiliza o comando for com o operador de decremento.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 37
conta = 9. conta = 8. conta = 7. conta = 6. conta = 5. conta = 4. conta = 3. conta = 2. conta = 1. conta = 0.
O exemplo 5.3 usa o for variando de 3 em 3 para escrever na tela os nmero de 0 a 9.
#include <stdio.h> #include <conio.h> void main() { clrscr(); int conta;
Exemplo 5.4 - Imprime os nmeros de 0 a 98 com incremento de 2.
Duas ou mais instrues podem ser colocadas no corpo do lao for se estiverem entre chaves: Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 38
#include <stdio.h> #include <conio.h>
void main() { clrscr(); int conta, total;
for(conta=0, total=0; conta<10; conta++) { total = total + conta; // ou total +=conta; printf("conta = %d, total = %d.\n", conta, total); } }
Exemplo 5.5 - Imprime os nmeros de 0 a 9 e totais.
A sada do programa ser:
conta = 0, total = 0. conta = 1, total = 1. conta = 2, total = 3. conta = 3, total = 6. conta = 4, total = 10. conta = 5, total = 15. conta = 6, total = 21. conta = 7, total = 28. conta = 8, total = 36. conta = 9, total = 45.
A chave s utilizada quando o corpo do for tiver mais de uma instruo.
5.2 Lao while:
O comando while examina uma condio especfica. Enquanto a condio for verdadeira, o comando que o segue ser executado repetidamente. Quando a condio for falsa, a execuo passa para o primeiro comando que segue a repetio while.
while semelhante ao for: utiliza os mesmos elementos, mas eles esto distribudos de maneira diferente no programa.
- Sintaxe:
while (expresso teste) instruo;
Reescrevendo o exemplo 5.5 usando o comando while, o cdigo fica:
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 39
#include <stdio.h> #include <conio.h>
void main() { clrscr(); int conta = 0; int total = 0;
while(conta<10) { total = total + conta; /* ou total +=conta; */ printf("conta = %d, total = %d.\n", conta++, total); } }
Exemplo 5.6 - Imprime os nmeros de 0 a 9 e totais usando while.
A sada do programa ser:
conta = 0, total = 0. conta = 1, total = 1. conta = 2, total = 3. conta = 3, total = 6. conta = 4, total = 10. conta = 5, total = 15. conta = 6, total = 21. conta = 7, total = 28. conta = 8, total = 36. conta = 9, total = 45.
Quando o nmero de interaes no conhecido mais apropriado usar while. O comando while mais apropriado em situaes em que o lao pode ser terminado inesperadamente por condies desenvolvidas dentro do lao, como mostra o exemplo 5.7:
#include <stdio.h> #include <conio.h>
void main() { clrscr(); int cont = 0;
printf("Digite uma frase: ");
while (getche() != 13) cont++;
printf("\nO numero de caracteres e: %d", cont); }
Exemplo 5.7 - Conta o nmero de caracteres de uma frase.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 40
Assim como no comando for possvel aninhar laos, ou seja, colocar um while dentro de outro while. O exemplo a seguir mostra este tipo de organizao:
#include <stdio.h> #include <conio.h>
void main() { clrscr(); int num1, num2; long resposta;
while(1) // Loop infinito s sai com <CTRL> + <BREAK> { printf("Digite um nmero inteiro: "); scanf("%d", &num1);
num2 = num1; resposta = 1;
while(num1>1) resposta = resposta * num1--;
printf("O fatorial do numero %d e: %ld\n", num2, resposta); } }
Exemplo 5.8 Calcula nmero fatorial.
O lao while mais externo (primeiro while) um lao infinito. Para sair, devem ser pressionadas as teclas <CTRL> + <BREAK>.
5.3 - Lao do-while:
Ao contrrio dos comandos while e for, que testam a condio e executam os comandos se esta for verdadeira, o comando do-while primeiro executa um conjunto de comandos e depois testa a condio. Se a condio for verdadeira, o comando novamente executado e se repete at que a condio no seja mais verdadeira. Como conseqncia, o do-while executado pelo menos uma vez.
- Sintaxe:
do { instruo; } while (expresso de teste);
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 41
6.0 Comandos de Deciso:
6.1 Comando if:
O comando if examina uma condio especfica. Se a condio for verdadeira, o programa executa o comando ou o bloco de comandos seguinte. Se a condio for falsa, o comando que segue a condio no ser executado.
A instruo ser executada se a expresso de teste for verdadeira. Ele executado uma nica vez. No prximo exemplo, sero colocadas vrias instrues no corpo do comando if.
#include <stdio.h> #include <conio.h>
void main() { clrscr();
if(getche() == 'p') { printf("\nVoce precionou a tecla p"); printf("\nPressione qualquer tecla para terminar."); getche(); } }
Exemplo 6.2 - Uso do comando if com vrias instrues.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 42 Dependo da complexidade do programa, um comando if pode estar dentro de outro comando if. Exemplo:
#include <stdio.h> #include <conio.h>
void main() { clrscr(); char ch;
printf("Digite uma letra de 'a' a 'z': "); ch = getche();
if(ch >= 'a') { if(ch <= 'z') printf("\nVoce digitou certo!!"); } } Exemplo 6.3 Uso de comandos if aninhados.
6.2 Comando if-else:
O comando else associado ao if e executa uma instruo (ou bloco de instrues) se a expresso de teste do if for falsa.
- Sintaxe:
if (expresso de teste) { instruo 1; } else { instruo 2; }
O exemplo a seguir ilustra o uso do comando if-else:
#include <stdio.h> #include <conio.h>
void main() { clrscr(); char ch;
ch = getche();
if(ch =='p') printf("\nVoce pressionou a tecla p"); else printf("\nVoce nao pressionou a tecla p"); } Exemplo 6.4 Uso do comando if-else. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 43
O comando switch avalia uma expresso e tenta localizar uma coincidncia dentro da lista de valores. Se for encontrada uma coincidncia, switch executa os comandos associados a ele. Se no for encontrada nenhuma coincidncia, a execuo continua no primeiro comando seguinte ao switch.
- Sintaxe:
switch(expresso constante) { case constante l: instrues 1; break; case constante 2: instrues 2; break; }
A expresso entre parnteses deve ser um valor inteiro ou caractere e o corpo do switch deve estar envolto por chaves. Pode haver uma ou mais instrues seguindo cada case. Estas instrues no podem estar entre chaves. O comando break causa uma sada imediata do switch. Se no existir um break seguindo as instrues de um caso, o programa segue executando todas as instrues dos casos abaixo.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 44
O exemplo a seguir usa o comando switch para tomar vrias decises em funo de uma nica expresso:
#include <stdio.h> #include <conio.h>
void main() { clrscr(); int D, M, A, i;
long int F = 0;
do { do { printf("\n\nDigite a data na forma dd/mm/aaaa: "); scanf("%d/%d/%d", &D, &M, &A); } while(A < 1600 || M < 1 || M > 12 || D < 1 || D > 31);
F = A + D + 3 * (M - 1) - 1;
if(M<3) { A--; i = 0; } else i = .4 * M + 2.3;
F = F + A / 4 - i; i = A / 100 + 1; i = i * 0.75; F = F - i; F = F % 7;
switch(F) { case 0: printf("\nDomingo"); break; case 1: printf("\nSegunda-feira"); break; case 2: printf("\nTerca-feira"); break; case 3: printf("\nQuarta-feira"); break; case 4: printf("\nQuinta-feira"); break; case 5: printf("\nSexta-feira"); break; case 6: printf("\nSabado"); break; } printf(\n\nPressione ENTER para continuar ou ESC para sair: ); } while(getch() != 27); }
Exemplo 6.6 - Calcula o dia da semana usando o comando switch.
O prximo exemplo usa o comando switch para identificar o tipo de operao matemtica usada. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 45
#include <stdio.h> #include <conio.h>
void main() { float x1, x2, result=0; char sinal;
do { printf("Operacao: "); scanf("%f%c%f", &x1, &sinal, &x2);
switch(sinal) { case '+': result = x1 + x2; break; case '-': result = x1 - x2; break; case '*': result = x1 * x2; break; case '/': result = x1 / x2; break; default : printf("\nOperacao invalida\n"); continue; }
printf("Resposta = %.4f\n", result); printf("\n"); } while(1); // Loop infinito - s sai com <Ctrl> + <Break> }
Exemplo 6.7 Uso do comando switch.
O rtulo default no comando switch permite que sejam especificados um ou mais comandos que sero executados caso nenhuma das condies satisfaa a expresso constante.
7.0 Matrizes e Strings:
7.1 Matriz:
Uma matriz agrupa uma serie de variveis do mesmo tipo referenciadas por um nico nome, onde cada varivel diferenciada atravs de um nmero chamado subscrito ou ndice. Colchetes so usados para conter o ndice da matriz.
- Sintaxe:
tipo_da_varivel nome[num_elementos];
Se a matriz tiver apenas um ndice, pode ser chamada de vetor.
O exemplo a seguir ilustra o uso da matriz para calcular a mdia da nota de 5 alunos.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 46
#include <stdio.h> #include <conio.h>
void main() { clrscr(); int notas[5]; int i, soma;
for(i=0; i<5; i++) { printf("\nDigite a nota do aluno %d: ", i+1); scanf("%d", ¬as[i]); } soma = 0; for(i=0; i<5; i++) soma = soma + notas[i];
printf("\n\nMedia das Notas: %d", soma/5); }
Exemplo 7.1 Clculo da mdia da nota de 5 alunos.
Os elementos da matriz so guardados em uma seqncia contnua de memria, isto , um seguido do outro. O primeiro elemento da matriz est na posio zero. Logo, notas[2] , na verdade, o terceiro elemento da matriz.
Os elementos da matriz podero ser de outros tipos alm de inteiros, como no exemplo 7.2 a seguir, onde utilizado o tipo float, considerando assim a parte fracionria das notas dos alunos:
#include <stdio.h> #include <conio.h>
void main() { clrscr(); float notas[5]; float soma; int i;
for(i=0; i<5; i++) { printf("\nDigite a nota do aluno %d: ", i+1); scanf("%f", ¬as[i]); }
Exemplo 7.2 Clculo da mdia da nota de 5 alunos usando float.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 47
Quando no conhecemos o total de elementos da matriz (no exemplo a quantidade total de alunos da classe), podemos criar um mecanismo que pode ser modificado facilmente e que estabelece um limite superior para a quantidade de elementos. Este procedimento feito atravs de um comando de pr-processamento chamado define:
printf("\n\nMedia das Notas: %.2f", soma/(i-1)); }
Exemplo 7.3 Clculo da mdia da nota de 5 alunos.
Ateno:
C no avisa quando o limite de dimensionamento de uma matriz foi excedido. Portando o procedimento acima deve ser utilizado com cuidado para que i no seja superior a 39. O ideal modificar o lao do-while:
O prximo exemplo, faz uma modificao do no lao do-while, para evitar que o limite de dimensionamento da matriz seja excedido:
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 48
printf("\n\nMedia das Notas: %.2f", soma/(i-1)); }
Exemplo 7.4 Clculo da mdia da nota de 5 alunos.
Em C podemos declarar uma matriz e tambm atribuir valores a ela:
#define LIM 5 int tab[LIM] = {50,25,10,5,1};
void main() { . . . }
Exemplo 7.5 Declarao e atribuio de valores para uma matriz.
A lista de valores colocada entre chaves e os valores so separados por vrgulas. Os valores devem ser atribudos em seqncia.
A linguagem C permite a criao de matrizes de mais de uma dimenso. Com dois pares de colchetes podemos declarar, por exemplo uma matriz de duas dimenses, como mostra o exemplo 7.6: Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 49
#include <stdio.h> #include <conio.h>
#define A 5 #define L 10
void main() { clrscr(); char matriz[A][L]; int x, y;
Uma string , na verdade, uma matriz unitria de caracteres definida como sendo do tipo char. Ela segue os mesmos padres utilizados pelas matrizes e vetores numricos.
Tanto o tamanho da string como seus elementos especficos, so identificados pelo nome da string seguido pelo nmero (ndice) entre colchetes. Contudo, como o primeiro caractere reside no elemento 0, o nmero do ltimo elemento sempre o tamanho da string menos 1.
O ltimo elemento de uma string de caracteres o caractere nulo \0. Ele deve ser sempre considerado na hora de especificar o tamanho da string.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 50
- Sintaxe:
char nome[num_elementos];
Uma string definida como char nome[20] pode conter, no mximo 20 caracteres (0 a 19), considerando a posio 20 como o caractere nulo \0. A string no precisa ser utilizada por completo, ou seja, estarem preenchidas as 20 posies. Ela pode conter de 0 a 20 caracteres, mas no pode exceder este valor.
O exemplo a seguir cria uma string de caracteres chamada alfabeto, com capacidade para armazenar 27 caracteres (26 letras mais o caractere nulo \0).
#include <stdio.h> #include <conio.h>
void main() { char alfabeto[26]; // 26 letras mais o caractere nulo. char letra; int index;
clrscr();
for(letra = A, index=0; letra <= Z; letra++, index++) alfabeto[index] = letra;
alfabeto[index] = \0;
printf(%s, alfabeto); }
Exemplo 7.7 Utilizao de uma string para armazenar o alfabeto.
A varivel index reflete a posio de cada letra dentro da string. O programa inicializa index com 0, que a primeira posio armazenada na string alfabeto[0]. Cada interao da repetio incrementa as variveis letra e index. Como resultado, o programa armazena as letras como mostrado na figura a seguir:
alfabeto[0] ---- A alfabeto[1] ---- B alfabeto[2] ---- C . . .
alfabeto[24] ---- Y alfabeto[25] ---- Z alfabeto[26] ---- \0 Caractere nulo. Figura 7.1 Armazenamento da string.
Neste exemplo a funo printf( ) examina um caractere por vez at encontrar o \0. Como printf( ) exibe a string inteira, ao contrrio de exibir um caractere especfico, pode-se utilizar a string alfabeto sem os colchetes. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 51
A string alfabeto comporta 27 caracteres. Caso sejam utilizadas apenas 10 posies, a posio 11 deve conter o caractere nulo. Se o comando de escrita na tela no encontrar o caractere nulo, ele continuar escrevendo os caracteres da string at que todas as posies sejam escritas. Isto significa que qualquer coisa que esteja nas posies 11 at 27 ser apresentada junto com os 10 caracteres iniciais, alterando o significado da seqncia de caracteres da string.
O exemplo a seguir permite que o usurio insira uma string no programa.
#include <stdio.h> #include <conio.h>
void main() { char string[128]; int index=0;
clrscr(); printf("\nDigite uma string de caracteres e pressione ENTER.\n\n> ");
Os caracteres so lidos um a um pelo lao while utilizando a funo getchar( ). A ser pressionada a tecla ENTER, o lao terminado e o programa escreve na tela a string e o nmero de caracteres digitados.
Assim como nas matrizes e vetores, podemos declarar uma string e tambm atribuir valores a ela:
char string[128] = {Isto uma string};
Exemplo 7.9 Declarao e atribuio de valores para uma string.
7.2.1 Funes gets( ) e puts( ):
A funo gets( ) obtm uma string de caracteres do usurio. Internamente, gets( ) usa getchar( ) para obter os caracteres at localizar um ENTER. Portanto, como getchar( ), gets( ) deixa o usurio editar a linha de texto usando a tecla BACKSPACE. Uma vez pressionado ENTER, gets( ) recupera apenas os caracteres que aparecem na tela. Se o usurio ultrapassar o espao reservado para a string, gets( ) sobrepe os valores na memria, podendo at travar o computador.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 52
A funo puts( ) exibe uma string de caracteres com o caractere de mudana de linha. Quando puts( ) encontra um caractere nulo, que finaliza a string, a funo faz a mudana de linha automaticamente, dispensando a utilizao do \n.
- Sintaxe da funo gets( ):
gets(string);
- Sintaxe da funo puts( ):
puts(string);
O exemplo a seguir utiliza as funes gets( ) e puts( ) para ler uma string e novamente apresent-la na tela.
#include <stdio.h> #include <conio.h>
void main() { char string[128];
puts(Digite uma string e pressione Enter:); gets(string); puts(\nA string digitada foi:); puts(string); }
Exemplo 7.10 Uso das funes gets( ) e puts( ).
A funo puts( ) tambm pode escrever na tela textos simples e utilizar o caractere de mudana de linha, mas no aceita especificadores de formato (%d, %c, etc.) e argumentos.
Estas funes simplificam bastante o uso de strings, substituindo as funes scanf( ) e printf( ).
7.2.2 Rotinas de Manipulao de String:
A manipulao de strings a principal atividade de muitos programas em C. Alguns exemplos de manipulao: comparar duas strings, localizar um caractere em uma string, adicionar o contedo de uma string em outra, etc. Para isto, C disponibiliza uma biblioteca chamada string.h, que contm diversas funes de manipulao de strings, conforme mostra a tabela a seguir:
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 53
Funo Descrio strcat Anexa uma string outra. strchr Pesquisa uma string pela primeira ocorrncia de uma letra. strcmp Compara duas strings. strcmpi Compara duas strings, ignorando diferenas entre maisculas e minsculas. strcpy Copia o contedo de uma string em outra. strcspn Devolve a primeira letra de uma string que est na segunda string. strdup Aloca memria e copia uma string. strerror Devolve uma mensagem de erro associada ultima chamada rotina da biblioteca run-time que produziu o erro. stricmp Compara duas strings, ignorando diferenas entre maisculas e minsculas. strlen Retorna o nmero de caracteres da string. strlwr Converte uma string para minscula. strncat Anexa n caracteres em uma string. strncmp Compara os primeiros n caracteres de uma string. strncpy Copia os primeiros n caracteres de uma string em outra. strnicmp Compara os primeiros n caracteres de duas strings, ignorando diferenas entre maisculas e minsculas. strnset Inicializa os primeiros n caracteres da string com um caractere especfico. strpbrk Localiza o primeiro caractere da primeira string que tambm est na segunda. strrchr Localiza a ltima ocorrncia de uma letra na string. strrev Reverte a ordem das letras em uma string. strset Define todos os caracteres de uma string com uma letra especfica. strspn Retorna o primeiro caractere da primeira string que no est no conjunto de caracteres da segunda string. strstr Retorna um ponteiro com a localizao da segunda string dentro da primeira, ou NULL se a string no existir. strtod Converte uma string para um valor decimal. strtol Converte uma string para um valor long. strtoul Converte uma string para um valor unsigned long. strupr Converte uma string para maiscula. Tabela 7.1 Rotinas de manipulao de strings.
O exemplo 7.11 a seguir utiliza strcpy para adicionar a frase Isto uma String string teste e utiliza strchr para retornar a posio da letra r dentro da string.
Para que seja possvel identificar a posio da letra r dentro da string, necessrio utilizar um ponteiro chamado ptr. O conceito de ponteiros ser visto no captulo 10.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 54
#include <string.h> #include <stdio.h>
void main() { char teste[15]; char *ptr; // Define um ponteiro chamado ptr. char c = 'r';
strcpy(teste, "Isto e uma String"); ptr = strchr(teste, c);
if(ptr) printf("O caractere r esta na posicao: %d\n", ptr-teste); else printf("O caractere nao foi encontrado!\n"); }
Exemplo 7.11 Identificao de um caractere dentro da string.
O exemplo 7.12 a seguir, utiliza strlen para retornar o nmero de caracteres da string teste.
#include <stdio.h> #include <string.h>
void main() { char teste[20] = {"Isto e uma String"};
printf("\nA string tem %d caracteres.\n", strlen(teste)); }
Exemplo 7.12 Retorna o nmero de caracteres da string.
O exemplo 7.13 utiliza strupr para converter uma string minscula em maiscula.
Exemplo 7.13 Converte uma string minscula em maiscula.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 55
7.2.3 Rotinas de Converso de Caracteres:
Como um complemento para as rotinas de manipulao de strings, existem as rotinas de converso de caracteres, que convertem um caractere de um formato para outro. A tabela a seguir define as rotinas de converso de caracteres disponveis na biblioteca ctype.h:
Funo Descrio tolower(c) Converte c para maiscula se minscula.
toupper(c) Converte c para minscula se maiscula.
toascii(c) Limpa todos os caracteres com exceo dos 7 bits menos significativos de c. _tolower(c) Macro que converte c para minscula sem checar o tipo.
_touper(c) Macro que converte c para maiscula sem checar o tipo.
Tabela 7.2 Rotinas de converso de caracteres.
A linguagem C fornece ambas as implementaes, macro e funo, para as rotinas tolower e toupper. Se a velocidade do programa for mais importante que o tamanho, use a macro. Macros so mais rpidas que funes, mas resultam em um arquivo executvel maior.
7.2.4 Rotinas de Converses Numricas:
Muitos programas em C precisam obter um nmero (no um cdigo ASCII) do usurio no formato de texto. Para obter este nmero, podemos usar a funo gets( ) para ler o nmero no formato de uma string de caracteres ASCII e depois usar as funes de converso numrica da biblioteca stdlib.h para converter a string em um valor numrico. A tabela a seguir apresenta trs funes de converso:
Funo Descrio atoi Converte um valor ASCII para o formato int.
atol Converte um valor ASCII para o formato long.
atof Converte um valor ASCII para o formato float.
Tabela 7.3 Rotinas de converses numricas.
O Exemplo a seguir utiliza as rotinas de converso para converter strings em valores numricos:
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 56
puts(Digite um valor inteiro); gets(string); printf(O valor digitado era %d\n\n, atoi(string));
puts(Digite um valor inteiro longo); gets(string); printf(O valor digitado era %ld\n\n, atol(string));
puts(Digite um valor em ponto flutuante); gets(string); printf(O valor digitado era %f\n\n, atof(string)); }
Exemplo 7.14 Converte string de caractere em valores numricos.
8.0 Funes:
As funes dividem grandes tarefas de computao em tarefas menores, permitindo s pessoas trabalharem sobre o que outras j fizeram, ao invs de partir do zero. Exemplo: funo printf( ).
Uma funo uma unidade de cdigo de programa autnoma projetada para cumprir uma tarefa particular. C foi projetada com funes eficientes e fceis de usar. Programas em C geralmente consistem em vrias pequenas funes ao invs de poucas de maior tamanho.
8.1 Estrutura das Funes em C:
A estrutura de uma funo C bastante semelhante funo main( ). A nica diferena que main( ) possui um nome especial.
A funo criada pelo usurio deve ser colocada antes do programa principal. Todas as funes em C comeam com um nome seguido de um parntese (que envolve ou no uma lista de argumentos) e, aps isto, chaves que envolvem o corpo da funo.
- Sintaxe:
declarao_do_tipo nome_da_funo(lista_de_argumentos) { instrues; return( ); } Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 57
8.2 Chamando Funes:
As funes criadas so chamadas da mesma forma como so chamadas as funes printf( ) e getche( ), por exemplo. Visto que a chamada a uma funo constitui uma instruo do programa, deve ser encerrada por ponto e vrgula. Entretanto, na definio de uma funo, o ponto e vrgula no pode ser usado.
8.3 - Passando Dados para a Funo Chamada:
O mecanismo usado para transmitir informaes para uma funo chamado argumento, os quais j foram usados nas funes printf( ) e scanf( ).
Em C todos os argumentos de funes so passados "por valor". Isso significa que funo chamada dada uma cpia dos valores dos argumentos e ela cria outras variveis temporrias para armazenar estes valores. A diferena principal que em C uma funo no pode alterar o valor de uma varivel da funo que chama, ela s pode alterar sua cpia temporria.
O argumento poder ser uma constante ou uma varivel. Se mais de um argumento necessrio, podem ser passados uma lista de argumentos separados por vrgulas.
8.3 Variveis Locais:
As variveis que so declaradas dentro de uma funo so chamadas de variveis locais. Elas so conhecidas somente dentro do prprio bloco e existem somente durante a execuo do bloco onde foram declaradas. Este tipo de varivel tambm chamada de varivel automtica, pois ela automaticamente criada quando a funo criada e destruda ao final de sua execuo.
8.4 Usando mais de uma Funo:
Cada funo pode chamar outras funes. Uma funo chamada linha( ), criada pelo programador, chama a funo printf( ) e a funo main( ) chama as funes linha( ) e printf( ).
Em um programa podem ser usadas vrias funes. Em C no permitido definir uma funo dentro da outra e todas as funes so visveis por todas as outras.
8.5 Tipos de Funes:
O tipo de uma funo determinado pelo tipo de valor que ela retoma e no pelo tipo de seus argumentos. Uma funo do tipo inteiro quando ela retoma um inteiro. Se uma funo for do tipo no inteira ela deve ser declarada. Se o tipo for omitido o compilador assume por default que a funo do tipo int. Uma funo que retorna um char ou no retorna nada pode ser considerada como inteira. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 58
8.5.1 - Funes do Tipo void:
O comit de padronizao da linguagem do American National Standard Institute (ANSI), em suas propostas, batizou funes que no retornam nada com sendo do tipo: void.
8.5.2 Funes Simples:
Funes simples so executadas e no devolvem nenhum valor ao programa principal que a chamou. O exemplo a seguir utiliza uma funo bem simples. Ele cria uma funo que imprime 20 caracteres slidos em uma linha:
#include <stdio.h> #include <conio.h>
// Funcao linha(). // Desenha uma linha solida com 20 caracteres na tela.
void linha() { int j;
for(j=1; j<=20; j++) printf("\xDB");
printf("\n"); }
void main() { clrscr();
linha(); printf("\xDB Um Programa em C \xDB\n"); linha(); }
Exemplo 8.1 - Envolve um texto por uma moldura.
8.5.3 Funes que Retornam um Valor:
uma aplicao um pouco mais complicada de funo, porque esta retorna um valor a funo principal que a chamou. Um exemplo j utilizado: a funo getche( ), devolve o valor do primeiro caractere pressionado no teclado. Neste caso a funo geralmente chamada dentro de uma expresso aritmtica, por exemplo:
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 59
minusculo() { . . }
void main() { . ch = minusculo(); . }
Exemplo 8.2 Funo que retorna um valor.
8.6 O Comando return( ):
O comando return( ) tem dois usos importantes: no primeiro, o comando pode ser usado para devolver um valor a retornar, imediatamente, para a prxima instruo do cdigo de chamada. No segundo, ele pode ser usado, sem os parnteses, para causar uma sada imediata da funo na qual ele se encontra, ou seja, o return far com que a execuo do programa volte para o cdigo de chamada assim que o computador encontrar esse comando, o que ocorre, em geral, antes da ltima instruo da funo.
Como mostra o exemplo 8.3, o programador poder colocar mais de um comando return( ) em suas funes.
#include <stdio.h> #include <conio.h>
minutos() // Funo que l e converte horas em minutos. { int hora, min; scanf("%d:%d", &hora, &min); return(hora*60+min); }
void main() { int mins1, mins2; clrscr(); printf("Digite a primeira hora (hora:min): "); mins1 = minutos(); printf("Digite a segunda hora (hora:min): "); mins2 = minutos(); printf("A diferenca e de %d minutos.", mins2-mins1); }
Exemplo 8.3 Clculo da diferena entre dois tempos.
Limitao do comando return( ): pode retornar somente um nico valor funo que chama.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 60
9.0 Estruturas e Unies:
9.1 Estruturas:
Uma estrutura em C o nome de uma coleo de variveis relacionadas. Para criar uma estrutura, necessrio primeiro definir uma estrutura e, ento, declarar variveis daquele tipo.
A estrutura composta por trs partes: a palavra reservada struct, que diz ao compilador que voc est definindo uma estrutura; o nome da estrutura (opcional), que identifica a estrutura criada e os membros da estrutura, que esto entre as chaves. A definio associa a srie de membros ao nome da estrutura, mas no diz ao compilador para criar a varivel.
Para que seja possvel utilizar a estrutura, necessrio declarar variveis do tipo da estrutura criada, como mostra o exemplo a seguir:
struct registro { char nome[20]; int idade; float salario; char fone[15]; } cadastro;
Exemplo 9.1 Declarao de uma estrutura.
O nome de identificao da estrutura registro. Para que seja possvel utilizar a estrutura registro, declarada uma varivel chamada cadastro, que acessa todos os membros da estrutura registro.
Para acessar um membro especfico de uma estrutura, utilizado o operador ponto (.). Por exemplo, o comando cadastro.idade = 27; atribui o valor 27 ao membro da estrutura cadastro chamado idade. Caso seja necessrio incluir novos membros uma estrutura, basta adiciona-los na declarao da estrutura.
possvel declarar estruturas e posteriormente declarar variveis do tipo da estrutura criada. O exemplo a seguir ilustra o uso de estruturas.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 61 #include <stdio.h>
void main() { struct { int a; int b; } x, y;
x.a = 10; x.b = 5; y = x;
printf(\nO valor de x.a e: %d, x.a); printf(\nO valor de x.b e: %d, x.b); printf(\nO valor de y.a e: %d, y.a); printf(\nO valor de y.b e: %d, y.b); } Exemplo 9.2 Uso de estrutura.
O prximo exemplo utiliza uma estrutura para receber informaes sobre carros.
#include <stdio.h> #include <conio.h>
struct carro { char fabricante[15]; char modelo[15]; char chassi[10]; int ano; long int km; float preco; } meucarro;
void main() { puts(Informe o fabricante do carro:); gets(meucarro.fabricante); puts(Informe o modelo do carro:); gets(meucarro.modelo); puts(Informe o numero de chassi:); gets(meucarro.chassi); puts(Informe o ano do carro:); scanf(%d, &meucarro.ano); puts(Informe a quilometragem atual:); scanf(%ld, &meucarro.km); puts(Informe o preo de compra.); scanf(%f, &meucarro.preco); getchar(); // Esvazia o buffer do teclado.
printf(\nUm %s %s %d com chassi #: %s\n, meucarro.fabricante, meucarro.modelo, meucarro.ano, meucarro.chassi); printf(atualmente tem %ld Kms e foi comprado por %.2f\n, meucarro.km, meucarro.preco); }
Exemplo 9.3 Cadastro de informaes sobre carros usando estrutura.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 62
No prximo exemplo so declaradas duas estruturas, fora do programa principal. possvel declarar uma estrutura dentro de outra. Neste caso, os membros so acessados de acordo com a ordem das estruturas.
Exemplo 9.4 Cadastro de funcionrios usando estrutura.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 63
9.2 Unies:
Unies so casos particulares de Estruturas, que permitem armazenar valores de diferentes tipos, mas apenas um valor pode ocupar a varivel em um determinado momento. Cada membro de uma unio disputa uma mesma posio de memria, fazendo com que apenas um membro por vez possa ser utilizado.
O exemplo a seguir define uma unio chamada keys que pode armazenar um valor do tipo int, float ou char. O programa cria uma varivel unio chamada key.
#include <stdio.h> #include <conio.h>
void main() { union keys { int ikey; float fkey; char ckey; } key;
clrscr();
key.ikey = 7; printf(Valor atual da uniao = %d\n, key.ikey);
key.fey = 88.2; printf(Valor atual da uniao = %f\n, key.fkey);
key.ckey = A; printf(Valor atual da uniao = %c\n, key.ckey); }
Exemplo 9.5 Programa que utiliza uma unio para escrever valores.
Como uma unio pode armazenar apenas um valor por vez, o compilador no aloca espao de armazenamento para cada entrada. Contudo ele prov espao para o maior elemento da unio.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 64
O prximo exemplo ilustra a quantidade de memria alocada para uma estrutura e para uma unio. Para isso utilizado o operador sizeof, que retorna o tamanho em bytes da expresso entre parnteses.
union u_entry { int ivalue; float fvalue; // Ocupa 4 bytes (maior membro). char cvalue; }
clrscr();
printf(\nTamanho da estrutura = %d bytes\n, sizeof(struct s_entry)); printf(\nTamanho da uniao = %d bytes\n, sizeof(union u_entry)); }
Exemplo 9.6 Alocao de memria para estruturas e unies.
Os membros da estrutura requerem 7 bytes da memria. O compilador, contudo, alinha os membros em endereos mltiplos do tamanho de uma palavra (por definio), o que resulta em 8 bytes.
Como pode ser observado, apesar de unies e estruturas serem semelhantes no formato, comportam-se de maneira diferente. Unies ocupam menos espao na memria.
10.0 Ponteiros:
O formatador de tipo, int, especifica variveis do tipo inteiro, o float do tipo ponto flutuante, o char do tipo caractere, etc. Um ponteiro uma varivel que contm um endereo de memria, ou seja, o endereo de uma outra varivel na memria.
Se uma varivel contiver o endereo de uma outra varivel, pode-se dizer que uma aponta para a outra, conforme ilustra a figura a seguir.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 65
Figura 10.1 Um ponteiro aponta para o endereo de memria de uma varivel.
- Sintaxe:
tipo_do_ponteiro *nome_da_varivel;
A declarao de um ponteiro deve especificar o nome da varivel ponteiro precedida por um asterisco, e o tipo de valor que contm.
o asterisco (*) que faz o compilador saber que aquela varivel no vai guardar um valor mas sim um endereo para aquele tipo especificado.
O exemplo a seguir declara uma varivel do tipo int e um ponteiro para um valor tipo int. Ele atribui o endereo da varivel cont ao ponteiro ptr e, ento, exibe o valor e o endereo de cont, seguido pelo valor do ponteiro.
#include <stdio.h>
void main() { int cont = 1; int *ptr;
ptr = &cont;
printf(\nValor de cont = %d\tEndereco de cont = %X\n, cont, &cont); printf(\nValor de ptr = %04X, ptr); }
Exemplo 10.1 Utilizao de um ponteiro.
O operador de endereo (&) retorna a localizao de cont na memria. No programa, o comando ptr = &cont; atribui varivel ponteiro ptr o endereo da varivel cont.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 66
Usando o operador de indireo (*), o comando seguinte exibe o valor de cont, isto , o valor contido na localizao de memria para a qual ptr est apontando.
A expresso *ptr, refere-se ao valor da localizao de memria contido na varivel ponteiro. Em contrapartida, ptr refere-se ao endereo da varivel. Considerando o exemplo 10.1, tem-se:
*ptr 1 (valor da localizao de memria contido na varivel ponteiro) ptr 0DF6 (endereo da varivel contido na varivel ponteiro)
A seguir so mostrados outros exemplos utilizando ponteiros.
#include <stdio.h>
void main() { int num, valor; int *p;
num = 55; p = # // Pega o endereo de num. valor = *p; // Valor igualado a num de uma maneira indireta.
printf("\n\n%d\n", valor); printf("Endereco para onde o ponteiro aponta: %p\n", p); printf("Valor da variavel apontada: %d\n", *p); }
Exemplo 10.2 Iguala variveis usando um ponteiro.
#include <stdio.h>
void main() { int num,*p; num = 55;
p = # // Pega o endereo de num. printf("\nValor inicial: %d\n", num);
*p = 100; // Muda o valor de num de uma maneira indireta. printf("\nValor final: %d\n", num); }
Exemplo 10.3 Altera o valor de uma varivel usando um ponteiro.
No exemplo 10.2, o cdigo %p usado na funo printf( ) indica funo que ela deve exibir um endereo.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 67
10.1 Aritmtica com Ponteiros:
Podemos fazer algumas operaes aritmticas com ponteiros. A primeira, e mais simples, igualar dois ponteiros. Se temos dois ponteiros p1 e p2 podemos igual-los fazendo:
p1 = p2;
Repare que estamos fazendo com que p1 aponte para o mesmo lugar que p2. Se quisermos que a varivel apontada por p1 tenha o mesmo contedo da varivel apontada por p2 devemos fazer:
*p1 = *p2;
possvel tambm usar os operadores de incremento e decremento. Quando incrementamos um ponteiro ele passa a apontar para o prximo valor do mesmo tipo para o qual o ponteiro aponta. Isto , se temos um ponteiro para um inteiro e o incrementamos ele passa a apontar para o prximo inteiro.
Esta mais uma razo pela qual o compilador precisa saber o tipo de um ponteiro: se voc incrementa um ponteiro int* ele anda 2 bytes na memria e se voc incrementa um ponteiro double* ele anda 8 bytes na memria. O decremento funciona de maneira semelhante. Supondo que p um ponteiro, as operaes so escritas como:
p++; // Incremento. p--; // Decremento.
Estas operaes so realizadas com os endereos e no com o contedo das variveis para as quais eles apontam. Por exemplo, para incrementar o contedo da varivel apontada pelo ponteiro p, faz-se:
(*p)++;
Outras operaes aritmticas teis so a soma e subtrao de inteiros com ponteiros. Para incrementar um ponteiro de 15, basta fazer:
p = p + 15;
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 68
Para usar o contedo do ponteiro 15 posies adiante:
*(p + 15);
A subtrao funciona da mesma maneira. Tambm podemos saber se dois ponteiros so iguais ou diferentes atravs dos operadores relacionais (== e !=). No caso de operaes do tipo >, <, >= e <= estamos comparando qual ponteiro aponta para uma posio mais alta na memria. Ento uma comparao entre ponteiros pode revelar qual dos dois est "mais adiante" na memria. A comparao entre dois ponteiros se escreve como a comparao entre outras duas variveis quaisquer:
p1 > p2;
H entretanto operaes que no se pode efetuar com um ponteiro, como por exemplo, a diviso ou multiplicao e adio ou subtrao de ponteiros do tipo float ou double.
11.0 Leitura e Escrita em Disco:
Um arquivo uma coleo de bytes armazenados permanentemente em algum dispositivo de memria secundria, como disquete, winchester, cd-rom, etc.
Todo arquivo contm um nico nome, atravs do qual o referenciamos. Consiste em um conjunto de componentes arranjados em forma de sequncia, onde cada elemento s pode ser acessado aps a leitura sucessiva de todos os elementos anteriores, a partir do primeiro. Uma sequncia um arranjo (vetor) de elementos de forma que eles mantenham entre si uma relao de posio. Todo arquivo tem uma marca especial para indicar o seu fim. (Fim de Arquivo - EOF).
Para acessar um arquivo, o programa deve usar um ponteiro de arquivo, o qual conceitualmente similar a um indicador de posio. Quando voc l ou escreve no arquivo, este ponteiro contm a trilha da posio atual do arquivo. Deve ser usado um ponteiro para cada arquivo.
Para declarar um ponteiro de arquivo, necessrio incluir a biblioteca stdio.h e criar uma varivel do tipo FILE.
- Sintaxe:
FILE *ponteiro_de_arquivo;
ponteiro_de_arquivo o nome do ponteiro que passar a ser um ponteiro de arquivo, que ser usado para acessar um arquivo.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 69
Para abrir ou criar um arquivo, necessrio usar a funo fopen( ). Esta funo, alm de abrir ou criar um arquivo, retorna um ponteiro de arquivo. Se no puder criar ou abrir o arquivo como especificado, fopen( ) retorna o ponteiro NULL (nulo).
ponteiro_de_arquivo uma varivel do tipo FILE, criada como foi descrito anteriormente (FILE *ponteiro_de_arquivo), a qual o comando fopen( ) atribui um ponteiro para o arquivo aberto. O argumento nome_do_arquivo especifica o nome de um arquivo a ser aberto ou criado, e pode conter um drive de disco especificado, assim como um nome completo de arquivo, que varia de acordo com o sistema operacional utilizado. O segundo argumento, modo, especifica como o programa precisa acessar o arquivo.
A tabela a seguir especifica os modos que podem ser usados para abrir ou criar um arquivo:
Modo Significado "r" Abre um arquivo para leitura. Se o arquivo no existir, fopen( ) retorna o ponteiro NULL. "w" Cria um arquivo para escrita. Se o arquivo j existe, ser sobrescrito, se no existir, fopen( ) o criar. "a" Acrescenta dados no fim do arquivo ("append"). Se o arquivo no existir fopen( ) o criar. "rb" Abre um arquivo binrio para leitura. "wb" Cria um arquivo binrio para escrita. "ab" Acrescenta dados binrios no fim do arquivo. "r+" Abre um arquivo para leitura e escrita. "w+" Cria um arquivo para leitura e escrita. "a+" Acrescenta dados ou cria uma arquivo para leitura e escrita. "r+b" Abre um arquivo binrio para leitura e escrita. "w+b" Cria um arquivo binrio para leitura e escrita. "a+b" Acrescenta dados ou cria um arquivo binrio para leitura e escrita. "rt" Abre um arquivo texto para leitura. "wt" Cria um arquivo texto para escrita. "at" Acrescenta dados no fim do arquivo texto. "r+t" Abre um arquivo texto para leitura e escrita. "w+t" Cria um arquivo texto para leitura e escrita. "a+t" Acrescenta dados ou cria uma arquivo texto para leitura e escrita. Tabela 11.1 Modos de operaes com arquivos.
O programa a seguir cria um arquivo simples chamado TESTE.TXT e grava uma frase no mesmo:
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 70
#include <stdio.h> #include <conio.h>
void main() { clrscr();
FILE *fp;
if((fp = fopen(TESTE.TXT, W)) == NULL) printf(\nErro na criacao do arquivo TESTE.TXT\n); else { printf(Arquivo criado com sucesso); fclose( ); } }
Exemplo 11.1 Criao de arquivo.
Como pode ser observado, a chamada a fopen( ) especifica o nome do arquivo e o modo de acesso de gravao. Devido aos parnteses, o comando if primeiramente atribui o ponteiro de arquivo devolvido por fopen( ) varivel fp e, ento compara o valor de fp com NULL. Se no for possvel abrir o arquivo como especificado, fopen( ) retorna NULL.
Os arquivos que forem utilizados dentro do programa, devem ser fechados antes de terminar o programa, ou quando seu uso j no for mais necessrio. Para isso utilizado o comando fclose( ). Quando um arquivo fechado, o sistema operacional atualiza a entrada de diretrio para aquele arquivo.
11.1 Macros putc( ), getc( ), feof( ):
C disponibiliza estas macros como um complemento para a manipulao de arquivos. A macro putc( ) escreve um caractere no arquivo.
- Sintaxe:
putc(caractere, ponteiro_de_arquivo);
A macro getc( ) retorna um caractere lido do arquivo.
- Sintaxe:
char varivel = getc(ponteiro_de_arquivo);
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 71
EOF ("End Of File") indica o fim de um arquivo. s vezes, necessrio verificar se um arquivo chegou ao fim. A macro feof( ) retorna um valor diferente de zero se o arquivo chegou ao EOF, caso contrrio retorna zero.
- Sintaxe:
feof(ponteiro_de_arquivo);
A seguir ser apresentado um programa onde vrias operaes com arquivos so realizadas. Primeiro o arquivo aberto para a escrita, e escreve-se algo nele. Em seguida, o arquivo fechado e novamente aberto para a leitura.
// Abre novamente para a leitura e fecha. p = fopen(str,"r"); while(!feof(p)) { c = getc(p); printf("%c", c); } fclose(p); }
Exemplo 11.2 Gravao e leitura em arquivo utilizando macros.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 72
11.2 - Comandos de Acesso a Arquivos:
11.2.1 ferror( ):
A funo ferror( ) se torna muito til quando se quer verificar se cada acesso a um arquivo teve sucesso. Cada vez que uma funo de arquivo executada, a prpria funo registra em uma varivel especial se houve sucesso na operao ou no. Com ferror( ) podemos ter acesso ao contedo desta varivel: ela retorna um valor diferente de zero se houve algum erro na ltima funo de acesso ao arquivo. Sintaxe:
int ferror(ponteiro_de_arquivo);
11.2.2 rewind( ):
A funo rewind( ) retorna a posio corrente do arquivo para o incio. Sintaxe:
void rewind(ponteiro_de_arquivo);
11.2.3 getw( ):
A funo getw( ) l um inteiro de um arquivo. Sintaxe:
int getw(ponteiro_de_arquivo);
11.2.4 putw( ):
A funo putw( ) escreve um inteiro em um arquivo. Sintaxe:
int putw(int varivel, ponteiro_de_arquivo);
11.2.5 fgets( ):
A funo fgets( ) l uma string de um arquivo. A string lida deve ter seu tamanho determinado pelo programador. Sintaxe:
char *fgets (char *string, int tamanho, ponteiro_de_arquivo );
11.2.6 fputs( ):
A funo fputs( ) escreve uma string em um arquivo. Sintaxe:
char *fputs (char *string, ponteiro_de_arquivo);
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 73 11.2.7 fread( ):
A funo fread( ) l blocos de dados em um arquivo. Sintaxe:
unsigned fread(void *buffer, int numero_de_bytes, int cont, ponteiro_de_arquivo);
O buffer a regio de memria na qual sero armazenados os dados lidos. O nmero_de_bytes o tamanho da unidade a ser lida. O contador cont indica quantas unidades devem ser lidas. Isto significa que o nmero total de bytes lidos :
Nmero_de_bytes * cont
A funo retorna o nmero de unidades efetivamente lidas. Este nmero pode ser menor que o valor requisitado quando o fim do arquivo for encontrado.
11.2.8 fwrite( ):
A funo fwrite( ) escreve blocos de dados em um arquivo e funciona da mesma maneira que fread( ). Sintaxe:
unsigned fwrite(void *buffer, int numero_de_bytes, int cont, ponteiro_de_arquivo );
11.2.9 fseek( ):
Para se fazer procuras e acessos randmicos usa-se a funo fseek( ). Esta move o cursor no arquivo de um valor especificado, a partir de um ponto especificado. Sintaxe:
int fseek(ponteiro_de_arquivo, long nmero_de_bytes, parmetro_de_origem);
O parmetro_de_origem determina a partir de onde que os bytes de movimentao sero contados. Os valores possveis so definidos por macros no arquivo cabealho e so mostrados na tabela a seguir:
Nome Valor Significado SEEK_SET 0 Deslocamento dede o incio do arquivo. SEEK_CUR 1 Deslocamento a partir da posio atual no arquivo. SEEK_END 2 Deslocamento a partir do final do arquivo. Tabela 11.2 Parmetros da funo fseek( ).
Tendo-se definido a partir de onde ir se contar, nmero_de_bytes determina quantos bytes de deslocamento ser dado na posio atual.
11.2.10 remove( ):
A funo remove( ) apaga um arquivo especificado. Sintaxe:
int remove (char *nome_do_arquivo); Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 74 O exemplo 11.2 poderia ser reescrito usando-se, fgets( ) e fputs( ) ou fread( ) e fwrite( ). A seguir ser apresentado uma segunda verso que usa as funes fgets( ) e fputs( ), alm de acrescentar algumas inovaes.
// Se no houve erro, escreve no arquivo e fecha. fputs(frase, p); fputs(str, p);
// E se o seu disco estiver muito cheio. if (ferror(p)) printf("\nErro! Impossvel gravar o arquivo!\n"); fclose(p);
strcat(frase, str);
// Abre novamente para a leitura e fecha. p = fopen(str, "r"); fgets(resposta, strlen(frase)+1, p); printf("\n\n%s\n", resposta); fclose(p); remove(str); }
Exemplo 11.3 Gravao e leitura em arquivo.
11.3 Funes fprintf( ) e fscanf( ):
O fluxo padro em arquivos, permite ao programador ler e escrever em arquivos da maneira padro com a qual o programador j lia e escrevia na tela.
11.3.1 fprintf( ):
A funo fprintf( ) funciona como a funo printf( ). A diferena que a sada de fprintf( ) um arquivo e no a tela do computador.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 75
- Sintaxe:
fprintf (ponteiro_do_arquivo, char *string);
A nica diferena entre fprintf( ) e o printf( ) a especificao do arquivo destino atravs do ponteiro de arquivo.
11.3.2 fscanf( ):
A funo fscanf( ) funciona como a funo scanf( ). A diferena que fscanf( ) l de um arquivo e no da tela do computador.
- Sintaxe:
fscanf (ponteiro_do_arquivo, char *string);
A nica diferena entre fscanf( ) e o scanf( ) a especificao do arquivo destino atravs do ponteiro de arquivo. O prximo exemplo utiliza fprintf( ) e fscanf( ) para manipular um arquivo.
#include <stdio.h> #include <stdlib.h>
void main() { FILE *p; char str[80],c;
// L um nome para o arquivo a ser aberto. printf("\n\nEntre com um nome para o arquivo: "); gets(str);
// Se no houver erro, escreve no arquivo e fecha. fprintf(p,"Este e um arquivo chamado: %s\n", str); fclose(p);
// Abre novamente para a leitura e fecha. p = fopen(str,"r"); while(!feof(p)) { fscanf(p, "%c", &c); printf("%c", c); } fclose(p); } Exemplo 11.4 Gravao e leitura em arquivo.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 76
III PROJETOS UTILIZANDO A INTERFACE PARALELA
1.0 Introduo:
A porta paralela a interface mais usada hoje em projetos que envolvam o computador. Ela chamada de paralela porque os dados passam do computador para a impressora ao longo de condutores paralelos, ou seja, todos os oito bits de dados viajam juntos.
A vantagem das conexes paralelas que com oito vias para transportar dados simultaneamente, as informaes podem fluir rapidamente do computador para a impressora ou qualquer outro dispositivo.
Embora na maioria das vezes a porta paralela seja usada para conexo com a impressora, ela tambm pode ser usada para aceitar dados de dispositivos externos, viabilizando sua utilizao para diferentes tipos de aplicaes, como por exemplo, controle de motores de passo, interligao entre computadores, aquisio de dados, etc.
Um dos principais motivos para a utilizao irrestrita desta porta so as limitaes de distncia das linhas paralelas. Como as linhas de dados so paralelas, h mais chance de interferncia, acarretando erros de dados medida que o comprimento do cabo aumenta. A comunicao paralela boa para distncias de no mximo 3,7 m (12 ps). Para linhas mais longas deve ser utilizada a porta serial.
A porta paralela disponibiliza de modo simultneo 8 bits de sada, 5 bits de entrada e 4 bits bidirecionais. Basicamente ela composta por 8 linhas de dados, 5 linhas de status e 4 linhas de controle. Ela encontrada normalmente no painel traseiro do PC em conectores fmea tipo D de 25 pinos (DB-25).
Antes de 1994, no existiam padronizaes de como a Porta Paralela deveria ser conectada aos dispositivos como por exemplo impressoras, scanner, CD-ROM, drives, etc. Alguns utilizavam os chips TTL enquanto outros o CMOS. O padro IEEE 1284- 1994 definiu ento cinco modos de operao para esta porta:
Compatvel: o mais conhecido, podendo somente enviar dados (computador dispositivo externo) na velocidade tpica de 50 Bps;
Nibble: permite a recepo de 4 bits;
Byte: trabalha com a recepo de 8 bits;
EPP (Enhanced Parallel Port) e ECP (Extended Capabilities Mode): utilizam hardwares adicionais para gerar e gerenciar operaes tipo handshaking.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 77
2.0 Pinagem:
Abaixo est a disposio dos pinos no conector DB-25:
Figura 2.1 DB-25 fmea.
A direo das informaes para o padro SPP est descrita abaixo:
Figura 2.2 Direo dos Dados.
3.0 Registradores:
No PC, o usurio tem disponvel (em termos lgicos), 3 portas paralelas denominadas LPT1, LPT2 e LPT3, mas fisicamente s existe uma conexo externa atravs do conector DB-25 fmea.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 78
Os pinos da porta paralela so acessados atravs dos registradores de Dados, Status e Controle. Para cada registrador associado pela BIOS, um endereo, conforme mostrado abaixo:
Porta Paralela Dados Status Controle LPT1 378h 379h 37Ah LPT2 278h 279h 27Ah LPT3 3BCh 3BDh 3BEh Tabela 3.1 Endereo dos Registradores.
O endereo 3BCh era utilizado em uma placa antiga padro IBM, o qual oferecia um adaptador monocromtico e uma porta paralela. Esta placa era chamada de Monochrome Display and Printer Adapter (MD&PA). Ainda hoje alguns computadores fabricados pela IBM utilizam este endereo como base para a LPT1.
Quando a BIOS est inicializando o sistema, ela associa as LPTs aos endereos base de I/O. Existe uma lista ordenada na seguinte ordem: 3BCh 378h 278h. Na maioria dos PCs, a LPT1 associada ao endereo base 378h. Posteriormente ser apresentado um programa em C para verificar a existncia e o endereo base da porta paralela no PC.
3.1 Registrador de Dados:
O Registrador de Dados est associado ao endereo base (378h), sendo utilizado como sada de 8 bits, a qual poder ser efetuada uma escrita usando uma instruo OUT ou uma leitura usando uma instruo IN. Os bits deste registrador esto associados aos seguintes pinos do conector:
Esses pinos so capazes de drenar de 2,6 a 24mA. Escrever 1 em um bit resulta em um nvel TTL alto na sada. Deve-se ressaltar que no padro SPP esse registrador no pode funcionar como entrada de dados, j que o dado lido a sada de um latch 74LS373.
3.2 Registrador de Status:
O Registrado de Status est associado ao endereo base + 1 (379h), sendo utilizado como uma entrada de 5 bits. Uma leitura no endereo 379h, com uma instruo IN, reflete o estado imediato desses pinos. Os bits deste registrador esto associados aos seguintes pinos do conector:
Bits 7 6 5 4 3 2 1 0 Pinos 11 (L) 10 12 13 15 - - - Tabela 3.3 Pinos associados ao Registrador de Status. (L) Indica que a entrada invertida. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 79
O pino 10 (bit 6) pode ser usado para provocar a interrupo IRQ7 (INTFh no DOS). Ela acontecer quando, neste pino, houver uma transio de nvel baixo ( ) para nvel alto ( ), condicionado ao bit 4 do Registrador de Controle (37Ah), que deve estar em nvel alto (nvel lgico 1).
3.3 Registrador de Controle:
O Registrador de Controle geralmente associado ao endereo base + 2 (37Ah), sendo considerado uma porta bidirecional de 4 bits. Como colocado anteriormente, o bit 4 usado para controlar a habilitao da IRQ 7. Quando este bit colocado em nvel alto a interrupo poder ocorrer. Estas sadas so a coletor aberto, o que lhes permite trabalhar tanto como entrada quanto sada. Elas esto conectadas a Vcc por resistores de 4,7 K e podem receber at 7mA e ainda manter um bom nvel baixo de TTL (menor que 0,8 V). Esta porta, quando trabalha como sada apresenta um retardo nas transies de nvel baixo para nvel alto, pois toda carga feita atravs do pull up de 4,7 K. Sempre que possvel, mais conveniente usar essa porta como entrada. A tabela a seguir mostra a relao entre os bits da porta e os pinos do conector:
Bits 7 6 5 4 3 2 1 0 Pinos - - - IRQ7 17 (L) 16 14 (L) 1 (L) Tabela 3.4 Pinos associados ao Registrador de Controle. (L) Indica que a entrada invertida.
3.4 Quadro Resumo:
Registrador BIT Direo Pinos Nome 7 OUT 09 D7 6 OUT 08 D6 5 OUT 07 D5 4 OUT 06 D4 3 OUT 05 D3 2 OUT 04 D2 1 OUT 03 D1 3 7 8 h 0 OUT 02 D0 7 IN 11 (L) Busy 6 IN 10 Acknowledge 5 IN 12 Paper End 4 IN 13 Select Out 3 7 9 h 3 IN 15 Error 4 - IRQ 7 - 3 IN / OUT 17 (L) Select In 2 IN / OUT 16 Init 1 IN / OUT 14 (L) Auto Feed 3 7 A h 0 IN / OUT 01 (L) Strobe Tabela 3.5 Quadro Resumo dos Registradores. (L) Indica que a entrada invertida.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 80
4.0 Propriedades de Hardware:
O padro IEEE 1284 especifica 3 tipos de conectores utilizveis em portas paralelas:
Tipo A: conector de 25 pinos tipo Delta, localizado nos computadores; Tipo B: conector Centronics de 36 pinos localizados nas impressoras; Tipo C: semelhante ao Centronics, porm de menor tamanho.
Na maioria dos PCs a interface paralela acessada atravs de um conector tipo D de 25 pinos. A tabela a seguir mostra quais so os sinais associados a cada pino, dos dois tipos de conectores mais usados:
DB-25 Centronics Sinal 1 1 Strobe (L) 2 2 D0 3 3 D1 4 4 D2 5 5 D3 6 6 D4 7 7 D5 8 8 D6 9 9 D7 10 10 Acknowledge 11 11 Busy 12 12 Paper End 13 13 Select Out 14 14 Auto Feed (L) 15 32 Error (L) 16 31 Init 17 36 Select In (L) 18-25 19-30 GND Tabela 4.1 Associao de pinos DB-25 e Centronics. (L) Indica que a entrada invertida.
5.0 Padres Existentes:
Existem atualmente 3 padres de porta existentes:
Porta Paralela Padro Standard Parallel Port ou SPP; Porta padro PS/2; Porta Paralela Estendida Enhaced Parallel Port ou EPP.
A seguir veremos algumas caractersticas desses padres.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 81
5.1 Porta Paralela Padro SPP:
o padro mais antigo do mercado, sendo desenvolvido para comunicao entre PC e impressora da Centronics. Por isso tambm conhecido como porta Centronics.
Inicialmente o conector utilizado era de 36 pinos, mas a IBM imps o conector Delta de 25 pinos, o qual atualmente utilizado. o protocolo usado na comunicao PC Impressora, sendo unidirecional.
5.2 Padro PS/2:
Este padro foi desenvolvido pela IBM para tornar a porta paralela um dispositivo de comunicao bidirecional. Foi utilizada nos PC ATs, sendo porm oficializada somente com o PS/2. A IBM no alterou a definio de sinais e pinagens, sendo portanto compatvel com a porta padro. A transferncia de dados feita utilizando o DMA (Direct Memory Access). Consequentemente, aumentou a velocidade de transferncia de dados.
5.3 Porta Paralela Estendida EPP:
Este padro foi originalmente desenvolvido por uma associao das seguintes empresas: Zenith, Xircom e Intel, sendo apresentado em maro de 1992. Ele foi utilizado pela primeira vez nos 386 SL da Zenith. um padro compatvel com o da porta padro.
Dois bits do registrador de controle definem o modo de operao da porta EPP como porta padro ou como porta estendida:
BIT 7 BIT 6 1 0 1 0 Modo estendido Porta padro Bidirecional Unidirecional Tabela 5.1 Modos de operao da porta EPP.
A EPP utiliza o mesmo conector de 25 pinos, porm a quantidade de registradores de I/O associados maior: 8. Quando est trabalhando no modo estendido, somente 8 linhas de dados e 5 sinais de controle so efetivamente utilizados.
Para suportar altas velocidades, foi necessrio especificar um cabo especial, com as seguintes caractersticas:
Comprimento mximo de 2 metros; Velocidade suportada: 2 a 8 Mbps; Empacotamento com capa dupla dividido em duas regies. Na primeira, denominada central, so colocados as vias de transmisso de dados e na segunda, denominada perifrica, so colocadas as vias de controle.
A HP e a Microsoft trabalham desde 1992 numa verso mais evoluda da EPP denominada Extended Capabilities Port (ECP). Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 82
A primeira verso foi publicada em novembro de 1992. Ela trabalha com um protocolo mais sofisticado com os seguintes atributos: negociao de velocidade, verificao de taxa de erro e modo comprimido de transmisso.
6.0 Porta Paralela para Impressora:
A figura 3 apresenta os sinais trocados entre um PC e uma impressora utilizando a porta paralela padro.
Figura 6.1 Comunicao entre o PC e a Impressora.
6.1 Descrio dos Sinais:
A seguir faremos uma descrio dos sinais trocados entre esses dispositivos.
D0-D7: so os 8 bits de dados em cdigo ASCII. Strobe: pulso, em nvel baixo, que informa impressora que h dado vlido no barramento de dados. Sua largura deve ser maior que 0,5 s. Acknowledge: pulso em nvel baixo que indica que a impressora que j recebeu o dado e est pronta para receber o prximo. Tem uma durao tpica de 11 s. Busy: indica que a impressora est ocupada e no pode receber dados. Paper End: indica que a impressora est sem papel.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 83
Select: indica ao computador que a impressora est selecionada, ou seja, est pronta para receber os dados. Se no estiver em nvel alto a porta paralela no transmite dados. Auto-Feed: muda de linha aps cada impresso. Error: indica que houve erro na impressora. Init: inicializa a impressora. Ela vai para o estado em que estaria aps sua energizao. Seu buffer de impresso apagado. O pulso de inicializao deve ter uma durao maior que 50 s. Select In: est normalmente em nvel baixo. uma maneira do computador controlar se a impressora est pronta para aceitar dados.
6.2 Protocolo Utilizado:
A transferncia de dados computador impressora segue um protocolo tipo handshake assncrono de 3 linhas de controle (Strobe, Acknowledge e Busy) e 8 linhas de dados (D0 a D7). Descrevemos a seguir os passos seguidos na execuo do protocolo:
A linha Busy quando ativada indica que a impressora est ocupada. Se Busy = 0 a impressora estar pronta e o computador coloca o dado no barramento.
Quando este sinal estabiliza, o computador envia um pulso de Strobe (h dado disponvel) para impressora.
A impressora l o dado e envia a confirmao via Acknowledge.
O computador s pode alterar o dado se receber um Acknowledge .
Se, aps o recebimento de um Acknowledge, a linha Busy estiver em nvel zero o computador envia o prximo dado e repete o ciclo.
7.0 Programando a Porta Paralela:
Como mencionado anteriormente no Item 3.0, a BIOS associa cada porta LPT a um endereo na ordem 3BCh 378h 278h. Uma vez associados estes endereos, a BIOS os guarda sempre em uma posio especfica da memria, conforme mostra a tabela abaixo:
Endereo da Memria Porta 0000:0408 Endereo base da porta LPT1 0000:040A Endereo base da porta LPT2 0000:040C Endereo base da porta LPT3 Tabela 7.1 Endereo da porta paralela na BIOS.
Desta forma, o programa a seguir mostrar como verificar estas posies de memria, retornando o endereo base das portas LPTs. Se o programa retornar um 0, significa que no existe nenhum endereo associado a LPT. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 84
#include <stdio.h> #include <conio.h>
void main() { unsigned int far *ptend; // Ponteiro p/ localizar endereo da Porta. unsigned int base; // Endereo da porta. int i;
ptend = (unsigned int far *)0x00000408; // Coloca no ponteiro ptend o // contedo da posio de clrscr(); // memria 0000:0408
for(i=0; i<3; i++) { base = *ptend; if(base==0) printf(Nao existe nenhum endereco associado a LPT%d\n, i+1); else printf(O endereco associado a porta LPT%d e %Xh\n, i+1, base); *ptend++; } }
Exemplo 7.1 Endereo base da porta paralela.
7.1 - Funes inportb( ) e outportb( ):
As funes inportb( ) e outportb( ) fazem a leitura e escrita respectivamente de um byte em qualquer porta de hardware do PC. Elas pertencem a biblioteca dos.h e sua sintaxe a mostrada abaixo:
- Sintaxe da funo inportb( ):
inportb(unsigned porta);
- Sintaxe da funo outportb( ):
outportb(unsigned porta, unsigned valor);
A tabela a seguir descreve as principais funes de acesso portas em C:
Funo Descrio inport (unsigned porta) L uma palavra de uma porta de hardware inportb (unsigned porta) L um byte de uma porta de hardware outport (unsigned porta, unsigned valor) Escreve uma palavra em uma porta de hardware outport (unsigned porta, unsigned valor) Escreve um byte em uma porta de hardware Tabela 7.2 Funes de acesso portas em C.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 85
O prximo exemplo determina o endereo base do registrador de dados, l o seu contedo e depois escreve nele 255 (11111111 em binrio). Aps a escrita o programa faz uma nova leitura no registrador para confirmar se os dados foram escritos corretamente e apresenta os resultados na tela.
void main() { unsigned int far *ptend; unsigned int base, novo, velho;
ptend = (unsigned int far *)0x00000408; clrscr(); base = *ptend;
if(base==0) { printf(\n\nNao existe nenhum endereco associado a LPT1\n\n); exit(1); // Termina o programa e retorna para o prompt do DOS. }
printf(\nO endereco base do registrador de dados => %Xh\n, base); velho = inportb(base); outportb(base, 255); novo = inportb(base); printf(\nO valor inicial do registrador era => %Xh\t%dd, velho, velho); printf(\nO valor escrito no registrador foi => %Xh\t%dd\n, novo, novo); } Exemplo 7.2 Escrita e leitura na porta paralela.
8.0 - Projetos Utilizando a Interface Paralela:
8.1 Leds Monitores:
Este projeto bem simples e pode ser implementado sem problemas em qualquer PC.
8.1.1 Material Necessrio:
01 Proto-board; 08 Leds vermelhos; 08 Resistores de 220; 01 Conector DB-25 macho; Fios para conexo e um cabo com 12 vias;
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 86
8.1.2 Esquema de Ligao:
Figura 8.1 Esquema de ligao.
8.1.3 Programa:
//**************************************************************** //** ** //** LABORATRIO DE ARQUITETURA DE COMPUTADORES ** //** ========================================== ** //** ** //** PINAGEM UTILIZADA ** //** ** //** LED's PORTA PARALELA ** //** ** //** LED 01 ----------------------------- 02 - D0 ** //** LED 02 ----------------------------- 03 - D1 ** //** LED 03 ----------------------------- 04 - D2 ** //** LED 04 ----------------------------- 05 - D3 ** //** LED 05 ----------------------------- 06 - D4 ** //** LED 06 ----------------------------- 07 - D5 ** //** LED 07 ----------------------------- 08 - D6 ** //** LED 08 ----------------------------- 09 - D7 ** //** GND -------------------------------- 25 - GND ** //** ** //****************************************************************
void main() { unsigned int far *ptend; unsigned int base; int i, tempo, num_max; char n[4], t[6];
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 87
ptend = (unsigned int far *)0x00000408;
textbackground(BLUE); // Define cor de fundo azul clrscr(); // Limpa a tela e aplica o fundo azul base = *ptend;
if(base == 0) { gotoxy (5,2); textcolor(LIGHTRED+BLINK); // Texto vermelho piscante. cprintf("Nenhuma porta LPT encontrada!!!"); getch(); textbackground(BLACK); // Estas trs linhas normalizam a cor textcolor(LIGHTGRAY); // do fundo e do texto do DOS antes clrscr(); // de encerrar o programa. exit(1); }
textcolor(YELLOW); // Texto amarelo. gotoxy (5,5); cprintf("Entre com o numero maximo a ser enviado (0 a 255):"); gotoxy (56,5); gets(n); gotoxy (5,7); cprintf("Entre com tempo de retardo em milisegundos:"); gotoxy (50,7); gets(t); num_max = atoi(n); // Converte string para inteiro. tempo = atoi(t); // Converte string para inteiro.
for (i=0; i<=num_max; i++) { textcolor(LIGHTGREEN); // Texto verde claro. gotoxy(5,10); cprintf("Enviando o n %3d para o registrador %Xh da LPT1 ", i, base); outportb(base, i); // Escreve o nmero na porta. delay(tempo); // Retardo entre as escritas. }
Programa 8.1 Acende 8 leds atravs da porta paralela.
O programa utiliza a rotina de verificao dos endereos associados aos registradores da porta paralela para pegar o endereo base do Registrador de Dados. Com este endereo, o programa solicita um nmero mximo (entre 0 e 255) e um tempo de retardo em milisegundos e escreve na porta os nmeros de 0 at o nmero mximo.
A escrita pode ser observada na tela e confirmada atravs dos leds conectados porta, levando em considerao que nos leds aparecer o correspondente binrio dos nmeros decimais escritos.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 88
8.2 Display LCD:
Este projeto consiste em conectar um display de cristal lquido porta paralela. O programa l palavras ou fases do teclado e enviar para o display.
Figura 8.2 Display LCD.
8.2.1 Material Necessrio:
01 Fonte de alimentao (5 Vcc); 01 Proto-board; 01 Display LCD de 16 caracteres e uma linha; 02 Resistores de 10K; 01 Potencimetro de 10K; 01 Conector DB-25 macho; Fios para conexo e um cabo com 12 vias;
8.2.2 Esquema de Ligao:
Figura 8.3 Esquema de ligao do display LCD porta paralela.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 89
8.2.3 Caractersticas do Display LCD:
Pinagem do display de cristal lquido Hitachi:
Pino Nome Funo 1 GND GND 2 Vcc Vcc 3 Vo Controle de brilho 4 RS RS = 0 Comandos RS = 1 Dados 5 R/ W R/ W= 0 Escreve dados no display R/ W= 1 L dados do display 6 E Habilita a leitura ou escrita dos dados na transio de HL 7 DB0 Barramento de dados Bit 0 8 DB1 Barramento de dados Bit 1 9 DB2 Barramento de dados Bit 2 10 DB3 Barramento de dados Bit 3 11 DB4 Barramento de dados Bit 4 12 DB5 Barramento de dados Bit 5 13 DB6 Barramento de dados Bit 6 14 DB7 Barramento de dados Bit 7 Tabela 8.1 Pinagem do display LCD Hitachi.
O display de cristal lquido possui um microcontrolador responsvel pela execuo dos comandos e a escrita. Para que o display funcione, necessrio executar uma seqncia de comandos de inicializao que sero enviados atravs da porta paralela. Alm de inicializar o display, esta seqncia configura o modo como os caracteres sero escritos.
A tabela a seguir mostra um exemplo de seqncia de inicializao e escrita:
Instrues Seq. RS R/*W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Operao 1 0 0 0 0 1 1 1 0 0 0 Operao em uma linha. 2 0 0 0 0 0 0 1 1 1 0 Ativa o display e o cursor. 3 0 0 0 0 0 0 0 1 1 0 Incrementa o display e desloca o cursor direita. 4 1 0 0 1 0 0 1 0 0 0 Escreve a letra H 5 1 0 0 1 0 0 1 0 0 1 Escreve a letra I Tabela 8.2 Seqncia de inicializao e escrita do display.
As letras a serem enviadas so codificadas em valores binrios de 8 bits, que so compatveis com os valores binrios da tabela ASCII do PC, conforme mostra o exemplo a seguir
Letra Valor ASCII Bits A 65 0 1 0 0 0 0 0 0 1 B 66 0 1 0 0 0 0 0 1 0 C 67 0 1 0 0 0 0 0 1 1
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 90
void main() { // Declarao das variveis. unsigned int far *ptend; unsigned int base; int lcd, i, dados, tam, done; char frase[17], aux[16];
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 91
// Define o fundo azul. textbackground(BLUE); clrscr();
// Rotina para verificar os endereos dos registradores da porta // paralela. ptend = (unsigned int far *)0x00000408; base = *ptend; if(base == 0) { gotoxy (5,2); textcolor(LIGHTRED+BLINK); // Texto vermelho piscante. cprintf("Nenhuma porta LPT encontrada!!!"); getch(); textbackground(BLACK); // Estas trs linhas normalizam a cor textcolor(LIGHTGRAY); // do fundo e do texto do DOS antes clrscr(); // de encerrar o programa. exit(1); }
// Reseta os dados da porta paralela. outportb(base, 0); // 0 0 0 0 0 0 0 0 => D0-D7=0 outportb(base+2, 11); // 0 0 0 0 1 0 1 1 => RS=0, E=0
// Inicializao do display. // Linha 01 => RS=0, (1 Linha DB=48, 2 Linhas DB=52) if(lcd==1) outportb(base, 48); else outportb(base, 52); exec(base); // Chama a subrotina de execuo de comandos.
// Linha 02 => RS=0, DB=14 outportb(base, 14); // Ativa o display e o cursor. exec(base);
// Linha 03 => RS=0, DB=06 outportb(base, 6); // Incrementa o display e desloca o cursor. exec(base);
textcolor(LIGHTRED); gotoxy (11,13); cprintf("Digite uma frase (maximo 16 caractres) ou ENTER para sair");
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 92
do { // Insere 17 caracteres brancos na string da frase. for(i=0; i<=16; i++) frase[i] = 254;
textcolor(WHITE); gotoxy(24,15); cprintf(">>>>> [ ] <<<<<"); textcolor(LIGHTGREEN); gotoxy(31,15); cprintf(" "); gotoxy(31,15); gets(frase); tam = strlen(frase); // Retorna o tamanho da string.
// Muda para comando e limpa o display. outportb(base+2, 11); outportb(base, 1); exec(base);
// Normaliza as cores da tela do DOS. textbackground(BLACK); textcolor(LIGHTGRAY); clrscr(); }
Programa 8.2 Escreve no display LCD usando a porta paralela.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 93
IX PORTA SERIAL
1.0 Introduo:
A principal diferena entre as portas paralela e serial que na ltima os dados so enviados em uma nica linha em um fluxo serial (bit a bit). Os PC's atuais so configurados para receber at 4 portas seriais denominadas COM1, COM2, COM3 e COM4. Geralmente eles so equipados com 2 portas fsicas. Anteriormente, o hardware de tais portas era colocado na placas IDE (2 portas seriais e uma paralela). Atualmente este hardware instalado na placa de sistema.
O padro mais utilizado de porta serial o RS-232C, permitindo a utilizao de dois tipos de conectores: 9 e 25 pinos. O PC vem equipado com a COM1 e COM2, as quais so ligadas, respectivamente, aos conectores Delta de 9 pinos e de 25 pinos ou dois conectores Delta de 9 pinos. O conector de 9 (DB-9) pinos muito utilizado para instalao do mouse. As portas seriais so largamente utilizadas para controlar dispositivos perifricos em geral e na comunicao ponto a ponto entre PC's.
Existem dois modos de transmisso serial: assncrono e sncrono. Nas portas seriais dos PC's o modo de transmisso utilizado o assncrono.
2.0 Modos de Transmisso Serial:
O termo assncrono utilizado para justificar a aleatoriedade em que os dados so transmitidos neste modo. Ao contrrio do modo assncrono, no modo sncrono no existe interrupo dos dados transmitidos. Vale ressaltar que para os dois modos necessrio haver um sincronismo de bit (mesma taxa mdia e mesma fase) entre o transmissor e o receptor.
2.1 - Modo de Transmisso Assncrono:
Este modo , na prtica, caraterizado como transmisso de caracteres, tipo start/stop. A transmisso feita caractere a caractere. Para cada caractere adicionado um elemento de sinalizao que marca o incio (start) e o final do caractere (stop).
Este modo aceita pequenas variaes em relao frequncia nominal. O sincronismo de fase obtido utilizando-se um oscilador local operando numa frequncia n vezes superior frequncia do oscilador do transmissor. Quanto maior o valor de n, maior a preciso. Por exemplo, para n = 4 a preciso de 25% e para n = 32 a preciso de 3%.
Por conveno o bit menos significativo enviado primeiro. Os elementos bsicos de uma transmisso assncrona so:
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 94
Start Bit durao de 1 bit; Stop Bit pode assumir os seguintes valores: 1, 1.5 e 2 bits; Taxa de transmisso varia de sistema para sistema; Tamanho do caractere varia de 5 a 8 bits; Paridade par, mpar, marca (sempre 1), espao (sempre 0) e nula (no envia o bit).
2.2 - Modo de Transmisso Sncrono:
Para se transmitir um caractere no modo assncrono so necessrios vrios bits de controle, denominados overhead. Tal acrscimo de bits pode resultar, no pior caso, em um overhead de at 50%. Para melhorar esse rendimento foi desenvolvido o modo sncrono.
Equipamentos mais elaborados permitem que a transmisso seja feita sem as marcaes de caractere. Periodicamente transmitido um conjunto especial de bits para sincronizar o equipamento receptor com o transmissor. No receptor existe um mecanismo sofisticado de recuperao de relgio, a qual feita a partir da sequncia especial de bits que se repete periodicamente.
3.0 Padres de Interface Serial:
3.1 Interface RS-232C:
o padro mais antigo e popular utilizado na comunicao de dados. Ele contempla as caractersticas eltricas, mecnicas e funcionais da interface. As caractersticas bsicas deste padro so mostradas a seguir:
Figura 3.1 Driver/receiver para TTL/RS-232C.
Comunicao bidirecional; Taxa mxima de transmisso: 20 Kbps; Distncia mxima entre equipamentos: 15,24 m; A transmisso feita em +/- 12V (-12V nvel lgico 1 e +12V nvel lgico 0). Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 95 3.2 Interface RS-423:
considerada uma evoluo da RS-232C. Utilizada por usurios que demandam taxas de transmisso mais elevadas. Algumas caractersticas:
Figura 3.2 Driver/receiver para TTL/RS-423.
Comunicao bidirecional; Taxa mxima de transmisso: 100 Kbps; Distncia mxima entre equipamentos: 12,19 m; A transmisso feita em +/- 6V (+6V nvel lgico 1 e 6V nvel lgico 0).
3.3 Interface RS-422:
considerada uma evoluo da RS-423. Algumas caractersticas:
Figura 3.3 Driver/receiver para TTL/RS-422. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 96
Comunicao bidirecional; Taxa mxima de transmisso: 10 Mbps; Distncia mxima entre equipamentos: 304,8 m. A transmisso feita em +/- 6V (+6V nvel lgico 1 e 6V nvel lgico 0).
4.0 Comunicao Serial no PC:
Como colocado anteriormente, no PC esto configuradas 4 portas seriais, as quais permitem a programao dos seguintes parmetros:
Stop bit: 1, 1 e 2; Bit de paridade: par, mpar, nula, marca e espao; Tamanho do caractere: 5, 6, 7 ou 8 bits; Taxa de transmisso: 110 a 115.200 bps.
Essa programao pode ser feita atravs do comando mode no DOS, pelo painel de controle do Windows, ou via programao.
O corao da interface serial recebe o nome de UART (Universal Asynchronous Receiver/Transmiter). As funes da UART so realizadas pelo dispositivo programvel denominado 8250 (ou compatvel), o qual trabalha com vrios modos de operao.
O controle do fluxo de transmisso e recepo tambm feito pelo 8250. Ele responsvel pela insero do start/stop bit e do bit de paridade. Os dados so transmitidos pelo 8250, em seqncia, do bit menos significativo para o mais significativo, conforme mostrado na figura a seguir:
Figura 4.1 Seqncia de bits em uma transmisso serial.
Uma sada inativa fica transmitido marca (-12V). Isto serve tambm para descobrir quem sada e que entrada. Com um multmetro, medem-se as tenses nos pinos: os que estiverem em +12V so sadas, os demais so entradas, exceto o terra e os pinos desconectados. O outro nvel permitido, +12V, recebe o nome de espao. A tabela a seguir apresenta a interpretao dos sinais de marca e espao. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 97 TTL RS-232C Sinal Tenso Lgico Tenso Controle Espao 0V 0 +12V ON Marca 5V 1 -12V OFF Tabela 4.1 Interpretao dos sinais marca e espao.
Durante uma transmisso de dados, a marca (-12V) usada para caracterizar o estado binrio 1, e o espao (+12V) usado para caracterizar o estado binrio 0. Para os circuitos de controle da interface, uma funo estar em ON (ativada) quando sua tenso for +12V, e estar em OFF (desativada), quando sua tenso for 12V.
5.0 - Pinos e Sinais da Porta Serial:
Os sinais da RS-232C geralmente esto disponveis nos conectores tipo Delta macho de 9 e 25 pinos, localizados no painel traseiro do computador. A tabela a seguir mostra a relao entre os pinos e sinais em cada conector:
DB-9 DB-25 Sinal Nome Direo 01 08 CD Carrier Detect
02 03 RD Received Data
03 02 TD Transmit Data
04 20 DTR Data Terminal Ready
05 07 SG Signal Ground - 06 06 DSR Data Set Ready
07 04 RTS Request to Send
08 05 CTS Clear to Send
09 22 RI Ring Indicator
Tabela 5.1 Pinagem e direo da porta serial.
Antes de iniciarmos a descrio dos sinais apresentados na tabela acima, faz-se necessrio definir os dois principais elementos envolvidos em uma transmisso serial: o DCE e o DTE.
5.1 Definio do DCE e do DTE:
O Data Terminal Equipment (DTE) ou Equipamento Terminal de Dados o dispositivo de comunicao localizado em um dos extremos da comunicao. Neste caso assumem o papel de DTE os seguintes equipamentos: o PC, impressora serial (algumas possuem uma chave para o usurio escolher entre DTE ou DCE), plotters, etc..
O Data Communication Equipment (DCE) ou Equipamento Comunicador de Dados o dispositivo de comunicao que no est colocado no extremo da comunicao. Um bom exemplo de um DCE o tradicional modem utilizado para conectar os PC's aos provedores de Internet.
Existem basicamente dois tipos de comunicao entre dispositivos seriais utilizando a interface RS-232C: DCE-DTE (ligao modem - PC, por exemplo) e DTE-DTE (ligao PC - PC ou PC - impressora, por exemplo). Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 98 5.2 Sinais de Entrada:
Os sinais de entrada so gerados por outro dispositivo serial, como por exemplo um modem ou um outro computador. Eles so recebidos pelo PC e depois de passarem por um conversor de nvel RS-232C/TLL (de +/- 12 V para 0/5 V), so entregues ao 8250. Apresentamos a seguir estes sinais:
Sinal Descrio RD So os dados seriais enviados do perifrico ao computador. Ele encaminhado ao pino 10 do 8250. CTS O perifrico informa que est pronto para receber dados do PC. DSR Quando positivo informa que o perifrico est ligado. CD O perifrico indica que detectou uma portadora na linha. RI Serve para o perifrico indicar o recebimento do tom de discar da linha telefnica. Tabela 5.2 Sinais de entrada.
5.3 Sinais de Sada:
So aqueles sinais gerados pelo PC e enviados ao perifrico. Eles so gerados no 8250 e depois de passarem por um conversor TTL/RS-232C, so entregues aos pinos do conector serial.
Sinal Descrio TD So os dados seriais enviados ao perifrico, a partir pino 11 do 8250. RTS Informa ao perifrico que o PC est pronto para transmitir dados. DTR Informa ao perifrico que est ligado e pronto para se comunicar. Tabela 5.3 Sinais de sada.
5.4 Definio dos Sinais Considerando a Comunicao DCE-DTE:
Faremos agora uma descrio dos mesmos sinais descritos nos itens 5.2 e 5.3, considerando que ocorre uma comunicao entre um DCE (modem por exemplo) e um DTE (PC). A figura 5.1 ilustra uma ligao entre dois PCs via modem. O que na verdade teremos so duas ligaes tipo DCE-DTE. A pingem descrita refere-se ao conector DB-25.
Figura 5.1 Comunicao DCE DTE. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 99
O sinal no pino 20 chamado DTR (Data Terminal Ready). Ele uma voltagem positiva enviada do DTE para o DCE para indicar que o DTE est ligado e pronto para comear a comunicao. O sinal complementar aparece no pino 6. Ele chamado DSR (Data Set Ready). Ele uma voltagem positiva que indica que o DCE est ligado e pronto para iniciar os trabalhos de comunicao. Numa comunicao serial normal, ambos sinais devero estar presentes antes que algum procedimento de comunicao ocorra. O DTE envia o DTR para o DCE e o DCE envia o DSR para o DTE.
O "handshaking" entre o DTE e o DCE feito pelos sinais CTS e RTS. O DCE coloca uma voltagem positiva no pino 5, que chamado CTS (Clear To Send), para indicar que est tudo bem, ou seja, ele est pronto para receber dados do PC. Do outro lado da conexo, o DTE coloca uma voltagem positiva no pino 4, denominado RTS (Request To Send), para indicar ao DCE que ele tambm est apto para receber dados. Uma regra importante para se lembrar que s haver troca de dados se ambos sinais estiverem com voltagem positiva.
O DCE envia um sinal, denominado CD (Carrier Detect), que pode afetar o fluxo de dados. Uma voltagem positiva neste condutor indica que o DCE (modem) tem um sinal de portadora vinda de outro modem, no outro lado da conexo. Se nenhuma portadora for detectada, ento o sinal serial pode ser apenas rudo. Em alguns casos, quando CD for negativo, o DTE ir rejeitar o sinal recebido.
O sinal do pino 22 chamado RI (Ring Indicator) e usado pelo DCE (modem) para sinalizar ao DTE que foi detectada uma chamada telefnica para o modem. Em muitas ligaes seriais este sinal considerado opcional e sua ausncia no vai inviabilizar a comunicao serial.
Uma comunicao serial pode ser considerada um protocolo muito particular. Antes que qualquer coisa ocorra, os hardwares nas duas extremidades devero estar ligados e prontos para trabalhar. Neste caso o DTE (PC) envia o DTR e o DCE (modem) envia o DSR. Se um telefone chama, ele "acorda" o modem e este envia o RI para o computador, o qual pode enviar uma mensagem para a tela. Enquanto o modem negocia a conexo com o outro modem, o DCE envia o CD para o DTE.
A ligao DTE-DCE feita por um cabo ligado pino a pino, sem cruzamentos. Este tipo de cabo denominado cabo transparente. Por conveno o DTE usa o pino 2 para transmisso e o pino 3 para recepo. O DCE usa o pino 3 para transmisso e o pino 2 para recepo.
O sinal GND (pino 7) deve sempre existir em uma transmisso serial. Ele prov o caminho de retorno para os sinais de dados e controle. Ele no tem relao com o pino 1, que o terra de carcaa.
5.5 Comunicao DTE-DTE:
A figura 5.2 mostra como deve ser a ligao entre dois DTEs (dois computadores, por exemplo), onde ressaltada a tica de cada um deles. A conexo simples: basta cruzar DTR e DRS (20 x 6), RTS e CTS (4 x 5) e TD e RD (2 x 3). A conexo de terra direta. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 100
Figura 5.2 Comunicao DTE DTE.
6.0 Registradores:
Todo o controle da Porta Serial feito pela UART. Esto previstas 4 portas seriais para o PC. Cada porta ocupa 8 endereos de I/O, com possibilidade de interrupo. O endereamento das portas o mostrado na tabela a seguir:
Porta Endereos Endereo Base Interrupo COM1 3F8-3FFh 3F8h IRQ4 COM2 2F8-2FFh 2F8h IRQ3 COM3 3E8-3EFh 3E8h IRQ4 COM4 3E8-2EFh 2E8h IRQ3 Tabela 6.1 Endereamento das portas seriais.
As portas COM1 e COM3 compartilham a IRQ4 e as portas COM2 e COM4 compartilham a IRQ3. Apenas uma das portas ligadas ao mesmo IRQ pode gerar pedido de interrupo, sob pena de haver um conflito no barramento de controle do PC. Algumas portas mais modernas so mais flexveis quanto a IRQ utilizada.
A cada porta serial est associado um dispositivo 8250 (ou compatvel), que possui 11 registradores, os quais so acessados por instrues tipo IN e OUT da linguagem Assembly. Esses 11 registradores so acessados pelos 8 endereos de I/O, havendo portanto um compartilhamento de endereos controlado pelo bit DLAB.
A tabela a seguir apresenta a relao dos registradores do 8250, com suas finalidades e endereos:
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 101
Reg. Funo DLAB Endereo Acesso TXD Buffer de transmisso 0 Base Escrita RXD Buffer de recepo 0 Base Leitura BAL Divisor menos significativo 1 Base Bidirecional BAH Divisor mais significativo 1 Base + 1 Bidirecional IER Habilita interrupes 0 Base + 1 Bidirecional IIR Identificador de interrupes - Base + 2 Leitura LCR Inicializa operao da UART - Base + 3 Bidirecional MCR Controlador de modem (OUT2) - Base + 4 Bidirecional LSR Status da operao - Base + 5 Leitura MSR Status do modem - Base + 6 Leitura SCR Registrador para deteco da porta - Base + 7 Bidirecional Tabela 6.2 Descrio dos registradores do 8250.
O DLAB (Divisor Latch Access Bit) controla os registradores acessados atravs dos endereos Base e Base + 1, conforme mostrado na tabela acima. Isto se deve ao fato de termos 11 registradores, mas somente 8 endereos de I/O. A seguir sero descritos cada um destes registradores:
6.1 Registrador TXD:
O TXD (Transmit Data Buffer) armazena o caractere a ser transmitido serialmente. A transmisso iniciada imediatamente aps a escrita neste registrador. Ento, necessrio ler o bit TXDE (bit 5 do LSR) para verificar se o buffer de transmisso est vazio. O chamado erro break detecte acontecer quando se comear uma transmisso sem terminar a anterior. O acesso a este registrador apenas para a escrita, no endereo Base, e est condicionado ao bit DLAB (bit 7 do LCR) = 0.
6.2 Registrador RXD:
O RXD (Receive Data Buffer) armazena o ltimo caractere recebido serialmente. necessrio ler o bit RXDA (bit 0 do LSR) para verificar se h um novo caractere disponvel (ou se o caractere no RXD j foi lido anteriormente). O chamado erro "overrun error" acontece quando um caractere esteve disponvel, mas no foi lido pela CPU por causa da chegada de um outro caractere. O acesso a este registrador apenas para a leitura, no endereo Base, e est condicionado ao bit DLAB (bit 7 do LCR) = 0.
6.3 Registradores BAH e BAL:
O BAH (Divisor High Byte) e o BAL (Divisor Low Byte), em conjunto, determinam a taxa de transmisso (Baud Rate). A taxa de transmisso dada por:
Taxa (baud) = 115.200 / Baud
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 102
Assim, alguns valores comerciais so facilmente relacionados, como ilustra a tabela a seguir. O acesso a estes registradores, BAL no endereo Base e BAH no endereo Base + 1, est condicionado ao bit DLAB (bit 7 do LCR) = 1.
O IER (Interrupt Enable Register) mascara as 4 (quatro) possveis origens de pedidos de interrupo a serem gerados pelo 8250. Pode-se dizer que o IER est para o 8250 assim como a OCW1 est para o 8259. Cada bit setado (1) para habilitar e ressetado (0) para desabilitar uma determinada origem do pedido de interrupo. O acesso ao IER, no endereo Base + 1, est condicionado ao bit DLAB (bit 7 do LCR) = 0.
Bit Sinal Descrio 0 RX Data Interrupt Enable (RXDA) Gera pedido quando algum caractere estiver disponvel para leitura em RXD, evitando que o programa leia, constantemente, o j referido bit RXDA. 1 TX Data Interrupt Enable (TXDA) Gera pedido quando a ltima transmisso de caractere for encerrada, evitando que o programa leia, constantemente, o j referido bit TXDA. 2 RX Error Interrupt Enable (RXIE) Gera pedido quando algum erro de transmisso for detectado, evitando que o programa leia, constantemente, os bits de erro do LSR. 3 Modem Interrupt Enable Gera pedido quando um dos 4 (quatro) bits menos significativos do MSR setado. Tabela 6.4 Descrio dos bits do Registrador IER.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 103 6.5 Registrador IIR:
O IIR (Interrupt Identification Register) um registrador que identifica o estado da interrupo. Ele informa CPU qual a origem do pedido que foi atendido. acessvel diretamente no endereo Base + 2.
Bit Configurao Descrio 0 Interrupt Pending (IPN) Ativado em nvel baixo, este bit informa se foi feito algum pedido de interrupo CPU que ainda no foi atendido. Ele setado quando uma das condies descritas no IER atendida e ressetado quando o bit que gerou a interrupo ressetado (RXDA, TXDA, bits de erro, bits do MSR), ou quando o IIR lido. Um novo pedido de mais alta prioridade tem preferncia a outro mais antigo de menor prioridade. 1 e 2 Bit 1 = 1 Bit 2 = 1 O pedido de interrupo foi gerado por uma condio de erro de transmisso. Tem a maior prioridade. Encerra-se o pedido executando-se uma leitura no LCR. 1 e 2 Bit 1 = 1 Bit 2 = 0 O pedido de interrupo foi gerado pelo bit RXDA. Encerra-se o pedido executando-se uma leitura no RXD. 1 e 2 Bit 1 = 0 Bit 2 = 1 O pedido de interrupo foi gerado pelo bit TXDA. Encerra-se o pedido executando-se uma leitura no IIR ou escrita no TXD. 1 e 2 Bit 1 = 0 Bit 2 = 0 O pedido de interrupo foi gerado por um dos quatro bits menos significativos do MSR. Tem a menor prioridade. Encerra-se o pedido executando-se uma leitura no MSR. Tabela 6.5 Descrio dos bits do Registrador IIR.
6.6 Registrador LCR:
0 LCR (Line Control Register) o registrador que define os parmetros de operao do 8250, como UART. acessvel diretamente no endereo Base + 3.
Bit Configurao Descrio 0 e 1 0 e 0 5 bits 0 e 1 6 bits 1 e 0 7 bits 1 e 1 8 bits Definem o tamanho, em bits, do caractere a ser transmitido / recebido. 2 0 1 stop bit 1 2 stop bits, para caracteres de 6, 7 ou 8 bits, ou 1 , para caracteres de 5 bits. Nmero de stop bits 4 e 5 0 e 0 paridade mpar 0 e 1 paridade par 1 e 0 paridade alta 1 e 1 paridade baixa Definem a paridade 6 1 Seta 0 Resseta Fora a nvel baixo o pino TXD at que este bit seja ressetado. 7 DLAB (Divisor Latch Access Bit). Seleciona que registradores devem ser acessados nos endereos Base e Base + 1. Tabela 6.6 Descrio dos bits do registrador LCR. Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 104
6.7 Registrador MCR:
O MCR (Modem Control Register) o registrador que controla o nvel lgico (atravs do seu complemento) dos pinos de sada da operao com o modem. acessvel diretamente no endereo Base + 4.
Bit Sinal Descrio 0 DTR Data Terminal Ready. 1 RTS Request To Send. 2 OUT1 Este bit, quando setado, controla a sada OUT1 do 8250. 3 OUT2 Este bit, quando setado, controla a sada OUT2 do 8250 e permite que seu pedido de interrupo seja diretamente conectado IRQ correspondente do barramento de controle do PC. 4 LC Loopack Control - Modo de loop local. Tabela 6.7 Descrio dos bits do registrador MCR.
6.8 Registrador LSR:
O LSR (Line Status Register) o registrador de status da operao do 8250. acessvel diretamente no endereo Base + 5. Seus bits, descritos a seguir, representam um segundo estgio de identificao de interrupo (o primeiro o IIR), fornecendo disponibilidades de caracteres e possveis erros de transmisso / recepo.
Bit Sinal Descrio 0 RXDA Informa se h caractere disponvel em RXD. Este bit setado por hardware e ressetado quando uma leitura ao RXD realizada. 1 OE (Overrun Error) Indica que um caractere foi perdido pela chegada de outro, pois a CPU no o leu a tempo. Setado por hardware e ressetado na leitura do LSR. 2 PE (Parity Error) Indica que um caractere foi recebido com um erro de paridade. Setado por hardware e ressetado na leitura do LSR. 3 FE (Framing Error) Indica que um caractere foi recebido com erro de quadro, estando relacionado a diferentes taxas de transmisso. Setado por hardware e ressetado na leitura do LSR. 4 BKD (Break Detected) Indica que a transmisso de um caractere foi interrompida. Setado por hardware e ressetado na leitura do LSR. 5 TXDE Informa que o buffer para transmisso est vazio. Setado por hardware e ressetado na escrita do TXD. 6 TXST Quando setado (por hardware), informa que no h caractere sendo transmitido. Ressetado na escrita de TXD. 7 TIME OUT Acusa erro de decurso de tempo. Tabela 6.8 Descrio dos bits do registrador LCR.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 105
6.9 Registrador MSR:
O MSR (Modem Status Register) o registrador que l o nvel lgico dos pinos de entrada da operao com o modem. acessvel diretamente no endereo Base + 6. Quando um dos bits 3, 2, 1 e 0 setado, h um pedido de interrupo.
Bit Descrio 0 Setado quando o pino CTS muda de nvel lgico. Ressetado na leitura do MSR. 1 Setado quando o pino DSR muda de nvel lgico. Ressetado na leitura do MSR. 2 Setado quando o pino RI muda de nvel lgico alto para nvel lgico baixo. Ressetado na leitura do MSR. 3 Setado quando o pino CD muda de nvel lgico. Ressetado na leitura do MSR. 4 Complemento de CTS. 5 Complemento de DSR. 6 Complemento de RI. 7 Complemento de CD. Tabela 6.9 Descrio dos bits do registrador MSR.
6.10 Registrador SCR:
O SCR (Scratchpad Register) um registrador, acessvel no endereo Base + 7, que no influencia na operao do 8250. Mas bastante utilizado para verificar se existe porta serial conectada ao PC. Para isso, escreve-se um dado nos possveis endereos deste registrador: se o valor lido for igual ao valor escrito, h um forte indcio da presena da Porta Serial.
7.0 O Hardware da Porta Serial:
O circuito principal da porta serial a Universal Asynchronous Receiver and Transmiter (UART). Ele um chip especial responsvel por transformar um barramento paralelo em um trem de bits seriais. Trabalha de modo bidirecional e com barramento de 8 bits. A UART est relacionada com as funes da porta serial e com uma famlia de circuitos.
Existem 3 tipos bsicos de circuitos utilizados nos PCs que realizam as funes da UART:
8250: o mais antigo, usado principalmente nos PCs XT; 16450: melhor performance, lanado em 1984; 16550: lanado em 1987, muito utilizado atualmente.
A figura a seguir mostra a pinagem destas UARTs:
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 106
Figura 7.1 UART 16550 e 8250.
O 16550 compatvel com o 8250 e 16450. A nica diferena so os pinos 24 e 29. No 8250 o pino 24 a sada do Chip Select o qual funciona apenas como indicador se o chip foi ativado ou no, e o pino 29 no utilizado.
No 16550 foram introduzidos dois novos pinos no encapsulamento. Eles so o Transmit Ready e Received Ready o qual pode ser implementado o acesso direto a memria (Direct Memory Access - DMA). Estes pinos tem dois diferentes modos de operao: Modo 0 suporta uma transferncia simples com DMA enquanto o Modo 1 suporta mltiplas transferncias com DMA.
Atualmente a UART mais utilizada a 16550. A tabela a seguir descreve os pinos deste Circuito Integrado.
Pinos Nome Descrio 1 a 8 D0 a D7 Data Bus 9 RCLK Receiver Clock Input. A frequncia desta entrada deve ser igual a taxa recepo multiplicada por 16. 10 RD Receive Data 11 TD Transmit Data 12 CS0 (H) Chip Select 0 13 CS1 (H) Chip Select 1 14 CS2 (L) Chip Select 2 15 BAUDOUT (L) Baud Output. Sada para Gerador Programvel de Taxa de transmisso. Frequncia = (taxa * 16) 16 XIN Entrada externa de Cristal. Usado pelo oscilador de taxa de transmisso. 17 XOUT Sada externa de cristal 18 WR (L) Write Line
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 107
Pinos Nome Descrio 19 WR Write Line 20 VSS Conectado ao GND 21 RD Read Line 22 RD (L) Read Line 23 DDIS Driver Disable. Este pino vem para nvel baixo quando a CPU est lendo a UART. Pode ser conectado ao barramento de transmisso no caso de um barramento de alta capacidade. 24 TXRDY (L) Transmit Ready 25 ADS (L) Address Strobe. Usado se o sinal no estiver estvel durante o ciclo leitura ou escrita. 26 A2 Address Bit 2 27 A1 Address Bit 1 28 A0 Address Bit 0 29 RXRDY (L) Receive Ready 30 INTR Interrupt Output 31 OUT2 (L) User Output 2 32 RTS (L) Rquest to Send 33 DTR (L) Data Terminal Ready 34 OUT1 (L) User Output 1 35 MR Master Reset 36 DSR (L) Data Set Ready 37 DSR (L) Data Set Ready 38 DCD (L) Data Carrier Detect 39 RI (L) Ring Indicator 40 VDD + 5 Volts Tabela 7.1 Descrio dos pinos da UART 16550.
7.1 O Circuito 8250:
O 8250 foi largamente utilizado nos PCs XT e em modems de baixa velocidade. Suas principais funes:
Converso paralelo/serial dos dados; Controle da taxa de transmisso; Controle do fluxo de informao (tamanho da palavra de dados, paridade e stop bit); Gerenciamento da comunicao.
A tecnologia aplicada ao circuito considerada antiga, com baixa velocidade de TX/RX. Ele possui apenas um buffer interno de um byte, o que pode acarretar problemas de sobrescrita denominado overrum error. Isso ocorre quando o byte recebido no lido pelo processador antes da chegada de um novo byte. Em contrapartida um chip barato sendo por isso muito utilizado.
A programao do 8250 feita pela BIOS, porm os usurios tem acesso aos seus registradores via instrues tipo IN e OUT do Assembly.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 108
7.2 O Circuito 16450:
O circuito 16450 uma evoluo do 8250, possuindo um desempenho melhor, apesar de continuar com somente um byte de buffer. Quando aplicado comunicao em altas taxas ou software multitarefa ainda ocorre o overrun error.
7.3 O Circuito 16550 A:
Neste chip foi resolvido o problema de overrrun error em aplicao multitarefa com a utilizao de um buffer de 16 bytes. Ele compatvel com o 16450.
7.4 O ChipSet:
Atualmente a funo da UART realizada em um chipset denominado ASICs (Aplication Specific Integrated Circuit). Nele esto implementados 2 circuitos 16650 e uma porta paralela.
8.0 Padres Existentes:
8.1 Porta Serial Avanada (Enhanced Serial Port):
Para comunicao em altas taxas, o 16550 continuava sendo inadequado. Em funo disso, em 1990 a Hayes Microcomputer Products criou a porta serial avanada. Possui um buffer de 1024 bytes, sendo controlada por um microcontrolador 8031. Ela programada para trabalhar no modo padro e no modo avanado. necessrio um software para ativ-la.
8.2 O Padro P1394:
A performance das portas seriais continuavam baixas para as novas aplicaes do PC. A melhor maneira de aumentar o desempenho foi a redefinio do padro de porta serial. O IEEE tem trabalhado no P1394 para ser a porta serial do futuro. O objetivo oferecer uma conexo de baixo custo e alto desempenho entre o computador e os perifricos, que venha substituir as conexes atualmente utilizadas (serial, paralela e vdeo). Segue algumas caractersticas desse padro:
A taxa de transmisso inicial prevista para o padro de 100 Mbps, podendo evoluir para 200 e 400 Mbps.
Utilizar um conector plstico de 6 vias.
Os perifricos podero estabelecer uma comunicao direta, sem a interveno do PC. Neste caso o P1394 funcionar como uma pequena rede.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 109
Trabalha no tradicional modelo de camadas de redes de computadores. Esto previstas 4 camadas: gerenciamento (nvel 4), transao (nvel 3), enlace (nvel 2) e camada fsica (nvel 1).
9.0 Programando a Porta Serial:
Assim como as portas LPT, os endereos base das portas COM podem ser lidos diretamente da rea de dados da BIOS. A tabela a seguir mostra quais so os endereos da rea de dados da BIOS. Cada endereo ocupa 2 bytes:
Endereo da Memria Porta 0000:0400 Endereo base da porta COM1 0000:0402 Endereo base da porta COM2 0000:0404 Endereo base da porta COM3 0000:0406 Endereo base da porta COM4 Tabela 9.1 Endereo da porta serial na BIOS.
Desta forma, o programa a seguir mostrar como verificar estas posies de memria, retornando o endereo base das portas COM. Se o programa retornar um 0, significa que no existe nenhum endereo associado a COM:
#include <stdio.h> // Biblioteca bsica de I/O. #include <conio.h> // Biblioteca para crlscr() e getch().
void main() { unsigned int far *ptend; // Ponteiro p/ localizar endereo da Porta. unsigned int base; // Endereo da porta. int i;
ptend = (unsigned int far *)0x00000400; // Coloca no ponteiro ptend o // contedo da posio de // memria 0000:0400 clrscr();
for(i=0; i<4; i++) { base = *ptend; if(base == 0) printf(Nao existe nenhum endereco associado a COM%d\n, i+1); else printf(O endereco associado a porta COM%d e %Xh\n, i+1, base); *ptend++; } getch(); }
Exemplo 9.1 Endereo base da porta serial.
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 110
A leitura ou escrita na porta serial feita pelas funes inportb e outportb, descritas anteriormente.
O prximo programa na verdade uma biblioteca de funes para o interfacemanto do programador com a porta serial, utilizando os recursos mais usuais do 8250 para o padro RS-232C:
/*********************************************************/ /** ARQUITETURA E SISTEMAS DE COMPUTADORES **/ /** **/ /** BIBLIOTECA RS-232C **/ /** **/ /*********************************************************/
#include <dos.h>
// Endereos base das portas: #define COM1 0x3F8 #define COM2 0x2F8 #define COM3 0x3E8 #define COM4 0x2E8
// Condies de gerao de interrupo: #define MODEMSET 0x08 #define ERRORSET 0x04 #define TXSET 0x02 #define RXSET 0x01
// Rotina para limpar o buffer da recepcao, pedido de // interrupcao e bit de erro: void limpa_registradores(int porta) { inportb(porta); inportb(porta+2); inportb(porta+5); inportb(porta+6); }
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 111
// Rotina para ler o status da porta serial. // Valores retonaveis: TIMEOUT // TXST // TSDE // BREAKDETECT // FRAME // PARIDADE // OVERRUN // RXDA unsigned char le_status(int porta) { return(inportb(porta+5)); }
// Rotina para ler um caractere pela porta serial: unsigned char le_caractere(int porta) { while(!(le_status(porta)&RXDA)); return (inportb(porta)); }
// Rotina para inicializar a porta serial: void inicializa(int porta, unsigned char nbits, unsigned char nstop, unsigned char paridade, unsigned int divisor) { unsigned char palavra; unsigned char resultado;
// Programacao da UART: // nbits numero de bits por caractere (5 a 8) // paridade 0 -> sem paridade // 1 -> paridade impar // 3 -> paridade par // divisor gera a taxa de transmissao // 12 9600 bauds // 24 4800 bauds // 48 2400 bauds // 96 1200 bauds // 192 600 bauds // 384 300 bauds
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 112
// Rotina para enviar um caractere pela porta serial: void envia_caractere(char c, int porta) { while(!(le_status(porta)&TXDE)); outportb(porta, c); }
// Rotina para conectar o pedido de interrupcao do // 8250 a IRQ relativa a porta: void habilita_int_porta(int porta) { outportb(porta+4, inportb(porta+4) | 0x08); }
// Rotina para desconectar o pedido de interrupcao do // 8250 a IRQ relativa a porta: void desabilita_int_porta(int porta) { outportb(porta+4, inportb(porta+4) & 0xF7); }
// Rotina para mascarar origens possiveis do pedido // de interrupcao do 8250. // Valores retonaveis: MODEMSET // ERRORSET // TXSET // RXSET void seta_mascara_int(int porta, unsigned char mascara) { outportb(porta+1, mascara); }
// Rotina para ler a mascarar de origens possiveis do pedido // de interrupcao do 8250. // Valores retonaveis: MODEMSET // ERRORSET // TXSET // RXSET unsigned char le_mascara_int(int porta) { return(inportb(porta+1) & 0x0F); }
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 113
// Rotina para verificar o fato que gerou o pedido de // interrupcao. // Valores retonaveis: INTPED // ERRORINT // RXINTR // TXINTR unsigned char le_origem_int(int porta) { return (inportb(porta+2) & 0x07); }
// Rotina que retorna 1 se existir a porta serial, e 0 // caso contrario: unsigned char checa_porta(int porta) { unsigned char flag; flag=0; if((porta == COM1) || (porta == COM2) || (porta == COM3) || (porta == COM4)) { flag = 1;
outportb(porta+7, 0x00); if(!(inportb(porta+7) == 0x00)) flag = 0; outportb(porta+7, 0xFF); if(!(inportb(porta+7) == 0xFF)) flag = 0; outportb(porta+7, 0xA2); if(!(inportb(porta+7) == 0xA2)) flag = 0; } return (flag); }
Exemplo 9.2 - Biblioteca de funes RS-232C.
10.0 Conectando Hardware a Porta Serial:
Este exemplo mostra como conectar um display LCD de 2 linha por 16 caracteres porta serial, no qual tudo que for digitado na tela ser enviado para o display. A linha RTS usada para demonstrar o uso do handshaking para RS-232C.
A conexo de display na porta paralela pode ser feita com poucos componentes, visto que a mesma j trabalha com sinais TTL. J na serial, e necessrio um hardware um pouco mais complexo, devido a necessidade de compatibilizar os nveis de tenso e converter os dados seriais em paralelo.
A figura a seguir mostra o esquema eletrnico do hardware usado para conexo do display Porta Serial: Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 114
Figura 10.1 Esquema eletrnico de conexo do display LCD porta serial.
A converso dos nveis de sinal da porta serial, que para o padro RS-232C variam de 12V a +12V, feito pelo CI MAX-232. Ele converte estes nveis de tenso para o padro TTL (0 a 5V), usados pelo display LCD.
A UART CDP6402C quem faz a recepo e converso dos sinais entre o display e a porta. O CI 74HC4060 gera o clock para este CI, que neste exemplo trabalha com 9600 bps.
Toda inicializao da porta serial e do prprio display so feitas via software de controle, que o mostrado a seguir:
Eletricazine www.eletricazine.hpg.ig.com.br Daniel Campos Laboratrio de Arquitetura de Computadores 2001 Reviso 04 _______________________________________________________________ Pgina 115