Autor Tema: Ayuda urgente, reset+interrupción+bucle do!!!!!!!!!  (Leído 1878 veces)

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

Desconectado abel135

  • PIC10
  • *
  • Mensajes: 42
Ayuda urgente, reset+interrupción+bucle do!!!!!!!!!
« en: 03 de Julio de 2012, 13:22:38 »
Os explicaré el problema que tengo de hace meses, tengo un programa en ccs, el programa funciona perfectamente con interrupciones rda de puerto serial, el problema es que cuando pulso el reset por primera vez ya no funciona nada bien, al pulsar la interrupción me da todo zeros, cuando antes me devolvía las variables perfectamente, el problema es que el bucle del programa principal deja de funcionar, se queda estancado en donde se habilita la interrupción. Antes del reset funciona perfectamente y pasa por encima del sitio donde se habilita, pero ya después del reset se queda estancado allí, a ver si alguien me puede ayudar, es super urgente!!!!!!!!!!!!! Muchas gracias.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda urgente, reset+interrupción+bucle do!!!!!!!!!
« Respuesta #1 en: 03 de Julio de 2012, 13:36:56 »
Hola.

Qué uC estás utilizando? Y qué compilador? Ver el código ayudaría.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado abel135

  • PIC10
  • *
  • Mensajes: 42
Re: Ayuda urgente, reset+interrupción+bucle do!!!!!!!!!
« Respuesta #2 en: 03 de Julio de 2012, 15:12:31 »
Micro 18f4550, compilador ccs, Aquí adjunto el codigo, es super importante poder arreglarlo!

El problema es que el primer bucle, el do, funciona perfectamente, hace una interrupción, y vuelve al bucle, pero cuando pulso reset, el do este se queda parado, y no hace nada, no actualiza la Bandera 1, la 2 ni la 3, ni tampoco el conteo de ejes. O sea el do se para, cuando pulsas una interrupción la hace, pero da todo zeros porque el do del principio no funciona, necesito ayuda super urgente. Cuando le das reset todo va fatal :(.



#include <18F4550.h> //Declaración de librería del pic que estamos usando.

#use delay(clock=20000000)//Frecuencia en la que trabaja
#use standard_io(b)

#bit Verde1=0XF83.0
#bit Rojo1=0XF83.1
#bit Verde2=0XF83.2
#bit Rojo2=0XF83.3
#bit Sensor1=0XF81.0
#bit Sensor2=0XF81.1
#bit Sensor3=0XF81.2

#byte port_a=0XF80
#byte port_b=0XF81 // Este te dice que el nombre port_b es la dirección, así escribiendo port_b ya accedes a el.
#byte port_c=0XF82
#byte port_d=0XF83 // Declaración port d como antes.
#byte port_e=0XF84

#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)// Comunicacion serial
#fuses HSPLL, MCLR,NOWDT,PROTECT,NOLVP,PUT,BROWNOUT, NOVREGEN // Opciones de configuración
#byte tris_a=0XF92
#byte tris_b=0XF93
#byte tris_c=0XF94
#byte tris_d=0XF95

char estado_sensores;//La combinación de los sensores activos nos da un caracter el cual se usa como identificación.
char Comando; //Es la tecla pulsada en concreto, depende de la tecla pulsada enviará información o activara otra cosa.

char Bandera1='0';
char Bandera2='0';
char Bandera3='0';
char Contador_eje1char='0';
char Contador_eje3char='0';
char po=' ';

int Contador_eje1=0;
int Contador_eje3=0;
int Est_act1=0;
int Est_ant1=0;
int Est_act2=0;
int Est_ant2=0;
int salir=0;

void main(){//Programa principal

tris_a=0XFF; //Declaramos los puertos como entrada o salida, 0 salida, 1 entrada.
tris_b=0XFF;
tris_c=0X80;
tris_d=0X00;
port_a=0X00;
port_b=0X00;
port_c=0X00;
port_d=0X00;
port_e=0X00;




printf("\r\n\Eperando ordenes (Int)\r\n");

 do{
        Est_ant1=Est_act1;
        Est_act1=input(PIN_B0);


        if(input(PIN_B0)&&(Est_ant1!=Est_act1)){

           Bandera1='1';
           Contador_eje1=Contador_eje1+1;
            printf("\r\n\Eperando ordenes (Int)\r\n");


         if(Contador_eje1==0){

            Contador_eje1char='0';

         }

         else if(Contador_eje1==1){

            Contador_eje1char='1';

         }

         else if(Contador_eje1==2){

            Contador_eje1char='2';

         }
         else if(Contador_eje1==3){

            Contador_eje1char='3';

         }
         else if(Contador_eje1==4){

            Contador_eje1char='4';

         }
         else if(Contador_eje1==5){

            Contador_eje1char='5';

         }
         else if(Contador_eje1==6){

            Contador_eje1char='6';

         }
         else if(Contador_eje1==7){

            Contador_eje1char='7';

         }
         else if(Contador_eje1==8){

            Contador_eje1char='8';

         }
         else if(Contador_eje1==9){

            Contador_eje1char='9';

         }


}
      if(input(PIN_B1)){

      Bandera2='1';

      }

        Est_ant2=Est_act2;
        Est_act2=input(PIN_B2);

      if(input(PIN_B2)&&(Est_ant2!=Est_act2)){

      Bandera3='1';
      Contador_eje3=Contador_eje3+1;


         if (Contador_eje3==0){

            Contador_eje3char='0';

         }

         else if(Contador_eje3==1){

            Contador_eje3char='1';

         }

         else if(Contador_eje3==2){

            Contador_eje3char='2';

         }
         else if(Contador_eje3==3){

            Contador_eje3char='3';

         }
         else if(Contador_eje3==4){

            Contador_eje3char='4';

         }
         else if(Contador_eje3==5){

            Contador_eje3char='5';

         }
         else if(Contador_eje3==6){

            Contador_eje3char='6';

         }
         else if(Contador_eje3==7){

            Contador_eje3char='7';

         }
         else if(Contador_eje3==8){

            Contador_eje3char='8';

         }
         else if(Contador_eje3==9){

            Contador_eje3char='9';

         }

      }

      if(!input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)){

         estado_sensores='0';

      }
      else if(input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)){

         estado_sensores='1';

      }
      else if(!input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)){

         estado_sensores='2';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)){

         estado_sensores='3';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)){

         estado_sensores='4';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)){

         estado_sensores='5';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)){

         estado_sensores='6';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)){

         estado_sensores='7';

      }
