Acessando Dispositivos Externos com Computadores Pessoais
Eduardo Augusto Bezerra, Faculdade de Informatica e Faculdade de Engenharia, PUC-RS
Porto Alegre, Agosto de 2004.
http://www.inf.pucrs.br/~eduardob/disciplinas/ProgPerif/Texto_Interface_SW_HW/serial.htm
· O padrão RS-232C define diversos parametros para a comunicação serial, entre eles os níveis de tensão que representam o 0 e o 1 lógicos, os conectores a serem utilizados (formato e numero de pinos), e o formato dos dados a serem utilizados.
· Com relação a portabilidade, a existencia do padrão RS-232C simplifica a vida do desenvolvedor de aplicações que utilizam a porta serial. A porta paralela e bem mais simples de se utilizar do ponto de vista do desenvolvedor, porem a diversidade de padrões pode fazer com que uma aplicação nao funcione em qualquer maquina.
· Uma vez identificada a porta paralela em uso, e o padrão utilizado, o desenvolvedor nao precisa se preocupar em implementar nenhum protocolo especial para acionar ou receber informações do dispositivo externo. Todos os dados trafegados pela porta paralela ficarão armazenados (“bufferizados”) no registrador de dados da porta.
· Ja em uma porta serial existe um módulo responsavel pela gerencia da comunicação, e o dispositivo externo devera “falar” a mesma lingua desse módulo de comunicação serial.
· No caso dos computadores padrão IBM-PC, o módulo responsavel pela gerencia da porta paralela e implementado com um circuito integrado baseado no Intel 8250.
· O 8250 implementa uma UART (Uníversal Asynchronous Receiver/Transmitter) que, basicamente, se encarrega de serializar os bytes recebidos (conversão paralelo para serial), adiconar os bits de controle definidos no protocolo RS-232C (start bit, stop bit e paridade), e enviar os bits um a um para o pino de transmissão do conector.
· O 8250 realiza tambem a função inversa, ou seja, receber os bits serialmente, remover os bits de controle, remontar o byte recebido e disponibilizar esse byte no registrador de dados do 8250.
· A UART 8250 passou a fazer parte dos computadores padrão IBM-PC em 1981. Esse dispositivo possui capacidade de armazenamento para apenas um byte e nao e o mais adequado, por exemplo, para comunicação utilizando os modems da epoca com velocidade mais rapida que esse dispositivo podia gerenciar. Nesse caso caracteres recebidos em uma comunicação podiam ser perdidos.
· Para solucionar esse problema, a partir de 1984 os computadores pessoais passaram a utilizar a UART 16450 que e uma versão melhorada da 8250. Essa nova UART tambem possui apenas um byte para armazenamento dos dados recebidos, mas o circuito interno e bem mais rapido do que o da 8250, resolvendo o problema de perda de dados para os modems da epoca.
· Com a utilização de sistemas multi-tarefas, em algumas situações os PCs passaram a nao ter tempo para ler o byte recebido na UART antes que um novo bate chegasse. O PC podia estar ocupado realizando alguma outra tarefa e um novo byte recebido na porta serial iria sobrepor o byte pronto para ser lido antes do PC o faze-lo.
· Em 1987 os PCs passaram a utilizar a UART 16550A com capacidade de armazenamento para mais do que um byte recebido, e posteriormente a UART 166550 que possui uma FIFO com capacidade para armazenar ate 16 bytes recebidos. Essa fila e uma boa solucap para armazenar os dados recebidos de modems de alta velocidade em ambientes multi-tarefa.
· As UARTs utilizadas nos PCs atuais são compativeis com a 166550, porem são encapsuladas em dispositivos do tipo ASIC (Application Specific Integrated Circuit) ficando dificil sua identificação visual na placa do computador.
· Devido a utilização do padrão RS-232C, e possível interfacear um dispositivo externo a um IBM-PC via porta serial, bastando para isso incluir um 8250, ou qualquer outra UART compativel com esse padrão, no projeto do dispositivo.
· A tabela a seguir apresenta a pinagem de conectores de 9 (DB-9) e 25 (DB-25) pinos de acordo com o padrão Rs-232C. A maioria dos computadores atuais utilizam o conector de 9 pinos.
25-pinos (DB-25) |
9-pinos (DB-9) |
Simbolo |
Função |
2 |
3 |
Tx |
Transmite dados |
3 |
2 |
Rx |
Recebe dados |
4 |
7 |
RTS |
Permissão para envio |
5 |
8 |
CTS |
Permissão fornecida |
6 |
6 |
DSR |
Dado pronto |
7 |
5 |
GND |
Terra |
8 |
1 |
CD |
Deteção de portadora |
20 |
4 |
DTR |
Terminal pronto |
22 |
9 |
RI |
Indicador de Ring |
· No projeto da interface para conexão a um dispositivo a ser controlado via porta serial, bastam 3 pinos (3 fios): pino 5 – Terra, pino 3 – transmissão de dados, pino 2 – recepção de dados. A figura a seguir mostra como ficaria o cabo serial com os devidos conectores para conectar um PC a um dispositivo externo.
Tx |
3 |
-------> <--------------- |
3 |
Tx |
-------> <--------------- |
Rx |
2 |
---> <---------- |
2 |
Rx |
Rx |
2 |
2 |
Rx |
Tx |
3 |
3 |
Tx |
|||
GND |
5 |
5 |
GND |
GND |
5 |
5 |
GND |
· Uma observação importante e quanto aos níveis de tensão do padrão RS232-C. Para possibilitar a utilização de cabos mais longos evitando perdas no sinal, os níveis lógicos 0 e 1 são representados por +15V e –15V respectivamente. Assim, esses são os níveis de tensão trafegando nos fios no diagrama acima.
· A UART 8250 trabalha com níveis de tensão TTL (0V para 0 lógico, e +5V para 1 lógico), e e preciso utilizar um conversor de níveis de tensão para realizar a transformação de 0V para +15V, e de +5V para –15V, e vice-versa. Para isso e utilizado o circuito integrado MAX232.
· O diagrama de blocos mostrando os registradores da UART 8250 e apresentado abaixo:
· A 8250 necessita estar conectada a um dispositivo mestre de forma a ser programada sua forma de operação. Esse dispositivo mestre, que no caso dos PCs e a CPU (ex. Pentium), precisa programar a UART para trabalhar em uma certa velocidade de transferência de dados, com uma determinado tamanho de palavra de dados, um determinado numero de stop bits, e uma determinada paridade. Os mesmos parametros devem ser utilizados para programar a UART em utilização do outro lado da linha. Caso alguma dessas informações esteja diferente em um dos dois lados, nao haverá comunicação pois as duas UARTs estarão utilizando protocolos diferentes.
· A figura a seguir mostra o envio da letra ‘A’ em uma UART programada para uma palavra de tamanho 8 bits, com 1 stop bit, paridade impar e com uma velocidade de 300 bps. Como a letra ‘A’ na tabela ASCII possui 2 bits em 1 e os demais em 0, o bit de paridade esta em 1 de forma a gerar um numero impar de bits em 1.
· A seguir são descritos funcionalmente os registradores da 8250.
Registrador de dados:
Registrador de Recepção: Ao se realizar uma leitura na 8250, obtem‑se o byte contido nesse registrador proveniente da conversão de serial para paralelo dos bits de entrada (pino Rx).
Registrador de transmissão: Uma operação de escrita carrega um byte nesse registrador para ser convertido de paralelo para serial pela 8250, e posterior transmissão pelo pino Tx).
Status:
Registrador de Status de Linha: utilizado para indicar condições de operação da linha.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
TxE |
TBE |
Break |
Erro de framming |
Erro de paridade |
Erro de overrun |
RxRdy |
Bit 0: 1 = existe byte pronto para ser lido no registrador de recepção.
Bit 1: 1 = um byte no registrador de recepção foi sobre escrito por um novo byte. 0 primeiro byte foi perdido.
Bit 2: 1 = erro de paridade.
Bit 4: 1 = interface detecta a linha em zero durante um tempo maior que a duração de um byte assincrono.
Bit 5: Buffer de transmissão vazio. 1 = um byte e movido do buffer de transmissão para o registro de deslocamento, onde o byte e transmitido serialmente.
Bit 6: Transmissor vazio. 1 = registro de deslocamento vazio.
Registrador de Status do Modem: utilizado para indicar o status do modem.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
DCD |
RI |
DSR |
CTS |
Δ DCD |
Δ RI |
Δ DSR |
Δ CTS |
Bits 0 – 3: 1 = ocorreu uma mudanca no respectivo pino desde a ultima leitura na porta.
Bit 4 - 7: indica o status dos pinos da porta.
Registrador de Identificação de Interrupção: Apos uma interrupção, o bit 0 recebe 0, e os bits 1 e 2 determinam a fonte da interrupção.
Bit 2 |
Bit 1 |
Bit 0 |
Identificador |
0 |
0 |
1 |
Sem interrupção |
1 |
1 |
0 |
Condição de erro |
1 |
0 |
0 |
Byte recebido |
0 |
1 |
0 |
Buffer de transmissão vazio |
0 |
0 |
0 |
Mudanca na entrada da porta serial |
Controle:
Registrador de Controle de Linha: utilizado para formatação dos dados.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
DLAB |
Break |
Paridade |
Stop bit |
Bits de dados |
Bits 0 - 1 : quantidade de bits por caracter. 00 = 5 bits
01 = 6 bits
10 = 7 bits
11 = 8 bits
Bit 2 : quantidade de bits por caracter. 0 = 1 stop bit
1 = 2 stop bits
Obs. Se a quantidade de bits por caracter for igual a 5, o numero de stop bits será automaticamente 1 ½ stop bits.
Bits 3 - 5 : determinam a paridade. 000 = sem paridade
001 = paridade impar
011 = paridade par
101 = marca (mark)
111 = espaco (space)
Bit 6 : 1 = saida Tx vai para o nível lógico 0.
Bit 7 : 1 = registro de transmissão recebe o byte de menor ordem (LSB) da taxa de transmissão e o registro de controle de interrupção recebe o byte de maior ordem (MSB).
Registrador de Controle de Interrupção: utilizado para habilitar os quatro tipos de interrupção do 8250.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
Pinos de entrada |
Erro na recepção |
TBE |
RxRdy |
Bit 0: 1 = uma interrupção e gerada quando um byte estiver disponível no registrador de recepção.
Bit 1: 1 = uma interrupção e gerada quando a 8250 puder receber um novo byte para trasnmissão.
Bit 2: 1 = uma interrupção e gerada quando ocorrer um erro de paridade, overrun (sobre escrita) ou stop bit.
Registrador de Controle do Modem
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
Loop |
GP02 |
GP01 |
RTS |
DTR |
Bit 0: 1 = ativa a saida DTR.
Bit 1: 1 = ativa a saida RTS.
Bit 2: Saida definida pelo usuário. Normalmente em 0.
· Finalmente, para programar a taxa de transferencia (velocidade da comunicacao), e preciso utilizar o bit 7 (DLAB) do Registrador de Controle de Linha, em conjunto com o Registradores de Controle de Interrupcao e com o Registrador de Dados, da seguinte forma:
1. Colocar o bit DLAB em 1 para indicar que a parte baixa (LSB) da programacao velocidade sera colocada no Registrador de Dados, e a parte alta (MSB) no Registrador de Controle de Interrupcao.
2. Escrever no Registrador de Controle de Interrupcao o valor desejado de acordo com a tabela a seguir (00H para 9600bps, por exemplo).
3. Escrever no Registrador de Dados o valor desejado de acordo com a tabela a seguir (0CH para 9600bps, por exemplo).
velocidade (bps) |
Divisor (Dec) |
Divisor MSB Reg. Contr. Interrupcao |
Divisor (LSB) Reg. Dados |
50 |
2304 |
09h |
00h |
300 |
384 |
01h |
80h |
600 |
192 |
00h |
C0h |
2400 |
48 |
00h |
30h |
4800 |
24 |
00h |
18h |
9600 |
12 |
00h |
0Ch |
19200 |
6 |
00h |
06h |
38400 |
3 |
00h |
03h |
57600 |
2 |
00h |
02h |
115200 |
1 |
00h |
01h |
Endereços da UART 8250 (porta COM1):
Dados (escrita/leitura) 03F8H
Registrador de Controle de Interrupção 03F9H
Registrador de Identificação de Interrupção 03FAH
Registrador de Controle de linha 03FBH
Registrador de Controle do Modem 03FCH
Registrador de Status da Linha 03FDH
Registrador de Status do Modem 03FEH
Obs. A COM2 inicia no endereço 02F8H, a COM3 no endereço 03E8H e a COM4 no endereço 02E8H.
· O funcionamento da troca de dados assincrona entre duas UARTs e relativamente simples. No lado do transmissor o pino de envio de dados Tx permanece em nivel logico 1 ate existir um caracter pronto para transmissao. Nesse instante o pino e colocado em zero, representando o start bit. Os bits de dados sao enviados logo apos o start bit, um apos o outro. Um bit de paridade, opcionalmente, segue os bits de dados. Apos isso um ou mais stop bits sao enviados. O bit de paridade e a soma dos bits de dados e indica se o dado contaim um numero impar ou par de bits 1. Para paridade par esse bit sera 0. Para paridade impar o bit sera 1.