viernes, 24 de junio de 2011

MSP430: Módulos de Reloj

Una de las cosas que tenemos que tener clara (más que el agua) a la hora de trabajar con microcontroladores, es el sistema de reloj (a partir de ahora CLK). Es decir, tener presente a que frecuencia de CLK trabaja nuestro dispositivo y los módulos que éste contenga (si es que tiene más de un módulo de CLK).

¿Por qué es importante? Fácil, de esta manera sabremos de manera exacta los ciclos de CLK que consumirá una porción de código (o programa) determinado, en otras palabras, sabremos el tiempo necesario para ejecutar cualquier acción que hayamos programado previamente.

En nuestro caso, para el microcontrolador: MSP430G2231, tenemos los siguientes módulos de reloj:

  • LFXT1CLK: Este módulo se usará cuando necesitamos un cristal u oscilador externo que conectaremos en los pines correspondiente del microcontrolador. Puede usarse para trabajar en baja (cristal o reloj externo de 32768 Hz) o alta frecuencia (cristales estándar, resonador, o reloj externo desde 400 kHz hasta 16 MHz).

  • XT2CLK: Este es un módulo opcional para trabajar en alta frecuencia mediante cristales estándar, resonador o una fuente externa de reloj desde los 400 kHz hasta los 16 MHz
  • DCLOCK: Este módulo es un oscilador controlado internamente (DCO).
  • VLOCLK: Un oscilador ideal para proyectos de bajo consumo, es un oscilador interno de frecuencia típica de 12 kHz.
Una vez presentados los módulos disponibles de CLK que nuestro microcontrolador puede manejar, vamos, ahora, a exponer las señales internas que controlan las fuentes de CLK:
  • ACLK: Esta es la señal de reloj auxiliar. ACLK es una fuente de reloj configurada por software en el módulo LFXT1CLK o VLOCLK. La señal ACLK, puede dividirse por 1, 2, 4, u 8. Esta fuente de reloj puede servir para controlar periféricos internos del microcontrolador de manera individual.
  • MCLK: Esta es la señal principal de reloj. MCLK es configurada por software mediante los módulos LFXT1CLK, VLOCLK, XT2CLK (en caso de estar disponible en el dispositivo), o DCOCLK. Esta señal puede dividirse por 1, 2, 4, u 8. MCLK es usada para controlar la CPU y el sistema.
  • SMCLK: Esta señal es segunda principal del sistema. SMCLK es configurada por software mediante los módulos LFXT1CLK, VLOCLK, XT2CLK (si esta disponible en el dispositivo), o DCOCLK. SMCLK puede ser dividida por 1, 2, 4, u 8. Al igual que la señal ACLK, puede servir para controlar periféricos internos del microcontrolador.
La verdad que tanta siglas y definiciones pueden resultar, al principio, algo tedioso, pero debemos de mantener la calma y pensar de manera positiva, para ello, hagamos un ejercicio de reflexión:

· ¿Módulos de reloj y señales de reloj son lo mismo? ¡NO! Los módulos de reloj sirven para configurar nuestro dispositivo: Si vamos a usar un cristal de cuarzo, o un R-C resonador, o un reloj externo, o no vamos a tener que usar ningún elemento externo por ende, usaremos el módulo de reloj interno que trae el dispositivo. Una vez que sepamos si vamos a usar o no algún elemento externo, tendremos que configurar las señales de reloj del microcontrolador para su correcto funcionamiento. Las señales de reloj son derivadas del módulo de reloj.

· ¿Para qué tantos módulos de reloj? Pues para abarcar un amplio rango de frecuencias de funcionamiento que hace que el dispositivo sea versátil para distintos proyectos que tengamos en mente, desde baja hasta alta frecuencia.

· ¿Para qué tantas señales de reloj? Para tener un control absoluto del microcontrolador, quizás en nuestro proyecto necesitamos que la CPU y el sistema vaya a toda velocidad de cálculo pero en cambio, las respuestas de los periféricos no es necesario que vaya tan rápido, así que en este caso, configuramos distintas señales de reloj para la CPU y para el periférico en cuestión. Normalmente, distintas fuentes de reloj nos permiten crear mapas de consumo en el microcontrolador (contra más rápido, más consumo).

