Sunteți pe pagina 1din 9

UNIVERSIDAD NACIONAL ATONOMA DE MXICO FACULTAD DE INGENIERA

Reporte de resolucin de ecuacin de segundo grado para la Tarjeta del circuito PIC18F452

MICROCOMPUTADORAS GPO: 03 ALUMNOS: Gmez Martnez Ruth Amairani Martnez Castillo Rafael Jess

25 de Noviembre de 2013.

INTRODUCCIN:

Una ecuacin de segundo grado, ecuacin cuadrtica o resolvente es una ecuacin polinmica donde el mayor exponente es igual a dos. Normalmente, la expresin se refiere al caso en que slo aparece una incgnita y que se expresa en la forma cannica:

dnde, a, es el coeficiente cuadrtico o de segundo grado y es siempre distinto de 0, b el coeficiente lineal o de primer grado y c es el trmino independiente. Expresada del modo ms general, una ecuacin cuadrtica es de la forma:

con n un nmero natural y a distinto de cero. El caso particular de esta ecuacin donde n = 2 se conoce como ecuacin bicuadrtica. La ecuacin cuadrtica es de gran importancia en diversos campos, ya que junto con las ecuaciones lineales, permiten modelar un gran nmero de relaciones y leyes. Los puntos comunes de una parbola con el eje X (recta y=o), si los hubiese, son las soluciones reales de la ecuacin cuadrtica. En este proyecto se nos pidi programar e implementar un dispositivo que calculara las races de un polinomio de segundo grado, es decir, calcula los valores de x1 y x2. Primeramente el usuario indica el valor de las entradas A, B Y C, para que el PIC pueda realizar las instrucciones que se encuentran en el cdigo y finalmente el valor de x1 y x2 es mostrado en el display LCD por medio del puerto B del PIC que fue configurado como la salida.

EQUIPO Y MATERIALES
Display LCD 20x2 El display LCD de 20x2 cuenta con las siguientes caractersticas: ESQUEMA: 116.0x37.0x13.5 V.A.: 91.6x18.6 Carcter: 3.20x5.55 TIPO DEL LCD: STN Y/G, STN BULE, GRIS DE STN CONTRALUZ DEL LED: Y/G, BLANCO, BLANCO, VERDE REGULADOR: KS0066 O IGUAL TEMPERATURA DE FUNCIONAMIENTO: NORMAL (0-50C); DE PAR EN PAR (- 20-70C) FUENTE DE ALIMENTACIN: 5.0V NGULO DE VISIN: 6H; 12H

. CDIGO DEL PROGRAMA:

Para el correcto funcionamiento de nuestro programa, necesitamos de los siguientes cdigos: Float_to_ASCII.c, el cual nos ayudar con la conversin de un nmero flotante a su equivalente en cdigo ASCII, y DRV_for_LCD.c, este nos implementar al envo de la informacin a nuestro dispositivo de salida, que en este caso ser un display genrico de 16 bits con 2 lneas.

El archivo main es el siguiente: #include <p18f452.h> // Header propio del PIC18F452. #include <delays.h> // Header de la rutinas de retardo. #include <math.h> // Incluye las rutinas matemticas de // punto flotante (quizas no necesarias). #include <float.h> // Incluye las funciones de punto flotante. #include <capture.h> // INCLUYE A LA LIBRERIA DE CAPTURA // DEL COMPILADOR. //////////////////////////////////////////////////////////////////////// // Bits de Configuracin del PIC18F452 (ver seccin 19.0 del manual). // //////////////////////////////////////////////////////////////////////// #pragma config CP0 = OFF // Memoria FLASH sin proteccin. #pragma config CP1 = OFF // " " " " . #pragma config CP2 = OFF // " " " " . #pragma config CP3 = OFF // " " " " . #pragma config OSC = HS // Selecciona oscilador de alta frecuencia. #pragma config PWRT = OFF // Power-up Timer deshabiltado (tiene que ver con el reset). #pragma config BOR = OFF // Brown-out Reset deshabilitado (tiene que ver con el reset). #pragma config WDT = OFF // Watch-Dog deshabilitado. #pragma config LVP = OFF // Deteccin da bajo voltaje deshabilitada. /* Variables */ float A,B,C,X1,X2,J1,J2; float discriminante=0.0; unsigned char Mis_ASCII[25], Mis_ASCII2[25], Mis_ASCII3[25], Mis_ASCII4[25]; /* Prototipos */ float disc(float,float,float);

float getRaizR(float,float,float,int); float getRaizC_pr(float,float);

float getRaizC_pc(float,float ,float ,int ); ////////////////////////////////////////////////////////////////////// //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx// // Rutina del Programa Principal // //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx// ////////////////////////////////////////////////////////////////////// void main(void) { //Inicializamos las variables A=2.0; B=4.0; C=4.0; X1=0.0; X2=0.0; XLCD_Config(); //Configuramos el display XLCD_Clear(); //Limpiamos el display XLCD_String_In_Dir(0x00, "A="); FLOAT_TO_ASCII(A); Read_String_ASCII(Mis_ASCII); XLCD_Address(0x02); despliegaR(); XLCD_String_In_Dir(0x0A, "B="); FLOAT_TO_ASCII(B); Read_String_ASCII(Mis_ASCII); XLCD_Address(0x0C); despliegaR(); XLCD_String_In_Dir(0x40, "C="); FLOAT_TO_ASCII(C); Read_String_ASCII(Mis_ASCII); XLCD_Address(0x42); despliegaR(); retardo(3); XLCD_Clear(); XLCD_String_In_Dir(0, "X1="); FLOAT_TO_ASCII(X1); Read_String_ASCII(Mis_ASCII); XLCD_Address(3); despliegaR(); XLCD_String_In_Dir(0x40, "X2="); FLOAT_TO_ASCII(X2); Read_String_ASCII(Mis_ASCII); XLCD_Address(0x43); despliegaR(); retardo(3);

