CCS PIC comunicación serial por software

Estoy trabajando con un GPS y un modulo WISMO, y una variable Analoga la idea es medir el consumo de combustible de un vehículo (Variable Análoga) con respecto a la altura (para eso es el GPS) y enviar esa información a un servidor mediante modulo GPRS (WISMOS), todo funciona de maravilla por etapas, pero ya tengo una problema, cuando integro todo, me surge un problema, el GPS genera interrupciones por puerto serial, y el modulo wismo también genera interrupciones por puerto serial, el problema es que no he podido trabajar con interrupciones por software. cuando digo que interrupciones por software me refiero a un puerto diferente al que trae el micro, estoy trabajando en un PIC16F887 en lenguaje C, en el CCS.

Dejo el código de lo que estoy haciendo hasta el momento como son las interrupciones al micro por software. muchas gracias a quien me pueda orientar. http://i10.forosdeelectronica.net/confused.gif:confused:

Código:
#include <16F887.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT
#fuses INTRC_IO                 //oscilador intero
#FUSES PUT                      //Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=8000000)
#use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=GPS) //PUERTO DE HARDWARE
#use rs232(baud=9600,parity=N,xmit=PIN_B1,rcv=PIN_B0,bits=8,stream=WISMO) //PUERTO DE SOFTWARE
#use fast_io(b)

//DEFINICION DE VARIABLES
int1 x=0;
char dato_serial;


#int_EXT
void  EXT_isr(void) 
{
if(kbhit())
{
x=1; //bandera de interrupciones 
dato_serial=getchar();
}
}



void main()
{
   set_tris_b(0b11111010);
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   setup_oscillator(OSC_8MHZ);

 while(true) 
  {
   if((x==1)&&(dato_serial=='O')) //PREGUNTO SI LLEGO LA VOCAL O
   {
   x=0;
   output_toggle(pin_b2);
   }
   }
}
 
Última edición por un moderador:
El problema de utilizar un puerto serie por software es que no tienes la ventaja de la interrupción RDA en ese puerto... podrías utilizar la técnica de "polling" o algo parecido.

Un saludo
 
Una pregunta, ¿Las interrupciones que generan tanto el GPS como el módem, qué es lo que te indican? Es decir, para qué las utilizan?

El GPS entrea una trama que permite identificar posicion en la sup terrestre, hora, altitud con respecto al nivel de mar entre otras cosas lo hace a 4800 baudios, el modulo WISMO al momento de establecer conexion es necesario enviarle algunas instruciones y el va dando respuestas a dichas instrucciones como por ejemplo OK, ERROR, CONNECT etc, el wismo opera a 9600 Baudios
 
Se me ocurre que podrías utilizar la interrupción RDA para el GPS, y vas guardando en variables los datos relevantes que te va entregando, así siempre los tienes actualizados.
#INT_RDA
void recibo (void){
trama=getc();
etc...
}


Y el WISMO en el puerto serie software. Como éste sólo te responde cuando le das comandos, podrías hacer algo del tipo:
printf(wismo, "lo que sea");
estado=getc();
 
Atrás
Arriba