Problema com INT_RDA - PIC 16F628 (Comunicação Serial)

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Problema com INT_RDA - PIC 16F628 (Comunicação Serial)

Mensagempor Nossyla » 16 Ago 2009 08:38

Olá galera ...
Estou com um pequeno problema ... não consigo fazer a interrupção RDA funcionar. Fiz um pequeno circuito só para ver se conseguia atender a esta interrupção, mas até agora nada.

O código em C é seguinte:

cpp code
#fuses HS,NOWDT,NOPROTECT
#include <16f628A.H>
#include <string.h>
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1)

#int_rda
trata(void)
{
output_low(pin_b0);
}

void main()
{
enable_interrupts(int_rda);
printf("Isso funciona\n\r");
output_high(pin_b0);
while(True)
{
output_high(pin_b5);
delay_ms(500);
output_low(pin_b5);
delay_ms(500);
}
}

Deveria Funcionar assim:

Ligo o circuito e ele manda pela serial a frase "Isso Funciona"
Depois ele liga um LED que está conectado no pino B0.
Depois ele entra em loop acendendo e apagando um outro LED conectado no pino B5.
Até ai tudo bem.
Só que quando chegar quarquer coisa pela serial ele deveria apagar o led do pino B0 (pelo tratamento da interrupção RDA).
Essa útima parte não funciona ... já pude comprovar que ele consegue receber dados pela serial nas não atende o tratamento da interrupção.

Por favor me ajudem ...
No guest more
Nossyla
 
Mensagens: 2
Registrado em: 20 Jan 2007 16:31

Mensagempor leoabubauru » 16 Ago 2009 22:17

Olá Nossyla!

Sua rotina de interrupção não está limpando o flag de interrupção nem lendo o conteúdo do registrador de Rx.

A rotina só executará uma vez se o flag não for limpo. Procure por clear_interrupt().

O registrador que recebe os dados da serial RCREG deve ser lido toda vez dentro da interrução, caso contrário corre-se o risco de a serial ficar travada (já aconteceu comigo), perdendo o próximo dado que chegar.

Uma outra coisa: No seu soft você habilitou a int_rda, mas não habilitou a "int geral" (veja no arquivo *.h do 628 a aplicação da função enable_interrupt. Lá tem um símbolo para habilitação GLOBAL - enable_interrupts(GLOBAL)), que é um flag para habilitar o hardware que trata as interrupções, Sem isso nenhuma interrupão funcionará!


Tente isso e poste o resultado aqui.



Laercio
Tento, tento e tento...
Me arrebento!
Também bato!
Ô negocim bunitim essa tal eletrônica de barco!
leoabubauru
Byte
 
Mensagens: 227
Registrado em: 21 Nov 2006 19:08
Localização: São Paulo

Re: Problema com INT_RDA - PIC 16F628 (Comunicação Serial)

Mensagempor HC908 » 17 Ago 2009 08:37

Nossyla escreveu:Olá galera ...
Estou com um pequeno problema ... não consigo fazer a interrupção RDA funcionar. Fiz um pequeno circuito só para ver se conseguia atender a esta interrupção, mas até agora nada.

O código em C é seguinte:

#fuses HS,NOWDT,NOPROTECT
#include <16f628A.H>
#include <string.h>
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1)

#int_rda
trata(void)
{
output_low(pin_b0);
}

void main()
{
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
printf("Isso funciona\n\r");
output_high(pin_b0);
while(True)
{
output_high(pin_b5);
delay_ms(500);
output_low(pin_b5);
delay_ms(500);
}
}

Deveria Funcionar assim:

Ligo o circuito e ele manda pela serial a frase "Isso Funciona"
Depois ele liga um LED que está conectado no pino B0.
Depois ele entra em loop acendendo e apagando um outro LED conectado no pino B5.
Até ai tudo bem.
Só que quando chegar quarquer coisa pela serial ele deveria apagar o led do pino B0 (pelo tratamento da interrupção RDA).
Essa útima parte não funciona ... já pude comprovar que ele consegue receber dados pela serial nas não atende o tratamento da interrupção.

Por favor me ajudem ...


Faltou vc habilitar a interrupção global. corrigi seu codigo acima.
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor Nossyla » 18 Ago 2009 21:11

:D Valeu galera, brigadão ai pela atenção ...
Bastou habilitar a int global e tudo funfou legal ...
Agora deu tudo certo ...
No guest more
Nossyla
 
Mensagens: 2
Registrado em: 20 Jan 2007 16:31

Re: Problema com INT_RDA - PIC 16F628 (Comunicação Serial)

Mensagempor wendelfechinesousa » 24 Fev 2015 16:01

Olá, galera!
Na minha programação quero simplesmente acender um led enviando a letra L e apaga-lo enviando a letra D. O led esta ligado ao pino D1 do microcontrolador PIc 16f877a e eu coloquei um segundo led no pino b5 pra ficar piscando. Alguém pode me ajudar? Não sei o que fiz de errado.

cpp code
#include <16F877A.h>
#device adc=8

#FUSES NOWDT
#FUSES HS
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NODEBUG
#FUSES NOBROWNOUT
#FUSES NOLVP
#FUSES NOCPD
#FUSES NOWRT
#FUSES RESERVED

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

char x;

#int_RDA
void RDA_isr(void)
{
x=getc();
if(x=='L'){
output_high(pin_d1);
}
if(x=='D'){
output_low(pin_d1);
}
}
void(main){
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

output_high(pin_d1);

while(true){
output_toggle(pin_b5);
delay_ms(500);
}


No meu entender, era pro led D1 permanecer aceso até eu enviar a letra 'D', e quando mandasse a letra'L' ele voltasse a acender.
wendelfechinesousa
 
Mensagens: 2
Registrado em: 20 Fev 2015 14:14

Re: Problema com INT_RDA - PIC 16F628 (Comunicação Serial)

Mensagempor ze » 24 Fev 2015 16:52

olá wendel...xxx
veja isso enquanto pode
viewtopic.php?f=1&t=16492
prestes a ser apagado. bom, é um pouco mais do que um pisca led mas pra mim funcionou direitin. é uma maneira manêra de receber dados com [relativa] segurança

num futuro próximo...
vc pode até mesmo localizar a palavra dentro do pacote que vc mesmo vai criar. tipo
Código: Selecionar todos
unsigned const char palavra[] ={STX,'l','i','g','a','  ','l','e','d',ETX);

algo me diz que vai dizer que é iniciante e tal mas.. tentei né...
quando eu crescer quero aprender a localizar e comparar "liga led" usando ponteiro, vetor e tal. ei .. que tal se vc (ou vc que está lendo) me ensinasse?
não ajudei muito, admito. aguarde novas instruções...

abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Problema com INT_RDA - PIC 16F628 (Comunicação Serial)

Mensagempor andre_luis » 24 Fev 2015 20:15

Voce não explicou exatamente o que não está funcionando, se é a recepção serial, ou se é o reconhecimento do comando.
Em todo caso, comparando sua função de recepção com uma outra que eu já fiz, tem uma pequena diferença que não sei se interfere, mas usei a função kbhit() que convenhamos, dentro do vetor de interrução não faria muito sentido, mas segue :

cpp code
#int_RDA
void RDA_isr( void )
{
if ( kbhit() )
{
DadoRecebido = getc() ;
// Faz aqui o que tem de ser feito
}
}


Em todo o caso, eu te sugeriria testar com seu próprio código, primeiro apenas a recepção, pra ver se qualquer byte está chegando:

cpp code
#int_RDA
void RDA_isr(void)
{
x=getc();
output_toogle(pin_d1);
}
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Problema com INT_RDA - PIC 16F628 (Comunicação Serial)

Mensagempor wendelfechinesousa » 25 Fev 2015 10:32

Olá, Andre!!
Obrigado pela força.

A recepção serial esta funcionando perfeitamente, mas não esta reconhecendo quando uso os IF.
Fiz essa programação que vc me mostrou e funcionou perfeitamente.
Código: Selecionar todos
#int_RDA
void  RDA_isr(void)
{
   x=getc();
   output_tootgle(pin_d1);
   delay_ms(500);
}

Mas quando coloco a condição: If(x=='D'){ output_low(pin_d1);} não acontece nada.
O que eu queria era enviar a letra L e o led do pino D1 acendesse e quando enviasse o D ele apagasse.
Já tentei com o kbhit(); mas tbm não funcionou.
wendelfechinesousa
 
Mensagens: 2
Registrado em: 20 Fev 2015 14:14

Re: Problema com INT_RDA - PIC 16F628 (Comunicação Serial)

Mensagempor ze » 25 Fev 2015 13:30

crie seu próprio getc()
Código: Selecionar todos
unsigned char meu_getc()
{
while(!RCIF);//trava tudo
return RCREG; //uma microlida no d.s. vc vai entender de boa
}

e/ou tente comparar com o valor asc mesmo
Código: Selecionar todos
x=meu_getc();
If(x==68) ... //'D'... é a lesma lerda mas....

e prefiro nem comentar sobre o lance de maiúsculo/minúsculo...

ah sim quase ia esquecendo... de nada
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Problema com INT_RDA - PIC 16F628 (Comunicação Serial)

Mensagempor andre_luis » 25 Fev 2015 21:18

Se já está recebendo bytes, então é realmente apenas um problema no IF mesmo.
Um conselho, seria mandar o byte de volta para o PC ( éco )...será que tem problema de paridade / baudrate e tá recebendo outra coisa ???

Algo assim:

cpp code
#int_RDA
void RDA_isr(void)
{
x=getc();
putc(x);
}


Entretanto vi um problema sério no seu código acima, que foi a colocação de um Delay dentro do vetor de interrupção.
A dica do Ze sobre o tamanho das letras, faz parte daqueles problemas que ficamos pastando pra no final perceber que tava tudo funcionando...rsrs
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x