Autor Tema: duda para utilizar "Reset_cpu();"  (Leído 1113 veces)

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

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 265
duda para utilizar "Reset_cpu();"
« en: 03 de Septiembre de 2022, 17:55:11 »
cordial saludo,,,
requiero salir de una función que a la vez a sido llamada desde otra función, esto es debido a que mientras esta ejecutando las instrucciones de de estas funciones, 2 pines de entrada pueden haber cambiado su estado, entonces requiero que haga tras cosas.
no puedo utilizar "pin on change" por que ya estos pines que tienen estas funciones los estoy utilizando  en un puerto completo, es decir los pines que requiero chequear no los puedo usar para interrupciones.
lo único que me ha funcionado es "Reset_cpu();" creo entender que esto reinicia a partir del "void main" en adelante.
no se, si es perjudicial resetear tantas veces el pic y se dañe.
no quisiera utilizar "goto" (programo en CCS)
que podría hacer en este caso,, gracias de antemano.
« Última modificación: 03 de Septiembre de 2022, 18:12:09 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:duda para utilizar "Reset_cpu();"
« Respuesta #1 en: 03 de Septiembre de 2022, 18:12:27 »
cordial saludo,,,
requiero salir de una función que a la vez a sido llamada desde otra función, esto es debido a que mientras esta ejecutando las instrucciones de de estas funciones, 2 pines de entrada pueden haber cambiado su estado, entonces requiero que haga tras cosas.
no puedo utilizar "pin on change" por que ya estos pines que tienen estas funciones los estoy utilizando  en un puerto completo, es decir los pines que requiero chequear no los puedo usar para interrupciones.
lo único que me ha funcionado es "Reset_cpu();" creo entender que esto reinicia a partir del "void main" en adelante.
no se, si es perjudicial resetear tantas veces el pic y se dañe.
que podría hacer en este caso,, gracias de antemano.

Yo creo que deberías compartir un pseudocódigo de lo que deseas hacer para comprenderlo de mejor manera.

Utilizar un reset de software, es solamente en circunstancias como un cambio de configuración en el sistema, o ante un problema eminente, (Algo así como lo que hace el perro guardián) y se lo ocupa muy pocas veces, no como algo normal dentro de un código.

Tal vez no sea peligroso, sería de analizar el hardware si bajo ciertas circunstancias podría pasar algo, pero una cosa es segura, utilizar un reinicio como parte del funcionamiento normal del código implica una mal programador de código.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:duda para utilizar "Reset_cpu();"
« Respuesta #2 en: 03 de Septiembre de 2022, 20:09:36 »
Por lo que llego a entender:

Creo que tiene funciones anidadas, y si detecta que cambiaron los pines tiene dejar de hacer lo que tiene que hacer y hacer otra cosa.

La única opción seria modificar el programa para que esto sea posible.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 265
Re:duda para utilizar "Reset_cpu();"
« Respuesta #3 en: 03 de Septiembre de 2022, 21:09:03 »
si, comprendo..
he tratado de hacerlo de muchas formas pero llego al mismo problema, tratare de explicarlo en párrafos cortos.
*  leo los pulsadores
* voy a una función que tiene swich con diferentes secuencias de led
* mientras ejecuta la secuencia de leds elegida (dentro de un for)
* llamo otra función para que revise de nuevo los pulsadores
* si hay un cambio entonces "Reset_cpu();"

tengo que preguntar dentro del for por los pulsadores por que necesito que si hay un cambio en los pulsadores cambiar la secuencia de inmediato y no esperar a que termine la que esta haciendo.

trate de duplicar dentro de otra función la lectura de los pulsadores pero me sale un error al parecer la pila detecta un trozo igual en el programa.

si hago "Reset_cpu();" todo va bien pero no se que daño pueda ocasionar, he tratado con break, return, exit y nada.
Si algo parece complicado... es por que esta mal explicado.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:duda para utilizar "Reset_cpu();"
« Respuesta #4 en: 03 de Septiembre de 2022, 22:31:12 »
si, comprendo..
he tratado de hacerlo de muchas formas pero llego al mismo problema, tratare de explicarlo en párrafos cortos.
*  leo los pulsadores
* voy a una función que tiene swich con diferentes secuencias de led
* mientras ejecuta la secuencia de leds elegida (dentro de un for)
* llamo otra función para que revise de nuevo los pulsadores
* si hay un cambio entonces "Reset_cpu();"

