Você está na página 1de 17

INSTITUTO TECNOLOGICO DE MORELIA JOSE MARIA MORELOS Y PAVON

Departamento de Electrnica

Microcontroladores
Reporte Prctica 5, TIMER
Nombre:

VICTOR HUGO TELLEZ IZQUIERDO 10120974 ISAAC FRANCO VILLAREAL HUERTA 10120978

Ingeniera Electrnica
Profesor:

MC Antonio Valencia

MORELIA, MICH., MAYO DE 2013

1.0 INTRODUCCION U OBJETIVO


El objetivo de esta prctica es utilizar el TIMER del microcontrolador. Utilizar sus interrupciones para poder controlar 2 tiempos diferentes. Para controlar un display de 7 segmentos con 4 dgitos y tambin controlar un tiempo de 1 segundo exacto. Lo que se espera de esta prctica es el aprendizaje y conocimiento del lenguaje en C para poder manipular el TIMER del microcontrolador.

2.0 MARCO TEORICO


1.1 Seal de reloj
El modulo bsico de reloj del MSP430 incluye 4 fuentes para generar seales oscilatorias: LFXT1CLK: Low-frequency/high-frequency oscillator Cristales de 32768 Hz, circuitos resonantes o fuentes de reloj de hasta 16 MHz XT2CLK: Osciladores de alta frecuencia opcionales externos Desde 400 kHz a 16 MHz DCOCLK: Oscilador interno controlado digitalmente VLOCLK: Oscilador interno de bajo consumo y baja frecuencia Frecuencia tpica de 12 kHz

Existen 3 fuentes de reloj que se pueden tomar del mdulo bsico de reloj donde todas se seleccionan y configuran por software . ACLK: Auxiliary clock (Toma como fuente LFXT1CLK o VLOCLK,Es usada para mdulos y perifricos) MCLK: Master clock (Toma como fuente cualquiera de las 4 fuentes de reloj, Es usada por el CPU y todo el sistema) SMCLK: Sub-main Clock (Toma como fuente cualquiera de las 4 fuentes de reloj, Es usada para mdulos y perifricos)

Al resetear o inicial el microcontrolador la configuracin inicial del reloj queda como: MCLK : DCOCLK - 1.1 MHz SMCLK : DCOCLK - 1.1 MHz ACLK : LFXT1CLK - modo baja frecuencia con capacitores internos de 6pF.

Imagen 2.2 Reloj del microcontrolador.

2.2 Timer
El Timer en un microcontrolador permite medir tiempos, contar eventos, generar seales PWM, conmutar puertos cada determinado tiempo, secuenciar acciones u operaciones, medir tiempo entre 2 eventos entre otras cosas. El MSP430 puede tener varios Timers dependiendo de la familia y microcontrolador en particular. En el caso del MSP430G2553 tiene 2 Timers, Timer A0 y Timer A1.

Figura 2.1 Diagrama TIMER del microcontrolador.

2.3 Modos de operacin del Timer


El Timer cuenta con 4 modos de operacin, mostrados a continuacin

Tabla 2.3 Modos Operacin del Timer

En modo UP se cuenta hasta un valor asigando a CCR0.

Imagen 2.4 Modo UP En modo Continuo se hace la cuenta hasta llegar al valor de FFFF (65335)

Imagen 2.5 Modo continuo En modo UP-DOWN se le asigna un valor a CCR1 y se llega a este y se reliaza la misma cuenta pero de forma descendente

Imagen 2.6 Modo up-down.

2.4 Modos de salida


El microcontrolador cuenta con 7 modos de salida de captura comparacin de las interrupciones en el Timer.

Tabla 2.7 Modos de Salida Cada modo de salida genera una forma de seales distinta, como se muestra a continuacion.

Imagen 2.8 Seales generadas con modos de salida.

3.0 DESARROLLO
Conectando un Display de 7 segmentos de 4 dgitos y 2 leds entre el display 2 y 3, realizado con una tarjeta realizada en la materia de composicin. Mostrar un cronometro en tiempo real, cada vez que sea presionado un botn aumentar el 10 segundos el valor del tiempo, haciendo uso de otros 2 botones activar las interrupciones tanto de los botones como del Timer para hacer que uno decremente el valor cada segundo exacto hasta llegar a 0, y otro que comience en 0 hasta llegar al primer botn. Los 2 leds conectados entre los minutos y los segundos parpadeen cada segundo exacto.

Imagen 3.1 Esquemtico de la prctica

En el cdigo Declarar las libreras


#include <msp430g2553.h>

Declarar variables y su valor para usarlos en el programa


int unsigned c= 0, dec = 0, min=0, seg=0, inc=0; int dig=0, dis=0, i=0, band=0, bans=0, banm=0;

