Autor Tema: Como detener un ciclo While  (Leído 8657 veces)

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

Desconectado lesterm123

  • PIC10
  • *
  • Mensajes: 3
Como detener un ciclo While
« en: 21 de Julio de 2011, 00:37:42 »
Hola amigos electronicos, este es mi primer tema, y pues quisiera que me ayudaran, es que estoy haciendo un proyecto, y la verdad ya tengo el programa casi terminado, pero me falta una ultima cosa, lo hice con un ciclo While, y quisiera saber como puedo hacer para detenerlo ya sea con un switch o pulsador o lo que recomienden. Este es el codigo:



//Programa realizado por Lester Afredo Morales Villalobos

#Include <16f887.h>
#Use Delay (Clock=4M)
#Fuses XT NOLVP NOBROWNOUT PUT NOWDT
#Define Piston1 PortA,0
#Define Piston2 PortA,1
#Define Piston3 PortA,2
#Define Motor PortB,0
#Define Sw PortC,0
#Byte PortA=5
#Byte PortB=6
#Byte PortC=7

   Void Main()
   
      {
         Set_Tris_A(0B11111000);
         Set_Tris_B(0B11111110);
         Set_Tris_C(0B11111111);
         
         
            While (True)
           
              {
                  Bit_clear(Piston1);
                  Bit_clear(Motor);
                 
                  If (Bit_test(Sw))
                 
                     {
                 
                        Delay_ms(5000);
                        Bit_set(Motor);
                        Delay_ms(2000);
                        Bit_clear(Motor);
                        Delay_ms(1000);
                        Bit_set(Piston1);
                        Delay_ms(2000);
                        Bit_clear(Piston1);
                        Delay_ms(1000);
                        Bit_set(Motor);
                        Delay_ms(3000);
                        Bit_clear(Motor);
                        Delay_ms(1000);
                        Bit_set(Piston2);
                        Delay_ms(1000);
                        Bit_clear(Piston2);
                        Delay_ms(1000);
                        Bit_set(Motor);
                        Delay_ms(3000);
                        Bit_clear(Motor);
                        Delay_ms(1000);
                        Bit_set(Piston3);
                        Delay_ms(1000);
                        Bit_clear(Piston3);
                        Delay_ms(1000);
                        Bit_set(Motor);
                        Delay_ms(3000);
                        Bit_clear(Motor);
                       
                      }               
                    }   
                  }
     
           
  //Derechos reservados

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como detener un ciclo While
« Respuesta #1 en: 21 de Julio de 2011, 00:46:13 »
El microntrolador debe quedar en un bucle infinito, sino se reinicia... en un primer while, en lugar de true podes colocar cualquier condicion



Saludos
No contesto mensajes privados, las consultas en el foro

Desconectado lesterm123

  • PIC10
  • *
  • Mensajes: 3
Re: Como detener un ciclo While
« Respuesta #2 en: 21 de Julio de 2011, 00:50:19 »
El microntrolador debe quedar en un bucle infinito, sino se reinicia... en un primer while, en lugar de true podes colocar cualquier condicion



Saludos


Man, es que es una banda transportadora, y lo que hace es activar pistones y un motor, el de la banda, ok le puse un Switch para encender la maquina, entonces, si quiero que el ciclo sea repetitivo, pero digamos que algo salio mal, o hubo un cortocircuito o algo asi, entonces, como hago para agragar otro switch para apagar la maquina. espero me hayas entendido

Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: Como detener un ciclo While
« Respuesta #3 en: 21 de Julio de 2011, 04:28:32 »
Yo no te entiendo muy bien. Pero si lo que quieres es reiniciar el programa pues simplemente enchufa un switch al MCLR y masa y cuando lo pulses el programa del PIC se reinicia y por ende el funcionamiento de la máquina, aunque imagino que esto es demasiado obvio y no estoy entendiendo bien lo que preguntas.
Si por otra parte lo que quieres es hacer como dos estructuras de funcionamiento, como te comento suky, lo debes hacer dentro del while(true), yo pondría 2 variables condicionales y otros 2 while dentro, uno con el modo que tienes y otro con el modo que persigues, de tal forma que cuando pulses el switch cambie,, en plan:
while(true)
{
       while(condicion1)
       {
               Aquí comprueba la condición uno y 2
       }
       while(condicion2)
       {
                Compruebas las dos condiciones
        }
}