tengo que preguntar dentro del for por los pulsadores por que necesito que si hay un cambio en los pulsadores cambiar la secuencia de inmediato y no esperar a que termine la que esta haciendo.

trate de duplicar dentro de otra función la lectura de los pulsadores pero me sale un error al parecer la pila detecta un trozo igual en el programa.

si hago "Reset_cpu();" todo va bien pero no se que daño pueda ocasionar, he tratado con break, return, exit y nada.

La idea de un pseudocódigo es que escribas un poco de código aunque la sintaxis no sea la correcta.

Lo voy ha hacer siguiendo lo que has descrito, pero eres tu quien debe escribirlo para comprender exactamente que pasa. Seguramente está mal lo que hice, pero de esa manera te darás cuenta que sólo escribiendo el código (o compartiendo el código verdadero), se podrá ayudarte

Código: C
  1. void main(void)
  2. {
  3.     while(true)// lazo principal
  4.     {
  5.              if (pulsadorX == X && pulsadorB == Y) //leo los pulsadores
  6.              {
  7.                       funcionConSwitch();
  8.              }
  9.      }
  10. }
  11.  
  12. void funcionConSwitch(void)
  13. {
  14.       switch(secuencia)
  15.      {
  16.            case 0x00: //secuencia de led 1
  17.            {
  18.                 .....
  19.                 break;
  20.            }
  21.            case 0x01: //secuencia de led 2
  22.            {
  23.                 .....
  24.                 break;
  25.            }
  26.            case 0x02: //secuencia de led 1
  27.            {
  28.                 for(i = 0; i < Z; i++)
  29.                 {
  30.                         if (true == funcion2())
  31.                        {
  32.                              secuencia = 0;
  33.                              return;    
  34.                        }
  35.                 }
  36.                 break;
  37.            }          
  38.            ....
  39.            default: //secuencia de led n
  40.            {
  41.                 .....
  42.            }
  43.      }
  44. }
  45.  
  46. bool funcion2(void)
  47. {
  48.        if (pulsadorX == W && pulsadorB == K) //reviso los pulsadores
  49.       {
  50.           return true//Reset_cpu();
  51.        }
  52.        return false;
  53. }
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:duda para utilizar "Reset_cpu();"
« Respuesta #5 en: 04 de Septiembre de 2022, 01:17:22 »
Citar
si, comprendo..
he tratado de hacerlo de muchas formas pero llego al mismo problema, tratare de explicarlo en párrafos cortos.
*  leo los pulsadores
* voy a una función que tiene swich con diferentes secuencias de led
* mientras ejecuta la secuencia de leds elegida (dentro de un for)
* llamo otra función para que revise de nuevo los pulsadores
* si hay un cambio entonces "Reset_cpu();"

Por favor mostrar como es la secuencia de leds... ahi tenes el problema.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 265
Re:duda para utilizar "Reset_cpu();"
« Respuesta #6 en: 04 de Septiembre de 2022, 11:27:14 »
gracias por la ayuda, tal vez así sea mas claro..

   
Código: C
  1. void  sw();
  2.  void salida();
  3.  
  4.  
  5.   void (main)
  6.   {
  7.   while (true)
  8.   {
  9.  
  10.               if ((entradas==16)||(entradas==25)||(entradas==18)||(entradas==27))
  11.                  {  
  12.                  estado=1;
  13.                  estadoanterior=estado;
  14.                  valor2=read_eeprom(11);// valor para leer en swich
  15.                  h=read_eeprom(21);
  16.                  doble=read_eeprom(31);
  17.                  sw();
  18.                  }
  19.  
  20.                if ((entradas==24)||(entradas==26)||(entradas==10))
  21.                   {
  22.                   estado=2;        
  23.                   estadoanterior=estado;
  24.                   valor2=read_eeprom(13);
  25.                   h=read_eeprom(23);  //read_eeprom(30);
  26.                   doble=read_eeprom(33);        
  27.                   sw();
  28.                   }
  29.  
  30.   }//while (true
  31.  
  32.   }//void(main)
  33.  
  34.  
  35. //************************
  36.  void sw()
  37.    {
  38.          switch(valor2)
  39.         {      
  40.            case 'a':    // secuencia 1  
  41.            for(j=0;j<=n;j++)
  42.            {
  43.            bit_set(mezcla,j)   ;        
  44.            salida();
  45.            }
  46.         }
  47.   }
  48. //********************
  49.  void salida()
  50.  {
  51.          if ((entradas==16)||(entradas==25)||(entradas==18)||(entradas==27))
  52.             {
  53.             estado=1;
  54.             porta=mezcla;
  55.             portb=mezcla;
  56.             }
  57.  
  58.             if ((entradas==24)||(entradas==26)||(entradas==10))
  59.             {
  60.             estado=2;
  61.             porta=mezcla;
  62.             portb=0xff;  
  63.             }
  64.      
  65.             If (estadoanterior!=estado)
  66.             {
  67.             Reset_cpu();//  si hubo cambio en las entradas hago reinicio
  68.             }
  69.  
  70. }
  71. //****************************
