PrÁctica 1 - Calculadora FED ing teleco PDF

Title PrÁctica 1 - Calculadora FED ing teleco
Course Fundamentos de electrónica digital
Institution Universidad de Antioquia
Pages 5
File Size 123.9 KB
File Type PDF
Total Downloads 57
Total Views 114

Summary

Calculadora FED ing teleco...


Description

Universidad de Antioquia

pág. 1

Fundamentos De Electrónica Digital

Calculadora De Punto Fijo Nayro Emanuel Garzón Toro, Juan Camilo Restrepo Marín 1036958931 1152209944

Arduino es un microcontrolador que funciona como plataforma de prototipos de código abierto, esta cuenta con su propia interfaz de desarrollo y con un lenguaje estructurado basado en el lenguaje de programación C. En la presente practica se implementará dicha plataforma para la construcción de una calculadora punto fijo que este en la capacidad de realizar las operaciones básicas suma, resta, multiplicación y división. Como condición principal se tiene la ausencia de variables tipo FLOAT obligando a realizar cálculos y aproximaciones con variables enteras. I. INTRODUCCIÓN La calculadora punto fijo permite realizar las operaciones básicas, se ha dado como parámetro de selección aleatoria la precisión decimal, particularmente se nos asignó precisión de dos bits, done las posibles combinaciones son 00,01,10,11 donde representar respectivamente el .0, .25, .50, .75, entonces se debe tener en cuenta que cualquier numero decimal ingresado debe ser aproximado a una de estas cantidades.

II. MARCO TEÓRICO Arduino: Arduino es una plataforma electrónica de código abierto pensado para artistas, diseñadores y cualquier interesado en entornos interactivos. Arduino interactúa con el entorno mediante la recepción de entradas desde una variedad de sensores y puede afectar a su alrededor mediante el control de luces, motores, display, teclados matriciales y otros artefactos. El microcontrolador de la placa se programa usando la interfaz propia de arduino con un lenguaje basdo en Wiring.

III.

METODOLOGIA

Por medio de un teclado matricial ingresamos los números que deseamos operar tanto la parte entera como la parte fraccionaria, en nuestro código es necesario ingresar tres

decimales para que el programa funcione adecuadamente. A medida que ingresamos los datos por medio del teclado los vamos almacenando en dos arreglos, uno para la parte entera y uno para la parte fraccionaria, luego de acuerdo a la operación aritmética seleccionada y al oprimir la tecla ‘=’ nos remitimos a la función correspondiente(suma-restamultiplicación-división). Ya en la función transformamos los arreglos almacenados en variables enteras para poder realizar la operativa. Mediante desplazamientos con el operador’>’ corremos las posiciones necesarias para realizar los cálculos correctamente. En nuestra función precisión (); mediante condicionales definimos los rangos en los que transformaremos nuestra parte fraccionaria para cumplir con el valor de precisión asignado. Luego de tener las operaciones listas con su parte entera y parte fraccionaria separadas, las pasamos como argumentos a nuestra función showDigit(); donde convertimos las variables enteras en char y las concatenamos en Strings, luego al tener un String para la parte entera y otro para la parte fraccionaria lo mostramos en el display con la función lc.setchar(); teniendo en cuenta que después de mostrar los valores de la parte entera se debe poner el punto y luego mostrar la parte decimal. IV.

RESULTADOS

Implementación teclado: #include "Key.h" #include "Keypad.h" const byte ROWS = 4;// NUMERO DE FILAS const byte COLS = 4;// NUMERO DE COLUMBAS //Definicion del teclado 4x4 char keys[ROWS][COLS] = { {'1', '2', '3', '+'}, {'4', '5', '6', '-'}, {'7', '8', '9', 'x'}, {'.', '0', '=', '/'} };

Universidad de Antioquia

Fundamentos De Electrónica Digital

byte rowPins[ROWS] = {9, 8, 7, 6}; //CONECCION FILAS byte colPins[COLS] = {5, 4, 3, 2}; //CONECCION COLUMNAS Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

Incluimos la librería correspondiente para la manipulación del teclado matricial, luego definimos el valor numérico que tomara cada pulsador del teclado además de las funciones aritméticas, luego realizamos la conexión de los pines del teclado al arduino especificando los puertos de entrada utilizados. Implementación display, definición de arreglos a usar: #include "LedControl.h" LedControl lc = LedControl(11, 12, 13, 1); char A[8]; char B[8]; void setup() { Serial.begin(9600); lc.shutdown(0, false); lc.setIntensity(0, 5); lc.clearDisplay(0);

pág. 2

op = m; lc.clearDisplay(0); break; } else { Serial.println(m); A[i] = m; } if (i == 9) { lc.clearDisplay(0); break; } } for (int i = 0; i = 250 && a < 350) { return (B01); } else if (a >= 350 && a < 500) { return (B10); } else if (a >= 500 && a < 625) { return (B10); } else if (a >= 625) { return (B11); } }

En nuestra función de precisión recibimos como argumento un entero ‘a’ (parte fraccionaria del numero en cuestión). Como debemos cumplir una precisión de dos bits realizamos mediante condicionales los rangos en los que aproximaremos el valor ingresado por el usuario retornando igualmente un entero equivalente a los valores permitidos de precisión: - 00 = (.00), 01= (.25), 10= (.50), 11= (.75) Separación parte entera parte fraccionaria: char A[8]; char B[8]; char EA[8]; char FA[8]; char EB[8]; char FB[8]; int cont = 0; int cont2 = 0; int i; for ( i = 0; i < 8; i++) { if (cont == 1) { if (A[i] != '.') { FA[i - 1] = A[i]; } } if (cont == 0) {

pág. 3

} } for (i = 0; i < 8; i++) { if (FA[i] != ' ') { frac1 += FA[i]; } } entero1 = EA; E1 = entero1.toInt(); F1 = frac1.toInt();

//entero1 E1 //fraccionario1 F1

for ( i = 0; i < 8; i++) { if (cont2 == 1) { if (B[i] != '.') { FB[i - 1] = B[i]; } } if (cont2 == 0) { if (B[i] != '.') { EB[i] = B[i]; FB[i] = ' '; } } if (B[i] == '.') { cont2 += 1; } } for (i = 0; i < 8; i++) { if (FB[i] != ' ') { frac2 += FB[i]; } } entero2 = EB; E2 = entero2.toInt(); F2 = frac2.toInt();

//entero2 E2 //fraccionario2 F2

Luego de haber recibido los arreglos iniciaremos el proceso de separación en el cual por cada arreglo obtendremos una parte entera y una parte fraccionaria identificando cada parte por medio del punto que ha estos los separa y esto será realizado por medio de un ciclo for donde estos quedara como una cadena de caracteres, en el momento en que este termine usaremos el comando toInt(); que nos permitira

Universidad de Antioquia

pasar de “string” a un numero entero para poder realizar cada operación aritmética. void sumador() y void restador() nota: cabe decir que se describirá el proceso con el signo (+) pero para ambas operaciones es el mismo procedimiento. entero1 = EA; E1 = entero1.toInt(); F1 = frac1.toInt(); F1 = precision(F1); E1 = E1 2; if(REntera>99999){ lc.setChar(0,0,'E',false); }else{ showDisplay(REntera, F);}

cuando entramos ha nuestra operación aritmetica de suma procedemos con las partes fraccionarias obtenidas y las llevaremos a nuestra función anteriormente mencionada llamada Función Precisión que realiza su debido proceso para que con el valor que nos es retornado sea posible realizar un corrimiento hacia la izquierda que sea igual a la cantidad de bits de precisión en nuestra parte entera y luego hacer una operación “or” ( | ) con dicho valor retornado esto para tener nuestro número completamente como un entero en lenguaje maquina ósea 1s y 0s y podemos realizar nuestra

operación de suma como normalmente se efectúa Después realizamos un corrimiento a la izquierda la cantidad de posiciones como nuestra precisión y tendremos nuestro valor entero con la parte fraccionaria realizamos una suma de los números binarios retornados y con estos podremos decir que aproximación se deberá realizar void multiplicador() int Rfrac = F1 * F2; int F; if (Rfrac == 0) { F = 000;

//fraccion en pantalla

} else if (Rfrac == 1) { F = 250; } else if (Rfrac == 2) { F = 500; } else if (Rfrac == 3) { F = 750; } else if (Rfrac == 4) { F = 000; } else if (Rfrac == 5) { F = 250; } else if (Rfrac == 6) { F = 500; } int REntera = E1 * E2; REntera = REntera >> 4; if(REntera>99999){ lc.setChar(0,0,'E',false); }else{ showDisplay(REntera, F);} Serial.println(REntera); Serial.println(F);

A diferencia del sumador y restador en la multiplicación se debe de realizar un corrimiento hacia la izquierda igual a la suma de las fracciones luego de estas haber sido aproximadas void divisor() if (E2 == 0 && F2 == 000) { lc.setChar(0, 7, 'E', false); lc.setChar(0, 6, 'A', false); lc.setChar(0, 5, 'A', false); lc.setChar(0, 4, '0', false); lc.setChar(0, 3, 'A', false); } else { REntera = E1 * 4 / E2; REntera = REntera >> 2; Rfrac = (REntera & 3)*25 ; if(REntera>99999){ lc.setChar(0,0,'E',false);

Universidad de Antioquia

Fundamentos De Electrónica Digital

}else{ showDisplay(REntera, Rfrac);}

en la división aplicamos un meto un poco menos común para calcular las variables luego de tenerlas en su forma entera multiplicaremos por 4 el primer número entero lo dividimos por el otro número entero luego movemos dos lugares a la derecha y tenemos el numero entero, pero no es todo. Antes de corres los numero tomamos los 3 últimos dígitos y a estos los multiplicamos por 25 ya que esta es la precisión que tenemos y esa seria nuestra parte fraccionaria .

-

V. REFERENCIAS. [1] http://arduino.cl/que-es-arduino/

pág. 5...


Similar Free PDFs