Comunicação Serial Assíncrona

A comunicação serial assíncrona é bem simples e tem como função enviar e receber bytes de informação, transferindo um bit de cada vez. As características do protocolo serial, ilustrado na Figura abaixo, são:

  • Taxa de transmissão (baud rate): Indica o número de bits transmitidos por segundo;

  • bits de dados (data bits): Tamanho da informação que é transferida;

  • bits de parada (stop bits): Utilizados para sinalizar o fim da transferência;

  • Paridade: Uma forma bem simples de verificação de erros na transferência de dados.

Protocolo serial [1].

Registradores

Conforme a Figura abaixo, a interface serial é configurada pelo registrador SCON. Esse registrador pode ser endereçado bit a bit e está localizado no endereço 98H.

Registrador SCON [1].
  • SM0~SM2: Modo de operação do canal serial;

  • REN: Habilita recepção do canal serial;

  • TB8: Determina o valor do 9º bit que será transmitido nos modos 2 e 3;

  • RB8: Determina o valor do 9º bit recebido nos modos 2 e 3;

  • TI - Transmit Interrupt Flag – Seu valor é determinado pelo hardware:

    • 1: Após a transmissão do 8º bit (modo 0) ou no início da transmissão do stop bit (demais modos);

    • Deve ser zerado por software;

  • RI - Transmit Interrupt Flag – Seu valor é determinado pelo hardware:

    • 1: Após a recepção do 8º bit (modo 0) ou no meio da recepção do stop bit (demais modos);

    • Deve ser zerado por software.

Além disso, os dados são transmitidos/recebidos a partir do registrador SBUF. Esse registrador está localizado no endereço 99H:

  • É composto por dois registradores distintos: transmissão e recepção;

  • Qualquer operação com destino a esse registrador inicia a transmissão de dados.

Configuração da Interface Serial

As configurações da interface serial devem ser realizadas para atender os requisitos especificados anteriormente. Essas configurações são realizadas no registrador SCON, responsável por determinar o modo de operação do circuito que pode ser 0, 1, 2 ou 3.

  • Modo 0

  • Taxa fixa: Frequência de clock dividido por 12.

  • Frame de 8 bits de dados.

  • Comunicação Síncrona.

  • Modo 1

  • Taxa variável.

  • Comunicação Assíncrona.

  • Frame de 8 bits de dados.

  • Modo 2

  • Taxa fixa: Frequência de clock dividido por 12.

  • Comunicação Assíncrona.

  • Frame de 9 bits de dados.

  • Modo 3

  • Taxa variável.

  • Comunicação Assíncrona.

  • Frame de 9 bits de dados.

Diagrama da interface serial.

As operações realizadas com o canal serial envolvem a manipulação do registrador SBUF e das flags RI e TI do registrador SCON. Basicamente, qualquer operação de escrita no registrador SBUF faz com que a transmissão de dados seja iniciada, já a leitura desse registrador retorna o último valor recebido. Nessas operações, as flags RI e TI devem ser monitoradas. De modo geral:

  • Nos modos 1, 2 e 3, a flag TI é ativada no início da transmissão do stop bit. Já no modo 0, é ativada após a transmissão do 8º bit.

  • Nos modos 1, 2 e 3, a flag RI é ativada no meio da recepçãp do stop bit. Já no modo 0, é ativada após a recepção do 8º bit.

Os pinos utilizados para transmissão e recepção são P3.1 e P3.0, respectivamente. Cabe ressaltar que no modo 0 a comunicação é síncrona, portanto o pino P3.1 é utilizado como clock e os dados são transmitidos e recebidos pelo pinos P3.0.

Frequência de Transmissão Variável

Nos casos em que a taxa de baud rate é variável o temporizador 1 é utilizado para gerar a frequência desejada. Como ilustrado na figura, o clock do módulo Timer1 é dividido por 12 e depois por 32. Essa frequência é utilizada pelo Timer1 que está configurado no modo recarga automática. Assim, o número de pulsos contados representa o fator de divisão N dessa frequência.

baudrate=(K.Fclock)/(32.12.[256TH1])baud rate=(K.Fclock)/(32 . 12 . [256 -TH1])

TH1=256N,N=(K.Fclock)/(384.baudrate)TH1=256 - N, N = (K.Fclock)/(384.baudrate)

O valor de K é determinado pelo bit SMOD (double baud rate bit) do registrador PCOM. De modo geral:

  • K = 1, se SMOD é 0.

  • K = 2, se SMOD é 1.

O exemplo abaixo mostra a recepção e transmissão de um byte. A taxa de comunicação utilizada é de 9600 bps. O valor de recarga necessário para gerar essa frequência é 253 (FDH), pois considerou-se a frequência de clock igual a 11,0592 MHz e K = 1. Logo, o valor N é igual a 28800/9600 = 3.

ORG 00h
begin:
MOV SCON, #50h ;Configuração da serial: Modo 1 e receptor habilitado
ORL TMOD, #20h ;Timer 1 configurado no modo de recarga automática
MOV TH1, #0FDh ;Definição do valor inicial de contagem para o baudrate desejado
MOV TL1, #0FDh
SETB TR1 ;Inicia operação do timer 1
LOOP:
JNB RI,$ ;permanece em loop aguardando (RI = 0) a recepção de um byte
CLR RI ;zera a flag de recepção
MOV A,SBUF ;faz a leitura do byte recebido
MOV SBUF,A ;inicia a transmissão do byte recebido (echo)
JNB TI,$ ;aguarda fim da transmissão
SJMP LOOP ;retorna para o loop principal
END

Interrupção do Canal Serial

O canal serial pode gerar interrupções de transmissão e recepção de dados. Porém, o mesmo vetor de interrupção é utilizado para tratar os dois eventos, portanto é dever do programador monitorar a flag que indica qual foi a fonte de interrupção gerada. Além disso, essas flags de interrupção devem ser zeradas por software.

O programa abaixo apresenta a mesma operação do exemplo anterior.

ORG 00h
LJMP begin
ORG 23h ;Vetor de interrupção da serial
LJMP serial_IT ;salta para a rotina de tratamento
begin:
MOV SCON, #50h ;Configuração da serial: Modo 1 e receptor habilitado
ORL TMOD, #20h ;Timer 1 configurado no modo de recarga automática
MOV TH1, #0FDh ;Definição do valor inicial de contagem para o baudrate desejado
MOV TL1, #0FDh
SETB ES; ;Habilita interrupção do canal serial
SETB EA; ;Habilita interrupções globais
SETB TR1 ;Inicia operação do timer 1
JMP $ ;permanece em loop aguardando um evento de interrupção
serial_IT:
JNB RI,EMIT_IT ;salta para EMIT_IT se a flag de recepção estiver em zero
CLR RI ;zera flag de recepção
MOV A,SBUF ;faz a leitura do byte recebido
MOV SBUF,A ;envia o byte recebido pela serial (echo)
LJMP END_IT ;salta para o final da rotina de interrupção
EMIT_IT:
CLR TI ;esse ponto só é executado quando um byte é transmitido
;zera flag de transmissão
END_IT:
RETI ;finaliza rotina de interrupção
END