Autor Tema: Programa en CCS C y funciona bien en Proteus pero no en la realidad!  (Leído 2377 veces)

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

Desconectado reymago86

  • PIC10
  • *
  • Mensajes: 6
Hola a todos espero que puedan ayudarme ya que no encuentro la solucion a mi problema. Estoy haciendo un trabajo en el que se mueven tres ejes(x,y,z) y obedecen las coordenadas que yo les introdujo por teclado, ademas de visualizar todo por led. El problema es que el programa compila en CCS con ROM= 60% y RAM= 21%. Cuando lo simulo en proteus funciona todo excelenteee  pero luego cuando lo grabo en el pic y lo pongo en la placa, realiza la primera tarea y luego hace cualquier cosa.
Pensando que podia ser el pic (16f877a) grabe un programa mas corto en el mismo, el cual maneja un motor y funciona excelente!
El programa que hago tambien realiza un cambio de escalas, es decir, le ingreso numeros del 1 al 100 y este me los convierte pulsos. Como los pulsos son numeros muy grandes que encima se deben multiplicar en ocasiones (regla de 3 simples) tengo que usar 11 variables tipo signed int32 declaradas globalmente.
Si les sirve como dato el archivo .hex que queda compilado pesa 27kB ( haciendo con el boton derecho del mouse en el archivo obtuve este dato).
Gracias a todos por leer

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Programa en CCS C y funciona bien en Proteus pero no en la realidad!
« Respuesta #1 en: 04 de Agosto de 2012, 14:04:52 »
  Lo ideal para que se te pueda ayudar sería que subas el programa completo. Usando la opción GeSHi del editor de mensajes podés seleccionar C y luego pegar todo tu programa así se lo puede ver sin necesidad de descargarlo
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado reymago86

  • PIC10
  • *
  • Mensajes: 6
