Página 1 de 2

Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 25 Mar 2021 18:34
por erpgc82
Pessoal, estou tendo um problema aqui e não estou conseguindo resolver, ainda estou em fase de aprendizado e não sei o que ocorre, se é algum bit de algum registrador de transmissão que devo limpar, se é a interrupção serial que preciso limpar clear_interrupts(INT_RDA);. Já fiz de tudo e nada da certo.

Aqui está apenas um pedaço do código, já estou utilizando 66% de um 16F876a.

Hoje já consigo pegar a string que chega no RX(hardware) faço o que tenho que fazer com ela e envio para o pc via TX(hardware) e isso funciona perfeitamente.
A variável resposta, se ela for 1(TRUE) quando o PIC lê sensores/pinos de entrada, ela deve enviar um determinado caracter para o PC, só que ao fazer isso a interrupção serial #INT_RDA para de funcionar.

Se a variável resposta, for 0(FALSE), ou seja, nunca envie caracter para o PC, a interrupção serial funciona perfeitamente. Observação¹: ela sempre para quando chega um determinado numero de caracteres, e em seguida logo após uma determinada função que demora uns 5 segundos pra ocorrer, a interrupção serial é reativada e isso funciona PERFEITAMENTE.
Não estou conseguindo saber porque trava/para após enviar um caracter ao PC. Observação²: Sempre que envio um caracter ao computador a interrupção serial está ativada (ao menos era pra estar) pois até então o PIC não leu nada dela e então não foi desativada.

cpp code
#include <16F876a.h> 
#case
#use delay(clock=10000000)

#fuses HS,NOWDT, PUT, BROWNOUT, NOLVP
#use rs232(baud=9600, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8, stop=1, ERRORS)

int1 resposta=1;
char X='X';
char Y='Y';

#INT_RDA
void serial_isr()
{
restartRS232(); // Está aqui desnecessariamente
int t;

buffer[next_in]=getc();
t=next_in;
next_in=(next_in+1)%BUFFER_SIZE;
if(next_in==next_out) next_in=t;
}

BYTE bgetc()
{
BYTE c;
while(!bkbhit);
c=buffer[next_out];
next_out=(next_out+1)%BUFFER_SIZE;
return(c);
}

void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);

while(TRUE)
{
if(bkbhit)
{
c=bgetc();
if(c=='0')
{
key_card=TRUE;
limpa_teclado();
output_high(BEEP);
delay_ms(40);
output_low(BEEP);
barcode_buffer[0]=c;
barcode_buffer[1]=bgetc();
barcode_buffer[2]=bgetc();
barcode_buffer[3]=bgetc();
barcode_buffer[2]=0;
printf("%c%c%c%c%c%cC\n\r",barcode_buffer[0],barcode_buffer[1],barcode_buffer[2],barcode_buffer[3]);
d_int_rda=FALSE;
disable_interrupts(INT_RDA);
codigo_lido();
}
/*******************************************************************************************/
if((resposta)&&(!input(SENSOR_S))) printf("%c\r\n",X);
if((resposta)&&(!input(SENSOR_E))) printf("%c\r\n",Y);
}
}
}

Re: Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 25 Mar 2021 22:02
por tcpipchip
barcode_buffer[1]=bgetc();
barcode_buffer[2]=bgetc();
barcode_buffer[3]=bgetc();

Tenho impressao que aqui ainda não chegaram os N caracteres...

Re: Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 25 Mar 2021 23:20
por erpgc82
tcpipchip escreveu:barcode_buffer[1]=bgetc();
barcode_buffer[2]=bgetc();
barcode_buffer[3]=bgetc();

Tenho impressao que aqui ainda não chegaram os N caracteres...


Olá tcpipchip

Este código que enviei, é apenas um exemplo, um pedaço do código completo.
A questão é que tudo funciona normalmente, até que o código faça um simples printf("X") por exemplo, então ao voltar a exibir a mensagem padrão no visor, era para re-habilitar a função enable_interrupts(INT_RDA); mas não volta a funcionar a INT_RDA, então será que algum problema com registrador de transmissão travando o registrador responsável pelo registrador de recepção? Desculpe a ignorancia mas sou novo em programação

Re: Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 26 Mar 2021 07:55
por eletroinf
Que compilador está usando? Ele limpa os flags de interrupção?

Re: Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 26 Mar 2021 08:03
por KrafT
Ele está usando CCS e uma "espécie de camada HAL" da CCS para manusear a recepção de transmissão de dados.

Acho que o problema dele é tentar usar a biblioteca sem entender como funciona.

