Documento ejemplo para los alumnos de informática industrial.
Fork of info_timers_avanzado by
main.cpp@0:5852cc92df20, 2014-03-07 (annotated)
- 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?
User | Revision | Line number | New 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 |