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

 

1. Porta serial em detalhes (RS-232C)

·        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.

Pin Diagrams of UARTs - 16550, 16450 & 8250

·        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 regis­trador 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 3: 1 = stop bit invalido

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 trans­mitido 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.

Bit 3: 1 = uma interrupção e gerada quando qualquer entrada da porta serial mudar de estado.

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.

Bit 3: 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.