Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

02/01/2014 #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;
	
}
---------- Actualizado después de 10 minutos ----------

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.
02/01/2014 #2

Avatar de jamesoro

yo creo que deberías poner el diagrama a ver de que rebotes hablas
03/01/2014 #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.
04/01/2014 #4


En mi montaje no había puesto ninguna resistencia, lo he probado de nuevo con resistencias de 10k, y ya está solucionado. Gracias
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.