lunes, 6 de enero de 2014

Recibida la siguiente consulta:

Nombre:
Gio...
Telefono:
...
Consulta:
Hola soy el chico del semaforo te pongo aqui el enunciado del sistema que tengo que hacer tanto como el código que hize yo con comentarios. Sistema 1. Desarrolle un sistema de control de un semáforo que regula una intersección de dos vías utilizando el microprocesador el LPC1768, ver siguiente figura. La señalización y el tiempo en cada estado del semáforo se resumen en la siguiente tabla: Estado 1 Estado 2 Estado 3 Estado 4 Tiempo 30 segundos 6 segundos 30 segundos 6 segundos Semáforo S1 Roja Roja Verde Amarilla Semáforo S2 Verde Amarilla Roja Roja El sistema dispone de un detector de vehículos prioritarios (ambulancia, policía y bomberos) que detecta las señales sonoras de estos y envía un pulso de 20 ms al sistema de control del semáforo, para que detenga la secuencia anterior y ponga ambos semáforos con luz roja durante 30 segundos. Durante estos 30 s se debe emitir una señal sonora de 1 kHz. A continuación, dependiendo del estado donde se encontrara cuando se interrumpió la secuencia, debe realizar las siguientes acciones: 1) Si estaba en los estados 2 ó 4 iniciar nuevamente estos estados. 2) Si estaba en los estados 1 ó 3 y habían transcurrido menos de 15 segundos iniciar Código #include uint32_t SystemFrequency=100000000; int32_t roja = 1 << 20; int32_t amarilla = 1 << 21; int32_t verde = 1 << 22; int32_t roja1 = 1 << 6; int32_t amarilla1 = 1 << 7; int32_t verde1 = 1 << 8; int32_t estado =0; //VARIABLE GLOBAL PARA GUARDAR EL TIEMPO DE EJECUCIÃÂ"N DE UN ESTADO int32_t tiempo=0; // AQUI CONFIGURO EL SYSTICK void SysTick_Config (void) { SysTick->LOAD = 0xF423F ; NVIC_SetPriourity(SysTick_IRQn, 0x20); SysTick->VAL = 0; SysTick->CTRL = 0x7; } //ESTA INTERRUPCION LA QUE SIGUE ES LA QUE VA A MANEJAR LA SEÃÂ'AL DE PRIORIDAD. //ESTE MANEJADOR DEBERÍA // PONER A ROJO LOS DOS SEMÁFOROS // LEER EL REGISTRO RELOAD DE SYSTICK, PARA SABER EL TIEMPO TRANSCURRIDO EN EL ESTADO ACTUAL. //GUARDAR ESE TIEMPO EN ALGUNA VARIABLE GLOBAL (LUEGO HACE FALTA) // LLAMAR SYSTICK CON TEMPORIZACIÃÂ"N 30S //HABILITAR POR ALGUNA SALIDA UN TREN DE IMPULSOS DE 1kHZ void EINT2_IRQHandler (void) { tiempo = SysTick->LOAD //Borrar el falg de la EINT2 --> EXTINT.2 LPC_SC->EXTINT = 1 << 2; LPC_GPIO1->FIOCLR = 0x7 <<20;// Turn off all the LEDs LPC_GPIO2->FIOCLR = 0x7 <<6; // Turn off all the LEDs do { LPC_GPIO1->FIOSET = roja; LPC_GPIO2->FIOSET = roja1; } while(llega vehiculo prioritario); LPC_GPIO1->FIOCLR = roja; LPC_GPIO2->FIOCLR = roja1; //y comienza la cuenta atrás, llamando a systick. //SysTick_Config(reloj(hz) x temporización_deseada_en_seg));si son 100Mhz de reloj y 30s la temporización SysTick_Config(100000000 x 30); //DEBERIA HABILITAR POR AQUI EL TREN DE IMPULSOS DE 1KHZ POR LA SALIDA DETERMINADA. } //MANEJADOR DE LA INTERRUPUCION DE SYSTICK. //CUANDO SE TERMINA EL TIEMPO, TENEGO LA INTERRUPCIÃÂ"N (BAJA PRIORIDAD) SYSTICK //COMPRUEBA EL ESTADO ACTUAL: // SI ES 1 ENTONCES ACTUALIZA ESTADO A 2, ENCIENDE LAS LUCES DEL ESTADO 2 Y LLAMA SYSTICK CON TIEMPO DE ESTADO 2 //SI ES 2 ENTONCES ARCUALIZA ESTADO A 3, ENCIENDE LAS LUCES DEL ESTADO 3 Y LLAMA SYSTICK CON TIEMPO DE ESTADO 3 //SI ES 3 LO MISMO //SI ES 4 ENTONCES ARCUALIZA ESTADO A 1, ENCIENDE LAS LUCES DEL ESTADO 1 Y LLAMA SYSTICK CON TIEMPO DE ESTADO 1 // SI LOS SEMAFOROS ESTAN AMBOS ROJOS (EL ÚNICO CASO ES EL PRIORITARIO), ENTONCES APAGAMOS EL SONIDO Y DETERMINAMOS EL ESTADO Y EL TIEMPO EN EL QUE ESTABA // SI ESTABA EN ESTADO 2, ACTUALIZA ESTADO A 2, ENCIENDE LAS LUCES DEL ESTADO 2 Y LLAMA SYSTICK CON TIEMPO DE ESTADO 2 // SI ESTABA EN ESTADO 4, ACTUALIZA ESTADO A 4, ENCIENDE LAS LUCES DEL ESTADO 4 Y LLAMA SYSTICK CON TIEMPO DE ESTADO 4 // SI EL TIEMPO TRANSCURRIDO (EL DE LA VARIABLE GLOBAL DE ANTES) ES MENOR DE 15: // SI ESTABA EN ESTADO 1,ARCUALIZA ESTADO A 1, ENCIENDE LAS LUCES DEL ESTADO 1 Y LLAMA SYSTICK CON TIEMPO DE ESTADO 1 // SI ESTABA EN ESTADO 3 ARCUALIZA ESTADO A 3, ENCIENDE LAS LUCES DEL ESTADO 3 Y LLAMA SYSTICK CON TIEMPO DE ESTADO 3 //SI EL TIEMPO TRANSCURRIDO ERA SUPERIOR A 15: // SI ES 1 ENTONCES ACTUALIZA ESTADO A 2, ENCIENDE LAS LUCES DEL ESTADO 2 Y LLAMA SYSTICK CON TIEMPO DE ESTADO 2 // SI ES 3 ENTONCES ACTUALIZA ESTADO A 4, ENCIENDE LAS LUCES DEL ESTADO 4 Y LLAMA SYSTICK CON TIEMPO DE ESTADO 4 void SysTick_Handler (void) { if (estado==1) { estado=2; LPC_GPIO1->FIOSET= roja; LPC_GPIO2->FIOSET = amarilla1; //SysTick_Config(reloj(hz) x temporización_deseada_en_seg));si son 100Mhz de reloj y 6s la temporización SysTick_Config(100000000 x 6); } else if (estado==2) { estado=3; LPC_GPIO1->FIOSET= verde ; LPC_GPIO2->FIOSET = roja1; SysTick_Config(100000000 x 30); }//fin si estado ==2 else if (estado==3) { estado=4; LPC_GPIO1->FIOSET= amarilla; LPC_GPIO2->FIOSET = roja1; SysTick_Config(100000000 x 6); }//fin si estado ==3 else if (estado==4) { estado=1; LPC_GPIO1->FIOSET= roja; LPC_GPIO2->FIOSET = verde1; SysTick_Config(100000000 x 30); }//fin si estado ==4 else { LPC_GPIO1->FIOSET= roja; LPC_GPIO2->FIOSET = roja1; SysTick_Config(100000000 x 30); // AUNQUE POR FUERZA ESTARAN LOS DOS ROJOS //AQUI DEBERIA APAGAR EL SONIDO //A CONTINUACIÃÂ"N DETERMINAR EL ESTADO EN EL QUE ESTABA if (estado==2) { LPC_GPIO1->FIOSET= roja; LPC_GPIO2->FIOSET = amarilla1; //SysTick_Config(reloj(hz) x temporización_deseada_en_seg));si son 100Mhz de reloj y 6s la temporización SysTick_Config(100000000 x 6); } else if (estado==4); { LPC_GPIO1->FIOSET= roja; LPC_GPIO2->FIOSET = verde1; SysTick_Config(100000000 x 30); } else { if(tiempo<=15); { if(estado==1); { LPC_GPIO1->FIOSET= roja; LPC_GPIO2->FIOSET = verde1; SysTick_Config(96000000 x 30); } else if(estado==3) { LPC_GPIO1->FIOSET= verde ; LPC_GPIO2->FIOSET = roja1; SysTick_Config(100000000 x 30); } else { if (estado==1) { estado=2; LPC_GPIO1->FIOSET= roja; LPC_GPIO2->FIOSET = amarilla1; //SysTick_Config(reloj(hz) x temporización_deseada_en_seg));si son 96Mhz de reloj y 6s la temporización SysTick_Config(100000000 x 6); } else if (estado==3) { estado=4; LPC_GPIO1->FIOSET= amarilla; LPC_GPIO2->FIOSET = roja1; SysTick_Config(100000000 x 6); } } } } } }//FIN manejador // ESTO ES PARA CONFIGURAR LAS PRIORIDADES void config(void) { LPC_PINCON->PINSEL4 |= 1 << (12*2);//P2.12 como EINT2 LPC_GPIO1->FIODIR |= 0x3F<<20; //Pines de salida. LPC_SC->EXTMODE |= 1<< 2; //Interrupción activa por flanco de bajada NVIC_SetPriority(EINT2_IRQn,0x02); //Prioridad 2. NVIC_EnableIRQ(EINT2_IRQn); //Habilitamos la interrupciín. } /*---------------------------------------------------------------------------- Main Program ----------------------------------------------------------------------------*/ int main (void) { config(); // UNA VEZ CONFIGURADO, INICIALIZO EL ESTADO A 1 estado=1; //encendemos los semaforos al estado 1 LPC_GPIO1->FIOSET= roja; LPC_GPIO2->FIOSET = verde1; //y comienza la cuenta atrás, llamando a systick. //SysTick_Config(reloj(hz) x temporización_deseada_en_seg));si son 100Mhz de reloj y 30s la temporización SysTick_Config(100000000 x 30); //Y FIN DE PROGRMAMA PRINCIPAL, while(1) {} }

Gracias por utilizar este servicio. Nos pondremos en contacto con usted lo antes posible.

Para enviarnos un e-mail puede hacerlo respondiendo directamente a este.

Academia Cartagena99 - www.cartagena99.com
Calle Cartagena nº99, 28002 Madrid, Tel. 91-51-51-321

No hay comentarios:

Publicar un comentario