Autor Tema: Solo me detecta la primera trama enviada por RS232  (Leído 1956 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado gapsna

  • PIC10
  • *
  • Mensajes: 20
Solo me detecta la primera trama enviada por RS232
« en: 28 de Febrero de 2011, 00:29:22 »
Holas a todos, ando "simulando" la conexion de un pic 18f4455 con un gps, por ahora, como no tengo el cps estoy mandando las mismas tramas que envia este (tomadas de uno real de la universidad) mendiante el puerto serial de un pc. El problema es que si envio una sola trama, me la recive, y separa los 2 datos que nesecito, latitud y longitud, y los imprime, el problema es que a penas envio una segunda trama, no hace nada, no actualiza los datos. No he podido encontrar el error, a alguno de ustedes le ha pasado esto??
Si alguien tiene el tiempo de revisarlo, aca dejo el codigo.

Muchas gracias a todos, cualquier ayuda sera bien recibida.

esta es la trama que envia el gps.


$GPGGA,195002.000,0614.4766,N,07535.4178,W,1,08,1.0,1534.5,M,1.3,M,,0000*42

luego trato de enviar una similar, con los numeros diferentes, pero mismo numero de caracteres y posiciones.

aca el codigo:

Código: [Seleccionar]
#include "C:\Users\PsychoBear\Documents\UPB\perifericos\lab 3\testeo rs232\lcd solo\lcd_ini\lcd_ini1.h"
#use RS232(BAUD=4800,RCV=PIN_C7,XMIT=PIN_C6,PARITY=N,BITS=8)

void ini_lcd();
void escribo(cadena);

char c,cadena1[100], latitud[11],longitud[12];
int j=0,i=0,contcoma=0,contcoma2=0,contprint=0,entre=0,k=0,l=0;
int1 tengocoord=0,termine=0;



void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_32|RTCC_8_bit);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(False);



   // TODO: USER CODE!!
   delay_ms(30);
   ini_lcd();

   for(;;){
      if (kbhit()) //&& contcoma<=11
      {
         j++;
         c=getc();
         cadena1[j]=c;//meto la trama en una cadena
         if(c==',')
            contcoma++; //cuento el numero de comas para saber mas o menos cuando termina la trama

      }
      if(contcoma>=11){ //aca ya se que termino la trama
         for(i=0;i<=100;i++){
            if(cadena1[i]==',')
                contcoma2++; // busco las 2 primeras comas para encontrar el lugar de la longitud.
                contprint=i; //esto lo voy a nitar mas abajo
            if(contcoma2==2 && entre==0){//entro aca cuando tengo la posicion de la segunda coma
               entre=1;//para no entrar mas de una vez
               while(contprint<=i+23){//para recorrer latitud y longitud
                  contprint++;
                  if(contprint<=i+11){ //recorro primero la latitud
                     latitud[contprint-i]=cadena1[contprint]; //guardo la latidut en latidud[x]
                  }
                  if(contprint>i+12){//luego recorro la longiud
                     longitud[contprint-12-i]=cadena1[contprint];//guardo la longitud
                     tengocoord=1;}//bandera para saber cuando tengo las coordenadas separadas
               }
            }
         }
      if(tengocoord==1){//cuando ya tenga las 2 coordenadas
         for(k=1;k<=11;k++){
            escribo(latitud[k]); //imprimo la latidud en el primer renglon del display
            delay_ms(1);
         }
        output_low(pin_D7);//RS
        output_low(pin_D6);//RW
        output_high(pin_D5);//E
        output_B(192);//cursor a segunda linea
        output_low(pin_D5);//E
        for(l=1;l<=12;l++){
           escribo(longitud[l]); //escribo longitud en el segundo renglon
           delay_ms(1);
           if(l==12){//////////////////////////DE ACA EN ADELANTE ES LO QUE CREO QUE NO FUNCIONA
////////////// PONGO TODAS LAS VARIABLES EN 0, PARA EN TEORIA, SUBIR AL INICIO DEL FOR
/////////////  Y ESPERAR UNA NUEVA COORDENADA
               j=0;
               i=0;
               contcoma=0;
               contcoma2=0;
               contprint=0;
               entre=0;
               k=0;
               tengocoord=0;
               termine=0;
         }
         l=0;
      }
      termine=1;
     }
    }
 if(termine==1){

   j=0;
   i=0;
   contcoma=0;
   contcoma2=0;
   contprint=0;
   entre=0;
   k=0;
   l=0;
   tengocoord=0;
   termine=0;
   }

}///////////////////////////////CIERRA FOR INFINITO


}

