Gracias Rodrigo por su respuesta
Decepcionado, los problemas persisten, a veces me trabaja bien por un tiempo y se bloquea, sobre todo cuando intento imprimir la trama (siempre se bloquea); cuando intento imprimir un letrero diferente a la trama me trabaja bien, pero por un tiempo.
Sobre el reloj, decidí trabajar con el oscilador externo (20Mhz). Parece que problema es de hardware. Les pego el nuevo código con otras cosas más que le agregué. La configuración del serial no me funcionó. Gracias
#INCLUDE <16f1937.h>
//#include <string.h>
#include <math.h>
#USE DELAY(CLOCK=20000000)
#FUSES HS,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#BYTE TRISA = 0X08c
#BYTE TRISB = 0X08d
#BYTE TRISC = 0X08e
#BYTE TRISD = 0X08f
#BYTE TRISE = 0X90
#BYTE PORTA = 0x0c
#BYTE PORTB = 0x0d
#BYTE PORTC = 0x0e
#BYTE PORTD = 0x0f
#BYTE PORTE = 0x10
#BYTE ANSELE = 0x190
#BYTE ANSELB = 0x18D
#BYTE ANSELA = 0x18C
#BYTE LATE = 0x110
#BYTE ADCON0 = 0x9D
#BYTE ADCON1 = 0x9E
#BYTE OSCCON = 0x99
#BYTE PIR1 = 0x11
#define led4 portd,7
#define led3 portd,6
#define led2 portd,5
#define led1 portd,4
#define an2 porte,2
#define an1 porte,1
#define an0 porte,0
#define sw3 portb,2
#define sw2 portb,1
#define sw1 portb,0
///////////////////////////////////
/////// PROGRAMA PRINCIPAL ////////
///////////////////////////////////
int1 flag=0;
int1 flag1=0;
char trama[70];
char trama1[70];
char trama2[70];
char dato;
int8 gradosLa, minutosLa, gradosLo, minutosLo, gradosLa2, gradosLo2, minutosLa2, minutosLo2;
int16 segundosLa, decimal, segundosLo, segundosLa2, segundosLo2;
float distancia;
//char Config_GPS[]="$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"
int8 adres_trama;
#int_RDA
void serial_isr()
{
if (bit_test(PIR1,5))
{
bit_set(led3);
dato=getc();
//putc(dato);
switch(dato)
{
case 13:
adres_trama=0;
flag=1;
break;
case 10:
break;
default:
trama[adres_trama]=dato;
adres_trama++;
trama[adres_trama]=0;
break;
//}
//gets(trama);
//bit_set(led3);
//flag=1;
}
}
}
void main()
{
char dato,serial, e=0;
int xbuff=0;
int contador, unid, decena, centena, n, i, j,k=0;
//OSCCON = 0b01111011; //RELOJ INTERNO A 18MHz
TRISA = 0X01; //RA0 Entradntena,n,i,j;a.
ADCON0 = 0B00000001; //Chanel AN0
ADCON1 = 0XA0; //ADFM = 1 Justificado a la derecha ADCS = 010; Fosc / 32 Garantiza el tiempo de conversion minimo
ANSELA = 0X01; //ANSA0 = 1 AN0 es entrada analoga.
ANSELB = 0;
TRISB = 0X0F;
TRISC = 0B10000000; // 8 bits para enviar el dato al LCD
TRISD = 0X00;
TRISE = 0;
PORTE = 0;
PORTD = 0;
PORTB = 0;
Printf("$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29\n\r");
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(true)
{
bit_clear(led3);
bit_set(led1);
if (flag == 1)
{
if(trama[0]=='$' && trama[1]=='G' && trama[2]=='P' && trama[3]=='R' && trama[4]=='M' && trama[5]=='C' && trama[18]=='A')
{
if (!bit_test(portb,0) )
{
strcpy(trama1,trama);
printf("DISTANCIA \n\r ");
//printf("\n\r %s " trama1);
bit_set(led4);
flag=0;
}
else if(!bit_test(portb,1))
{
strcpy(trama2,trama);
//distancia = sqrt((segundosLa - segundosLa2)*1.11 / 0.036) + ((segundosLo - segundosLo2)*1.11 / 0.036)*((segundosLo - segundosLo2)*1.11 / 0.036);
//printf("Distancia= %3.3fMts", distancia);
}
}
else
printf("Sin senal \n\r ");
}
}
}