Si no te ayuda intenta explicarlo un poco mejor por favor.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como detener un ciclo While
« Respuesta #4 en: 21 de Julio de 2011, 11:26:48 »
Asi es man, es como dice nosecomo, con mclr reseteas todo, o sino vas tener que plantear otro enffoque de programacion no utilizando delay, sino ticks de tiempo e interrupciones, de esa manera podes tstear continuamente si ocurre alguna falla


Saludos
No contesto mensajes privados, las consultas en el foro

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: Como detener un ciclo While
« Respuesta #5 en: 21 de Julio de 2011, 12:18:56 »
Hola, otra  opción sería poner un botón de emergencia, para que se active con un switch de fin de linea.

Desconectado lesterm123

  • PIC10
  • *
  • Mensajes: 3
Re: Como detener un ciclo While
« Respuesta #6 en: 21 de Julio de 2011, 14:10:28 »
Amigos lo que quiero es que con un switch la maquina se apague, ya sea que el ciclo while venga enpesando, esta a mitad o vaya terminando, no importa, no se si me entienden, como el switch de encendido, lo que quiero es otro switch apagar la maquina en cualquier momento.

GRACIAS

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Re: Como detener un ciclo While
« Respuesta #7 en: 21 de Julio de 2011, 14:40:29 »
A ver, en maquinaria, y trabajo en eso, jamas se usa la señal de paro de emergencia en el automata nada mas que como señalizacion de eventos de menor importancia. Debe ser algo que corte de manera hard alimentaciones o algo asi, No se implememta vigilancia por ciclo de programa como emergencia para funciones peligrosas, por sistema. Ademas siempre a contacto cerrado para vigilar posible corte de hilo etc.
Ten en cuenta que es una vigilancia de emergencia, si algo falla y puede ser un bucle de programa hay que parar como sea de forma inmediata.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Como detener un ciclo While
« Respuesta #8 en: 21 de Julio de 2011, 15:26:36 »
yo estoy de acuerdo con suky. todos mis programas siempre tienen un while(true) que corresponde al bucle principal, si lo que quieres es detener un determinado proceso, entonces usa una bandera.



 
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Como detener un ciclo While
« Respuesta #9 en: 21 de Julio de 2011, 16:57:21 »
Hola.

Voy con Algec ... los paros de emergencia se hacen interrumpiendo el flujo de corriente, no es bueno hacerlo desde el firm.

Saludos
El papel lo aguanta todo

Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: Como detener un ciclo While
« Respuesta #10 en: 22 de Julio de 2011, 04:28:55 »
Pues si lo que quieres es paro de emergencia simplemente apaga el controlador con el switch y ya está. Pon un switch normalmente cerrado y cuando lo pulses que se abra en la alimentación del circuito y todo detenido, luego vuelves a empezar.
Si lo quieres por código, una solución bastante cutre podría ser que hcieses comprobaciones de la pata enganchada al switch después de cada aspecto clave del programa, que vayas anidando todo, de tal forma que si te cambia el estado del switch no puedas  seguir ejecutando el resto:
While(true)
{
       if(switch==false)
       {
             //ejecuto acción
             if(switch == false)
             {
                   //ejecuto accion
                   if(switch==false)
                   {
                    //...
                    }
              }
        }
}

No se si te servira :shock: Un saludo.

Desconectado brutto

  • PIC10
  • *
  • Mensajes: 44
Re: Como detener un ciclo While
« Respuesta #11 en: 22 de Julio de 2011, 07:26:40 »
un paro de emergencia lo puedes hacer con un rele externo, le das a la seta y tira el rele, corta tension del circuito de control, dejas alimentado el pic con una entrada de un contacto del mismo rele de emergencia y asi puedes activar un led o lo que sea para avisar de que se ha pulsado el paro de emergencia. ASi tambien puedes ir a un bucle infinito desde una entrada de interrupcion externa del pic, y mientras no se reponga la corriente el pic se mantiene en esa interrupcion externa, y si quieres mas seguridad pones el mismo bucle de la interrupcion externa chequeando esa entrada al empezar el programa, por si se resetea el micro estando en estado de emergencia y no detecta el flanco que activaria su interrupcion. Que supongo que es lo que quieres, que el pic detecte que hay un paro de emergencia activado y no siga corriendo el programa hasta reponer la tension.

si quieres que detecte que hay algo mal en el programa tendras que usar watchdog o algo similar

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Como detener un ciclo While
« Respuesta #12 en: 22 de Julio de 2011, 13:06:34 »
en un sistema bien elaborado, está incluida la opción de que hará el pic en caso de reiniciarse por causas externas.

programar de forma incorrecta por pensar que el pic actuará errático no sería mi solución.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek