Buenas nuevamente, gracias MLO por la paciencia.
La verdad que últimamente no doy una de frente... porque ahora no hay forma de que haga la interrupción, hay algún concepto que lo entiendo mal o no se que estoy haciendo y ya no se ni cuantos post del foro me he repasado.
Mi intención era usar el INT_RDA para detectar una entrada de dato en el RS232, pero por lo que he leido no funciona por software (que es como viene configurado el RS232 en la librería del GPS) sino por hardware.
Dicho y hecho, con el force_sw el PIC recibe los datos del GPS pero no hace la interrupción como temíamos.
Vamos a hacerlo por hardware: le quito el force_sw al #use rs232, resultado: LCD en blanco, algo va mal. Incluso si configuro puerto C con el #use fast_io(C) y el set_tris para que C7 sea entrada y C6 salida ( set_tris_c(0b10000000); )pero nada. Estoy usando ahora el C7 como RX y el C6 como TX por que es como vienen en el patillaje del 18F4550.
Cambio de tercio, decido cambiar las patillas a C0 para RX y C1 para TX y no va sin el force_sw, pero configurando el puerto C con el #use fast_io(C) y el set_tris para que C0 sea entrada y C1 salida ( set_tris_c(0b00000001); ) entonces resucita el LCD, se reciben los datos del GPS pero sigue sin hacer la interrupción RDA.
He resumido la interrupción RDA para que simplemente incremente el valor (variable j) y lo muestre en el LCD para simplemente saber que hace la interrupción y a partir de ahi trabajar con la cadena que envíe el GPS. He hecho tantas pruebas en el código que no sé que ejemplo ponerles, con patillas C0 y C1 o con patillas C7 y C6, con o sin force_sw, etcétera. Me gustaría seguir con C7 y C6 por lo que pondré ese ejemplo de código... en este sin el force_sw no recibe nada y como decía necesito que sea por hardware para que funcione la interrupción RDA.
#include <18F4550.h>
#fuses HSPLL, MCLR, PUT, BROWNOUT, BORV43, NOWDT, NOPROTECT, NOLVP
#fuses NODEBUG, USBDIV, PLL1, CPUDIV1, VREGEN, CCP2B3
#use delay (clock=48000000)
int i;
#include <lcd.c> //Incluye las rutinas de manejo del LCD
#include <GPS28500.h> //Incluye funciones de manejo del termómetro IR 28040
#use fast_io(A)
#use fast_io(D)
int8 a=0,j=0;
int8 h0=0,h1=0,m0=0,m1=0,s0=0,s1=0,d0=0;
#INT_RDA
void rda_handler(void)
{ // Interrupción recepción serie USART
j++;
}
#INT_TIMER1
void TIMER1()
{
a++;
}
void main ()
{
lcd_init();
ENABLE_INTERRUPTS(INT_RDA);
SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_8);
ENABLE_INTERRUPTS(INT_TIMER1);
ENABLE_INTERRUPTS(GLOBAL);
while (TRUE)
{
RxGGA(); //Lee las tramas GGA y RMC del GPS
GPS_Time(); //Obtiene la hora de la trama GGA
h1=GPS_Buffer[0];
h0=GPS_Buffer[1];
m1=GPS_Buffer[2];
m0=GPS_Buffer[3];
s1=GPS_Buffer[4];
s0=GPS_Buffer[5]; //Memoriza hora en variables
if (a>=5)
{
a=0;
d0++;
if (d0>9)
{
d0=0;
}
}
lcd_gotoxy(1,1);
printf(lcd_putc,"%1x%1x:%1x%1x:%1x%1x,%u; %u",h1,h0,m1,m0,s1,s0,d0,j);
}
}
La librería del GPS es igual que la inicial pero sin el force_sw en e #use rs232 y cambiando las patillas de C0 a C7 y C6. Realmente C6 no hace falta ya que solo recibimos del módulo GPS).
También he probado quitando todo el código del GPS que hay en el main, por si esa espera de las comunicaciones rs232 no le dejara hacer la interrupción RDA, pero nada... sigue si dar muestras de vida la interrupción RDA.
He estado viendo también las interrupciones por una entrada externa pero digo yo que si hay una interrupción específica para lo que quiero porque voy a andar con experimentos? Aunque si no hay más remedio...
... sigo en ello, gracias anticipadas por cualquier aportación.