Memoria Final Electronica
Memoria Final Electronica
Memoria Final Electronica
DE MISILES
2º Ingeniería Aeroespacial
Ingeniería Electrónica
Álvaro Artola Aguado, Galliano Cantarelli
Juan Diego Marín Re, Adrián Ruiz García
Nuestro proyecto consiste en un sistema de guiado de misiles mediante un
sensor de calor.
FUNCIONAMIENTO
Para comenzar, detectamos el avión enemigo, seleccionándolo mediante dos
botones y lo confirmamos como objetivo a abatir. Observamos la velocidad del
avión enemigo en la pantalla, y según la lectura seleccionamos el tipo de misil
adecuado. Confirmamos el misil, pudiendo observar la velocidad del mismo en
la parte inferior de la pantalla y ejecutamos la orden de lanzamiento.
Una vez realizado el lanzamiento se activará un temporizador, el cual mostrará
el tiempo máximo hasta la autodestrucción del misil. Cuando éste alcanza a su
objetivo, el temporizador se resetea, encendiéndose a su vez un LED
acompañado de una señal sonora. Como se ha mencionado, si el temporizador
llega a cero, el misil se autodestruye y se enciende el LED, pero esta vez sin la
señal sonora, ya que no se ha alcanzado al objetivo.
El guiado por temperatura funciona del siguiente modo:
El misil detecta temperaturas relativas en 3 direcciones: recta, izquierda y
derecha. Dirigiéndose hacia aquella en la que mida una mayor temperatura.
Indicándonos la dirección del movimiento en el HUD del avión mediante LEDs.
CÓDIGO
Contamos con dos PICs: uno para la detección del avión, la selección y el
lanzamiento del misil; y otro para la detección de temperaturas y guiado.
Primer PIC
#include <p18f4520.h>
#include <math.h>
unsigned int i, j;
int vavion, vmisil, tiempo, tiempomax, resta, explosion, disparo, disparoant;
int contador, vavion2, vmisil2;
int nummisiles = 7; //máximo de 6 misiles disponibles
void R_Int_Alta(void);
void Int_Alta(void) {
_asm GOTO R_Int_Alta _endasm
}
#pragma code
En esta parte del código declaramos la librería del PIC y la de los cálculos
matemáticos. Definimos las variables que se van a utilizar, hemos declarado la
subrutina de tratamiento de alta prioridad y la vectorización de las
interrupciones de alta prioridad.
void main(void) {
//DEFINIMOS ENTRADAS Y SALIDAS
eleccionavion:
TRISA = 1;
TRISC = 0;
TRISB = 0;
TRISD = 0;
TRISEbits.RE0 = 0; //SALIDA DEL LED DE AVISO
TRISEbits.RE1 = 0; //SALIDA DEL BUZZER DE AVISO
TRISEbits.RE2 = 0;
ADCON1 = 0x3F;
//DEFINIMOS CONDICIONES INICIALES GLOBALES
tiempomax = 50;
INTCONbits.GIE = 0; //DESACTIVAMOS LAS INTERRUPCIONES HASTA NUEVO AVISO
INTCONbits.TMR0IE = 0;
while (PORTAbits.RA3 == 0) {
if (PORTAbits.RA0 == 1 && PORTAbits.RA1 == 0) {
vavion = 19;
}
if (PORTAbits.RA0 == 0 && PORTAbits.RA1 == 1) {
vavion = 24;
}
if (PORTAbits.RA0 == 1 && PORTAbits.RA1 == 1) {
vavion = 29;
}
if (PORTAbits.RA0 == 0 && PORTAbits.RA1 == 0) {
vavion = 0;
}
}
if (vavion == 0) {
goto velocidadavion;
}
vavion2 = (vavion / 10) * 16 + (vavion % 10);
PORTC = vavion2; //Display de la velocidad del avion enemigo
tipomisil:
while (PORTAbits.RA2 == 0) {
if (PORTAbits.RA5 == 1 && PORTAbits.RA6 == 0) {
vmisil = 31;
tiempomax = 30;
}
if (PORTAbits.RA5 == 0 && PORTAbits.RA6 == 1) {
vmisil = 22;
tiempomax = 60;
}
if ((PORTAbits.RA5 == 0 && PORTAbits.RA6 == 0) || (PORTAbits.RA5 == 1 &&
PORTAbits.RA6 == 1)) {
vmisil = 28;
tiempomax = 50;
}
}
if (vmisil == 0) {
goto tipomisil;
}
//ACTIVAMOS INTERRUPCIONES
INTCONbits.GIE = 1; //Activamos interrupciones generalmente.
INTCONbits.TMR0IE = 1;
//DEFINIMOS EL TIMER PARA UN SEG
T0CON = 0x83; // Timer 0 modo temp. de 16 bits. Prescalar activado (1:16).
TIMER ON
TMR0H = 0x0B; // Se carga el valor de TMR0H y TMR0L para un intervalo de 1s
TMR0L = 0xDC;
tiempomax--;
if (tiempo < 0) {
tiempo = tiempomax;
}
if (tiempo <= 0 && explosion == 1) {
tiempo = 0;
}
PORTD = (tiempomax / 10) * 16 + (tiempomax % 10);
tiempo--;
if (tiempo == 0) {
PORTEbits.RE0 = 1;
explosion = 1;
}
}
}
}
T0CONbits.TMR0ON = 1; // Se activa el temporizador
} else {
T0CONbits.TMR0ON = 0;
}
if (tiempo == 0 && explosion == 1) {
//SI EL MISIL HA IMPACTADO O EXPLOTADO.
disparoant = 0; //Se puede volver a disparar un misil.
explosion = 0;
T0CONbits.TMR0ON = 0;
PORTD = 0;
PORTC = 0;
disparo = 0;
//Parpadeo de indicador de impacto o explosión.
for (j = 0; j <= 2; j++) {
PORTEbits.RE2 = 1;
PORTEbits.RE0 = 1;
PORTEbits.RE1 = 1;
i = 0; // Bucle de espera
while (i < 20000) {
i++;
}
PORTEbits.RE0 = 0;
PORTEbits.RE1 = 0;
i = 0; // Bucle de espera
while (i < 20000) {
i++;
}
PORTEbits.RE0 = 1;
PORTEbits.RE1 = 1;
i = 0; // Bucle de espera
while (i < 20000) {
i++;
}
PORTEbits.RE0 = 0;
PORTEbits.RE1 = 0;
PORTEbits.RE2 = 0;
}
goto eleccionavion;
}
}
}
Segundo PIC
#include <p18F4520.h>// Declaración de librería
#include <math.h>
int entrada, t, unidades, decenas, i,j, misilenaire, misilconfirmado,
avionconfirmado;
int temperaturas[3] = {0, 0, 0};
int temp;
En esta parte del código declaramos la librería del PIC y la de los cálculos
matemáticos. Definimos las variables que se van a utilizar y establecemos las
condiciones iniciales.
void main(void) // Programa Principal
{
ADCON0 = 0x01; // Se activa el A/D y se selecciona el canal AN0
ADCON1 = 0x0E; //
ADCON2 = 0xBC; //
TRISC = 0; // Puerto C de salida
TRISB = 0xF0; // Puerto B de salida
TRISD=1;
TRISA = 0x01; // RA0 de entrada.
if (misilenaire == 1) {
PORTB = 1;
i = 1;
while (i < 4) {
temperaturas[i - 1] = temp;
PORTB = pow(2, i);
i++;
}
Por último, nos encontramos con los LEDs encargados de indicar la dirección
que debe seguir el misil para llevar a cabo el impacto.
Para hacer más cómoda la visualización de la simulación, la hemos incluido en
el HUD de un avión.