#INCLUDE <16f1937.h>
#USE DELAY(CLOCK=16000000)
#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 adres_trama;
#int_RDA
void serial_isr()
{
if (bit_test(PIR1,5))
{
bit_set(led3);
dato=getc();
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;
}
}
}
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 = 0B10100000; // 8 bits para enviar el dato al LCD
TRISD = 0X00;
TRISE = 0;
PORTE = 0;
PORTD = 0;
PORTB = 0;
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]=='V')
{
strcpy(trama1,trama);
printf( "%s \n\r", trama1 );
flag=0;
}
}
}
}
#USE DELAY(CLOCK=16000000)
#FUSES HS,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP segun lo anterior estas usando un cristal externo de 16 megas, pero en el codigo despues pones:OSCCON = 0b01111011; //RELOJ INTERNO A 18MHzy lo ke le pones a OSCCON no coincide con lo ke defines en los FUSES, y eso puede generar problemas con el puerto serial. #use rs232(baud=9600, Parity=N, Bits=8, ERRORS, TIMEOUT=200)creo que si uno define los pines, entonses el pic usa el puerto serial por sofwar, y eso es malo es mejor el puerto serial por hadwar. "ERRORS" lo qe ase es ke si el puerto serial se satura, el pic lo repara. y "TIMEOUT=200" sirve para ke el puerto serial no se kede sentado esperando datos eternamente.#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 ");
}
}
}
if(trama[0]=='$' && trama[1]=='G' && trama[2]=='P' && trama[3]=='R' && trama[4]=='M' && trama[5]=='C' && trama[18]=='V'), if (!bit_test(portb,0) )
{
strcpy(trama1,trama);
printf("DISTANCIA \n\r ");
//printf("\n\r %s " trama1);
bit_set(led4);
flag=0;
} y ahí es donde la USART no recibe más datos (se bloquea). No se si falta configurar algo de la USART o que puede ser lo que pasa. La única trama, el módulo GPS la transmite cada segundo, o sea que hay suficiente tiempo para recibirla. Buscando en el foro encontré que el bit OERR del registro RCSTA, indica cuando se presenta un error en la recepción, pero, si hay error qué puede ser?. Nuevamente pego el código que me presenta el error #INCLUDE <16f1937.h>
//#include <string.h>
#include <math.h>
#USE DELAY(CLOCK=20000000)
#FUSES HS,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
//#fuses NOMCLR
//#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7,ERRORS, TIMEOUT=200)
#use fast_io(c)
#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=3.1416;
//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();
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;
}
}
}
void main()
{
char dato,serial, e=0;
int xbuff=0;
int contador, unid, decena, centena, n, i, j,k=0;
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;
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]=='V')
{
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);
printf("Distancia= %1.4fMts", distancia);
flag=0;
}
}
else
printf("Sin senal \n\r ");
flag=0;
}
}
}
void reset_uart(void)
{
unsigned char temp;
CREN = 0;
while(kbhit()){temp = getc();}
OERR = 0;
FERR = 0;
CREN = 1;
return;
}
#INCLUDE <16f1937.h>
//#include <string.h>
#include <math.h>
#USE DELAY(CLOCK=20000000)
#FUSES HS,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
//#fuses NOMCLR
//#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7,ERRORS, TIMEOUT=200)
#use fast_io(c)
#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=3.1416;
//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();
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;
}
}
}
void main()
{
char dato,serial, e=0;
int xbuff=0;
int contador, unid, decena, centena, n, i, j,k=0;
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;
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) )
{
disable_interrupts(INT_RDA);
disable_interrupts(GLOBAL);
strcpy(trama1,trama);
//printf("DISTANCIA \n\r ");
printf("\n\r %s " trama1);
bit_set(led4);
flag=0;
delay_ms(200);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
}
if(!bit_test(portb,1))
{
disable_interrupts(INT_RDA);
disable_interrupts(GLOBAL);
strcpy(trama2,trama);
printf("\n\r %s " trama2);
flag=0;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
}
}
else
printf("Sin senal \n\r ");
flag=0;
}
}
}
#use rs232(baud=9600, UART1, ERRORS, TIMEOUT=200)