Algoritmo de un cronometro de conteo de horas, segundos decenas de milisegundos, a partir del miltiplexado de 6 display de 7 segmentos.

Fork of Ticker_HelloWorld by mbed_example

Committer:
Javierdf
Date:
Sun Sep 22 03:20:08 2019 +0000
Revision:
5:8e7123e9b75b
Parent:
4:a60b811bfe1e
KL46 ticker D7sMUX

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AdrianMA 4:a60b811bfe1e 1 /* mbed Program: Proyecto Cronometro mediante multiplexado de D7S */
AdrianMA 4:a60b811bfe1e 2 #include "mbed.h"//Libreria para elementos básicos de mbed-OS
AdrianMA 4:a60b811bfe1e 3 #include "constantes.h"//Libreria de cabecera para almacenamiento de constantes
AdrianMA 4:a60b811bfe1e 4 #include "fnc_usuario.h"//Libreria para declaración de funciones de usuario
AdrianMA 4:a60b811bfe1e 5
AdrianMA 4:a60b811bfe1e 6 /******************************************************************************/
AdrianMA 4:a60b811bfe1e 7 //Declaración para la utilización de hardware del sistema
AdrianMA 4:a60b811bfe1e 8 Ticker imp_d7s; //Interrupción temporizada para impresión en D7S multiplexados
AdrianMA 4:a60b811bfe1e 9 Ticker temp_cronometro; //Interrupción temporizada para cuantificación del tiempo del sistema
AdrianMA 4:a60b811bfe1e 10 DigitalOut led1(PTD5); //TEstigo led Verde
AdrianMA 4:a60b811bfe1e 11 DigitalOut led2(PTE29); //Testigo Led Rojo
AdrianMA 4:a60b811bfe1e 12 DigitalIn sw_arranque(PTD4); //Entrada digital para iniciar la cuantificacion de tiempo del sistema
AdrianMA 4:a60b811bfe1e 13 DigitalIn sw_paro(PTD2); //Entrada digital para parar la cuantificación de tiempo del sistema
AdrianMA 4:a60b811bfe1e 14 DigitalIn sw_reset(PTA13); //Entrada digital para reseteo de variables del sistema
AdrianMA 4:a60b811bfe1e 15 BusOut pines_disp7S(PTA17, PTB9, PTA7,PTA6,PTA14,PTA16,PTA15,PTC16); //Pines reservados para la impresión de información en los segmentos de los display
AdrianMA 4:a60b811bfe1e 16 BusOut pines_transist(PTC9,PTC8,PTA5,PTA4,PTA12,PTD3); //pines reservados para el control de transistores para conmutar displays
AdrianMA 4:a60b811bfe1e 17
AdrianMA 4:a60b811bfe1e 18 /******************************************************************************/
AdrianMA 4:a60b811bfe1e 19 //Variables utilizadas para la logica del sistma
AdrianMA 4:a60b811bfe1e 20 int contador_digitos; //Contador para la impresión de datos en los displays
AdrianMA 4:a60b811bfe1e 21 int contador_ms; //Contador para cuantificacion de milisegundos
AdrianMA 4:a60b811bfe1e 22 int contador_decms; //Contador para cuantificacion de decenas de milisegundos
AdrianMA 4:a60b811bfe1e 23 int contador_seg; //Contador para cuantificacion de segundos
AdrianMA 4:a60b811bfe1e 24 int contador_min; //Contador para cuantificacion de minutos
AdrianMA 4:a60b811bfe1e 25 int impresion_d7s[6]; //Vector para almacenar información de los digitos a imprimir en D7S
AdrianMA 4:a60b811bfe1e 26 bool band_arranque; //Bandera para arranque del sistema
AdrianMA 4:a60b811bfe1e 27
AdrianMA 4:a60b811bfe1e 28
AdrianMA 4:a60b811bfe1e 29 /******************************************************************************/
AdrianMA 4:a60b811bfe1e 30 //Tablas para control de grupos de pines, D7S y multiplexado
AdrianMA 4:a60b811bfe1e 31 int cod_disp7s[DIGITOS_D7S_ANODO]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //Codigo para vizualización de D7S de anodo comun
AdrianMA 4:a60b811bfe1e 32 int codigo_transist[MUX_D7S]={0x01,0x02,0x04,0x08,0x10,0x20}; //Tabla para despliegue del digito 0 al 5
AdrianMA 4:a60b811bfe1e 33 int codigo_transist_2[MUX_D7S]={0x20,0x10,0x08,0x04,0x02,0x01}; //Tabla para despliegue del digito 5 al 0
AdrianMA 4:a60b811bfe1e 34
AdrianMA 4:a60b811bfe1e 35
AdrianMA 4:a60b811bfe1e 36 /******************************************************************************/
AdrianMA 4:a60b811bfe1e 37 //Rutina de Atención a la Interrupción para realizar la impresión de datos en el multiplexado de los D7S
AdrianMA 4:a60b811bfe1e 38 void impres_d7s() {//inicio ISR para impresión de D7S
AdrianMA 4:a60b811bfe1e 39 pines_disp7S=cod_disp7s[(impresion_d7s[contador_digitos])]; //Asignación de codigos para despliegue de datos en pines de segmentos de D7S
AdrianMA 4:a60b811bfe1e 40 pines_transist=codigo_transist_2[contador_digitos]; //Asignación de codigo para la conmutación de D7S
AdrianMA 4:a60b811bfe1e 41 contador_digitos--; //Contador decremental para variable de control de conmutación de D7S
AdrianMA 4:a60b811bfe1e 42 if(contador_digitos<0) //Condición para numeros menores a cero, reset de variable contadora
AdrianMA 4:a60b811bfe1e 43 contador_digitos=5; //Reset de variable contadora para inicio en D7S #5
AdrianMA 4:a60b811bfe1e 44 }//fin ISR para impresión de D7S
AdrianMA 4:a60b811bfe1e 45
AdrianMA 4:a60b811bfe1e 46
AdrianMA 4:a60b811bfe1e 47 /******************************************************************************/
AdrianMA 4:a60b811bfe1e 48 //Rutina de Atención a la Interrupción para la cuantificación del tiempo del sistema
AdrianMA 4:a60b811bfe1e 49 void conteo_tiempo(){//inicio ISR para cuantificación de tiempos
AdrianMA 4:a60b811bfe1e 50 if(band_arranque==VERDADERO){ //Condición de arranque de la cuantificación del sistema
AdrianMA 4:a60b811bfe1e 51 contador_ms++;} //Variable contadora para cuantificacion de milisegundos del sistema
AdrianMA 4:a60b811bfe1e 52 led1 = !led1; //luz testigo para indicación de trabajo en el MCU
AdrianMA 4:a60b811bfe1e 53
AdrianMA 4:a60b811bfe1e 54 }//fin ISR para cuantificación de tiempos
AdrianMA 4:a60b811bfe1e 55
AdrianMA 4:a60b811bfe1e 56 /******************************************************************************/
AdrianMA 4:a60b811bfe1e 57 int main() {//inicio funcion principal
AdrianMA 4:a60b811bfe1e 58 /*----------------------------------------------------------------------------*/
AdrianMA 4:a60b811bfe1e 59 //Inicialización de variables y vinculacion de ISR a los servicios de interrupción
AdrianMA 4:a60b811bfe1e 60 imp_d7s.attach(&impres_d7s, 0.001); //viculación de la función de interrupción a la ISR para la vinculación de la impresión de datos en el D/S
AdrianMA 4:a60b811bfe1e 61 temp_cronometro.attach(&conteo_tiempo,0.001); //viculación de la función de interrupción a la ISR para la cuantificación de tiempo
AdrianMA 4:a60b811bfe1e 62 contador_digitos=5; //Inicialización de la variable contadora para impresión de los displays
AdrianMA 4:a60b811bfe1e 63 band_arranque=FALSO; //Inicialización de variable para el control de inicio de operación del sistema
AdrianMA 4:a60b811bfe1e 64
AdrianMA 4:a60b811bfe1e 65 /*----------------------------------------------------------------------------*/
AdrianMA 4:a60b811bfe1e 66 //Inicio looop de trabajo iterativo
AdrianMA 4:a60b811bfe1e 67
AdrianMA 4:a60b811bfe1e 68 while(1) {//inicio loop de trabajo
AdrianMA 4:a60b811bfe1e 69
AdrianMA 4:a60b811bfe1e 70 if(sw_arranque==VERDADERO){//Inicio if-1 //Pregunta por el estado del boton arranque
AdrianMA 4:a60b811bfe1e 71 band_arranque=VERDADERO; //Habilitación de la bandera de arranque del sistema
AdrianMA 4:a60b811bfe1e 72 wait_ms(50); //Retardo de tiempo para la eliminación del rebote en el interruptor
AdrianMA 4:a60b811bfe1e 73 }//fin if-1
AdrianMA 4:a60b811bfe1e 74
AdrianMA 4:a60b811bfe1e 75 if(sw_paro==VERDADERO){//Inicio if-2 //Pregunta por el estado del boton paro
AdrianMA 4:a60b811bfe1e 76 band_arranque=FALSO; //Deshabilitación de la bandera de arranque del sistema
AdrianMA 4:a60b811bfe1e 77 wait_ms(50); //Retardo de tiempo para la eliminación del rebote en el interruptor
AdrianMA 4:a60b811bfe1e 78 }
AdrianMA 4:a60b811bfe1e 79 if(sw_reset==VERDADERO){//Inicio if-3 //Pregunta por el estado del boton paro
AdrianMA 4:a60b811bfe1e 80 band_arranque=FALSO; //Deshabilitación de la bandera de arranque del sistema
AdrianMA 4:a60b811bfe1e 81 contador_ms=0; //Reset contador de milisegundos
AdrianMA 4:a60b811bfe1e 82 contador_decms=0; //Reset contador de decenas de milisegundos
AdrianMA 4:a60b811bfe1e 83 contador_seg=0; //Reset contador de segundos
AdrianMA 4:a60b811bfe1e 84 contador_min=0; //Reset contador de minutos
AdrianMA 4:a60b811bfe1e 85
AdrianMA 4:a60b811bfe1e 86 for(int i=0;i<6;i++){ //Loop para reseteo de variable para impresion de información en D7S
AdrianMA 4:a60b811bfe1e 87 impresion_d7s[i]=0; //Limpieza de dato para D7S
AdrianMA 4:a60b811bfe1e 88 }
AdrianMA 4:a60b811bfe1e 89 wait_ms(50); //Retardo de tiempo para la eliminación del rebote en el interruptor
AdrianMA 4:a60b811bfe1e 90 }//fin if-3
AdrianMA 4:a60b811bfe1e 91
AdrianMA 4:a60b811bfe1e 92 //Sección de cuantificación de decenas de milisegundo
AdrianMA 4:a60b811bfe1e 93 if(contador_ms>DECENAS_MS){//inicio if-4 //condicion para el incremento de decenas de milisegundos
AdrianMA 4:a60b811bfe1e 94 contador_decms++; //Incremento de variable contadora de decenas de milisegundos
AdrianMA 4:a60b811bfe1e 95 num2dig(contador_decms,&impresion_d7s[0],&impresion_d7s[1]); //Transformación del contador de decenas de milisegundos a digitos y almacenaje para despliegue en D7S
AdrianMA 4:a60b811bfe1e 96 contador_ms=0; //Reset contador de milisegundos
AdrianMA 4:a60b811bfe1e 97 }//fin if-4
AdrianMA 4:a60b811bfe1e 98 //Sección de cuantificación de segundos
AdrianMA 4:a60b811bfe1e 99 if(contador_decms==MS2SEG){//inicio if-5 //condicion para el incremento de segundos
AdrianMA 4:a60b811bfe1e 100 contador_seg++; //Incremento de variable contadora de segundos
AdrianMA 4:a60b811bfe1e 101 num2dig(contador_seg,&impresion_d7s[2],&impresion_d7s[3]); //Transformación del contador de segundos a digitos y almacenaje para despliegue en D7S
AdrianMA 4:a60b811bfe1e 102 contador_decms=0; //Reset contador de decenas de milisegundos
AdrianMA 4:a60b811bfe1e 103 }//fin if-5
AdrianMA 4:a60b811bfe1e 104 //Sección de cuantificación de minutos
AdrianMA 4:a60b811bfe1e 105 if(contador_seg==SEG2MIN){//inicio if-6 //condicion para el incremento de minutos
AdrianMA 4:a60b811bfe1e 106 contador_min++; //Incremento de variable contadora de minutos
AdrianMA 4:a60b811bfe1e 107 num2dig(contador_min,&impresion_d7s[4],&impresion_d7s[5]); //Transformación del contador de minutos a digitos y almacenaje para despliegue en D7S
AdrianMA 4:a60b811bfe1e 108 contador_seg=0; //Reset contador de decenas de segundos
AdrianMA 4:a60b811bfe1e 109 }//fin if-6
AdrianMA 4:a60b811bfe1e 110 //Candado para la cuantificación de minutos
AdrianMA 4:a60b811bfe1e 111 if(contador_min==MIN){//inicio if-7 //Condicion para el reset de minutos
AdrianMA 4:a60b811bfe1e 112 contador_min=0; //Reset de la variable contadora de minutos
AdrianMA 4:a60b811bfe1e 113 }//fin if-7
AdrianMA 4:a60b811bfe1e 114
AdrianMA 4:a60b811bfe1e 115 }//fin loop de trabajo
AdrianMA 4:a60b811bfe1e 116
AdrianMA 4:a60b811bfe1e 117 }//Fin función principal