Programación de Ascensor de 3 niveles

Buenas estoy diseñando una programacion para la etapa de control de un elevador a escala de 3 pisos, con el puerto c0 y c1 controlo un motor dc por medio de un puente h para invertir el giro del motor,uso 3 pulsadores para mandar llamar los pisos y 3 sensores magneticos para detener en cada nivel, El problema que estoy teniendo es que no puedo hacer que se pare en cada nivel es donde pido de su ayuda les pongo el codigo que estoy haciendo :D!.

CODIGO:

Código:
/////////////////////////////////////////////////////////////////////////////////////////////
//              Luis Alberto Zamora Lara                                                 //
//Para el armado de este circuito el cual sera un elevador de 3 pisos      //
//se usara un pic16f628A el cual llevara conectado en el puerto A        //
//los botones pulsadores en A0, A1, A2 siendo A0 para el piso 1     //
//A1 para el piso 2, A2 para el piso 3, en los pins A3 A4 A5 llevara Reeds solo se            //
//usara un solo display asi que usare el puerto B para el display      //
//, y en el puerto C se hara la conexión del motor (sube)c0,        //
//(baja)c1 a la tarjeta controladora de giro.                       //
////////////////////////////////////////////////////////////////////////////////////////////

#include <16f876A.h>
#fuses xt,nowdt,noprotect,nolvp
#use delay(clock=4000000)

//portb=0x06;   //Muestra 1 en display de 7 segmentos
//portb=0x5b;   //Muestra 2 en display de 7 segmentos
//portb=0x4f;  //Muestra 3 en display de 7 segmentos
#byte porta=5
#byte portb=6
#byte portc=7

void main()
{
set_tris_c(0);  //Configuracion de puertos
set_tris_b(0);
set_tris_a(1);
portc=0;       //limpianmos puertos
portb=0;

while(1)
      {
      if (input(pin_a1)==1)// si presiona piso 2
      {
      delay_ms(10);
       if (input(pin_a1)==0)// si presiono piso 2
      {
      if(input(pin_a3)==1) //si estoy piso 1
      { [COLOR="red"]/// aqui esta el problema usaba un if como en el ejemplo de abajo pero pasados los [/COLOR]
      while(input(pin_c4)==0){//[COLOR="red"]500ms si el elevador no llegaba al sensor la salida hacia el motor [/COLOR]
      output_high(pin_c0);//activa subir//[COLOR="red"]se queda encendida, y con el while el pic se queda [/COLOR]
                                 //[COLOR="Red"]trabado[/COLOR]
      }
      }
      }
       }
       
       [COLOR="red"]//Asi lo hacia pero no es aplicable por que si el motor tarda mas en llegar se queda activa la salida [/COLOR]
        if (input(pin_a1)==1)// si presiona piso 2
      {
      delay_ms(10);
       if (input(pin_a1)==0)// si presiono piso 2
      {
      if(input(pin_a5)==1)//si estoy piso 3
      {
      output_high(pin_c1);//activa bajar
      delay_ms(1000);
      if(input(pin_a4)==1){//si llegue piso 2
      output_low(pin_c1);//desactiva bajar
      }
       }
       }
        }
       
      if (input(pin_a2)==1)//si presiona piso 3
      {
      delay_ms(10);
      if (input(pin_a2)==0)//si presiono piso 3
      {
      if(input(pin_a4)==1)//si estoy piso 2
      {
      output_high(pin_c0);//activa subir
      delay_ms(500);
      if(input(pin_a5)==1){//si llegue piso 3
      output_low(pin_c0);//desactiva subir
      }
       }
       }
       }
       
        if (input(pin_a2)==1)//si presiona piso 3
      {
      delay_ms(10);
      if (input(pin_a2)==0)//si presiono piso 3
      {
      if(input(pin_a3)==1)//si estoy piso 1
      {
      output_high(pin_c0);//activa subir
      delay_ms(1000);
      if(input(pin_a5)==1){//si llegue piso 3
      output_low(pin_c0);//desactiva subir
      }
       }
       }
       }
       
        if (input(pin_a0)==1)//si presiona piso 1
      {
      delay_ms(10);
      if (input(pin_a0)==0)//si presiono piso 1
      {
      if(input(pin_a4)==1)//si estoy piso 2
      {
      output_high(pin_c1);//activa bajar
      delay_ms(500);
      if(input(pin_a3)==1){//si llegue piso 1
      output_low(pin_c1);//desactiva bajar
      }
       }
       }
       }
       
        if (input(pin_a0)==1)//si presiona piso 1
      {
      delay_ms(10);
      if (input(pin_a0)==1)//si presiono piso 1
      {
      if(input(pin_a5)==1)//si estoy piso 3
      {
      output_high(pin_c1);//activa bajar
      delay_ms(1000);
      if(input(pin_a3)==1){//si llegue piso 1
      output_low(pin_c1);//desactiva bajar
      }
       }
       }
       }
if(input(pin_a3)==1){
portb=0x06;   //Muestra 1 en display de 7 segmentos
}
if(input(pin_a4)==1){
portb=0x5b;   //Muestra 2 en display de 7 segmentos
}
if(input(pin_a5)==1){
portb=0x4f;   //Muestra 3 en display de 7 segmentos
}
        }
      
      
}
Espero se entienda mi problema y me puedan dar una mano, El programa lo simulo en Proteus si creen que es necesario que lo suba para entender mejor el problema agradeceria me lo dijeran :D!. slds y gracias de antemeno
 
Última edición por un moderador:
Para que el motor no gire en ambos bits del puente H debe haber 0 lógico o 1 lógico...no importa cual, pero siempre el mismo valor en ambos...

Con eso el motor debería dejar de girar y frenarse...por ende en la programación, al llegar al sensor magnético deseado deberías poner C0 y C1 en 0 lógicos...
 
Para que el motor no gire en ambos bits del puente H debe haber 0 lógico o 1 lógico...no importa cual, pero siempre el mismo valor en ambos...

Con eso el motor debería dejar de girar y frenarse...por ende en la programación, al llegar al sensor magnético deseado deberías poner C0 y C1 en 0 lógicos...

Si esi lo entiendo el problema es que no lo logro en la programacion no se si observaste el codigo. en teori el codigo que hice funciona solo que tiene un tiempo de medio segundo para detectar que el reed se activo y si no se activa en ese tiepo el puerto se queda activo y no logro hacer que se apague lo intente con un while pero se queda trabado el pic, la cuestion es que no puedo hacer que espere..

algo asi quiero hacer

si se presiono boton a0
espera x tiempo
verifica si se solto el pulsador
enciende subir
mientras el reed de a3 no este en 1
apaga subir..

segun mi logica dice que lo hago bien pero no me funciona :/!
 
Creo que ya lo resolvi por medio de un For pero no tengo tiempo de probar por que me voy a la universidad pero que opinas de esta secuencia crees que funcione??

Código:
while(1){
if (input(pin_a1)==1){
for (puls = 0; ;){
      if (input(pin_a4)==0){ 
      output_high(pin_c1);
      delay_ms(150);
          if (input(pin_a4)==1){
              puls++; 
      } 
      if (puls > 1){
      output_low(pin_c1); 
      break;
    } 
}
}
}
}
}
 
Ya resolvi mis problemas gracias por la ayuda ¬¬!, anda un poco lento pero supongo es por el simulador :D!, Aqui les comparto mi proyecto el codigo esta muy braviado pero soy principiante en pic y c trae unos pequeños errores pero no se como optimizar mas el codigo :/!!

PD: lo pondre en el primer texto :D! espero le den una ojeada y me puedan ayudar a optimizarlo un poco :D!

Código:
/////////////////////////////////////////////////////////////////////////////////////////////
//              Luis Alberto Zamora Lara                                                 //
//Para el armado de este circuito el cual sera un elevador de 3 pisos      //
//se usara un pic16f876A el cual llevara conectado en el puerto A        //
//los botones pulsadores en A0, A1, A2 siendo A0 para el piso 1     //
//A1 para el piso 2, A2 para el piso 3, en los pins A3 A4 A5 llevara Reeds solo se            //
//usara un solo display asi que usaremos el puerto B para el display      //
//, y en el puerto C se hara la conexión del motor (sube)c0,        //
//(baja)c1 a la tarjeta controladora de giro.                       //
////////////////////////////////////////////////////////////////////////////////////////////

#include <16f876A.h>
#fuses xt,nowdt,noprotect,nolvp
#use delay(clock=4000000)

//portb=0x06;   //Muestra 1 en display de 7 segmentos
//portb=0x5b;   //Muestra 2 en display de 7 segmentos
//portb=0x4f;  //Muestra 3 en display de 7 segmentos

#byte porta=5 //direccion de puertos
#byte portb=6
#byte portc=7

