Sería bueno que pongas el programa para ver que puede estar pasando. Aunque sea subir la parte de la interrupción así vemos como manejas las llegadas de datos.
#include <16F628A.h>
#include <string.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code protected from reads
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#use rs232(baud=9600, parity=N, bits=8, xmit=PIN_B2, rcv=PIN_B1) //manejo del RS232
#use fast_io(a)
#use fast_io(b)
char dato, BufferRx[6];
unsigned int i=0;
int1 BanderaComp=0;
//Tramas de 5 caracteres
char disp1[6]="xxxx$", disp2[6]="yyyy$", desactivar[6]="zzzz$";
// Rutina de Interrupcion por RX USART
#int_RDA
void RDA_isr(void)
{
//Caracter de final: $ (HEX: 24)
dato=0x00;
if(kbhit())
{
dato=getc();
}
BufferRx[i]=dato;
i++;
if(dato==0x24)
{
BanderaComp=1;
i=0;
}
}
void comprobacion()
{
disable_interrupts(global);
if(!strcmp(BufferRx, disp1)) //cuando la comparación NO es igual, retorna 1
{
output_high(PIN_B4);
}
if(!strcmp(BufferRx, disp2)) //cuando la comparación NO es igual, retorna 1
{
output_high(PIN_B5);
}
if(!strcmp(BufferRx, desactivar)) //cuando la comparación NO es igual, retorna 1
{
output_low(PIN_B4);
output_low(PIN_B5);
}
enable_interrupts(global);
BanderaComp=0;
BufferRx = 0x00;
}
void main()
{
// Configuración inicial del PIC
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
set_tris_a(0x01);
set_tris_b(0x02);
BufferRx = 0x00;
do
{
//PIC A LA ESPERA POR COMANDO SERIAL
if(BanderaComp)
comprobacion();
}while(TRUE);
}
Los buffer están mal declarados, si vas a guardar 6 caracteres, mínimo debe tener 7 lugares. Y al recibir, asegúrate de colocar el carácter '\0' para indicar finalización del string.
Saludos!
Obviamente eso puede ser un problema verdad?
Claro
#int_RDA
void RDA_isr(void)
{
if(i>6)
{
i=0;
BufferRx = 0x00;
.
.
Hola a todos, estoy teniendo el mismo problema de sauron solo que no me ocurre un desbordamiento (o almenos eso creo).
Realizo la lectura de DNI´s y este mismo me da la orden de iniciar los otros procesos del micro, pero, si por accidente se lee la DNI mientras se empezó a ejecutar un proceso del micro este se bloquea.
(Los datos de la DNI llegan por usart)
He deshabilitado las interrupciones intentando que solo funcione la interrupción por serial mientras se solicita la DNI pero aun asi, sigue sin funcionar.
El código del programa completo es extenso asi que pondré una parte y si alguien puede ayudarme y considera necesario otra, estaré atento.
GraciasCódigo: CSS
#int_rda void serial(){ if(kbhit(hardw)){ for (k=0;k<80; k++){ trama[k]=getchar(hardw); if(trama[k]==9){ nueve++; if(nueve==5){ if(trama[k-1]==9){ error=1; }else{ error=0; } } } if(trama[k]==10){ trama[k]=0; break; } } } permiso=1; }
así es como ejecuto la lectura del puerto y lo almaceno en el buffer llamado "Trama".