Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@2:be34b4d09318, 2014-03-13 (annotated)
- Committer:
- Alfredo_Ocegueda
- Date:
- Thu Mar 13 13:12:25 2014 +0000
- Revision:
- 2:be34b4d09318
- Parent:
- 1:6aeb3f8df608
laboratorio 4
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Alfredo_Ocegueda | 0:95d34170f70b | 1 | /* Buenas tardes, este es un programa creado para realizar distintas actividades que en el siguiente espacio mencionaremos: |
Alfredo_Ocegueda | 0:95d34170f70b | 2 | |
Alfredo_Ocegueda | 0:95d34170f70b | 3 | Se cargara a el microcontrolador freedom FDRM KL25Z. El cual nos ayudara de 2 maneras. |
Alfredo_Ocegueda | 0:95d34170f70b | 4 | |
Alfredo_Ocegueda | 0:95d34170f70b | 5 | En general el microcontrolador tendra conectado dos displays de 7 segmentos de anodo comun, 1 boton pulsador y 2 entradas analogicas que seran las |
Alfredo_Ocegueda | 0:95d34170f70b | 6 | diferentes funciones que mediremos. |
Alfredo_Ocegueda | 0:95d34170f70b | 7 | |
Alfredo_Ocegueda | 0:95d34170f70b | 8 | La primera de ellas será un voltimetro que nos desplegara el resultado en los displays previamente conectados, el cual para los valores de 0 - 9 |
Alfredo_Ocegueda | 0:95d34170f70b | 9 | mostrara un decimal, y para los valores de 10 - 28V nos mostrara el valor de la parte entera |
Alfredo_Ocegueda | 0:95d34170f70b | 10 | |
Alfredo_Ocegueda | 0:95d34170f70b | 11 | La segunda sera un ohmetro que nos desplegara el resultado en los displays, el cual nos desplegara el resultado siempre en Kiloohms |
Alfredo_Ocegueda | 0:95d34170f70b | 12 | |
Alfredo_Ocegueda | 0:95d34170f70b | 13 | Autor: Emilio Esteban Jimenez Godinez & Jose Alfredo Ocegueda Barraza |
Alfredo_Ocegueda | 0:95d34170f70b | 14 | Fecha: 12 de Marzo del 2014 |
Alfredo_Ocegueda | 0:95d34170f70b | 15 | Version: 1.1 */ |
Alfredo_Ocegueda | 0:95d34170f70b | 16 | |
Alfredo_Ocegueda | 0:95d34170f70b | 17 | |
Alfredo_Ocegueda | 0:95d34170f70b | 18 | #include "mbed.h" |
Alfredo_Ocegueda | 0:95d34170f70b | 19 | |
Alfredo_Ocegueda | 0:95d34170f70b | 20 | DigitalIn boton(PTB2); // cambia el estado ya sea para utilizar el voltimetro o el ohmetro |
Alfredo_Ocegueda | 0:95d34170f70b | 21 | AnalogIn lecvol(PTB3); // Entrada analogica que nos permite saber la lectura para el voltimetro |
Alfredo_Ocegueda | 0:95d34170f70b | 22 | AnalogIn lecres(PTC2); // Entrada analogica que nos permite saber la lectura para el ohmetro |
Alfredo_Ocegueda | 0:95d34170f70b | 23 | // A B C D E F G |
Alfredo_Ocegueda | 0:95d34170f70b | 24 | BusOut display_1(PTD2,PTD0,PTD5,PTE0,PTE1,PTD3,PTD1); // son las salidas haia el display izquierdo |
Alfredo_Ocegueda | 0:95d34170f70b | 25 | // A B C D E F G |
Alfredo_Ocegueda | 0:95d34170f70b | 26 | BusOut display_2(PTA12,PTD4,PTA2,PTC8,PTC9,PTA4,PTA5); // son las salidas haia el display derecho |
Alfredo_Ocegueda | 0:95d34170f70b | 27 | DigitalOut dp_display1(PTA13); // Esta salida es para el punto del display izquierdo |
Alfredo_Ocegueda | 0:95d34170f70b | 28 | DigitalOut dp_display2(PTA1); // Esta salida es para el punto del display derecho |
Alfredo_Ocegueda | 0:95d34170f70b | 29 | int tiempo=0; // nos sirve de auxiliar en la lectura de tiempo |
Alfredo_Ocegueda | 0:95d34170f70b | 30 | int promedio=0; |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 31 | float promedio_voltaje=0; |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 32 | float promedio_resistencia=0; |
Alfredo_Ocegueda | 0:95d34170f70b | 33 | int estado=0; // 0= Voltimetro; 1= Ohmetro |
Alfredo_Ocegueda | 0:95d34170f70b | 34 | int i; // Variable auxiliar para instruccion for |
Alfredo_Ocegueda | 0:95d34170f70b | 35 | float voltaje[]={0}; // Arreglo para guardar las lecturas de voltaje |
Alfredo_Ocegueda | 0:95d34170f70b | 36 | float resistencia[]={0}; // Arreglo para guardar las lecturas de resistencia |
Alfredo_Ocegueda | 0:95d34170f70b | 37 | int dis_1; // Variable auxiliar par regresar el valor de la funcion entero |
Alfredo_Ocegueda | 0:95d34170f70b | 38 | int dis_2; // Variable auxiliar par regresar el valor de la funcion entero |
Alfredo_Ocegueda | 0:95d34170f70b | 39 | |
Alfredo_Ocegueda | 0:95d34170f70b | 40 | int display_entero(int entero); //funcion para obtener el valor del display1 que necesitamos |
Alfredo_Ocegueda | 0:95d34170f70b | 41 | int display_decimal(int decimal); //funcion para obtener el valor del display2 que necesitamos |
Alfredo_Ocegueda | 0:95d34170f70b | 42 | |
Alfredo_Ocegueda | 0:95d34170f70b | 43 | int main() |
Alfredo_Ocegueda | 0:95d34170f70b | 44 | { |
Alfredo_Ocegueda | 0:95d34170f70b | 45 | Timer volt; |
Alfredo_Ocegueda | 0:95d34170f70b | 46 | Timer resis; |
Alfredo_Ocegueda | 0:95d34170f70b | 47 | |
Alfredo_Ocegueda | 0:95d34170f70b | 48 | while(1) |
Alfredo_Ocegueda | 0:95d34170f70b | 49 | { |
Alfredo_Ocegueda | 0:95d34170f70b | 50 | if(boton==1){ //utilizamos esta instruccion para cada vez que se presione el boton cambiemos de estado una variable |
Alfredo_Ocegueda | 0:95d34170f70b | 51 | estado=!estado; |
Alfredo_Ocegueda | 0:95d34170f70b | 52 | } |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 53 | if (estado == 0){ // Cuando estado sea = 0 metemos la formula para que nos de el resultado del voltimetro |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 54 | volt.start(); // y sacamos el promedio, despues hacemos lo necesario para imprimir la respuesta en los displays |
Alfredo_Ocegueda | 0:95d34170f70b | 55 | for(i=0; i<=9; i++){ |
Alfredo_Ocegueda | 0:95d34170f70b | 56 | int resultado_voltaje = (lecvol*3.3*5780)/680; |
Alfredo_Ocegueda | 0:95d34170f70b | 57 | if(volt.read_ms() == tiempo){ |
Alfredo_Ocegueda | 0:95d34170f70b | 58 | voltaje[i]=resultado_voltaje; |
Alfredo_Ocegueda | 0:95d34170f70b | 59 | promedio+=resultado_voltaje; |
Alfredo_Ocegueda | 0:95d34170f70b | 60 | tiempo+=200; |
Alfredo_Ocegueda | 0:95d34170f70b | 61 | } |
Alfredo_Ocegueda | 0:95d34170f70b | 62 | } |
Alfredo_Ocegueda | 0:95d34170f70b | 63 | if(volt.read_ms() ==2000){ |
Alfredo_Ocegueda | 0:95d34170f70b | 64 | promedio_voltaje=promedio/10; |
Alfredo_Ocegueda | 0:95d34170f70b | 65 | if (promedio_voltaje >= 10){ // Si el resultado es mayor a 10 entonces separamos en dos numeros |
Alfredo_Ocegueda | 0:95d34170f70b | 66 | int display_1 = display_entero(promedio_voltaje/10); // Mandamos llamar la funcion que nos regresa el valor del display 1 |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 67 | int display_2 = display_decimal(int(promedio_voltaje)%10);// Mandamos llamar la funcion que nos regresa el valor del display 2 |
Alfredo_Ocegueda | 0:95d34170f70b | 68 | } |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 69 | if (promedio_voltaje < 10){ // Si el resultado es menor a 10 entonces separamos en dos numeros uno sera la |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 70 | int display_1 = display_entero(promedio_voltaje); // Mandamos llamar la funcion que nos regresa el valor del display 1 |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 71 | dp_display1=1; // Prendemos el punto del display 1 asi sabremos que da decimales |
Alfredo_Ocegueda | 2:be34b4d09318 | 72 | int display_2 = display_decimal((promedio_voltaje*10)%10); // Mandamos llamar la funcion que nos regresa el valor del display 2 |
Alfredo_Ocegueda | 0:95d34170f70b | 73 | } |
Alfredo_Ocegueda | 0:95d34170f70b | 74 | volt.reset(); |
Alfredo_Ocegueda | 0:95d34170f70b | 75 | } |
Alfredo_Ocegueda | 0:95d34170f70b | 76 | } |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 77 | if (estado == 1){ // Cuando estado sea = 0 metemos la formula para que nos de el resultado del ohmetro |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 78 | resis.start(); // y sacamos el promedio, despues hacemos lo necesario para imprimir la respuesta en los displays |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 79 | dp_display2=1; // Para saber que el resultado sera en kohms activamos el dot poitn del segundo display y lo dejamos encendido siempre |
Alfredo_Ocegueda | 0:95d34170f70b | 80 | for(i=0; i<=9; i++){ |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 81 | int resultado_resistencia = ((3.3*10)/(lecres*3.3))-10; // Despues de sacar esta formula el resultado sera en Kohms |
Alfredo_Ocegueda | 0:95d34170f70b | 82 | if(resis.read_ms() == tiempo){ |
Alfredo_Ocegueda | 0:95d34170f70b | 83 | resistencia[i]=resultado_resistencia; |
Alfredo_Ocegueda | 0:95d34170f70b | 84 | promedio+=resultado_resistencia; |
Alfredo_Ocegueda | 0:95d34170f70b | 85 | tiempo+=200; |
Alfredo_Ocegueda | 0:95d34170f70b | 86 | } |
Alfredo_Ocegueda | 0:95d34170f70b | 87 | } |
Alfredo_Ocegueda | 0:95d34170f70b | 88 | if(resis.read_ms() == 2000){ |
Alfredo_Ocegueda | 0:95d34170f70b | 89 | promedio_resistencia=promedio/10; |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 90 | if(promedio_resistencia<1){ // Si el resultado de la formula es menor a 1 desplegaremos en el display en decimas de kohms |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 91 | display_1 = ~63; // Debido a que sera menor a 1 dejamos el primer display en 0 |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 92 | dp_display1=1; // Activamos el dot point del primer display ya que dara decimales |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 93 | int display_2 = display_decimal(promedio_resistencia*10); // Mandamos llamar la funcion que nos regresa el valor del display 2 |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 94 | } |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 95 | if(promedio_resistencia>=1&&promedio_resistencia<10){ // Si el resultado de la formula es mayor o igual a 1 y menor a 10 seguiremos dando decimales |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 96 | int display_1 = display_entero(promedio_resistencia); // Mandamos llamar la funcion que nos regresa el valor del display 1 |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 97 | dp_display1=1; // Activamos el dot point del primer display ya que dara decimales |
Alfredo_Ocegueda | 2:be34b4d09318 | 98 | int display_2 = display_decimal((promedio_resistencia*10)%10); // Mandamos llamar la funcion que nos regresa el valor del display 2 |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 99 | } |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 100 | if(promedio_resistencia>=10){ // Si el resultado de la formula es mayor o igual a 10 hacemos lo necesario para que los displays nos desplieguen el resultado |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 101 | int display_1 = display_entero(promedio_resistencia/10); // Mandamos llamar la funcion que nos regresa el valor del display 1 |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 102 | int display_2 = display_decimal(int(promedio_resistencia)%10); // Mandamos llamar la funcion que nos regresa el valor del display 2 |
Alfredo_Ocegueda | 1:6aeb3f8df608 | 103 | } |
Alfredo_Ocegueda | 0:95d34170f70b | 104 | resis.reset(); |
Alfredo_Ocegueda | 0:95d34170f70b | 105 | } |
Alfredo_Ocegueda | 0:95d34170f70b | 106 | } |
Alfredo_Ocegueda | 0:95d34170f70b | 107 | } |
Alfredo_Ocegueda | 0:95d34170f70b | 108 | } |
Alfredo_Ocegueda | 0:95d34170f70b | 109 | |
Alfredo_Ocegueda | 0:95d34170f70b | 110 | int display_entero (int entero){ // Esta funcion es para desplegar el numero en el primer display, a todos los resultados se les aplica un inversor |
Alfredo_Ocegueda | 0:95d34170f70b | 111 | switch(entero){ // debido a que los display que utilizamos son de anodo comun, entonces seria todo de manera inversa |
Alfredo_Ocegueda | 0:95d34170f70b | 112 | case 0: |
Alfredo_Ocegueda | 0:95d34170f70b | 113 | dis_1=~63; |
Alfredo_Ocegueda | 0:95d34170f70b | 114 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 115 | case 1: |
Alfredo_Ocegueda | 0:95d34170f70b | 116 | display_1=~6; |
Alfredo_Ocegueda | 0:95d34170f70b | 117 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 118 | case 2: |
Alfredo_Ocegueda | 0:95d34170f70b | 119 | dis_1=~91; |
Alfredo_Ocegueda | 0:95d34170f70b | 120 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 121 | case 3: |
Alfredo_Ocegueda | 0:95d34170f70b | 122 | dis_1=~79; |
Alfredo_Ocegueda | 0:95d34170f70b | 123 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 124 | case 4: |
Alfredo_Ocegueda | 0:95d34170f70b | 125 | dis_1=~102; |
Alfredo_Ocegueda | 0:95d34170f70b | 126 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 127 | case 5: |
Alfredo_Ocegueda | 0:95d34170f70b | 128 | dis_1=~109; |
Alfredo_Ocegueda | 0:95d34170f70b | 129 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 130 | case 6: |
Alfredo_Ocegueda | 0:95d34170f70b | 131 | dis_1=~125; |
Alfredo_Ocegueda | 0:95d34170f70b | 132 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 133 | case 7: |
Alfredo_Ocegueda | 0:95d34170f70b | 134 | dis_1=~7; |
Alfredo_Ocegueda | 0:95d34170f70b | 135 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 136 | case 8: |
Alfredo_Ocegueda | 0:95d34170f70b | 137 | dis_1=~127; |
Alfredo_Ocegueda | 0:95d34170f70b | 138 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 139 | case 9: |
Alfredo_Ocegueda | 0:95d34170f70b | 140 | dis_1=~103; |
Alfredo_Ocegueda | 0:95d34170f70b | 141 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 142 | } |
Alfredo_Ocegueda | 0:95d34170f70b | 143 | return dis_1; |
Alfredo_Ocegueda | 0:95d34170f70b | 144 | } |
Alfredo_Ocegueda | 0:95d34170f70b | 145 | |
Alfredo_Ocegueda | 0:95d34170f70b | 146 | int display_decimal(int decimal){ // Esta funcion es para desplegar el numero en el segundo display, a todos los resultados se les aplica un inversor |
Alfredo_Ocegueda | 0:95d34170f70b | 147 | switch(decimal){ // debido a que los display que utilizamos son de anodo comun, entonces seria todo de manera inversa |
Alfredo_Ocegueda | 0:95d34170f70b | 148 | case 0: |
Alfredo_Ocegueda | 0:95d34170f70b | 149 | dis_2=~63; |
Alfredo_Ocegueda | 0:95d34170f70b | 150 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 151 | case 1: |
Alfredo_Ocegueda | 0:95d34170f70b | 152 | dis_2=~6; |
Alfredo_Ocegueda | 0:95d34170f70b | 153 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 154 | case 2: |
Alfredo_Ocegueda | 0:95d34170f70b | 155 | dis_2=~91; |
Alfredo_Ocegueda | 0:95d34170f70b | 156 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 157 | case 3: |
Alfredo_Ocegueda | 0:95d34170f70b | 158 | dis_2=~79; |
Alfredo_Ocegueda | 0:95d34170f70b | 159 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 160 | case 4: |
Alfredo_Ocegueda | 0:95d34170f70b | 161 | dis_2=~102; |
Alfredo_Ocegueda | 0:95d34170f70b | 162 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 163 | case 5: |
Alfredo_Ocegueda | 0:95d34170f70b | 164 | dis_2=~109; |
Alfredo_Ocegueda | 0:95d34170f70b | 165 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 166 | case 6: |
Alfredo_Ocegueda | 0:95d34170f70b | 167 | dis_2=~125; |
Alfredo_Ocegueda | 0:95d34170f70b | 168 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 169 | case 7: |
Alfredo_Ocegueda | 0:95d34170f70b | 170 | dis_2=~7; |
Alfredo_Ocegueda | 0:95d34170f70b | 171 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 172 | case 8: |
Alfredo_Ocegueda | 0:95d34170f70b | 173 | dis_2=~127; |
Alfredo_Ocegueda | 0:95d34170f70b | 174 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 175 | case 9: |
Alfredo_Ocegueda | 0:95d34170f70b | 176 | dis_2=~103; |
Alfredo_Ocegueda | 0:95d34170f70b | 177 | break; |
Alfredo_Ocegueda | 0:95d34170f70b | 178 | } |
Alfredo_Ocegueda | 0:95d34170f70b | 179 | return dis_2; |
Alfredo_Ocegueda | 0:95d34170f70b | 180 | } |