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);
}
}
}