Académique Documents
Professionnel Documents
Culture Documents
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.
char bufferRx;
boolean dadorecebido = false;
static int indice;
#int_rda
void Le_USART()
{
static unsigned char ch;
void main()
{
int temp;
int end_placa;
int8 end_lido;
for(;;)
{
fico no aguardo.
obrigado!
============================================================================
Olá picprogramer.
if (dadorecebido == true)
{
if (bufferRx == 'A')
{
output_high(RELE1);
}
}
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.
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
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);
}
//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
//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
// flag RCIF (bit 5) do REG PIR1 será setado somente quando a recepção estiver completa
#BYTE PIR1 = 0x0C
#BIT RCIF = PIR1.5
void Usart_Inicializa()
{
Obrigado
============================================================================
Olá picprogramer.
Sugiro vc dar uma olhada em uma tabela ASCII:
http://pt.wikipedia.org/wiki/ASCII
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.
Ola Fernando!
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.
Picprogramer,
Como vc está utilizando o CCS, faça um teste utilizando a rotina "putch()" para enviar os dados via serial:
putch('A');
Certo!?
============================================================================
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)
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
============================================================================
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!
============================================================================
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!
============================================================================