Software serial: Como fazer?

Software serial

Quando estamos realizando o projeto de um sistema microcontrolado sempre devemos verificar quais periféricos teremos que usar para atender aos requisitos de hardware necessários para o projeto. Um dos principais pontos a se observar é a quantidade de dispositivos de comunicação serial (UART/I2C/SPI/I2S) vamos utilizar no projeto e qual é o processador/microcontrolador que iremos utilizar que atende esses requisitos.

 

Em algum ponto do projeto teremos a plena convicção de qual processador iremos utilizar, porém podemos cair em dois problemas: custo e disponibilidade. Esses dois parâmetros podem fazer o projeto se tornar inviável. Neste artigo iremos olhar para este problema do ponto de vista de uma implementação de um canal de comunicação UART.

 

Acabaram as UARTs do microcontrolador. E agora?

 

Este é um grande problema que todo projetista enfrenta. Uma das soluções que podem ser adotadas é a de usar um circuito integrado que implementa uma ou mais UARTs, como os SC16IS741AIPW, da NxP, e os ST16C1550, da Exar. O ponto ruim desta abordagem é o aumento de custo do projeto e o aumento de potência consumida. A outra abordagem que podemos ter para este problema é a que será apresentada neste artigo: implementação de uma serial via software.

 

Frame de comunicação serial

 

O frame de comunicação serial na configuração 8x2 (oito bits de dados, paridade e dois stop bits) apresenta o formato ilustrado na Figura 1.

 

Software serial
Figura 1: Frame de comunicação serial. Imagem capturada da Maxim Integrated através do link: http://maxembedded.com/2013/09/the-usart-of-the-avr/

 

A partir da Figura 1 podemos notar que o estado idle da linha de comunicação da UART é nível alto. Esta característica usaremos mais a frente no artigo.

 

O tempo de bit está relacionado ao baudrate da comunicação, como pode ser observado na tabela 1, onde apresentamos os baudrates mais utilizados em projetos.

 

Tabela 1: Baudrate e tempo de bit

Baudrate [bits por segundo]

tempo de bit [us]

9600

104.16

19200

52.08

38400

26.04

57600

17.36

115200

8.68

 

 

Implementação de uma UART emulada

 

Para implementar a comunicação serial temos que prover funções de recepção e transmissão de dados. Vamos discutir separadamente cada um dos casos em uma aplicação com microcontrolador Microchip PIC18F, porém os conceitos abordados aqui podem ser aplicados em qualquer microcontrolador.

 

Recepção

 

Através da figura 1 verificamos que o estado Idle da linha de comunicação serial é em nível alto e a condição de START é dada por uma transição de alto para baixo na linha Rx. Com isso podemos ter duas abordagens para a implementação da recepção serial: por polling ou via interrupção.

 

A diferença básica entre as duas abordagens é que na detecção do start bit por polling o processador sempre deve verificar se o IO associado ao sinal de recepção está em nível zero, enquanto na detecção por interrupção o processador não precisa verificar a cada loop de processamento se uma nova condição de start ocorreu.

 

Após a detecção da condição de start, devemos realizar a leitura do sinal RX nos intervalos de tempo dados pela Tabela 1.

 

Como exemplo, vamos implementar a recepção de dados em um PIC18F genérico com o sinal RX da comunicação serial conectado a um pino da porta B, como ilustrado na figura 2.

 

Software serial
Figura 2: Comunicação serial com PIC18F4550. Rx conectado em RB0 e Tx em RB3

 

A escolha de RB0 para a recepção serial se deu simplesmente pois podemos configurar este pino para interrupção por borda de descida.

 

Após a detecção da borda de descida, desabilite todas as interrupções, espere um tempo de meiobit e, a partir daí, faça a aquisição do pino de IO a cada tempo de bit. Desabilitamos as interrupções pois como este processo é sensível a timming, não podemos ter outros processos rodando em paralelo e que possam fazer o processador perder tempo e errar a leitura do dado. A espera de um tempo de meiobit se faz necessária para que tenhamos certeza de que o sinal presente no pino de IO não está mais sujeito a transientes. Observe na figura 3 o instante da detecção da condição de start e a posterior leitura dos 8 bits de dados e a detecção do stop bit.

 

Software serial
Figura 3: Frame de comunicação serial no formato 8N1.

 

Note os instantes de leitura do pino RX aproximadamente no meio de cada bit recebido.

 

A seguir apresento uma implementação de recepção serial em um PIC18F:

 

Como estamos trabalhando com uma operação muito sensível escolhi realizar a implementação em Assembly. Nesta implementação temos as funções DelayRXBitUART e DelayRXHalfBitUART, responsáveis pelo delay para a realização da leitura do pino RX. Estas funções são dependentes do baudrate.

  

Transmissão

A transmissão, como a recepção, é altamente dependente do tempo, desabilitamos todas as interrupções e assim temos certeza de que o processador está ocupado somente com a transmissão de dados. A implementação mostrada na listagem abaixo mostra a transmissão de dados via o canal serial.

 

 

Vale observar que as implementações de recepção e transmissão emuladas dependem muito de que os tempos de duração dos bits sejam respeitados. Sendo assim, se faz necessário uma contagem precisa do tempo de execução de cada instrução para que se alcance os requisitos de tempo da comunicação.

 

Conclusões

 

Neste artigo discutimos um pouco sobre implementação de uma porta serial emulada. A implementação realizada para PIC apresenta alguns conceitos que podem ser utilizados em qualquer plataforma, tais como início da recepção por detecção de borda de descida no pino RX, desabilitação das interrupções durante a recepção e a transmissão e amostragem no meio do bit.

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons
Software serial: Como fazer? por Rafael Dias. Esta obra está licenciado com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Rafael Dias
Sou Bacharel em Física formado pelo Instituto de Física da USP, mestre em Engenharia Elétrica, com ênfase em materiais nanoestruturados pela Escola Politécnica da USP e também Técnico em Automação da Manufatura pela Escola SENAI Anchieta. Trabalho com desenvolvimento de software, firmware e me arrisco com eletrônica analógica para instrumentação e controle. Nos tempos livres gosto de dar uma espairecida e pedalar um pouco.

2
Deixe um comentário

avatar
 
1 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
Rafael DiasNilton Felipe Braz Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Nilton Felipe Braz
Membro
Nilton Felipe Braz

Excelente artigo! Fiquei com uma dúvida em relação à contagem do tempo de meio bit. Como o tempo é fator chave, qual é a forma mais precisa e eficiente de fazermos este acompanhamento? Obrigado!