Detener el Watchdog configurar el oscilador interno a 1Mz, habilitar las interrupciones asignar valor a CCR0 de 625 para que ocurra una interrupcin, el Timer en modo up, con submain y dividido en 8. Activar P2SEL para el puerto 2.7 que son los 2 leds para el parpadeo, salidas de los 7 segmentos en P1 los transistores de P2.0 a P2.3 y activar las interrupciones, flancos de subida y resistencias de pull-up para los botones en P.4 a P2.6.
WDTCTL = WDTPW + WDTHOLD; BCSCTL1 = CALBC1_1MHZ; DCOCTL = CALDCO_1MHZ; CCTL0 = CCIE; CCTL1 = CCIE; CCR0 = 625; CCR1 = 625; TACTL = TASSEL_2 + MC_1 + ID_3; P2SEL = 0x00; P1DIR = 0xFE; P2DIR = 0x8F; P2REN = 0x70; P2IE = 0x70; P2IES = 0x70; P2IFG = 0; _BIS_SR(GIE);

En el ciclo infinito se decodifican los dgitos enviarlos a cada display que esta controlado por el Timer y por los transistores
if (dig==0) P1OUT=0X80; if (dig==1) P1OUT=0x0F2; . if (dig ==9) P1OUT=0x30;

En el vector de interrupcin de los botones


#pragma vector=PORT2_VECTOR __interrupt void Port_2(void) {

Botn P2.4 controla el aumento de los segundos, si la variable dec y inc no esta activa, es decir si no est activo el cronometro ya sea en aumento o descenso la variable seg aumentara en 10 segundos y si seg es igual a 60 aumentar la variable min.
if((P2IFG&0x10) == 0x10){ if (dec == 0 && inc == 0){

seg += 10; if (seg >= 60){ min++; seg=0; } } }

//incrementar segundos

Botn P2.5 activa el decremento, que se usa en la interrupcin del Timer (comienza el decremento)
if((P2IFG&0x20) == 0x20) dec = 1;

Botn P2.6 activa el incremento, dependiendo del valor que esten las variables min y seg por lo que se pasa a las variables bans y banm que es el tiempo a el cual va a contar el cronometro.
if((P2IFG&0x40) == 0x40){ inc = 1; bans = seg; banm = min; seg = 0; min = 0; }

Al activar cualquier interrupcin de botones se borra la bandera.


for(i=0;i<1000;i++){} P2IFG =0; }

En la interrupcin del Timer A0 pero en el valor de CCR1 controla los segundos exactos. Si el tiempo de la frecuencia a 1Mhz es 1us multiplicado por 8, 8 useg y el valor de 625 por lo que cada interrupcin sucede cada 5ms. Se activa una bandera que cuenta cada 5ms si el valor de bandera es igual a 200 se lograra un segundo exacto, dentro de ese if se aplica una xor a los 2 leds de P2.7. Si se activ el decremento los segundos irn disminuyendo si segundo llega a -1 segundo toma valor de 0, si el valor de min es diferente de 0 seg tomara valor de 60 y disminuir minuto en 1, hasta que las 2 variables sean 0.
#pragma vector=TIMER0_A1_VECTOR __interrupt void Timer_A1(void) { switch( TA0IV ) //Vector de interrupcion del TIMER0 { case 2: band++; if (band == 200){ P2OUT ^= 0x80;

if(dec == 1) { seg--; if(seg == -1) seg=0; if(min != 0 && seg == 0){ seg = 61; seg--; min--; } if (seg == 0 && min == 0) dec = 0; }

Si la variable inc es activada en la interrupcin de los botones seg aumentara y si llega a 60 minuto aumentara y seg tomara valor de 0, cuando seg y min tomen el valor que se activ en las banderas de las interrupciones de los botones el cronometro se detendr en 00:00.
if(inc == 1) { seg ++; if (seg == 60){ min++; seg=0;} if (seg == bans+1 && min == banm){ seg = 0; min = 0; inc = 0;} }

El valor de bandera ser igual a 0 para que se haga otra cuenta de 1 segundo exacto.
band = 0; }

En el vector de interrupcin de timer con valor de CCR0, esta dado para controlar los 4 dsiplays y hacer que se encienda cada 5mseg donde el display 1 (P2.0) controla las dec de los min, el display 2 (P2.1) las unidades de los min y el tercero y cuarto (P2.2 y P2.3) a los seg en decenas y unidades respectivamente.
#pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A (void) { dis ++; // Controlador Display if (dis == 1) //Display 1 miles { P2OUT = 0x71; dig = (min/10)%10; } if (dis == 2) // Display 2 centenas { P2OUT = 0x72;

dig = min%10; }

En el display 3 (P2.2) que son decenas de seg, no pueden tomar valores ms grandes que 60 por lo que si el digito es igual a 6 este tomara valor de 0.
if (dis == 3) // Display 3 decenas { P2OUT = 0x74; dig = (seg/10)%10; if(dig == 6) dig = 0; } if (dis == 4) //Display 4 unidades { P2OUT = 0x78; dig = seg%10; dis=0; } }

4.0 RESULTADOS
Los resultados obtenidos al realizar esta prctica fueron ptimos, la tarjeta realizada como se muestra en la imagen 3.1 funciono excelentemente adems de que la conexin con el microcontrolador fue muy buena. Con la tarjeta en buen funcionamiento, al implementar y realizar el cdigo se desplego el cronometro aumentando el valor de 10 segundos hasta llegar al tiempo deseado. Al ocurrir una interrupcin en el botn este tiempo decrementa hasta llegar a 0. Una vez comenzada esta interrupcin no poda ocurrir otra interrupcin de algn botn hasta que la cuenta llegara a 0. Al igual que el siguiente botn que realizaba la cuenta en ascenso hasta llegar al valor asignado, no poda ocurrir otra interrupcin hasta llegar al valor asignado. Las interrupciones del Timer ocurrieron al tiempo esperado y asignado, cada segundo exacto realizando as las cuentas del cronometro y el encendido de los leds.

Imagen 4.1 Cronometro programado a 20 segundos con forma descendente.

Imagen 4.2 Cronometro programado a 20 segundos de forma ascendente comenzando en 0

4.3 Parpadeo de los 2 puntos

5.0 CONCLUSIONES
Vctor Hugo Tllez Izquierdo Con esta prctica se obtuvieron conocimientos para poder generar ms de una seal a diferentes frecuencias y tiempos cada una, para poder realizar una o ms tareas en el microcontrolador, se puede precalibrar el timer del micro a lo que ms nos convenga, adems de poder dividir la frecuencia y hacer intervalos de tiempo a placer. Se aprendi a usar los vectores de interrupcin para cada valor ya sea CCR0 y CCR1, si estn son de diferentes y se deben usar para un modo de operacin del Timer continuo. En cuanto a la lgica de C se generaron ms conocimientos y ms practica a la hora de programar. Cumpliendo as el propsito de la prctica. Isaac Franco Villarreal Huerta

6.0 ANEXOS
Cdigo de la Prctica
#include <msp430g2553.h> //Seccion de inicializacion de variables globales int unsigned c= 0, dec = 0, min=0, seg=0, inc=0; int dig=0, dis=0, i=0, band=0, bans=0, banm=0; //Programa principal void main(void) { WDTCTL = WDTPW + WDTHOLD; // Detiene el Watchdog Timer BCSCTL1 = CALBC1_1MHZ; // Configura el oscilador interno DCOCTL = CALDCO_1MHZ; // precalibrado a 1MHz CCTL0 = CCIE; CCTL1 = CCIE; CCR0 = 625; CCR1 = 625; // Habilita interrupcion de timer CCR0

// Valor al que llega el timer TACCR0

TACTL = TASSEL_2 + MC_1 + ID_3; P2SEL = 0x00; P1DIR = 0xFE; P2DIR = 0x8F; P2REN = 0x70;

// ACLK, modo UP

// P1 salidas // P2.0 a P2.3 salidas // Habilita las resistencias Pull up-Pull down

P2IE = 0x70; P2IES = 0x70; P2IFG = 0; _BIS_SR(GIE); //Ciclo Principal while (1) { if (dig==0) P1OUT=0X80; if (dig==1) P1OUT=0x0F2; if (dig==2) P1OUT=0x48; if (dig==3) P1OUT=0x60; if (dig==4) P1OUT=0x32; if (dig==5) P1OUT=0x24; if (dig==6) P1OUT=0x04; if (dig==7) P1OUT=0x0F0; if (dig==8) P1OUT=0x00; if (dig ==9) P1OUT=0x30; } }

// inter ene de P2.4,5 y P2.6 // interrupcion en flanco de bajada o subida (xor) // activa las interrupciones globales

// ciclo infinito

#pragma vector=PORT2_VECTOR __interrupt void Port_2(void) { if((P2IFG&0x10) == 0x10){ if (dec == 0 && inc == 0){ seg += 10; //incrementar segundos if (seg >= 60){ min++; seg=0; } } } if((P2IFG&0x20) == 0x20) dec = 1;

if((P2IFG&0x40) == 0x40){ inc = 1; bans = seg; banm = min; seg = 0; min = 0; } for(i=0;i<1000;i++){} P2IFG =0; // Borra la bandera de interrupcion de P1.3 } #pragma vector=TIMER0_A1_VECTOR __interrupt void Timer_A1(void) { switch( TA0IV ) //Vector de interrupcion del TIMER0 { case 2: band++; if (band == 200){ P2OUT ^= 0x80; if(dec == 1) { seg--; if(seg == -1) seg=0; if(min != 0 && seg == 0){ seg = 61; seg--; min--; } if (seg == 0 && min == 0) dec = 0; } if(inc == 1) { seg ++; if (seg == 60){ min++; seg=0;} if (seg == bans+1 && min == banm){ seg = 0; min = 0; inc = 0;} }

band = 0; } break; case 10: break; } } #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A (void) { dis ++; // Controlador Display if (dis == 1) //Display 1 miles { P2OUT = 0x71; dig = (min/10)%10; } if (dis == 2) // Display 2 centenas { P2OUT = 0x72; dig = min%10; } if (dis == 3) // Display 3 decenas { P2OUT = 0x74; dig = (seg/10)%10; if(dig == 6) dig = 0; } if (dis == 4) //Display 4 unidades { P2OUT = 0x78; dig = seg%10; dis=0; } } // captura y comparacion CCR1 no usado // sobreflujo del timer

Você também pode gostar