Sie sind auf Seite 1von 7

INSTITUTO TECNOLOGICO DE MORELIA DEPARTAMENTO DE INGENIERIA ELECTRONICA

Uso de microcontrolador MSP430G2553

16 de marzo del 2014

No permitas que nadie diga que eres incapaz de hacer algo, ni si quiera yo. Si tienes un sueo debes conservarlo. Si quieres algo sal a buscarlo, y punto.

1.0 Introduccin.
Las cuentas internas del microcontrolador estn en funcin del reloj interno y del DCO (digitally controled oscilator). Existen tres fuentes de reloj. Para perifricos es utilizado el SMK que es el reloj Sub main del microcontrolador. Estas fuentes de reloj y oscilador pueden ser calibrados para realizar ciertas funciones.

2.0 Desarrollo
En este documento se realiza una cuenta de reloj por timer, la cual genera un segundo que se podr visualizar en una cuenta del 0 al 9 en un display de 7 segmentos. El DCO est pre calibrado a 1MHZ y para generar interrupciones se utiliza el Timer A del microcontrolador. El timer ocupa de una fuente de reloj, la cual es la misma que se utiliza en el DCO. Es necesario dividir la cuenta y esto se configura en el registro de control del timer. TACTL = TASSEL_2 + MC_1+ID_3; En el registro TACTL, se selecciona la fuente de reloj (submain), se configura el modo up el cual va a contar hasta el valor de CCR0 (registro de captura y comparacin) asignado y se puede dividir entre 8, donde ID_3 es la divisin entre 8. Se debe tomar en cuenta que para activar CCR0 se utiliza la siguiente lnea CCTL0 = CCIE; que activa las interrupciones por registro de captura y comparacin. El truco para generar la interrupcin cada segundo consiste en dividir 1MHZ/8. Posteriormente se asigna el CCR0 = 62500 para obtener un periodo de 500ms. Al hacer esto se sabe que la segunda interrupcin valdr un segundo. Por lo tanto dentro de la seccin de interrupcin por timer se agrega un contador para contar la segunda interrupcin y a partir de esto hacer algo, que en este caso es cambiar la cuenta del display. En la figura 1 se muestra el resultado de la interrupcin generada por contador cuando vale 1, es decir 1 segundo.

Figura 1. Pulso de un segundo medida en P1.0 al activar xor en led de launchpad. La conexin utilizada se muestra en la figura 2. Para esto fue necesario conectar desde el P1.0 a P1.6 a los pines del display. Se utiliz un display de nodo comn en el cual es necesario enviar ceros para encenderlo. El ctodo se conecta a VCC.

Figura 2. Conexin del microcontrolador al display de 7 segmentos. La configuracin del display de 7 segmentos se muestra en la figura 3.

Figura 3. Configuracin display 7 segmentos. La decodificacin se muestra en la figura 5.

Figura 5. Decodificacin del display.

4.0 Programa
//-------------------------------------------------------------//Librerias y definiciones generales #include <msp430g2553.h> //-------------------------------------------------------------//-------------------------------------------------------------//Seccion de inicializacion de variables globales //unsigned int cuenta=12500; char contador=0; unsigned int cuenta1=62500; //1MHZ/8=125000Hz 125000HZ/62500 = 2HZ T=0.5s signed char i = 0 ; //-------------------------------------------------------------//Programa principal void main(void) { //.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.//Seccion de configuracion WDTCTL = WDTPW + WDTHOLD; // Detiene el Watchdog Timer BCSCTL1 = CALBC1_1MHZ; // Configura el oscilador interno DCOCTL = CALDCO_1MHZ; // precalibrado a 1MHz el DCO. P1DIR = 0xFF; // Configura P1.0-P1.6como salida y P1.7 // pero solo es usado del 1 al 6. CCTL0 = CCIE; // Habilita interrupcion de timer CCR0

CCR0=cuenta1; // Valor al que llega el timer TACCR0 TACTL = TASSEL_2 + MC_1+ID_3; // fuente de reloj SMCLK, modo UP _BIS_SR(GIE); // Activa las interrupciones globales del mC //.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.//Ciclo Principal while (1) // ciclo infinito que no hace nada { if(i==0) P1OUT=0x40; //Cero en el display if(i == 1) P1OUT=0x79; //uno en el display if(i== 2) P1OUT=0x24; //dos if(i==3) P1OUT=0x30; //3 if(i==4) P1OUT=0x19; //4 if(i==5) P1OUT=0x12; //5 if(i==6) P1OUT=0x03; //6 if(i==7) P1OUT=0x78; //7 if(i==8) P1OUT=0x00; //8 if(i==9) P1OUT=0x18; //9 } } //-------------------------------------------------------------//Seccion de vectores de interrupcion // Timer A0 interrupt service routine #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A (void) { contador++; //Variable contador que incrementa cada 500ms. //Cuando contador=0-->500ms .Cuando contador=1 -->1s. if(contador == 1 ) //P1OUT^=0x01; Puedo activar esta lnea para ver el //led parpadear en el launchpad i++; //Variable i es el decodificador o "seleccionador" para //Mostrar un dgito en el display dependiente del valor de i. if( i > 9) //Como i va de 0 a 9, cuando sea mayor se reiniciar. i = 0; if(contador > 1) //Para finalizar cuando contador sea mayor contador =0; // que 1 segcontador se reiniciar en cero. //Cabe destacar que las banderas de interrupcin

//del timer se borran automticamente. }

5.0 Bibliografa
http://e2e.ti.com/support/microcontrollers/msp430/f/166/p/151925/553354.a spx#553354 Gerald Stanje how can i generate an interrupt every second? i use the internal oscillator of the msp430f2274 and TimerA0...is the way i do it the best way? The MSP itself does not know about time, only about clock cycles. However, using the 8MHz calibration values, you cann assume 1 clock cycle to be nearly 1/8000000s. Getting a 1s interval is tricky, it means you'll have to count to 8000000. The timer can only count up to 65536. So a few tricks can be used. First, you can set up SMCLK to count with 1/8 of the DCO. This reduces cock speed to 1MHz. Then you can set up the tiemr to be clocked with 1/8 of SMCLK, leaving 125000Hz clock speed. Next, you can set up the timer to trigger an interrupt every 62500 timer ticks (using up mode and setting CCR0 to 62500). Then every 1/2 second an interrupt happens. Every second interrupt a second has passed (hence 'second interrupt' :) )