Este es el Ejercicio 3 del TP Nº1 de Sistemas Embebidos. El objetivo del programa es mejorar el funcionamiento de una cafetera "ATMA CA8180"

Dependencies:   DS1820 antirrebote matriz mbed tsi_sensor

Fork of DS1820_HelloWorld by Erik -

Committer:
Tom_87
Date:
Tue Jun 12 17:10:21 2018 +0000
Revision:
6:8cc6048e0376
Parent:
5:b8a9f4da4205
programa de funcionamiento de una cafetera automatica;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Tom_87 5:b8a9f4da4205 1 #include "mbed.h"
Tom_87 5:b8a9f4da4205 2 #include "matrix.h"
Tom_87 5:b8a9f4da4205 3 #include "DS1820.h"
Tom_87 5:b8a9f4da4205 4 #include "antirrebote.h"
Tom_87 5:b8a9f4da4205 5 #include "tsi_sensor.h"
Tom_87 6:8cc6048e0376 6 #define TIME 15000
Tom_87 5:b8a9f4da4205 7
Tom_87 5:b8a9f4da4205 8 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
Tom_87 5:b8a9f4da4205 9 #define ELEC0 9
Tom_87 5:b8a9f4da4205 10 #define ELEC1 10
Tom_87 5:b8a9f4da4205 11 #elif defined (TARGET_KL05Z)
Tom_87 5:b8a9f4da4205 12 #define ELEC0 9
Tom_87 5:b8a9f4da4205 13 #define ELEC1 8
Tom_87 5:b8a9f4da4205 14 #else
Tom_87 5:b8a9f4da4205 15 #error TARGET NOT DEFINED
Tom_87 5:b8a9f4da4205 16 #endif
Tom_87 5:b8a9f4da4205 17
Tom_87 5:b8a9f4da4205 18 //Declaraciones de valores de estados
Tom_87 5:b8a9f4da4205 19 enum {OFF = 0,
Tom_87 5:b8a9f4da4205 20 LED_ON = 0,
Tom_87 5:b8a9f4da4205 21 ON = 1,
Tom_87 5:b8a9f4da4205 22 LED_OFF = 1,
Tom_87 5:b8a9f4da4205 23 COMPLETE = 0,
Tom_87 5:b8a9f4da4205 24 TEMP_IDEAL = 40,
Tom_87 5:b8a9f4da4205 25 T_BOMBA = 60,
Tom_87 5:b8a9f4da4205 26 HORA,MINUTO};
Tom_87 5:b8a9f4da4205 27
Tom_87 5:b8a9f4da4205 28 enum{s_start,
Tom_87 5:b8a9f4da4205 29 s_set_time,
Tom_87 5:b8a9f4da4205 30 s_set_auto,
Tom_87 5:b8a9f4da4205 31 s_go,
Tom_87 5:b8a9f4da4205 32 s_off = 0,
Tom_87 5:b8a9f4da4205 33 s_auto_on,
Tom_87 5:b8a9f4da4205 34 s_run};
Tom_87 5:b8a9f4da4205 35
Tom_87 5:b8a9f4da4205 36
Tom_87 5:b8a9f4da4205 37 //Salidas
Tom_87 5:b8a9f4da4205 38 DigitalOut LED_ROJO(LED1);
Tom_87 5:b8a9f4da4205 39 DigitalOut LED_VERDE(LED2);
Tom_87 5:b8a9f4da4205 40 DigitalOut LED_AZUL(LED3);
Tom_87 5:b8a9f4da4205 41
Tom_87 5:b8a9f4da4205 42 DigitalOut Bomba_out(PTC5);
Tom_87 5:b8a9f4da4205 43 DigitalOut R_Cal(PTC6);
Tom_87 5:b8a9f4da4205 44
Tom_87 5:b8a9f4da4205 45 DigitalOut RST(PTB8);
Tom_87 5:b8a9f4da4205 46 DigitalOut DATA(PTB9);
Tom_87 5:b8a9f4da4205 47 DigitalOut CLK(PTB10);
Tom_87 5:b8a9f4da4205 48
Tom_87 5:b8a9f4da4205 49 //Buses creados para el manejo de las matrices
Tom_87 5:b8a9f4da4205 50 BusOut Columnas1_15(PTC1, PTC2, PTB3, PTB2);
Tom_87 5:b8a9f4da4205 51 BusOut Columnas16_30(PTE30, PTE29, PTE23, PTE22);
Tom_87 5:b8a9f4da4205 52
Tom_87 5:b8a9f4da4205 53 TSIAnalogSlider tsi(ELEC0, ELEC1, 40); //Seteo del Slider
Tom_87 5:b8a9f4da4205 54
Tom_87 5:b8a9f4da4205 55 DS1820 probe(PTC10); //Seteo del sensor
Tom_87 5:b8a9f4da4205 56
Tom_87 5:b8a9f4da4205 57 //Objetos
Tom_87 5:b8a9f4da4205 58 //Seteo de los nombres del objeto tipo "Ticker"
Tom_87 5:b8a9f4da4205 59 Ticker timer_func; //Bomba de agua
Tom_87 5:b8a9f4da4205 60 Ticker timer; //Para el reloj
Tom_87 5:b8a9f4da4205 61 Ticker timer_puls; //Para los pulsadors
Tom_87 5:b8a9f4da4205 62 Ticker timer_sens; //Para el sensord de temperatura
Tom_87 5:b8a9f4da4205 63
Tom_87 5:b8a9f4da4205 64 //Seteo de los nombres del objeto tipo "AntReb" ==> Librería de antirrebote
Tom_87 5:b8a9f4da4205 65 AntReb P_minuto; //Pulsador para setear los minutos
Tom_87 5:b8a9f4da4205 66 AntReb P_hora; //Pulsador para setear las horas
Tom_87 5:b8a9f4da4205 67 AntReb P_prog; //Pulsador para seleccionar el modo
Tom_87 5:b8a9f4da4205 68 AntReb P_on; //Pulsador de encendido
Tom_87 5:b8a9f4da4205 69
Tom_87 5:b8a9f4da4205 70 //Prototipos de funciones
Tom_87 5:b8a9f4da4205 71 int iniciacion(char Puls_prog,char Puls_hora,char Puls_minuto);
Tom_87 5:b8a9f4da4205 72 int funcionamiento(char Puls_on);
Tom_87 5:b8a9f4da4205 73 void RealTime_Clock(void);
Tom_87 5:b8a9f4da4205 74 void Minuto(void);
Tom_87 5:b8a9f4da4205 75 int matriz(void);
Tom_87 5:b8a9f4da4205 76 void interrupt_time_func(void);
Tom_87 5:b8a9f4da4205 77 int Slider(char Ho_Mi);
Tom_87 5:b8a9f4da4205 78 void int_puls();
Tom_87 5:b8a9f4da4205 79 void int_sens();
Tom_87 5:b8a9f4da4205 80
Tom_87 5:b8a9f4da4205 81 //Seteo de variables globales
Tom_87 5:b8a9f4da4205 82 char M[6] = {'C','O','N','F','I','G'};
Tom_87 5:b8a9f4da4205 83 char Alarma[4];
Tom_87 5:b8a9f4da4205 84
Tom_87 5:b8a9f4da4205 85 char hora_dec = '0',
Tom_87 5:b8a9f4da4205 86 hora_uni = '0',
Tom_87 5:b8a9f4da4205 87 minuto_dec = '0',
Tom_87 5:b8a9f4da4205 88 minuto_uni = '0',
Tom_87 5:b8a9f4da4205 89 stateI = s_start,
Tom_87 5:b8a9f4da4205 90 stateF = s_off;
Tom_87 5:b8a9f4da4205 91
Tom_87 5:b8a9f4da4205 92 char hab_func = OFF,
Tom_87 5:b8a9f4da4205 93 t_bomba = T_BOMBA,
Tom_87 5:b8a9f4da4205 94 Puls_on,
Tom_87 5:b8a9f4da4205 95 Bomba,
Tom_87 5:b8a9f4da4205 96 hora,
Tom_87 5:b8a9f4da4205 97 t_puls,
Tom_87 5:b8a9f4da4205 98 sl = 0,
Tom_87 5:b8a9f4da4205 99 med = 0,
Tom_87 5:b8a9f4da4205 100 time_sens;
Tom_87 5:b8a9f4da4205 101
Tom_87 5:b8a9f4da4205 102 char num_matriz = 0,
Tom_87 5:b8a9f4da4205 103 Fila,
Tom_87 5:b8a9f4da4205 104 colum_A = 0,
Tom_87 5:b8a9f4da4205 105 colum_B = 0,
Tom_87 5:b8a9f4da4205 106 ColumnaA = 0,
Tom_87 5:b8a9f4da4205 107 ColumnaB,
Tom_87 5:b8a9f4da4205 108 estado_d;
Tom_87 5:b8a9f4da4205 109 int t;
Tom_87 5:b8a9f4da4205 110
Tom_87 5:b8a9f4da4205 111 float Sens_value;
Tom_87 5:b8a9f4da4205 112
Tom_87 5:b8a9f4da4205 113 int main(void){
Tom_87 5:b8a9f4da4205 114
Tom_87 5:b8a9f4da4205 115 char PULSO_prog, PULSO_hora ,PULSO_minuto ,PULSO_on; //Variables que guardarán el estado de los pulsadores
Tom_87 5:b8a9f4da4205 116
Tom_87 5:b8a9f4da4205 117 timer_func.attach(&interrupt_time_func,1); //Llamará a la función "interrupt_time_func" cada 1s
Tom_87 5:b8a9f4da4205 118 timer.attach(&RealTime_Clock,0.1); //Llamará a la función "RealTime_Clock" cada 0.1s (100ms)
Tom_87 6:8cc6048e0376 119 timer_puls.attach(&int_puls,0.01); //Llamará a la función "int_puls" cada 0.001s (1ms)
Tom_87 5:b8a9f4da4205 120 timer_sens.attach(&int_sens,0.1); //Llamará a la función "int_sens" cada 0.1s (100ms)
Tom_87 5:b8a9f4da4205 121 //Estados iniciales de los LEDs
Tom_87 5:b8a9f4da4205 122 LED_ROJO = LED_OFF;
Tom_87 5:b8a9f4da4205 123 LED_VERDE = LED_OFF;
Tom_87 5:b8a9f4da4205 124 LED_AZUL = LED_OFF;
Tom_87 5:b8a9f4da4205 125
Tom_87 5:b8a9f4da4205 126 while (true)
Tom_87 5:b8a9f4da4205 127 {
Tom_87 5:b8a9f4da4205 128 if (med == 1){
Tom_87 5:b8a9f4da4205 129 if(time_sens == 0){ //Variable que disminuye cada 100ms gracias a un "ticker"
Tom_87 5:b8a9f4da4205 130 probe.convertTemperature(true, DS1820::this_device); //Comienza la conversión de temperatura, se espera a que esté listo
Tom_87 5:b8a9f4da4205 131 Sens_value = probe.temperature();
Tom_87 5:b8a9f4da4205 132 time_sens = 50;
Tom_87 5:b8a9f4da4205 133 }
Tom_87 5:b8a9f4da4205 134 }
Tom_87 5:b8a9f4da4205 135 //Seteo de los pines donde se conectarán los pulsadores
Tom_87 5:b8a9f4da4205 136 P_minuto.setPin(PTC0);
Tom_87 5:b8a9f4da4205 137 P_hora.setPin(PTC3);
Tom_87 5:b8a9f4da4205 138 P_prog.setPin(PTC4);
Tom_87 5:b8a9f4da4205 139 P_on.setPin(PTC7);
Tom_87 5:b8a9f4da4205 140
Tom_87 6:8cc6048e0376 141
Tom_87 5:b8a9f4da4205 142 //Adquisición y guardado de los estados de los pulsadores
Tom_87 5:b8a9f4da4205 143 PULSO_prog = P_prog.antiRebote();
Tom_87 5:b8a9f4da4205 144 PULSO_hora = P_hora.antiRebote();
Tom_87 5:b8a9f4da4205 145 PULSO_minuto = P_minuto.antiRebote();
Tom_87 6:8cc6048e0376 146 PULSO_on = P_on.antiRebote();
Tom_87 5:b8a9f4da4205 147 iniciacion(PULSO_prog,PULSO_hora,PULSO_minuto); //Configuración de la hora actual y del modo automático
Tom_87 5:b8a9f4da4205 148 if (hab_func == ON) //Habilita el funcionamiento cuando se termina la configuración
Tom_87 5:b8a9f4da4205 149 funcionamiento(PULSO_on);
Tom_87 5:b8a9f4da4205 150 if(hab_func == ON || sl > 0){ //Para el Modo Activo y para cuando se usa el Slider
Tom_87 5:b8a9f4da4205 151 M[0] = (hora_dec);
Tom_87 5:b8a9f4da4205 152 M[1] = (hora_uni);
Tom_87 5:b8a9f4da4205 153 M[4] = (minuto_dec);
Tom_87 5:b8a9f4da4205 154 M[5] = (minuto_uni);
Tom_87 5:b8a9f4da4205 155 }
Tom_87 5:b8a9f4da4205 156 //Llamado de función
Tom_87 5:b8a9f4da4205 157 matriz();
Tom_87 5:b8a9f4da4205 158 }
Tom_87 5:b8a9f4da4205 159 }
Tom_87 5:b8a9f4da4205 160
Tom_87 5:b8a9f4da4205 161 // -------------------------------------------------------------------------------------------------------
Tom_87 5:b8a9f4da4205 162 //A partir de este comentario se realizarán las definiciones de cada función
Tom_87 5:b8a9f4da4205 163
Tom_87 5:b8a9f4da4205 164 //Máquina de estados del inicio de la cafetera
Tom_87 5:b8a9f4da4205 165 int iniciacion(char Puls_prog,char Puls_hora,char Puls_minuto){
Tom_87 5:b8a9f4da4205 166 switch (stateI){
Tom_87 5:b8a9f4da4205 167 //Estado de inicio
Tom_87 5:b8a9f4da4205 168 case s_start:
Tom_87 5:b8a9f4da4205 169 hab_func = OFF;
Tom_87 5:b8a9f4da4205 170 LED_ROJO = LED_OFF;
Tom_87 5:b8a9f4da4205 171 LED_VERDE = LED_OFF;
Tom_87 5:b8a9f4da4205 172 LED_AZUL = LED_OFF;
Tom_87 5:b8a9f4da4205 173 R_Cal = OFF;
Tom_87 5:b8a9f4da4205 174 Bomba_out = OFF;
Tom_87 6:8cc6048e0376 175 med=0;
Tom_87 5:b8a9f4da4205 176 if(Puls_prog == ON){
Tom_87 5:b8a9f4da4205 177 stateI = s_set_auto;
Tom_87 5:b8a9f4da4205 178 strcpy(M," AUTO ");//Escribe la matriz
Tom_87 5:b8a9f4da4205 179 }
Tom_87 5:b8a9f4da4205 180 break;
Tom_87 5:b8a9f4da4205 181 //Estado del Modo Automático
Tom_87 5:b8a9f4da4205 182 case s_set_auto:
Tom_87 5:b8a9f4da4205 183 if(Puls_hora == ON){
Tom_87 5:b8a9f4da4205 184 strcpy(M," ");//Limpia la matriz
Tom_87 5:b8a9f4da4205 185 sl = 1;//Habilita el vínculo Slider/Hora
Tom_87 5:b8a9f4da4205 186 }
Tom_87 5:b8a9f4da4205 187 else if(Puls_minuto == ON){
Tom_87 5:b8a9f4da4205 188 strcpy(M," ");//Limpia la matriz
Tom_87 5:b8a9f4da4205 189 sl = 2; //HABILITA VINCULO SLIDER-MINUTO
Tom_87 5:b8a9f4da4205 190 }
Tom_87 5:b8a9f4da4205 191 else if(Puls_prog == ON){
Tom_87 5:b8a9f4da4205 192 stateI = s_set_time;
Tom_87 5:b8a9f4da4205 193 sl = 0;
Tom_87 5:b8a9f4da4205 194 strcpy(M," HORA ");
Tom_87 5:b8a9f4da4205 195 }
Tom_87 5:b8a9f4da4205 196
Tom_87 5:b8a9f4da4205 197 Alarma[0] = hora_dec;
Tom_87 5:b8a9f4da4205 198 Alarma[1] = hora_uni;
Tom_87 5:b8a9f4da4205 199 Alarma[2] = minuto_dec;
Tom_87 5:b8a9f4da4205 200 Alarma[3] = minuto_uni;
Tom_87 5:b8a9f4da4205 201 if (sl == 1)
Tom_87 5:b8a9f4da4205 202 Slider(HORA);
Tom_87 5:b8a9f4da4205 203 else if (sl == 2)
Tom_87 5:b8a9f4da4205 204 Slider(MINUTO)
Tom_87 5:b8a9f4da4205 205 ;
Tom_87 5:b8a9f4da4205 206 break;
Tom_87 5:b8a9f4da4205 207 //Estado del Seteo de Tiempo
Tom_87 5:b8a9f4da4205 208 case s_set_time:
Tom_87 5:b8a9f4da4205 209 if(Puls_hora == ON)
Tom_87 5:b8a9f4da4205 210 {
Tom_87 5:b8a9f4da4205 211 strcpy(M," ");
Tom_87 5:b8a9f4da4205 212 sl = 1;
Tom_87 5:b8a9f4da4205 213 }
Tom_87 5:b8a9f4da4205 214 else if(Puls_minuto == ON){
Tom_87 5:b8a9f4da4205 215 sl = 2;
Tom_87 5:b8a9f4da4205 216 strcpy(M," ");
Tom_87 5:b8a9f4da4205 217 }
Tom_87 5:b8a9f4da4205 218 else if(Puls_prog == ON)
Tom_87 5:b8a9f4da4205 219 {
Tom_87 5:b8a9f4da4205 220 stateI = s_go;
Tom_87 5:b8a9f4da4205 221 sl = 0;
Tom_87 5:b8a9f4da4205 222 }
Tom_87 5:b8a9f4da4205 223 if(sl == 1)
Tom_87 5:b8a9f4da4205 224 Slider(HORA);
Tom_87 5:b8a9f4da4205 225 else if(sl == 2)
Tom_87 5:b8a9f4da4205 226 Slider(MINUTO);
Tom_87 5:b8a9f4da4205 227 break;
Tom_87 5:b8a9f4da4205 228 //Estado en el que permanece hasta que desee reprogramar la hora
Tom_87 5:b8a9f4da4205 229 case s_go:
Tom_87 5:b8a9f4da4205 230 M[2] = ':';
Tom_87 5:b8a9f4da4205 231 M[3] = ':';
Tom_87 5:b8a9f4da4205 232 hab_func = ON;
Tom_87 5:b8a9f4da4205 233 if (Puls_prog == ON){
Tom_87 5:b8a9f4da4205 234 stateI = s_start;
Tom_87 5:b8a9f4da4205 235 hab_func = OFF;
Tom_87 5:b8a9f4da4205 236 sl = 0;
Tom_87 5:b8a9f4da4205 237 strcpy(M," ");
Tom_87 5:b8a9f4da4205 238 strcpy(M,"CONFIG ");
Tom_87 5:b8a9f4da4205 239 }
Tom_87 5:b8a9f4da4205 240 break;
Tom_87 5:b8a9f4da4205 241 }
Tom_87 5:b8a9f4da4205 242 return 0;
Tom_87 5:b8a9f4da4205 243 }
Tom_87 5:b8a9f4da4205 244 //Máquina de estados del funcionamiento cuando se "prende"
Tom_87 5:b8a9f4da4205 245 int funcionamiento(char Puls_on){
Tom_87 5:b8a9f4da4205 246 switch(stateF){
Tom_87 5:b8a9f4da4205 247 default:
Tom_87 5:b8a9f4da4205 248 //Modo Apagado
Tom_87 5:b8a9f4da4205 249 case s_off:
Tom_87 5:b8a9f4da4205 250 LED_ROJO = LED_ON;
Tom_87 5:b8a9f4da4205 251 R_Cal = OFF;
Tom_87 5:b8a9f4da4205 252 Bomba_out = OFF;
Tom_87 6:8cc6048e0376 253 med=0;
Tom_87 5:b8a9f4da4205 254 if (Puls_on == ON)
Tom_87 5:b8a9f4da4205 255 {
Tom_87 5:b8a9f4da4205 256 stateF = s_auto_on;
Tom_87 5:b8a9f4da4205 257 LED_ROJO = LED_OFF;
Tom_87 5:b8a9f4da4205 258 LED_AZUL = LED_ON;
Tom_87 5:b8a9f4da4205 259 }
Tom_87 5:b8a9f4da4205 260 break;
Tom_87 5:b8a9f4da4205 261 //Modo Automático
Tom_87 5:b8a9f4da4205 262 case s_auto_on:
Tom_87 5:b8a9f4da4205 263 if (Puls_on == ON || (Alarma[0] == M[0] && Alarma[1] == M[1] && Alarma[2] == M[4] && Alarma[3] == M[5])){
Tom_87 5:b8a9f4da4205 264 stateF = s_run;
Tom_87 5:b8a9f4da4205 265 time_sens = 50;
Tom_87 5:b8a9f4da4205 266 LED_AZUL = LED_OFF;
Tom_87 5:b8a9f4da4205 267 LED_VERDE = LED_ON;
Tom_87 5:b8a9f4da4205 268 t_bomba = T_BOMBA ;
Tom_87 5:b8a9f4da4205 269 }
Tom_87 5:b8a9f4da4205 270 break;
Tom_87 5:b8a9f4da4205 271 //Modo Encendido
Tom_87 5:b8a9f4da4205 272 case s_run:
Tom_87 5:b8a9f4da4205 273 if(t_bomba > 0 && Puls_on == OFF){
Tom_87 5:b8a9f4da4205 274 //Con lo siguiente se desea calentar el agua a una temperatura preestablecida de fábrica
Tom_87 5:b8a9f4da4205 275 if(Sens_value < TEMP_IDEAL){
Tom_87 5:b8a9f4da4205 276 R_Cal = ON;
Tom_87 5:b8a9f4da4205 277 med = 1; //Habilita la medición
Tom_87 5:b8a9f4da4205 278 }
Tom_87 5:b8a9f4da4205 279 if(Sens_value >= TEMP_IDEAL){
Tom_87 5:b8a9f4da4205 280 med = 0; //Desahabilita la medición
Tom_87 5:b8a9f4da4205 281 R_Cal = OFF;
Tom_87 5:b8a9f4da4205 282 Bomba = ON;
Tom_87 5:b8a9f4da4205 283 Bomba_out = Bomba;
Tom_87 5:b8a9f4da4205 284 }
Tom_87 5:b8a9f4da4205 285 }else{
Tom_87 5:b8a9f4da4205 286 Bomba = OFF;
Tom_87 5:b8a9f4da4205 287 Bomba_out = Bomba;
Tom_87 5:b8a9f4da4205 288 LED_VERDE = LED_OFF;
Tom_87 5:b8a9f4da4205 289 LED_ROJO = LED_ON;
Tom_87 5:b8a9f4da4205 290 Sens_value = 0;
Tom_87 5:b8a9f4da4205 291 stateF = s_off;
Tom_87 5:b8a9f4da4205 292 med = 0;
Tom_87 5:b8a9f4da4205 293 }
Tom_87 5:b8a9f4da4205 294 }
Tom_87 5:b8a9f4da4205 295 return 0;
Tom_87 5:b8a9f4da4205 296 }
Tom_87 5:b8a9f4da4205 297 //Función que controla el tiempo de funcionamiento de la bomba
Tom_87 5:b8a9f4da4205 298 void interrupt_time_func(void){
Tom_87 5:b8a9f4da4205 299
Tom_87 5:b8a9f4da4205 300 if(Bomba == ON){
Tom_87 5:b8a9f4da4205 301 t_bomba--;
Tom_87 5:b8a9f4da4205 302 }
Tom_87 5:b8a9f4da4205 303 }
Tom_87 5:b8a9f4da4205 304
Tom_87 5:b8a9f4da4205 305 void Minuto(void){
Tom_87 5:b8a9f4da4205 306 minuto_uni++;
Tom_87 5:b8a9f4da4205 307 }
Tom_87 5:b8a9f4da4205 308 //Función que realiza el conteo del tiempo actual (real)
Tom_87 5:b8a9f4da4205 309 void RealTime_Clock(void){
Tom_87 5:b8a9f4da4205 310 if (hab_func == ON){
Tom_87 5:b8a9f4da4205 311 Minuto();
Tom_87 5:b8a9f4da4205 312 if(hora_dec == '2' && hora_uni > '3'){
Tom_87 5:b8a9f4da4205 313 hora_dec = '0';
Tom_87 5:b8a9f4da4205 314 hora_uni = '0';
Tom_87 5:b8a9f4da4205 315 }else if(hora_uni > '9'){
Tom_87 5:b8a9f4da4205 316 hora_uni = '0';
Tom_87 5:b8a9f4da4205 317 hora_dec++;
Tom_87 6:8cc6048e0376 318 }else if(minuto_uni > '9'){
Tom_87 6:8cc6048e0376 319 minuto_uni = '0';
Tom_87 6:8cc6048e0376 320 minuto_dec++;
Tom_87 5:b8a9f4da4205 321 }else if( minuto_dec > '5'){
Tom_87 5:b8a9f4da4205 322 minuto_dec = '0';
Tom_87 5:b8a9f4da4205 323 hora_uni++;
Tom_87 5:b8a9f4da4205 324 }
Tom_87 5:b8a9f4da4205 325 }
Tom_87 5:b8a9f4da4205 326 }
Tom_87 5:b8a9f4da4205 327 //Función del funcionamiento de las matrices
Tom_87 5:b8a9f4da4205 328 int matriz(void){
Tom_87 5:b8a9f4da4205 329 /*
Tom_87 5:b8a9f4da4205 330 Descripción del Funcionamiento:
Tom_87 5:b8a9f4da4205 331
Tom_87 5:b8a9f4da4205 332 - Se usan ocho bits para controlar la matriz en forma binaria.
Tom_87 5:b8a9f4da4205 333 - Por cada pulso del clock, el valor de data de va desplazando por cada una de las filas de la columna seleccionada.
Tom_87 5:b8a9f4da4205 334 - Una vez que se pasan todos los valores de una columna, se le da un pulso al reset para limpiar data
Tom_87 5:b8a9f4da4205 335 */
Tom_87 5:b8a9f4da4205 336 char c;
Tom_87 5:b8a9f4da4205 337 switch(num_matriz){// Cada "case" es una matriz, son seis matrices
Tom_87 5:b8a9f4da4205 338 case 0:
Tom_87 5:b8a9f4da4205 339 ColumnaA = 0;
Tom_87 5:b8a9f4da4205 340 for(colum_A = 0;colum_A <= 4;colum_A++){
Tom_87 5:b8a9f4da4205 341 Columnas1_15 = 0;
Tom_87 5:b8a9f4da4205 342 Columnas16_30 = 15;
Tom_87 5:b8a9f4da4205 343 for(c = 0;c <= 4;c++){
Tom_87 5:b8a9f4da4205 344 Columnas1_15 = Columnas1_15 + ((ColumnaA & (0b0001 << c)));
Tom_87 5:b8a9f4da4205 345 }
Tom_87 5:b8a9f4da4205 346
Tom_87 5:b8a9f4da4205 347 for (Fila = 0;Fila <= 6;Fila++){
Tom_87 5:b8a9f4da4205 348 estado_d = ((char_data[M[num_matriz] - 32][6 - Fila]) & (0b10000 >> ColumnaA));
Tom_87 5:b8a9f4da4205 349 DATA = (estado_d >> (4 - ColumnaA));
Tom_87 5:b8a9f4da4205 350 CLK = 1;
Tom_87 5:b8a9f4da4205 351 CLK = 0;
Tom_87 5:b8a9f4da4205 352 }
Tom_87 5:b8a9f4da4205 353 for(t = 0;t <= TIME;t++);
Tom_87 5:b8a9f4da4205 354 RST = 0;
Tom_87 5:b8a9f4da4205 355 RST = 1;
Tom_87 5:b8a9f4da4205 356 ColumnaA++;
Tom_87 5:b8a9f4da4205 357 }
Tom_87 5:b8a9f4da4205 358 num_matriz++;
Tom_87 5:b8a9f4da4205 359 break;
Tom_87 5:b8a9f4da4205 360
Tom_87 5:b8a9f4da4205 361 case 1:
Tom_87 5:b8a9f4da4205 362 ColumnaA = 5;
Tom_87 5:b8a9f4da4205 363 for(colum_A = 5;colum_A <= 9;colum_A++){
Tom_87 5:b8a9f4da4205 364 Columnas1_15 = 0;
Tom_87 5:b8a9f4da4205 365 Columnas16_30 = 15;
Tom_87 5:b8a9f4da4205 366 for(c = 0;c <= 4;c++){
Tom_87 5:b8a9f4da4205 367 Columnas1_15 = Columnas1_15 + (ColumnaA & (0b0001 << c));
Tom_87 5:b8a9f4da4205 368 }
Tom_87 5:b8a9f4da4205 369 for(Fila = 0;Fila <= 6;Fila++){
Tom_87 5:b8a9f4da4205 370 estado_d = ((char_data[M[num_matriz] - 32][6 - Fila]) & (0b10000 >> ColumnaA - 5));
Tom_87 5:b8a9f4da4205 371 DATA = (estado_d >> (4 - (ColumnaA - 5)));
Tom_87 5:b8a9f4da4205 372 CLK = 1;
Tom_87 5:b8a9f4da4205 373 CLK = 0;
Tom_87 5:b8a9f4da4205 374 }
Tom_87 5:b8a9f4da4205 375 for(t = 0;t <= TIME;t++);
Tom_87 5:b8a9f4da4205 376 RST = 0;
Tom_87 5:b8a9f4da4205 377 RST = 1;
Tom_87 5:b8a9f4da4205 378 ColumnaA++;
Tom_87 5:b8a9f4da4205 379 }
Tom_87 5:b8a9f4da4205 380 num_matriz++;
Tom_87 5:b8a9f4da4205 381 break;
Tom_87 5:b8a9f4da4205 382
Tom_87 5:b8a9f4da4205 383 case 2:
Tom_87 5:b8a9f4da4205 384 ColumnaA = 10;
Tom_87 5:b8a9f4da4205 385 for(colum_A = 10;colum_A <= 14;colum_A++){
Tom_87 5:b8a9f4da4205 386 Columnas1_15 = 0;
Tom_87 5:b8a9f4da4205 387 Columnas16_30 = 15;
Tom_87 5:b8a9f4da4205 388 for(c = 0;c <= 4;c++){
Tom_87 5:b8a9f4da4205 389 Columnas1_15 = Columnas1_15 + (ColumnaA & (0b0001 << c));
Tom_87 5:b8a9f4da4205 390 }
Tom_87 5:b8a9f4da4205 391 for(Fila = 0;Fila <= 6;Fila++){
Tom_87 5:b8a9f4da4205 392 estado_d = ((char_data[M[num_matriz] - 32][6 - Fila]) & (0b10000 >> (ColumnaA - 10)));
Tom_87 5:b8a9f4da4205 393 DATA = (estado_d >> (4 - (ColumnaA - 10)));
Tom_87 5:b8a9f4da4205 394 CLK = 1;
Tom_87 5:b8a9f4da4205 395 CLK = 0;
Tom_87 5:b8a9f4da4205 396 }
Tom_87 5:b8a9f4da4205 397 for(t = 0;t <= TIME;t++);
Tom_87 5:b8a9f4da4205 398 RST = 0;
Tom_87 5:b8a9f4da4205 399 RST = 1;
Tom_87 5:b8a9f4da4205 400 ColumnaA++;
Tom_87 5:b8a9f4da4205 401 }
Tom_87 5:b8a9f4da4205 402 num_matriz++;
Tom_87 5:b8a9f4da4205 403 break;
Tom_87 5:b8a9f4da4205 404
Tom_87 5:b8a9f4da4205 405 case 3:
Tom_87 5:b8a9f4da4205 406 ColumnaB = 0;
Tom_87 5:b8a9f4da4205 407 for(colum_B = 0;colum_B <= 4;colum_B++){
Tom_87 5:b8a9f4da4205 408 Columnas16_30 = 0;
Tom_87 5:b8a9f4da4205 409 Columnas1_15 = 15;
Tom_87 5:b8a9f4da4205 410 for(c = 0;c <= 4;c++){
Tom_87 5:b8a9f4da4205 411 Columnas16_30 = Columnas16_30 + (ColumnaB & (0b0001 << c));
Tom_87 5:b8a9f4da4205 412 }
Tom_87 5:b8a9f4da4205 413 for (Fila = 0;Fila <= 6;Fila++){
Tom_87 5:b8a9f4da4205 414 estado_d = ((char_data[M[num_matriz] - 32][6 - Fila]) & (0b10000 >> ColumnaB));
Tom_87 5:b8a9f4da4205 415 DATA = estado_d >> (4 - ColumnaB);
Tom_87 5:b8a9f4da4205 416 CLK = 1;
Tom_87 5:b8a9f4da4205 417 CLK = 0;
Tom_87 5:b8a9f4da4205 418 }
Tom_87 5:b8a9f4da4205 419 for(t = 0;t <= TIME;t++);
Tom_87 5:b8a9f4da4205 420 RST = 0;
Tom_87 5:b8a9f4da4205 421 RST = 1;
Tom_87 5:b8a9f4da4205 422 ColumnaB++;
Tom_87 5:b8a9f4da4205 423 }
Tom_87 5:b8a9f4da4205 424 num_matriz++;
Tom_87 5:b8a9f4da4205 425 break;
Tom_87 5:b8a9f4da4205 426
Tom_87 5:b8a9f4da4205 427 case 4:
Tom_87 5:b8a9f4da4205 428 ColumnaB = 5;
Tom_87 5:b8a9f4da4205 429 for(colum_B = 5;colum_B <= 9;colum_B++){
Tom_87 5:b8a9f4da4205 430 Columnas16_30 = 0;
Tom_87 5:b8a9f4da4205 431 Columnas1_15 = 15;
Tom_87 5:b8a9f4da4205 432 for(c = 0;c <= 4;c++){
Tom_87 5:b8a9f4da4205 433 Columnas16_30 = Columnas16_30 + (ColumnaB & (0b0001 << c));
Tom_87 5:b8a9f4da4205 434 }
Tom_87 5:b8a9f4da4205 435 for (Fila = 0;Fila <= 6;Fila++){
Tom_87 5:b8a9f4da4205 436 estado_d = ((char_data[M[num_matriz] - 32][6 - Fila]) & (0b10000 >> (ColumnaB - 5)));
Tom_87 5:b8a9f4da4205 437 DATA = (estado_d >> (4 - (ColumnaB - 5)));
Tom_87 5:b8a9f4da4205 438 CLK = 1;
Tom_87 5:b8a9f4da4205 439 CLK = 0;
Tom_87 5:b8a9f4da4205 440 }
Tom_87 5:b8a9f4da4205 441 for(t = 0;t <= TIME;t++);
Tom_87 5:b8a9f4da4205 442 RST = 0;
Tom_87 5:b8a9f4da4205 443 RST = 1;
Tom_87 5:b8a9f4da4205 444 ColumnaB++;
Tom_87 5:b8a9f4da4205 445 }
Tom_87 5:b8a9f4da4205 446 num_matriz++;
Tom_87 5:b8a9f4da4205 447 break;
Tom_87 5:b8a9f4da4205 448
Tom_87 5:b8a9f4da4205 449 case 5:
Tom_87 5:b8a9f4da4205 450 ColumnaB = 10;
Tom_87 5:b8a9f4da4205 451 for(colum_B = 10;colum_B <= 14;colum_B++){
Tom_87 5:b8a9f4da4205 452 Columnas16_30 = 0;
Tom_87 5:b8a9f4da4205 453 Columnas1_15 = 15;
Tom_87 5:b8a9f4da4205 454 for(c = 0;c <= 4;c++){
Tom_87 5:b8a9f4da4205 455 Columnas16_30 = Columnas16_30 + (ColumnaB & (0b0001 << c));
Tom_87 5:b8a9f4da4205 456 }
Tom_87 5:b8a9f4da4205 457 for (Fila = 0;Fila <= 6;Fila++){
Tom_87 5:b8a9f4da4205 458 estado_d = ((char_data[M[num_matriz] - 32][6 - Fila]) & (0b10000 >> (ColumnaB - 10)));
Tom_87 5:b8a9f4da4205 459 DATA = (estado_d >> (4 - (ColumnaB - 10)));
Tom_87 5:b8a9f4da4205 460 CLK = 1;
Tom_87 5:b8a9f4da4205 461 CLK = 0;
Tom_87 5:b8a9f4da4205 462 }
Tom_87 5:b8a9f4da4205 463 for(t = 0;t <= TIME;t++);
Tom_87 5:b8a9f4da4205 464 RST = 0;
Tom_87 5:b8a9f4da4205 465 RST = 1;
Tom_87 5:b8a9f4da4205 466 ColumnaB++;
Tom_87 5:b8a9f4da4205 467 }
Tom_87 5:b8a9f4da4205 468 num_matriz = 0;
Tom_87 5:b8a9f4da4205 469 break;
Tom_87 5:b8a9f4da4205 470 }
Tom_87 5:b8a9f4da4205 471 return 0;
Tom_87 5:b8a9f4da4205 472 }
Tom_87 5:b8a9f4da4205 473 //Función que realiza el vínculo Slider/Hora
Tom_87 5:b8a9f4da4205 474 int Slider(char Ho_Mi){
Tom_87 5:b8a9f4da4205 475 switch (Ho_Mi){
Tom_87 5:b8a9f4da4205 476 //Estado de seteo de la hora
Tom_87 5:b8a9f4da4205 477 case HORA:
Tom_87 5:b8a9f4da4205 478 hora = ((tsi.readPercentage() * 100) / 4);
Tom_87 5:b8a9f4da4205 479 if(hora > 23)
Tom_87 5:b8a9f4da4205 480 hora = 23;
Tom_87 5:b8a9f4da4205 481 //El +48 es para que el resultado se pase a ASCII y manejar más fácilmente la matriz
Tom_87 5:b8a9f4da4205 482 hora_dec = (hora / 10)+48;
Tom_87 5:b8a9f4da4205 483 hora_uni = (hora - ((hora / 10) * 10)) + 48;
Tom_87 5:b8a9f4da4205 484 break;
Tom_87 5:b8a9f4da4205 485 //Estado de seteo del minuto
Tom_87 5:b8a9f4da4205 486 case MINUTO:
Tom_87 5:b8a9f4da4205 487 hora = ((tsi.readPercentage() * 100) / 8);
Tom_87 5:b8a9f4da4205 488 hora = hora * 5;
Tom_87 5:b8a9f4da4205 489 if (hora == 60)
Tom_87 5:b8a9f4da4205 490 hora = 55;
Tom_87 5:b8a9f4da4205 491 minuto_dec = (hora / 10) + 48;
Tom_87 5:b8a9f4da4205 492 minuto_uni = (hora - ((hora / 10) * 10)) + 48;
Tom_87 5:b8a9f4da4205 493 break;
Tom_87 5:b8a9f4da4205 494
Tom_87 5:b8a9f4da4205 495 default:
Tom_87 5:b8a9f4da4205 496 break;
Tom_87 5:b8a9f4da4205 497 }
Tom_87 5:b8a9f4da4205 498 matriz();
Tom_87 5:b8a9f4da4205 499 return 0;
Tom_87 5:b8a9f4da4205 500 }
Tom_87 5:b8a9f4da4205 501 //Función de interrupción del objeto antirrebote
Tom_87 5:b8a9f4da4205 502 void int_puls (void){
Tom_87 6:8cc6048e0376 503 P_minuto.DebTime();
Tom_87 6:8cc6048e0376 504 P_hora.DebTime();
Tom_87 6:8cc6048e0376 505 P_prog.DebTime();
Tom_87 6:8cc6048e0376 506 P_on.DebTime();
Tom_87 5:b8a9f4da4205 507 }
Tom_87 5:b8a9f4da4205 508 //Función de interrupción del sensado de temperatura. Sensa 1 vez cada 5 segundos
Tom_87 5:b8a9f4da4205 509 void int_sens(){
Tom_87 5:b8a9f4da4205 510 if(time_sens>0)
Tom_87 5:b8a9f4da4205 511 time_sens--;
Tom_87 5:b8a9f4da4205 512 }