« Última modificación: 04 de Septiembre de 2022, 11:46:34 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:duda para utilizar "Reset_cpu();"
« Respuesta #7 en: 04 de Septiembre de 2022, 12:10:50 »
reset_cpu() no salta a main() sino a la dirección 0x0000 , dependiendo del micro, limpia algunos registros antes de saltar.
Esto significa que primeros se inicializarán variables y registros antes de ir a main().

Mas prolijo sería que la función salida() no sea void sino int8 o bool , y de acuerdo a lo que devuelva retornar a main().

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 265
Re:duda para utilizar "Reset_cpu();"
« Respuesta #8 en: 04 de Septiembre de 2022, 12:16:03 »
reset_cpu() no salta a main() sino a la dirección 0x0000 , dependiendo del micro, limpia algunos registros antes de saltar.
Esto significa que primeros se inicializarán variables y registros antes de ir a main().

Mas prolijo sería que la función salida() no sea void sino int8 o bool , y de acuerdo a lo que devuelva retornar a main().
hola eduardo gracias por responderme.
Citar
Mas prolijo sería que la función salida() no sea void sino int8 o bool , y de acuerdo a lo que devuelva retornar a main().
esta parte que me indicas no se como trabaja, podrías explicarme un poco por favor ademas, no se como saltar al main, y goto no quisiera usarlo por 2 razones:
* los programadores expertos no lo aceptan
* y he leído que no se puede ir a goto estando dentro de una función.
Si algo parece complicado... es por que esta mal explicado.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:duda para utilizar "Reset_cpu();"
« Respuesta #9 en: 04 de Septiembre de 2022, 13:12:25 »
gracias por la ayuda, tal vez así sea mas claro..

   
Código: C
  1. void  sw();
  2.  void salida();
  3.  
  4.  
  5.   void (main)
  6.   {
  7.   while (true)
  8.   {
  9.  
  10.               if ((entradas==16)||(entradas==25)||(entradas==18)||(entradas==27))
  11.                  {  
  12.                  estado=1;
  13.                  estadoanterior=estado;
  14.                  valor2=read_eeprom(11);// valor para leer en swich
  15.                  h=read_eeprom(21);
  16.                  doble=read_eeprom(31);
  17.                  sw();
  18.                  }
  19.  
  20.                if ((entradas==24)||(entradas==26)||(entradas==10))
  21.                   {
  22.                   estado=2;        
  23.                   estadoanterior=estado;
  24.                   valor2=read_eeprom(13);
  25.                   h=read_eeprom(23);  //read_eeprom(30);
  26.                   doble=read_eeprom(33);        
  27.                   sw();
  28.                   }
  29.  
  30.   }//while (true
  31.  
  32.   }//void(main)
  33.  
  34.  
  35. //************************
  36.  void sw()
  37.    {
  38.          switch(valor2)
  39.         {      
  40.            case 'a':    // secuencia 1  
  41.            for(j=0;j<=n;j++)
  42.            {
  43.            bit_set(mezcla,j)   ;        
  44.            salida();
  45.            }
  46.         }
  47.   }
  48. //********************
  49.  void salida()
  50.  {
  51.          if ((entradas==16)||(entradas==25)||(entradas==18)||(entradas==27))
  52.             {
  53.             estado=1;
  54.             porta=mezcla;
  55.             portb=mezcla;
  56.             }
  57.  
  58.             if ((entradas==24)||(entradas==26)||(entradas==10))
  59.             {
  60.             estado=2;
  61.             porta=mezcla;
  62.             portb=0xff;  
  63.             }
  64.      
  65.             If (estadoanterior!=estado)
  66.             {
  67.             Reset_cpu();//  si hubo cambio en las entradas hago reinicio
  68.             }
  69.  
  70. }
  71. //****************************

