Beruflich Dokumente
Kultur Dokumente
Inicialmente es necesario que el \pro\grama inicialice cada variable y escoja si tiene que hallar A continuacin se muestra las subrutinas: hallar la hi\potenusa o uno de los catetos,\para esto, se\gn hi\potenusa y hallar cateto. el \problema solo es necesario \probar cual de las variables es cero y de esta manera se sabr que se debe calcular.
Con el diagrama de flujo siguiente se muestra como se realiza la subrutina que va a resolver el problema de cmo sacarle la raz cuadrada a un numero. Este diagrama de flujo muestra el mtodo del algoritmo babilnico, el cuan consiste en iterar una variable N realizando la operacin: 1 X N ( +N ) 2 N donde X es la variable a la cual se le quiere hallar la raz, N puede ser inicializado en cualquier valor, y con la iteracin este se ira corrigiendo hasta aproximarse a la raz.
3. Diseo :
Implementacin del Cdigo Determinacin de lo que se va a calcular: Antes de determinar lo que se va a comparar (cateto o hipotenusa) es necesario declarar las variables que se utilizaran. Despus de haber inicializado la RAM se declaran las variables ya planteadas en el anlisis del problema y que sern utilizadas durante el programa:
CAT1 DS 1 CAT2 DS 2 HIPO DS 2 HIP DS 1 OP1 DS 2 OP2 DS 2 RES DS 2 CUADRADO DS 2 N DS 1 BB DS 1 RESIDUO DS 1
HALLARHIP: LDA LDX MUL STX STA LDA LDX MUL STX STA JSR MOV MOV JSR MOV MOV JMP HALLARCAT: LDA LDX MUL STX STA LDA LDX MUL STX STA JSR MOV MOV JSR MOV MOV JMP
CAT1 CAT1 OP1 OP1+1 CAT2+1 CAT2+1 OP2 OP2+1 SUMA RES,CUADRADO RES+1,CUADRADO+1 RAIZ RES,HIPO RES+1,HIPO+1 FINAL HIP HIP OP1 OP1+1 CAT1 CAT1 OP2 OP2+1 RESTA RES,CUADRADO RES+1,CUADRADO+1 RAIZ RES,CAT2 RES+1,CAT2+1 FINAL
El cdigo para determinar lo que se va a calcular deber si la variable HIP es cero, bifurcar a la rutina de calculo descrita, o probar la variable CAT2 y bifurcar a la rutina respectiva; adems es necesario inicializar HX y deshabilitar el modulo COP :
MAIN: BSET 0 , CONFIG1 CLRH CLRX TST HIP BEQ HALLARHIP TST CAT2+1 BEQ HALLARCAT JMP MAIN
Los cuadrados de cada numero se almacenan en los operadores OP1, OP2 para realizar la suma o la resta segn el caso y el resultado retornado por las subrutinas se almacena en la variable RES. Estas subrutinas se muestran a continuacin:
SUMA: LDA ADD STA LDA ADC STA RTS OP1+1 OP2+1 RES+1 OP1 OP2 RES
En el cdigo anterior se muestra una bifurcacin a dos rutinas : una para calcular la hipotenusa (HALLARHIP), y otra para hallar el cateto RESTA: LDA OP1+1 SUB OP2+1 (HALLARCAT); ambas hacen las operaciones STA RES+1 descritas en lo diagramas de flujo y se realizan LDA OP1 como sigue: SBC OP2
STA N DBNZ OP1+1,RETURN1 BCS DECIMAL CLRH LDA RESIDUO LDX #100D MUL PSHX PULH LDX N DIV RORA STA RES+1 MOV N,RES RTS
Calculo de la raz cuadrada: El resultado en RES se asigna a la variable CUADRADO a el cual se le obtendr la raz con el algoritmo descrito en el anlisis. Mediante pruebas de escritorio, nos dimos cuenta que la divisin que se debe efectuar de CUADRADO entre la variable N, no tiene que ser efectuada con parte decimal de N, lo cual es mas complicado y no se puede efectuar con la FINALA: instruccin DIV del set de instrucciones, por eso al asignar la el resultado de la operacin (CUADRADO / N +N) / 2 a la variable N para la iteracin solo se toma de N la parte entera.
Para obtener la parte decimal final de la raz basta con tener el residuo de la ultima iteracin, multiplicarlo por 100, y dividir enteramente. La divisin entre 2 se hace desplazando hacia la derecha, lo cual puede generar un carry que debe ser tomado en cuenta dentro del residuo por lo que existen dos fragmentos de cdigo que hallan la parte decimal, pero uno de ellos suma #100D al resultado de la operacin (100*RESIDUO/BB El cdigo completo comentado se anexa. +BB) que es lo que corresponde al carry. Nota: La variable BB es una variable que almacena el ultimo valor de N para calcular la parte decimal; se agrego en la depuracin al darnos cuenta de que N se reasignaba para la siguiente iteracin que no se realiza y tenia que ser con el valor actual (el de la ultima iteracin), aquel con el que se calculara la parte decimal. El cdigo de la raz se muestra a continuacin:
RAIZ: MOV #100D,N MOV #8D,OP1+1 RETURN1: LDHX CUADRADO TXA LDX N DIV PSHH PULX STX RESIDUO CLRH ADD N MOV N,BB RORA
DECIMAL: CLRH LDA RESIDUO LDX #100D MUL PSHX PULH LDX BB DIV ADD #100D RORA JMP FINALA
4. Montaje y Depuracin :
Se simulo el programa implementado en la herramienta de simulacin de CodeWarrior probando diferentes valores de catetos e hipotenusa. Tomando inicialmente un CAT1 y CAT2 = 2 el resultado de la hipotenusa HIPO es 2.83 .
(2+2)=2.828427125
6. Referencias :
[1].http://es.wikipedia.org/wiki/Clculo_de_la_ra z_cuadrada
(95+57)=110.788086002
HIP = 84 CAT1 = 56 se tiene que el otro cateto tiene un valor de 62.61
(84+56)=62.60990337
5. Conclusiones :
Se logro implementar con eficiencia un programa que hallara uno de los lados de un triangulo rectngulo (ya sea su hipotenusa o uno de los catetos ) con un porcentaje de error muy bajo ya que nicamente se desviaba razonablemente de la realidad en la ltima cifra decimal, esto es considerable ya que en lugar de realizar la raz de un numero se utilizo una aproximacin que inevitablemente tendr un pequeo error. Se utiliz funcionalmente el complejo set de instrucciones de microcontrolador MC68HC908AP16 permitindonos realizar operaciones matemticas complejas como una raz cuadrada. Adems se verifico su funcionamiento a travs de la herramienta