Comunicação Serial Assíncrona
Last updated
Last updated
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.
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.
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.
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.
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.
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.
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
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