Documento ejemplo para los alumnos de informática industrial.

Dependencies:   mbed

Fork of info_timers_avanzado by Gerardo Carmona

Committer:
gcarmonar
Date:
Fri Mar 07 22:51:03 2014 +0000
Revision:
0:5852cc92df20
Documento ejemplo para los alumnos de inform?tica industrial.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gcarmonar 0:5852cc92df20 1 /* ----------------------------------------------------------
gcarmonar 0:5852cc92df20 2 Informatica Industrial - Timers Avanzado
gcarmonar 0:5852cc92df20 3
gcarmonar 0:5852cc92df20 4 Programa donde se realizan 3 tareas por piertos:
gcarmonar 0:5852cc92df20 5 1) Incrementar un contador en un display de 7 segmentos
gcarmonar 0:5852cc92df20 6 2) Parpadear un led a cierta frecuencia
gcarmonar 0:5852cc92df20 7 3) Leer datos de un puerto analogico y calcular promedio
gcarmonar 0:5852cc92df20 8 Además realiza las siguientes actividades cuando se presenta
gcarmonar 0:5852cc92df20 9 un evento:
gcarmonar 0:5852cc92df20 10 1) Leer el estado de un boton y una bandera que evita que
gcarmonar 0:5852cc92df20 11 se manden a imprimir muchos datos y saturar la
gcarmonar 0:5852cc92df20 12 comunicacion serie
gcarmonar 0:5852cc92df20 13 2) Leer el estado de un boton y una bandera que hacen
gcarmonar 0:5852cc92df20 14 cambiar el modo de operacion entre un voltimetro y un
gcarmonar 0:5852cc92df20 15 ohmetro.
gcarmonar 0:5852cc92df20 16
gcarmonar 0:5852cc92df20 17 Autor: Gerardo Carmona
gcarmonar 0:5852cc92df20 18 Fecha: 28 / Febrero / 2014
gcarmonar 0:5852cc92df20 19 Versión: 1.0
gcarmonar 0:5852cc92df20 20
gcarmonar 0:5852cc92df20 21 ----------------------------------------------------------- */
gcarmonar 0:5852cc92df20 22
gcarmonar 0:5852cc92df20 23 #include "mbed.h"
gcarmonar 0:5852cc92df20 24
gcarmonar 0:5852cc92df20 25 //--- O/I Pins ----------------------------------------------
gcarmonar 0:5852cc92df20 26 DigitalOut led_status(D13); //Just for fun
gcarmonar 0:5852cc92df20 27 //A, B, C, D, E, F, G
gcarmonar 0:5852cc92df20 28 BusOut seven_segment(D2, D3, D4, D5, D6, D7, D8);
gcarmonar 0:5852cc92df20 29 DigitalIn select(D9);
gcarmonar 0:5852cc92df20 30 DigitalIn send_data(D10);
gcarmonar 0:5852cc92df20 31 AnalogIn read_voltage(A0);
gcarmonar 0:5852cc92df20 32 AnalogIn read_resistor(A2);
gcarmonar 0:5852cc92df20 33 Timer timer;
gcarmonar 0:5852cc92df20 34 Serial pc(USBTX, USBRX); // tx, rx
gcarmonar 0:5852cc92df20 35
gcarmonar 0:5852cc92df20 36 //--- Constants ---------------------------------------------
gcarmonar 0:5852cc92df20 37 #define MAX_COUNT 15 //Max count for display
gcarmonar 0:5852cc92df20 38 #define MIN_COUNT 0 //Min count for display
gcarmonar 0:5852cc92df20 39 #define INCREMENT_TIME_MS 1000 //Increment display time
gcarmonar 0:5852cc92df20 40 #define BLINK_LED_TIME_MS 250 //Blink LED
gcarmonar 0:5852cc92df20 41 #define READ_DATA_TIME_MS 500 //Read and convert data
gcarmonar 0:5852cc92df20 42 #define SEND_DATA_TIME_MS 500 //Time to send data to PC
gcarmonar 0:5852cc92df20 43
gcarmonar 0:5852cc92df20 44 //--- Variables ---------------------------------------------
gcarmonar 0:5852cc92df20 45 int actual_time = 0;
gcarmonar 0:5852cc92df20 46 int last_time = 0;
gcarmonar 0:5852cc92df20 47 int count = 0;
gcarmonar 0:5852cc92df20 48 int mode = 0; // 0 - Read Voltaje, 1 - Read Resistence
gcarmonar 0:5852cc92df20 49 int mili_volts[10] = {0,0,0,0,0,0,0,0,0,0};
gcarmonar 0:5852cc92df20 50 int resistor_ohms[10] = {0,0,0,0,0,0,0,0,0,0};
gcarmonar 0:5852cc92df20 51 int data = 0;
gcarmonar 0:5852cc92df20 52 int reading_number = 0;
gcarmonar 0:5852cc92df20 53 int array_index = 0;
gcarmonar 0:5852cc92df20 54
gcarmonar 0:5852cc92df20 55 //--- Functions Declarations --------------------------------
gcarmonar 0:5852cc92df20 56 void increment_display(int c);
gcarmonar 0:5852cc92df20 57 int multimeter(int flag);
gcarmonar 0:5852cc92df20 58
gcarmonar 0:5852cc92df20 59 //--- Main Program ------------------------------------------
gcarmonar 0:5852cc92df20 60 int main() {
gcarmonar 0:5852cc92df20 61 timer.start();
gcarmonar 0:5852cc92df20 62 while(1) {
gcarmonar 0:5852cc92df20 63 actual_time = timer.read_ms();
gcarmonar 0:5852cc92df20 64 if (actual_time % INCREMENT_TIME_MS == 0){
gcarmonar 0:5852cc92df20 65 pc.printf("count: %i\n", count);
gcarmonar 0:5852cc92df20 66 increment_display(count);
gcarmonar 0:5852cc92df20 67 if (count < MAX_COUNT){
gcarmonar 0:5852cc92df20 68 count++;
gcarmonar 0:5852cc92df20 69 }else{
gcarmonar 0:5852cc92df20 70 count = MIN_COUNT;
gcarmonar 0:5852cc92df20 71 }
gcarmonar 0:5852cc92df20 72 }
gcarmonar 0:5852cc92df20 73
gcarmonar 0:5852cc92df20 74 if (actual_time % BLINK_LED_TIME_MS == 0){
gcarmonar 0:5852cc92df20 75 led_status = !led_status;
gcarmonar 0:5852cc92df20 76 }
gcarmonar 0:5852cc92df20 77
gcarmonar 0:5852cc92df20 78 if (actual_time % READ_DATA_TIME_MS == 0){
gcarmonar 0:5852cc92df20 79 data = multimeter(mode);
gcarmonar 0:5852cc92df20 80 }
gcarmonar 0:5852cc92df20 81
gcarmonar 0:5852cc92df20 82
gcarmonar 0:5852cc92df20 83 if (send_data == 1 && actual_time >= (last_time + SEND_DATA_TIME_MS)){
gcarmonar 0:5852cc92df20 84 if (mode == 0){
gcarmonar 0:5852cc92df20 85 pc.printf("Voltaje: %d mV\n", data);
gcarmonar 0:5852cc92df20 86 }else{
gcarmonar 0:5852cc92df20 87 pc.printf("no hay infomacion disponible\n");
gcarmonar 0:5852cc92df20 88 }
gcarmonar 0:5852cc92df20 89 last_time = actual_time;
gcarmonar 0:5852cc92df20 90 }
gcarmonar 0:5852cc92df20 91
gcarmonar 0:5852cc92df20 92 if (select == 1 && actual_time >= (last_time + SEND_DATA_TIME_MS)){
gcarmonar 0:5852cc92df20 93 mode = !mode;
gcarmonar 0:5852cc92df20 94 last_time = actual_time;
gcarmonar 0:5852cc92df20 95 }
gcarmonar 0:5852cc92df20 96
gcarmonar 0:5852cc92df20 97
gcarmonar 0:5852cc92df20 98 }
gcarmonar 0:5852cc92df20 99 }
gcarmonar 0:5852cc92df20 100
gcarmonar 0:5852cc92df20 101 //--- Functions --------------------------------------------
gcarmonar 0:5852cc92df20 102 void increment_display(int c){
gcarmonar 0:5852cc92df20 103 switch (c){
gcarmonar 0:5852cc92df20 104 case 0:
gcarmonar 0:5852cc92df20 105 seven_segment = 63;
gcarmonar 0:5852cc92df20 106 break;
gcarmonar 0:5852cc92df20 107 case 1:
gcarmonar 0:5852cc92df20 108 seven_segment = 6;
gcarmonar 0:5852cc92df20 109 break;
gcarmonar 0:5852cc92df20 110 case 2:
gcarmonar 0:5852cc92df20 111 seven_segment = 91;
gcarmonar 0:5852cc92df20 112 break;
gcarmonar 0:5852cc92df20 113 case 3:
gcarmonar 0:5852cc92df20 114 seven_segment = 79;
gcarmonar 0:5852cc92df20 115 break;
gcarmonar 0:5852cc92df20 116 case 4:
gcarmonar 0:5852cc92df20 117 seven_segment = 102;
gcarmonar 0:5852cc92df20 118 break;
gcarmonar 0:5852cc92df20 119 case 5:
gcarmonar 0:5852cc92df20 120 seven_segment = 109;
gcarmonar 0:5852cc92df20 121 break;
gcarmonar 0:5852cc92df20 122 case 6:
gcarmonar 0:5852cc92df20 123 seven_segment = 125;
gcarmonar 0:5852cc92df20 124 break;
gcarmonar 0:5852cc92df20 125 case 7:
gcarmonar 0:5852cc92df20 126 seven_segment = 7;
gcarmonar 0:5852cc92df20 127 break;
gcarmonar 0:5852cc92df20 128 case 8:
gcarmonar 0:5852cc92df20 129 seven_segment = 127;
gcarmonar 0:5852cc92df20 130 break;
gcarmonar 0:5852cc92df20 131 case 9:
gcarmonar 0:5852cc92df20 132 seven_segment = 111;
gcarmonar 0:5852cc92df20 133 break;
gcarmonar 0:5852cc92df20 134 case 10:
gcarmonar 0:5852cc92df20 135 seven_segment = 119;
gcarmonar 0:5852cc92df20 136 break;
gcarmonar 0:5852cc92df20 137 case 11:
gcarmonar 0:5852cc92df20 138 seven_segment = 124;
gcarmonar 0:5852cc92df20 139 break;
gcarmonar 0:5852cc92df20 140 case 12:
gcarmonar 0:5852cc92df20 141 seven_segment = 57;
gcarmonar 0:5852cc92df20 142 break;
gcarmonar 0:5852cc92df20 143 case 13:
gcarmonar 0:5852cc92df20 144 seven_segment = 94;
gcarmonar 0:5852cc92df20 145 break;
gcarmonar 0:5852cc92df20 146 case 14:
gcarmonar 0:5852cc92df20 147 seven_segment = 121;
gcarmonar 0:5852cc92df20 148 break;
gcarmonar 0:5852cc92df20 149 case 15:
gcarmonar 0:5852cc92df20 150 seven_segment = 113;
gcarmonar 0:5852cc92df20 151 break;
gcarmonar 0:5852cc92df20 152 default:
gcarmonar 0:5852cc92df20 153 seven_segment = 64;
gcarmonar 0:5852cc92df20 154 }
gcarmonar 0:5852cc92df20 155 }
gcarmonar 0:5852cc92df20 156
gcarmonar 0:5852cc92df20 157 int multimeter(int flag){
gcarmonar 0:5852cc92df20 158 int average = 0;
gcarmonar 0:5852cc92df20 159 float temp = 0;
gcarmonar 0:5852cc92df20 160 if (flag == 0){
gcarmonar 0:5852cc92df20 161 temp = read_voltage*36300; //36300 = 1000(convert to mV) * 3.3(convert to volts) * 11(ratio)
gcarmonar 0:5852cc92df20 162 mili_volts[array_index] = int(temp);
gcarmonar 0:5852cc92df20 163
gcarmonar 0:5852cc92df20 164 for (int i = 0; i <= reading_number; i++){
gcarmonar 0:5852cc92df20 165 average += mili_volts[i]; //sum all the values
gcarmonar 0:5852cc92df20 166 }
gcarmonar 0:5852cc92df20 167 average = average/(reading_number+1); //calulate the average
gcarmonar 0:5852cc92df20 168
gcarmonar 0:5852cc92df20 169 /* debugging purposes
gcarmonar 0:5852cc92df20 170 pc.printf("index: %i, ", array_index);
gcarmonar 0:5852cc92df20 171 pc.printf("actual: %i, promedio: %i, ", mili_volts[array_index], average);
gcarmonar 0:5852cc92df20 172 pc.printf("reading number: %i\n", reading_number); */
gcarmonar 0:5852cc92df20 173
gcarmonar 0:5852cc92df20 174 array_index++;
gcarmonar 0:5852cc92df20 175 if (reading_number < 9){
gcarmonar 0:5852cc92df20 176 reading_number++; //max number is 9
gcarmonar 0:5852cc92df20 177 }
gcarmonar 0:5852cc92df20 178 if (array_index > 9){
gcarmonar 0:5852cc92df20 179 array_index = 0; //reset array index
gcarmonar 0:5852cc92df20 180 }
gcarmonar 0:5852cc92df20 181
gcarmonar 0:5852cc92df20 182 }else{
gcarmonar 0:5852cc92df20 183 pc.printf("falta hacer la lectura\n");
gcarmonar 0:5852cc92df20 184 }
gcarmonar 0:5852cc92df20 185
gcarmonar 0:5852cc92df20 186 return average;
gcarmonar 0:5852cc92df20 187 }
gcarmonar 0:5852cc92df20 188