· ¡¿Será una tortura configurar estos módulos y señales?! ¡Para nada! Además, podemos cambiar el sistema de reloj y módulo por software, esto es una gran ventaja ya que como he dicho anteriormente, podemos configurar dentro del dispositivo mapas de velocidades de reloj (y por ende de consumo) que podrían ser cambiadas con un simple pulsador conectado al dispositivo.

En este capitulo, trataré de exponer los registros necesarios para controlar los sistemas de reloj, y vamos a centrarnos en los relojes internos: DCLOCK y VLOCLK.

Antes de entrar en faena, debemos tener presente la hoja de características del dispositivo y la guía del usuario para esta familia concreta, sin ambos documentos sería misión imposible poder configurar y controlar el módulo de reloj:

· Hoja de características del dispositivo: MSP430G2231 (La vista para confeccionar este capítulo es la versión: slas694F.pdf). Los capítulos necesarios son:
  • Main DCO Characteristics: Característica principales del oscilador interno.
  • DCO Frequency: Tabla de frecuencias para el oscilador interno.
  • Calibrated DCO Frequencies – Tolerance: Tolerancia del oscilador interno.
  • Internal Very-Low-Power Low-Frequency Oscillator (VLO): Características del oscilador de baja frecuencia interno.
· Guía del usuario para esta familia: MSP430x2xx (La vista para confeccionar este capítulo es la versión: slau144h.pdf). Los capítulos necesarios son:
  • 5. Basic Clock Module+: Módulos de reloj.
  • 5.3.1 DCOCTL, DCO Control Register: Registro para controlar el oscilador interno.
  • 5.3.2 BCSCTL1, Basic Clock System Control Register 1: Registro 1 de control de reloj.
  • 5.3.3 BCSCTL2, Basic Clock System Control Register 2: Registro 2 de control de reloj.
  • 5.3.4 BCSCTL3, Basic Clock System Control Register 3: Registro 3 de control de reloj.
Al haber varios registros implicados y varias frecuencias de funcionamiento, TI nos facilita la vida (más o menos) ofreciéndonos una tabla con frecuencias aproximadas que usar para configurar nuestro dispositivo. La nomenclatura es sencilla:

fDCO(RSEL, DCOx)

Dónde los parámetros RSEL y DCOx son:
  • RSEL: Llamado selector de rango, lo podemos encontrar en el registro BCSCTL1: Basic Clock System Control Register 1, son 4-bit que podemos usar por separado desde: RSEL0-RSEL3.
  • DCOx: Llamado selector de frecuencia del DCO, lo podemos encontrar en el registro DCOCTL, DCO Control Register, son 3-bit que podemos usar por separado desde DCO0-DCO2.
La tabla de frecuencias es la siguiente:

PARÁMETROCONDICIONESVccMIN.
TÍPICO
MAX.
UNIDAD
fDCO(0, 0)
RSELx = 0, DCOx = 0, MODx = 03 V
0.06

0.14
MHz
fDCO(0, 3)RSELx = 0, DCOx = 3, MODx = 03 V
0.12

MHz
fDCO(1, 3)RSELx = 1, DCOx = 3, MODx = 03 V
0.15

MHz
fDCO(2, 3)RSELx = 2, DCOx = 3, MODx = 03 V
0.21

MHz
fDCO(3, 3)RSELx = 3, DCOx = 3, MODx = 03 V
0.3

MHz
fDCO(4, 3)RSELx = 4, DCOx = 3, MODx = 03 V
0.41

MHz
fDCO(5, 3)RSELx = 5, DCOx = 3, MODx = 03 V
0.58

MHz
fDCO(6, 3)RSELx = 6, DCOx = 3, MODx = 03 V

0.8

MHz
fDCO(7, 3)RSELx = 7, DCOx = 3, MODx = 03 V0.8

1.5
MHz
fDCO(8, 3)RSELx = 8, DCOx = 3, MODx = 03 V
1.6