Outra coisa que dá para observar é que não tem um protocolo adequado, um header de identificação do pacote, timeout/caracter de controle, checksum, etc. Prato cheio para dar incomodação.

Eu sequer entendi pq ele desabilita a interrupção da porta serial... eu iria propor a ele nunca desabilitar isso.

Re: Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 26 Mar 2021 13:17
por erpgc82
eletroinf escreveu:Que compilador está usando? Ele limpa os flags de interrupção?

CCS

Re: Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 26 Mar 2021 13:19
por erpgc82
KrafT escreveu:Ele está usando CCS e uma "espécie de camada HAL" da CCS para manusear a recepção de transmissão de dados.

Acho que o problema dele é tentar usar a biblioteca sem entender como funciona.

Outra coisa que dá para observar é que não tem um protocolo adequado, um header de identificação do pacote, timeout/caracter de controle, checksum, etc. Prato cheio para dar incomodação.

Eu sequer entendi pq ele desabilita a interrupção da porta serial... eu iria propor a ele nunca desabilitar isso.


Realmente estou programando a 1 ano apenas, ainda estou aprendendo.
Este projeto faz uma leitura de um código que chega no RX, e enquanto estiver fazendo algumas coisas/comandos, mesmo que chegue outro seria ignorado, por isso a interrupção serial é desabilitada e depois re-habilitada novamente.

Re: Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 26 Mar 2021 13:39
por KrafT
erpgc82 escreveu:Realmente estou programando a 1 ano apenas, ainda estou aprendendo.
Este projeto faz uma leitura de um código que chega no RX, e enquanto estiver fazendo algumas coisas/comandos, mesmo que chegue outro seria ignorado, por isso a interrupção serial é desabilitada e depois re-habilitada novamente.


Parabéns por estar estudando e é normal passar por dificuldades.

Bom, eu não desabilitaria a interrupção, pois o hardware vai receber os eventuais dados de qualquer forma e eventualmente gerar uma interrupção indesejada quando vc a habilitar, por causa dos dados antigos. Verifique se vc apagou o flag de recepção antes de ativar a interrupção novamente.

Você tem um debugger? É uma mão na roda.... Eu me viciei tanto em debugger que nem cogito usar um processador que não tenha suporte para isso.

Confesso que esse mecanismo de stream da porta serial da CCS me causa embrulho no estômago, prefiro escrever as minhas próprias rotinas. Claro que num processador mais complexo, como ARM, essa abordagem não é recomendada.

Re: Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 26 Mar 2021 13:53
por eletroinf
Coisas que eu lembro vagamente, a verificar aí:
Se não me engano tem alguns detalhes como por exemplo limpar o buffer da serial (no caso quando a int está desabilitada pode estar recebendo alguma coisa e daí quando esta é ligada novamente é necessário um procedimento para limpar o buffer de RX).
Verificar a questão de limpeza dos buffer.
Antes de ligar a interrupção verificar se está tudo "limpo".
Como disse o kraft, se fosse meu projeto eu não desligava a interrupção, deixava acontecendo.

Ver se não está indo além do tamanho dos buffers nos vetores, isto é, sobrescrevendo outras variáveis...
Enfim, eu não olhei o código, só estou citando os principais fatores que causam este tipo de problema.

Re: Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 26 Mar 2021 16:06
por erpgc82
KrafT escreveu:
erpgc82 escreveu:Realmente estou programando a 1 ano apenas, ainda estou aprendendo.
Este projeto faz uma leitura de um código que chega no RX, e enquanto estiver fazendo algumas coisas/comandos, mesmo que chegue outro seria ignorado, por isso a interrupção serial é desabilitada e depois re-habilitada novamente.


Parabéns por estar estudando e é normal passar por dificuldades.

Bom, eu não desabilitaria a interrupção, pois o hardware vai receber os eventuais dados de qualquer forma e eventualmente gerar uma interrupção indesejada quando vc a habilitar, por causa dos dados antigos. Verifique se vc apagou o flag de recepção antes de ativar a interrupção novamente.

Você tem um debugger? É uma mão na roda.... Eu me viciei tanto em debugger que nem cogito usar um processador que não tenha suporte para isso.

Confesso que esse mecanismo de stream da porta serial da CCS me causa embrulho no estômago, prefiro escrever as minhas próprias rotinas. Claro que num processador mais complexo, como ARM, essa abordagem não é recomendada.



Então Kraft, só encontrei livros de CCS, estou com 5 aqui...
Eu ainda vou re-ler(re-estudar) no minimo mais uma vez cada um dos 5 do CCS, pois já estou com quase 40 anos e sempre trabalhei com eletrônica e desenhos de PCB a mais de 20 anos. Ou seja, estou 20 anos atrasado com firmware.

Pra quem começou agora até que estou razoável, fiz um programa funcionar, utilizando 66% da flash desse 876a, o motivo que vou re-estudar é que utilizei apenas if, else, for, while, funções básicas sem parametros, switch case... Ainda não usei na pratica( por não ter entendido muito bem) enumeração, strutura, ponteiros endereços e valores de um endereço... Tem muita coisa pra entrar na cabeça, acho que mais jovem aprenderia com mais facilidade.

Mas enfim, sobre esse problema aí que voce disse, ao desabilitar a interrupção serial, o que vier durante o periodo que ela estiver desabilitada nao causa nenhum problema, é muito bom essa função do CCS disable_interrupts(INT_RDA); a questão mesmo é que durante o periodo que ela está desativada, se o pic enviar(tx) algum caracter para o software pc ele vai normalmente, mas ao reabilitar enable_interrupts(INT_RDA) ela não volta a funcionar.

vou tentar então nao desabilitar e apenas usar uma flag para apagar o que vier...
Obrigado por enquanto! abço

Re: Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 26 Mar 2021 16:12
por erpgc82
eletroinf escreveu:Coisas que eu lembro vagamente, a verificar aí:
Se não me engano tem alguns detalhes como por exemplo limpar o buffer da serial (no caso quando a int está desabilitada pode estar recebendo alguma coisa e daí quando esta é ligada novamente é necessário um procedimento para limpar o buffer de RX).
Verificar a questão de limpeza dos buffer.
Antes de ligar a interrupção verificar se está tudo "limpo".
Como disse o kraft, se fosse meu projeto eu não desligava a interrupção, deixava acontecendo.

Ver se não está indo além do tamanho dos buffers nos vetores, isto é, sobrescrevendo outras variáveis...
Enfim, eu não olhei o código, só estou citando os principais fatores que causam este tipo de problema.



Então eletroinf, é o que eu disse, vou realmente trabalhar sem desabilitar (seguindo a orientação de voces) testar na verdade, pois o funcionamento com a interrupção desabilitada fica muito TOP, SHOW, PERFECT... mas a questão é que não enviando nenhum caracter no intervalo que ela está desabilitado, pode chegar no RX o que for que não ocorre nada, ao reabilitar volta do zero... acredito que a propria função do ccs ja deve limpar tudo... SÓ ESSE PROBLEMA MESMO QUANDO ALGUM CARACTER É ENVIADO DURANTE O PERIODO QUE ELA ESTÁ DESABILITADA.

Mas enfim, vou testar aqui, obrigado pelas dicas

Re: Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 26 Mar 2021 16:38
por eletroinf
Continuando as possibilidades:
Trava o funcionamento da interrupção ou trava o programa total? Se o programa continua funcionando, tu pode ver um jeito de mostrar os bits dos registradores da serial, até mesmo os flags de hardware de interrupção da serial e de erro. Tem um display no projeto pra fazer isso? Tem debug? Se tem debug é bem fácil de ver. Se não tem debug... só lamento.

Re: Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 26 Mar 2021 17:00
por erpgc82
eletroinf escreveu:Continuando as possibilidades:
Trava o funcionamento da interrupção ou trava o programa total? Se o programa continua funcionando, tu pode ver um jeito de mostrar os bits dos registradores da serial, até mesmo os flags de hardware de interrupção da serial e de erro. Tem um display no projeto pra fazer isso? Tem debug? Se tem debug é bem fácil de ver. Se não tem debug... só lamento.


Ola eletroinf, trava o funcionamento apenas da interrupção serial

Acabei de testar aqui, e o problema não é nem a interrupção, configurei agora para NUNCA a interrupção serial ser desabilitada, e mesmo assim, ao enviar um caracter qualquer ex: printf("x") para o pc/software a interrupção para de funcionar, realmente não sei o que está havendo, vou deixar isso de lado e depois volto, pois preciso enviar caracteres para o pc/software.

No 16f876 tem Debug, ainda nao tenho experiencia com isso... vou testar com o pickit3 dentro do mplab, ver se acontece algo E SE ENTENDEREI TAMBEM.

Re: Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 27 Mar 2021 17:51
por erpgc82
Consegui resolver :D

Re: Interrupção serial trava após enviar caracter ao PC

MensagemEnviado: 27 Mar 2021 19:21
por eletroinf
Agora vai dizer o que era o problema, néh?! :mrgreen: :mrgreen: