Vous êtes sur la page 1sur 7

Receber dados pela Serial

Postado por picprogramer - 2009/08/10 16:57


_____________________________________

Pessoal,

estou com uma duvida na comunicação serial do PIC16F88. Estou usando a serial do hardware por meio de interrupção.

Estou fazendo a simulação no protheus usando o virtual terminal e quando eu digito um caracter e mando... eu recebo
esse caracter.

Minha duvida é como saber o que estou recebendo. Quando envio o caracter A, fiz uma rotina para acionar um rele
porem não consigo entrar nessa rotina de jeito nenhum. Ja comparei com o hexa da tabela ASCII da letra A, com ele em
decimal, com a letra A e nada.

O que pode estar errado?

Segue o trecho do software com a leitura serial.

char bufferRx;
boolean dadorecebido = false;
static int indice;

#int_rda
void Le_USART()
{
static unsigned char ch;

// inicio o indice do buffer


indice = 0;

ch = getc(); //Pega o caracter no registrador da UART.


dadorecebido = true;
bufferRx = ch; //Guarda o caracter no buffer.

void main()
{
int temp;
int end_placa;
int8 end_lido;

enable_interrupts(int_rda); //Habilita interrupção de recebimento.


enable_interrupts(GLOBAL); //Habilita registrador de interrupção.

//seto as direções dos pinos


set_tris_a(0x0f);
set_tris_b(0x04);

for(;;)
{

// executa informação vindo da interrupção USART


if (dadorecebido == true)
{
if (bufferRx == 0x61)
{
output_high(RELE1);
}
Fórum Embarcados - Portal Embarcados _FB_PDF_VERSION _FB_PDF_DATE
}

}// fim do FOR


}//FIM

fico no aguardo.

obrigado!
============================================================================

Re:Receber dados pela Serial


Postado por fernandobrasuca - 2009/08/13 21:04
_____________________________________

Olá picprogramer.

Sugiro vc utilizar a seguinte rotina no loop infinito:

if (dadorecebido == true)
{
if (bufferRx == 'A')
{
output_high(RELE1);
}
}

Teste e veja se funcione...


T+
============================================================================

Re:Receber dados pela Serial


Postado por picprogramer - 2009/08/17 18:28
_____________________________________

Então fiz algumas mudanças no software e agora estou recebendo e transmitindo porem fiz testes no hyperterminal e
sempre esta transmitindo em HEX FC ... e eu estou enviando 'A' ou 0x01. Pra receber... eu sei o que recebo mas não é
oque estou enviando via hyperterminal.

Segue o novo codigo.

main.c

#include
#include
#include

#fuses HS
#fuses NOWDT
#fuses PUT
#fuses NOBROWNOUT
#fuses DEBUG

#use delay(clock=4000000)

#use rs232(baud=19200,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8)

#use FAST_IO(A)
#use FAST_IO(B)
Fórum Embarcados - Portal Embarcados _FB_PDF_VERSION _FB_PDF_DATE
// Endereços das portas
#byte porta = 0x05
#byte portb = 0x06

#define RELE_A PIN_B4


#define RELE_B PIN_B3
#define JUMP1 PIN_A1
#define JUMP2 PIN_A0
#define LED PIN_A4

void InicializaConf()
{
//seto as direções dos pinos
set_tris_a(0x0f); // LSB = entrada // MSB = SAIDA
set_tris_b(0x04); // bit 2 entrada (RX) restante saida
output_low(LED); // inicializo o LED apagado
output_low(RELE_A);
output_low(RELE_B);
}

// ------------------------------------- MODULO PRINCIPAL --------------------------------------------//


void main()
{
int8 dado;
// carrega as configurações iniciais
InicializaConf();

//Inicializo USART
Usart_Inicializa();

dado = 0x00;

Usart_Transmite(0x01);

for(;;)
{

if (dado == 0x03)
{
output_high(LED);
}
}

Agora o usart.c

#device PIC16F88
#include

//DEFINICOES de REGISTRADORES

Fórum Embarcados - Portal Embarcados _FB_PDF_VERSION _FB_PDF_DATE


//Transmissão
#BYTE TXSTA= 0x98
#BIT CSRC= TXSTA.7
#BIT TX9= TXSTA.6
#BIT TXEN= TXSTA.5
#BIT SYNC= TXSTA.4
#BIT BRGH= TXSTA.2
#BIT TRMT= TXSTA.1
#BIT TX9D= TXSTA.0

//Recepção
#BYTE RCSTA= 0x18
#BIT SPEN= RCSTA.7
#BIT RX9= RCSTA.6
#BIT SREN= RCSTA.5
#BIT CREN= RCSTA.4
#BIT ADDEN= RCSTA.3
#BIT FERR= RCSTA.2
#BIT OERR= RCSTA.1
#BIT RX9D= RCSTA.0

#BYTE SPBRG = 0x99


#BYTE TXREG= 0x19
#BYTE RCREG= 0x1A

// flag RCIF (bit 5) do REG PIR1 será setado somente quando a recepção estiver completa
#BYTE PIR1 = 0x0C
#BIT RCIF = PIR1.5

//------------------------------- Inicialização da USART ----------------

void Usart_Inicializa()
{

// seleciona o modo do gerador de baud rate


BRGH = 1; // HIGH SPEED

//Supondo FOSC = 4Mhz (tabela do DataSheet), então

SPBRG = 25; // Para BaudRate = 9600

// seleciona o modo assíncrono (TXSTA)


SYNC = 0;

// habilita a USART (RCSTA)


SPEN = 1;

// seleciona o modo de 8 bits (TXSTA)


TX9 = 0;

// ativa o transmissor da USART (TXSTA)


TXEN = 1;

// seleciona modo de recepção 8BITS


RX9 = 0;

// seleciona modo de recepção continuo


CREN = 1;
}
Fórum Embarcados - Portal Embarcados _FB_PDF_VERSION _FB_PDF_DATE
// ------------------------------- Transmissão USART -----------------------
void Usart_Transmite(char dado)
{
//while (TRMT == 1)
//{
TXREG = dado;
//}

// ------------------------------- Recepção USART ------------------------


char Usart_Recebe()
{
int8 dado_lido;

//verifica se a recepção esta completa ( RCIF é setado)


while (RCIF == 1)
{
dado_lido = RCREG;// dado_lido recebe caractere LIDO
return dado_lido;
}
}

Alguem pode me dar um toque?

Parece nao ter nada errado...

Como posso testar a Serial bem?

Obrigado
============================================================================

Re:Receber dados pela Serial


Postado por fernandobrasuca - 2009/08/18 10:05
_____________________________________

Olá picprogramer.
Sugiro vc dar uma olhada em uma tabela ASCII:

http://pt.wikipedia.org/wiki/ASCII

Veja que o HEXADECIMAL de 'A' é 0x41.


Logo, para vc ver no hyperterminal o 'A' vc deve usar o comando:

Usart_Transmite(0x41);

ou

Usart_Transmite('A');

Veja também que o caracter que vc está esperando "dado == 0x03" é o "End of Text". Não sei como vc envia esse
caracter utilizando o hyperterminal.

Pergunta: Pelo a sintax do seu código, vc está utilizando o CCS!?


============================================================================
Fórum Embarcados - Portal Embarcados _FB_PDF_VERSION _FB_PDF_DATE
Re:Receber dados pela Serial
Postado por picprogramer - 2009/08/18 15:33
_____________________________________

Ola Fernando!

Exato... estou compilando com CCS.

O problema na verdade é que eu to enviando dessa forma que você falou e no hyper sempre aparece FC em HEX ou
em decimal 252 independente do que eu envio... esta enviando e recebendo ... porem nao é o o dado que estou
enviando.

Estranho... e o codigo aparentemente esta correto.


============================================================================

Re:Receber dados pela Serial


Postado por fernandobrasuca - 2009/08/18 17:49
_____________________________________

Picprogramer,

Como vc está utilizando o CCS, faça um teste utilizando a rotina "putch()" para enviar os dados via serial:

putch('A');

Só pra confirmar, vc está utilizando o Hyperterminal com a seguinte configuração:

19200, No Parity, No Flow Control, 1 Stop bit

Certo!?
============================================================================

Re:Receber dados pela Serial


Postado por picprogramer - 2009/08/18 17:55
_____________________________________

Fernando,

então eu no comeco desconfiei dos parametros do hyperterminal e fiz o teste com outros softwares.

Na verdade o software parece estar correto e estava... o que eu estava definindo errado era a diretiva:

#use delay(clock=10000000)

meu clock externo é de 10Mhz e eu estava definindo 4.

Corrigi isso e removi a diretiva do RS232... pois estou usando a USART... e esta funcionando tanto recepção quanto
transmissão.

O que você diz sobre usar a interrupção da USART pra receber o dado... ou deixo como esta?

Aguardo
Obrigado
Abraco
============================================================================

Re:Receber dados pela Serial


Postado por fernandobrasuca - 2009/08/18 19:44
_____________________________________

Fórum Embarcados - Portal Embarcados _FB_PDF_VERSION _FB_PDF_DATE


Ufff... Muito Bom Picprogrammer, bug encontrado!

Quanto a usar ou não a interrupção da USART, vc tem que analisar a sua necessidade. Particularmente, eu procuro
sempre utilizar, pois assim o programa não fica preso esperando receber algum dado. Mas tudo depende da
necessidade do seu programa.

Como vc está inciando, eu aconselharia vc a utilizar a interrupção, ao menos, pra entender direitinho como funciona!

Abraços e Parabéns!
============================================================================

Re:Receber dados pela Serial


Postado por Pasquetto - 2009/09/01 18:28
_____________________________________

Ola ..

Sou novo em PIC, porém estou fazendo um grande projeto pela universidade, e ja finalizei a comunicação serial entre 2
PICs .. e o PC, mas estou tentando fazer o PC e o PIC se comunicarem via USB... enfim..

Usei para programar o MikroC .. ele possue varias classes prontas, basta chamar a função... MUITO simples..

Acredito que se vc migrar para o MikroC irá fazer a comunicação em menos de 20 minutos:)

Abrs!
============================================================================

Fórum Embarcados - Portal Embarcados _FB_PDF_VERSION _FB_PDF_DATE

Vous aimerez peut-être aussi