MHz
fDCO(9, 3)RSELx = 9, DCOx = 3, MODx = 03 V
2.3

MHz
fDCO(10, 3)RSELx = 10, DCOx = 3, MODx = 03 V
3.4

MHz
fDCO(11, 3)RSELx = 11, DCOx = 3, MODx = 03 V
4.25

MHz
fDCO(12, 3)RSELx = 12, DCOx = 3, MODx = 03 V4.3

7.3
MHz
fDCO(13, 3)RSELx = 13, DCOx = 3, MODx = 03 V
7.8

MHz
fDCO(14, 3)RSELx = 14, DCOx = 3, MODx = 03 V8.6

13.9
MHz
fDCO(15, 3)RSELx = 15, DCOx = 3, MODx = 03 V
15.25

MHz
fDCO(15, 7)RSELx = 15, DCOx = 7, MODx = 03 V
21

MHz

· ¿Cómo funcionan estos registros? Es fácil, por ejemplo, imaginemos que queremos que el oscilador interno DCO funcione más o menos a 7.8 MHz, la nomenclatura sería: fDCO(13, 3). Hay que tener en cuenta que los datos expuestos están en decimal, en este caso, en ensamblador sería de la siguiente forma:

mov.b...#DCO0+DCO1, &DCOCTL; DCOx = 3
mov.b#RSEL0+RSEL2+RSEL3, &BCSCTL1; RSELx = 13

En lenguaje C sería así:

DCOCTL
|= DCO0+DCO1;// DCOx = 3
BCSCTL1...|= RSEL0+RSEL2+RSEL3;// RSELx = 13

Pero podemos jugar aún más para obtener frecuencias mediante los registros RSEL y DCO, TI pone a nuestra disposición el rango paso a paso de cada frecuencia, explicarlo con palabras es algo engorroso, así que vamos con los ejemplos directamente.



Pero antes, si nos fijamos en la imagen anterior, podemos identificar en que rango de frecuencia nos movemos mediante los bits DCOx y RSELx. A continuación vamos a emplear un par de ejemplos para ilustrar como se trabaja con la tabla y la imagen anterior.

Por ejemplo, imaginemos que queremos trabajar con una frecuencia alrededor de los 16 MHz, en la tabla tenemos la configuración fDCO(15, 3) ≈ 15.25 MHz pero al comprobarlo en el laboratorio vemos que no estamos muy contentos con el valor obtenido, pues vamos a intentar afinarlo con el rango de frecuencia paso a paso, en este ejemplo empezamos jugando con los bits DCOx.

Intentaremos con una configuración fDCO(15, 5), pero ésta no está recogida en tablas, para saber a que frecuencia corresponde (aproximadamente), tenemos que buscar una conocida en la tabla tal y como se muestra a continuación:

· fDCO(15, 5) = SDCO·fDCO(15, 4) = SDCO·[SDCO·fDCO(15, 3)] = S2DCO·fDCO(15, 3) = 1.082·15.25 = 17.7876 MHz

Ahora vamos a obtener una configuración fDCO(9, 2), tampoco está recogida en la tabla, así que trabajamos de manera parecida al anterior ejercicio:

· fDCO(9, 2) = fDCO(9, 3-1) = S-1DCO·fDCO(9, 3) = 1.08-1·2.3 ≈ 2.1296 MHz

· NOTA: Hay que tener en cuenta que los valores de la tabla dada por TI son frecuencias aproximadas y por lo tanto cualquier valor que obtengamos también será aproximado. También se puede trabajar con los bits RSELx de forma similar.

Para poner en práctica varios conceptos de los aquí expuestos, vamos a emplear ejemplos de programas concretos para tal propósito.


Ejemplos: Módulos de Reloj con MSP430
1. Programa
Configuramos el reloj DCO para tres frecuencias.
2. Programa
Configuramos el reloj VLO.


Quizás, éste sea uno de los capítulos cuando trabajamos con microcontroladores, que es el más importante, ya que de la frecuencia de reloj dependerá todo nuestro código posterior. Es por eso que es muy recomendable tener claro los conceptos ya que, visto de una manera práctica, no es difícil de entender.

0 comentarios: