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
!.
CODIGO:
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
!. slds y gracias de antemeno
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
}
}
}
Última edición por un moderador: