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
main.cpp@4:a60b811bfe1e, 2017-04-13 (annotated)
- Committer:
- AdrianMA
- Date:
- Thu Apr 13 14:11:53 2017 +0000
- Revision:
- 4:a60b811bfe1e
- Parent:
- 2:87f26931d8d1
Programa que implementa un cronometro a partir del multiplexado de 6 displays de 7 segmentos, utilizando el sistema de desarrollo NXP FRDM-KL46
Who changed what in which revision?
User | Revision | Line number | New 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 |