Autor Tema: Resetear variable  (Leído 1990 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Resetear variable
« en: 10 de Mayo de 2013, 13:50:09 »
Hola amigos, les planteo la siguiente situación para ver si conocen alguna alternativa

Necesito que al iniciar el PIC (polarizarlo) una variable X arranque en cero pero luego si genero una función reset_cpu() esta variable me conserve el dato que tenga en ese momento.

Conocen alguna alternativa ?.

Muchas gracias.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Resetear variable
« Respuesta #1 en: 10 de Mayo de 2013, 13:54:25 »
Lo ideal es guardar su valor en EEPROM y volver a levantarlo cuando ocurre un reset...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Resetear variable
« Respuesta #2 en: 10 de Mayo de 2013, 14:22:22 »
Hola Marcos, el problema es que esto ocurriría muchas veces y en poco tiempo me tiro la eeprom.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Resetear variable
« Respuesta #3 en: 10 de Mayo de 2013, 14:44:13 »
Hola Diego,

el reset_cpu() seguramente modifique las mísmas variables que un !MCLR RESET. Podés revisar el datasheet para ver cuáles "sobreviven" a ser inicializadas por un evento de ese tipo. Igualmente, creo recordar que hay registros que te permitirían determinar el origen del inicio, si es por un Power Cycle o por distintos tipos de Reset. De esa manera podrías elegir si quieres inicializar la variable por única vez, o dejarla inalterada. Eso sí, ante un Power Cycle, perderás el valor si no lo guardas en otra memoria no volátil.

Saludos.
"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 planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Resetear variable
« Respuesta #4 en: 10 de Mayo de 2013, 15:07:33 »
el problema es que esto ocurriría muchas veces y en poco tiempo me tiro la eeprom.


La eeprom de datos de un PIC tiene 1.000.000 de ciclos de borrado/escritura, será díficil que la tumbes, distinto sería usar la flash que solo tiene 1000. Otra alternativa sería conectar una eeprom externa por I2C, montada en un zócalo y cambiarla cuando expire, pero vamos con 1 millon de borrados/escrituras hay más que de sobra para cualquier aplicación.
 


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Resetear variable
« Respuesta #5 en: 10 de Mayo de 2013, 15:26:34 »
el problema es que esto ocurriría muchas veces y en poco tiempo me tiro la eeprom.


La eeprom de datos de un PIC tiene 1.000.000 de ciclos de borrado/escritura, será díficil que la tumbes, distinto sería usar la flash que solo tiene 1000. Otra alternativa sería conectar una eeprom externa por I2C, montada en un zócalo y cambiarla cuando expire, pero vamos con 1 millon de borrados/escrituras hay más que de sobra para cualquier aplicación.
 



La matemática puede engañar. Un millón de veces puede no ser tanto como parece. Si te la pasas grabando la EEPROM del uC, es decir, guardas la variable cada 5ms, que es el tiempo mínimo, pasarías el millón de grabaciones en poco más de hora y media.
"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 Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Resetear variable
« Respuesta #6 en: 10 de Mayo de 2013, 15:42:02 »
Gracias a todos por sus respuestas, trataré de explicarles un poco más mi necesidad.

Tengo un PIC que a iniciar por primera vez (energizarse) chequea por uno de sus pines un bit proveniente de otro circuito, este sólo aparece en este momento, si el bit es cero el PIC guarda un valor en una variable, por muchas razones este PIC se resetea constantemente lo que hace que el valor de la variable se pierda. Sólo cuando se energiza necesito que la variable inicie en ceros luego a pesar de los reste_cpu() debe conservar el dato

No habrá una variable interna del PIC que no la afecte el reste_cpu() tal como creo entenderle a Bruno ?.

Saludos.

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Resetear variable
« Respuesta #7 en: 10 de Mayo de 2013, 17:01:42 »
Estoy tratando de hacer lo siguiente:

//saber cual es el estado del reset

val_reset = restart_cause();

if(val_reset == 25)
{
   hay_ups = 0;
}

Esto me funciona, al iniciar restart_cause() devuelve el 25 en este momento si debe restablecer la variable hay_ups, cuando se genera otro reset restart_cause() devuelve otro número, acá no se debe resetear la variable hay_ups.

Ahora el inconveniente es que quiero utilizar la directiva #zero_ram, hay forma de excluir una variable del #zero_ram(), reservarla o que se yo ?

Otra alternativa que veo es borrar la RAM indirectamente, como lo hacía en assembler, que opinan ?

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Resetear variable
« Respuesta #8 en: 10 de Mayo de 2013, 17:11:42 »



Lo que estás tratando de hacer es barrer y esconder la basura bajo la alfombra, mala costumbre, tu problema ese ese reseteo descontrolado, y es lo que deberías de resolver, en vez de buscar parches por software, a un mal diseño de hardware.

Blinda la unidad, filtra y estabiliza bien la tensión en continua, y mete alguna bobina para bloquear los parásitos de radiofrecuencia. Comprueba que tienes puestos todos los condensadores de desacoplo y que están lo más cerca posible del micro.



Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Resetear variable
« Respuesta #9 en: 10 de Mayo de 2013, 17:19:52 »
La matemática puede engañar. Un millón de veces puede no ser tanto como parece. Si te la pasas grabando la EEPROM del uC, es decir, guardas la variable cada 5ms, que es el tiempo mínimo, pasarías el millón de grabaciones en poco más de hora y media.


Por eso cada problema tiene una solución, a nadie se le ocurriría usar una eeprom para esa aplicación.




Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Resetear variable
« Respuesta #10 en: 10 de Mayo de 2013, 18:16:37 »
el problema es que esto ocurriría muchas veces y en poco tiempo me tiro la eeprom.


La eeprom de datos de un PIC tiene 1.000.000 de ciclos de borrado/escritura, será díficil que la tumbes, distinto sería usar la flash que solo tiene 1000. Otra alternativa sería conectar una eeprom externa por I2C, montada en un zócalo y cambiarla cuando expire, pero vamos con 1 millon de borrados/escrituras hay más que de sobra para cualquier aplicación.
 



No quiero generar discusión, pero estas no son tus palabras acaso? No sos vos mísmo quien la sugirió? quien dice que es dificil tumbarla y quien dice que hay más que de sobra para cualquier aplicación?

Lo que yo hice fue presentar un contraejemplo, para simplemente aclarar que hay aplicaciones en la que no es recomendable.

"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 BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Resetear variable
« Respuesta #11 en: 10 de Mayo de 2013, 18:20:51 »
Estoy tratando de hacer lo siguiente:

//saber cual es el estado del reset

val_reset = restart_cause();

if(val_reset == 25)
{
   hay_ups = 0;
}

Esto me funciona, al iniciar restart_cause() devuelve el 25 en este momento si debe restablecer la variable hay_ups, cuando se genera otro reset restart_cause() devuelve otro número, acá no se debe resetear la variable hay_ups.

Ahora el inconveniente es que quiero utilizar la directiva #zero_ram, hay forma de excluir una variable del #zero_ram(), reservarla o que se yo ?

Otra alternativa que veo es borrar la RAM indirectamente, como lo hacía en assembler, que opinan ?

No creo que haya forma de generarle la excepción a la directiva del precompilador: #zero_ram(). Lo más sencillo es o bien generar una rutina propia de borrado a bajo nivel, o mediante punteros, o simplemente asegurarse de inicializar correctamente todas las variables que utilices.

Saludos.
"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 Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Resetear variable
« Respuesta #12 en: 10 de Mayo de 2013, 18:29:16 »
Hola Bruno, creo que generaré una rutina de reset a través de punteros.

Muchas gracias