Recepção Serial - RS232
- Detalhes
- Categoria: Exemplos com CPLD
- Publicado em Quinta, 03 Novembro 2011 20:02
- Escrito por João Marcos de Aguiar
- Acessos: 5406
Recepção Serial - RS232
O projeto descrito nesse artigo tem como objetivo a implementação de um receptor serial com base no protocolo RS232, sendo um projeto complementar ao transmissor serial RS232, detalhado em outro artigo.
Essa página demonstrará o exemplo de um projeto descrito em VHDL e simulado no Modelsim-Altera®, através de um testbench, que será a entrada de dados da simulação e é escrito em VHDL.
Os equipamentos necessários para a implementação e teste de projeto são:
- 1x Kit CPLD_7064;
- 2x Placa de LEDs;
- 1x Placa de botões;
- 1x Kit uCduíno para enviar dados.
Descrição do Funcionamento
Como já foi citado acima, o projeto baseia-se no protocolo de comunicação serial RS232. Este protocolo utiliza como inicio de transmissão um pulso em nível lógico baixo e como término um pulso em nível lógico alto, dessa forma pode-se sincronizar a transmissão.
Figura 1: Forma de onda da transmissão serial RS232.
A leitura será feita em uma frequência de 9600 bits/s, tomando apenas uma amostra por pulso de dado. As saídas serão um dado de 8 bits, um sinal de indicação que o dado está pronto para a leitura, um sinal indicando a erro de overrun (Dado não lido sobrescrito) e um indicando o erro de transmissão. Quando houver um erro de overrun o programa continuará funcionando, sendo este sinal a forma de indicar ao dispositivo que está adquirindo os dados de que dado(s) foi/foram perdido(s). O erro de transmissão faz com que o programa pare de receber dados, pois quando ocorre um erro de transmissão o receptor perde a sincronia com o transmissor.
Descrição em VHDL
Nesse projeto serão usados 15 portas do CPLD, sendo 4 entradas e 11 saídas. As entradas são Rx, clock, resetn e leitura (sinal indicando que o dado de saída foi lido). As saídas serão: dado de 8 bits, erro de overrun, erro de transmissão e ready (sinal indicando que o dado está pronto para ser lido).
Dentro da architecture será declarada a máquina de estados que indicará o estado do receptor, juntamente com o signal auxiliar para fazer a leitura do dado. Os estados serão: espera (onde o receptor está esperando o início de uma transmissão), recepção (onde estará recebendo os dados), entrega (onde atribuirá a saída o dado recebido) e erro (onde ficará quando ocorrer erro de transmissão).
O processo principal tem na sua lista de sensibilidade o clock, o reset e o rx (para identificar o start bit). Dentro do processo principal será utilizado o uma variável de contagem para fazer o preescaler e uma para indicar qual bit está sendo lido. A variável flag_ready funciona para indicar o valor de ready e ela se faz necessária devido a impossibilidade de ler valores de saída dentro do código.
A primeira parte do processo descreve o funcionamento quando o botão de reset está pressionado.
Em seguida é implementado a identificação do start bit.
Na rotina principal, primeiramente faz-se a verificação de leitura do dado de saída. Em seguida são declaradas as ações dependendo do estado. Quando está recebendo é necessário fazer o preescaler de 2500, pois a comunicação ocorre a 9600 bits/s, o clock do kit é 24MHz e só está se tomando uma amostra do dado, no centro do pulso. Cada vez que ocorre o estouro de contagem do preecaler o toma-se uma amostra do dado e armazena no signal dado e incrementa-se a variável cont, que indica qual bit está sendo lido. Depois de armazenar o décimo bit, faz-se o teste se o start bit e o stop bit estão corretos, caso estejam o programa segue para o estado entrega, caso não o programa vai para o estado erro.
No estado entrega o programa atualiza o valor do dado de saída verifica se o valor antigo foi lido, se não ele acusa erro de overrun, e sinaliza que o dado está pronto para ser lido. Quando o programa esta no estado erro ele acusa o erro de comunicação e fica esperando o programa ser "resetado". Quando está no estado espera o programa atribui zero a variável responsável por indicar qual o bit esta sendo lido e 1250 ao valor inicial do preescaler, a variável conta, pois na primeira medida é preciso que se conte apenas metade do pulso.
Por ultimo atualiza-se o valor de ready com o da flag ready.
Figura 2: Resultado da Analise e Sintese.
Simulação
A simulação será baseada no envio de dados utilizando os princípios do protocolo RS232 e a verificação de que os dados foram lidos corretamente. Também serão emuladas as situações de erro. Primeiramente fazem-se as declarações dos signals, nesse exemplo serão usados os mesmos nomes utilizados no código fonte.
As primeiras instruções da simulação emulam o pressionamento do botão de reset e os pulsos de clock.
A segunda parte da simulação emula o envio dos dados hexadecimais 55, F0, 0F, 91 e FF, de forma a testar no envio dos dois últimos dados a sinalização de erro. Abaixo segue a programação para o envio do primeiro dado:
As formas de ondas observadas na simulação foram:
Figura 3: Formas de ondas obtidas na simulação.
Estrutura Física
Figura 4: Circuito montado.
Para o funcionamento do projeto é apenas necessário o kit CPLD_7064, mas para teste foi utilizado um kit uCduíno (o programa utilizado está junto aos arquivos de projeto disponíveis no final da página) enviando um número (a cada requisição de envio o microcontrolador incrementa em 1 o número enviado) de forma serial, o CPLD_7064 receberá os dados e apresentará as saídas em duas placas de LEDs (uma apresentará os dados e a outra o sinais de erro) e uma placa de botões controlará os pulsos de reset e leitura. Os fios presente na montagem são responsáveis por: o marrom por interligar o terra das duas placas e o azul pela ligação entre Rx e Tx. O CPLD utlizado foi o EPM7064 da família MAX7000S
Montagem e Roteamento
As placas de LEDs serão colocadas nos conectores CON1 e CON2 e a placa de teclado será conectado no conector CON3, como mostrado nas ilutrações abaixo feitas no software fritizing.
Figura 5: Ligação do kit de LEDs na protoboard.
Figura 6: Conexão da placa de botões.
Utilizando o pino 16 como Rx, a distribuição de pinos do CPLD fica da seguinte forma:
Figura 7: Atribuição de pinos do CPLD.
Gravação e Teste
A gravação do projeto segue os passos descritos no tutorial. Para testar o funcionamento do circuito utilizou-se um kit uCduíno enviando dados para o CPLD e o CPLD mostra os dados nos LEDs, como apresentado no vídeo no início da página.