void main()
{
int puls, error;
set_tris_c(0);  //Configuracion de puertos
set_tris_b(0);
set_tris_a(1);
portc=0;       //limpianmos puertos
portb=0;
//Secuencia elevador 
while(1)
      {
      if (input(pin_a1)==1)// si presiona piso 2
      {
        if(input(pin_a3)==1)//si estoy piso 1
      {
         for (puls = 0; ;){
      if (input(pin_a4)==0){ 
      output_high(pin_c0);//subir
      delay_ms(50);
          if (input(pin_a4)==1){
              puls++; 
      } 
      if (puls > 1){
      output_low(pin_c0); //subir
      delay_ms(10);
      puls=0;
      break;
     } 
    }
   }
  }
 }       
       
       
       
        if (input(pin_a1)==1)// si presiona piso 2
      {
      if(input(pin_a5)==1)//si estoy piso 3
      {
         for (puls = 0; ;){
      if (input(pin_a4)==0){ 
      output_high(pin_c1);//bajar
      delay_ms(50);
          if (input(pin_a4)==1){
              puls++; 
      } 
      if (puls > 1){
      output_low(pin_c1); //bajar
      delay_ms(10);
      puls=0;
      break; 
    }
   }
  }
 }
}
       
      if (input(pin_a2)==1)//si presiona piso 3
      {
      if(input(pin_a4)==1)//si estoy piso 2
      {
    for (puls = 0; ;){
      if (input(pin_a5)==0){ 
      output_high(pin_c0);//subir
      delay_ms(50);
          if (input(pin_a5)==1){
              puls++; 
      } 
      if (puls > 1){
      output_low(pin_c0); //bajar
      delay_ms(10);
      puls=0;
      break; 
     }
    }
   }
  }
 }
       
        if (input(pin_a2)==1)//si presiona piso 3
      {
      if(input(pin_a3)==1)//si estoy piso 1
      {
      for (puls = 0; ;){
      if (input(pin_a5)==0){ 
      output_high(pin_c0);//subir
      delay_ms(50);
          if (input(pin_a5)==1){
              puls++; 
      } 
      if (puls > 1){
      output_low(pin_c0); //subir
      delay_ms(10);
      puls=0;
      break;
    } 
   }
  }
 }
}
       
        if (input(pin_a0)==1)//si presiona piso 1
      {
      if(input(pin_a4)==1)//si estoy piso 2
      {
        for (puls = 0; ;){
      if (input(pin_a3)==0){ 
      output_high(pin_c1);//bajar
      delay_ms(50);
          if (input(pin_a3)==1){
              puls++; 
      } 
      if (puls > 1){
      output_low(pin_c1); //bajar
      delay_ms(10);
      puls=0;
      break;
     } 
    }
   }
  }
 }
       
        if (input(pin_a0)==1)//si presiona piso 1
      {
      if(input(pin_a5)==1)//si estoy piso 3
      {
         for (puls = 0; ;){
      if (input(pin_a3)==0){ 
      output_high(pin_c1);//bajar
      delay_ms(50);
          if (input(pin_a3)==1){
              puls++; 
      } 
      if (puls > 1){
      output_low(pin_c1); //bajar
      delay_ms(10);
      puls=0;
      break;
    } 
   }
  }
 }
}

//LEDS Errores
 if(input(pin_a3)==1){//piso 1
 if(input(pin_a5)==1){ //piso 3
 for(error=0; ;){
 portb=0x79;
 if(input(pin_a3)==0){ //piso 1
 error=1;
 if(error=1){
 portb=0;
 break;
 delay_ms(10);
 }
 }
 }
 }
 }
   if(input(pin_a5)==1){
 portb=0x4f;  //Muestra 3 en display de 7 segmentos
 }
 
  if(input(pin_a4)==1){ //piso 2
 if(input(pin_a5)==1){ //piso 3
 for(error=0; ;){
 portb=0x79;
 if(input(pin_a4)==0){ //piso 2
 error=1;
 if(error=1){
 portb=0;
 break;
 delay_ms(10);
 }
 }
 }
 }
 }
 
   if(input(pin_a5)==1){
 portb=0x4f;  //Muestra 3 en display de 7 segmentos
 }

 if(input(pin_a4)==1){ //piso 2
 if(input(pin_a3)==1){ //piso1
 for(error=0; ;){
 portb=0x79;
 if(input(pin_a4)==0){ //piso 2
 error=1;
 if(error=1){
 portb=0;
 break;
 delay_ms(10);
 }
 }
 }
 }
 }
 
  if(input(pin_a3)==1){
 portb=0x06;   //Muestra 1 en display de 7 segmentos
 } 

 
 if(input(pin_a5)==1){//piso 3
 if(input(pin_a3)==1){//piso1
 for(error=0; ;){
 portb=0x79;
 if(input(pin_a5)==0){//piso3
 error=1;
 if(error=1){
 portb=0;
 break;
 delay_ms(10);
 }
 }
 }
 }
 }
 
  if(input(pin_a3)==1){
 portb=0x06;   //Muestra 1 en display de 7 segmentos
 } 

  
 if(input(pin_a4)==1){//piso 2
 if(input(pin_a3)==1){//piso1
 for(error=0; ;){
 portb=0x79;
 if(input(pin_a3)==0){//piso1
 error=1;
 if(error=1){
 portb=0;
 break;
 delay_ms(10);

 }
 }
 }
 }
 }
 
   if(input(pin_a4)==1){
 portb=0x5b;   //Muestra 2 en display de 7 segmentos
 }
 
  if(input(pin_a4)==1){//piso 2
 if(input(pin_a5)==1){//piso3
 for(error=0; ;){
 portb=0x79;
 if(input(pin_a5)==0){//piso3
 error=1;
 if(error=1){
 portb=0;
 break;
 delay_ms(10);
 }
 }
 }
 }
 }
   if(input(pin_a4)==1){
 portb=0x5b;   //Muestra 2 en display de 7 segmentos
  }
 }
}
 

Adjuntos

  • mi proyecto.rar
    70.3 KB · Visitas: 241
Última edición por un moderador:
Atrás
Arriba