void escribo(cadena){

output_high(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(cadena);//imprime
output_low(pin_D5);//E

}

void ini_lcd(){

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//limpia lcd
output_low(pin_D5);//E
delay_ms(30);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//function set
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//display on/off control
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(59);//entry mode seet
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(15);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(1);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(6);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(200);
}

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Solo me detecta la primera trama enviada por RS232
« Respuesta #1 en: 28 de Febrero de 2011, 02:43:03 »
No haces la recepción de datos mediante una interrupción, sino en el bucle principal de tu programa. Esto supone que, si tu programa está ocupado haciendo algo mientras llega la segunda trama, no podrá capturarla.

Te aconsejo que hagas la gestión de recepción de la trama mediante interrupciones; encontrarás multitud de ejemplos en el foro.

Y si quieres asegurarte de que el problema es el que he comentado antes, elimina todo el proceso que hay después de recibir una trama; puedes sustituirlo por un parpadeo de led por cada trama recibida, por ejemplo. Así verás si las recibe todas o no.

Desconectado gapsna

  • PIC10
  • *
  • Mensajes: 20
Re: Solo me detecta la primera trama enviada por RS232
« Respuesta #2 en: 28 de Febrero de 2011, 12:58:47 »
No haces la recepción de datos mediante una interrupción, sino en el bucle principal de tu programa. Esto supone que, si tu programa está ocupado haciendo algo mientras llega la segunda trama, no podrá capturarla.

Te aconsejo que hagas la gestión de recepción de la trama mediante interrupciones; encontrarás multitud de ejemplos en el foro.

Y si quieres asegurarte de que el problema es el que he comentado antes, elimina todo el proceso que hay después de recibir una trama; puedes sustituirlo por un parpadeo de led por cada trama recibida, por ejemplo. Así verás si las recibe todas o no.

Hola, gracias por tu ayuda, intente lo que me dijiste y no me funciona, no aparece nada en el lcd. ni solamente leyendo en la interrupcion ni haciendo el conteo de comas y el guardado en el vector.
Lo tengo asi, lo unico que hace es inicializar el lcd.

Código: [Seleccionar]
#include "C:\Users\PsychoBear\Documents\UPB\perifericos\lab 3\testeo rs232\lcd solo\lcd_ini\con intr\conint2.h"
#int_RDA
#use RS232(BAUD=4800,RCV=PIN_C7,XMIT=PIN_C6,PARITY=N,BITS=8)


void ini_lcd();
void escribo(cadena);

char c,cadena1[100], latitud[11],longitud[12],basura;
int j=0,i=0,contcoma=0,contcoma2=0,contprint=0,entre=0,k=0,l=0;
int1 tengocoord=0,termine=0;

RDA_isr()
{
if(contcoma<=11){
         j++;
         c=getc();
         cadena1[j]=c;//meto la trama en una cadena
         if(c==',')
            contcoma++; //cuento el numero de comas para saber mas o menos cuando termina la trama
   }
   else
    basura=getc();
}



void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   setup_low_volt_detect(FALSE);
   setup_oscillator(False);

   // TODO: USER CODE!!
   delay_ms(30);
   ini_lcd();

   for(;;){
    /* if (contcoma<=11)
      {
         j++;
        //=getc();
         cadena1[j]=c;//meto la trama en una cadena
         if(c==',')
            contcoma++; //cuento el numero de comas para saber mas o menos cuando termina la trama

      }*/
      if(contcoma>=11){ //aca ya se que termino la trama
         for(i=0;i<=100;i++){
            if(cadena1[i]==',')
                contcoma2++; // busco las 2 primeras comas para encontrar el lugar de la longitud.
                contprint=i; //esto lo voy a nitar mas abajo
            if(contcoma2==2 && entre==0){//entro aca cuando tengo la posicion de la segunda coma
               entre=1;//para no entrar mas de una vez
               while(contprint<=i+23){//para recorrer latitud y longitud
                  contprint++;
                  if(contprint<=i+11){ //recorro primero la latitud
                     latitud[contprint-i]=cadena1[contprint]; //guardo la latidut en latidud[x]
                  }
                  if(contprint>i+12){//luego recorro la longiud
                     longitud[contprint-12-i]=cadena1[contprint];//guardo la longitud
                     tengocoord=1;}//bandera para saber cuando tengo las coordenadas separadas
               }
            }
         }
      if(tengocoord==1){//cuando ya tenga las 2 coordenadas
         for(k=1;k<=11;k++){
            escribo(latitud[k]); //imprimo la latidud en el primer renglon del display
            delay_ms(1);
         }
        output_low(pin_D7);//RS
        output_low(pin_D6);//RW
        output_high(pin_D5);//E
        output_B(192);//cursor a segunda linea
        output_low(pin_D5);//E
        for(l=1;l<=12;l++){
           escribo(longitud[l]); //escribo longitud en el segundo renglon
           delay_ms(1);
           if(l==12){//////////////////////////DE ACA EN ADELANTE ES LO QUE CREO QUE NO FUNCIONA
////////////// PONGO TODAS LAS VARIABLES EN 0, PARA EN TEORIA, SUBIR AL INICIO DEL FOR
/////////////  Y ESPERAR UNA NUEVA COORDENADA
               j=0;
               i=0;
               contcoma=0;
               contcoma2=0;
               contprint=0;
               entre=0;
               k=0;
               tengocoord=0;
               termine=0;
         }
         l=0;
      }
      termine=1;
     }
    }
 if(termine==1){

   j=0;
   i=0;
   contcoma=0;
   contcoma2=0;
   contprint=0;
   entre=0;
   k=0;
   l=0;
   tengocoord=0;
   termine=0;
   }

}///////////////////////////////CIERRA FOR INFINITO

}

void escribo(cadena){

output_high(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(cadena);//imprime
output_low(pin_D5);//E

}

void ini_lcd(){

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//limpia lcd
output_low(pin_D5);//E
delay_ms(30);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//function set
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//display on/off control
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(59);//entry mode seet
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(15);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(1);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(20);

output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(6);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(200);
}