Autor Tema: Resetear el PIC por la RS232.  (Leído 4884 veces)

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

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Resetear el PIC por la RS232.
« en: 19 de Febrero de 2007, 06:59:00 »
Buenas, antes de decir nada, quiero dar las gracias a todos los participantes del FORO que es el mejor que hay en la red para mi gusto.

Bueno voy a lanzar unas dudas que no se como las puedo resolver, a ver si se os ocurre algo. Hace tiempo terminé un proyecto para controlar desde un PC(Labview) una tarjeta que activa un RELÉ. Esta tarjeta tiene un PIC16F877 al cual lo comando desde la RS232 (gracias a unas rutinas de REDPIC). Implementé en mi programa en labview un botón de RESET. Este botón envía un comando y resetea mi PIC.El comando que reinicializa es RESET_CPU(). Hasta aquí va todo bien. El problema está, que cuando reseteo mi PIC y el relé que controla está conectado, pues como es lógico este deja de crujir. Esto no me puedo ocurrir porque mi sistema se vendría abajo, entonces os preguntáis ¿Para qué necesitas el RESET? Pues muy sencillo si por cualquier motivo mi PIC se va de viaje que pueda inicializarlo pero sin que se venga abajo mi sistema. Tengo activado el Watchdog a 144ms y la función restart cause() por si el watchdog desborda, por un microreset en la patilla MCLR o por un ruído en la alimentación que mi relé no deje de crujir. TODO esto me funciona muy bien, he simulado tanto un micro reset en la patilla MCLR como un ruído en la alimentación y va muy bien pero a la hora de hacer un reset desde el PC no se como hacerlo. Los valores del Relé los guardo en la EEPROM del PIC. En la posición 0 de la EEPROM guardo el Valor 0 ó 1 según si está activa o no.


Código: [Seleccionar]
  if(cbuff[0]=='R'&&cbuff[1]=='E'&&cbuff[2]=='S'&&cbuff[3]=='E'&&cbuff[4]=='T'&&cbuff[6]==0x00){

 /*     flag_Fuente1=read_eeprom(0);

      flag=1;
      #zero_ram
      printf("RESET");
      reset_cpu();             // Resetea el pic y ya no se ejecuta lo que hay bajo Buffff ...
         if (flag_Fuente1==1)
            {
               output_high(PIN_B1);
            }
         else
            {
               output_low(PIN_B1);
            }*/

   }
Aplicaciones Electrónicas
http://www.neoingenia.com/

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Resetear el PIC por la RS232.
« Respuesta #1 en: 19 de Febrero de 2007, 11:48:35 »
umalrovi ¿que sería que deje de crujir? en argentina crujir es cuando el ruido de "algo" cuando lo rompes.  Ej, el crujir de una nuez.  Por eso te pido que lo aclares.

Si lo que quieres es enclavar el relé sin importar qué ocurra al pic deberás utilizar latchs pero que tengan una alimentación que dure un buen tiempo (no sensible a resets).

Por otra parte el famoso RESET_CPU() del que hablas, si es el del CCS, ten mucho cuidado ya que la ultima información que tengo del tema es que hace un programcounter = 0 lo cual no es precisamente un reset y si el stack tiene 'algo' no se borrará.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Resetear el PIC por la RS232.
« Respuesta #2 en: 19 de Febrero de 2007, 11:48:58 »
Hola Alfon!!!

Para resetear al PIC desde el ordenador lo que haces es recibir la trama de RESET y despues utilizar la función 'reset_cpu()', ¿no?

Por otro lado comentas que cuando el RESET se te produce por el Watchdog o por ruido el sistema te va muy bien, ¿no?

Pues... que te parece si el lugar de hacer el reset llamando a la función 'reset_cpu()' lo haces llamando a una función que tu te creas y la cual se mete en un bucle infinito y sin refresco de watchdog.

Cuando tú PIC reciba del ordenata la trama de RESET se irá a un bucle y como máximo en 144ms se te reseteará el sistema y se rearmará con las funciones que ya tienes implementadas.

Ya nos comentas.

PD: Es muy posible que tengas que acoger por tú querido madrid a primeros de Marzo. Ves buscando buenos sitios para ir y una buena novia que me quiera y me comprenda jjajaja  :D :D

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Re: Resetear el PIC por la RS232.
« Respuesta #3 en: 19 de Febrero de 2007, 13:14:01 »
Muchas asias Sr. Iván y Maumix!!! Cuando hablo de crujir en mi lenguaje coloquial, me refiero a que el relé conmute. Esa era mi última idea de hacer un reset, ya me lo comentaste hace tiempo tomandonos unas cañas pero quería saber si la gente lo hace de otra manera.

Maumix, para borrar el contador creo recordar que en este foro me sugirieron que pusiese esto:
Código: [Seleccionar]
   if(cbuff[0]=='R'&&cbuff[1]=='E'&&cbuff[2]=='S'&&cbuff[3]=='E'&&cbuff[4]=='T'&&cbuff[6]==0x00){

 /*     flag_Fuente1=read_eeprom(0);

      flag=1;
      #zero_ram
      printf("RESET");
      reset_cpu();             // Reset
         if (flag_Fuente1==1)
            {
               output_high(PIN_B1);
            }
         else
            {
               output_low(PIN_B1);
            }*/

   }
Aplicaciones Electrónicas
http://www.neoingenia.com/

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Resetear el PIC por la RS232.
« Respuesta #4 en: 19 de Febrero de 2007, 13:35:40 »
 :shock: :shock:

Ojo con lo que te dicen y en qué contexto te lo dicen!!

Ese #zeroram es para que las variables sean 0 pero no el program counter.

Si aún así lo hiciese no puedes alterar el funcionamiento del PIC por más CCS u otro compilador que uses.

El tema es que el STACK de los CALLs se va a llenar con cada CALL y a vaciar con cada return.  Por más que hagas lo que hagas eso es INEVITABLE. 

En los 18F hay una instrucción reset, en los 16F no la hay y si mal no recuerdo lo que hacia esa instrucción era hacer un GOTO a la posición 0x000 lo cual si hay algo en el stack hará "como si se reseteara" pero en realidad no es así.  Luego si tenías algo en el stack y ejecutas dicho reset alguna que otra vez, al llenarse el stack tu software hará cosas impredecibles y por ende peligrosas.

Para ser más concretos, te sugiero sigas este link donde alguna vez se trató el tema.
http://www.todopic.com.ar/foros/index.php?topic=13890.0

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Re: Resetear el PIC por la RS232.
« Respuesta #5 en: 19 de Febrero de 2007, 14:16:45 »
Muchas gracias!!! voy a leer el link y gracias!!!

Saludos
Aplicaciones Electrónicas
http://www.neoingenia.com/