HOME      PROJETOS      PROGRAMAÇÃO     

Comunicação entre PIC e PC


O circuito desenvolvido neste projeto permite fazer a comunicação entre a porta serial do PC e a USART do PIC usando algumas macros instruções em linguagem assembler desenvolvidas para essa finalidade.








O Hardware

O circuito proposto usa um integrado MAX232 para fazer a conversão dos sinais que vêm da porta RS232 do PC para o PIC e deste para o PC.

No conector JP1 de 6 pinos, abaixo à esquerda no esquema, temos os sinais Rx (pino 2) e Tx (pino 3) que devem ser ligados aos pinos correspondentes da USART do PIC, isto é, quando estiver usando um PIC16F682A, por exemplo , Rx corresponde ao pino 7 (RB1/RX) e Tx ao pino 8 (RB2/TX).

Os sinais rts ( pino 6 - request to send)) e cts (pino 5 - clear to send) também estão previstos no circuito mas são opcionais e seu uso depende da aplicação.

O pino 1 é o ground e o pino 4 é a alimentação do circuito (5Volts).

Todos os capacitores do circuito são eletrolíticos portanto, a polaridade deve ser cuidadosamente observada conforme mostra o esquema abaixo.

Atenção redobrada deve ser dada ao conector DB9 na hora da soldagem dos cabos pois, na maioria das vezes, as confusões são feitas nesse conector.








Foto da montagem

A foto abaixo mostra a placa montada num circuito impresso:








O Software

Para facilitar a comunicação entre o microcontrolador e o PC, um módulo de serviço com várias macros foi desenvolvido.

Esse módulo suporta somente microcontroladores da família 18F.

As seguintes macros fazem parte desse módulo:

TERM_CONFIG ................. Configura a Usart do PIC.
TERM_NLSTR .................. Posiciona na linha seguinte e envia uma sequência de caracteres ao terminal.
TERM_STR .................... Envia uma sequência de caracteres ao terminal.
TERM_GET .................... Le o teclado e retorna o caracter lido no registrador W.
TERM_PUT .................... Envia o caracter contido no registrador W ao terminal.
TERM_NL ..................... Avança para a próxima linha do terminal.
TERM_CLEAR .................. Apaga a tela do terminal.
TERM_PUTCHAR ................ Envia um caracter ao terminal.
TERM_MSG .................... Define uma string na memória flash.
TERM_SENDMSG ................ Envia a string definida pela macro TERM_MSG.
TERM_READ ................... Le o teclado do terminal.



TERM_CONFIG   bauds, clk, mode, interrupt, intertype

Esta macro configura a USART nos modos sincrono ou assincrono considerando o valor do baud rate desejado para a geração do Baud Rate Generator (BRG). Permite tambem que se faça a opção por gerar a interrupção de Rx. Esta macro habilita a porta serial, o receiver (Rx) e o transmitter (Tx). Esta macro admite os seguintes parâmetros:

bauds ......................... Baud Rate (BPS) desejado (4800, 9600, 19200, etc). clk ........................... frequência do clock em Hertz (Fosc). mode .......................... ASYNH ou "A" - modo assíncrono. SYNCH ou "S" - modo síncrono. interrupt ..................... configura interrupção de Rx. INTERRUPT ou "Y" - com interrupção de Rx. NOINTERRUPT ou "N" - sem interrupção de Rx. intertype ..................... LPRTY ou "L" - interrupção de Rx com baixa prioridade. HPRTY ou "H" - interrupção de Rx com alta prioridade. COMPAT ou "C" - interrupção de Rx no modo normal ou compatível.

EXEMPLO:

Configurar a USART para uma sessão de terminal de 9600BPS em modo assíncrono, não usar interrupção sendo que a frequência de trabalho do microcontrolador é 20MHZ.

    TERM_CONFIG .9600, .20000000, ASYNCH, NOINTERRUPT, COMPAT




TERM_NLSTR

Posiciona na linha seguinte do terminal e envia a string inline na macro.

EXEMPLO:

Envia a mensagem "Isto é um teste" ao terminal.

    TERM_NLSTR "Isto e um teste"

Após a execução da macro teremos:

>                         linha atual > Isto e um teste         após a macro




TERM_STR  "string",   action

Envia a sequência de caracteres "string" para o terminal e executa a ação determinada pelo parâmetro action que pode ser null para permenecer na mesma linha ou nl para avançar para a linha seguinte após a string ter sido enviada ao terminal.

EXEMPLO:

Enviar a string "Isto é um teste" ao terminal e, em seguida, avançar para apróxima linha:

    TERM_STR "Isto e um teste, nl"

Após a execução da macro teremos:

> Isto e um teste         linha atual >                         após a macro




TERM_GET

Lê o teclado do terminal e retorna o caracter lido no registrador W.

EXEMPLO:

Ler o teclado e verificar se o caracter lido é "2":

    TERM_GET     xorlw "2"     btfss STATUS, Z     goto diferente     goto igual




TERM_PUT

Envia, para aposição atual do terminal, o caracter contido no registrador W e permanace na mesma linha.

EXEMPLO:

Envia o caracter "X" ao terminal

    movlw "X"     TERM_PUT




TERM_NL

Avança para a proxima lina do terminal.

EXEMPLO:

    TERM_STR "Mensagem 1", nl ; envia mensagem e avanca p/ proxima linha     TERM_NL ; avança mais uma linha     TERM_STR "Mensagem 2", null ; envia mensagem e fica na mesma linha     TERM_NL ; avança uma linha




TERM_CLEAR

Apaga por completo a tela do terminal.




TERM_PUTCHAR  "char"

Envia, para aposição atual do terminal, o caracter "char" e permanace na mesma linha.

EXEMPLO:

    TERM_PUTCHAR  "B"




TERM_MSG  "string",   action

Define a mensagem "string" na memória de programa (flash) para ser enviada posteriormente pela macro "TERM_SENDMSG", onde a ação determinada pelo parâmetro action pode ser null para permenecer na mesma linha ou nl para avançar para a linha seguinte após a string ter sido enviada ao terminal.

Use esta macro para definir mensagens que serão repetidas várias vezes durante o programa para economizar memória flash.

EXEMPLO:

Definir a mensagem "Isto e um teste" que, após ser enviada, fará com que o terminal permaneça na mesma linha.

    TERM_MSG msg001, "Isto e um teste", null




TERM_SENDMSG  msg_address,  action

Esta macro envia ao terminal, a mensagem definida na macro "TERM_MSG".

O parâmero msg_address é o endereço da mensagem e o parâmetro action pode ser usado para avançar ou permanecer na mesma linha. Como action também já foi definido na macro TERM_MSG, aconselha-se a usar sempre null na macro TERM_SENDMSG.

EXEMPLO:

Definir e enviar a mensagem "Isto e um teste":

    TERM_MSG msg001, "Isto e um teste", nl ; definicao mudando de linha     TERM_SENDMSG msg001, null ; envia a mensagem




TERM_READ  buffer_address,  option

Lê o teclado do terminal e acumula os caracteres lidos no endereço especificado pelo parâmetro buffer_address até que a tecla ENTER seja pressionada.

O parâmetro buffer_address deve ser um endereço na memoria RAM (dados) com capacidade suficiente para conter os dados esperados (máximo 255 bytes). O registrador FSR0 será usado para endereçar o buffer. Não há controle de estouro do buffer.

O parâmetro option pode assumir duas funções:

Se null for especificado em option, o buffer conterá apenas os bytes lidos e o delimitador 0x0D indicando o final da string no buffer. Este modo deve ser usado preferencialmente.

Se SL for especificado em option, o primeiro byte do buffer conterá o número de bytes lido no teclado. Este modo deve ser especificado somente quando se usa o serviço "string_services". Para saber mais sobre os "Serviços de Strings", visite a página Serviços de String ou consulte mais informações no arquivo "string_services.inc" diretamente na pasta do projeto.

EXEMPLO:

kbd_buff RES .64 ; 64 bytes para o buffer de teclado . ; cuidado, nao ha controle de estouro deste buffer . . TERM_CONFIG .9600, .20000000, ASYNCH, NOINTERRUPT, COMPAT TERM_CLEAR ; limpa a tela readnext TERM_NLSTR "Digite uma linha: " ; envia mensagem TERM_READ kbd_buff, null ; le o teclado preenchendo o buffer ate receber um Enter TERM_NL ; posiciona na proxima linha lfsr FSR1,kbd_buff ; FSR1 aponta o inicio do buffer print movf INDF1,w ; pega um caracter do buffer mas nao avanca indexador (FSR1) xorlw 0x0D ; verifica fim do buffer btfsc STATUS,Z ; atingiu o fim do buffer??? goto readnext ; SIM --> proxima leitura movf POSTINC1,w ; NAO --> pega o mesmo caracter do buffer e avanca indexador (FSR1) TERM_PUT ; mostra caracter na tela goto print ; vai pegar o proximo caracter no buffer de leitura






Testando a Comunicação

Para verificar o funcionamento da comunicação entre o PIC e o PC, faça o download do projeto MPLAB.

O projeto foi desenvolvido em torno de um microcontrolador PIC18F4520, usando apenas as portas Rx e Tx da USART, por isso não há a necessidade de mostrar isso num esquema elétrico.

As conexões que partem dos pinos RX e TX do microcontrolador, devem ser levadas, respectivamente, aos pinos 2 (Rx) e 3 (Tx) do circuito do MAX232 mostrado acima.

Após montar o circuito e gravar o programa no PIC, configure uma sessão de Hyperteminal no Windows com as seguintes características:

Porta ....................... qualquer uma (COM1 ou COM2) Baud Rate ................... 9600BPS Numero de bits .............. 8 bits Controle de software......... nenhum Paridade .................... 1 bit Controle de hardware......... nenhum

Conecte o microcontrolador no PC através do circuito montado acima, inicie uma sessão de HyperTerminal do Windows e, assim que aparecer a mensagem "TECLE ENTER", acione a tecla enter várias vezes e verifique se o programa está respondendo conforme mostra a figura abaixo.



No Linux, pode-se testar a comunicação usando-se o programa picocom.

Entre numa console de Linux como root e digite o comando:
picocom   -b 9600  -d 8  -f n  -p 1  /dev/ttyS1

Onde a porta serial /dev/ttyS1 deve ser substituida pela porta serial disponível em sua máquina.

Para descobrir quais são as portas seriais disponíveis no Linux, entre numa console e digite o comando:
ls /dev/ttyS*

Quando o programa iniciar, tecle ENTER na linha de comando e a tela abaixo será exibida.



Tanto no Linux quanto no Windows, o programa só vai mostrar algumas mensagens ao pressionar a tecla ENTER.








Downloads

Todos os arquivos necessários para montar este projeto podem ser baixados aqui.
Talvez seja necessário clicar no link com o botão direito do mouse e em seguida selecionar a opção "Salvar link como...".



Índice dos circuitos




H P S P I N

Desde 04 de Março de 2010

Atualização: 19 de Mar de 2024