enable_interrupts(GLOBAL);//habilito interrupción global
enable_interrupts(int_rda); //habilito interrupción interna
   }

while(true);

}
#int_rda

void serial_isr() {

    while(kbhit()){//Esto espera a que se introduzca un caracter para hacer la interrupción.

    Comando=getchar();// El caracter ecrito se guarda en la variable comando.
    switch(Comando){

      case 'z':

      putc(estado_sensores);

      break;

      case 'a':

      putc(Bandera1);
      putc(po);
      putc(Bandera2);
      putc(po);
      putc(Bandera3);
      putc(po);
      putc(Contador_eje1char);
      putc(po);
      putc(Contador_eje3char);
      putc(po);
      putc(po);
      putc(po);
      printf("\r\n\Miau (Int)\r\n");

      break;

      case 'b':
      verde1=1;
      break;

      case 'c':
      verde1=0;
      break;

      case 'd':
      rojo1=1;
      break;

      case 'e':
      rojo1=0;
      break;

      case 'f':
      verde2=1;
      break;

      case 'g':
      verde2=0;
      break;

      case 'h':
      rojo2=1;
      break;

      case 'i':
      rojo2=0;
      break;

      case 'j':
      Bandera1='0';
      break;

      case 'k':
      Bandera2='0';
      break;

      case 'l':
      Bandera3='0';
      break;

      case 'm':
      Contador_eje1char='0';
      break;

      case 'n':
      Contador_eje3char='0';
      break;

      case 'o':

         while(salir==0){

            verde1=0;
            verde2=0;
            rojo1=0;
            rojo2=0;
            delay_ms(500);        //Espero 500ms.
            rojo1=1;
            rojo2=1;
            delay_ms(500);        //Espero 500ms.
            Comando=getchar();
            if(comando=='p'){salir=1;}

         }
         rojo1=0;
         rojo2=0;
         salir=0;
      break;
    }

    }

    }

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda urgente, reset+interrupción+bucle do!!!!!!!!!
« Respuesta #3 en: 03 de Julio de 2012, 16:05:45 »
Bueno, no es bueno que proceses todo dentro de la interrupción. Suele traer problemas.

Por otro lado, comienza con lo más sencillo, agregale ERRORS a la declaración del RS2332:

#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7, ERRORS)// Comunicacion serial
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado abel135

  • PIC10
  • *
  • Mensajes: 42
Re: Ayuda urgente, reset+interrupción+bucle do!!!!!!!!!
« Respuesta #4 en: 03 de Julio de 2012, 18:11:41 »
Ya le agregué errors y nada, a nadie le ha pasado nunca? Que tenga un bucle a la función principal y después de pulsar reset uan vez ya no vuelve a funcionar el bucle? A lo mejor hay que borrar algún flag?, a lo mejor al hacer reset se modifica alguna bandera? AYUDA POR FAVORRRRRRRRRRRRRRRRRRRRRRR :x

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda urgente, reset+interrupción+bucle do!!!!!!!!!
« Respuesta #5 en: 03 de Julio de 2012, 18:54:50 »
No lo creo.

Yo creo que el problema está en cómo has planteado el funcionamiento del programa. Es bastante largo y no tengo en este momento tiempo como para mirarlo con detenimiento, pero estás seguro de que el problema no está en que si presionas el reset mientras estás recibiendo una trama por el puerto serie, tu algorítmo no contempla recibir una trama a medias, o bien no desde el primer caracter y es el código tuyo mísmo el que bloquea todo porque se ha desincronizado la trama con la máquina de estados que has hecho?
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Ayuda urgente, reset+interrupción+bucle do!!!!!!!!!
« Respuesta #6 en: 03 de Julio de 2012, 19:16:32 »
Hola, yo creo que esto te esta jugando mal:


Código: C
  1. while(salir==0){
  2.  
  3.             verde1=0;
  4.             verde2=0;
  5.             rojo1=0;
  6.             rojo2=0;
  7.             delay_ms(500);        //Espero 500ms.
  8.             rojo1=1;
  9.             rojo2=1;
  10.             delay_ms(500);        //Espero 500ms.
  11.             Comando=getchar();
  12.             if(comando=='p'){salir=1;}
  13.  
  14.          }

utiliza las interrupciones correctamente, usar putc dentro de rda es malo, poco codigo y usa un flag que indique la presencia de nuevo dato en rda.

Este pedazo de codigo:

Código: C
  1. if(Contador_eje1==0){
  2.  
  3.             Contador_eje1char='0';
  4.  
  5.          }
  6.  
  7.          else if(Contador_eje1==1){
  8.  
  9.             Contador_eje1char='1';
  10.  
  11.          }
  12.  
  13.          else if(Contador_eje1==2){
  14.  
  15.             Contador_eje1char='2';
  16.  
  17.          }
  18.          else if(Contador_eje1==3){
  19.  
  20.             Contador_eje1char='3';
  21.  
  22.          }
  23.          else if(Contador_eje1==4){
  24.  
  25.             Contador_eje1char='4';
  26.  
  27.          }
  28.          else if(Contador_eje1==5){
  29.  
  30.             Contador_eje1char='5';
  31.  
  32.          }
  33.          else if(Contador_eje1==6){
  34.  
  35.             Contador_eje1char='6';
  36.  
  37.          }
  38.          else if(Contador_eje1==7){
  39.  
  40.             Contador_eje1char='7';
  41.  
  42.          }
  43.          else if(Contador_eje1==8){
  44.  
  45.             Contador_eje1char='8';
  46.  
  47.          }
  48.          else if(Contador_eje1==9){
  49.  
  50.             Contador_eje1char='9';
  51.  
  52.          }

lo puedes mejorar asi:

Código: C
  1. if(Contador_eje1<10)Contador_eje1+= 48;  ///con esto conviertes a ascci el valor decimal de la variable


En la interrupcion la parte que dice:
Código: C
  1. while(kbhit()){

Es redundar ya que la interrupcion ocurrira cuando haya dato disponible asi que preguntar nuevamente estaria demas.

Tienes bastante por mejorar en tu codigo amigo.

saludos.


A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado abel135

  • PIC10
  • *
  • Mensajes: 42
Re: Ayuda urgente, reset+interrupción+bucle do!!!!!!!!!
« Respuesta #7 en: 05 de Julio de 2012, 11:17:33 »
Hola;

Muchas gracias a todos por vuestras respuestas, ya he estado haciendo algunas mejoras, pero creo que lo que pasa es lo que dice BRUNOF, que se decincroniza, al hacer un reset del pic y siguiendo recibir datos por el puerto serie, y por eso deja de hacer el bucle do del principio, alguien sabría como solucionarlo? Sería de gran ayuda, justo estoy empezando y estoy un poco perdido.

Muchas gracias por todo de verdad.

Desconectado abel135

  • PIC10
  • *
  • Mensajes: 42
Re: Ayuda urgente, reset+interrupción+bucle do!!!!!!!!!
« Respuesta #8 en: 03 de Septiembre de 2012, 13:14:43 »
Os comento que ya resolví mi problema usando el pic 16f887 así quedo:

#include <16F887.h>//////////////////////////////////Empiezan las declaraciones
#use delay(clock=20000000)
#use standard_io(b)

#bit Verde1=0X08.0
#bit Rojo1=0X08.1
#bit Verde2=0X08.2
#bit Rojo2=0X08.3
#bit Sensor1=0X06.0
#bit Sensor2=0X06.1
#bit Sensor3=0X06.2

#byte port_a=0X05
#byte port_b=0X06 // Este te dice que el nombre port_b es la dirección, así escribiendo port_b ya accedes a el.
#byte port_c=0X07
#byte port_d=0X08 // Declaración port d como antes.
#byte port_e=0X09

#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)// Comunicacion serial
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT //

#byte tris_a=0X85
#byte tris_b=0X86
#byte tris_c=0X87
#byte tris_d=0X88

char estado_sensores;//La combinación de los sensores activos nos da un caracter el cual se usa como identificación.
char Comando=' '; //Es la tecla pulsada en concreto, depende de la tecla pulsada enviará información o activara otra cosa.
char Bandera1='0';
char Bandera2='0';
char Bandera3='0';
char Contador_eje1char='0';
char Contador_eje3char='0';
char po=' ';

int Contador_eje1=0;
int Contador_eje3=0;
int Est_act1=0;
int Est_ant1=0;
int Est_act2=0;
int Est_ant2=0;
int salir=0;

//////////////////////////////////////////////////////////////Fin declaraciones

#int_rda ////////////////////////////////////////////// Empieza interrupción rda

void serial_isr() {

    comando=0X00;
    if(kbhit()){//////////////Cuando recibe un caracter empieza la interrupción.

    Comando=getc();/////////El caracter ecrito se guarda en la variable comando.
    switch(Comando){

      case 'z'://///Si comando es 'z' envia por RS232 el estado de los sensores.
     
      putc(estado_sensores);
      putc(po);

      break;

      case 'a':    //Si comando es 'a' envia por RS232 el estado de las banderas
                   //+ el número de ejes que han pasado por el sensor 1 y 3.
     
      putc(po);
      putc(Bandera1);
      putc(po);
      putc(Bandera2);
      putc(po);
      putc(Bandera3);
      putc(po);
      putc(Contador_eje1char);
      putc(po);
      putc(Contador_eje3char);
      putc(po);
      putc(po);
      putc(po);

      break;

      case 'b':////////////// Si comando es 'b' enciende el semaforo 1 "el verde".
      //goto 0X00
      verde1=1;
      break;

      case 'c':///////////////// Si comando es 'c' apaga el semaforo 1 "el verde".
      verde1=0;
      break;

      case 'd'://///////////// Si comando es 'd' enciende el semaforo 1 "el rojo".
      rojo1=1;
      break;

      case 'e':////////////////// Si comando es 'e' apaga el semaforo 1 "el rojo".
      rojo1=0;
      break;

      case 'f':////////////// Si comando es 'f' enciende el semaforo 2 "el verde".
      verde2=1;
      break;

      case 'g':///////////////// Si comando es 'g' apaga el semaforo 2 "el verde".
      verde2=0;
      break;

      case 'h'://///////////// Si comando es 'h' enciende el semaforo 2 "el rojo".
      rojo2=1;
      break;

      case 'i':////////////////// Si comando es 'i' apaga el semaforo 2 "el rojo".
      rojo2=0;
      break;

      case 'j':////////////////////////// Si comando es 'j' pone a 0 la bandera 1.
      Bandera1='0';
      break;

      case 'k':////////////////////////// Si comando es 'k' pone a 0 la bandera 2.
      Bandera2='0';
      break;

      case 'l':////////////////////////// Si comando es 'l' pone a 0 la bandera 3.
      Bandera3='0';
      break;

      case 'm'://///////////////// Si comando es 'm' pone a 0 el contador de eje1.
      Contador_eje1char='0';
      Contador_eje1=0;
      break;

      case 'n'://///////////////// Si comando es 'n' pone a 0 el contador de eje3.
      Contador_eje3char='0';
      Contador_eje3=0;
      break;

      case 'o':///////// Si comando es 'o' pone los dos semaforos rojosen inter-
               ///////// mitente, retardos de medio segundo para salir pulsar p.

         while(salir==0){

            verde1=0;
            verde2=0;
            rojo1=0;
            rojo2=0;
            delay_ms(500);        //Espero 500ms.
            rojo1=1;
            rojo2=1;
            delay_ms(500);        //Espero 500ms.
            Comando=getchar();
            if(comando=='p'){salir=1;}// Para salir del estado pulsar 'p'

         }
         rojo1=0;
         rojo2=0;
         salir=0;
      break;
    }
  }
}
/////////////////////////////////////////////////////// Termina interrupción rda

void main(){ //////////////////////////////////////// Empieza programa principal

tris_a=0XFF;//Declaramos los puertos como entrada o salida, 0 salida, 1 entrada.
tris_b=0XFF;
tris_c=0X80;
tris_d=0X00;
port_a=0X00;
port_b=0X00;
port_c=0X00;
port_d=0X00;
port_e=0X00;

printf("\r\n\Eperando ordenes (Int)\r\n");

//////Empieza bucle do para saber como están sensores y cuantos ejes han pasado.

   do{
   
      // Empieza a contar los ejes, siempre que pase de no detectar a detectar,
      // al contrario no cuenta el eje Para borrar el conteo pulsar m y n. Tam
      // bién actualiza las banderas. Una bandera se activa si ya a pasado al-
      // menos una vez por el eje correspondiente, para borrarlas exisen los co-
      // mandos 'j','k' y 'l'.

   Est_ant1=Est_act1;
   Est_act1=input(PIN_B0);


      if(input(PIN_B0)&&(Est_ant1!=Est_act1)){

      Bandera1='1';
      Contador_eje1=Contador_eje1+1;


         if(Contador_eje1==0){

            Contador_eje1char='0';

         }

         else if(Contador_eje1==1){

            Contador_eje1char='1';

         }

         else if(Contador_eje1==2){

            Contador_eje1char='2';

         }
         else if(Contador_eje1==3){

            Contador_eje1char='3';

         }
         else if(Contador_eje1==4){

            Contador_eje1char='4';

         }
         else if(Contador_eje1==5){

            Contador_eje1char='5';

         }
         else if(Contador_eje1==6){

            Contador_eje1char='6';

         }
         else if(Contador_eje1==7){

            Contador_eje1char='7';

         }
         else if(Contador_eje1==8){

            Contador_eje1char='8';

         }
         else if(Contador_eje1==9){

            Contador_eje1char='9';

         }


      }
     
      if(input(PIN_B1)){

      Bandera2='1';

      }

      Est_ant2=Est_act2;
      Est_act2=input(PIN_B2);

      if(input(PIN_B2)&&(Est_ant2!=Est_act2)){

      Bandera3='1';
      Contador_eje3=Contador_eje3+1;


         if (Contador_eje3==0){

            Contador_eje3char='0';

         }

         else if(Contador_eje3==1){

            Contador_eje3char='1';

         }

         else if(Contador_eje3==2){

            Contador_eje3char='2';

         }
         else if(Contador_eje3==3){

            Contador_eje3char='3';

         }
         else if(Contador_eje3==4){

            Contador_eje3char='4';

         }
         else if(Contador_eje3==5){

            Contador_eje3char='5';

         }
         else if(Contador_eje3==6){

            Contador_eje3char='6';

         }
         else if(Contador_eje3==7){

            Contador_eje3char='7';

         }
         else if(Contador_eje3==8){

            Contador_eje3char='8';

         }
         else if(Contador_eje3==9){

            Contador_eje3char='9';

         }

      }
/////Fin del programa de contar ejes.
/////Empieza la modificación de la variable estado_sensores según estado lasers.

      if(!input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)){

         estado_sensores='0';

      }
      else if(input(PIN_B0)&&!input(PIN_B1)&&!input(PIN_B2)){

         estado_sensores='1';

      }
      else if(!input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)){

         estado_sensores='2';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&!input(PIN_B2)){

         estado_sensores='3';

      }

      else if(!input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)){

         estado_sensores='4';

      }

      else if(input(PIN_B0)&&!input(PIN_B1)&&input(PIN_B2)){

         estado_sensores='5';

      }

      else if(!input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)){

         estado_sensores='6';

      }

      else if(input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2)){

         estado_sensores='7';

      }
     
enable_interrupts(GLOBAL);//habilito interrupción global
enable_interrupts(int_rda); //habilito interrupción interna
   }

while(true);

}//////////////////////////////////////////////////////////////Termina bucle do.
/////////////////////////////////////////////////////Termina programa principal.

Muchas gracias por vuestra ayuda!


 

anything