Hola estoy realizanzo una comuniacion serie entre pics, y he adaptado el protocolo NMEA de los GPS, mandando los datos en una cadena, desde el emisor, y descomponiendola en el receptor, he hecho un programa sencillito en visual basic, para mandar la cadena con diferentes valores, el caso es que tengo el programa, hecho con el compilador CCS 4.057, uso la INT_RDA, en el proteus funciona perfectamente el codigo, ya se que esto no es determinante, pero me extraña que al grabarlo en el PIC, no haya manera, he echo pruebas mandando mensajes a la LCD, por el puerto serie y recibo todo. He llegado a la conclusion que el fallo es de la INT_RDA, pero no se como solucionarlo, os adjunto el codigo para que le hecheis un vistazo y me ayudeis lo antes posible gracias.
#include <16f876.h>
#fuses HS,WDT,NOPROTECT,NOLVP,NOBROWNOUT,PUT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
//LIBRERIAS
#include <lcd2.c>
#include <string.h>
#include <stdlib.h>
char pers;
int16 dist_pers;
char sen;
int16 cod_sen;
int16 dist_sen;
int16 dist_v1;
int16 dist_v2;
char veh;
int16 cod_veh;
char buffer[2];
int comaCount;
int posCount;
char headerBuffer[6];
int i;
#byte PIR1 = 0x0c
#byte SPBRG = 0x99
#byte RCSTA = 0x18
#byte TXREG = 0x19
#byte RCREG = 0x1A
#byte TXSTA = 0x98
#bit TXIF = PIR1.4
#bit RCIF = PIR1.5
#bit CREN = RCSTA.4
#int_rda
void serial_isr() {
char rxData;
char s[6];
rxDATA=0x00;
if(kbhit()){
rxData=getc();
if(rxData!=0x00){
if (comaCount == 0) {
if (posCount == 0) {
if (rxData == '$') {
headerBuffer[0] = '$';
posCount++;
}
}
else {
if (rxData == ',') {
comaCount++;
posCount = 0;
}
else {
headerBuffer[posCount] = rxData;
posCount++;
}
}
}
else {
strcpy(s, "$ARGOS");
if (strncmp(headerBuffer, s, 6) == 0) {
if (rxData == ',') {
comaCount++;
posCount = 0;
if (comaCount > 9) {
comaCount = 0;
}
}
else {
switch (comaCount) {
case 1: pers = rxData;
posCount++;
break;
case 2: buffer[posCount] = rxData;
dist_pers = atoi(buffer);
posCount++;
break;
case 3: sen = rxData;
posCount++;
break;
case 4: buffer[posCount] = rxData;
cod_sen = atoi(buffer);
posCount++;
break;
case 5: buffer[posCount] = rxData;
dist_sen = atoi(buffer);
posCount++;
break;
case 6: buffer[posCount] = rxData;
dist_v1 = atoi(buffer);
posCount++;
break;
case 7: buffer[posCount] = rxData;
dist_v2 = atoi(buffer);
posCount++;
break;
case 8: veh = rxData;
posCount++;
break;
case 9: buffer[posCount] = rxData;
cod_veh = atoi(buffer);
posCount++;
break;
default: posCount = 0;
comaCount = 0;
break;
for (i=0;i<2;i++)
buffer[i] = 0x00;
}
}
}
rxData=0x00;
}}}}
void main() {
enable_interrupts(global);
enable_interrupts(int_rda);
lcd_init();
do{
if (pers == 'N'&&sen == 'N'&&veh == 'N'){
lcd_putc("\f");
}
if (pers == 'P'){
lcd_gotoxy(1,1);
printf(lcd_putc,"P:%C DP:%lu",pers,dist_pers);
}
if (sen == 'S'){
lcd_gotoxy(1,1);
printf(lcd_putc,"S:%C CS:%lu DS:%lu",sen,cod_sen,dist_sen);
lcd_gotoxy(1,2);
printf(lcd_putc,"DTV1:%lu DTV2:%lu",dist_v1,dist_v2);
}
if (veh == 'V'){
lcd_gotoxy(1,1);
printf(lcd_putc,"V:%C CV:%lu"veh,cod_veh);
}
} while (TRUE);
}