Lo que entiendo es que deseas finalizar el for antes que se complete al máximo (j >n) cuando en salida se cumpla el If (estadoanterior!=estado)

Si es así, salida deberá retornar un valor, digamos true:
Código: C
  1. bool salida()
  2.  {
  3.          if ((entradas==16)||(entradas==25)||(entradas==18)||(entradas==27))
  4.             {
  5.             estado=1;
  6.             porta=mezcla;
  7.             portb=mezcla;
  8.             }
  9.  
  10.             if ((entradas==24)||(entradas==26)||(entradas==10))
  11.             {
  12.             estado=2;
  13.             porta=mezcla;
  14.             portb=0xff;  
  15.             }
  16.      
  17.             If (estadoanterior!=estado)
  18.             {
  19.                return true;//Reset_cpu();//  si hubo cambio en las entradas hago reinicio
  20.             }
  21.             return false;// para otra condición
  22. }

Y en el lazo for, cuando salida retorne un true, se lo finaliza antes de cumplir todas las iteraciones
Código: C
  1. void sw()
  2.    {
  3.          switch(valor2)
  4.         {      
  5.            case 'a':    // secuencia 1  
  6.            for(j=0;j<=n;j++)
  7.            {
  8.            bit_set(mezcla,j)   ;        
  9.               if (true == salida()
  10.              {
  11.                       break; //un break dentro de un for finaliza antes de completar
  12.              }
  13.            }
  14.         }
  15.   }
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:duda para utilizar "Reset_cpu();"
« Respuesta #10 en: 04 de Septiembre de 2022, 13:25:08 »
gracias por la ayuda, tal vez así sea mas claro..

   
Código: C
  1. void  sw();
  2.  void salida();
  3.  
  4.  
  5.   void (main)
  6.   {
  7.   while (true)
  8.   {
  9.  
  10.               if ((entradas==16)||(entradas==25)||(entradas==18)||(entradas==27))
  11.                  {  
  12.                  estado=1;
  13.                  estadoanterior=estado;
  14.                  valor2=read_eeprom(11);// valor para leer en swich
  15.                  h=read_eeprom(21);
  16.                  doble=read_eeprom(31);
  17.                  sw();
  18.                  }
  19.  
  20.                if ((entradas==24)||(entradas==26)||(entradas==10))
  21.                   {
  22.                   estado=2;        
  23.                   estadoanterior=estado;
  24.                   valor2=read_eeprom(13);
  25.                   h=read_eeprom(23);  //read_eeprom(30);
  26.                   doble=read_eeprom(33);        
  27.                   sw();
  28.                   }
  29.  
  30.   }//while (true
  31.  
  32.   }//void(main)
  33.  
  34.  
  35. //************************
  36.  void sw()
  37.    {
  38.          switch(valor2)
  39.         {      
  40.            case 'a':    // secuencia 1  
  41.            for(j=0;j<=n;j++)
  42.            {
  43.            bit_set(mezcla,j)   ;        
  44.            salida();
  45.            }
  46.         }
  47.   }
  48. //********************
  49.  void salida()
  50.  {
  51.          if ((entradas==16)||(entradas==25)||(entradas==18)||(entradas==27))
  52.             {
  53.             estado=1;
  54.             porta=mezcla;
  55.             portb=mezcla;
  56.             }
  57.  
  58.             if ((entradas==24)||(entradas==26)||(entradas==10))
  59.             {
  60.             estado=2;
  61.             porta=mezcla;
  62.             portb=0xff;  
  63.             }
  64.      
  65.             If (estadoanterior!=estado)
  66.             {
  67.             Reset_cpu();//  si hubo cambio en las entradas hago reinicio
  68.             }
  69.  
  70. }
  71. //****************************


Lo que entiendo es que deseas finalizar el for antes que se complete al máximo (j >n) cuando en salida se cumpla el If (estadoanterior!=estado)

Si es así, salida deberá retornar un valor, digamos true:
Código: C
  1. bool salida()
  2.  {
  3.          if ((entradas==16)||(entradas==25)||(entradas==18)||(entradas==27))
  4.             {
  5.             estado=1;
  6.             porta=mezcla;
  7.             portb=mezcla;
  8.             }
  9.  
  10.             if ((entradas==24)||(entradas==26)||(entradas==10))
  11.             {
  12.             estado=2;
  13.             porta=mezcla;
  14.             portb=0xff;  
  15.             }
  16.      
  17.             If (estadoanterior!=estado)
  18.             {
  19.                return true;//Reset_cpu();//  si hubo cambio en las entradas hago reinicio
  20.             }
  21.             return false;// para otra condición
  22. }

Y en el lazo for, cuando salida retorne un true, se lo finaliza antes de cumplir todas las iteraciones
Código: C
  1. void sw()
  2.    {
  3.          switch(valor2)
  4.         {      
  5.            case 'a':    // secuencia 1  
  6.            for(j=0;j<=n;j++)
  7.            {
  8.            bit_set(mezcla,j)   ;        
  9.               if (true == salida()
  10.              {
  11.                       break; //un break dentro de un for finaliza antes de completar
  12.              }
  13.            }
  14.         }
  15.   }

Analizando mas detenidamente tu código, tal vez si estás en sw() en la línea 17 de tu código, es posible que desees que cuando se cumpla la condición If (estadoanterior!=estado), no se ejecute el siguiente if de la línea 20, if ((entradas==24)||(entradas==26)||(entradas==10)) .

Entonces sw debe también retornar una variable y sería así:
Código: C
  1. bool sw()
  2.    {
  3.          switch(valor2)
  4.         {      
  5.            case 'a':    // secuencia 1  
  6.            for(j=0;j<=n;j++)
  7.            {
  8.            bit_set(mezcla,j)   ;        
  9.               if (true == salida()
  10.              {
  11.                       return true; //un return también finaliza un for
  12.              }
  13.            }
  14.         }
  15.        return false; //para cualquier otra condición
  16.   }


Y lo utilizarías así en tu código:

Código: C
  1. bool badera;
  2. void (main)
  3.   {
  4.   while (true)
  5.   {
  6.  
  7.               if ((entradas==16)||(entradas==25)||(entradas==18)||(entradas==27))
  8.                  {  
  9.                  estado=1;
  10.                  estadoanterior=estado;
  11.                  valor2=read_eeprom(11);// valor para leer en swich
  12.                  h=read_eeprom(21);
  13.                  doble=read_eeprom(31);
  14.                   bandera = sw();
  15.                  }
  16.                  if (false == bandera) //mientras bandera sea false, se ejecutaría el if de abajo
  17.                 {
  18.                         if ((entradas==24)||(entradas==26)||(entradas==10))
  19.                         {
  20.                             estado=2;        
  21.                             estadoanterior=estado;
  22.                             valor2=read_eeprom(13);
  23.                              h=read_eeprom(23);  //read_eeprom(30);
  24.                             doble=read_eeprom(33);        
  25.                             sw();
  26.                        }
  27.                 }
  28.  
  29.   }//while (true
  30.  
  31.   }//void(main)
« Última modificación: 04 de Septiembre de 2022, 13:35:33 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:duda para utilizar "Reset_cpu();"
« Respuesta #11 en: 04 de Septiembre de 2022, 13:57:40 »
...
esta parte que me indicas no se como trabaja, podrías explicarme un poco por favor ademas, no se como saltar al main,
Ya DominusDDR dió un ejemplo del procedimiento.

Citar
y goto no quisiera usarlo por 2 razones:
* los programadores expertos no lo aceptan
Lo que los programadores no lo aceptan es una cuestión meramente religiosa nacida de un artículo de Dijkstra.  Un exceso de goto es tan ilegible como un exceso de anidamientos. 
Al único que le complican la vida es al compilador cuando tiene que optimizar.

Citar
* y he leído que no se puede ir a goto estando dentro de una función.
No se puede ir a cualquier parte porque se corrompe la pila (stack). 

En CCS no te deja hacerlo pues las etiquetas son locales.  En assembler sí, pero salvo que se trate de una función que restaure el estado inicial lo mas probable es que ocurra un desastre.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 265
Re:duda para utilizar "Reset_cpu();"
« Respuesta #12 en: 04 de Septiembre de 2022, 14:58:40 »
huyyy que nota,,, trabajo de una.
aprendí cosas nuevas con "bool"
retorno con true al swich y allí hago el break y pasa a revisar de nuevo los pulsadores.... super! sabia que ustedes tendrían la opción para no hacer reset continuamente!

Mil gracias a todos por las enseñanzas.
Si algo parece complicado... es por que esta mal explicado.