No comprendo la falla del programa

#1
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

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:
#3
Como determinas en que piso se parara el ascensor con switches magnéticos?, para los rebotes se pone una resistencia hacia tierra o hacia voltaje según tu configuración (pull-up,pull-down) y en paralelo con un filtro en la entrada del PIC, el master clear en ocasiones da problemas al manejar una fuente sin filtrar puedes poner una resistencia de 10k con un capacitor a tierra y de la unión de estas una resistencia de 1k hacia el master clear.
 
Arriba