viernes, 16 de septiembre de 2011

MSP430: DCO

En esta entrada vamos a trabajar con el módulo de reloj interno DCO. Vamos a realizar un programa en el cual, iremos cambiando la velocidad del reloj del micro pulsando un simple pulsador.

Vamos a trabajar sobre la placa MSP430 Launchpad y el micro MSP430G2231. El programa consistirá en hacer correr a 3 frecuencias distintas al microcontrolador (0.8 MHz, 2.3 MHz y 21MHz) mediante un pulsador.

Para obtener las frecuencias propuestas nos hemos basado en la tabla que dispone TI a nuestra disposición (¡OJO!: Éstas frecuencias son aproximadas), por lo tanto, también emplearemos la siguiente nomenclatura:

fDCO(RSEL, DCOx)

Dónde:

· Para una frecuencia de 0.8 MHz: fDCO(6, 3).
· Para una frecuencia de 2.3 MHz: fDCO(9, 3).
· Para una frecuencia de 21 MHz: fDCO(15, 7).

Los registros que vamos a necesitar para la configuración del reloj son los siguientes:
  • Registro DC0CTL: Debemos configurar los bits DCOx.
  • Registro BCSCTL1: Debemos configurar los bits RSEL y XT2OFF.
  • Registro BCSCTL2: Debemos configurar los bits SELMx y SELS.
Básicamente lo que haremos es configurar el reloj principal para cada frecuencia (mediante RSEL y DCOx), el cambio de frecuencias se hará mediante interrupción al detectar un pulso de alto a bajo en el pin 1.3 (dónde estará conectado el pulsador) y veremos que realmente el cambio de frecuencias se produce ya que habilitaremos el SMCLK (configuraremos este reloj a la misma frecuencia que el principal MCLK) por el pin 1.4.

En fin, no me enrollo más, aquí está en código en lenguaje C:

/*----------------------------------------------------------------------
AqueronteBlog@gmail.com

Este archivo es propiedad intelectual del blog Aqueronte,
cuya dirección web, es la siguiente:

http://unbarquero.blogspot.com/

Se permite cualquier modificación del archivo siempre y cuando
se mantenga la autoría del mismo.

----------------------------------------------------------------------

Filename: CLK_DCO.c
Date: 9-July-11
File Version: vs0.0

Author: Manuel Caballero
Company: Hades

----------------------------------------------------------------------

Notes: En este programa vamos a cambiar el reloj interno mediante DCO.
Tendremos un pulsador en P1.3 que al pulsarse, cambiará la
frecuencia de reloj y se verá reflejada por el pin P1.4.

· Configuración:
· MCLK: DCLOCK
· P1.3: Pulsador cambio estado de Alta/Baja (interrupción)
· P1.4: SMCLK = MCLK

· Nuestro Registro: ControlCLK (BIT0-BIT3 +4-bits+)
· BIT0-BIT2: Controlan la configuración del CLK.
· BIT3: Si está a 1, permite cambio de CLK.

· Frecuencias vistas desde P1.4:
· 0.8 MHz: ControlCLK.0-2 = 0x01
· 2.3 MHz: ControlCLK.0-2 = 0x02
· 21 MHz: ControlCLK.0-2 = 0x03
*/

#include "io430.h"
#include "intrinsics.h"

unsigned short int ControlCLK = 0x01;

void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT

// DCOCLK ~ 0.8 MHz
DCOCTL = DCO0 + DCO1; // DCOx = 3
BCSCTL1 = XT2OFF + RSEL1 + RSEL2; // RSELx = 6
BCSCTL2 &= ~(SELM1+DIVM0+DIVM1+DIVS0+DIVS1+DCOR+SELS); // MCLK = SMCLK = DCOCLK, not divider, Internal DCO res

P1DIR = BIT4; // P1.4 output, else inputp
P1SEL |= BIT4; // P1.4 = SMCLK
P1REN |= BIT3; // Pullup on P1.3
P1OUT |= BIT3; // P1.3 ON
P1IES |= BIT3; // P1.3 hi/low edge
P1IE |= BIT3; // P1.3 interrupt ON
P1IFG &= ~BIT3; // Clear flag on P1.3

__enable_interrupt(); // Interrupt enable

do{
if ((ControlCLK & BIT3) == 0x08) // Do I have to change the MCLK?
{
switch(ControlCLK)
{
case 0x09: // DCOCLK ~ 0.8 MHz
DCOCTL = DCO0 + DCO1; // DCOx = 3
BCSCTL1 = XT2OFF + RSEL1 + RSEL2; // RSELx = 6
ControlCLK &= ~BIT3;
break;

case 0x0A: // DCOCLK ~ 2.3 MHz
BCSCTL1 = XT2OFF +RSEL0 + RSEL3; // RSELx = 9
ControlCLK &= ~BIT3;
break;

case 0x0B: // DCOCLK ~ 21 MHz
DCOCTL |= DCO2; // DCOx = 7
BCSCTL1 |= RSEL1 + RSEL2; // RSELx = 15
ControlCLK &= ~BIT3;
break;
}
}
}while(1);
}


/*
Notes: Subrutina de Interrupción para P1.3 hi/low. Activa el cambio
y la frecuencia del CLK.
*/
#pragma vector=PORT1_VECTOR
__interrupt void P1_ISR(void)
{
ControlCLK++;
if (ControlCLK == 4)
ControlCLK = 1;

ControlCLK |= BIT3; // Changing MCLK!
P1IFG &= ~BIT3; // Clear flag on P1.3
}


Y aquí un vídeo que muestra el funcionamiento del programa:




Os pongo a vuestra disposición el programa tanto en ensamblador (IAR) cómo en lenguaje C (IAR y MSPGCC) para que lo podáis descargar y probar:

MSP430: DCO
Compilador IAR
Compilador MSPGCC
ASMCC
Control DCO
Control DCO
Control DCO
Control DCO
Control DCO
Control DCO
Control DCO
Control DCO
Control DCO

En resumen y para finalizar, cómo se ha podido ver, es bastante fácil hacer que este microcontrolador trabaje a distintas frecuencias en caso de que las necesitemos y esto es muy importante cara al consumo (sobre todo para proyectos portátiles dónde el consumo es un factor determinante en el diseño del producto).

Quizás, lo peor sea que las frecuencias que nos ofrece TI en las hojas de especificaciones no son exactas, y para cada micro pues cambiará un poco, pero bueno, supongo que el error es totalmente asumible y no quita ni un ápice de la capacidad que presentan estos dispositivos.

2 comentarios:

Unknown dijo...

Muchas gracias por este blog!
Estoy aprendiendo sobre microcontroladores. Por cuestiones de economía inicié con los MSP430, el problema es que no hay mucha información sobre estos microcontroladores en español. Por esa razón este blog resulta muy oportuno.
El único problema es que los links de este proyecto (DCO) están caídos. Sobre todo me interesa el código en lenguaje ensamblador.
Ojalá lo puedas volver a subir! Los otros archivos subidos a box.com han funcionado perfectamente.

Unknown dijo...

Buenas Juan Bautista:

Ya esta subsanado el tema de los enlaces (he añadido el servidor box).

Me alegra que te hayas iniciado en este tipo de microcontroladores, ya que aparte por su bajo precio en su placa de desarrollo, son bastantes potentes.

Un saludo y gracias por tu comentario.