Re: Programa en CCS C y funciona bien en Proteus pero no en la realidad!
« Respuesta #2 en: 06 de Agosto de 2012, 20:36:29 »
Código: C
  1. #include <16f877a.h>
  2. #fuses xt,nowdt,noprotect,nolvp
  3. #use delay (clock = 4000000)
  4. #include <stdlib.h>
  5. #include <kbd.c>
  6. #include <lcd.c>
  7. #include <stdio.h>
  8. signed int32 prodx=0,prodx2=0,divisionx=0,divisionx2=0,moverx=0,moverz=0,cont_x=0
  9. ,totalx=0,cont_z=0,totalz=0,cont_y=0;
  10. char PWMH=0, PWML=0, k;
  11. int i,j,cuenta;
  12. char x[3];//matrices p guardar las coord
  13. int16 pos_ingrx,pos_ingrz;
  14. void home (void)
  15. {
  16. do
  17. {
  18. for(PWMH=175;PWMH>0;PWMH--)
  19. output_high (PIN_C1);//pulso alto
  20. for(PWML=325;PWML>0;PWML--)
  21. output_low(PIN_C1);//pulso bajo
  22. lcd_putc( "\fPuesta a cero");
  23. output_low(PIN_C0);//cero en la otra entrada del puente H
  24. output_low(PIN_C2);//cero en los otros H
  25. output_low(PIN_C3);
  26. output_low(PIN_C4);
  27. output_low(PIN_C5);
  28. }while(input(PIN_A0)!=0);// mientras sensor x final es !=1 mover motor
  29. output_low(PIN_C0);//apaga el motor una vez q llego al final
  30. output_low(PIN_C1);
  31. lcd_putc( "\fListo");
  32. delay_ms(500);
  33. do
  34. {
  35. for(PWMH=175;PWMH>0;PWMH--)
  36. output_high (PIN_C3);//pulso alto
  37. for(PWML=325;PWML>0;PWML--)
  38. output_low(PIN_C3);//pulso bajo
  39. lcd_putc( "\fPuesta a cero");
  40. output_low(PIN_C2);//cero en la otra entrada del puente H
  41. output_low(PIN_C4);//cero en el otro H
  42. output_low(PIN_C5);
  43. }while(input(PIN_A2)!=0);
  44. output_low(PIN_C2);
  45. output_low(PIN_C3);
  46. lcd_putc( "\fListo");
  47. delay_ms(500);
  48. do
  49. {
  50. for(PWMH=175;PWMH>0;PWMH--)
  51. output_high (PIN_C5);//pulso alto
  52. for(PWML=325;PWML>0;PWML--)
  53. output_low(PIN_C5);//pulso bajo
  54. lcd_putc( "\fPuesta a cero");
  55. output_low(PIN_C4);//cero en la otra entrada del puente H
  56. }while(input(PIN_A4)!=0);
  57. output_low(PIN_C4);
  58. output_low(PIN_C5);
  59. lcd_putc( "\fListo");
  60. delay_ms(500);
  61. }
  62. void escanear_recorrido (void)
  63. {
  64. do
  65. {
  66. for(PWMH=175;PWMH>0;PWMH--)
  67. output_high (PIN_C0);//pulso alto
  68. for(PWML=325;PWML>0;PWML--)
  69. output_low(PIN_C0);//pulso bajo
  70. cont_x=cont_x+1;// contar pulsos de x
  71. lcd_putc( "\fEscaneando");
  72. output_low(PIN_C1);//cero en la otra entrada del puente H
  73. }while(input(PIN_A1)!=0);// mientras sensor x final es !=1 mover motor
  74. output_low(PIN_C0);//apaga el motor una vez q llego al final
  75. output_low(PIN_C1);
  76. printf(lcd_putc,"\fx=%ld y=%ld z=%ld",cont_x,cont_y,cont_z);
  77. delay_ms(4000);
  78. do
  79. {
  80. for(PWMH=175;PWMH>0;PWMH--)
  81. output_high (PIN_C2);//pulso alto
  82. for(PWML=325;PWML>0;PWML--)
  83. output_low(PIN_C2);//pulso bajo
  84. cont_y=cont_y+1;
  85. lcd_putc( "\fEscaneando");
  86. output_low(PIN_C3);//cero en la otra entrada del puente H
  87. }while(input(PIN_A3)!=0);
  88. output_low(PIN_C2);
  89. output_low(PIN_C3);
  90. printf(lcd_putc,"\fx=%ld y=%ld",cont_x,cont_y);
  91. lcd_gotoxy(1,2);
  92. printf(lcd_putc,"z=%ld",cont_z);
  93. delay_ms(4000);
  94. do
  95. {
  96. for(PWMH=175;PWMH>0;PWMH--)
  97. output_high (PIN_C4);//pulso alto
  98. for(PWML=325;PWML>0;PWML--)
  99. output_low(PIN_C4);//pulso bajo
  100. cont_z=cont_z+1;
  101. lcd_putc( "\fEscaneando");
  102. output_low(PIN_C5);//cero en la otra entrada del puente H
  103. }while(input(PIN_A5)!=0);
  104. output_low(PIN_C4);
  105. output_low(PIN_C5);
  106. printf(lcd_putc,"\fx=%ld y=%ld",cont_x,cont_y);
  107. lcd_gotoxy(1,2);
  108. printf(lcd_putc,"z=%ld",cont_z);
  109. delay_ms(4000);
  110. }
  111. //Escalas de X
  112. void escala (void)
  113. {
  114. prodx=cont_x*100;//conversion a otra escala 0-100
  115. divisionx=prodx/totalx;
  116. }
  117. void escala2(void)
  118. {
  119. prodx2=moverx*totalx;
  120. divisionx2=prodx2/100;
  121. }
  122. //Escalas de Z
  123. void escala_z (void)
  124. {
  125. prodx=cont_z*100;//conversion a otra escala 0-100
  126. divisionx=prodx/totalz;
  127. }
  128. void escala2_z(void)
  129. {
  130. prodx2=moverz*totalz;
  131. divisionx2=prodx2/100;
  132. }
  133. void motor_y(void)
  134. {
  135. //*** MOVER MOTOR Y***
  136. lcd_gotoxy(1,1);
  137. lcd_putc("\fManeje altura(Y) ");
  138. lcd_gotoxy(1,2);
  139. lcd_putc("manualmente ");
  140. delay_ms(5000);
  141. lcd_putc("\f");
  142. evaluar:
  143. do
  144. {
  145. lcd_gotoxy(1,1);
  146. lcd_putc("ARRIBA=1 ABAJO=3");
  147. lcd_gotoxy(1,2);
  148. lcd_putc("TERMINAR=0");
  149. k=kbd_getc();
  150. }while(k=='\0');
  151.  do{//hacer esto mientras no se presione cero
  152.  printf(lcd_putc,"\fy=%ld",cont_y);
  153.  while(k =='1') //girar hacia la derecha
  154.  {
  155. if(input(PIN_A3)==0){
  156.  output_low(PIN_C2);
  157.  output_low(PIN_C3);
  158. lcd_gotoxy(1,1);
  159. lcd_putc("\fFin de carrera");
  160. delay_ms(1000);
  161. goto evaluar;
  162. }
  163.    for(j=11;j>0;j--)
  164.    {
  165.    for(PWMH=175;PWMH>0;PWMH--)
  166.   output_high (PIN_C2);//pulso alto
  167.   for(PWML=325;PWML>0;PWML--)
  168.   output_low(PIN_C2);//pulso bajo
  169.   cont_y=cont_y+1;
  170.   printf(lcd_putc,"\fy=%ld",cont_y);
  171.    }
  172.    k=kbd_getc();
  173.  while(k=='\0')//apago motor y
  174.     {
  175.     output_low(PIN_C2);
  176.     output_low(PIN_C3);
  177.     k=kbd_getc();
  178.     }
  179. goto evaluar;
  180.  }
  181.  
  182.           while(k =='3') //girar hacia la izquierda
  183.             {
  184.             if(input(PIN_A2)==0){
  185.  output_low(PIN_C2);
  186.  output_low(PIN_C3);
  187. lcd_gotoxy(1,1);
  188. lcd_putc("\fInicio d carrera");
  189. delay_ms(1000);
  190. goto evaluar;
  191. }
  192.  for(j=11;j>0;j--)
  193.    {
  194.    for(PWMH=175;PWMH>0;PWMH--)
  195.   output_high (PIN_C3);//pulso alto
  196.   for(PWML=325;PWML>0;PWML--)
  197.   output_low(PIN_C3);//pulso bajo
  198.   cont_y=cont_y-1;
  199.   printf(lcd_putc,"\fy=%ld",cont_y);
  200.    }
  201.    k=kbd_getc();
  202.  while(k=='\0')//apago motor y
  203.     {
  204.     output_low(PIN_C2);
  205.     output_low(PIN_C3);
  206.     k=kbd_getc();
  207.     }
  208. goto evaluar;
  209.             }
  210.            }while(k !='0');
  211.   delay_ms(500);
  212. }
  213. void main()
  214. {
  215. lcd_init();
  216. kbd_init();
  217. PORT_B_PULLUPS(TRUE);
  218. home ();
  219. escanear_recorrido ();
  220. totalx=cont_x;
  221. totalz=cont_z;
  222. loop00:
  223. escala();
  224. printf(lcd_putc,"\fx=%ld",divisionx);//muestro posiciones actuales
  225. lcd_gotoxy(6,1);
  226. printf(lcd_putc,"y=%ld",cont_y);
  227. lcd_gotoxy(1,2);
  228. escala_z();
  229. printf(lcd_putc,"z=%ld",divisionx);
  230. lcd_gotoxy(8,2);
  231. lcd_putc("mover?[s/n]:");//pregunto si kiere mover motores
  232. loop://**MOVER MOTOR X**
  233. do
  234.  {
  235.   lcd_gotoxy(13,2);
  236.   lcd_putc("S/N");
  237.   k=kbd_getc();
  238.  }while(k=='\0');//hacer esto mientras no se presiona teclado
  239.  if(k!='*')
  240.  {
  241.   if(k!='#')
  242.    {
  243. lcd_gotoxy(1,1);
  244. lcd_putc("\finvalido");
  245. goto loop;
  246.    }else{
  247.    goto loop;
  248.         }
  249.  }
  250.  else
  251.        {
  252.        loop0:
  253.  lcd_gotoxy(1,1);
  254.  lcd_putc("\fIngrese tres dig");
  255.  lcd_gotoxy(1,2);
  256.  lcd_putc("entre 0-100");
  257.  delay_ms(4000);
  258.  lcd_putc("\fpor cada coord");
  259.  delay_ms(4000);
  260.     }
  261. lcd_putc("\f");// borrado de la pantalla
  262. lcd_gotoxy(1,1);//nos posicionamos en (1,1)
  263. loop2:
  264. lcd_putc("\fx=");
  265. i=0; //posicion de la matriz
  266. while(i<=2){ //para tres datos
  267. k=kbd_getc();//leer teclado
  268. if(k!='\0') // si se ha pulsado alguna tecla
  269. {
  270. switch(i)
  271.  {
  272.  case 0:
  273.  lcd_gotoxy(3,1);
  274.  printf(lcd_putc,"%c",k);
  275.  break;
  276.  case 1:
  277.  lcd_gotoxy(4,1);
  278.  printf(lcd_putc,"%c",k);
  279.  break;
  280.  case 2:
  281.  lcd_gotoxy(5,1);
  282.  printf(lcd_putc,"%c",k);
  283.  delay_ms(4000);
  284.  break;
  285.  }
  286.  x[i]=k;//se guarda en la posicion correspondiente
  287. i++;//de la matriz
  288. }
  289. }
  290. pos_ingrx=atoi(x);
  291. if(pos_ingrx>100){
  292. lcd_putc("\fNumero invalido");
  293. delay_ms(600);
  294. goto loop0;
  295. }
  296.  
  297. loop3:
  298. do
  299. {
  300. lcd_gotoxy(1,2);
  301. lcd_putc("Confirmar?:S/N");
  302. k=kbd_getc();//leer teclado}
  303. }while(k=='\0');
  304. lcd_gotoxy(2,1);
  305. if(k!='*')
  306.  {
  307.   if(k!='#')
  308.    {
  309. lcd_gotoxy(1,1);
  310. lcd_putc("\finvalido");
  311. goto loop3;
  312.    }else{
  313.    goto loop2;
  314.         }
  315.  }
  316.  else
  317.        {
  318.  
  319. lcd_putc("\fconfirmado");
  320. delay_ms(500);
  321.        }
  322. escala();//convierte cont_x a divisionx(pulsos)
  323. moverx=pos_ingrx-divisionx;
  324. delay_ms(4000);
  325. if(moverx==0)
  326. {
  327. output_low(PIN_C0);//pulso bajo
  328. output_low(PIN_C1);
  329. lcd_gotoxy(1,1);
  330. printf(lcd_putc,"\fx=%ld",divisionx);
  331. }else
  332.    {
  333.   if(moverx>0)//girar hacia la derecha(avanza)
  334.    {
  335.         if(input(PIN_A1)==0){
  336.  output_low(PIN_C0);
  337.  output_low(PIN_C1);
  338. lcd_gotoxy(1,1);
  339. lcd_putc("\fFin de carrera");
  340. delay_ms(1000);
  341. goto loop0;
  342. }
  343.   escala2();//convierte moverx a pulsos
  344.   output_low(PIN_C1);
  345.   do{
  346.   for(PWMH=175;PWMH>0;PWMH--)
  347.   output_high (PIN_C0);//pulso alto
  348.   for(PWML=325;PWML>0;PWML--)
  349.   output_low(PIN_C0);//pulso bajo
  350.   divisionx2=divisionx2-1;
  351.   cont_x=cont_x+1;
  352.   escala();
  353.   cuenta=divisionx;
  354.   printf(lcd_putc,"\fx=%d",cuenta);
  355.   }while(divisionx2!=0);
  356.    output_low(PIN_C0);
  357.    output_low(PIN_C1);
  358.  
  359.    }else//sino mover a la izq (retrocede)
  360.         {
  361.          if(input(PIN_A0)==0){
  362.  output_low(PIN_C0);
  363.  output_low(PIN_C1);
  364. lcd_gotoxy(1,1);
  365. lcd_putc("\fInicio Carrera");
  366. delay_ms(1000);
  367. goto loop0;
  368.          }
  369.   escala2();//convierte moverx a pulsos
  370.   output_low(PIN_C0);
  371. do{
  372.           for(PWMH=175;PWMH>0;PWMH--)
  373.           output_high (PIN_C1);
  374.           for(PWML=325;PWML>0;PWML--)
  375.           output_low(PIN_C1);
  376.           divisionx2=divisionx2+1;//divisionx2 es vble moverx pasada a pulsos
  377.           cont_x=cont_x-1;
  378.           escala();
  379.           cuenta=divisionx;
  380.           printf(lcd_putc,"\fx=%d",cuenta);
  381.           }while(divisionx2!=0);
  382.              output_low(PIN_C0);
  383.              output_low(PIN_C1);//detiene motor
  384.                  }
  385.    }
  386.    delay_ms(1000);
  387.  
  388.  //**MOVER MOTOR Z**
  389. loop2z:
  390. lcd_putc("\fz=");
  391. i=0; //posicion de la matriz
  392. while(i<=2){ //para tres datos
  393. k=kbd_getc();//leer teclado
  394. if(k!='\0') // si se ha pulsado alguna tecla
  395. {
  396. switch(i)
  397.  {
  398.  case 0:
  399.  lcd_gotoxy(3,1);
  400.  printf(lcd_putc,"%c",k);
  401.  break;
  402.  case 1:
  403.  lcd_gotoxy(4,1);
  404.  printf(lcd_putc,"%c",k);
  405.  break;
  406.  case 2:
  407.  lcd_gotoxy(5,1);
  408.  printf(lcd_putc,"%c",k);
  409.  delay_ms(4000);
  410.  break;
  411.  }
  412.  x[i]=k;//se guarda en la posicion correspondiente
  413. i++;//de la matriz
  414. }
  415. }
  416. pos_ingrz=atoi(x);
  417. if(pos_ingrz>100){
  418. lcd_putc("\fNumero invalido");
  419. delay_ms(600);
  420. goto loop2z;
  421. }
  422.  
  423. loop3z:
  424. do
  425. {
  426. lcd_gotoxy(1,2);
  427. lcd_putc("Confirmar?:S/N");
  428. k=kbd_getc();//leer teclado}
  429. }while(k=='\0');
  430. lcd_gotoxy(2,1);
  431. if(k!='*')
  432.  {
  433.   if(k!='#')
  434.    {
  435. lcd_gotoxy(1,1);
  436. lcd_putc("\finvalido");
  437. goto loop3z;
  438.    }else{
  439.    goto loop2z;
  440.         }
  441.  }
  442.  else
  443.        {
  444.  
  445. lcd_putc("\fconfirmado");
  446. delay_ms(500);
  447.        }
  448. escala_z();
  449. moverz=pos_ingrz-divisionx;
  450. if(moverz==0)
  451. {
  452. output_low(PIN_C4);//pulso bajo
  453. output_low(PIN_C5);
  454. lcd_gotoxy(1,1);
  455. printf(lcd_putc,"\fz=%ld",divisionx);
  456. delay_ms(500);
  457. }else
  458.    {
  459.   if(moverz>0)//girar hacia la derecha
  460.    {
  461.  if(input(PIN_A5)==0){
  462.  output_low(PIN_C4);
  463.  output_low(PIN_C5);
  464. lcd_gotoxy(1,1);
  465. lcd_putc("\fFin de carrera");
  466. delay_ms(1000);
  467. goto loop2z;
  468.  }
  469. escala2_z();//convierte moverz a pulsos
  470.   output_low(PIN_C5);
  471.   do{
  472.   for(PWMH=175;PWMH>0;PWMH--)
  473.   output_high (PIN_C4);//pulso alto
  474.   for(PWML=325;PWML>0;PWML--)
  475.   output_low(PIN_C4);//pulso bajo
  476.   divisionx2=divisionx2-1;
  477.   cont_z=cont_z+1;
  478.   escala_z();
  479.   cuenta=divisionx;
  480.   printf(lcd_putc,"\fz=%d",cuenta);
  481.   }while(divisionx2!=0);
  482.    output_low(PIN_C4);
  483.  output_low(PIN_C5);//detiene motor
  484.    }else//sino mover a la izq
  485.         {
  486.         if(input(PIN_A4)==0){
  487.  output_low(PIN_C4);
  488.  output_low(PIN_C5);
  489. lcd_gotoxy(1,1);
  490. lcd_putc("\fInicio carrera");
  491. delay_ms(1000);
  492. goto loop2z;
  493.         }
  494.      escala2_z();//convierte moverz a pulsos
  495.      output_low(PIN_C4);
  496.           do{
  497.           for(PWMH=175;PWMH>0;PWMH--)
  498.           output_high (PIN_C5);
  499.           for(PWML=325;PWML>0;PWML--)
  500.           output_low(PIN_C5);
  501.           divisionx2=divisionx2+1;//divisionx2 es vble moverx pasada a pulsos
  502.           cont_z=cont_z-1;
  503.           escala_z();
  504.           cuenta=divisionx;
  505.           printf(lcd_putc,"\fz=%d",cuenta);
  506.           }while(divisionx2!=0);
  507.            output_low(PIN_C4);
  508.             output_low(PIN_C5);//detiene motor
  509.         }
  510.           delay_ms(500);
  511.    }
  512. motor_y();
  513. loop4: // electroiman
  514. do
  515.  {
  516.   lcd_gotoxy(1,1);
  517.   lcd_putc("Tomar pieza *");
  518.   lcd_gotoxy(1,2);
  519.   lcd_putc("soltar pieza #");
  520.   k=kbd_getc();
  521.  }while(k=='\0');//hacer esto mientras no se presiona teclado
  522.  if(k!='*')
  523.  {
  524.   if(k!='#')
  525.    {
  526. lcd_gotoxy(1,1);
  527. lcd_putc("\finvalido");
  528. delay_ms(1000);
  529. goto loop4;
  530.    }else{
  531.    output_low (PIN_C6);
  532.    lcd_putc("\fIman desactivado");
  533.    delay_ms(1000);
  534.    goto loop00;
  535.         }
  536.  }
  537.  else
  538.        {
  539.  output_high (PIN_C6);
  540.  lcd_putc("\fIman Activado");
  541.  delay_ms(5000);
  542.  goto loop00;
  543.        }
  544. }
ok ahi va el programa
« Última modificación: 06 de Agosto de 2012, 22:40:44 por un Moderador »

Desconectado reymago86

  • PIC10
  • *
  • Mensajes: 6
Re: Programa en CCS C y funciona bien en Proteus pero no en la realidad!
« Respuesta #3 en: 06 de Agosto de 2012, 20:37:32 »
Ojala puedan ayudarme, gracias por contestar! =)

Desconectado reymago86

  • PIC10
  • *
  • Mensajes: 6
Re: Programa en CCS C y funciona bien en Proteus pero no en la realidad!
« Respuesta #4 en: 06 de Agosto de 2012, 20:42:10 »
Tambien queria preguntarles si saben como puedo conocer el tamaño del archivo hex. Haciendo con el boton derecho del mouse en el fichero me dice q pesa 28kb pero lei por ahi q no ocupa lo mismo en el pic.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Programa en CCS C y funciona bien en Proteus pero no en la realidad!
« Respuesta #5 en: 07 de Agosto de 2012, 20:18:57 »
hola

lo del ahorrar espacio podias ponerlo en funciones,
de forma que cuando estas dentro de la funcion crea variables para su uso
y despues al salir las destruye de esta forma no hace falta despilfarrar recursos.

lo de las variables globales, de 32 seria posible usar de 16 mira que 2 elevado a 16 te permite
un numero muy grande 65536 si fuera asi te ahorrarias espacio.

respecto a las cosas raras a que te refieres con raras?.

cuando lo compilas en ccs o
durante su la construcion te lo dice el uso de rom y de ram
y en el fichero o ventana de salida tambien te lo dice en % de lo designado fisicamnete al pic
en el caso de ser mayor que la capacidad que el tamaño del pic tambien te lo dice.

Un saludo.
« Última modificación: 11 de Agosto de 2012, 22:58:52 por pajaro »

Desconectado reymago86

  • PIC10
  • *
  • Mensajes: 6
Re: Programa en CCS C y funciona bien en Proteus pero no en la realidad!
« Respuesta #6 en: 08 de Agosto de 2012, 20:10:43 »
Muchas gracias por las recomendaciones ya las realize, una vez q las pruebe en la placa les comento como me fue. Saludos!

Desconectado reymago86

  • PIC10
  • *
  • Mensajes: 6
Re: Programa en CCS C y funciona bien en Proteus pero no en la realidad!
« Respuesta #7 en: 11 de Agosto de 2012, 13:05:23 »
Muchas gracias a todos! pude solucionar mi problema al separar en subfunciones todo el programa como me lo habian recomendado. Saludos!


 

anything