while(1) { discriminante = disc(A,B,C); //Obten el discriminante if(discriminante==0){ //1 raiz real X1=getRaizR(discriminante,A,B,0); //Obten la primera raiz X2=X1; //No hay 2da raiz //Se despliegan los resultados, es decir, las raices XLCD_Clear(); XLCD_String_In_Dir(0, "X1="); FLOAT_TO_ASCII(X1); Read_String_ASCII(Mis_ASCII); XLCD_Address(3); despliegaR(); XLCD_String_In_Dir(0x40, "X2="); FLOAT_TO_ASCII(X2); Read_String_ASCII(Mis_ASCII); XLCD_Address(0x43); despliegaR(); }else if(discriminante>0){ //2 Raices reales X1=getRaizR(discriminante,A,B,0); //Obten la primera raiz X2=getRaizR(discriminante,A,B,1); //Obten la segunda raiz //Se despliegan los resultados, es decir, las raices XLCD_Clear(); XLCD_String_In_Dir(0, "X1="); FLOAT_TO_ASCII(X1); Read_String_ASCII(Mis_ASCII); XLCD_Address(3); despliegaR(); XLCD_String_In_Dir(0x40, "X2="); FLOAT_TO_ASCII(X2); Read_String_ASCII(Mis_ASCII); XLCD_Address(0x43); despliegaR(); }else if(discriminante<0){ //2 Raices complejas X1=getRaizC_pr(A,B); //Obten la parte real X2=X1; //Ambas partes reales son iguales J1=getRaizC_pc(discriminante,A,B,0); //Obten las partes complejas J2=getRaizC_pc(discriminante,A,B,1); //Se despliegan los resultados, es decir, las raices XLCD_Clear(); XLCD_String_In_Dir(0, "X1="); FLOAT_TO_ASCII(X1); Read_String_ASCII(Mis_ASCII); XLCD_Address(3);

despliegaR(); XLCD_char('+'); FLOAT_TO_ASCII(J1); Read_String_ASCII(Mis_ASCII); despliegaI(); XLCD_String_In_Dir(0x40, "X2="); FLOAT_TO_ASCII(X2); Read_String_ASCII(Mis_ASCII); XLCD_Address(0x43); despliegaR(); FLOAT_TO_ASCII(J2); Read_String_ASCII(Mis_ASCII); despliegaI(); } retardo(3); } } //Funcion que permite desplegar la parte real del numero void despliegaR(){ for(i = 0; i < 7; ++i) { if(Mis_ASCII[i] == 0x00) // Si se encontr el caracter ASCII "NULL" { // entonces salta y termina escritura al LCD. goto RETARDOS; } XLCD_char(Mis_ASCII[i]); // Escribe el caracter al display LCD. } RETARDOS: Delay10KTCYx(100); // Realiza un retardo de 1,000,000 de } //Funcion que permite desplegar la parte compleja del numero void despliegaI(){ for(i = 0; i < 7; ++i) { if(Mis_ASCII[i] == 0x00) // Si se encontr el caracter ASCII "NULL" { // entonces salta y termina escritura al LCD. goto RETARDOS; } XLCD_char(Mis_ASCII[i]); // Escribe el caracter al display LCD. } RETARDOS: XLCD_char('j'); Delay10KTCYx(100); // Realiza un retardo de 1,000,000 de }

//Funcion que permite crear un retardo en segundos void retardo(int segundos){ int aux; segundos = segundos*4; for(aux=0; aux<segundos; aux++){ Delay10KTCYx(250); } } /* Calculo del discriminante */ float disc(float a, float b, float c){ float dis=0.0; dis=(b*b)-(4*a*c);//Valor del discriminante return dis; } /* Obtencion de raiz real */ float getRaizR(float discrim,float a,float b,int numR){ float R=0.0; if(numR==0){ //Primera raiz R=((-b)+sqrt(discrim))/(2*a); }else if(numR==1){//Segunda raiz R=((-b)-sqrt(discrim))/(2*a); }else{ R=0; //No hay raiz } return R; } /* Obtencion de parte real */ float getRaizC_pr(float a,float b) { float R=0.0; R=(-b)/(2*a); //Parte real de la raiz return R; } /* Obtencion de parte compleja

*/ float getRaizC_pc(float discrim,float a,float b,int numR) { float R=0.0; discrim = discrim*(-1); //- discriminante if(numR==0){ //Primera raiz R=(sqrt(discrim))/(2*a); //Parte compleja }else if(numR==1){ R=((-1)*sqrt(discrim))/(2*a);//Parte compleja }else{ R=0; //Raiz no valida } return R; }

CONCLUSIONES Conclusiones Martinez Castillo Rafael Jesus De manera muy similar a lo que se realiz en el frecuencimetro, el medidor de capacitacin ayudo mucho en la comprensin de la forma en la que trabaja el PIC18, ya que reafirmamos el uso del display al invocarlo en las diferente rutinas dentro del programa y a lo largo del desarrollo de este.

Gomez Martinez Ruth Amairani

A pesar de que no hemos conocido a fondo todas las capacidades del PIC 18F452 encontramos en sus caractersticas tcnicas y perifricas un importante avance con respecto a los microcontroladores de la serie 16. Con el agregado del display LCD 20x2 se abre toda una nueva gama de posibilidades. Mostrar el voltaje suministrado es tan solo un ejemplo de todo lo que se puede adaptar a estos componentes.

S-ar putea să vă placă și