Hola, he realizado un programa que simula un ascensor de 5 plantas usando el programa KEILUVISION y el microcontrolador LPC1768.
Al probarlo en la placa protoboard, el display parte de la planta 0, pero al pulsar una de las plantas, por ejemplo planta 4, sí que va hasta la 4, pero no se queda ahí, sino que siempre va hasta la planta2, y así para cualquier planta que presione.
Me podrian decir cual es el fallo, aqui os dejo una parte del programa
Hola de nuevo, me estaba informando, y creo que tiene que ver con el tema de los rebotes al activar la interrupción 3. Que solución hay.
Al probarlo en la placa protoboard, el display parte de la planta 0, pero al pulsar una de las plantas, por ejemplo planta 4, sí que va hasta la 4, pero no se queda ahí, sino que siempre va hasta la planta2, y así para cualquier planta que presione.
Me podrian decir cual es el fallo, aqui os dejo una parte del programa
Código:
**********************************************
void EINT3_IRQHandler(void)
{
if(((LPC_GPIO1->FIOPIN & (1<<25))>>25)==0 |((LPC_GPIO1->FIOPIN & (1<<20))>>20)==0 ) //SI PULSADOR PLANTA 0 PULSADO
{
if(comienzo==planta0)
{
flechaabajo_off();
flechaarriba_off();
piso0();
}
else {if(comienzo>planta0)
{
flechaabajo_on();
aux=comienzo-planta0;
comienzo=planta0;
if(aux==4) // bajamos de planta 4 a planta 0
{
if(((LPC_GPIO2->FIOPIN & (1<<13))>>13)==0)
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso4();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso3();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso2();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso1();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso0();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
}
else{ if(aux==3) // bajamos planta 3 a planta 0
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso3();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso2();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso1();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso0();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
else{ if(aux==2) //bajamos de planta 2 a planta 0
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso2();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso1();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso0();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
else{ if(aux==1) //bajamos de planta1 a planta0
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso1();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso0();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
}
}
}
}
}
}
/*..............................................................................................
.............................................................................................*/
if(((LPC_GPIO1->FIOPIN & (1<<26))>>26)==0 |((LPC_GPIO1->FIOPIN & (1<<21))>>21)==0) // SI PLANTA 1 PULSADO
{
if(comienzo==planta1)
{
flechaabajo_off();
flechaarriba_off();
piso1();
}
if(comienzo>planta1)
{
flechaabajo_on() ;
aux=comienzo-planta1;
comienzo=planta1;
if(aux==3) //bajamos de planta 4 a planta 1
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso4();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso3();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso2();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso1();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
else { if(aux==2) //bajamos de planta 3 a planta 1
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso3();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso2();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso1();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
else { if(aux==1) //bajamos de planta 2 a planta 1
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso2();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso1();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
}
}
}
if(comienzo<planta1) //subimos de planta 0 a planta 1
{
flechaarriba_on();
aux=planta1-comienzo;
comienzo=planta1;
if(aux==1)
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso0();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso1();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
}
}
/*..............................................................................................
.....................................................................................*/
if((((LPC_GPIO1->FIOPIN & (1<<27))>>27)==0) | ((LPC_GPIO1->FIOPIN & (1<<22))>>22)==0 ) // SI PLANTA 2 PULSADO
{
if(comienzo==planta2)
{
flechaabajo_off();
flechaarriba_off();
piso2();
}
if(comienzo>planta2)
{
flechaabajo_on() ;
aux=comienzo-planta2;
comienzo=planta2;
if(aux==2) //bajamos de planta 4 a planta 2
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso4();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso3();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso2();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
else { if(aux==1) //bajamos de planta 3 a planta 2
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso3();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso2();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
}
}
if(comienzo<planta2)
{
flechaarriba_on();
aux=planta2-comienzo;
comienzo=planta2;
if(aux==2)
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso0();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso1();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso2();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
else { if(aux==1)
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso1();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso2();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
}
}
}
/*............................................................................................................................
..........................................................................................................................*/
if(((LPC_GPIO1->FIOPIN & (1<<28))>>28)==0 | ((LPC_GPIO1->FIOPIN & (1<<23))>>23)==0) // SI PLANTA 3 PULSADO
{
if(comienzo==planta3)
{
flechaabajo_off();
flechaarriba_off();
piso3();
}
if(comienzo>planta3)
{
flechaabajo_on() ;
aux=comienzo-planta3;
comienzo=planta3;
if(aux==1) //bajamos de planta 4 a planta 3
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso4();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso3();
}
}
if(comienzo<planta3)
{
flechaarriba_on();
aux=planta3-comienzo; // aux=3, partimos de planta0 o aux=2 partimos de planta 1 o aux=1 partimos de planta 2
comienzo=planta3;
if(aux==3) //subimos de planta 0 a planta 3
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso0();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso1();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso2();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso3();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
else { if(aux==2) //subimos de planta 1 a planta 3
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso1();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso2();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso3();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
else { if(aux==1) //subimos de planta 2 a planta 3
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso2();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso3();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
}
}
}
}
/*............................................................................................................................
..........................................................................................................................*/
if(((LPC_GPIO1->FIOPIN & (1<<29))>>29)==0 | ((LPC_GPIO1->FIOPIN & (1<<24))>>24)==0) // SI PLANTA 4 PULSADO
{
if(comienzo==planta4)
{
flechaabajo_off();
flechaarriba_off();
piso4();
}
if(comienzo<planta4)
{
flechaarriba_on();
aux=planta4-comienzo; // aux=4, partimos de planta0 o aux=3 partimos de planta 1 o aux=2 partimos de planta 2 o aux=1 partimos de planta 3
comienzo=planta4;
if(aux==4) //subimos de planta 0 a planta 4
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso0();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso1();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso2();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso3();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso4();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
else { if(aux==3) //subimos de planta 1 a planta 4
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso1();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso2();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso3();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso4();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
else { if(aux==2) //subimos de planta 2 a planta 4
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso2();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso3();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso4();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
else { if(aux==1) //subimos de planta 3 a planta 4
{
LPC_GPIO4->FIOCLR |= (1<<28);
piso3();
Retardo(2*CONST_1000ms_100MHz); // retardo de 1 segundos
piso4();
flechaabajo_off();
flechaarriba_off();
LPC_GPIO4->FIOSET = (1<<28);
}
}
}
}
}
};
}
void ascensor_alineado() //PIN 2.11
{
LPC_PINCON->PINSEL4 |= (1<<(11*2));
LPC_PINCON->PINSEL4 |= (1<<(13*2));
LPC_SC->EXTMODE |= (1<< 1);
LPC_SC->EXTMODE |= (1<< 3);
NVIC_SetPriorityGrouping (3);
NVIC_SetPriority(EINT1_IRQn,0x2);
NVIC_SetPriority(EINT3_IRQn, 0x8);
NVIC->ISER[0] = 1 << 19;
NVIC->ISER[0] = 1 << 21;
}
Hola de nuevo, me estaba informando, y creo que tiene que ver con el tema de los rebotes al activar la interrupción 3. Que solución hay.
Última edición por un moderador: