H P S P I N E l e t r ô n i c a D i g i t a l e P r o g r a m a ç ã o d e M i c r o c o n t r o l a d o r e s P I C |
HOME PROJETOS PROGRAMAÇÃO |
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 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.
A foto abaixo mostra a placa montada num circuito impresso:
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
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.
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: 01 de May de 2025 |
![]() |